};
} __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;
}
#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 */
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)