Commit 464913c0 authored by Mukul Joshi's avatar Mukul Joshi Committed by Alex Deucher

drm/amdgpu/mes: Update the doorbell function signatures

Update the function signatures for process doorbell allocations
with MES enabled to make them more generic. KFD would need to
access these functions to allocate/free doorbells when MES is
enabled.
Signed-off-by: default avatarMukul Joshi <mukul.joshi@amd.com>
Acked-by: default avatarOak Zeng <Oak.Zeng@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: default avatarJack Xiao <Jack.Xiao@amd.com>
Reviewed-by: default avatarHarish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent da1c0338
...@@ -29,31 +29,40 @@ ...@@ -29,31 +29,40 @@
#define AMDGPU_MES_MAX_NUM_OF_QUEUES_PER_PROCESS 1024 #define AMDGPU_MES_MAX_NUM_OF_QUEUES_PER_PROCESS 1024
#define AMDGPU_ONE_DOORBELL_SIZE 8 #define AMDGPU_ONE_DOORBELL_SIZE 8
static int amdgpu_mes_doorbell_process_slice(struct amdgpu_device *adev) int amdgpu_mes_doorbell_process_slice(struct amdgpu_device *adev)
{ {
return roundup(AMDGPU_ONE_DOORBELL_SIZE * return roundup(AMDGPU_ONE_DOORBELL_SIZE *
AMDGPU_MES_MAX_NUM_OF_QUEUES_PER_PROCESS, AMDGPU_MES_MAX_NUM_OF_QUEUES_PER_PROCESS,
PAGE_SIZE); PAGE_SIZE);
} }
static int amdgpu_mes_alloc_process_doorbells(struct amdgpu_device *adev, int amdgpu_mes_alloc_process_doorbells(struct amdgpu_device *adev,
struct amdgpu_mes_process *process) unsigned int *doorbell_index)
{ {
int r = ida_simple_get(&adev->mes.doorbell_ida, 2, int r = ida_simple_get(&adev->mes.doorbell_ida, 2,
adev->mes.max_doorbell_slices, adev->mes.max_doorbell_slices,
GFP_KERNEL); GFP_KERNEL);
if (r > 0) if (r > 0)
process->doorbell_index = r; *doorbell_index = r;
return r; return r;
} }
static void amdgpu_mes_free_process_doorbells(struct amdgpu_device *adev, void amdgpu_mes_free_process_doorbells(struct amdgpu_device *adev,
struct amdgpu_mes_process *process) unsigned int doorbell_index)
{ {
if (process->doorbell_index) if (doorbell_index)
ida_simple_remove(&adev->mes.doorbell_ida, ida_simple_remove(&adev->mes.doorbell_ida, doorbell_index);
process->doorbell_index); }
unsigned int amdgpu_mes_get_doorbell_dw_offset_in_bar(
struct amdgpu_device *adev,
uint32_t doorbell_index,
unsigned int doorbell_id)
{
return ((doorbell_index *
amdgpu_mes_doorbell_process_slice(adev)) / sizeof(u32) +
doorbell_id * 2);
} }
static int amdgpu_mes_queue_doorbell_get(struct amdgpu_device *adev, static int amdgpu_mes_queue_doorbell_get(struct amdgpu_device *adev,
...@@ -79,10 +88,8 @@ static int amdgpu_mes_queue_doorbell_get(struct amdgpu_device *adev, ...@@ -79,10 +88,8 @@ static int amdgpu_mes_queue_doorbell_get(struct amdgpu_device *adev,
set_bit(found, process->doorbell_bitmap); set_bit(found, process->doorbell_bitmap);
*doorbell_index = *doorbell_index = amdgpu_mes_get_doorbell_dw_offset_in_bar(adev,
(process->doorbell_index * process->doorbell_index, found);
amdgpu_mes_doorbell_process_slice(adev)) / sizeof(u32) +
found * 2;
return 0; return 0;
} }
...@@ -262,7 +269,7 @@ int amdgpu_mes_create_process(struct amdgpu_device *adev, int pasid, ...@@ -262,7 +269,7 @@ int amdgpu_mes_create_process(struct amdgpu_device *adev, int pasid,
memset(process->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE); memset(process->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE);
/* allocate the starting doorbell index of the process */ /* allocate the starting doorbell index of the process */
r = amdgpu_mes_alloc_process_doorbells(adev, process); r = amdgpu_mes_alloc_process_doorbells(adev, &process->doorbell_index);
if (r < 0) { if (r < 0) {
DRM_ERROR("failed to allocate doorbell for process\n"); DRM_ERROR("failed to allocate doorbell for process\n");
goto clean_up_ctx; goto clean_up_ctx;
...@@ -338,7 +345,7 @@ void amdgpu_mes_destroy_process(struct amdgpu_device *adev, int pasid) ...@@ -338,7 +345,7 @@ void amdgpu_mes_destroy_process(struct amdgpu_device *adev, int pasid)
kfree(gang); kfree(gang);
} }
amdgpu_mes_free_process_doorbells(adev, process); amdgpu_mes_free_process_doorbells(adev, process->doorbell_index);
idr_remove(&adev->mes.pasid_idr, pasid); idr_remove(&adev->mes.pasid_idr, pasid);
amdgpu_bo_free_kernel(&process->proc_ctx_bo, amdgpu_bo_free_kernel(&process->proc_ctx_bo,
......
...@@ -271,4 +271,13 @@ int amdgpu_mes_ctx_map_meta_data(struct amdgpu_device *adev, ...@@ -271,4 +271,13 @@ int amdgpu_mes_ctx_map_meta_data(struct amdgpu_device *adev,
int amdgpu_mes_self_test(struct amdgpu_device *adev); int amdgpu_mes_self_test(struct amdgpu_device *adev);
int amdgpu_mes_alloc_process_doorbells(struct amdgpu_device *adev,
unsigned int *doorbell_index);
void amdgpu_mes_free_process_doorbells(struct amdgpu_device *adev,
unsigned int doorbell_index);
unsigned int amdgpu_mes_get_doorbell_dw_offset_in_bar(
struct amdgpu_device *adev,
uint32_t doorbell_index,
unsigned int doorbell_id);
int amdgpu_mes_doorbell_process_slice(struct amdgpu_device *adev);
#endif /* __AMDGPU_MES_H__ */ #endif /* __AMDGPU_MES_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment