[PATCH 1/1] drm/amdkfd: Add queue status indicator to HQD dump

Kuehling, Felix Felix.Kuehling at amd.com
Tue Jun 25 19:20:53 UTC 2019


On 2019-06-24 9:41 a.m., Zeng, Oak wrote:
> Hi Felix,
>
> See one comment inline
>
> Regards,
> Oak
>
> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Kuehling, Felix
> Sent: Friday, June 21, 2019 3:48 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Kuehling, Felix <Felix.Kuehling at amd.com>
> Subject: [PATCH 1/1] drm/amdkfd: Add queue status indicator to HQD dump
>
> Make it easy to distinguish unmapped, idle and busy queues in the HQD dump.
>
> Also remove CU mask from the HQD dump because these registers are not per-queue, but per pipe.
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>   .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c    | 35 ++++++++++++++--
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 39 +++++++++++++-----  .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 39 +++++++++++++-----  .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 35 ++++++++++++++--  .../drm/amd/amdkfd/kfd_device_queue_manager.c | 40 +++++++++++--------
>   .../gpu/drm/amd/include/kgd_kfd_interface.h   | 15 ++++++-
>   6 files changed, 157 insertions(+), 46 deletions(-)
>
> 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 39ffb078beb4..4882b4112a7a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> @@ -68,12 +68,14 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   			struct mm_struct *mm);
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs);
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status);
>   static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   			     uint32_t __user *wptr, struct mm_struct *mm);  static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs);
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status);
>   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); @@ -454,9 +456,17 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs)
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		hqd_active = (SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE) -
> +			      SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR)),
> [Oak] Is above line a copy-past typo? I don't understand why you can use a active register - a base register.

This is intentional. hqd_active is used as an index into the dump array. 
The array contains only the registers that are relevant for the HQD 
dump. The first register in dump is mmCP_MQD_BASE_ADDR. So the offset of 
any subsequent register can be calculated with "X - mmCP_MQD_BASE_ADDR".

The patch probably doesn't show enough context. You'll see what I mean 
if you read the whole function.

Regards,
   Felix


