From d0dfc4bd5f3711ac48de88aa51fc6f442eaa0b20 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 28 Sep 2017 13:36:54 -0700 Subject: [PATCH] broadcom/vc5: Fix CLIF dumping of lists that aren't capped by a HALT. The HW will halt when you hit a HALT packet, or when you hit the end address. Tell CLIF if there's an end address is so that it can stop correctly. (There was usually a 0 byte after the CL, so it would stop anyway). --- src/broadcom/clif/clif_dump.c | 27 ++++++++++++++++++++------- src/broadcom/clif/clif_dump.h | 2 +- src/gallium/drivers/vc5/vc5_job.c | 4 ++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/broadcom/clif/clif_dump.c b/src/broadcom/clif/clif_dump.c index 8e9e248c0e4..339fc3835b0 100644 --- a/src/broadcom/clif/clif_dump.c +++ b/src/broadcom/clif/clif_dump.c @@ -245,21 +245,34 @@ clif_process_worklist(struct clif_dump *clif) } void -clif_dump_add_cl(struct clif_dump *clif, uint32_t address) +clif_dump_add_cl(struct clif_dump *clif, uint32_t start, uint32_t end) { uint32_t size; - void *vaddr; - if (!clif->lookup_vaddr(clif->data, address, &vaddr)) { + void *start_vaddr; + if (!clif->lookup_vaddr(clif->data, start, &start_vaddr)) { out(clif, "Failed to look up address 0x%08x\n", - address); + start); return; } - uint8_t *cl = vaddr; - while (clif_dump_packet(clif, address, cl, &size)) { + /* The end address is optional (for example, a BRANCH instruction + * won't set an end), but is used for BCL/RCL termination. + */ + void *end_vaddr = NULL; + if (end && !clif->lookup_vaddr(clif->data, end, &end_vaddr)) { + out(clif, "Failed to look up address 0x%08x\n", + end); + return; + } + + uint8_t *cl = start_vaddr; + while (clif_dump_packet(clif, start, cl, &size)) { cl += size; - address += size; + start += size; + + if (cl == end_vaddr) + break; } out(clif, "\n"); diff --git a/src/broadcom/clif/clif_dump.h b/src/broadcom/clif/clif_dump.h index 1201d83cb45..d46cc84710e 100644 --- a/src/broadcom/clif/clif_dump.h +++ b/src/broadcom/clif/clif_dump.h @@ -37,6 +37,6 @@ struct clif_dump *clif_dump_init(const struct v3d_device_info *devinfo, void *data); void clif_dump_destroy(struct clif_dump *clif); -void clif_dump_add_cl(struct clif_dump *clif, uint32_t offset); +void clif_dump_add_cl(struct clif_dump *clif, uint32_t start, uint32_t end); #endif diff --git a/src/gallium/drivers/vc5/vc5_job.c b/src/gallium/drivers/vc5/vc5_job.c index 57cf96725b9..f90b449aca7 100644 --- a/src/gallium/drivers/vc5/vc5_job.c +++ b/src/gallium/drivers/vc5/vc5_job.c @@ -329,11 +329,11 @@ vc5_clif_dump(struct vc5_context *vc5, struct vc5_job *job) fprintf(stderr, "BCL: 0x%08x..0x%08x\n", job->submit.bcl_start, job->submit.bcl_end); - clif_dump_add_cl(clif, job->submit.bcl_start); + clif_dump_add_cl(clif, job->submit.bcl_start, job->submit.bcl_end); fprintf(stderr, "RCL: 0x%08x..0x%08x\n", job->submit.rcl_start, job->submit.rcl_end); - clif_dump_add_cl(clif, job->submit.rcl_start); + clif_dump_add_cl(clif, job->submit.rcl_start, job->submit.rcl_end); } /** -- 2.30.2