- Added support to handle the userqueue protected fence signal hardware interrupt. - Create a hash table which maps va address to the fence driver. Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + .../gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 3 +++ .../gpu/drm/amd/amdgpu/amdgpu_userq_fence.h | 1 + drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 20 ++++++++++++++++++- 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 1d8a762f43c6..58e8c72706a9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -971,6 +971,7 @@ struct amdgpu_device { struct amdgpu_mqd mqds[AMDGPU_HW_IP_NUM]; struct amdgpu_userq_mgr *userq_mgr; + DECLARE_HASHTABLE(userq_fence_table, 5); /* df */ struct amdgpu_df df; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 828d0dd1455b..c89d5fd4a23b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -3431,6 +3431,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, mutex_init(&adev->mn_lock); mutex_init(&adev->virt.vf_errors.lock); hash_init(adev->mn_hash); + hash_init(adev->userq_fence_table); mutex_init(&adev->psp.mutex); mutex_init(&adev->notifier_lock); mutex_init(&adev->pm.stable_pstate_ctx_lock); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c index 1c455b7ebcd6..a183d04bb98e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c @@ -90,6 +90,9 @@ int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev, INIT_LIST_HEAD(&fence_drv->fences); spin_lock_init(&fence_drv->fence_list_lock); + hash_add(adev->userq_fence_table, &fence_drv->node, + fence_drv->gpu_addr); + fence_drv->adev = adev; fence_drv->context = dma_fence_context_alloc(1); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h index 2b2f52296d76..cf714247dc05 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h @@ -41,6 +41,7 @@ struct amdgpu_userq_fence { struct amdgpu_userq_fence_driver { struct kref refcount; + struct hlist_node node; u64 gpu_addr; u64 *cpu_addr; u64 context; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c index a56c6e106d00..b52b90bd6edd 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c @@ -30,6 +30,7 @@ #include "amdgpu_psp.h" #include "amdgpu_smu.h" #include "amdgpu_atomfirmware.h" +#include "amdgpu_userq_fence.h" #include "imu_v11_0.h" #include "soc21.h" #include "nvd.h" @@ -5870,10 +5871,27 @@ static int gfx_v11_0_eop_irq(struct amdgpu_device *adev, u8 me_id, pipe_id, queue_id; struct amdgpu_ring *ring; uint32_t mes_queue_id = entry->src_data[0]; + struct hlist_node *tmp; + struct amdgpu_userq_fence_driver *f; + u32 upper32 = entry->src_data[1]; + u32 lower32 = entry->src_data[2]; + u64 fence_address = ((u64)upper32 << 32) | lower32; DRM_DEBUG("IH: CP EOP\n"); - if (adev->enable_mes && (mes_queue_id & AMDGPU_FENCE_MES_QUEUE_FLAG)) { + if (adev->enable_mes && fence_address) { + hash_for_each_safe(adev->userq_fence_table, i, tmp, f, node) { + if (fence_address == f->gpu_addr) { + hash_del(&f->node); + break; + } + } + + if (f) { + DRM_DEBUG("user queue fence address %llu\n", fence_address); + amdgpu_userq_fence_driver_process(f); + } + } else if (adev->enable_mes && (mes_queue_id & AMDGPU_FENCE_MES_QUEUE_FLAG)) { struct amdgpu_mes_queue *queue; mes_queue_id &= AMDGPU_FENCE_MES_QUEUE_ID_MASK; -- 2.25.1