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