drm/amdgpu/userq: move runpm handling into core userq code
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 11 Apr 2025 19:49:51 +0000 (15:49 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Apr 2025 14:52:49 +0000 (10:52 -0400)
Pull it out of the MES code and into the generic code.
It's not MES specific and needs to be applied to all user
queues regardless of the backend.

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

index aa7222137c31dce32e91a0eb9fe95a10d9542e26..1867520ba258ed1f912c4f4037fee7978963ef97 100644 (file)
@@ -23,6 +23,8 @@
  */
 
 #include <drm/drm_exec.h>
+#include <linux/pm_runtime.h>
+
 #include "amdgpu.h"
 #include "amdgpu_vm.h"
 #include "amdgpu_userqueue.h"
@@ -257,6 +259,10 @@ amdgpu_userqueue_destroy(struct drm_file *filp, int queue_id)
        amdgpu_bo_unref(&queue->db_obj.obj);
        amdgpu_userqueue_cleanup(uq_mgr, queue, queue_id);
        mutex_unlock(&uq_mgr->userq_mutex);
+
+       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
+       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+
        return r;
 }
 
@@ -280,6 +286,13 @@ amdgpu_userqueue_create(struct drm_file *filp, union drm_amdgpu_userq *args)
                return -EINVAL;
        }
 
+       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
+       if (r < 0) {
+               dev_err(adev->dev, "pm_runtime_get_sync() failed for userqueue create\n");
+               pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+               return r;
+       }
+
        /*
         * There could be a situation that we are creating a new queue while
         * the other queues under this UQ_mgr are suspended. So if there is any
index e3c3fc160b7999a7642ac0a266699109b01ab17f..34f8f63747d59d168dd5393854317ece5f9314a4 100644 (file)
@@ -25,7 +25,6 @@
 #include "amdgpu_gfx.h"
 #include "mes_userqueue.h"
 #include "amdgpu_userq_fence.h"
-#include <linux/pm_runtime.h>
 
 #define AMDGPU_USERQ_PROC_CTX_SZ PAGE_SIZE
 #define AMDGPU_USERQ_GANG_CTX_SZ PAGE_SIZE
@@ -294,12 +293,6 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,
 
        queue->userq_prop = userq_props;
 
-       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
-       if (r < 0) {
-               dev_err(adev->dev, "pm_runtime_get_sync() failed for userqueue mqd create\n");
-               goto deference_pm;
-       }
-
        r = mqd_hw_default->init_mqd(adev, (void *)queue->mqd.cpu_ptr, userq_props);
        if (r) {
                DRM_ERROR("Failed to initialize MQD for userqueue\n");
@@ -327,9 +320,6 @@ free_ctx:
 
 free_mqd:
        amdgpu_userqueue_destroy_object(uq_mgr, &queue->mqd);
-       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-deference_pm:
-       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
 
 free_props:
        kfree(userq_props);
@@ -341,14 +331,9 @@ static void
 mes_userq_mqd_destroy(struct amdgpu_userq_mgr *uq_mgr,
                      struct amdgpu_usermode_queue *queue)
 {
-       struct amdgpu_device *adev = uq_mgr->adev;
-
        amdgpu_userqueue_destroy_object(uq_mgr, &queue->fw_obj);
        kfree(queue->userq_prop);
        amdgpu_userqueue_destroy_object(uq_mgr, &queue->mqd);
-
-       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
 }
 
 const struct amdgpu_userq_funcs userq_mes_funcs = {