drm/amdgpu/sdma6: add aggregated doorbell support
authorJack Xiao <Jack.Xiao@amd.com>
Mon, 11 Jul 2022 07:25:03 +0000 (15:25 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 13 Jul 2022 15:25:17 +0000 (11:25 -0400)
Port aggregated doorbell support to sdma6.

Signed-off-by: Jack Xiao <Jack.Xiao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c

index 0a31ba3..0200cb3 100644 (file)
@@ -246,34 +246,68 @@ static uint64_t sdma_v6_0_ring_get_wptr(struct amdgpu_ring *ring)
 static void sdma_v6_0_ring_set_wptr(struct amdgpu_ring *ring)
 {
        struct amdgpu_device *adev = ring->adev;
+       uint32_t *wptr_saved;
+       uint32_t *is_queue_unmap;
+       uint64_t aggregated_db_index;
+       uint32_t mqd_size = adev->mqds[AMDGPU_HW_IP_DMA].mqd_size;
 
        DRM_DEBUG("Setting write pointer\n");
-       if (ring->use_doorbell) {
-               DRM_DEBUG("Using doorbell -- "
-                               "wptr_offs == 0x%08x "
-                               "lower_32_bits(ring->wptr) << 2 == 0x%08x "
-                               "upper_32_bits(ring->wptr) << 2 == 0x%08x\n",
-                               ring->wptr_offs,
-                               lower_32_bits(ring->wptr << 2),
-                               upper_32_bits(ring->wptr << 2));
-               /* XXX check if swapping is necessary on BE */
+
+       if (ring->is_mes_queue) {
+               wptr_saved = (uint32_t *)(ring->mqd_ptr + mqd_size);
+               is_queue_unmap = (uint32_t *)(ring->mqd_ptr + mqd_size +
+                                             sizeof(uint32_t));
+               aggregated_db_index =
+                       amdgpu_mes_get_aggregated_doorbell_index(adev,
+                                                        ring->hw_prio);
+
                atomic64_set((atomic64_t *)ring->wptr_cpu_addr,
                             ring->wptr << 2);
-               DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n",
-                               ring->doorbell_index, ring->wptr << 2);
-               WDOORBELL64(ring->doorbell_index, ring->wptr << 2);
+               *wptr_saved = ring->wptr << 2;
+               if (*is_queue_unmap) {
+                       WDOORBELL64(aggregated_db_index, ring->wptr << 2);
+                       DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n",
+                                       ring->doorbell_index, ring->wptr << 2);
+                       WDOORBELL64(ring->doorbell_index, ring->wptr << 2);
+               } else {
+                       DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n",
+                                       ring->doorbell_index, ring->wptr << 2);
+                       WDOORBELL64(ring->doorbell_index, ring->wptr << 2);
+
+                       if (*is_queue_unmap)
+                               WDOORBELL64(aggregated_db_index,
+                                           ring->wptr << 2);
+               }
        } else {
-               DRM_DEBUG("Not using doorbell -- "
-                               "regSDMA%i_GFX_RB_WPTR == 0x%08x "
-                               "regSDMA%i_GFX_RB_WPTR_HI == 0x%08x\n",
-                               ring->me,
-                               lower_32_bits(ring->wptr << 2),
-                               ring->me,
-                               upper_32_bits(ring->wptr << 2));
-               WREG32_SOC15_IP(GC, sdma_v6_0_get_reg_offset(adev, ring->me, regSDMA0_QUEUE0_RB_WPTR),
-                       lower_32_bits(ring->wptr << 2));
-               WREG32_SOC15_IP(GC, sdma_v6_0_get_reg_offset(adev, ring->me, regSDMA0_QUEUE0_RB_WPTR_HI),
-                       upper_32_bits(ring->wptr << 2));
+               if (ring->use_doorbell) {
+                       DRM_DEBUG("Using doorbell -- "
+                                 "wptr_offs == 0x%08x "
+                                 "lower_32_bits(ring->wptr) << 2 == 0x%08x "
+                                 "upper_32_bits(ring->wptr) << 2 == 0x%08x\n",
+                                 ring->wptr_offs,
+                                 lower_32_bits(ring->wptr << 2),
+                                 upper_32_bits(ring->wptr << 2));
+                       /* XXX check if swapping is necessary on BE */
+                       atomic64_set((atomic64_t *)ring->wptr_cpu_addr,
+                                    ring->wptr << 2);
+                       DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n",
+                                 ring->doorbell_index, ring->wptr << 2);
+                       WDOORBELL64(ring->doorbell_index, ring->wptr << 2);
+               } else {
+                       DRM_DEBUG("Not using doorbell -- "
+                                 "regSDMA%i_GFX_RB_WPTR == 0x%08x "
+                                 "regSDMA%i_GFX_RB_WPTR_HI == 0x%08x\n",
+                                 ring->me,
+                                 lower_32_bits(ring->wptr << 2),
+                                 ring->me,
+                                 upper_32_bits(ring->wptr << 2));
+                       WREG32_SOC15_IP(GC, sdma_v6_0_get_reg_offset(adev,
+                                       ring->me, regSDMA0_QUEUE0_RB_WPTR),
+                                       lower_32_bits(ring->wptr << 2));
+                       WREG32_SOC15_IP(GC, sdma_v6_0_get_reg_offset(adev,
+                                       ring->me, regSDMA0_QUEUE0_RB_WPTR_HI),
+                                       upper_32_bits(ring->wptr << 2));
+               }
        }
 }