Allocate aggregated doorbell bo at device level so it can be
used for multiple IPs

Signed-off-by: David (Ming Qiang) Wu <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h              |  3 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c | 16 ++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 0f6e9cdbe7d8..aeefc13fd36b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1245,6 +1245,9 @@ struct amdgpu_device {
         * Must be last --ends in a flexible-array member.
         */
        struct amdgpu_kfd_dev           kfd;
+
+       /* aggregated doorbell */
+       struct amdgpu_bo                *agdb_bo;
 };
 
 /*
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c
index bc7858567321..2b0d123bc984 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c
@@ -148,6 +148,7 @@ uint32_t amdgpu_doorbell_index_on_bar(struct amdgpu_device 
*adev,
  */
 int amdgpu_doorbell_create_kernel_doorbells(struct amdgpu_device *adev)
 {
+       struct amdgpu_bo_param bp;
        int r;
        int size;
 
@@ -176,6 +177,19 @@ int amdgpu_doorbell_create_kernel_doorbells(struct 
amdgpu_device *adev)
        }
 
        adev->doorbell.num_kernel_doorbells = size / sizeof(u32);
+
+       /* allocate aggregated doorbell bo at device level */
+       if (!adev->agdb_bo) {
+               memset(&bp, 0, sizeof(bp));
+               bp.type        = ttm_bo_type_device;
+               bp.size        = AMDGPU_GPU_PAGE_SIZE;
+               bp.byte_align  = AMDGPU_GPU_PAGE_SIZE;
+               bp.domain      = AMDGPU_GEM_DOMAIN_DOORBELL;
+               bp.bo_ptr_size = sizeof(struct amdgpu_bo);
+
+               return amdgpu_bo_create(adev, &bp, &adev->agdb_bo);
+       }
+
        return 0;
 }
 
@@ -241,4 +255,6 @@ void amdgpu_doorbell_fini(struct amdgpu_device *adev)
        amdgpu_bo_free_kernel(&adev->doorbell.kernel_doorbells,
                              NULL,
                              (void **)&adev->doorbell.cpu_addr);
+       if (adev->agdb_bo)
+               amdgpu_bo_unref(&adev->agdb_bo);
 }
-- 
2.43.0

Reply via email to