nouveau: Add bitfield names for NSOURCE and NSTATUS.

Name strings and pretty-printing in nouveau_graph_dump_trap_info().
main
Pekka Paalanen 2007-07-06 13:57:31 +03:00
parent 14ecf8d6c2
commit 0c77f5abea
2 changed files with 90 additions and 4 deletions

View File

@ -246,6 +246,61 @@ static void nouveau_nv04_context_switch(struct drm_device *dev)
} }
#endif #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 static void
nouveau_graph_dump_trap_info(struct drm_device *dev) 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 address;
uint32_t channel, class; uint32_t channel, class;
uint32_t method, subc, data; uint32_t method, subc, data;
uint32_t nsource, nstatus;
address = NV_READ(0x400704); address = NV_READ(0x400704);
channel = (address >> 20) & 0x1F; channel = (address >> 20) & 0x1F;
subc = (address >> 16) & 0x7; subc = (address >> 16) & 0x7;
method = address & 0x1FFC; method = address & 0x1FFC;
data = NV_READ(0x400708); data = NV_READ(0x400708);
nsource = NV_READ(NV03_PGRAPH_NSOURCE);
nstatus = NV_READ(NV03_PGRAPH_NSTATUS);
if (dev_priv->card_type < NV_50) { if (dev_priv->card_type < NV_50) {
class = NV_READ(0x400160 + subc*4) & 0xFFFF; class = NV_READ(0x400160 + subc*4) & 0xFFFF;
} else { } else {
class = NV_READ(0x400814); class = NV_READ(0x400814);
} }
DRM_ERROR("NV: nSource: 0x%08x, nStatus: 0x%08x\n", DRM_ERROR("nSource:");
NV_READ(NV03_PGRAPH_NSOURCE), nouveau_print_bitfield_names(nsource, nouveau_nsource_names,
NV_READ(NV03_PGRAPH_NSTATUS)); ARRAY_SIZE(nouveau_nsource_names));
DRM_ERROR("NV: Channel %d/%d (class 0x%04x) -" 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", "Method 0x%04x, Data 0x%08x\n",
channel, subc, class, method, data channel, subc, class, method, data
); );

View File

@ -111,7 +111,30 @@
#define NV10_PGRAPH_DEBUG_4 0x00400090 #define NV10_PGRAPH_DEBUG_4 0x00400090
#define NV03_PGRAPH_INTR 0x00400100 #define NV03_PGRAPH_INTR 0x00400100
#define NV03_PGRAPH_NSTATUS 0x00400104 #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 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 NV03_PGRAPH_INTR_EN 0x00400140
#define NV40_PGRAPH_INTR_EN 0x0040013C #define NV40_PGRAPH_INTR_EN 0x0040013C
# define NV_PGRAPH_INTR_NOTIFY (1<< 0) # define NV_PGRAPH_INTR_NOTIFY (1<< 0)