> +		hqd_pq_rptr = (SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR) -
> +			       SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR)),
> +		hqd_pq_wptr = (SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO) -
> +			       SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR));
>   	uint32_t i = 0, reg;
>   #define HQD_N_REGS 56
>   #define DUMP_REG(addr) do {				\
> @@ -481,6 +491,12 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[hqd_active][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[hqd_pq_rptr][1] == (*dump)[hqd_pq_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> @@ -561,9 +577,14 @@ static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   
>   static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs)
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		rlc_doorbell = mmSDMA0_RLC0_DOORBELL - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_rptr = mmSDMA0_RLC0_RB_RPTR - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_wptr = mmSDMA0_RLC0_RB_WPTR - mmSDMA0_RLC0_RB_CNTL;
>   	uint32_t sdma_base_addr = get_sdma_base_addr(adev, engine_id, queue_id);
>   	uint32_t i = 0, reg;
>   #undef HQD_N_REGS
> @@ -590,6 +611,12 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[rlc_doorbell][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[rlc_rb_rptr][1] == (*dump)[rlc_rb_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> 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 c6abcf72e822..10b0ec8ca852 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -104,12 +104,14 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   			struct mm_struct *mm);
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs);
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status);
>   static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   			     uint32_t __user *wptr, struct mm_struct *mm);  static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs);
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status);
>   static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
>   				uint32_t pipe_id, uint32_t queue_id);
>   
> @@ -373,11 +375,16 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs)
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		hqd_active = mmCP_HQD_ACTIVE - mmCP_MQD_BASE_ADDR,
> +		hqd_pq_rptr = mmCP_HQD_PQ_RPTR - mmCP_MQD_BASE_ADDR,
> +		hqd_pq_wptr = mmCP_HQD_PQ_WPTR - mmCP_MQD_BASE_ADDR;
>   	uint32_t i = 0, reg;
> -#define HQD_N_REGS (35+4)
> +#define HQD_N_REGS 35
>   #define DUMP_REG(addr) do {				\
>   		if (WARN_ON_ONCE(i >= HQD_N_REGS))	\
>   			break;				\
> @@ -391,11 +398,6 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
>   
>   	acquire_queue(kgd, pipe_id, queue_id);
>   
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE0);
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE1);
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE2);
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE3);
> -
>   	for (reg = mmCP_MQD_BASE_ADDR; reg <= mmCP_MQD_CONTROL; reg++)
>   		DUMP_REG(reg);
>   
> @@ -404,6 +406,12 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[hqd_active][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[hqd_pq_rptr][1] == (*dump)[hqd_pq_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> @@ -473,9 +481,14 @@ static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   
>   static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs)
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		rlc_doorbell = mmSDMA0_RLC0_DOORBELL - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_rptr = mmSDMA0_RLC0_RB_RPTR - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_wptr = mmSDMA0_RLC0_RB_WPTR - mmSDMA0_RLC0_RB_CNTL;
>   	uint32_t sdma_offset = engine_id * SDMA1_REGISTER_OFFSET +
>   		queue_id * KFD_CIK_SDMA_QUEUE_OFFSET;
>   	uint32_t i = 0, reg;
> @@ -495,6 +508,12 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[rlc_doorbell][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[rlc_rb_rptr][1] == (*dump)[rlc_rb_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> 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 4e8b4e949926..5d958ba9c524 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -61,12 +61,14 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   			struct mm_struct *mm);
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs);
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status);
>   static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   			     uint32_t __user *wptr, struct mm_struct *mm);  static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs);
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status);
>   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); @@ -358,11 +360,16 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs)
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		hqd_active = mmCP_HQD_ACTIVE - mmCP_MQD_BASE_ADDR,
> +		hqd_pq_rptr = mmCP_HQD_PQ_RPTR - mmCP_MQD_BASE_ADDR,
> +		hqd_pq_wptr = mmCP_HQD_PQ_WPTR - mmCP_MQD_BASE_ADDR;
>   	uint32_t i = 0, reg;
> -#define HQD_N_REGS (54+4)
> +#define HQD_N_REGS 54
>   #define DUMP_REG(addr) do {				\
>   		if (WARN_ON_ONCE(i >= HQD_N_REGS))	\
>   			break;				\
> @@ -376,11 +383,6 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
>   
>   	acquire_queue(kgd, pipe_id, queue_id);
>   
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE0);
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE1);
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE2);
> -	DUMP_REG(mmCOMPUTE_STATIC_THREAD_MGMT_SE3);
> -
>   	for (reg = mmCP_MQD_BASE_ADDR; reg <= mmCP_HQD_EOP_DONES; reg++)
>   		DUMP_REG(reg);
>   
> @@ -389,6 +391,12 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[hqd_active][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[hqd_pq_rptr][1] == (*dump)[hqd_pq_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> @@ -457,9 +465,14 @@ static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   
>   static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs)
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		rlc_doorbell = mmSDMA0_RLC0_DOORBELL - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_rptr = mmSDMA0_RLC0_RB_RPTR - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_wptr = mmSDMA0_RLC0_RB_WPTR - mmSDMA0_RLC0_RB_CNTL;
>   	uint32_t sdma_offset = engine_id * SDMA1_REGISTER_OFFSET +
>   		queue_id * KFD_VI_SDMA_QUEUE_OFFSET;
>   	uint32_t i = 0, reg;
> @@ -488,6 +501,12 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[rlc_doorbell][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[rlc_rb_rptr][1] == (*dump)[rlc_rb_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> 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 d5af41143d12..2e1a37c469c4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> @@ -75,12 +75,14 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   			struct mm_struct *mm);
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs);
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status);
>   static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   			     uint32_t __user *wptr, struct mm_struct *mm);  static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs);
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status);
>   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); @@ -440,9 +442,17 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
>   
>   static int kgd_hqd_dump(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs)
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		hqd_active = (SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE) -
> +			      SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR)),
> +		hqd_pq_rptr = (SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR) -
> +			       SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR)),
> +		hqd_pq_wptr = (SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO) -
> +			       SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR));
>   	uint32_t i = 0, reg;
>   #define HQD_N_REGS 56
>   #define DUMP_REG(addr) do {				\
> @@ -467,6 +477,12 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[hqd_active][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[hqd_pq_rptr][1] == (*dump)[hqd_pq_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> @@ -546,9 +562,14 @@ static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,
>   
>   static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs)
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status)
>   {
>   	struct amdgpu_device *adev = get_amdgpu_device(kgd);
> +	const uint32_t
> +		rlc_doorbell = mmSDMA0_RLC0_DOORBELL - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_rptr = mmSDMA0_RLC0_RB_RPTR - mmSDMA0_RLC0_RB_CNTL,
> +		rlc_rb_wptr = mmSDMA0_RLC0_RB_WPTR - mmSDMA0_RLC0_RB_CNTL;
>   	uint32_t sdma_base_addr = get_sdma_base_addr(adev, engine_id, queue_id);
>   	uint32_t i = 0, reg;
>   #undef HQD_N_REGS
> @@ -572,6 +593,12 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
>   	WARN_ON_ONCE(i != HQD_N_REGS);
>   	*n_regs = i;
>   
> +	if (!(*dump)[rlc_doorbell][1])
> +		*status = KFD_QUEUE_UNMAPPED;
> +	else
> +		*status = (*dump)[rlc_rb_rptr][1] == (*dump)[rlc_rb_wptr][1] ?
> +			KFD_QUEUE_IDLE : KFD_QUEUE_BUSY;
> +
>   	return 0;
>   }
>   
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> index 9ffdda57e7f0..07d3b94c3319 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> @@ -1874,22 +1874,28 @@ static void seq_reg_dump(struct seq_file *m,
>   
>   int dqm_debugfs_hqds(struct seq_file *m, void *data)  {
> +	static const char * const status_string[] = {
> +		[KFD_QUEUE_UNMAPPED] = "unmapped",
> +		[KFD_QUEUE_IDLE] = "idle",
> +		[KFD_QUEUE_BUSY] = "busy"
> +	};
>   	struct device_queue_manager *dqm = data;
>   	uint32_t (*dump)[2], n_regs;
> +	enum kfd_queue_status status;
>   	int pipe, queue;
>   	int r = 0;
>   
> -        r = dqm->dev->kfd2kgd->hqd_dump(dqm->dev->kgd,
> -                KFD_CIK_HIQ_PIPE, KFD_CIK_HIQ_QUEUE, &dump, &n_regs);
> -        if (!r) {
> -                seq_printf(m, "  HIQ on MEC %d Pipe %d Queue %d\n",
> -                                KFD_CIK_HIQ_PIPE/get_pipes_per_mec(dqm)+1,
> -                                KFD_CIK_HIQ_PIPE%get_pipes_per_mec(dqm),
> -                                KFD_CIK_HIQ_QUEUE);
> -                seq_reg_dump(m, dump, n_regs);
> +	r = dqm->dev->kfd2kgd->hqd_dump(dqm->dev->kgd,
> +		KFD_CIK_HIQ_PIPE, KFD_CIK_HIQ_QUEUE, &dump, &n_regs, &status);
> +	if (!r) {
> +		seq_printf(m, "  HIQ on MEC %d Pipe %d Queue %d (%s)\n",
> +				KFD_CIK_HIQ_PIPE/get_pipes_per_mec(dqm)+1,
> +				KFD_CIK_HIQ_PIPE%get_pipes_per_mec(dqm),
> +				KFD_CIK_HIQ_QUEUE, status_string[status]);
> +		seq_reg_dump(m, dump, n_regs);
>   
> -                kfree(dump);
> -        }
> +		kfree(dump);
> +	}
>   
>   	for (pipe = 0; pipe < get_pipes_per_mec(dqm); pipe++) {
>   		int pipe_offset = pipe * get_queues_per_pipe(dqm); @@ -1900,12 +1906,13 @@ int dqm_debugfs_hqds(struct seq_file *m, void *data)
>   				continue;
>   
>   			r = dqm->dev->kfd2kgd->hqd_dump(
> -				dqm->dev->kgd, pipe, queue, &dump, &n_regs);
> +				dqm->dev->kgd, pipe, queue, &dump, &n_regs,
> +				&status);
>   			if (r)
>   				break;
>   
> -			seq_printf(m, "  CP Pipe %d, Queue %d\n",
> -				  pipe, queue);
> +			seq_printf(m, "  CP Pipe %d, Queue %d (%s)\n",
> +				  pipe, queue, status_string[status]);
>   			seq_reg_dump(m, dump, n_regs);
>   
>   			kfree(dump);
> @@ -1917,12 +1924,13 @@ int dqm_debugfs_hqds(struct seq_file *m, void *data)
>   		     queue < dqm->dev->device_info->num_sdma_queues_per_engine;
>   		     queue++) {
>   			r = dqm->dev->kfd2kgd->hqd_sdma_dump(
> -				dqm->dev->kgd, pipe, queue, &dump, &n_regs);
> +				dqm->dev->kgd, pipe, queue, &dump, &n_regs,
> +				&status);
>   			if (r)
>   				break;
>   
> -			seq_printf(m, "  SDMA Engine %d, RLC %d\n",
> -				  pipe, queue);
> +			seq_printf(m, "  SDMA Engine %d, RLC %d (%s)\n",
> +				  pipe, queue, status_string[status]);
>   			seq_reg_dump(m, dump, n_regs);
>   
>   			kfree(dump);
> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> index 98b9533e672b..bc4aca349c4c 100644
> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> @@ -187,6 +187,15 @@ struct tile_config {
>   #define ALLOC_MEM_FLAGS_AQL_QUEUE_MEM	(1 << 27)
>   #define ALLOC_MEM_FLAGS_COHERENT	(1 << 26) /* For GFXv9 or later */
>   
> +/*
> + * Queue status for HQD dump
> + */
> +enum kfd_queue_status {
> +	KFD_QUEUE_UNMAPPED, /* Queue is not mapped */
> +	KFD_QUEUE_IDLE,     /* Queue is enabled but currently idle */
> +	KFD_QUEUE_BUSY      /* Queue is enabled and has work pending */
> +};
> +
>   /**
>    * struct kfd2kgd_calls
>    *
> @@ -261,11 +270,13 @@ struct kfd2kgd_calls {
>   
>   	int (*hqd_dump)(struct kgd_dev *kgd,
>   			uint32_t pipe_id, uint32_t queue_id,
> -			uint32_t (**dump)[2], uint32_t *n_regs);
> +			uint32_t (**dump)[2], uint32_t *n_regs,
> +			enum kfd_queue_status *status);
>   
>   	int (*hqd_sdma_dump)(struct kgd_dev *kgd,
>   			     uint32_t engine_id, uint32_t queue_id,
> -			     uint32_t (**dump)[2], uint32_t *n_regs);
> +			     uint32_t (**dump)[2], uint32_t *n_regs,
> +			     enum kfd_queue_status *status);
>   
>   	bool (*hqd_is_occupied)(struct kgd_dev *kgd, uint64_t queue_address,
>   				uint32_t pipe_id, uint32_t queue_id);
> --
> 2.17.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list