summaryrefslogtreecommitdiff
path: root/linux/mach64_dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/mach64_dma.c')
-rw-r--r--linux/mach64_dma.c80
1 files changed, 53 insertions, 27 deletions
diff --git a/linux/mach64_dma.c b/linux/mach64_dma.c
index ce48534d..e35cc22d 100644
--- a/linux/mach64_dma.c
+++ b/linux/mach64_dma.c
@@ -364,18 +364,28 @@ void mach64_dump_engine_info( drm_mach64_private_t *dev_priv )
DRM_INFO( "\n" );
}
+#define MACH64_DUMP_CONTEXT 3
+
void mach64_dump_buf_info( drm_mach64_private_t *dev_priv, drm_buf_t *buf)
{
u32 addr = GETBUFADDR( buf );
u32 used = buf->used >> 2;
-
+ u32 sys_addr = MACH64_READ( MACH64_BM_SYSTEM_MEM_ADDR );
u32 *p = GETBUFPTR( buf );
+ int skipped = 0;
+ DRM_INFO( "buffer contents:\n" );
+
while ( used ) {
u32 reg, count;
reg = le32_to_cpu(*p++);
- DRM_INFO("%08x: 0x%08x\n", addr, reg);
+ if( addr <= GETBUFADDR( buf ) + MACH64_DUMP_CONTEXT * 4 ||
+ (addr >= sys_addr - MACH64_DUMP_CONTEXT * 4 &&
+ addr <= sys_addr + MACH64_DUMP_CONTEXT * 4) ||
+ addr >= GETBUFADDR( buf ) + buf->used - MACH64_DUMP_CONTEXT * 4) {
+ DRM_INFO("%08x: 0x%08x\n", addr, reg);
+ }
addr += 4;
used--;
@@ -383,7 +393,18 @@ void mach64_dump_buf_info( drm_mach64_private_t *dev_priv, drm_buf_t *buf)
reg = reg & 0xffff;
reg = MMSELECT( reg );
while ( count && used ) {
- DRM_INFO("%08x: 0x%04x = 0x%08x\n", addr, reg, le32_to_cpu(*p));
+ if( addr <= GETBUFADDR( buf ) + MACH64_DUMP_CONTEXT * 4 ||
+ (addr >= sys_addr - MACH64_DUMP_CONTEXT * 4 &&
+ addr <= sys_addr + MACH64_DUMP_CONTEXT * 4) ||
+ addr >= GETBUFADDR( buf ) + buf->used - MACH64_DUMP_CONTEXT * 4) {
+ DRM_INFO("%08x: 0x%04x = 0x%08x\n", addr, reg, le32_to_cpu(*p));
+ skipped = 0;
+ } else {
+ if( !skipped ) {
+ DRM_INFO( " ...\n" );
+ skipped = 1;
+ }
+ }
p++;
addr += 4;
used--;
@@ -392,39 +413,44 @@ void mach64_dump_buf_info( drm_mach64_private_t *dev_priv, drm_buf_t *buf)
count--;
}
}
+
+ DRM_INFO( "\n" );
}
void mach64_dump_ring_info( drm_mach64_private_t *dev_priv )
{
drm_mach64_descriptor_ring_t *ring = &dev_priv->ring;
- int i, i0, i1;
+ int i, skipped;
DRM_INFO( "\n" );
- DRM_INFO("ring head_addr: 0x%08x head: %d tail: %d\n", ring->head_addr, ring->head, ring->tail );
-
- if ( ring->head <= ring->tail ) {
- i0 = ring->head;
- i1 = ring->tail;
- } else {
- i0 = ring->tail;
- i1 = ring->head;
- }
+ DRM_INFO("ring contents:\n");
+ DRM_INFO("\thead_addr: 0x%08x head: %d tail: %d\n\n", ring->head_addr, ring->head, ring->tail );
- if ( (i0 = (i0 - 16) & 0xfffffff0) < 0)
- i0 = 0;
- if ( (i1 = (i1 + 16) & 0xfffffff0) > ring->size / sizeof(u32) )
- i1 = ring->size / sizeof(u32);
- for ( i = i0; i < i1; i += 4) {
- DRM_INFO( " 0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x%s%s\n",
- ring->start_addr + i * sizeof(u32),
- le32_to_cpu(((u32*) ring->start)[i + 0]),
- le32_to_cpu(((u32*) ring->start)[i + 1]),
- le32_to_cpu(((u32*) ring->start)[i + 2]),
- le32_to_cpu(((u32*) ring->start)[i + 3]),
- i == ring->head ? " (head)" : "",
- i == ring->tail ? " (tail)" : ""
- );
+ skipped = 0;
+ for ( i = 0; i < ring->size / sizeof(u32); i += 4) {
+ if( i <= MACH64_DUMP_CONTEXT * 4 ||
+ i >= ring->size / sizeof(u32) - MACH64_DUMP_CONTEXT * 4 ||
+ (i >= ring->tail - MACH64_DUMP_CONTEXT * 4 &&
+ i <= ring->tail + MACH64_DUMP_CONTEXT * 4) ||
+ (i >= ring->head - MACH64_DUMP_CONTEXT * 4 &&
+ i <= ring->head + MACH64_DUMP_CONTEXT * 4)) {
+ DRM_INFO( " 0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x%s%s\n",
+ ring->start_addr + i * sizeof(u32),
+ le32_to_cpu(((u32*) ring->start)[i + 0]),
+ le32_to_cpu(((u32*) ring->start)[i + 1]),
+ le32_to_cpu(((u32*) ring->start)[i + 2]),
+ le32_to_cpu(((u32*) ring->start)[i + 3]),
+ i == ring->head ? " (head)" : "",
+ i == ring->tail ? " (tail)" : ""
+ );
+ skipped = 0;
+ } else {
+ if( !skipped ) {
+ DRM_INFO( " ...\n" );
+ skipped = 1;
+ }
+ }
}
DRM_INFO( "\n" );