Commit d2f272a3 authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: rework userq fence signal processing



Move more code into a common userq function.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarSunil Khatri <sunil.khatri@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 12f52fab11500d0dce7d23c71909eaf0cf9aa701)
parent 927011b6
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -205,6 +205,19 @@ void amdgpu_userq_start_hang_detect_work(struct amdgpu_usermode_queue *queue)
		     msecs_to_jiffies(timeout_ms));
}

void amdgpu_userq_process_fence_irq(struct amdgpu_device *adev, u32 doorbell)
{
	struct xarray *xa = &adev->userq_doorbell_xa;
	struct amdgpu_usermode_queue *queue;
	unsigned long flags;

	xa_lock_irqsave(xa, flags);
	queue = xa_load(xa, doorbell);
	if (queue)
		amdgpu_userq_fence_driver_process(queue->fence_drv);
	xa_unlock_irqrestore(xa, flags);
}

static void amdgpu_userq_init_hang_detect_work(struct amdgpu_usermode_queue *queue)
{
	INIT_DELAYED_WORK(&queue->hang_detect_work, amdgpu_userq_hang_detect_work);
+1 −0
Original line number Diff line number Diff line
@@ -156,6 +156,7 @@ void amdgpu_userq_reset_work(struct work_struct *work);
void amdgpu_userq_pre_reset(struct amdgpu_device *adev);
int amdgpu_userq_post_reset(struct amdgpu_device *adev, bool vram_lost);
void amdgpu_userq_start_hang_detect_work(struct amdgpu_usermode_queue *queue);
void amdgpu_userq_process_fence_irq(struct amdgpu_device *adev, u32 doorbell);

int amdgpu_userq_input_va_validate(struct amdgpu_device *adev,
				   struct amdgpu_usermode_queue *queue,
+1 −9
Original line number Diff line number Diff line
@@ -6523,15 +6523,7 @@ static int gfx_v11_0_eop_irq(struct amdgpu_device *adev,
	DRM_DEBUG("IH: CP EOP\n");

	if (adev->enable_mes && doorbell_offset) {
		struct amdgpu_usermode_queue *queue;
		struct xarray *xa = &adev->userq_doorbell_xa;
		unsigned long flags;

		xa_lock_irqsave(xa, flags);
		queue = xa_load(xa, doorbell_offset);
		if (queue)
			amdgpu_userq_fence_driver_process(queue->fence_drv);
		xa_unlock_irqrestore(xa, flags);
		amdgpu_userq_process_fence_irq(adev, doorbell_offset);
	} else {
		me_id = (entry->ring_id & 0x0c) >> 2;
		pipe_id = (entry->ring_id & 0x03) >> 0;
+1 −9
Original line number Diff line number Diff line
@@ -4854,15 +4854,7 @@ static int gfx_v12_0_eop_irq(struct amdgpu_device *adev,
	DRM_DEBUG("IH: CP EOP\n");

	if (adev->enable_mes && doorbell_offset) {
		struct xarray *xa = &adev->userq_doorbell_xa;
		struct amdgpu_usermode_queue *queue;
		unsigned long flags;

		xa_lock_irqsave(xa, flags);
		queue = xa_load(xa, doorbell_offset);
		if (queue)
			amdgpu_userq_fence_driver_process(queue->fence_drv);
		xa_unlock_irqrestore(xa, flags);
		amdgpu_userq_process_fence_irq(adev, doorbell_offset);
	} else {
		me_id = (entry->ring_id & 0x0c) >> 2;
		pipe_id = (entry->ring_id & 0x03) >> 0;
+1 −10
Original line number Diff line number Diff line
@@ -3643,16 +3643,7 @@ static int gfx_v12_1_eop_irq(struct amdgpu_device *adev,
	DRM_DEBUG("IH: CP EOP\n");

	if (adev->enable_mes && doorbell_offset) {
		struct xarray *xa = &adev->userq_doorbell_xa;
		struct amdgpu_usermode_queue *queue;
		unsigned long flags;

		xa_lock_irqsave(xa, flags);
		queue = xa_load(xa, doorbell_offset);
		if (queue)
			amdgpu_userq_fence_driver_process(queue->fence_drv);

		xa_unlock_irqrestore(xa, flags);
		amdgpu_userq_process_fence_irq(adev, doorbell_offset);
	} else {
		me_id = (entry->ring_id & 0x0c) >> 2;
		pipe_id = (entry->ring_id & 0x03) >> 0;
Loading