drm/v3d: client ranges from axi_ids are different with V3D 7.1
authorJose Maria Casanova Crespo <jmcasanova@igalia.com>
Fri, 25 Apr 2025 12:25:08 +0000 (14:25 +0200)
committerMaíra Canal <mcanal@igalia.com>
Sun, 27 Apr 2025 17:39:48 +0000 (14:39 -0300)
The client mask has been reduced from 8 bits on V3D 4.1 to 7 bits
on V3D 7.1, so the ranges for each client are not compatible.

On V3D 7.1, the CSD client can also report MMU errors.
Therefore, add its AXI ID to the IDs list.

Fixes: 0ad5bc1ce463 ("drm/v3d: fix up register addresses for V3D 7.x")
Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
Reviewed-by: Maíra Canal <mcanal@igalia.com>
Link: https://lore.kernel.org/r/20250425122522.18425-2-jmcasanova@igalia.com
Signed-off-by: Maíra Canal <mcanal@igalia.com>
drivers/gpu/drm/v3d/v3d_irq.c

index d6ce1324905df9d5eb104d03cab50622f65e6131..2cca5d3a26a22cf03d2c4e9ae0688ab57e0eedcd 100644 (file)
@@ -199,12 +199,33 @@ v3d_hub_irq(int irq, void *arg)
                        {0xA0, 0xA1, "TFU"},
                        {0xC0, 0xE0, "MMU"},
                        {0xE0, 0xE1, "GMP"},
+               }, v3d71_axi_ids[] = {
+                       {0x00, 0x30, "L2T"},
+                       {0x30, 0x38, "CLE"},
+                       {0x38, 0x39, "PTB"},
+                       {0x39, 0x3A, "PSE"},
+                       {0x3A, 0x3B, "CSD"},
+                       {0x40, 0x60, "TLB"},
+                       {0x60, 0x70, "MMU"},
+                       {0x7C, 0x7E, "TFU"},
+                       {0x7F, 0x80, "GMP"},
                };
                const char *client = "?";
 
                V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL));
 
-               if (v3d->ver >= V3D_GEN_41) {
+               if (v3d->ver >= V3D_GEN_71) {
+                       size_t i;
+
+                       axi_id = axi_id & 0x7F;
+                       for (i = 0; i < ARRAY_SIZE(v3d71_axi_ids); i++) {
+                               if (axi_id >= v3d71_axi_ids[i].begin &&
+                                   axi_id < v3d71_axi_ids[i].end) {
+                                       client = v3d71_axi_ids[i].client;
+                                       break;
+                               }
+                       }
+               } else if (v3d->ver >= V3D_GEN_41) {
                        size_t i;
 
                        axi_id = axi_id & 0xFF;