From 35f27c3e574d67e5260b7d58c4e10436050b7a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ADra=20Canal?= Date: Tue, 20 Jan 2026 08:09:22 -0300 Subject: [PATCH] drm/v3d: Add module parameter to enable MMU error logging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MMU error messages are useful to help developers quickly identify issues in userspace graphics drivers, but always printing them can swamp the kernel log. Add a module parameter, ``debug_mmu``, to gate MMU error logging. Logging is disabled by default and can be enabled when needed with ``v3d.debug_mmu=1``. Signed-off-by: MaĆ­ra Canal --- drivers/gpu/drm/v3d/v3d_drv.c | 4 ++++ drivers/gpu/drm/v3d/v3d_drv.h | 1 + drivers/gpu/drm/v3d/v3d_irq.c | 24 +++++++++++++----------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c index a856d246dbdfcb..1dfbad4e3b4228 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -47,6 +47,10 @@ module_param_named(super_pages, super_pages, bool, 0400); MODULE_PARM_DESC(super_pages, "Enable/Disable Super Pages support."); #endif +bool debug_mmu; +module_param(debug_mmu, bool, 0644); +MODULE_PARM_DESC(debug_mmu, "Enable/Disable MMU error logging"); + static int v3d_get_param_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h index 2a6efba3226d2e..fb2eaeac472260 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -589,6 +589,7 @@ int v3d_submit_cpu_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); /* v3d_irq.c */ +extern bool debug_mmu; int v3d_irq_init(struct v3d_dev *v3d); void v3d_irq_enable(struct v3d_dev *v3d); void v3d_irq_disable(struct v3d_dev *v3d); diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c index c0100c48c29acc..0c4ac2d656e5e4 100644 --- a/drivers/gpu/drm/v3d/v3d_irq.c +++ b/drivers/gpu/drm/v3d/v3d_irq.c @@ -183,7 +183,7 @@ v3d_hub_irq(int irq, void *arg) "GMP", }; const char *client = "?"; - static int logged_error; + static bool logged_error; V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL)); @@ -193,16 +193,18 @@ v3d_hub_irq(int irq, void *arg) client = v3d41_axi_ids[axi_id]; } - if (!logged_error) - dev_err(v3d->drm.dev, "MMU error from client %s (%d) at 0x%llx%s%s%s\n", - client, axi_id, (long long)vio_addr, - ((intsts & V3D_HUB_INT_MMU_WRV) ? - ", write violation" : ""), - ((intsts & V3D_HUB_INT_MMU_PTI) ? - ", pte invalid" : ""), - ((intsts & V3D_HUB_INT_MMU_CAP) ? - ", cap exceeded" : "")); - logged_error = 1; + if (!logged_error || debug_mmu) { + dev_err(v3d->drm.dev, "MMU error from client %s (%d) at 0x%llx%s%s%s\n", + client, axi_id, (long long)vio_addr, + ((intsts & V3D_HUB_INT_MMU_WRV) ? + ", write violation" : ""), + ((intsts & V3D_HUB_INT_MMU_PTI) ? + ", pte invalid" : ""), + ((intsts & V3D_HUB_INT_MMU_CAP) ? + ", cap exceeded" : "")); + } + logged_error = true; + status = IRQ_HANDLED; }