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 <alyssa.rosenzweig@collabora.com>
This commit is contained in:
Alyssa Rosenzweig 2019-08-09 16:04:24 -07:00
parent f5cc5ef404
commit 358372b256
2 changed files with 33 additions and 2 deletions

View File

@ -652,6 +652,21 @@ struct mali_job_descriptor_header {
}; };
} __attribute__((packed)); } __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 { struct mali_payload_set_value {
u64 out; u64 out;
u64 unknown; u64 unknown;

View File

@ -459,6 +459,22 @@ pandecode_mfbd_block_format(enum mali_mfbd_block_format fmt)
} }
#undef DEFINE_CASE #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 /* Midgard's tiler descriptor is embedded within the
* larger FBD */ * 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); pandecode_prop("job_descriptor_size = %d", h->job_descriptor_size);
if (h->exception_status != 0x1) 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,
(h->exception_status >> 16) & 0xFFFF, (h->exception_status >> 16) & 0xFFFF,
(h->exception_status >> 8) & 0x3, pandecode_exception_access((h->exception_status >> 8) & 0x3),
h->exception_status & 0xFF); h->exception_status & 0xFF);
if (h->first_incomplete_task) if (h->first_incomplete_task)