drm/nv84: decode PCRYPT errors
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Sun, 10 Jun 2012 22:21:12 +0000 (00:21 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 26 Jul 2012 00:28:13 +0000 (10:28 +1000)
Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nv84_crypt.c

index edece9c616eb59dac75d5b5e30500576689deafd..bbfcc73b67080b4879acd3e7a0ebc5f451c42481 100644 (file)
@@ -117,18 +117,30 @@ nv84_crypt_tlb_flush(struct drm_device *dev, int engine)
        nv50_vm_flush_engine(dev, 0x0a);
 }
 
+static struct nouveau_bitfield nv84_crypt_intr[] = {
+       { 0x00000001, "INVALID_STATE" },
+       { 0x00000002, "ILLEGAL_MTHD" },
+       { 0x00000004, "ILLEGAL_CLASS" },
+       { 0x00000080, "QUERY" },
+       { 0x00000100, "FAULT" },
+       {}
+};
+
 static void
 nv84_crypt_isr(struct drm_device *dev)
 {
        u32 stat = nv_rd32(dev, 0x102130);
        u32 mthd = nv_rd32(dev, 0x102190);
        u32 data = nv_rd32(dev, 0x102194);
-       u32 inst = nv_rd32(dev, 0x102188) & 0x7fffffff;
+       u64 inst = (u64)(nv_rd32(dev, 0x102188) & 0x7fffffff) << 12;
        int show = nouveau_ratelimit();
+       int chid = nv50_graph_isr_chid(dev, inst);
 
        if (show) {
-               NV_INFO(dev, "PCRYPT_INTR: 0x%08x 0x%08x 0x%08x 0x%08x\n",
-                            stat, mthd, data, inst);
+               NV_INFO(dev, "PCRYPT:");
+               nouveau_bitfield_print(nv84_crypt_intr, stat);
+               printk(KERN_CONT " ch %d (0x%010llx) mthd 0x%04x data 0x%08x\n",
+                       chid, inst, mthd, data);
        }
 
        nv_wr32(dev, 0x102130, stat);