drm/amdgpu/mes: Update the doorbell function signatures
authorMukul Joshi <mukul.joshi@amd.com>
Wed, 2 Sep 2020 19:34:04 +0000 (15:34 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 4 May 2022 14:43:53 +0000 (10:43 -0400)
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: Mukul Joshi <mukul.joshi@amd.com>
Acked-by: Oak Zeng <Oak.Zeng@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Jack Xiao <Jack.Xiao@amd.com>
Reviewed-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h

index e23c864..5be30bf 100644 (file)
 #define AMDGPU_MES_MAX_NUM_OF_QUEUES_PER_PROCESS 1024
 #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 *
                       AMDGPU_MES_MAX_NUM_OF_QUEUES_PER_PROCESS,
                       PAGE_SIZE);
 }
 
-static int amdgpu_mes_alloc_process_doorbells(struct amdgpu_device *adev,
-                                     struct amdgpu_mes_process *process)
+int amdgpu_mes_alloc_process_doorbells(struct amdgpu_device *adev,
+                                     unsigned int *doorbell_index)
 {
        int r = ida_simple_get(&adev->mes.doorbell_ida, 2,
                               adev->mes.max_doorbell_slices,
                               GFP_KERNEL);
        if (r > 0)
-               process->doorbell_index = r;
+               *doorbell_index = r;
 
        return r;
 }
 
-static void amdgpu_mes_free_process_doorbells(struct amdgpu_device *adev,
-                                     struct amdgpu_mes_process *process)
+void amdgpu_mes_free_process_doorbells(struct amdgpu_device *adev,
+                                     unsigned int doorbell_index)
 {
-       if (process->doorbell_index)
-               ida_simple_remove(&adev->mes.doorbell_ida,
-                                 process->doorbell_index);
+       if (doorbell_index)
+               ida_simple_remove(&adev->mes.doorbell_ida, 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,
@@ -79,10 +88,8 @@ static int amdgpu_mes_queue_doorbell_get(struct amdgpu_device *adev,
 
        set_bit(found, process->doorbell_bitmap);
 
-       *doorbell_index =
-               (process->doorbell_index *
-                amdgpu_mes_doorbell_process_slice(adev)) / sizeof(u32) +
-               found * 2;
+       *doorbell_index = amdgpu_mes_get_doorbell_dw_offset_in_bar(adev,
+                               process->doorbell_index, found);
 
        return 0;
 }
@@ -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);
 
        /* 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) {
                DRM_ERROR("failed to allocate doorbell for process\n");
                goto clean_up_ctx;
@@ -338,7 +345,7 @@ void amdgpu_mes_destroy_process(struct amdgpu_device *adev, int pasid)
                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);
        amdgpu_bo_free_kernel(&process->proc_ctx_bo,
index 781b57c..548015b 100644 (file)
@@ -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_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__ */