Re: [Nouveau] [PATCH 01/10] drm/nv50: decode PGRAPH status registers on TLB flush fail
On Thu, Oct 04, 2012 at 01:43:15PM +0200, Marcin Slusarz wrote: On Thu, Sep 13, 2012 at 12:47:53AM +0200, Marcin Slusarz wrote: On Tue, Aug 21, 2012 at 12:08:32AM +0200, Marcin Slusarz wrote: On Mon, Aug 20, 2012 at 07:02:46PM +0200, Marcin Slusarz wrote: On Mon, Aug 20, 2012 at 04:27:18PM +1000, Ben Skeggs wrote: On Sun, Aug 19, 2012 at 10:59:56PM +0200, Marcin Slusarz wrote: Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_0: CCACHE (0x00145b4d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_1: (0x002d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_2: ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 I didn't push these first few patches yet as I have a couple of thoughts on it. Mostly I was thinking we should probably have a: nv_printf(obj, lvl, fmt, args...) to replace the printk's which just does a continued print while still obeying the debug level? Well, this patch does not use nv_printk_enabled, so these concerns should not apply to it, right? I'll fix up bitfield list and resend it. New version, which prints VSTATUS regs on one line. PS: I pushed this and some other patches to my github repo. ( https://github.com/mslusarz/linux ) --- From: Marcin Slusarz marcin.slus...@gmail.com Subject: [PATCH 01/11] drm/nv50: decode PGRAPH status registers on TLB flush fail Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS: CCACHE (0x00145b4d) (0x002d) ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 Based on envytools docs. Signed-off-by: Marcin Slusarz marcin.slus...@gmail.com --- drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 75 ++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index ab3b9dc..5f1adca 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -184,6 +184,62 @@ nv50_graph_tlb_flush(struct nouveau_engine *engine) return 0; } +static const struct nouveau_bitfield nv50_pgraph_status[] = { + { 0x0001, BUSY }, /* set when any bit is set */ + { 0x0002, DISPATCH }, + { 0x0004, UNK2 }, + { 0x0008, UNK3 }, + { 0x0010, UNK4 }, + { 0x0020, UNK5 }, + { 0x0040, M2MF }, + { 0x0080, UNK7 }, + { 0x0100, CTXPROG }, + { 0x0200, VFETCH }, + { 0x0400, CCACHE_UNK4 }, + { 0x0800, STRMOUT_GSCHED_UNK5 }, + { 0x1000, UNK14XX }, + { 0x2000, UNK24XX_CSCHED }, + { 0x4000, UNK1CXX }, + { 0x8000, CLIPID }, + { 0x0001, ZCULL }, + { 0x0002, ENG2D }, + { 0x0004, UNK34XX }, + { 0x0008, TPRAST }, + { 0x0010, TPROP }, + { 0x0020, TEX }, + { 0x0040, TPVP }, + { 0x0080, MP }, + { 0x0100, ROP }, + {} +}; + +static const char *const nv50_pgraph_vstatus_0[] = { + VFETCH, CCACHE, UNK4, UNK5, GSCHED, STRMOUT, UNK14XX, NULL +}; + +static const char *const nv50_pgraph_vstatus_1[] = { + TPRAST, TPROP, TEXTURE, TPVP, MP, NULL +}; + +static const char *const nv50_pgraph_vstatus_2[] = { + UNK24XX, CSCHED, UNK1CXX, CLIPID, ZCULL, ENG2D, UNK34XX, + ROP, NULL +}; + +static void nouveau_pgraph_vstatus_print(const char *const units[], u32 status) +{ + int i; + u32 tmp = status; + for (i = 0; units[i] tmp; i++) { + if ((tmp 7) == 1) + pr_cont(%s , units[i]); + tmp = 3; + } + if (tmp) + pr_cont(invalid: %x , tmp); + pr_cont((0x%08x) , status); +} + static int nv84_graph_tlb_flush(struct nouveau_engine *engine) { @@ -219,10 +275,21 @@ nv84_graph_tlb_flush(struct nouveau_engine *engine) !(timeout = ptimer-read(ptimer) - start 20)); if (timeout) { - nv_error(priv, PGRAPH TLB flush idle timeout fail: - 0x%08x 0x%08x 0x%08x 0x%08x\n, -
Re: [Nouveau] [PATCH 01/10] drm/nv50: decode PGRAPH status registers on TLB flush fail
On Tue, Aug 21, 2012 at 12:08:32AM +0200, Marcin Slusarz wrote: On Mon, Aug 20, 2012 at 07:02:46PM +0200, Marcin Slusarz wrote: On Mon, Aug 20, 2012 at 04:27:18PM +1000, Ben Skeggs wrote: On Sun, Aug 19, 2012 at 10:59:56PM +0200, Marcin Slusarz wrote: Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_0: CCACHE (0x00145b4d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_1: (0x002d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_2: ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 I didn't push these first few patches yet as I have a couple of thoughts on it. Mostly I was thinking we should probably have a: nv_printf(obj, lvl, fmt, args...) to replace the printk's which just does a continued print while still obeying the debug level? Well, this patch does not use nv_printk_enabled, so these concerns should not apply to it, right? I'll fix up bitfield list and resend it. New version, which prints VSTATUS regs on one line. PS: I pushed this and some other patches to my github repo. ( https://github.com/mslusarz/linux ) --- From: Marcin Slusarz marcin.slus...@gmail.com Subject: [PATCH 01/11] drm/nv50: decode PGRAPH status registers on TLB flush fail Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS: CCACHE (0x00145b4d) (0x002d) ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 Based on envytools docs. Signed-off-by: Marcin Slusarz marcin.slus...@gmail.com --- drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 75 ++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index ab3b9dc..5f1adca 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -184,6 +184,62 @@ nv50_graph_tlb_flush(struct nouveau_engine *engine) return 0; } +static const struct nouveau_bitfield nv50_pgraph_status[] = { + { 0x0001, BUSY }, /* set when any bit is set */ + { 0x0002, DISPATCH }, + { 0x0004, UNK2 }, + { 0x0008, UNK3 }, + { 0x0010, UNK4 }, + { 0x0020, UNK5 }, + { 0x0040, M2MF }, + { 0x0080, UNK7 }, + { 0x0100, CTXPROG }, + { 0x0200, VFETCH }, + { 0x0400, CCACHE_UNK4 }, + { 0x0800, STRMOUT_GSCHED_UNK5 }, + { 0x1000, UNK14XX }, + { 0x2000, UNK24XX_CSCHED }, + { 0x4000, UNK1CXX }, + { 0x8000, CLIPID }, + { 0x0001, ZCULL }, + { 0x0002, ENG2D }, + { 0x0004, UNK34XX }, + { 0x0008, TPRAST }, + { 0x0010, TPROP }, + { 0x0020, TEX }, + { 0x0040, TPVP }, + { 0x0080, MP }, + { 0x0100, ROP }, + {} +}; + +static const char *const nv50_pgraph_vstatus_0[] = { + VFETCH, CCACHE, UNK4, UNK5, GSCHED, STRMOUT, UNK14XX, NULL +}; + +static const char *const nv50_pgraph_vstatus_1[] = { + TPRAST, TPROP, TEXTURE, TPVP, MP, NULL +}; + +static const char *const nv50_pgraph_vstatus_2[] = { + UNK24XX, CSCHED, UNK1CXX, CLIPID, ZCULL, ENG2D, UNK34XX, + ROP, NULL +}; + +static void nouveau_pgraph_vstatus_print(const char *const units[], u32 status) +{ + int i; + u32 tmp = status; + for (i = 0; units[i] tmp; i++) { + if ((tmp 7) == 1) + pr_cont(%s , units[i]); + tmp = 3; + } + if (tmp) + pr_cont(invalid: %x , tmp); + pr_cont((0x%08x) , status); +} + static int nv84_graph_tlb_flush(struct nouveau_engine *engine) { @@ -219,10 +275,21 @@ nv84_graph_tlb_flush(struct nouveau_engine *engine) !(timeout = ptimer-read(ptimer) - start 20)); if (timeout) { - nv_error(priv, PGRAPH TLB flush idle timeout fail: - 0x%08x 0x%08x 0x%08x 0x%08x\n, -nv_rd32(priv, 0x400700), nv_rd32(priv, 0x400380), -nv_rd32(priv, 0x400384), nv_rd32(priv, 0x400388)); + nv_error(priv, PGRAPH TLB flush idle timeout fail\n); + + nv_error(priv,
Re: [Nouveau] [PATCH 01/10] drm/nv50: decode PGRAPH status registers on TLB flush fail
On Sun, Aug 19, 2012 at 10:59:56PM +0200, Marcin Slusarz wrote: Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_0: CCACHE (0x00145b4d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_1: (0x002d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_2: ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 I didn't push these first few patches yet as I have a couple of thoughts on it. Mostly I was thinking we should probably have a: nv_printf(obj, lvl, fmt, args...) to replace the printk's which just does a continued print while still obeying the debug level? Based on envytools docs. Signed-off-by: Marcin Slusarz marcin.slus...@gmail.com --- drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 78 - 1 files changed, 74 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index c93b525..f60aec9 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -184,6 +184,62 @@ nv50_graph_tlb_flush(struct nouveau_engine *engine) return 0; } +static struct nouveau_bitfield nv50_pgraph_status[] = { + { 10, BUSY }, /* set when any bit is set */ + { 11, DISPATCH }, + { 12, UNK2 }, + { 13, UNK3 }, + { 14, UNK4 }, + { 15, UNK5 }, + { 16, M2MF }, + { 17, UNK7 }, + { 18, CTXPROG }, + { 19, VFETCH }, + { 110, CCACHE_UNK4 }, + { 111, STRMOUT_GSCHED_UNK5 }, + { 112, UNK14XX }, + { 113, UNK24XX_CSCHED }, + { 114, UNK1CXX }, + { 115, CLIPID }, + { 116, ZCULL }, + { 117, ENG2D }, + { 118, UNK34XX }, + { 119, TPRAST }, + { 120, TPROP }, + { 121, TEX }, + { 122, TPVP }, + { 123, MP }, + { 124, ROP }, + {} +}; hex bitfields please :) + +static const char *const nv50_pgraph_vstatus_0[] = { + VFETCH, CCACHE, UNK4, UNK5, GSCHED, STRMOUT, UNK14XX, NULL +}; + +static const char *const nv50_pgraph_vstatus_1[] = { + TPRAST, TPROP, TEXTURE, TPVP, MP, NULL +}; + +static const char *const nv50_pgraph_vstatus_2[] = { + UNK24XX, CSCHED, UNK1CXX, CLIPID, ZCULL, ENG2D, UNK34XX, + ROP, NULL +}; + +static void nouveau_pgraph_vstatus_print(const char *const units[], u32 status) +{ + int i; + u32 tmp = status; + for (i = 0; units[i] tmp; i++) { + if ((tmp 7) == 1) + pr_cont(%s , units[i]); + tmp = 3; + } + if (tmp) + pr_cont(invalid: %x , tmp); + pr_cont((0x%08x)\n, status); +} + static int nv84_graph_tlb_flush(struct nouveau_engine *engine) { @@ -219,10 +275,24 @@ nv84_graph_tlb_flush(struct nouveau_engine *engine) !(timeout = ptimer-read(ptimer) - start 20)); if (timeout) { - nv_error(priv, PGRAPH TLB flush idle timeout fail: - 0x%08x 0x%08x 0x%08x 0x%08x\n, - nv_rd32(priv, 0x400700), nv_rd32(priv, 0x400380), - nv_rd32(priv, 0x400384), nv_rd32(priv, 0x400388)); + nv_error(priv, PGRAPH TLB flush idle timeout fail\n); + + nv_error(priv, PGRAPH_STATUS: ); + tmp = nv_rd32(priv, 0x400700); + nouveau_bitfield_print(nv50_pgraph_status, tmp); + pr_cont( (0x%08x)\n, tmp); + + nv_error(priv, PGRAPH_VSTATUS_0: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_0, + nv_rd32(priv, 0x400380)); + + nv_error(priv, PGRAPH_VSTATUS_1: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_1, + nv_rd32(priv, 0x400384)); + + nv_error(priv, PGRAPH_VSTATUS_2: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_2, + nv_rd32(priv, 0x400388)); } nv50_vm_flush_engine(engine-base, 0x00); -- 1.7.8.6 ___ Nouveau mailing list Nouveau@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/nouveau ___ Nouveau mailing list Nouveau@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/nouveau
Re: [Nouveau] [PATCH 01/10] drm/nv50: decode PGRAPH status registers on TLB flush fail
On Mon, Aug 20, 2012 at 04:27:18PM +1000, Ben Skeggs wrote: On Sun, Aug 19, 2012 at 10:59:56PM +0200, Marcin Slusarz wrote: Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_0: CCACHE (0x00145b4d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_1: (0x002d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_2: ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 I didn't push these first few patches yet as I have a couple of thoughts on it. Mostly I was thinking we should probably have a: nv_printf(obj, lvl, fmt, args...) to replace the printk's which just does a continued print while still obeying the debug level? Well, this patch does not use nv_printk_enabled, so these concerns should not apply to it, right? I'll fix up bitfield list and resend it. Speaking of nv_printf, I have a couple of problems with it: - it would repeatedly recheck whether to print something or not - it would always evaluate its arguments - nouveau_enum_print / nouveau_bitfield_print would need object/level arguments - you still would need nv_printk_enabled for levels = DEBUG (like in mxms.c) It's a lot of wasted CPU time... Based on envytools docs. Signed-off-by: Marcin Slusarz marcin.slus...@gmail.com --- drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 78 - 1 files changed, 74 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index c93b525..f60aec9 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -184,6 +184,62 @@ nv50_graph_tlb_flush(struct nouveau_engine *engine) return 0; } +static struct nouveau_bitfield nv50_pgraph_status[] = { + { 10, BUSY }, /* set when any bit is set */ + { 11, DISPATCH }, + { 12, UNK2 }, + { 13, UNK3 }, + { 14, UNK4 }, + { 15, UNK5 }, + { 16, M2MF }, + { 17, UNK7 }, + { 18, CTXPROG }, + { 19, VFETCH }, + { 110, CCACHE_UNK4 }, + { 111, STRMOUT_GSCHED_UNK5 }, + { 112, UNK14XX }, + { 113, UNK24XX_CSCHED }, + { 114, UNK1CXX }, + { 115, CLIPID }, + { 116, ZCULL }, + { 117, ENG2D }, + { 118, UNK34XX }, + { 119, TPRAST }, + { 120, TPROP }, + { 121, TEX }, + { 122, TPVP }, + { 123, MP }, + { 124, ROP }, + {} +}; hex bitfields please :) Sure. I thought it would be easier to read. + +static const char *const nv50_pgraph_vstatus_0[] = { + VFETCH, CCACHE, UNK4, UNK5, GSCHED, STRMOUT, UNK14XX, NULL +}; + +static const char *const nv50_pgraph_vstatus_1[] = { + TPRAST, TPROP, TEXTURE, TPVP, MP, NULL +}; + +static const char *const nv50_pgraph_vstatus_2[] = { + UNK24XX, CSCHED, UNK1CXX, CLIPID, ZCULL, ENG2D, UNK34XX, + ROP, NULL +}; + +static void nouveau_pgraph_vstatus_print(const char *const units[], u32 status) +{ + int i; + u32 tmp = status; + for (i = 0; units[i] tmp; i++) { + if ((tmp 7) == 1) + pr_cont(%s , units[i]); + tmp = 3; + } + if (tmp) + pr_cont(invalid: %x , tmp); + pr_cont((0x%08x)\n, status); +} + static int nv84_graph_tlb_flush(struct nouveau_engine *engine) { @@ -219,10 +275,24 @@ nv84_graph_tlb_flush(struct nouveau_engine *engine) !(timeout = ptimer-read(ptimer) - start 20)); if (timeout) { - nv_error(priv, PGRAPH TLB flush idle timeout fail: - 0x%08x 0x%08x 0x%08x 0x%08x\n, -nv_rd32(priv, 0x400700), nv_rd32(priv, 0x400380), -nv_rd32(priv, 0x400384), nv_rd32(priv, 0x400388)); + nv_error(priv, PGRAPH TLB flush idle timeout fail\n); + + nv_error(priv, PGRAPH_STATUS: ); + tmp = nv_rd32(priv, 0x400700); + nouveau_bitfield_print(nv50_pgraph_status, tmp); + pr_cont( (0x%08x)\n, tmp); + + nv_error(priv, PGRAPH_VSTATUS_0: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_0, + nv_rd32(priv, 0x400380)); + + nv_error(priv, PGRAPH_VSTATUS_1: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_1, + nv_rd32(priv, 0x400384)); + + nv_error(priv, PGRAPH_VSTATUS_2: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_2, + nv_rd32(priv, 0x400388)); } nv50_vm_flush_engine(engine-base,
Re: [Nouveau] [PATCH 01/10] drm/nv50: decode PGRAPH status registers on TLB flush fail
On Mon, Aug 20, 2012 at 07:02:46PM +0200, Marcin Slusarz wrote: On Mon, Aug 20, 2012 at 04:27:18PM +1000, Ben Skeggs wrote: On Sun, Aug 19, 2012 at 10:59:56PM +0200, Marcin Slusarz wrote: Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_0: CCACHE (0x00145b4d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_1: (0x002d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_2: ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 I didn't push these first few patches yet as I have a couple of thoughts on it. Mostly I was thinking we should probably have a: nv_printf(obj, lvl, fmt, args...) to replace the printk's which just does a continued print while still obeying the debug level? Well, this patch does not use nv_printk_enabled, so these concerns should not apply to it, right? I'll fix up bitfield list and resend it. --- From: Marcin Slusarz marcin.slus...@gmail.com Subject: [PATCH] drm/nv50: decode PGRAPH status registers on TLB flush fail Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_0: CCACHE (0x00145b4d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_1: (0x002d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_2: ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 Based on envytools docs. Signed-off-by: Marcin Slusarz marcin.slus...@gmail.com --- drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 78 - 1 files changed, 74 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index c93b525..3789bd2 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -184,6 +184,62 @@ nv50_graph_tlb_flush(struct nouveau_engine *engine) return 0; } +static const struct nouveau_bitfield nv50_pgraph_status[] = { + { 0x0001, BUSY }, /* set when any bit is set */ + { 0x0002, DISPATCH }, + { 0x0004, UNK2 }, + { 0x0008, UNK3 }, + { 0x0010, UNK4 }, + { 0x0020, UNK5 }, + { 0x0040, M2MF }, + { 0x0080, UNK7 }, + { 0x0100, CTXPROG }, + { 0x0200, VFETCH }, + { 0x0400, CCACHE_UNK4 }, + { 0x0800, STRMOUT_GSCHED_UNK5 }, + { 0x1000, UNK14XX }, + { 0x2000, UNK24XX_CSCHED }, + { 0x4000, UNK1CXX }, + { 0x8000, CLIPID }, + { 0x0001, ZCULL }, + { 0x0002, ENG2D }, + { 0x0004, UNK34XX }, + { 0x0008, TPRAST }, + { 0x0010, TPROP }, + { 0x0020, TEX }, + { 0x0040, TPVP }, + { 0x0080, MP }, + { 0x0100, ROP }, + {} +}; + +static const char *const nv50_pgraph_vstatus_0[] = { + VFETCH, CCACHE, UNK4, UNK5, GSCHED, STRMOUT, UNK14XX, NULL +}; + +static const char *const nv50_pgraph_vstatus_1[] = { + TPRAST, TPROP, TEXTURE, TPVP, MP, NULL +}; + +static const char *const nv50_pgraph_vstatus_2[] = { + UNK24XX, CSCHED, UNK1CXX, CLIPID, ZCULL, ENG2D, UNK34XX, + ROP, NULL +}; + +static void nouveau_pgraph_vstatus_print(const char *const units[], u32 status) +{ + int i; + u32 tmp = status; + for (i = 0; units[i] tmp; i++) { + if ((tmp 7) == 1) + pr_cont(%s , units[i]); + tmp = 3; + } + if (tmp) + pr_cont(invalid: %x , tmp); + pr_cont((0x%08x)\n, status); +} + static int nv84_graph_tlb_flush(struct nouveau_engine *engine) { @@ -219,10 +275,24 @@ nv84_graph_tlb_flush(struct nouveau_engine *engine) !(timeout = ptimer-read(ptimer) - start 20)); if (timeout) { - nv_error(priv, PGRAPH TLB flush idle timeout fail: - 0x%08x 0x%08x 0x%08x 0x%08x\n, -nv_rd32(priv, 0x400700), nv_rd32(priv, 0x400380), -nv_rd32(priv, 0x400384), nv_rd32(priv, 0x400388)); + nv_error(priv, PGRAPH TLB flush idle timeout fail\n); + + nv_error(priv, PGRAPH_STATUS: ); + tmp = nv_rd32(priv, 0x400700); + nouveau_bitfield_print(nv50_pgraph_status, tmp); + pr_cont(
[Nouveau] [PATCH 01/10] drm/nv50: decode PGRAPH status registers on TLB flush fail
Now it outputs: nouveau E[ PGRAPH][:02:00.0] PGRAPH TLB flush idle timeout fail nouveau E[ PGRAPH][:02:00.0] PGRAPH_STATUS: BUSY DISPATCH VFETCH CCACHE_UNK4 STRMOUT_GSCHED_UNK5 UNK14XX UNK1CXX CLIPID ZCULL ENG2D UNK34XX TPRAST TPROP ROP (0x011fde03) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_0: CCACHE (0x00145b4d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_1: (0x002d) nouveau E[ PGRAPH][:02:00.0] PGRAPH_VSTATUS_2: ENG2D ROP (0x0034db40) instead of: [drm] nouveau :02:00.0: PGRAPH TLB flush idle timeout fail: 0x011fde03 0x00145b4d 0x002d 0x0034db40 Based on envytools docs. Signed-off-by: Marcin Slusarz marcin.slus...@gmail.com --- drivers/gpu/drm/nouveau/core/engine/graph/nv50.c | 78 - 1 files changed, 74 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c index c93b525..f60aec9 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c @@ -184,6 +184,62 @@ nv50_graph_tlb_flush(struct nouveau_engine *engine) return 0; } +static struct nouveau_bitfield nv50_pgraph_status[] = { + { 10, BUSY }, /* set when any bit is set */ + { 11, DISPATCH }, + { 12, UNK2 }, + { 13, UNK3 }, + { 14, UNK4 }, + { 15, UNK5 }, + { 16, M2MF }, + { 17, UNK7 }, + { 18, CTXPROG }, + { 19, VFETCH }, + { 110, CCACHE_UNK4 }, + { 111, STRMOUT_GSCHED_UNK5 }, + { 112, UNK14XX }, + { 113, UNK24XX_CSCHED }, + { 114, UNK1CXX }, + { 115, CLIPID }, + { 116, ZCULL }, + { 117, ENG2D }, + { 118, UNK34XX }, + { 119, TPRAST }, + { 120, TPROP }, + { 121, TEX }, + { 122, TPVP }, + { 123, MP }, + { 124, ROP }, + {} +}; + +static const char *const nv50_pgraph_vstatus_0[] = { + VFETCH, CCACHE, UNK4, UNK5, GSCHED, STRMOUT, UNK14XX, NULL +}; + +static const char *const nv50_pgraph_vstatus_1[] = { + TPRAST, TPROP, TEXTURE, TPVP, MP, NULL +}; + +static const char *const nv50_pgraph_vstatus_2[] = { + UNK24XX, CSCHED, UNK1CXX, CLIPID, ZCULL, ENG2D, UNK34XX, + ROP, NULL +}; + +static void nouveau_pgraph_vstatus_print(const char *const units[], u32 status) +{ + int i; + u32 tmp = status; + for (i = 0; units[i] tmp; i++) { + if ((tmp 7) == 1) + pr_cont(%s , units[i]); + tmp = 3; + } + if (tmp) + pr_cont(invalid: %x , tmp); + pr_cont((0x%08x)\n, status); +} + static int nv84_graph_tlb_flush(struct nouveau_engine *engine) { @@ -219,10 +275,24 @@ nv84_graph_tlb_flush(struct nouveau_engine *engine) !(timeout = ptimer-read(ptimer) - start 20)); if (timeout) { - nv_error(priv, PGRAPH TLB flush idle timeout fail: - 0x%08x 0x%08x 0x%08x 0x%08x\n, -nv_rd32(priv, 0x400700), nv_rd32(priv, 0x400380), -nv_rd32(priv, 0x400384), nv_rd32(priv, 0x400388)); + nv_error(priv, PGRAPH TLB flush idle timeout fail\n); + + nv_error(priv, PGRAPH_STATUS: ); + tmp = nv_rd32(priv, 0x400700); + nouveau_bitfield_print(nv50_pgraph_status, tmp); + pr_cont( (0x%08x)\n, tmp); + + nv_error(priv, PGRAPH_VSTATUS_0: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_0, + nv_rd32(priv, 0x400380)); + + nv_error(priv, PGRAPH_VSTATUS_1: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_1, + nv_rd32(priv, 0x400384)); + + nv_error(priv, PGRAPH_VSTATUS_2: ); + nouveau_pgraph_vstatus_print(nv50_pgraph_vstatus_2, + nv_rd32(priv, 0x400388)); } nv50_vm_flush_engine(engine-base, 0x00); -- 1.7.8.6 ___ Nouveau mailing list Nouveau@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/nouveau