]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpu: host1x: Handle CDMA wraparound when debug printing
authorMikko Perttunen <mperttunen@nvidia.com>
Thu, 25 Apr 2024 05:02:34 +0000 (08:02 +0300)
committerThierry Reding <treding@nvidia.com>
Thu, 29 Aug 2024 18:14:29 +0000 (20:14 +0200)
During channel debug information dump, when printing CDMA
opcodes, the circular nature of the CDMA pushbuffer wasn't being
taken into account, sometimes accessing past the end. Change
the printing to take this into account.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240425050238.2943404-2-cyndis@kapsi.fi
drivers/gpu/host1x/hw/debug_hw.c

index 54e31d81517b07a4de307214a3002fbbb8c8a496..4c32aa1b95e877276845f575e6b26d627b0475f5 100644 (file)
@@ -177,7 +177,16 @@ static void show_gather(struct output *o, dma_addr_t phys_addr,
 
        for (i = 0; i < words; i++) {
                dma_addr_t addr = phys_addr + i * 4;
-               u32 val = *(map_addr + offset / 4 + i);
+               u32 voffset = offset + i * 4;
+               u32 val;
+
+               /* If we reach the RESTART opcode, continue at the beginning of pushbuffer */
+               if (cdma && voffset >= cdma->push_buffer.size) {
+                       addr -= cdma->push_buffer.size;
+                       voffset -= cdma->push_buffer.size;
+               }
+
+               val = *(map_addr + voffset / 4);
 
                if (!data_count) {
                        host1x_debug_output(o, "    %pad: %08x: ", &addr, val);
@@ -203,7 +212,7 @@ static void show_channel_gathers(struct output *o, struct host1x_cdma *cdma)
                                    job->num_slots, job->num_unpins);
 
                show_gather(o, pb->dma + job->first_get, job->num_slots * 2, cdma,
-                           pb->dma + job->first_get, pb->mapped + job->first_get);
+                           pb->dma, pb->mapped);
 
                for (i = 0; i < job->num_cmds; i++) {
                        struct host1x_job_gather *g;
@@ -227,7 +236,7 @@ static void show_channel_gathers(struct output *o, struct host1x_cdma *cdma)
                        host1x_debug_output(o, "  GATHER at %pad+%#x, %d words\n",
                                            &g->base, g->offset, g->words);
 
-                       show_gather(o, g->base + g->offset, g->words, cdma,
+                       show_gather(o, g->base + g->offset, g->words, NULL,
                                    g->base, mapped);
 
                        if (!job->gather_copy_mapped)