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
