Ilia Mirkin
2014-Jan-16 06:13 UTC
[Nouveau] [PATCH] drm/nv50/graph: add more trap names to print on error
Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> --- I made the assumption that showing the address is generally useful. Worst case, it won't make sense but still be displayed. Seems simpler than special-casing things. drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 117 ++++++++++++----------- 1 file changed, 63 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index 03de517..3bdb158 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -396,6 +396,63 @@ static const struct nouveau_bitfield nv50_graph_intr_name[] = { {} }; +static const struct nouveau_bitfield nv50_graph_trap_prop[] = { + { 0x00000004, "SURF_WIDTH_OVERRUN" }, + { 0x00000008, "SURF_HEIGHT_OVERRUN" }, + { 0x00000010, "DST2D_FAULT" }, + { 0x00000020, "ZETA_FAULT" }, + { 0x00000040, "RT_FAULT" }, + { 0x00000080, "CUDA_FAULT" }, + { 0x00000100, "DST2D_STORAGE_TYPE_MISMATCH" }, + { 0x00000200, "ZETA_STORAGE_TYPE_MISMATCH" }, + { 0x00000400, "RT_STORAGE_TYPE_MISMATCH" }, + { 0x00000800, "DST2D_LINEAR_MISMATCH" }, + { 0x00001000, "RT_LINEAR_MISMATCH" }, + {} +}; + +static u32 +nv50_priv_prop_trap(struct nv50_graph_priv *priv, + u32 ustatus_addr, u32 ustatus, u32 tp) +{ + u32 e0c = nv_rd32(priv, ustatus_addr + 0x04); + u32 e10 = nv_rd32(priv, ustatus_addr + 0x08); + u32 e14 = nv_rd32(priv, ustatus_addr + 0x0c); + u32 e18 = nv_rd32(priv, ustatus_addr + 0x10); + u32 e1c = nv_rd32(priv, ustatus_addr + 0x14); + u32 e20 = nv_rd32(priv, ustatus_addr + 0x18); + u32 e24 = nv_rd32(priv, ustatus_addr + 0x1c); + int i; + + /* CUDA memory: l[], g[] or stack. */ + if (ustatus & 0x00000080) { + if (e18 & 0x80000000) { + /* g[] read fault? */ + nv_error(priv, "TRAP_PROP - TP %d - CUDA_FAULT - Global read fault at address %02x%08x\n", + tp, e14, e10 | ((e18 >> 24) & 0x1f)); + e18 &= ~0x1f000000; + } else if (e18 & 0xc) { + /* g[] write fault? */ + nv_error(priv, "TRAP_PROP - TP %d - CUDA_FAULT - Global write fault at address %02x%08x\n", + tp, e14, e10 | ((e18 >> 7) & 0x1f)); + e18 &= ~0x00000f80; + } else { + nv_error(priv, "TRAP_PROP - TP %d - Unknown CUDA fault at address %02x%08x\n", + tp, e14, e10); + } + ustatus &= ~0x00000080; + } + for (i = 0; nv50_graph_trap_prop[i].mask && ustatus; i++) { + if (ustatus & nv50_graph_trap_prop[i].mask) + nv_error(priv, "TRAP_PROP - TP %d - %s - Address %02x%08x\n", + tp, nv50_graph_trap_prop[i].name, e14, e10); + ustatus &= ~nv50_graph_trap_prop[i].mask; + } + nv_error(priv, "TRAP_PROP - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", + tp, e0c, e18, e1c, e20, e24); + return ustatus; +} + static void nv50_priv_mp_trap(struct nv50_graph_priv *priv, int tpid, int display) { @@ -469,58 +526,10 @@ nv50_priv_tp_trap(struct nv50_graph_priv *priv, int type, u32 ustatus_old, ustatus &= ~0x04030000; } break; - case 8: /* TPDMA error */ - { - u32 e0c = nv_rd32(priv, ustatus_addr + 4); - u32 e10 = nv_rd32(priv, ustatus_addr + 8); - u32 e14 = nv_rd32(priv, ustatus_addr + 0xc); - u32 e18 = nv_rd32(priv, ustatus_addr + 0x10); - u32 e1c = nv_rd32(priv, ustatus_addr + 0x14); - u32 e20 = nv_rd32(priv, ustatus_addr + 0x18); - u32 e24 = nv_rd32(priv, ustatus_addr + 0x1c); - /* 2d engine destination */ - if (ustatus & 0x00000010) { - if (display) { - nv_error(priv, "TRAP_TPDMA_2D - TP %d - Unknown fault at address %02x%08x\n", - i, e14, e10); - nv_error(priv, "TRAP_TPDMA_2D - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", - i, e0c, e18, e1c, e20, e24); - } - ustatus &= ~0x00000010; - } - /* Render target */ - if (ustatus & 0x00000040) { - if (display) { - nv_error(priv, "TRAP_TPDMA_RT - TP %d - Unknown fault at address %02x%08x\n", - i, e14, e10); - nv_error(priv, "TRAP_TPDMA_RT - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", - i, e0c, e18, e1c, e20, e24); - } - ustatus &= ~0x00000040; - } - /* CUDA memory: l[], g[] or stack. */ - if (ustatus & 0x00000080) { - if (display) { - if (e18 & 0x80000000) { - /* g[] read fault? */ - nv_error(priv, "TRAP_TPDMA - TP %d - Global read fault at address %02x%08x\n", - i, e14, e10 | ((e18 >> 24) & 0x1f)); - e18 &= ~0x1f000000; - } else if (e18 & 0xc) { - /* g[] write fault? */ - nv_error(priv, "TRAP_TPDMA - TP %d - Global write fault at address %02x%08x\n", - i, e14, e10 | ((e18 >> 7) & 0x1f)); - e18 &= ~0x00000f80; - } else { - nv_error(priv, "TRAP_TPDMA - TP %d - Unknown CUDA fault at address %02x%08x\n", - i, e14, e10); - } - nv_error(priv, "TRAP_TPDMA - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", - i, e0c, e18, e1c, e20, e24); - } - ustatus &= ~0x00000080; - } - } + case 8: /* PROP error */ + if (display) + ustatus = nv50_priv_prop_trap( + priv, ustatus_addr, ustatus, i); break; } if (ustatus) { @@ -727,11 +736,11 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display, status &= ~0x080; } - /* TPDMA: Handles TP-initiated uncached memory accesses: + /* PROP: Handles TP-initiated uncached memory accesses: * l[], g[], stack, 2d surfaces, render targets. */ if (status & 0x100) { nv50_priv_tp_trap(priv, 8, 0x408e08, 0x408708, display, - "TRAP_TPDMA"); + "TRAP_PROP"); nv_wr32(priv, 0x400108, 0x100); status &= ~0x100; } -- 1.8.3.2
Ilia Mirkin
2014-Jan-16 07:14 UTC
[Nouveau] [PATCH] drm/nv50/graph: add more trap names to print on error
On Thu, Jan 16, 2014 at 1:13 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> > --- > > I made the assumption that showing the address is generally useful. Worst > case, it won't make sense but still be displayed. Seems simpler than > special-casing things.Erm, I have a better version of this coming that uses nouveau_bitfield_print. Ignore this.> > drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 117 ++++++++++++----------- > 1 file changed, 63 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c > index 03de517..3bdb158 100644 > --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c > +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c > @@ -396,6 +396,63 @@ static const struct nouveau_bitfield nv50_graph_intr_name[] = { > {} > }; > > +static const struct nouveau_bitfield nv50_graph_trap_prop[] = { > + { 0x00000004, "SURF_WIDTH_OVERRUN" }, > + { 0x00000008, "SURF_HEIGHT_OVERRUN" }, > + { 0x00000010, "DST2D_FAULT" }, > + { 0x00000020, "ZETA_FAULT" }, > + { 0x00000040, "RT_FAULT" }, > + { 0x00000080, "CUDA_FAULT" }, > + { 0x00000100, "DST2D_STORAGE_TYPE_MISMATCH" }, > + { 0x00000200, "ZETA_STORAGE_TYPE_MISMATCH" }, > + { 0x00000400, "RT_STORAGE_TYPE_MISMATCH" }, > + { 0x00000800, "DST2D_LINEAR_MISMATCH" }, > + { 0x00001000, "RT_LINEAR_MISMATCH" }, > + {} > +}; > + > +static u32 > +nv50_priv_prop_trap(struct nv50_graph_priv *priv, > + u32 ustatus_addr, u32 ustatus, u32 tp) > +{ > + u32 e0c = nv_rd32(priv, ustatus_addr + 0x04); > + u32 e10 = nv_rd32(priv, ustatus_addr + 0x08); > + u32 e14 = nv_rd32(priv, ustatus_addr + 0x0c); > + u32 e18 = nv_rd32(priv, ustatus_addr + 0x10); > + u32 e1c = nv_rd32(priv, ustatus_addr + 0x14); > + u32 e20 = nv_rd32(priv, ustatus_addr + 0x18); > + u32 e24 = nv_rd32(priv, ustatus_addr + 0x1c); > + int i; > + > + /* CUDA memory: l[], g[] or stack. */ > + if (ustatus & 0x00000080) { > + if (e18 & 0x80000000) { > + /* g[] read fault? */ > + nv_error(priv, "TRAP_PROP - TP %d - CUDA_FAULT - Global read fault at address %02x%08x\n", > + tp, e14, e10 | ((e18 >> 24) & 0x1f)); > + e18 &= ~0x1f000000; > + } else if (e18 & 0xc) { > + /* g[] write fault? */ > + nv_error(priv, "TRAP_PROP - TP %d - CUDA_FAULT - Global write fault at address %02x%08x\n", > + tp, e14, e10 | ((e18 >> 7) & 0x1f)); > + e18 &= ~0x00000f80; > + } else { > + nv_error(priv, "TRAP_PROP - TP %d - Unknown CUDA fault at address %02x%08x\n", > + tp, e14, e10); > + } > + ustatus &= ~0x00000080; > + } > + for (i = 0; nv50_graph_trap_prop[i].mask && ustatus; i++) { > + if (ustatus & nv50_graph_trap_prop[i].mask) > + nv_error(priv, "TRAP_PROP - TP %d - %s - Address %02x%08x\n", > + tp, nv50_graph_trap_prop[i].name, e14, e10); > + ustatus &= ~nv50_graph_trap_prop[i].mask; > + } > + nv_error(priv, "TRAP_PROP - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", > + tp, e0c, e18, e1c, e20, e24); > + return ustatus; > +} > + > static void > nv50_priv_mp_trap(struct nv50_graph_priv *priv, int tpid, int display) > { > @@ -469,58 +526,10 @@ nv50_priv_tp_trap(struct nv50_graph_priv *priv, int type, u32 ustatus_old, > ustatus &= ~0x04030000; > } > break; > - case 8: /* TPDMA error */ > - { > - u32 e0c = nv_rd32(priv, ustatus_addr + 4); > - u32 e10 = nv_rd32(priv, ustatus_addr + 8); > - u32 e14 = nv_rd32(priv, ustatus_addr + 0xc); > - u32 e18 = nv_rd32(priv, ustatus_addr + 0x10); > - u32 e1c = nv_rd32(priv, ustatus_addr + 0x14); > - u32 e20 = nv_rd32(priv, ustatus_addr + 0x18); > - u32 e24 = nv_rd32(priv, ustatus_addr + 0x1c); > - /* 2d engine destination */ > - if (ustatus & 0x00000010) { > - if (display) { > - nv_error(priv, "TRAP_TPDMA_2D - TP %d - Unknown fault at address %02x%08x\n", > - i, e14, e10); > - nv_error(priv, "TRAP_TPDMA_2D - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", > - i, e0c, e18, e1c, e20, e24); > - } > - ustatus &= ~0x00000010; > - } > - /* Render target */ > - if (ustatus & 0x00000040) { > - if (display) { > - nv_error(priv, "TRAP_TPDMA_RT - TP %d - Unknown fault at address %02x%08x\n", > - i, e14, e10); > - nv_error(priv, "TRAP_TPDMA_RT - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", > - i, e0c, e18, e1c, e20, e24); > - } > - ustatus &= ~0x00000040; > - } > - /* CUDA memory: l[], g[] or stack. */ > - if (ustatus & 0x00000080) { > - if (display) { > - if (e18 & 0x80000000) { > - /* g[] read fault? */ > - nv_error(priv, "TRAP_TPDMA - TP %d - Global read fault at address %02x%08x\n", > - i, e14, e10 | ((e18 >> 24) & 0x1f)); > - e18 &= ~0x1f000000; > - } else if (e18 & 0xc) { > - /* g[] write fault? */ > - nv_error(priv, "TRAP_TPDMA - TP %d - Global write fault at address %02x%08x\n", > - i, e14, e10 | ((e18 >> 7) & 0x1f)); > - e18 &= ~0x00000f80; > - } else { > - nv_error(priv, "TRAP_TPDMA - TP %d - Unknown CUDA fault at address %02x%08x\n", > - i, e14, e10); > - } > - nv_error(priv, "TRAP_TPDMA - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", > - i, e0c, e18, e1c, e20, e24); > - } > - ustatus &= ~0x00000080; > - } > - } > + case 8: /* PROP error */ > + if (display) > + ustatus = nv50_priv_prop_trap( > + priv, ustatus_addr, ustatus, i); > break; > } > if (ustatus) { > @@ -727,11 +736,11 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display, > status &= ~0x080; > } > > - /* TPDMA: Handles TP-initiated uncached memory accesses: > + /* PROP: Handles TP-initiated uncached memory accesses: > * l[], g[], stack, 2d surfaces, render targets. */ > if (status & 0x100) { > nv50_priv_tp_trap(priv, 8, 0x408e08, 0x408708, display, > - "TRAP_TPDMA"); > + "TRAP_PROP"); > nv_wr32(priv, 0x400108, 0x100); > status &= ~0x100; > } > -- > 1.8.3.2 >
Ilia Mirkin
2014-Jan-16 07:47 UTC
[Nouveau] [PATCH v2] drm/nv50/graph: add more trap names to print on error
Also avoids printing the errors bitfield if that information has already been shown. Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> --- Here's a sample output: [99995.048486] nouveau E[ PGRAPH][0000:02:00.0] TRAP_PROP - TP 0 - RT_FAULT - Address 0000000000 [99995.048490] nouveau E[ PGRAPH][0000:02:00.0] TRAP_PROP - TP 0 - e0c: 00000000, e18: 00000000, e1c: 00000000, e20: 00001100, e24: 00030000 [99995.048494] nouveau E[ PGRAPH][0000:02:00.0] ch 4 [0x000f94c000 gl-3.2-layered-[26795]] subc 3 class 0x8297 mthd 0x15e0 data 0x00000000 [99995.048506] nouveau E[ PFB][0000:02:00.0] trapped write at 0x0000000000 on channel 0x0000f94c [gl-3.2-layered-[26795]] PGRAPH/PROP/RT0 reason: PT_NOT_PRESENT and [100391.766915] nouveau E[ PGRAPH][0000:02:00.0] DATA_ERROR XY_OUT_OF_BOUNDS [100391.766926] nouveau E[ PGRAPH][0000:02:00.0] ch 4 [0x000f94c000 fbo-depthstenci[30109]] subc 5 class 0x5039 mthd 0x0328 data 0x00000000 A downside of this approach is that it can get split up onto multiple lines if the timing is right, but I think it's worth it to avoid all the duplicate information in the errors. drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 128 +++++++++++++---------- 1 file changed, 70 insertions(+), 58 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index 03de517..a489ac2 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -396,6 +396,60 @@ static const struct nouveau_bitfield nv50_graph_intr_name[] = { {} }; +static const struct nouveau_bitfield nv50_graph_trap_prop[] = { + { 0x00000004, "SURF_WIDTH_OVERRUN" }, + { 0x00000008, "SURF_HEIGHT_OVERRUN" }, + { 0x00000010, "DST2D_FAULT" }, + { 0x00000020, "ZETA_FAULT" }, + { 0x00000040, "RT_FAULT" }, + { 0x00000080, "CUDA_FAULT" }, + { 0x00000100, "DST2D_STORAGE_TYPE_MISMATCH" }, + { 0x00000200, "ZETA_STORAGE_TYPE_MISMATCH" }, + { 0x00000400, "RT_STORAGE_TYPE_MISMATCH" }, + { 0x00000800, "DST2D_LINEAR_MISMATCH" }, + { 0x00001000, "RT_LINEAR_MISMATCH" }, + {} +}; + +static void +nv50_priv_prop_trap(struct nv50_graph_priv *priv, + u32 ustatus_addr, u32 ustatus, u32 tp) +{ + u32 e0c = nv_rd32(priv, ustatus_addr + 0x04); + u32 e10 = nv_rd32(priv, ustatus_addr + 0x08); + u32 e14 = nv_rd32(priv, ustatus_addr + 0x0c); + u32 e18 = nv_rd32(priv, ustatus_addr + 0x10); + u32 e1c = nv_rd32(priv, ustatus_addr + 0x14); + u32 e20 = nv_rd32(priv, ustatus_addr + 0x18); + u32 e24 = nv_rd32(priv, ustatus_addr + 0x1c); + + /* CUDA memory: l[], g[] or stack. */ + if (ustatus & 0x00000080) { + if (e18 & 0x80000000) { + /* g[] read fault? */ + nv_error(priv, "TRAP_PROP - TP %d - CUDA_FAULT - Global read fault at address %02x%08x\n", + tp, e14, e10 | ((e18 >> 24) & 0x1f)); + e18 &= ~0x1f000000; + } else if (e18 & 0xc) { + /* g[] write fault? */ + nv_error(priv, "TRAP_PROP - TP %d - CUDA_FAULT - Global write fault at address %02x%08x\n", + tp, e14, e10 | ((e18 >> 7) & 0x1f)); + e18 &= ~0x00000f80; + } else { + nv_error(priv, "TRAP_PROP - TP %d - Unknown CUDA fault at address %02x%08x\n", + tp, e14, e10); + } + ustatus &= ~0x00000080; + } + if (ustatus) { + nv_error(priv, "TRAP_PROP - TP %d -", tp); + nouveau_bitfield_print(nv50_graph_trap_prop, ustatus); + pr_cont(" - Address %02x%08x\n", e14, e10); + } + nv_error(priv, "TRAP_PROP - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", + tp, e0c, e18, e1c, e20, e24); +} + static void nv50_priv_mp_trap(struct nv50_graph_priv *priv, int tpid, int display) { @@ -469,58 +523,11 @@ nv50_priv_tp_trap(struct nv50_graph_priv *priv, int type, u32 ustatus_old, ustatus &= ~0x04030000; } break; - case 8: /* TPDMA error */ - { - u32 e0c = nv_rd32(priv, ustatus_addr + 4); - u32 e10 = nv_rd32(priv, ustatus_addr + 8); - u32 e14 = nv_rd32(priv, ustatus_addr + 0xc); - u32 e18 = nv_rd32(priv, ustatus_addr + 0x10); - u32 e1c = nv_rd32(priv, ustatus_addr + 0x14); - u32 e20 = nv_rd32(priv, ustatus_addr + 0x18); - u32 e24 = nv_rd32(priv, ustatus_addr + 0x1c); - /* 2d engine destination */ - if (ustatus & 0x00000010) { - if (display) { - nv_error(priv, "TRAP_TPDMA_2D - TP %d - Unknown fault at address %02x%08x\n", - i, e14, e10); - nv_error(priv, "TRAP_TPDMA_2D - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", - i, e0c, e18, e1c, e20, e24); - } - ustatus &= ~0x00000010; - } - /* Render target */ - if (ustatus & 0x00000040) { - if (display) { - nv_error(priv, "TRAP_TPDMA_RT - TP %d - Unknown fault at address %02x%08x\n", - i, e14, e10); - nv_error(priv, "TRAP_TPDMA_RT - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", - i, e0c, e18, e1c, e20, e24); - } - ustatus &= ~0x00000040; - } - /* CUDA memory: l[], g[] or stack. */ - if (ustatus & 0x00000080) { - if (display) { - if (e18 & 0x80000000) { - /* g[] read fault? */ - nv_error(priv, "TRAP_TPDMA - TP %d - Global read fault at address %02x%08x\n", - i, e14, e10 | ((e18 >> 24) & 0x1f)); - e18 &= ~0x1f000000; - } else if (e18 & 0xc) { - /* g[] write fault? */ - nv_error(priv, "TRAP_TPDMA - TP %d - Global write fault at address %02x%08x\n", - i, e14, e10 | ((e18 >> 7) & 0x1f)); - e18 &= ~0x00000f80; - } else { - nv_error(priv, "TRAP_TPDMA - TP %d - Unknown CUDA fault at address %02x%08x\n", - i, e14, e10); - } - nv_error(priv, "TRAP_TPDMA - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n", - i, e0c, e18, e1c, e20, e24); - } - ustatus &= ~0x00000080; - } - } + case 8: /* PROP error */ + if (display) + nv50_priv_prop_trap( + priv, ustatus_addr, ustatus, i); + ustatus = 0; break; } if (ustatus) { @@ -727,11 +734,11 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display, status &= ~0x080; } - /* TPDMA: Handles TP-initiated uncached memory accesses: + /* PROP: Handles TP-initiated uncached memory accesses: * l[], g[], stack, 2d surfaces, render targets. */ if (status & 0x100) { nv50_priv_tp_trap(priv, 8, 0x408e08, 0x408708, display, - "TRAP_TPDMA"); + "TRAP_PROP"); nv_wr32(priv, 0x400108, 0x100); status &= ~0x100; } @@ -760,7 +767,7 @@ nv50_graph_intr(struct nouveau_subdev *subdev) u32 mthd = (addr & 0x00001ffc); u32 data = nv_rd32(priv, 0x400708); u32 class = nv_rd32(priv, 0x400814); - u32 show = stat; + u32 show = stat, show_bitfield = stat; int chid; engctx = nouveau_engctx_get(engine, inst); @@ -778,21 +785,26 @@ nv50_graph_intr(struct nouveau_subdev *subdev) nv_error(priv, "DATA_ERROR "); nouveau_enum_print(nv50_data_error_names, ecode); pr_cont("\n"); + show_bitfield &= ~0x00100000; } if (stat & 0x00200000) { if (!nv50_graph_trap_handler(priv, show, chid, (u64)inst << 12, engctx)) show &= ~0x00200000; + show_bitfield &= ~0x00200000; } nv_wr32(priv, 0x400100, stat); nv_wr32(priv, 0x400500, 0x00010001); if (show) { - nv_error(priv, "%s", ""); - nouveau_bitfield_print(nv50_graph_intr_name, show); - pr_cont("\n"); + show &= show_bitfield; + if (show) { + nv_error(priv, "%s", ""); + nouveau_bitfield_print(nv50_graph_intr_name, show); + pr_cont("\n"); + } nv_error(priv, "ch %d [0x%010llx %s] subc %d class 0x%04x mthd 0x%04x data 0x%08x\n", chid, (u64)inst << 12, nouveau_client_name(engctx), -- 1.8.3.2
Reasonably Related Threads
- [PATCH] drm/nv50/graph: add more trap names to print on error
- [PATCH 1/2] drm/nv50: Make ctxprog wait until interrupt handler is done.
- Fix for vblank on nvc0
- [PATCH 2/2 V2] drm/nv50: Improve PGRAPH interrupt handling.
- [Bug 82835] New: GeForce 8800 GS VDPAU h264 decoding hang