From 358372b256622569e292449238aa573051b7ab81 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 9 Aug 2019 16:04:24 -0700 Subject: [PATCH] pan/decode: Decode invalid access type upon fault We don't have a good way to confirm this, but it parallels the kernel definitons for MMU faults nicely. Signed-off-by: Alyssa Rosenzweig --- src/panfrost/include/panfrost-job.h | 15 +++++++++++++++ src/panfrost/pandecode/decode.c | 20 ++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/panfrost/include/panfrost-job.h b/src/panfrost/include/panfrost-job.h index 51e9e78b8bd..77b9bc9c7af 100644 --- a/src/panfrost/include/panfrost-job.h +++ b/src/panfrost/include/panfrost-job.h @@ -652,6 +652,21 @@ struct mali_job_descriptor_header { }; } __attribute__((packed)); +/* These concern exception_status */ + +/* Access type causing a fault, paralleling AS_FAULTSTATUS_* entries in the + * kernel */ + +enum mali_exception_access { + /* Atomic in the kernel for MMU, but that doesn't make sense for a job + * fault so it's just unused */ + MALI_EXCEPTION_ACCESS_NONE = 0, + + MALI_EXCEPTION_ACCESS_EXECUTE = 1, + MALI_EXCEPTION_ACCESS_READ = 2, + MALI_EXCEPTION_ACCESS_WRITE = 3 +}; + struct mali_payload_set_value { u64 out; u64 unknown; diff --git a/src/panfrost/pandecode/decode.c b/src/panfrost/pandecode/decode.c index 71eb2e972e2..861000133c1 100644 --- a/src/panfrost/pandecode/decode.c +++ b/src/panfrost/pandecode/decode.c @@ -459,6 +459,22 @@ pandecode_mfbd_block_format(enum mali_mfbd_block_format fmt) } #undef DEFINE_CASE +#define DEFINE_CASE(name) case MALI_EXCEPTION_ACCESS_## name: return ""#name +static char * +pandecode_exception_access(enum mali_exception_access fmt) +{ + switch (fmt) { + DEFINE_CASE(NONE); + DEFINE_CASE(EXECUTE); + DEFINE_CASE(READ); + DEFINE_CASE(WRITE); + + default: + unreachable("Invalid case"); + } +} +#undef DEFINE_CASE + /* Midgard's tiler descriptor is embedded within the * larger FBD */ @@ -2333,10 +2349,10 @@ pandecode_jc(mali_ptr jc_gpu_va, bool bifrost) pandecode_prop("job_descriptor_size = %d", h->job_descriptor_size); if (h->exception_status != 0x1) - pandecode_prop("exception_status = %x (source ID: 0x%x access: 0x%x exception: 0x%x)", + pandecode_prop("exception_status = %x (source ID: 0x%x access: %s exception: 0x%x)", h->exception_status, (h->exception_status >> 16) & 0xFFFF, - (h->exception_status >> 8) & 0x3, + pandecode_exception_access((h->exception_status >> 8) & 0x3), h->exception_status & 0xFF); if (h->first_incomplete_task) -- 2.30.2