From: Shaoyun Liu <shaoyun....@amd.com>

Change doorbell assignments to allow routing doorbells for 8 user
mode SDMA queues per engine.

Signed-off-by: Shaoyun Liu <shaoyun....@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehl...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h             | 14 ++++-----
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c      | 38 +++++++++++++++----------
 drivers/gpu/drm/amd/include/kgd_kfd_interface.h |  6 ++--
 3 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index e992e0f..afa9e77 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -409,16 +409,16 @@ typedef enum _AMDGPU_DOORBELL64_ASSIGNMENT
        AMDGPU_DOORBELL64_GFX_RING0               = 0x8b,
 
        /*
-        * Other graphics doorbells can be allocated here: from 0x8c to 0xef
+        * Other graphics doorbells can be allocated here: from 0x8c to 0xdf
         * Graphics voltage island aperture 1
-        * default non-graphics QWORD index is 0xF0 - 0xFF inclusive
+        * default non-graphics QWORD index is 0xe0 - 0xFF inclusive
         */
 
-       /* sDMA engines */
-       AMDGPU_DOORBELL64_sDMA_ENGINE0            = 0xF0,
-       AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0     = 0xF1,
-       AMDGPU_DOORBELL64_sDMA_ENGINE1            = 0xF2,
-       AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE1     = 0xF3,
+       /* sDMA engines  reserved from 0xe0 -oxef  */
+       AMDGPU_DOORBELL64_sDMA_ENGINE0            = 0xE0,
+       AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0     = 0xE1,
+       AMDGPU_DOORBELL64_sDMA_ENGINE1            = 0xE8,
+       AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE1     = 0xE9,
 
        /* Interrupt handler */
        AMDGPU_DOORBELL64_IH                      = 0xF4,  /* For legacy 
interrupt ring buffer */
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index d7f08e3..bf0b012 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -126,7 +126,7 @@ static void amdgpu_doorbell_get_kfd_info(struct 
amdgpu_device *adev,
 
 void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
 {
-       int i;
+       int i, n;
        int last_valid_bit;
        if (adev->kfd) {
                struct kgd2kfd_shared_resources gpu_resources = {
@@ -165,7 +165,15 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
                                &gpu_resources.doorbell_physical_address,
                                &gpu_resources.doorbell_aperture_size,
                                &gpu_resources.doorbell_start_offset);
-               if (adev->asic_type >= CHIP_VEGA10) {
+
+               if (adev->asic_type < CHIP_VEGA10) {
+                       kgd2kfd->device_init(adev->kfd, &gpu_resources);
+                       return;
+               }
+
+               n = (adev->asic_type < CHIP_VEGA20) ? 2 : 8;
+
+               for (i = 0; i < n; i += 2) {
                        /* On SOC15 the BIF is involved in routing
                         * doorbells using the low 12 bits of the
                         * address. Communicate the assignments to
@@ -173,20 +181,20 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
                         * process in case of 64-bit doorbells so we
                         * can use each doorbell assignment twice.
                         */
-                       gpu_resources.sdma_doorbell[0][0] =
-                               AMDGPU_DOORBELL64_sDMA_ENGINE0;
-                       gpu_resources.sdma_doorbell[0][1] =
-                               AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200;
-                       gpu_resources.sdma_doorbell[1][0] =
-                               AMDGPU_DOORBELL64_sDMA_ENGINE1;
-                       gpu_resources.sdma_doorbell[1][1] =
-                               AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200;
-                       /* Doorbells 0x0f0-0ff and 0x2f0-2ff are reserved for
-                        * SDMA, IH and VCN. So don't use them for the CP.
-                        */
-                       gpu_resources.reserved_doorbell_mask = 0x1f0;
-                       gpu_resources.reserved_doorbell_val  = 0x0f0;
+                       gpu_resources.sdma_doorbell[0][i] =
+                               AMDGPU_DOORBELL64_sDMA_ENGINE0 + (i >> 1);
+                       gpu_resources.sdma_doorbell[0][i+1] =
+                               AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 
1);
+                       gpu_resources.sdma_doorbell[1][i] =
+                               AMDGPU_DOORBELL64_sDMA_ENGINE1 + (i >> 1);
+                       gpu_resources.sdma_doorbell[1][i+1] =
+                               AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 
1);
                }
+               /* Doorbells 0x0e0-0ff and 0x2e0-2ff are reserved for
+                * SDMA, IH and VCN. So don't use them for the CP.
+                */
+               gpu_resources.reserved_doorbell_mask = 0x1e0;
+               gpu_resources.reserved_doorbell_val  = 0x0e0;
 
                kgd2kfd->device_init(adev->kfd, &gpu_resources);
        }
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h 
b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index 4ef0a50..0545888 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -146,10 +146,10 @@ struct kgd2kfd_shared_resources {
         * is reserved: (D & reserved_doorbell_mask) == reserved_doorbell_val
         *
         * KFD currently uses 1024 (= 0x3ff) doorbells per process. If
-        * doorbells 0x0f0-0x0f7 and 0x2f-0x2f7 are reserved, that means
-        * mask would be set to 0x1f8 and val set to 0x0f0.
+        * doorbells 0x0e0-0x0ff and 0x2e0-0x2ff are reserved, that means
+        * mask would be set to 0x1e0 and val set to 0x0e0.
         */
-       unsigned int sdma_doorbell[2][2];
+       unsigned int sdma_doorbell[2][8];
        unsigned int reserved_doorbell_mask;
        unsigned int reserved_doorbell_val;
 
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to