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.kuehl...@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)),
+               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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to