Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdkfd: get doorbell's absolute offset based on the db_size

Here, Adding db_size in byte to find the doorbell's
absolute offset for both 32-bit and 64-bit doorbell sizes.
So that doorbell offset will be aligned based on the doorbell
size.

v2:
- Addressed the review comment from Felix.
v3:
- Adding doorbell_size as parameter to get db absolute offset.
v4:
Squash the two patches into one.

Cc: Christian Koenig <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Shashank Sharma <shashank.sharma@amd.com>
Signed-off-by: Arvind Yadav <Arvind.Yadav@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Arvind Yadav and committed by
Alex Deucher
367a0af4 31220ee9

+24 -10
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell.h
··· 360 360 void amdgpu_doorbell_fini(struct amdgpu_device *adev); 361 361 int amdgpu_doorbell_create_kernel_doorbells(struct amdgpu_device *adev); 362 362 uint32_t amdgpu_doorbell_index_on_bar(struct amdgpu_device *adev, 363 - struct amdgpu_bo *db_bo, 364 - uint32_t doorbell_index); 363 + struct amdgpu_bo *db_bo, 364 + uint32_t doorbell_index, 365 + uint32_t db_size); 365 366 366 367 #define RDOORBELL32(index) amdgpu_mm_rdoorbell(adev, (index)) 367 368 #define WDOORBELL32(index, v) amdgpu_mm_wdoorbell(adev, (index), (v))
+9 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c
··· 114 114 * @adev: amdgpu_device pointer 115 115 * @db_bo: doorbell object's bo 116 116 * @doorbell_index: doorbell relative index in this doorbell object 117 + * @db_size: doorbell size is in byte 117 118 * 118 119 * returns doorbell's absolute index in BAR 119 120 */ 120 121 uint32_t amdgpu_doorbell_index_on_bar(struct amdgpu_device *adev, 121 - struct amdgpu_bo *db_bo, 122 - uint32_t doorbell_index) 122 + struct amdgpu_bo *db_bo, 123 + uint32_t doorbell_index, 124 + uint32_t db_size) 123 125 { 124 126 int db_bo_offset; 125 127 126 128 db_bo_offset = amdgpu_bo_gpu_offset_no_check(db_bo); 127 129 128 - /* doorbell index is 32 bit but doorbell's size is 64-bit, so *2 */ 129 - return db_bo_offset / sizeof(u32) + doorbell_index * 2; 130 + /* doorbell index is 32 bit but doorbell's size can be 32 bit 131 + * or 64 bit, so *db_size(in byte)/4 for alignment. 132 + */ 133 + return db_bo_offset / sizeof(u32) + doorbell_index * 134 + DIV_ROUND_UP(db_size, 4); 130 135 } 131 136 132 137 /**
+2 -1
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
··· 410 410 411 411 q->properties.doorbell_off = amdgpu_doorbell_index_on_bar(dev->adev, 412 412 qpd->proc_doorbells, 413 - q->doorbell_id); 413 + q->doorbell_id, 414 + dev->kfd->device_info.doorbell_size); 414 415 return 0; 415 416 } 416 417
+8 -2
drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
··· 161 161 if (inx >= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS) 162 162 return NULL; 163 163 164 - *doorbell_off = amdgpu_doorbell_index_on_bar(kfd->adev, kfd->doorbells, inx); 164 + *doorbell_off = amdgpu_doorbell_index_on_bar(kfd->adev, 165 + kfd->doorbells, 166 + inx, 167 + kfd->device_info.doorbell_size); 165 168 inx *= 2; 166 169 167 170 pr_debug("Get kernel queue doorbell\n" ··· 243 240 return 0; 244 241 } 245 242 246 - first_db_index = amdgpu_doorbell_index_on_bar(adev, pdd->qpd.proc_doorbells, 0); 243 + first_db_index = amdgpu_doorbell_index_on_bar(adev, 244 + pdd->qpd.proc_doorbells, 245 + 0, 246 + pdd->dev->kfd->device_info.doorbell_size); 247 247 return adev->doorbell.base + first_db_index * sizeof(uint32_t); 248 248 } 249 249
+2 -1
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
··· 377 377 */ 378 378 uint32_t first_db_index = amdgpu_doorbell_index_on_bar(pdd->dev->adev, 379 379 pdd->qpd.proc_doorbells, 380 - 0); 380 + 0, 381 + pdd->dev->kfd->device_info.doorbell_size); 381 382 382 383 *p_doorbell_offset_in_process = (q->properties.doorbell_off 383 384 - first_db_index) * sizeof(uint32_t);