Re: [Nouveau] [PATCH 01/10] drm/nv50: decode PGRAPH status registers on TLB flush fail

2012-10-16 Thread Marcin Slusarz
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

2012-09-12 Thread Marcin Slusarz
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

2012-08-20 Thread Ben Skeggs
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

2012-08-20 Thread Marcin Slusarz
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

2012-08-20 Thread Marcin Slusarz
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

2012-08-19 Thread Marcin Slusarz
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