Remove error state dumping code.
This is replaced by intel_gpu_dump, and would no longer be used once UMS is gone.
This commit is contained in:
parent
2370af32fe
commit
33c488e836
|
|
@ -105,10 +105,6 @@ I830WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis)
|
|||
} else if (now - start > timeout_millis) {
|
||||
ErrorF("Error in I830WaitLpRing(), timeout for %d seconds\n",
|
||||
timeout_millis/1000);
|
||||
if (IS_I965G(pI830))
|
||||
i965_dump_error_state(pScrn);
|
||||
else
|
||||
i830_dump_error_state(pScrn);
|
||||
ErrorF("space: %d wanted %d\n", ring->space, n);
|
||||
pI830->uxa_driver = NULL;
|
||||
FatalError("lockup\n");
|
||||
|
|
|
|||
784
src/i830_debug.c
784
src/i830_debug.c
|
|
@ -1754,787 +1754,3 @@ void i830DumpRegs (ScrnInfoPtr pScrn)
|
|||
}
|
||||
xf86DrvMsg (pScrn->scrnIndex, X_INFO, "DumpRegsEnd\n");
|
||||
}
|
||||
|
||||
#ifndef REG_DUMPER
|
||||
|
||||
static char *mi_cmds[0x40] = {
|
||||
"MI_NOOP", /* 00 */
|
||||
"Reserved 01",
|
||||
"MI_USER_INTERRUPT",
|
||||
"MI_WAIT_FOR_EVENT",
|
||||
|
||||
"MI_FLUSH", /* 04 */
|
||||
"MI_ARB_CHECK",
|
||||
NULL,
|
||||
"MI_REPORT_HEAD",
|
||||
|
||||
NULL, /* 08 */
|
||||
NULL,
|
||||
"MI_BATCH_BUFFER_END",
|
||||
NULL,
|
||||
|
||||
NULL, /* 0c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 10 */
|
||||
"MI_OVERLAY_FLIP",
|
||||
"MI_LOAD_SCAN_LINES_INCL",
|
||||
"MI_LOAD_SCAN_LINES_EXCL",
|
||||
|
||||
"MI_DISPLAY_BUFFER_INFO", /* 14 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
"MI_SET_CONTEXT", /* 18 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 1c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
"MI_STORE_DATA_IMM", /* 20 */
|
||||
"MI_STORE_DATA_INDEX",
|
||||
"MI_LOAD_REGISTER_IMM",
|
||||
NULL,
|
||||
|
||||
"MI_STORE_REGISTER_MEM", /* 24 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 28 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 2c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 30 */
|
||||
"MI_BATCH_BUFFER_START",
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 34 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 38 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 3c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static char *_2d_cmds[0x80] = {
|
||||
NULL, /* 00 */
|
||||
"XY_SETUP_BLT",
|
||||
NULL,
|
||||
"XY_SETUP_CLIP_BLT",
|
||||
|
||||
NULL, /* 04 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 08 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 0c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 10 */
|
||||
"XY_SETUP_MONO_PATTERN_SL_BLT",
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 14 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 18 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 1c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 20 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
"XY_PIXEL_BLT", /* 24 */
|
||||
"XY_SCANLINE_BLT",
|
||||
"XY_TEXT_BLT",
|
||||
NULL,
|
||||
|
||||
NULL, /* 28 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 2c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 30 */
|
||||
"XY_TEXT_IMMEDIATE_BLT",
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 34 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 38 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 3c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
"COLOR_BLT", /* 40 */
|
||||
NULL,
|
||||
NULL,
|
||||
"SRC_COPY_BLT",
|
||||
|
||||
NULL, /* 44 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 48 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 4c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
"XY_COLOR_BLT", /* 50 */
|
||||
"XY_PAT_BLT",
|
||||
"XY_MONO_PAT_BLT",
|
||||
"XY_SRC_COPY_BLT",
|
||||
|
||||
"XY_MONO_SRC_COPY_BLT", /* 54 */
|
||||
"XY_FULL_BLT",
|
||||
"XY_FULL_MONO_SRC_BLT",
|
||||
"XY_FULL_MONO_PATTERN_BLT",
|
||||
|
||||
"XY_FULL_MONO_PATTERN_MONO_SRC_BLT", /* 58 */
|
||||
"XY_MONO_PAT_FIXED_BLT",
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 5c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 60 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 64 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 68 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 6c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 70 */
|
||||
"XY_MONO_SRC_COPY_IMMEDIATE_BLT",
|
||||
"XY_PAT_BLT_IMMEDIATE",
|
||||
"XY_SRC_COPY_CHROMA_BLT",
|
||||
|
||||
"XY_FULL_IMMEDIATE_PATTERN_BLT", /* 74 */
|
||||
"XY_FULL_MONO_SRC_IMMEDIATE_PATTERN_BLT",
|
||||
"XY_PAT_CHROMA_BLT",
|
||||
"XY_PAT_CHROMA_BLT_IMMEDIATE",
|
||||
|
||||
NULL, /* 78 */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL, /* 7c */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
};
|
||||
|
||||
#define _3D_ONE_WORD 1
|
||||
|
||||
static struct {
|
||||
char *name;
|
||||
int flags;
|
||||
} _3d_cmds[0x4][0x8][0x100] = {
|
||||
{ /* Pipeline Type 00 (Common) */
|
||||
{ /* Opcode 0 */
|
||||
{ "URB_FENCE", 0 }, /* 00 */
|
||||
{ "CS_URB_STATE", 0 },
|
||||
{ "CONSTANT_BUFFER", 0 },
|
||||
{ "STATE_PREFETCH", 0 },
|
||||
},
|
||||
{ /* Opcode 1 */
|
||||
{ NULL, 0 }, /* 00 */
|
||||
{ "STATE_BASE_ADDRESS", 0 },
|
||||
{ "STATE_SIP", 0 },
|
||||
{ NULL, 0 },
|
||||
|
||||
{ "PIPELINE_SELECT", _3D_ONE_WORD }, /* 04 */
|
||||
},
|
||||
},
|
||||
{ /* Pipeline Type 01 (Single DW) */
|
||||
{ /* Opcode 0 */
|
||||
},
|
||||
{ /* Opcode 1 */
|
||||
{ NULL, 0 }, /* 00 */
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 },
|
||||
|
||||
{ "PIPELINE_SELECT", 0 }, /* 04 */
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 },
|
||||
},
|
||||
},
|
||||
{ /* Pipeline Type 02 (Media) */
|
||||
{ /* Opcode 0 */
|
||||
{ "MEDIA_STATE_POINTERS", 0 }, /* 00 */
|
||||
},
|
||||
{ /* Opcode 1 */
|
||||
{ "MEDIA_OBJECT", 0 }, /* 00 */
|
||||
{ "MEDIA_OBJECT_EX", 0 },
|
||||
{ "MEDIA_OBJECT_PTR", 0 },
|
||||
},
|
||||
},
|
||||
{ /* Pipeline Type 03 (3D) */
|
||||
{ /* Opcode 0 */
|
||||
{ "3DSTATE_PIPELINED_POINTERS", 0 }, /* 00 */
|
||||
{ "3DSTATE_BINDING_TABLE_POINTERS", 0 },
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 },
|
||||
|
||||
{ NULL, 0 }, /* 04 */
|
||||
{ "3DSTATE_URB", 0 },
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 },
|
||||
|
||||
{ "3DSTATE_VERTEX_BUFFERS", 0 }, /* 08 */
|
||||
{ "3DSTATE_VERTEX_ELEMENTS", 0 },
|
||||
{ "3DSTATE_INDEX_BUFFER", 0 },
|
||||
{ "3DSTATE_VF_STATISTICS", _3D_ONE_WORD },
|
||||
|
||||
{ NULL, 0 }, /* 0c */
|
||||
{ "3DSTATE_VIEWPORT_STATE_POINTERS", 0 },
|
||||
},
|
||||
{ /* Opcode 1 */
|
||||
{ "3DSTATE_DRAWING_RECTANGLE", 0 }, /* 00 */
|
||||
{ "3DSTATE_CONSTANT_COLOR", 0 },
|
||||
{ "3DSTATE_SAMPLER_PALETTE_LOAD0", 0 },
|
||||
{ NULL, 0 },
|
||||
|
||||
{ "3DSTATE_CHROMA_KEY", 0 }, /* 04 */
|
||||
{ "3DSTATE_DEPTH_BUFFER", 0 },
|
||||
{ "3DSTATE_POLY_STIPPLE_OFFSET", 0 },
|
||||
{ "3DSTATE_POLY_STIPPLE_PATTERN", 0 },
|
||||
|
||||
{ "3DSTATE_LINE_STIPPLE", 0 }, /* 08 */
|
||||
{ "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP", 0 },
|
||||
},
|
||||
{ /* Opcode 2 */
|
||||
{ "PIPE_CONTROL", 0 }, /* 00 */
|
||||
},
|
||||
{ /* Opcode 3 */
|
||||
{ "3DPRIMITIVE", 0 }, /* 00 */
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static int
|
||||
i830_valid_command (uint32_t cmd)
|
||||
{
|
||||
uint32_t type = (cmd >> 29) & 0x7;
|
||||
uint32_t pipeline_type;
|
||||
uint32_t opcode;
|
||||
uint32_t subopcode;
|
||||
uint32_t count;
|
||||
|
||||
switch (type) {
|
||||
case 0: /* Memory Interface */
|
||||
opcode = (cmd >> 23) & 0x3f;
|
||||
if (opcode < 0x10)
|
||||
count = 1;
|
||||
else
|
||||
count = (cmd & 0x3f) + 2;
|
||||
if (opcode == 0x00 && cmd != 0x00000000)
|
||||
return -1;
|
||||
if (!mi_cmds[opcode])
|
||||
return -1;
|
||||
break;
|
||||
case 1:
|
||||
return -1;
|
||||
case 2: /* 2D */
|
||||
count = (cmd & 0x1f) + 2;
|
||||
opcode = (cmd >> 22) & 0x7f;
|
||||
if (!_2d_cmds[opcode])
|
||||
return -1;
|
||||
break;
|
||||
case 3: /* 3D */
|
||||
pipeline_type = (cmd >> 27) & 0x3;
|
||||
opcode = (cmd >> 24) & 0x7;
|
||||
subopcode = (cmd >> 16) & 0xff;
|
||||
if (_3d_cmds[pipeline_type][opcode][subopcode].flags & _3D_ONE_WORD)
|
||||
count = 1;
|
||||
else
|
||||
count = (cmd & 0xff) + 2;
|
||||
if (!_3d_cmds[pipeline_type][opcode][subopcode].name)
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static int
|
||||
i830_dump_cmd (uint32_t cmd, int count)
|
||||
{
|
||||
uint32_t type = (cmd >> 29) & 0x7;
|
||||
uint32_t pipeline_type;
|
||||
uint32_t opcode;
|
||||
uint32_t subopcode;
|
||||
int ret = 1;
|
||||
|
||||
ErrorF ("\t");
|
||||
switch (type) {
|
||||
case 0: /* Memory Interface */
|
||||
opcode = (cmd >> 23) & 0x3f;
|
||||
if (mi_cmds[opcode])
|
||||
ErrorF ("%-40.40s %d\n", mi_cmds[opcode], count);
|
||||
else
|
||||
ErrorF ("Memory Interface Reserved\n");
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2: /* 2D */
|
||||
opcode = (cmd >> 22) & 0x7f;
|
||||
if (_2d_cmds[opcode])
|
||||
ErrorF ("%-40.40s %d\n", _2d_cmds[opcode], count);
|
||||
else
|
||||
ErrorF ("2D Reserved\n");
|
||||
break;
|
||||
case 3: /* 3D */
|
||||
pipeline_type = (cmd >> 27) & 0x3;
|
||||
opcode = (cmd >> 24) & 0x7;
|
||||
subopcode = (cmd >> 16) & 0xff;
|
||||
if (_3d_cmds[pipeline_type][opcode][subopcode].name) {
|
||||
ErrorF ("%-40.40s %d\n",
|
||||
_3d_cmds[pipeline_type][opcode][subopcode].name,
|
||||
count);
|
||||
} else {
|
||||
ErrorF ("3D/Media Reserved (pipe %d op %d sub %d)\n", pipeline_type, opcode, subopcode);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ErrorF ("Reserved\n");
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
i830_valid_chain (ScrnInfoPtr pScrn, unsigned int ring, unsigned int end)
|
||||
{
|
||||
I830Ptr pI830 = I830PTR(pScrn);
|
||||
unsigned int head, tail, mask;
|
||||
volatile unsigned char *virt;
|
||||
uint32_t data;
|
||||
int count;
|
||||
volatile uint32_t *ptr;
|
||||
|
||||
head = (INREG (LP_RING + RING_HEAD)) & I830_HEAD_MASK;
|
||||
tail = INREG (LP_RING + RING_TAIL) & I830_TAIL_MASK;
|
||||
mask = pI830->ring.tail_mask;
|
||||
|
||||
virt = pI830->ring.virtual_start;
|
||||
ErrorF ("Ring at virtual %p head 0x%x tail 0x%x count %d\n",
|
||||
virt, head, tail, (((tail + mask + 1) - head) & mask) >> 2);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
ptr = (volatile uint32_t *) (virt + ring);
|
||||
data = *ptr;
|
||||
count = i830_valid_command (data);
|
||||
if (count < 0)
|
||||
return 0;
|
||||
while (count > 0 && ring != end)
|
||||
{
|
||||
ring = (ring + 4) & mask;
|
||||
count--;
|
||||
}
|
||||
if (ring == end) {
|
||||
if (count == 0)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
i830_dump_cmds (ScrnInfoPtr pScrn,
|
||||
volatile unsigned char *virt,
|
||||
uint32_t start,
|
||||
uint32_t stop,
|
||||
uint32_t mask,
|
||||
uint32_t acthd)
|
||||
{
|
||||
I830Ptr pI830 = I830PTR(pScrn);
|
||||
uint32_t ring = start;
|
||||
uint32_t cmd = start;
|
||||
uint32_t data;
|
||||
uint32_t batch_start_mask = ((0x7 << 29) |
|
||||
(0x3f << 23) |
|
||||
(0x7ff << 12) |
|
||||
(1 << 11) |
|
||||
(1 << 7) |
|
||||
(1 << 6) |
|
||||
(0x3f << 0));
|
||||
uint32_t batch_start_cmd = ((0x0 << 29) |
|
||||
(0x31 << 23) |
|
||||
(0x00 << 12) |
|
||||
(0 << 11) |
|
||||
(1 << 7) |
|
||||
(0 << 6) |
|
||||
(0 << 0));
|
||||
int count;
|
||||
volatile uint32_t *ptr;
|
||||
|
||||
while (ring != stop)
|
||||
{
|
||||
if (ring == acthd)
|
||||
ErrorF ("****");
|
||||
ErrorF ("\t%08x: %08x", ring, *(volatile unsigned int *) (virt + ring));
|
||||
if (ring == cmd)
|
||||
{
|
||||
ptr = (volatile uint32_t *) (virt + ring);
|
||||
data = *ptr;
|
||||
count = i830_valid_command (data);
|
||||
i830_dump_cmd (data, count);
|
||||
|
||||
/* check for MI_BATCH_BUFFER_END */
|
||||
if (data == (0x0a << 23))
|
||||
stop = (ring + 4) & mask;
|
||||
/* check for MI_BATCH_BUFFER_START */
|
||||
if ((data & batch_start_mask) == batch_start_cmd)
|
||||
{
|
||||
uint32_t batch = ptr[1] & ~3;
|
||||
if (batch < pI830->FbMapSize) {
|
||||
ErrorF ("\t%08x: %08x\n", (ring + 4) & mask, batch);
|
||||
ErrorF ("Batch buffer at 0x%08x {\n", batch);
|
||||
i830_dump_cmds (pScrn, pI830->FbBase, batch,
|
||||
batch + 256, 0xffffffff, acthd);
|
||||
ErrorF ("}\n");
|
||||
ring = (ring + (count - 1) * 4) & mask;
|
||||
}
|
||||
}
|
||||
cmd = (cmd + count * 4) & mask;
|
||||
} else
|
||||
ErrorF ("\n");
|
||||
ring = (ring + 4) & mask;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
i830_dump_ring(ScrnInfoPtr pScrn, uint32_t acthd)
|
||||
{
|
||||
I830Ptr pI830 = I830PTR(pScrn);
|
||||
unsigned int head, tail, mask, cmd;
|
||||
volatile unsigned char *virt;
|
||||
|
||||
head = (INREG (LP_RING + RING_HEAD)) & I830_HEAD_MASK;
|
||||
tail = INREG (LP_RING + RING_TAIL) & I830_TAIL_MASK;
|
||||
mask = pI830->ring.tail_mask;
|
||||
|
||||
virt = pI830->ring.virtual_start;
|
||||
ErrorF ("Ring at virtual %p head 0x%x tail 0x%x count %d acthd 0x%x\n",
|
||||
virt, head, tail, (((tail + mask + 1) - head) & mask) >> 2, acthd);
|
||||
|
||||
/* walk back by instructions */
|
||||
for (cmd = (head - 256) & mask;
|
||||
cmd != (head & mask);
|
||||
cmd = (cmd + 4) & mask)
|
||||
{
|
||||
if (i830_valid_chain (pScrn, cmd, (head & mask)))
|
||||
break;
|
||||
}
|
||||
|
||||
i830_dump_cmds (pScrn, virt, cmd, head, mask, acthd);
|
||||
|
||||
ErrorF ("Ring end\n");
|
||||
}
|
||||
|
||||
/* Famous last words
|
||||
*/
|
||||
void
|
||||
i830_dump_error_state(ScrnInfoPtr pScrn)
|
||||
{
|
||||
I830Ptr pI830 = I830PTR(pScrn);
|
||||
|
||||
ErrorF("pgetbl_ctl: 0x%08x getbl_err: 0x%08x\n",
|
||||
INREG(PGETBL_CTL), INREG(PGE_ERR));
|
||||
|
||||
ErrorF("ipeir: 0x%08x iphdr: 0x%08x\n", INREG(IPEIR), INREG(IPEHR));
|
||||
|
||||
ErrorF("LP ring tail: 0x%08x head: 0x%08x len: 0x%08x start 0x%08x\n",
|
||||
INREG(LP_RING + RING_TAIL),
|
||||
INREG(LP_RING + RING_HEAD) & HEAD_ADDR,
|
||||
INREG(LP_RING + RING_LEN),
|
||||
INREG(LP_RING + RING_START));
|
||||
|
||||
ErrorF("eir: 0x%04x esr: 0x%04x emr: 0x%04x\n",
|
||||
INREG16(EIR), INREG16(ESR), INREG16(EMR));
|
||||
|
||||
ErrorF("instdone: 0x%04x instpm: 0x%04x\n",
|
||||
INREG16(INST_DONE), INREG8(INST_PM));
|
||||
|
||||
ErrorF("memmode: 0x%08x instps: 0x%08x\n",
|
||||
INREG(MEMMODE), INREG(INST_PS));
|
||||
|
||||
ErrorF("hwstam: 0x%04x ier: 0x%04x imr: 0x%04x iir: 0x%04x\n",
|
||||
INREG16(HWSTAM), INREG16(IER), INREG16(IMR), INREG16(IIR));
|
||||
i830_dump_ring (pScrn, INREG(ACTHD));
|
||||
}
|
||||
|
||||
void
|
||||
i965_dump_error_state(ScrnInfoPtr pScrn)
|
||||
{
|
||||
I830Ptr pI830 = I830PTR(pScrn);
|
||||
uint32_t acthd;
|
||||
|
||||
ErrorF("pgetbl_ctl: 0x%08x pgetbl_err: 0x%08x\n",
|
||||
INREG(PGETBL_CTL), INREG(PGE_ERR));
|
||||
|
||||
ErrorF("ipeir: 0x%08x iphdr: 0x%08x\n",
|
||||
INREG(IPEIR_I965), INREG(IPEHR_I965));
|
||||
|
||||
ErrorF("LP ring tail: 0x%08x head: %x len: 0x%08x start 0x%08x\n",
|
||||
INREG(LP_RING + RING_TAIL),
|
||||
INREG(LP_RING + RING_HEAD) & HEAD_ADDR,
|
||||
INREG(LP_RING + RING_LEN),
|
||||
INREG(LP_RING + RING_START));
|
||||
|
||||
ErrorF("Err ID (eir): 0x%08x\n"
|
||||
"Err Status (esr): 0x%08x\n"
|
||||
"Err Mask (emr): 0x%08x\n",
|
||||
INREG(EIR), INREG(ESR), INREG(EMR));
|
||||
|
||||
ErrorF("instdone: 0x%08x instdone_1: 0x%08x\n",
|
||||
INREG(INST_DONE_I965), INREG(INST_DONE_1));
|
||||
ErrorF("instpm: 0x%08x\n", INREG(INST_PM));
|
||||
|
||||
ErrorF("memmode: 0x%08x instps: 0x%08x\n",
|
||||
INREG(MEMMODE), INREG(INST_PS_I965));
|
||||
|
||||
ErrorF("HW Status mask (hwstam): 0x%08x\nIRQ enable (ier): 0x%08x "
|
||||
"imr: 0x%08x iir: 0x%08x\n",
|
||||
INREG(HWSTAM), INREG(IER), INREG(IMR), INREG(IIR));
|
||||
|
||||
acthd = INREG(ACTHD_I965);
|
||||
ErrorF("acthd: 0x%08x dma_fadd_p: 0x%08x\n",
|
||||
acthd, INREG(DMA_FADD_P));
|
||||
ErrorF("ecoskpd: 0x%08x excc: 0x%08x\n",
|
||||
INREG(ECOSKPD), INREG(EXCC));
|
||||
|
||||
ErrorF("cache_mode: 0x%08x/0x%08x\n", INREG(CACHE_MODE_0),
|
||||
INREG(CACHE_MODE_1));
|
||||
ErrorF("mi_arb_state: 0x%08x\n", INREG(MI_ARB_STATE));
|
||||
|
||||
ErrorF("IA_VERTICES_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(IA_VERTICES_COUNT_QW),
|
||||
INREG(IA_VERTICES_COUNT_QW+4));
|
||||
ErrorF("IA_PRIMITIVES_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(IA_PRIMITIVES_COUNT_QW),
|
||||
INREG(IA_PRIMITIVES_COUNT_QW+4));
|
||||
|
||||
ErrorF("VS_INVOCATION_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(VS_INVOCATION_COUNT_QW),
|
||||
INREG(VS_INVOCATION_COUNT_QW+4));
|
||||
|
||||
ErrorF("GS_INVOCATION_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(GS_INVOCATION_COUNT_QW),
|
||||
INREG(GS_INVOCATION_COUNT_QW+4));
|
||||
ErrorF("GS_PRIMITIVES_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(GS_PRIMITIVES_COUNT_QW),
|
||||
INREG(GS_PRIMITIVES_COUNT_QW+4));
|
||||
|
||||
ErrorF("CL_INVOCATION_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(CL_INVOCATION_COUNT_QW),
|
||||
INREG(CL_INVOCATION_COUNT_QW+4));
|
||||
ErrorF("CL_PRIMITIVES_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(CL_PRIMITIVES_COUNT_QW),
|
||||
INREG(CL_PRIMITIVES_COUNT_QW+4));
|
||||
|
||||
ErrorF("PS_INVOCATION_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(PS_INVOCATION_COUNT_QW),
|
||||
INREG(PS_INVOCATION_COUNT_QW+4));
|
||||
ErrorF("PS_DEPTH_COUNT_QW 0x%08x/0x%08x\n",
|
||||
INREG(PS_DEPTH_COUNT_QW),
|
||||
INREG(PS_DEPTH_COUNT_QW+4));
|
||||
|
||||
ErrorF("WIZ_CTL 0x%08x\n", INREG(WIZ_CTL));
|
||||
ErrorF("TS_CTL 0x%08x TS_DEBUG_DATA 0x%08x\n", INREG(TS_CTL),
|
||||
INREG(TS_DEBUG_DATA));
|
||||
ErrorF("TD_CTL 0x%08x / 0x%08x\n",
|
||||
INREG(TD_CTL), INREG(TD_CTL2));
|
||||
i830_dump_ring (pScrn, acthd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the hardware error state bits.
|
||||
*
|
||||
* \return TRUE if any errors were found.
|
||||
*/
|
||||
Bool
|
||||
i830_check_error_state(ScrnInfoPtr pScrn)
|
||||
{
|
||||
I830Ptr pI830 = I830PTR(pScrn);
|
||||
int errors = 0;
|
||||
unsigned long temp, head, tail;
|
||||
|
||||
temp = INREG16(ESR);
|
||||
if (temp != 0) {
|
||||
Bool vertex_max = !IS_I965G(pI830) && (temp & ERR_VERTEX_MAX);
|
||||
Bool pgtbl = temp & ERR_PGTBL_ERROR;
|
||||
Bool underrun = !IS_I965G(pI830) &&
|
||||
(temp & ERR_DISPLAY_OVERLAY_UNDERRUN);
|
||||
Bool instruction = !IS_I965G(pI830) && (temp & ERR_INSTRUCTION_ERROR);
|
||||
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"ESR is 0x%08lx%s%s%s%s\n", temp,
|
||||
vertex_max ? ", max vertices exceeded" : "",
|
||||
pgtbl ? ", page table error" : "",
|
||||
underrun ? ", display/overlay underrun" : "",
|
||||
instruction ? ", instruction error" : "");
|
||||
errors++;
|
||||
}
|
||||
/* Check first for page table errors */
|
||||
if (!IS_I9XX(pI830)) {
|
||||
temp = INREG(PGE_ERR);
|
||||
if (temp != 0) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"PGTBL_ER is 0x%08lx\n", temp);
|
||||
errors++;
|
||||
}
|
||||
} else {
|
||||
temp = INREG(PGTBL_ER);
|
||||
if (temp != 0) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"PGTBL_ER is 0x%08lx"
|
||||
"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", temp,
|
||||
temp & PGTBL_ERR_HOST_GTT_PTE ? ", host gtt pte" : "",
|
||||
temp & PGTBL_ERR_HOST_PTE_DATA ? ", host pte data" : "",
|
||||
temp & PGTBL_ERR_DISPA_GTT_PTE ? ", display A pte" : "",
|
||||
temp & PGTBL_ERR_DISPA_TILING ?
|
||||
", display A tiling" : "",
|
||||
temp & PGTBL_ERR_DISPB_GTT_PTE ? ", display B pte" : "",
|
||||
temp & PGTBL_ERR_DISPB_TILING ?
|
||||
", display B tiling" : "",
|
||||
temp & PGTBL_ERR_DISPC_GTT_PTE ? ", display C pte" : "",
|
||||
temp & PGTBL_ERR_DISPC_TILING ?
|
||||
", display C tiling" : "",
|
||||
temp & PGTBL_ERR_OVERLAY_GTT_PTE ?
|
||||
", overlay GTT PTE" : "",
|
||||
temp & PGTBL_ERR_OVERLAY_TILING ?
|
||||
", overlay tiling" : "",
|
||||
temp & PGTBL_ERR_CS_GTT ? ", CS GTT" : "",
|
||||
temp & PGTBL_ERR_CS_INSTRUCTION_GTT_PTE ?
|
||||
", CS instruction GTT PTE" : "",
|
||||
temp & PGTBL_ERR_CS_VERTEXDATA_GTT_PTE ?
|
||||
", CS vertex data GTT PTE" : "",
|
||||
temp & PGTBL_ERR_BIN_INSTRUCTION_GTT_PTE ?
|
||||
", BIN instruction GTT PTE" : "",
|
||||
temp & PGTBL_ERR_BIN_VERTEXDATA_GTT_PTE ?
|
||||
", BIN vertex data GTT PTE" : "",
|
||||
temp & PGTBL_ERR_LC_GTT_PTE ? ", LC pte" : "",
|
||||
temp & PGTBL_ERR_LC_TILING ? ", LC tiling" : "",
|
||||
temp & PGTBL_ERR_MT_GTT_PTE ? ", MT pte" : "",
|
||||
temp & PGTBL_ERR_MT_TILING ? ", MT tiling" : "");
|
||||
errors++;
|
||||
}
|
||||
}
|
||||
temp = INREG(PGETBL_CTL);
|
||||
if (!(temp & 1)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"PGTBL_CTL (0x%08lx) indicates GTT is disabled\n", temp);
|
||||
errors++;
|
||||
}
|
||||
temp = INREG(LP_RING + RING_LEN);
|
||||
if (!pI830->have_gem && (temp & 1)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"PRB0_CTL (0x%08lx) indicates ring buffer enabled\n", temp);
|
||||
errors++;
|
||||
}
|
||||
head = INREG(LP_RING + RING_HEAD);
|
||||
tail = INREG(LP_RING + RING_TAIL);
|
||||
if ((tail & I830_TAIL_MASK) != (head & I830_HEAD_MASK)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"PRB0_HEAD (0x%08lx) and PRB0_TAIL (0x%08lx) indicate "
|
||||
"ring buffer not flushed\n", head, tail);
|
||||
errors++;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (errors) {
|
||||
if (IS_I965G(pI830))
|
||||
i965_dump_error_state(pScrn);
|
||||
else
|
||||
i830_dump_error_state(pScrn);
|
||||
}
|
||||
#endif
|
||||
|
||||
return (errors != 0);
|
||||
}
|
||||
#endif /* !REG_DUMPER */
|
||||
|
|
|
|||
|
|
@ -28,7 +28,4 @@
|
|||
void i830TakeRegSnapshot(ScrnInfoPtr pScrn);
|
||||
void i830CompareRegsToSnapshot(ScrnInfoPtr pScrn, char *where);
|
||||
void i830DumpRegs (ScrnInfoPtr pScrn);
|
||||
void i830_dump_error_state(ScrnInfoPtr pScrn);
|
||||
void i965_dump_error_state(ScrnInfoPtr pScrn);
|
||||
Bool i830_check_error_state(ScrnInfoPtr pScrn);
|
||||
|
||||
|
|
|
|||
|
|
@ -2992,11 +2992,6 @@ I830EnterVT(int scrnIndex, int flags)
|
|||
gen4_render_state_init(pScrn);
|
||||
|
||||
if (!pI830->use_drm_mode) {
|
||||
if (i830_check_error_state(pScrn)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"Existing errors found in hardware state.\n");
|
||||
}
|
||||
|
||||
/* Re-set up the ring. */
|
||||
if (!pI830->have_gem) {
|
||||
i830_stop_ring(pScrn, FALSE);
|
||||
|
|
|
|||
|
|
@ -1242,7 +1242,7 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
|
|||
drm_intel_bo_unreference(bind_bo);
|
||||
|
||||
#if WATCH_STATS
|
||||
i830_dump_error_state(pScrn);
|
||||
/* i830_dump_error_state(pScrn); */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue