diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2024-06-03 13:35:05 -0400 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2024-08-16 14:25:02 -0400 | 
| commit | 5b7a59de4845460a313d93d4839258bfb982357c (patch) | |
| tree | 44b97bee047ee62cc6e6708f973d6091542d7e3c /drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | |
| parent | 478efcb90b074f0fdd18e62b30ce09140bd69022 (diff) | |
drm/amdgpu/mes: add API for user queue reset
Add API for resetting user queues.
Acked-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 43 | 
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c index c598c3edff7e..04a4f0dfec15 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -793,6 +793,49 @@ int amdgpu_mes_remove_hw_queue(struct amdgpu_device *adev, int queue_id)  	return 0;  } +int amdgpu_mes_reset_hw_queue(struct amdgpu_device *adev, int queue_id) +{ +	unsigned long flags; +	struct amdgpu_mes_queue *queue; +	struct amdgpu_mes_gang *gang; +	struct mes_reset_queue_input queue_input; +	int r; + +	/* +	 * Avoid taking any other locks under MES lock to avoid circular +	 * lock dependencies. +	 */ +	amdgpu_mes_lock(&adev->mes); + +	/* remove the mes gang from idr list */ +	spin_lock_irqsave(&adev->mes.queue_id_lock, flags); + +	queue = idr_find(&adev->mes.queue_id_idr, queue_id); +	if (!queue) { +		spin_unlock_irqrestore(&adev->mes.queue_id_lock, flags); +		amdgpu_mes_unlock(&adev->mes); +		DRM_ERROR("queue id %d doesn't exist\n", queue_id); +		return -EINVAL; +	} +	spin_unlock_irqrestore(&adev->mes.queue_id_lock, flags); + +	DRM_DEBUG("try to reset queue, doorbell off = 0x%llx\n", +		  queue->doorbell_off); + +	gang = queue->gang; +	queue_input.doorbell_offset = queue->doorbell_off; +	queue_input.gang_context_addr = gang->gang_ctx_gpu_addr; + +	r = adev->mes.funcs->reset_hw_queue(&adev->mes, &queue_input); +	if (r) +		DRM_ERROR("failed to reset hardware queue, queue id = %d\n", +			  queue_id); + +	amdgpu_mes_unlock(&adev->mes); + +	return 0; +} +  int amdgpu_mes_map_legacy_queue(struct amdgpu_device *adev,  				struct amdgpu_ring *ring)  {  | 
