Commit 2a060b3a authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu/userq: handle runtime pm



Take a reference when we create a queue and drop it
when we destroy the queue.  We need to keep the device
active while user queues are active.

v2: squash in fix from Sunil
v3: squash in fix from Prike

Reviewed-by: default avatarPrike Liang <Prike.Liang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 29adc5c2
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include "mes_userqueue.h"
#include "amdgpu_userq_fence.h"
#include "v11_structs.h"
#include <linux/pm_runtime.h>

#define AMDGPU_USERQ_PROC_CTX_SZ PAGE_SIZE
#define AMDGPU_USERQ_GANG_CTX_SZ PAGE_SIZE
@@ -287,6 +288,12 @@ 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");
@@ -321,6 +328,9 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,

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);
@@ -332,12 +342,17 @@ static void
mes_userq_mqd_destroy(struct amdgpu_userq_mgr *uq_mgr,
		      struct amdgpu_usermode_queue *queue)
{
	struct amdgpu_device *adev = uq_mgr->adev;

	if (queue->queue_active)
		mes_userq_unmap(uq_mgr, queue);

	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);
}

static int mes_userq_suspend(struct amdgpu_userq_mgr *uq_mgr,