Marcin Slusarz
2012-Aug-19 20:59 UTC
[Nouveau] [PATCH 03/10] drm/nouveau: guard nv_error && printk pairs with nv_printk_enabled
With CONFIG_NOUVEAU_DEBUG set to 0 or subdev debug flags set to 0 code paths which use nv_error and printk would print awkwardly formatted data. Guard those code paths with nv_printk_enabled. Additionally, fix reporting levels of: nv20_graph_intr, nv40_graph_intr and nv50_graph_intr. Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com> --- drivers/gpu/drm/nouveau/core/engine/copy/nva3.c | 4 +++- drivers/gpu/drm/nouveau/core/engine/copy/nvc0.c | 4 +++- drivers/gpu/drm/nouveau/core/engine/crypt/nv84.c | 2 +- drivers/gpu/drm/nouveau/core/engine/crypt/nv98.c | 4 +++- drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c | 5 ++++- drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c | 5 ++++- drivers/gpu/drm/nouveau/core/engine/graph/nv04.c | 2 +- drivers/gpu/drm/nouveau/core/engine/graph/nv10.c | 2 +- drivers/gpu/drm/nouveau/core/engine/graph/nv20.c | 6 +++--- drivers/gpu/drm/nouveau/core/engine/graph/nv40.c | 4 ++-- drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 21 ++++++++++++--------- drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c | 4 +++- drivers/gpu/drm/nouveau/core/engine/graph/nve0.c | 4 +++- drivers/gpu/drm/nouveau/core/subdev/fb/nv50.c | 2 +- drivers/gpu/drm/nouveau/core/subdev/mxm/mxms.c | 2 +- 15 files changed, 45 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/copy/nva3.c b/drivers/gpu/drm/nouveau/core/engine/copy/nva3.c index c43c334..fd4ea19 100644 --- a/drivers/gpu/drm/nouveau/core/engine/copy/nva3.c +++ b/drivers/gpu/drm/nouveau/core/engine/copy/nva3.c @@ -120,11 +120,13 @@ nva3_copy_intr(struct nouveau_subdev *subdev) engctx = nouveau_engctx_get(engine, inst); chid = pfifo->chid(pfifo, engctx); - if (stat & 0x00000040) { + if ((stat & 0x00000040) && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "DISPATCH_ERROR ["); nouveau_enum_print(nva3_copy_isr_error_name, ssta); printk("] ch %d [0x%010llx] subc %d mthd 0x%04x data 0x%08x\n", chid, inst << 12, subc, mthd, data); + } + if (stat & 0x00000040) { nv_wr32(priv, 0x104004, 0x00000040); stat &= ~0x00000040; } diff --git a/drivers/gpu/drm/nouveau/core/engine/copy/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/copy/nvc0.c index 3071e2c..6835d7d 100644 --- a/drivers/gpu/drm/nouveau/core/engine/copy/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/engine/copy/nvc0.c @@ -133,11 +133,13 @@ nvc0_copy_intr(struct nouveau_subdev *subdev) engctx = nouveau_engctx_get(engine, inst); chid = pfifo->chid(pfifo, engctx); - if (stat & 0x00000040) { + if ((stat & 0x00000040) && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "DISPATCH_ERROR ["); nouveau_enum_print(nvc0_copy_isr_error_name, ssta); printk("] ch %d [0x%010llx] subc %d mthd 0x%04x data 0x%08x\n", chid, (u64)inst << 12, subc, mthd, data); + } + if (stat & 0x00000040) { nv_wr32(priv, 0x104004 + (idx * 0x1000), 0x00000040); stat &= ~0x00000040; } diff --git a/drivers/gpu/drm/nouveau/core/engine/crypt/nv84.c b/drivers/gpu/drm/nouveau/core/engine/crypt/nv84.c index 198989b..67622aa 100644 --- a/drivers/gpu/drm/nouveau/core/engine/crypt/nv84.c +++ b/drivers/gpu/drm/nouveau/core/engine/crypt/nv84.c @@ -147,7 +147,7 @@ nv84_crypt_intr(struct nouveau_subdev *subdev) engctx = nouveau_engctx_get(engine, inst); chid = pfifo->chid(pfifo, engctx); - if (stat) { + if (stat && nv_printk_enabled(priv, ERROR)) { nv_error(priv, ""); nouveau_bitfield_print(nv84_crypt_intr_mask, stat); printk(" ch %d [0x%010llx] mthd 0x%04x data 0x%08x\n", diff --git a/drivers/gpu/drm/nouveau/core/engine/crypt/nv98.c b/drivers/gpu/drm/nouveau/core/engine/crypt/nv98.c index 835b8eb..9a589d3 100644 --- a/drivers/gpu/drm/nouveau/core/engine/crypt/nv98.c +++ b/drivers/gpu/drm/nouveau/core/engine/crypt/nv98.c @@ -120,11 +120,13 @@ nv98_crypt_intr(struct nouveau_subdev *subdev) engctx = nouveau_engctx_get(engine, inst); chid = pfifo->chid(pfifo, engctx); - if (stat & 0x00000040) { + if ((stat & 0x00000040) && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "DISPATCH_ERROR ["); nouveau_enum_print(nv98_crypt_isr_error_name, ssta); printk("] ch %d [0x%010llx] subc %d mthd 0x%04x data 0x%08x\n", chid, (u64)inst << 12, subc, mthd, data); + } + if (stat & 0x00000040) { nv_wr32(priv, 0x087004, 0x00000040); stat &= ~0x00000040; } diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c index 42276d9..31f5a96 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c @@ -395,6 +395,9 @@ nvc0_fifo_isr_vm_fault(struct nvc0_fifo_priv *priv, int unit) u32 stat = nv_rd32(priv, 0x280c + (unit * 0x10)); u32 client = (stat & 0x00001f00) >> 8; + if (!nv_printk_enabled(priv, ERROR)) + return; + nv_error(priv, "%s fault at 0x%010llx [", (stat & 0x00000080) ? "write" : "read", (u64)vahi << 32 | valo); nouveau_enum_print(nvc0_fifo_fault_reason, stat & 0x0000000f); @@ -459,7 +462,7 @@ nvc0_fifo_isr_subfifo_intr(struct nvc0_fifo_priv *priv, int unit) show &= ~0x00800000; } - if (show) { + if (show && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "SUBFIFO%d:", unit); nouveau_bitfield_print(nvc0_fifo_subfifo_intr, show); printk("\n"); diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c index 945038c..b2612b0 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c @@ -408,6 +408,9 @@ nve0_fifo_isr_vm_fault(struct nve0_fifo_priv *priv, int unit) u32 stat = nv_rd32(priv, 0x280c + (unit * 0x10)); u32 client = (stat & 0x00001f00) >> 8; + if (!nv_printk_enabled(priv, ERROR)) + return; + nv_error(priv, "PFIFO: %s fault at 0x%010llx [", (stat & 0x00000080) ? "write" : "read", (u64)vahi << 32 | valo); nouveau_enum_print(nve0_fifo_fault_reason, stat & 0x0000000f); @@ -472,7 +475,7 @@ nve0_fifo_isr_subfifo_intr(struct nve0_fifo_priv *priv, int unit) show &= ~0x00800000; } - if (show) { + if (show && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "SUBFIFO%d:", unit); nouveau_bitfield_print(nve0_fifo_subfifo_intr, show); printk("\n"); diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv04.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv04.c index e5b0189..267ac60 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv04.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv04.c @@ -1296,7 +1296,7 @@ nv04_graph_intr(struct nouveau_subdev *subdev) nv_wr32(priv, NV03_PGRAPH_INTR, stat); nv_wr32(priv, NV04_PGRAPH_FIFO, 0x00000001); - if (show) { + if (show && nv_printk_enabled(priv, ERROR)) { nv_error(priv, ""); nouveau_bitfield_print(nv04_graph_intr_name, show); printk(" nsource:"); diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv10.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv10.c index ce38196..35c4d71 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv10.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv10.c @@ -1192,7 +1192,7 @@ nv10_graph_intr(struct nouveau_subdev *subdev) nv_wr32(priv, NV03_PGRAPH_INTR, stat); nv_wr32(priv, NV04_PGRAPH_FIFO, 0x00000001); - if (show) { + if (show && nv_printk_enabled(priv, ERROR)) { nv_error(priv, ""); nouveau_bitfield_print(nv10_graph_intr_name, show); printk(" nsource:"); diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv20.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv20.c index 8f3f619..9e756e1 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv20.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv20.c @@ -223,15 +223,15 @@ nv20_graph_intr(struct nouveau_subdev *subdev) nv_wr32(priv, NV03_PGRAPH_INTR, stat); nv_wr32(priv, NV04_PGRAPH_FIFO, 0x00000001); - if (show) { - nv_info(priv, ""); + if (show && nv_printk_enabled(priv, ERROR)) { + nv_error(priv, ""); nouveau_bitfield_print(nv10_graph_intr_name, show); printk(" nsource:"); nouveau_bitfield_print(nv04_graph_nsource, nsource); printk(" nstatus:"); nouveau_bitfield_print(nv10_graph_nstatus, nstatus); printk("\n"); - nv_info(priv, "ch %d/%d class 0x%04x mthd 0x%04x data 0x%08x\n", + nv_error(priv, "ch %d/%d class 0x%04x mthd 0x%04x data 0x%08x\n", chid, subc, class, mthd, data); } diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c index 5690fe3..7817f53 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c @@ -292,8 +292,8 @@ nv40_graph_intr(struct nouveau_subdev *subdev) nv_wr32(priv, NV03_PGRAPH_INTR, stat); nv_wr32(priv, NV04_PGRAPH_FIFO, 0x00000001); - if (show) { - nv_info(priv, ""); + if (show && nv_printk_enabled(priv, ERROR)) { + nv_error(priv, ""); nouveau_bitfield_print(nv10_graph_intr_name, show); printk(" nsource:"); nouveau_bitfield_print(nv04_graph_nsource, nsource); diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index f60aec9..6859514 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -274,7 +274,7 @@ nv84_graph_tlb_flush(struct nouveau_engine *engine) } while (!idle && !(timeout = ptimer->read(ptimer) - start > 2000000000)); - if (timeout) { + if (timeout && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "PGRAPH TLB flush idle timeout fail\n"); nv_error(priv, "PGRAPH_STATUS: "); @@ -417,6 +417,8 @@ nv50_priv_mp_trap(struct nv50_graph_priv *priv, int tpid, int display) pc = nv_rd32(priv, addr + 0x24); oplow = nv_rd32(priv, addr + 0x70); ophigh = nv_rd32(priv, addr + 0x74); + } + if (display && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "TRAP_MP_EXEC - " "TP %d MP %d: ", tpid, i); nouveau_enum_print(nv50_mp_exec_error_names, status); @@ -622,7 +624,7 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display, /* M2MF: Memory to memory copy engine. */ if (status & 0x002) { u32 ustatus = nv_rd32(priv, 0x406800) & 0x7fffffff; - if (display) { + if (display && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "TRAP_M2MF"); nouveau_bitfield_print(nv50_graph_trap_m2mf, ustatus); printk("\n"); @@ -643,7 +645,7 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display, /* VFETCH: Fetches data from vertex buffers. */ if (status & 0x004) { u32 ustatus = nv_rd32(priv, 0x400c04) & 0x7fffffff; - if (display) { + if (display && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "TRAP_VFETCH"); nouveau_bitfield_print(nv50_graph_trap_vfetch, ustatus); printk("\n"); @@ -660,7 +662,7 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display, /* STRMOUT: DirectX streamout / OpenGL transform feedback. */ if (status & 0x008) { ustatus = nv_rd32(priv, 0x401800) & 0x7fffffff; - if (display) { + if (display && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "TRAP_STRMOUT"); nouveau_bitfield_print(nv50_graph_trap_strmout, ustatus); printk("\n"); @@ -681,7 +683,7 @@ nv50_graph_trap_handler(struct nv50_graph_priv *priv, u32 display, /* CCACHE: Handles code and c[] caches and fills them. */ if (status & 0x010) { ustatus = nv_rd32(priv, 0x405018) & 0x7fffffff; - if (display) { + if (display && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "TRAP_CCACHE"); nouveau_bitfield_print(nv50_graph_trap_ccache, ustatus); printk("\n"); @@ -772,7 +774,7 @@ nv50_graph_intr(struct nouveau_subdev *subdev) nouveau_handle_put(handle); } - if (show & 0x00100000) { + if ((show & 0x00100000) && nv_printk_enabled(priv, ERROR)) { u32 ecode = nv_rd32(priv, 0x400110); nv_error(priv, "DATA_ERROR "); nouveau_enum_print(nv50_data_error_names, ecode); @@ -787,15 +789,16 @@ nv50_graph_intr(struct nouveau_subdev *subdev) nv_wr32(priv, 0x400100, stat); nv_wr32(priv, 0x400500, 0x00010001); - if (show) { - nv_info(priv, ""); + if (show && nv_printk_enabled(priv, ERROR)) { + nv_error(priv, ""); nouveau_bitfield_print(nv50_graph_intr_name, show); printk("\n"); nv_error(priv, "ch %d [0x%010llx] subc %d class 0x%04x " "mthd 0x%04x data 0x%08x\n", chid, (u64)inst << 12, subc, class, mthd, data); - nv50_fb_trap(nouveau_fb(priv), 1); } + if (show) + nv50_fb_trap(nouveau_fb(priv), 1); if (nv_rd32(priv, 0x400824) & (1 << 31)) nv_wr32(priv, 0x400824, nv_rd32(priv, 0x400824) & ~(1 << 31)); diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c index 80c263b..1cdd608 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c @@ -265,12 +265,14 @@ nvc0_graph_intr(struct nouveau_subdev *subdev) stat &= ~0x00000020; } - if (stat & 0x00100000) { + if ((stat & 0x00100000) && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "DATA_ERROR ["); nouveau_enum_print(nv50_data_error_names, code); printk("] ch %d [0x%010llx] subc %d class 0x%04x " "mthd 0x%04x data 0x%08x\n", chid, inst << 12, subc, class, mthd, data); + } + if (stat & 0x00100000) { nv_wr32(priv, 0x400100, 0x00100000); stat &= ~0x00100000; } diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c b/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c index 2ba125b..ea58e10 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c @@ -161,12 +161,14 @@ nve0_graph_intr(struct nouveau_subdev *subdev) stat &= ~0x00000020; } - if (stat & 0x00100000) { + if ((stat & 0x00100000) && nv_printk_enabled(priv, ERROR)) { nv_error(priv, "DATA_ERROR ["); nouveau_enum_print(nv50_data_error_names, code); printk("] ch %d [0x%010llx] subc %d class 0x%04x " "mthd 0x%04x data 0x%08x\n", chid, inst, subc, class, mthd, data); + } + if (stat & 0x00100000) { nv_wr32(priv, 0x400100, 0x00100000); stat &= ~0x00100000; } diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/nv50.c b/drivers/gpu/drm/nouveau/core/subdev/fb/nv50.c index eaf18fb..a36d190 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/nv50.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/nv50.c @@ -447,7 +447,7 @@ nv50_fb_trap(struct nouveau_fb *pfb, int display) } nv_wr32(priv, 0x100c90, idx | 0x80000000); - if (!display) + if (!display || !nv_printk_enabled(priv, ERROR)) return; /* decode status bits into something more useful */ diff --git a/drivers/gpu/drm/nouveau/core/subdev/mxm/mxms.c b/drivers/gpu/drm/nouveau/core/subdev/mxm/mxms.c index 839ca1e..8cecafe 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mxm/mxms.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mxm/mxms.c @@ -146,7 +146,7 @@ mxms_foreach(struct nouveau_mxm *mxm, u8 types, return false; } - if (nv_subdev(mxm)->debug >= NV_DBG_DEBUG && (exec == NULL)) { + if ((exec == NULL) && nv_printk_enabled(mxm, DEBUG)) { static const char * mxms_desc_name[] = { "ODS", "SCCS", "TS", "IPS", "GSD", "VSS", "BCS", "FCS", -- 1.7.8.6