[PATCH] drm/amdkfd: Use KIQ to unmap HIQ

Felix Kuehling felix.kuehling at amd.com
Fri Jun 16 18:21:17 UTC 2023


On 2023-06-16 14:00, Mukul Joshi wrote:
> Currently, we unmap HIQ by directly writing to HQD
> registers. This doesn't work for GFX9.4.3. Instead,
> use KIQ to unmap HIQ, similar to how we use KIQ to
> map HIQ. Using KIQ to unmap HIQ works for all GFX
> series post GFXv9.
>
> Signed-off-by: Mukul Joshi <mukul.joshi at amd.com>
> ---
>   .../drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c   |  1 +
>   .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c    | 47 ++++++++++++++++++
>   .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h    |  3 ++
>   .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c  |  1 +
>   .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c    | 47 ++++++++++++++++++
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 48 +++++++++++++++++++
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h |  3 ++
>   drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c  |  8 ++++
>   drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h  |  4 ++
>   .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c  |  2 +-
>   .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c  |  2 +-
>   .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c   |  7 ++-
>   .../gpu/drm/amd/include/kgd_kfd_interface.h   |  3 ++
>   13 files changed, 170 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c
> index 5b4b7f8b92a5..b82435e17ed0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c
> @@ -372,6 +372,7 @@ const struct kfd2kgd_calls gc_9_4_3_kfd2kgd = {
>   	.hqd_sdma_dump = kgd_gfx_v9_4_3_hqd_sdma_dump,
>   	.hqd_is_occupied = kgd_gfx_v9_hqd_is_occupied,
>   	.hqd_sdma_is_occupied = kgd_gfx_v9_4_3_hqd_sdma_is_occupied,
> +	.hiq_hqd_destroy = kgd_gfx_v9_hiq_hqd_destroy,
>   	.hqd_destroy = kgd_gfx_v9_hqd_destroy,
>   	.hqd_sdma_destroy = kgd_gfx_v9_4_3_hqd_sdma_destroy,
>   	.wave_control_execute = kgd_gfx_v9_wave_control_execute,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> index 8ad7a7779e14..a919fb8e09a0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> @@ -510,6 +510,52 @@ static bool kgd_hqd_sdma_is_occupied(struct amdgpu_device *adev, void *mqd)
>   	return false;
>   }
>   
> +int kgd_gfx_v10_hiq_hqd_destroy(struct amdgpu_device *adev, void *mqd,
> +				uint32_t pipe_id, uint32_t queue_id,
> +				uint32_t inst)
> +{
> +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;
> +	struct v10_compute_mqd *m = get_mqd(mqd);
> +	uint32_t mec, pipe;
> +	uint32_t doorbell_off;
> +	int r;
> +
> +	doorbell_off = m->cp_hqd_pq_doorbell_control >>
> +			CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT;
> +
> +	acquire_queue(adev, pipe_id, queue_id);
> +
> +	mec = (pipe_id / adev->gfx.mec.num_pipe_per_mec) + 1;
> +	pipe = (pipe_id % adev->gfx.mec.num_pipe_per_mec);
> +
> +	spin_lock(&adev->gfx.kiq[0].ring_lock);
> +	r = amdgpu_ring_alloc(kiq_ring, 6);
> +	if (r) {
> +		pr_err("Failed to alloc KIQ (%d).\n", r);
> +		goto out_unlock;
> +	}
> +
> +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
> +	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
> +			  PACKET3_UNMAP_QUEUES_ACTION(0) |
> +			  PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
> +			  PACKET3_UNMAP_QUEUES_ENGINE_SEL(0) |
> +			  PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
> +	amdgpu_ring_write(kiq_ring,
> +			  PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(doorbell_off));
> +	amdgpu_ring_write(kiq_ring, 0);
> +	amdgpu_ring_write(kiq_ring, 0);
> +	amdgpu_ring_write(kiq_ring, 0);

This looks like you're duplicating the functionality in 
kiq->pmf->kiq_unmap_queues. Can we just call that instead? See 
amdgpu_gfx_disable_kcq for example.

Regards,
   Felix


> +
> +	amdgpu_ring_commit(kiq_ring);
> +
> +out_unlock:
> +	spin_unlock(&adev->gfx.kiq[0].ring_lock);
> +	release_queue(adev);
> +
> +	return r;
> +}
> +
>   static int kgd_hqd_destroy(struct amdgpu_device *adev, void *mqd,
>   				enum kfd_preempt_type reset_type,
>   				unsigned int utimeout, uint32_t pipe_id,
> @@ -1034,6 +1080,7 @@ const struct kfd2kgd_calls gfx_v10_kfd2kgd = {
>   	.hqd_sdma_dump = kgd_hqd_sdma_dump,
>   	.hqd_is_occupied = kgd_hqd_is_occupied,
>   	.hqd_sdma_is_occupied = kgd_hqd_sdma_is_occupied,
> +	.hiq_hqd_destroy = kgd_gfx_v10_hiq_hqd_destroy,
>   	.hqd_destroy = kgd_hqd_destroy,
>   	.hqd_sdma_destroy = kgd_hqd_sdma_destroy,
>   	.wave_control_execute = kgd_wave_control_execute,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h
> index e6b70196071a..00b4514ebdd5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h
> @@ -53,3 +53,6 @@ void kgd_gfx_v10_build_grace_period_packet_info(struct amdgpu_device *adev,
>   					       uint32_t grace_period,
>   					       uint32_t *reg_offset,
>   					       uint32_t *reg_data);
> +int kgd_gfx_v10_hiq_hqd_destroy(struct amdgpu_device *adev, void *mqd,
> +				uint32_t pipe_id, uint32_t queue_id,
> +				uint32_t inst);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c
> index 8c8437a4383f..98b3a8cdc2c6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c
> @@ -666,6 +666,7 @@ const struct kfd2kgd_calls gfx_v10_3_kfd2kgd = {
>   	.hqd_sdma_dump = hqd_sdma_dump_v10_3,
>   	.hqd_is_occupied = hqd_is_occupied_v10_3,
>   	.hqd_sdma_is_occupied = hqd_sdma_is_occupied_v10_3,
> +	.hiq_hqd_destroy = kgd_gfx_v10_hiq_hqd_destroy,
>   	.hqd_destroy = hqd_destroy_v10_3,
>   	.hqd_sdma_destroy = hqd_sdma_destroy_v10_3,
>   	.wave_control_execute = wave_control_execute_v10_3,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c
> index 91c3574ebed3..d0ef32ec76df 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c
> @@ -485,6 +485,52 @@ static bool hqd_sdma_is_occupied_v11(struct amdgpu_device *adev, void *mqd)
>   	return false;
>   }
>   
> +int hiq_hqd_destroy_v11(struct amdgpu_device *adev, void *mqd,
> +			uint32_t pipe_id, uint32_t queue_id,
> +			uint32_t inst)
> +{
> +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;
> +	struct v11_compute_mqd *m = get_mqd(mqd);
> +	uint32_t mec, pipe;
> +	uint32_t doorbell_off;
> +	int r;
> +
> +	doorbell_off = m->cp_hqd_pq_doorbell_control >>
> +			CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT;
> +
> +	acquire_queue(adev, pipe_id, queue_id);
> +
> +	mec = (pipe_id / adev->gfx.mec.num_pipe_per_mec) + 1;
> +	pipe = (pipe_id % adev->gfx.mec.num_pipe_per_mec);
> +
> +	spin_lock(&adev->gfx.kiq[0].ring_lock);
> +	r = amdgpu_ring_alloc(kiq_ring, 6);
> +	if (r) {
> +		pr_err("Failed to alloc KIQ (%d).\n", r);
> +		goto out_unlock;
> +	}
> +
> +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
> +	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
> +			  PACKET3_UNMAP_QUEUES_ACTION(0) |
> +			  PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
> +			  PACKET3_UNMAP_QUEUES_ENGINE_SEL(0) |
> +			  PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
> +	amdgpu_ring_write(kiq_ring,
> +			  PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(doorbell_off));
> +	amdgpu_ring_write(kiq_ring, 0);
> +	amdgpu_ring_write(kiq_ring, 0);
> +	amdgpu_ring_write(kiq_ring, 0);
> +
> +	amdgpu_ring_commit(kiq_ring);
> +
> +out_unlock:
> +	spin_unlock(&adev->gfx.kiq[0].ring_lock);
> +	release_queue(adev);
> +
> +	return r;
> +}
> +
>   static int hqd_destroy_v11(struct amdgpu_device *adev, void *mqd,
>   				enum kfd_preempt_type reset_type,
>   				unsigned int utimeout, uint32_t pipe_id,
> @@ -796,6 +842,7 @@ const struct kfd2kgd_calls gfx_v11_kfd2kgd = {
>   	.hqd_sdma_dump = hqd_sdma_dump_v11,
>   	.hqd_is_occupied = hqd_is_occupied_v11,
>   	.hqd_sdma_is_occupied = hqd_sdma_is_occupied_v11,
> +	.hiq_hqd_destroy = hiq_hqd_destroy_v11,
>   	.hqd_destroy = hqd_destroy_v11,
>   	.hqd_sdma_destroy = hqd_sdma_destroy_v11,
>   	.wave_control_execute = wave_control_execute_v11,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> index 51d93fb13ea3..c1708de38b33 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> @@ -523,6 +523,53 @@ static bool kgd_hqd_sdma_is_occupied(struct amdgpu_device *adev, void *mqd)
>   	return false;
>   }
>   
> +int kgd_gfx_v9_hiq_hqd_destroy(struct amdgpu_device *adev, void *mqd,
> +				uint32_t pipe_id, uint32_t queue_id,
> +				uint32_t inst)
> +{
> +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[inst].ring;
> +	struct v9_mqd *m;
> +	uint32_t mec, pipe;
> +	uint32_t doorbell_off;
> +	int r;
> +
> +	m = get_mqd(mqd);
> +	doorbell_off = m->cp_hqd_pq_doorbell_control >>
> +			CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT;
> +
> +	kgd_gfx_v9_acquire_queue(adev, pipe_id, queue_id, inst);
> +
> +	mec = (pipe_id / adev->gfx.mec.num_pipe_per_mec) + 1;
> +	pipe = (pipe_id % adev->gfx.mec.num_pipe_per_mec);
> +
> +	spin_lock(&adev->gfx.kiq[inst].ring_lock);
> +	r = amdgpu_ring_alloc(kiq_ring, 6);
> +	if (r) {
> +		pr_err("Failed to alloc KIQ (%d).\n", r);
> +		goto out_unlock;
> +	}
> +
> +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
> +	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
> +			  PACKET3_UNMAP_QUEUES_ACTION(0) |
> +			  PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
> +			  PACKET3_UNMAP_QUEUES_ENGINE_SEL(0) |
> +			  PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
> +	amdgpu_ring_write(kiq_ring,
> +			  PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(doorbell_off));
> +	amdgpu_ring_write(kiq_ring, 0);
> +	amdgpu_ring_write(kiq_ring, 0);
> +	amdgpu_ring_write(kiq_ring, 0);
> +
> +	amdgpu_ring_commit(kiq_ring);
> +
> +out_unlock:
> +	spin_unlock(&adev->gfx.kiq[inst].ring_lock);
> +	kgd_gfx_v9_release_queue(adev, inst);
> +
> +	return r;
> +}
> +
>   int kgd_gfx_v9_hqd_destroy(struct amdgpu_device *adev, void *mqd,
>   				enum kfd_preempt_type reset_type,
>   				unsigned int utimeout, uint32_t pipe_id,
> @@ -1154,6 +1201,7 @@ const struct kfd2kgd_calls gfx_v9_kfd2kgd = {
>   	.hqd_sdma_dump = kgd_hqd_sdma_dump,
>   	.hqd_is_occupied = kgd_gfx_v9_hqd_is_occupied,
>   	.hqd_sdma_is_occupied = kgd_hqd_sdma_is_occupied,
> +	.hiq_hqd_destroy = kgd_gfx_v9_hiq_hqd_destroy,
>   	.hqd_destroy = kgd_gfx_v9_hqd_destroy,
>   	.hqd_sdma_destroy = kgd_hqd_sdma_destroy,
>   	.wave_control_execute = kgd_gfx_v9_wave_control_execute,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h
> index 5f54bff0db49..37b76c66f0fb 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h
> @@ -45,6 +45,9 @@ int kgd_gfx_v9_hqd_destroy(struct amdgpu_device *adev, void *mqd,
>   				enum kfd_preempt_type reset_type,
>   				unsigned int utimeout, uint32_t pipe_id,
>   				uint32_t queue_id, uint32_t inst);
> +int kgd_gfx_v9_hiq_hqd_destroy(struct amdgpu_device *adev, void *mqd,
> +				uint32_t pipe_id, uint32_t queue_id,
> +				uint32_t inst);
>   int kgd_gfx_v9_wave_control_execute(struct amdgpu_device *adev,
>   					uint32_t gfx_index_val,
>   					uint32_t sq_cmd, uint32_t inst);
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
> index 863cf060af48..83101b3d341a 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
> @@ -193,6 +193,14 @@ int kfd_hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,
>   					      queue_id, p->doorbell_off, 0);
>   }
>   
> +int kfd_destroy_hiq_hqd(struct mqd_manager *mm, void *mqd,
> +		enum kfd_preempt_type type, unsigned int timeout,
> +		uint32_t pipe_id, uint32_t queue_id)
> +{
> +	return mm->dev->kfd2kgd->hiq_hqd_destroy(mm->dev->adev, mqd,
> +						pipe_id, queue_id, 0);
> +}
> +
>   int kfd_destroy_mqd_cp(struct mqd_manager *mm, void *mqd,
>   		enum kfd_preempt_type type, unsigned int timeout,
>   		uint32_t pipe_id, uint32_t queue_id)
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
> index 23158db7da03..8ad8c8087da8 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
> @@ -173,4 +173,8 @@ void kfd_get_hiq_xcc_mqd(struct kfd_node *dev,
>   uint64_t kfd_hiq_mqd_stride(struct kfd_node *dev);
>   uint64_t kfd_mqd_stride(struct mqd_manager *mm,
>   			struct queue_properties *q);
> +
> +int kfd_destroy_hiq_hqd(struct mqd_manager *mm, void *mqd,
> +			enum kfd_preempt_type type, unsigned int timeout,
> +			uint32_t pipe_id, uint32_t queue_id);
>   #endif /* KFD_MQD_MANAGER_H_ */
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
> index 94c0fc2e57b7..40c0ebb5e7ae 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
> @@ -460,7 +460,7 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,
>   		mqd->free_mqd = free_mqd_hiq_sdma;
>   		mqd->load_mqd = kfd_hiq_load_mqd_kiq;
>   		mqd->update_mqd = update_mqd;
> -		mqd->destroy_mqd = kfd_destroy_mqd_cp;
> +		mqd->destroy_mqd = kfd_destroy_hiq_hqd;
>   		mqd->is_occupied = kfd_is_occupied_cp;
>   		mqd->mqd_size = sizeof(struct v10_compute_mqd);
>   		mqd->mqd_stride = kfd_mqd_stride;
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c
> index 31fec5e70d13..79f245efde5a 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c
> @@ -449,7 +449,7 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE type,
>   		mqd->free_mqd = free_mqd_hiq_sdma;
>   		mqd->load_mqd = kfd_hiq_load_mqd_kiq;
>   		mqd->update_mqd = update_mqd;
> -		mqd->destroy_mqd = kfd_destroy_mqd_cp;
> +		mqd->destroy_mqd = kfd_destroy_hiq_hqd;
>   		mqd->is_occupied = kfd_is_occupied_cp;
>   		mqd->mqd_size = sizeof(struct v11_compute_mqd);
>   #if defined(CONFIG_DEBUG_FS)
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> index 601bb9f68048..7893c53c9372 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
> @@ -553,9 +553,8 @@ static int destroy_hiq_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
>   
>   	for_each_inst(xcc_id, xcc_mask) {
>   		xcc_mqd = mqd + hiq_mqd_size * inst;
> -		err = mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, xcc_mqd,
> -						    type, timeout, pipe_id,
> -						    queue_id, xcc_id);
> +		err = mm->dev->kfd2kgd->hiq_hqd_destroy(mm->dev->adev, xcc_mqd,
> +						    pipe_id, queue_id, xcc_id);
>   		if (err) {
>   			pr_debug("Destroy MQD failed for xcc: %d\n", inst);
>   			break;
> @@ -846,7 +845,7 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
>   		} else {
>   			mqd->init_mqd = init_mqd_hiq;
>   			mqd->load_mqd = kfd_hiq_load_mqd_kiq;
> -			mqd->destroy_mqd = kfd_destroy_mqd_cp;
> +			mqd->destroy_mqd = kfd_destroy_hiq_hqd;
>   		}
>   		break;
>   	case KFD_MQD_TYPE_DIQ:
> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> index d0df3381539f..0f242aad22c7 100644
> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> @@ -268,6 +268,9 @@ struct kfd2kgd_calls {
>   				unsigned int timeout, uint32_t pipe_id,
>   				uint32_t queue_id, uint32_t inst);
>   
> +	int (*hiq_hqd_destroy)(struct amdgpu_device *adev, void *mqd,
> +			uint32_t pipe_id, uint32_t queue_id, uint32_t inst);
> +
>   	bool (*hqd_sdma_is_occupied)(struct amdgpu_device *adev, void *mqd);
>   
>   	int (*hqd_sdma_destroy)(struct amdgpu_device *adev, void *mqd,


More information about the amd-gfx mailing list