[PATCH 3/3] drm/amdgpu: Clear active for HIQ in RLC_CP_SCHEDULERS

Felix Kuehling felix.kuehling at amd.com
Tue Jul 18 22:16:56 UTC 2017


Hi Shaoyun,

You'd need to squash these 3 patches into 1 because otherwise you break
the build.

But I think there should be a way to do this without requiring an
interface change. In kgd_hqd_load you could remember the pipe_id and
queue_id of the HIQ somewhere in adev. Then you can use that to detect
when the HIQ is destroyed later without looking at the MQD.

Regards,
  Felix

On 17-07-18 05:42 PM, Shaoyun Liu wrote:
> Change-Id: Ibc3ae5ac852405b77908bc26f899fe97bde88d86
> Signed-off-by: Shaoyun Liu <Shaoyun.Liu at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c |  4 ++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 15 +++++++++++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 16 ++++++++++++++--
>  3 files changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> index fc3cd2b..13a595c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -123,7 +123,7 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>  static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
>  		uint32_t pipe_id, uint32_t queue_id);
>  static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
> -static int kgd_hqd_destroy(struct kgd_dev *kgd,
> +static int kgd_hqd_destroy(struct kgd_dev *kgd,void *mqd,
>  				enum kfd_preempt_type reset_type,
>  				unsigned int utimeout, uint32_t pipe_id,
>  				uint32_t queue_id);
> @@ -586,7 +586,7 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
>  	return false;
>  }
>  
> -static int kgd_hqd_destroy(struct kgd_dev *kgd,
> +static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd,
>  				enum kfd_preempt_type reset_type,
>  				unsigned int utimeout, uint32_t pipe_id,
>  				uint32_t queue_id)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> index ea08ce7..5fa2f8e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -95,7 +95,7 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>  static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
>  		uint32_t pipe_id, uint32_t queue_id);
>  static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
> -static int kgd_hqd_destroy(struct kgd_dev *kgd,
> +static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd,
>  				enum kfd_preempt_type reset_type,
>  				unsigned int utimeout, uint32_t pipe_id,
>  				uint32_t queue_id);
> @@ -609,7 +609,7 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
>  	return false;
>  }
>  
> -static int kgd_hqd_destroy(struct kgd_dev *kgd,
> +static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd,
>  				enum kfd_preempt_type reset_type,
>  				unsigned int utimeout, uint32_t pipe_id,
>  				uint32_t queue_id)
> @@ -619,9 +619,20 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd,
>  	enum hqd_dequeue_request_type type;
>  	unsigned long flags, end_jiffies;
>  	int retry;
> +	struct vi_mqd *m;
> +
> +	m = get_mqd(mqd);
>  
>  	acquire_queue(kgd, pipe_id, queue_id);
>  
> +	if (m->cp_hqd_vmid == 0) {
> +		uint32_t value;
> +
> +		value = RREG32(mmRLC_CP_SCHEDULERS);
> +		value = REG_SET_FIELD(value, RLC_CP_SCHEDULERS, scheduler1, 0);
> +		WREG32(mmRLC_CP_SCHEDULERS, value);
> +	}
> +
>  	switch (reset_type) {
>  	case KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN:
>  		type = DRAIN_PIPE;
> 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 280ccf5..d47cdff 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> @@ -132,7 +132,7 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>  static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
>  		uint32_t pipe_id, uint32_t queue_id);
>  static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
> -static int kgd_hqd_destroy(struct kgd_dev *kgd,
> +static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd,
>  				enum kfd_preempt_type reset_type,
>  				unsigned int utimeout, uint32_t pipe_id,
>  				uint32_t queue_id);
> @@ -746,7 +746,7 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
>  	return false;
>  }
>  
> -static int kgd_hqd_destroy(struct kgd_dev *kgd,
> +static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd,
>  				enum kfd_preempt_type reset_type,
>  				unsigned int utimeout, uint32_t pipe_id,
>  				uint32_t queue_id)
> @@ -754,14 +754,26 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd,
>  	struct amdgpu_device *adev = get_amdgpu_device(kgd);
>  	enum hqd_dequeue_request_type type;
>  	unsigned long end_jiffies;
> +	struct v9_mqd *m;
>  	uint32_t temp;
> +
>  #if 0
>  	unsigned long flags;
>  	int retry;
>  #endif
> +	m = get_mqd(mqd);
>  
>  	acquire_queue(kgd, pipe_id, queue_id);
>  
> +	if (m->cp_hqd_vmid == 0) {
> +		uint32_t value;
> +
> +		value = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CP_SCHEDULERS));
> +		value = REG_SET_FIELD(value, RLC_CP_SCHEDULERS, scheduler1, 0);
> +		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CP_SCHEDULERS), value);
> +	}
> +
> +
>  	switch (reset_type) {
>  	case KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN:
>  		type = DRAIN_PIPE;



More information about the amd-gfx mailing list