From 9121e7daaf71d2acf8a10c85e06cd977556bdcbb Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Tue, 8 Sep 2020 10:39:23 +0200 Subject: [PATCH] panfrost: XML-ify the write value job descriptor Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/test/bi_submit.c | 8 +++--- src/panfrost/include/panfrost-job.h | 12 --------- src/panfrost/lib/decode.c | 37 ++++++++++----------------- src/panfrost/lib/midgard.xml | 21 +++++++++++++++ src/panfrost/lib/pan_scoreboard.c | 20 +++++++-------- 5 files changed, 48 insertions(+), 50 deletions(-) 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; }