Message ID | 20250409155504.1093400-2-jmcasanova@igalia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] drm/v3d: fix client obtained from axi_ids on V3D 4.1 | expand |
Hi Chema, On 09/04/25 12:55, Jose Maria Casanova Crespo wrote: > The client that causes an MMU error is expected to be reported. > But in the case of MMU TFU errors, a non existing client "In the case of MMU errors caused by the TFU unit, [...]" > was being reported. This happened because because the client There are two "because" in the sentence. Could you add an example of the a MMU error with a non-existing client in the commit message? > calculation was taking into account more than the bits 0-7 > from the axi_id that were representing the client. > > This patch masks the proper bits to do the calculation and > limits the returned clients to the expected axi_id ranges that > V3D 4.1 and 4.2 use. > > Fixes: 38c2c7917adc ("drm/v3d: Fix and extend MMU error handling.") > Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com> > --- > drivers/gpu/drm/v3d/v3d_irq.c | 33 +++++++++++++++++++++------------ > 1 file changed, 21 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c > index 29f63f572d35..1810743ea7b8 100644 > --- a/drivers/gpu/drm/v3d/v3d_irq.c > +++ b/drivers/gpu/drm/v3d/v3d_irq.c > @@ -186,24 +186,33 @@ v3d_hub_irq(int irq, void *arg) > u32 axi_id = V3D_READ(V3D_MMU_VIO_ID); > u64 vio_addr = ((u64)V3D_READ(V3D_MMU_VIO_ADDR) << > (v3d->va_width - 32)); > - static const char *const v3d41_axi_ids[] = { > - "L2T", > - "PTB", > - "PSE", > - "TLB", > - "CLE", > - "TFU", > - "MMU", > - "GMP", > + static const struct { > + u32 begin; > + u32 end; > + const char *client; > + } v3d41_axi_ids[] = { > + {0x00, 0x20, "L2T"}, > + {0x20, 0x21, "PTB"}, > + {0x40, 0x41, "PSE"}, > + {0x60, 0x80, "TLB"}, > + {0x80, 0x88, "CLE"}, > + {0xA0, 0xA1, "TFU"}, > + {0xC0, 0xE0, "MMU"}, > + {0xE0, 0xE1, "GMP"}, > }; > const char *client = "?"; > > V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL)); > > if (v3d->ver >= V3D_GEN_41) { > - axi_id = axi_id >> 5; > - if (axi_id < ARRAY_SIZE(v3d41_axi_ids)) > - client = v3d41_axi_ids[axi_id]; > + axi_id = axi_id & 0xFF; > + for (size_t i = 0; i < ARRAY_SIZE(v3d41_axi_ids); i++) { > + if (axi_id >= v3d41_axi_ids[i].begin && > + axi_id < v3d41_axi_ids[i].end) { > + client = v3d41_axi_ids[i].client; > + break; > + } > + } > } > > dev_err(v3d->drm.dev, "MMU error from client %s (%d) at 0x%llx%s%s%s\n", As we are declaring `begin` and `end` as hexadecimal numbers in the code, could we display AXI ID as a hexadecimal as well? Just to ease future debugging. You would need to change "(%d)". Please, don't forget to mention this change in the commit message of v2. Thanks for your patch! Best Regards, - Maíra
diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c index 29f63f572d35..1810743ea7b8 100644 --- a/drivers/gpu/drm/v3d/v3d_irq.c +++ b/drivers/gpu/drm/v3d/v3d_irq.c @@ -186,24 +186,33 @@ v3d_hub_irq(int irq, void *arg) u32 axi_id = V3D_READ(V3D_MMU_VIO_ID); u64 vio_addr = ((u64)V3D_READ(V3D_MMU_VIO_ADDR) << (v3d->va_width - 32)); - static const char *const v3d41_axi_ids[] = { - "L2T", - "PTB", - "PSE", - "TLB", - "CLE", - "TFU", - "MMU", - "GMP", + static const struct { + u32 begin; + u32 end; + const char *client; + } v3d41_axi_ids[] = { + {0x00, 0x20, "L2T"}, + {0x20, 0x21, "PTB"}, + {0x40, 0x41, "PSE"}, + {0x60, 0x80, "TLB"}, + {0x80, 0x88, "CLE"}, + {0xA0, 0xA1, "TFU"}, + {0xC0, 0xE0, "MMU"}, + {0xE0, 0xE1, "GMP"}, }; const char *client = "?"; V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL)); if (v3d->ver >= V3D_GEN_41) { - axi_id = axi_id >> 5; - if (axi_id < ARRAY_SIZE(v3d41_axi_ids)) - client = v3d41_axi_ids[axi_id]; + axi_id = axi_id & 0xFF; + for (size_t i = 0; i < ARRAY_SIZE(v3d41_axi_ids); i++) { + if (axi_id >= v3d41_axi_ids[i].begin && + axi_id < v3d41_axi_ids[i].end) { + client = v3d41_axi_ids[i].client; + break; + } + } } dev_err(v3d->drm.dev, "MMU error from client %s (%d) at 0x%llx%s%s%s\n",
The client that causes an MMU error is expected to be reported. But in the case of MMU TFU errors, a non existing client was being reported. This happened because because the client calculation was taking into account more than the bits 0-7 from the axi_id that were representing the client. This patch masks the proper bits to do the calculation and limits the returned clients to the expected axi_id ranges that V3D 4.1 and 4.2 use. Fixes: 38c2c7917adc ("drm/v3d: Fix and extend MMU error handling.") Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com> --- drivers/gpu/drm/v3d/v3d_irq.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-)