Add support of dumping the IP registers for
debugging purposes in devcoredump.

Signed-off-by: Sunil Khatri <[email protected]>
---
 .../gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c  | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
index 1129e5e5fb42..c6eea58d137d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
@@ -261,6 +261,19 @@ amdgpu_devcoredump_read(char *buffer, loff_t offset, 
size_t count,
        drm_printf(&p, "Faulty page starting at address: 0x%016llx\n", 
fault_info->addr);
        drm_printf(&p, "Protection fault status register: 0x%x\n\n", 
fault_info->status);
 
+       /* Add IP dump for each ip */
+       if (coredump->adev->ip_dump != NULL) {
+               struct reg_pair *pair;
+
+               pair = (struct reg_pair *)coredump->adev->ip_dump;
+               drm_printf(&p, "IP register dump\n");
+               drm_printf(&p, "Offset \t Value\n");
+               for (int i = 0; i < coredump->adev->num_regs; i++)
+                       drm_printf(&p, "0x%04x \t 0x%08x\n", pair[i].offset,
+                                  pair[i].value);
+               drm_printf(&p, "\n");
+       }
+
        /* Add ring buffer information */
        drm_printf(&p, "Ring buffer information\n");
        for (int i = 0; i < coredump->adev->num_rings; i++) {
@@ -299,6 +312,11 @@ amdgpu_devcoredump_read(char *buffer, loff_t offset, 
size_t count,
 
 static void amdgpu_devcoredump_free(void *data)
 {
+       struct amdgpu_coredump_info *temp = data;
+
+       kfree(temp->adev->ip_dump);
+       temp->adev->ip_dump = NULL;
+       temp->adev->num_regs = 0;
        kfree(data);
 }
 
@@ -337,6 +355,11 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool 
vram_lost,
 
        coredump->adev = adev;
 
+       /* Trigger ip dump here to capture the value of registers */
+       for (int i = 0; i < adev->num_ip_blocks; i++)
+               if (adev->ip_blocks[i].version->funcs->dump_ip_state)
+                       adev->ip_blocks[i].version->funcs->dump_ip_state((void 
*)adev);
+
        ktime_get_ts64(&coredump->reset_time);
 
        dev_coredumpm(dev->dev, THIS_MODULE, coredump, 0, GFP_NOWAIT,
-- 
2.34.1

Reply via email to