nouveau: Add bitfield names for NSOURCE and NSTATUS.
authorPekka Paalanen <pq@iki.fi>
Fri, 6 Jul 2007 10:57:31 +0000 (13:57 +0300)
committerPekka Paalanen <pq@iki.fi>
Wed, 18 Jul 2007 11:00:04 +0000 (14:00 +0300)
Name strings and pretty-printing in nouveau_graph_dump_trap_info().

shared-core/nouveau_irq.c
shared-core/nouveau_reg.h

index ffc4bac..f7baf89 100644 (file)
@@ -246,6 +246,61 @@ static void nouveau_nv04_context_switch(struct drm_device *dev)
 }
 #endif
 
+
+struct nouveau_bitfield_names
+{
+       uint32_t mask;
+       const char * name;
+};
+
+static struct nouveau_bitfield_names nouveau_nstatus_names[] =
+{
+       { NV03_PGRAPH_NSTATUS_STATE_IN_USE,       "STATE_IN_USE" },
+       { NV03_PGRAPH_NSTATUS_INVALID_STATE,      "INVALID_STATE" },
+       { NV03_PGRAPH_NSTATUS_BAD_ARGUMENT,       "BAD_ARGUMENT" },
+       { NV03_PGRAPH_NSTATUS_PROTECTION_FAULT,   "PROTECTION_FAULT" }
+};
+
+static struct nouveau_bitfield_names nouveau_nsource_names[] =
+{
+       { NV03_PGRAPH_NSOURCE_NOTIFICATION,       "NOTIFICATION" },
+       { NV03_PGRAPH_NSOURCE_DATA_ERROR,         "DATA_ERROR" },
+       { NV03_PGRAPH_NSOURCE_PROTECTION_ERROR,   "PROTECTION_ERROR" },
+       { NV03_PGRAPH_NSOURCE_RANGE_EXCEPTION,    "RANGE_EXCEPTION" },
+       { NV03_PGRAPH_NSOURCE_LIMIT_COLOR,        "LIMIT_COLOR" },
+       { NV03_PGRAPH_NSOURCE_LIMIT_ZETA,         "LIMIT_ZETA" },
+       { NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD,       "ILLEGAL_MTHD" },
+       { NV03_PGRAPH_NSOURCE_DMA_R_PROTECTION,   "DMA_R_PROTECTION" },
+       { NV03_PGRAPH_NSOURCE_DMA_W_PROTECTION,   "DMA_W_PROTECTION" },
+       { NV03_PGRAPH_NSOURCE_FORMAT_EXCEPTION,   "FORMAT_EXCEPTION" },
+       { NV03_PGRAPH_NSOURCE_PATCH_EXCEPTION,    "PATCH_EXCEPTION" },
+       { NV03_PGRAPH_NSOURCE_STATE_INVALID,      "STATE_INVALID" },
+       { NV03_PGRAPH_NSOURCE_DOUBLE_NOTIFY,      "DOUBLE_NOTIFY" },
+       { NV03_PGRAPH_NSOURCE_NOTIFY_IN_USE,      "NOTIFY_IN_USE" },
+       { NV03_PGRAPH_NSOURCE_METHOD_CNT,         "METHOD_CNT" },
+       { NV03_PGRAPH_NSOURCE_BFR_NOTIFICATION,   "BFR_NOTIFICATION" },
+       { NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION, "DMA_VTX_PROTECTION" },
+       { NV03_PGRAPH_NSOURCE_DMA_WIDTH_A,        "DMA_WIDTH_A" },
+       { NV03_PGRAPH_NSOURCE_DMA_WIDTH_B,        "DMA_WIDTH_B" },
+};
+
+static void
+nouveau_print_bitfield_names(uint32_t value,
+                             const struct nouveau_bitfield_names *namelist,
+                             const int namelist_len)
+{
+       int i;
+       for(i=0; i<namelist_len; ++i) {
+               uint32_t mask = namelist[i].mask;
+               if(value & mask) {
+                       printk(" %s", namelist[i].name);
+                       value &= ~mask;
+               }
+       }
+       if(value)
+               printk(" (unknown bits 0x%08x)", value);
+}
+
 static void
 nouveau_graph_dump_trap_info(struct drm_device *dev)
 {
@@ -253,22 +308,30 @@ nouveau_graph_dump_trap_info(struct drm_device *dev)
        uint32_t address;
        uint32_t channel, class;
        uint32_t method, subc, data;
+       uint32_t nsource, nstatus;
 
        address = NV_READ(0x400704);
        channel = (address >> 20) & 0x1F;
        subc    = (address >> 16) & 0x7;
        method  = address & 0x1FFC;
        data    = NV_READ(0x400708);
+       nsource = NV_READ(NV03_PGRAPH_NSOURCE);
+       nstatus = NV_READ(NV03_PGRAPH_NSTATUS);
        if (dev_priv->card_type < NV_50) {
                class = NV_READ(0x400160 + subc*4) & 0xFFFF;
        } else {
                class = NV_READ(0x400814);
        }
 
-       DRM_ERROR("NV: nSource: 0x%08x, nStatus: 0x%08x\n",
-                       NV_READ(NV03_PGRAPH_NSOURCE),
-                       NV_READ(NV03_PGRAPH_NSTATUS));
-       DRM_ERROR("NV: Channel %d/%d (class 0x%04x) -"
+       DRM_ERROR("nSource:");
+       nouveau_print_bitfield_names(nsource, nouveau_nsource_names,
+                                    ARRAY_SIZE(nouveau_nsource_names));
+       printk(", nStatus:");
+       nouveau_print_bitfield_names(nstatus, nouveau_nstatus_names,
+                                    ARRAY_SIZE(nouveau_nstatus_names));
+       printk("\n");
+
+       DRM_ERROR("NV: Channel %d/%d (class 0x%04x) - "
                        "Method 0x%04x, Data 0x%08x\n",
                        channel, subc, class, method, data
                 );
index bcdb1a9..47d54b2 100644 (file)
 #define NV10_PGRAPH_DEBUG_4                                0x00400090
 #define NV03_PGRAPH_INTR                                   0x00400100
 #define NV03_PGRAPH_NSTATUS                                0x00400104
+#    define NV03_PGRAPH_NSTATUS_STATE_IN_USE                  (1<<23)
+#    define NV03_PGRAPH_NSTATUS_INVALID_STATE                 (1<<24)
+#    define NV03_PGRAPH_NSTATUS_BAD_ARGUMENT                  (1<<25)
+#    define NV03_PGRAPH_NSTATUS_PROTECTION_FAULT              (1<<26)
 #define NV03_PGRAPH_NSOURCE                                0x00400108
+#    define NV03_PGRAPH_NSOURCE_NOTIFICATION                  (1<< 0)
+#    define NV03_PGRAPH_NSOURCE_DATA_ERROR                    (1<< 1)
+#    define NV03_PGRAPH_NSOURCE_PROTECTION_ERROR              (1<< 2)
+#    define NV03_PGRAPH_NSOURCE_RANGE_EXCEPTION               (1<< 3)
+#    define NV03_PGRAPH_NSOURCE_LIMIT_COLOR                   (1<< 4)
+#    define NV03_PGRAPH_NSOURCE_LIMIT_ZETA                    (1<< 5)
+#    define NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD                  (1<< 6)
+#    define NV03_PGRAPH_NSOURCE_DMA_R_PROTECTION              (1<< 7)
+#    define NV03_PGRAPH_NSOURCE_DMA_W_PROTECTION              (1<< 8)
+#    define NV03_PGRAPH_NSOURCE_FORMAT_EXCEPTION              (1<< 9)
+#    define NV03_PGRAPH_NSOURCE_PATCH_EXCEPTION               (1<<10)
+#    define NV03_PGRAPH_NSOURCE_STATE_INVALID                 (1<<11)
+#    define NV03_PGRAPH_NSOURCE_DOUBLE_NOTIFY                 (1<<12)
+#    define NV03_PGRAPH_NSOURCE_NOTIFY_IN_USE                 (1<<13)
+#    define NV03_PGRAPH_NSOURCE_METHOD_CNT                    (1<<14)
+#    define NV03_PGRAPH_NSOURCE_BFR_NOTIFICATION              (1<<15)
+#    define NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION            (1<<16)
+#    define NV03_PGRAPH_NSOURCE_DMA_WIDTH_A                   (1<<17)
+#    define NV03_PGRAPH_NSOURCE_DMA_WIDTH_B                   (1<<18)
 #define NV03_PGRAPH_INTR_EN                                0x00400140
 #define NV40_PGRAPH_INTR_EN                                0x0040013C
 #    define NV_PGRAPH_INTR_NOTIFY                             (1<< 0)