Capture interesting MMU_AS_CONTROL regs for devcoredump.

Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
 drivers/gpu/drm/panthor/panthor_coredump.c | 33 ++++++++++++++++++++++
 drivers/gpu/drm/panthor/panthor_coredump.h | 11 ++++++++
 drivers/gpu/drm/panthor/panthor_sched.c    |  5 ++++
 drivers/gpu/drm/panthor/panthor_sched.h    |  2 ++
 4 files changed, 51 insertions(+)

diff --git a/drivers/gpu/drm/panthor/panthor_coredump.c 
b/drivers/gpu/drm/panthor/panthor_coredump.c
index 60d651a8468a..acc8ad4cc498 100644
--- a/drivers/gpu/drm/panthor/panthor_coredump.c
+++ b/drivers/gpu/drm/panthor/panthor_coredump.c
@@ -14,6 +14,7 @@
 #include "panthor_coredump.h"
 #include "panthor_device.h"
 #include "panthor_fw.h"
+#include "panthor_mmu.h"
 #include "panthor_regs.h"
 #include "panthor_sched.h"
 
@@ -26,6 +27,7 @@ enum panthor_coredump_mask {
        PANTHOR_COREDUMP_GLB = BIT(2),
        PANTHOR_COREDUMP_CSG = BIT(3),
        PANTHOR_COREDUMP_CS = BIT(4),
+       PANTHOR_COREDUMP_AS = BIT(5),
 };
 
 /**
@@ -57,6 +59,7 @@ struct panthor_coredump {
        struct panthor_coredump_glb_state glb;
        struct panthor_coredump_csg_state csg;
        struct panthor_coredump_cs_state cs[MAX_CS_PER_CSG];
+       struct panthor_coredump_as_state as;
 
        /* @data: Serialized coredump data. */
        void *data;
@@ -89,6 +92,15 @@ static const char *reason_str(enum panthor_coredump_reason 
reason)
        }
 }
 
+static void print_as(struct drm_printer *p,
+                    const struct panthor_coredump_as_state *as, u32 as_id)
+{
+       drm_printf(p, "as%d:\n", as_id);
+       drm_printf(p, "  FAULTSTATUS: 0x%x\n", as->faultstatus);
+       drm_printf(p, "  FAULTADDRESS: 0x%llx\n", as->faultaddress);
+       drm_printf(p, "  FAULTEXTRA: 0x%llx\n", as->faultextra);
+}
+
 static void print_cs(struct drm_printer *p,
                     const struct panthor_coredump_cs_state *cs, u32 cs_id)
 {
@@ -259,6 +271,12 @@ static void print_cd(struct drm_printer *p, const struct 
panthor_coredump *cd)
                for (u32 i = 0; i < cd->group.queue_count; i++)
                        print_cs(p, &cd->cs[i], i);
        }
+
+       if (cd->mask & PANTHOR_COREDUMP_AS) {
+               const u32 as_id = cd->csg.config & 0xf;
+
+               print_as(p, &cd->as, as_id);
+       }
 }
 
 static void process_cd(struct panthor_device *ptdev,
@@ -285,6 +303,14 @@ static void process_cd(struct panthor_device *ptdev,
        print_cd(&p, cd);
 }
 
+static void capture_as(struct panthor_device *ptdev,
+                      struct panthor_coredump_as_state *as, u32 as_id)
+{
+       as->faultstatus = gpu_read(ptdev, AS_FAULTSTATUS(as_id));
+       as->faultaddress = gpu_read64(ptdev, AS_FAULTADDRESS(as_id));
+       as->faultextra = gpu_read64(ptdev, AS_FAULTEXTRA(as_id));
+}
+
 static void capture_cs(struct panthor_device *ptdev,
                       struct panthor_coredump_cs_state *cs, u32 csg_id,
                       u32 cs_id, const struct panthor_group *group)
@@ -374,6 +400,8 @@ static void capture_gpu(struct panthor_device *ptdev,
 static void capture_cd(struct panthor_device *ptdev,
                       struct panthor_coredump *cd, struct panthor_group *group)
 {
+       struct panthor_vm *vm;
+
        drm_info(&ptdev->base, "capturing coredump states\n");
 
        if (group) {
@@ -401,6 +429,11 @@ static void capture_cd(struct panthor_device *ptdev,
        for (u32 i = 0; i < cd->group.queue_count; i++)
                capture_cs(ptdev, &cd->cs[i], cd->group.csg_id, i, group);
        cd->mask |= PANTHOR_COREDUMP_CS;
+
+       vm = panthor_group_vm(group);
+
+       capture_as(ptdev, &cd->as, panthor_vm_as(vm));
+       cd->mask |= PANTHOR_COREDUMP_AS;
 }
 
 static void panthor_coredump_free(void *data)
diff --git a/drivers/gpu/drm/panthor/panthor_coredump.h 
b/drivers/gpu/drm/panthor/panthor_coredump.h
index 44402c6142cb..8aceb0c7d0d4 100644
--- a/drivers/gpu/drm/panthor/panthor_coredump.h
+++ b/drivers/gpu/drm/panthor/panthor_coredump.h
@@ -124,6 +124,17 @@ struct panthor_coredump_cs_state {
        u32 active;
 };
 
+/**
+ * struct panthor_coredump_as_state - Coredump AS state
+ *
+ * Interesting MMU_AS_CONTROL regs.
+ */
+struct panthor_coredump_as_state {
+       u32 faultstatus;
+       u64 faultaddress;
+       u64 faultextra;
+};
+
 #ifdef CONFIG_DEV_COREDUMP
 
 struct panthor_coredump *
diff --git a/drivers/gpu/drm/panthor/panthor_sched.c 
b/drivers/gpu/drm/panthor/panthor_sched.c
index 4bc31c5f667d..82e43b7ca7aa 100644
--- a/drivers/gpu/drm/panthor/panthor_sched.c
+++ b/drivers/gpu/drm/panthor/panthor_sched.c
@@ -3726,6 +3726,11 @@ void panthor_group_get_ringbuf_iface(
        *output_iface = queue->iface.output;
 }
 
+struct panthor_vm *panthor_group_vm(struct panthor_group *group)
+{
+       return group->vm;
+}
+
 int panthor_group_pool_create(struct panthor_file *pfile)
 {
        struct panthor_group_pool *gpool;
diff --git a/drivers/gpu/drm/panthor/panthor_sched.h 
b/drivers/gpu/drm/panthor/panthor_sched.h
index 284ba39f958a..0cb58212fd44 100644
--- a/drivers/gpu/drm/panthor/panthor_sched.h
+++ b/drivers/gpu/drm/panthor/panthor_sched.h
@@ -38,6 +38,8 @@ void panthor_group_get_ringbuf_iface(
        const struct panthor_fw_ringbuf_input_iface **input_iface,
        const struct panthor_fw_ringbuf_output_iface **output_iface);
 
+struct panthor_vm *panthor_group_vm(struct panthor_group *group);
+
 struct drm_sched_job *
 panthor_job_create(struct panthor_file *pfile,
                   u16 group_handle,
-- 
2.50.0.727.gbf7dc18ff4-goog

Reply via email to