diff --git a/src/panfrost/bifrost/test/bi_submit.c b/src/panfrost/bifrost/test/bi_submit.c
index d131427de24..b0a33c092e1 100644
--- a/src/panfrost/bifrost/test/bi_submit.c
+++ b/src/panfrost/bifrost/test/bi_submit.c
@@ -108,9 +108,11 @@ bit_sanity_check(struct panfrost_device *dev)
struct panfrost_bo *scratch = bit_bo_create(dev, 65536);
((uint32_t *) scratch->cpu)[0] = 0xAA;
- struct mali_payload_write_value payload = {
- .address = scratch->gpu,
- .value_descriptor = MALI_WRITE_VALUE_ZERO
+ struct mali_write_value_job_payload_packed payload;
+
+ pan_pack(&payload, WRITE_VALUE_JOB_PAYLOAD, cfg) {
+ cfg.address = scratch->gpu;
+ cfg.type = MALI_WRITE_VALUE_TYPE_ZERO;
};
struct panfrost_bo *bos[] = { scratch };
diff --git a/src/panfrost/include/panfrost-job.h b/src/panfrost/include/panfrost-job.h
index 27bd04df981..a0021508107 100644
--- a/src/panfrost/include/panfrost-job.h
+++ b/src/panfrost/include/panfrost-job.h
@@ -238,18 +238,6 @@ struct bifrost_blend_rt {
};
} __attribute__((packed));
-/* Details about write_value from panfrost igt tests which use it as a generic
- * dword write primitive */
-
-#define MALI_WRITE_VALUE_ZERO 3
-
-struct mali_payload_write_value {
- u64 address;
- u32 value_descriptor;
- u32 reserved;
- u64 immediate;
-} __attribute__((packed));
-
/*
* Mali Attributes
*
diff --git a/src/panfrost/lib/decode.c b/src/panfrost/lib/decode.c
index ca6f0441eaa..c36c4a95a75 100644
--- a/src/panfrost/lib/decode.c
+++ b/src/panfrost/lib/decode.c
@@ -1490,6 +1490,16 @@ pandecode_fragment_job(const struct pandecode_mapped_memory *mem,
return sizeof(*s);
}
+static void
+pandecode_write_value_job(const struct pandecode_mapped_memory *mem,
+ mali_ptr job, int job_no)
+{
+ struct mali_write_value_job_packed *PANDECODE_PTR_VAR(p, mem, job);
+ pan_section_unpack(p, WRITE_VALUE_JOB, PAYLOAD, u);
+ DUMP_SECTION(WRITE_VALUE_JOB, PAYLOAD, p, "Write Value Payload:\n");
+ pandecode_log("\n");
+}
+
/* Entrypoint to start tracing. jc_gpu_va is the GPU address for the first job
* in the chain; later jobs are found by walking the chain. Bifrost is, well,
* if it's bifrost or not. GPU ID is the more finegrained ID (at some point, we
@@ -1510,13 +1520,11 @@ pandecode_jc(mali_ptr jc_gpu_va, bool bifrost, unsigned gpu_id, bool minimal)
do {
struct pandecode_mapped_memory *mem =
pandecode_find_mapped_gpu_mem_containing(jc_gpu_va);
- void *payload;
-
pan_unpack(PANDECODE_PTR(mem, jc_gpu_va, struct mali_job_header_packed),
JOB_HEADER, h);
next_job = h.next;
mali_ptr payload_ptr = jc_gpu_va + MALI_JOB_HEADER_LENGTH;
- payload = pandecode_fetch_gpu_mem(mem, payload_ptr, 64);
+ pandecode_fetch_gpu_mem(mem, payload_ptr, 64);
int job_no = job_descriptor_number++;
@@ -1528,28 +1536,9 @@ pandecode_jc(mali_ptr jc_gpu_va, bool bifrost, unsigned gpu_id, bool minimal)
pandecode_log("\n");
switch (h.type) {
- case MALI_JOB_TYPE_WRITE_VALUE: {
- struct mali_payload_write_value *s = payload;
- pandecode_log("struct mali_payload_write_value payload_%"PRIx64"_%d = {\n", payload_ptr, job_no);
- pandecode_indent++;
- MEMORY_PROP(s, address);
-
- if (s->value_descriptor != MALI_WRITE_VALUE_ZERO) {
- pandecode_msg("XXX: unknown value descriptor\n");
- pandecode_prop("value_descriptor = 0x%" PRIX32, s->value_descriptor);
- }
-
- if (s->reserved) {
- pandecode_msg("XXX: set value tripped\n");
- pandecode_prop("reserved = 0x%" PRIX32, s->reserved);
- }
-
- pandecode_prop("immediate = 0x%" PRIX64, s->immediate);
- pandecode_indent--;
- pandecode_log("};\n");
-
+ case MALI_JOB_TYPE_WRITE_VALUE:
+ pandecode_write_value_job(mem, jc_gpu_va, job_no);
break;
- }
case MALI_JOB_TYPE_TILER:
case MALI_JOB_TYPE_VERTEX:
diff --git a/src/panfrost/lib/midgard.xml b/src/panfrost/lib/midgard.xml
index 6f90e2867d5..7154b859a42 100644
--- a/src/panfrost/lib/midgard.xml
+++ b/src/panfrost/lib/midgard.xml
@@ -1059,4 +1059,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/panfrost/lib/pan_scoreboard.c b/src/panfrost/lib/pan_scoreboard.c
index 6d564c957c8..22f3eaae9f4 100644
--- a/src/panfrost/lib/pan_scoreboard.c
+++ b/src/panfrost/lib/pan_scoreboard.c
@@ -189,23 +189,21 @@ panfrost_scoreboard_initialize_tiler(struct pan_pool *pool,
/* Okay, we do. Let's generate it. We'll need the job's polygon list
* regardless of size. */
- struct mali_payload_write_value payload = {
- .address = polygon_list,
- .value_descriptor = MALI_WRITE_VALUE_ZERO,
- };
-
struct panfrost_transfer transfer =
panfrost_pool_alloc_aligned(pool,
- MALI_JOB_HEADER_LENGTH + sizeof(payload),
+ MALI_WRITE_VALUE_JOB_LENGTH,
64);
- pan_pack(transfer.cpu, JOB_HEADER, job) {
- job.type = MALI_JOB_TYPE_WRITE_VALUE;
- job.index = scoreboard->write_value_index;
- job.next = scoreboard->first_job;
+ pan_section_pack(transfer.cpu, WRITE_VALUE_JOB, HEADER, header) {
+ header.type = MALI_JOB_TYPE_WRITE_VALUE;
+ header.index = scoreboard->write_value_index;
+ header.next = scoreboard->first_job;
}
- memcpy(transfer.cpu + MALI_JOB_HEADER_LENGTH, &payload, sizeof(payload));
+ pan_section_pack(transfer.cpu, WRITE_VALUE_JOB, PAYLOAD, payload) {
+ payload.address = polygon_list;
+ payload.type = MALI_WRITE_VALUE_TYPE_ZERO;
+ }
scoreboard->first_job = transfer.gpu;
}