drm/amdgpu/userq: add suspend and resume helpers
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 20 Feb 2025 21:31:40 +0000 (16:31 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Apr 2025 14:49:26 +0000 (10:49 -0400)
Add helpers to unmap and map user queues on suspend and
resume.

Reviewed-by: Sunil Khatri <sunil.khatri@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.h

index 41a095c12f956e71e9a55649f0d4246bf45000a4..f5c2489baae4322ceb8b6313e8df67e5b40c77f8 100644 (file)
@@ -681,3 +681,42 @@ void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr)
        mutex_unlock(&userq_mgr->userq_mutex);
        mutex_destroy(&userq_mgr->userq_mutex);
 }
+
+int amdgpu_userq_suspend(struct amdgpu_device *adev)
+{
+       const struct amdgpu_userq_funcs *userq_funcs;
+       struct amdgpu_usermode_queue *queue;
+       struct amdgpu_userq_mgr *uqm, *tmp;
+       int queue_id;
+       int ret = 0;
+
+       mutex_lock(&adev->userq_mutex);
+       list_for_each_entry_safe(uqm, tmp, &adev->userq_mgr_list, list) {
+               cancel_delayed_work_sync(&uqm->resume_work);
+               idr_for_each_entry(&uqm->userq_idr, queue, queue_id) {
+                       userq_funcs = adev->userq_funcs[queue->queue_type];
+                       ret |= userq_funcs->unmap(uqm, queue);
+               }
+       }
+       mutex_unlock(&adev->userq_mutex);
+       return ret;
+}
+
+int amdgpu_userq_resume(struct amdgpu_device *adev)
+{
+       const struct amdgpu_userq_funcs *userq_funcs;
+       struct amdgpu_usermode_queue *queue;
+       struct amdgpu_userq_mgr *uqm, *tmp;
+       int queue_id;
+       int ret = 0;
+
+       mutex_lock(&adev->userq_mutex);
+       list_for_each_entry_safe(uqm, tmp, &adev->userq_mgr_list, list) {
+               idr_for_each_entry(&uqm->userq_idr, queue, queue_id) {
+                       userq_funcs = adev->userq_funcs[queue->queue_type];
+                       ret |= userq_funcs->map(uqm, queue);
+               }
+       }
+       mutex_unlock(&adev->userq_mutex);
+       return ret;
+}
index a0cf6978f2ba88fe85b53a86e4dc7ad1b9b08300..381b9c6f0573d18076c155f7f6132f0c2da45fe1 100644 (file)
@@ -111,4 +111,7 @@ uint64_t amdgpu_userqueue_get_doorbell_index(struct amdgpu_userq_mgr *uq_mgr,
                                             struct amdgpu_db_info *db_info,
                                             struct drm_file *filp);
 
+int amdgpu_userq_suspend(struct amdgpu_device *adev);
+int amdgpu_userq_resume(struct amdgpu_device *adev);
+
 #endif