Byte swapping for vertex DMA data and DMA descriptors

This commit is contained in:
Leif Delgass 2002-04-28 04:33:56 +00:00
parent 121100a515
commit 2558b54aa0
3 changed files with 24 additions and 21 deletions

View file

@ -260,8 +260,9 @@ static void mach64_bm_dma_test( drm_device_t *dev )
MACH64_READ( MACH64_VERTEX_1_ARGB ) );
DRM_INFO( "(Before DMA Transfer) VERTEX_1_X_Y = 0x%08x\n",
MACH64_READ( MACH64_VERTEX_1_X_Y ) );
data[0] = 0x00060190; /* a0 = PAT_REG0 */
/* a0 = PAT_REG0 */
/* 1_90 = VERTEX_1_S, setup 7 sequential reg writes */
data[0] = cpu_to_le32(0x00060190);
data[1] = 0x11111111;
data[2] = 0x22222222;
data[3] = 0x33333333;
@ -269,13 +270,13 @@ static void mach64_bm_dma_test( drm_device_t *dev )
data[5] = 0x55555555;
data[6] = 0x66666666;
data[7] = 0x77777777;
data[8] = 0x0000006d;
data[8] = cpu_to_le32(0x0000006d);
data[9] = 0x00000000;
DRM_INFO( "Preparing table ...\n" );
table[0] = MACH64_BM_ADDR + APERTURE_OFFSET;
table[1] = data_addr;
table[2] = 10 * sizeof( u32 ) | 0x80000000 | 0x40000000;
table[0] = cpu_to_le32(MACH64_BM_ADDR + APERTURE_OFFSET);
table[1] = cpu_to_le32(data_addr);
table[2] = cpu_to_le32(10 * sizeof( u32 ) | 0x80000000 | 0x40000000);
table[3] = 0;
DRM_INFO( "table[0] = 0x%08x\n", table[0] );

View file

@ -345,6 +345,9 @@ extern int mach64_dma_vertex( struct inode *inode, struct file *filp,
#define MACH64_CRTC_INT_CNTL 0x0418
/* Constants */
#define MACH64_LAST_FRAME_REG MACH64_SCRATCH_REG0
#define MACH64_LAST_DISPATCH_REG MACH64_SCRATCH_REG1
#define MACH64_BASE(reg) ((u32)(dev_priv->mmio->handle))

View file

@ -447,7 +447,7 @@ static void mach64_dma_dispatch_vertex( drm_device_t *dev,
}
/* SRC_CNTL */
p[(size/4) ] = 0x0000006d;
p[(size/4) ] = cpu_to_le32(0x0000006d);
p[(size/4)+1] = 0x00000000;
size += 8;
pages = (size + DMA_CHUNKSIZE - 1) / DMA_CHUNKSIZE;
@ -455,9 +455,9 @@ static void mach64_dma_dispatch_vertex( drm_device_t *dev,
for ( i = 0 ; i < pages-1 ; i++ ) {
page = address + i * DMA_CHUNKSIZE;
table_ptr[DMA_FRAME_BUF_OFFSET] = MACH64_BM_ADDR + APERTURE_OFFSET;
table_ptr[DMA_SYS_MEM_ADDR] = page;
table_ptr[DMA_COMMAND] = DMA_CHUNKSIZE | 0x40000000;
table_ptr[DMA_FRAME_BUF_OFFSET] = cpu_to_le32(MACH64_BM_ADDR + APERTURE_OFFSET);
table_ptr[DMA_SYS_MEM_ADDR] = cpu_to_le32(page);
table_ptr[DMA_COMMAND] = cpu_to_le32(DMA_CHUNKSIZE | 0x40000000);
table_ptr[DMA_RESERVED] = 0;
tableDwords += 4;
@ -467,9 +467,9 @@ static void mach64_dma_dispatch_vertex( drm_device_t *dev,
/* generate the final descriptor for any remaining commands */
page = address + i * DMA_CHUNKSIZE;
remainder = size - i * DMA_CHUNKSIZE;
table_ptr[DMA_FRAME_BUF_OFFSET] = MACH64_BM_ADDR + APERTURE_OFFSET;
table_ptr[DMA_SYS_MEM_ADDR] = page;
table_ptr[DMA_COMMAND] = remainder | 0x80000000 | 0x40000000;
table_ptr[DMA_FRAME_BUF_OFFSET] = cpu_to_le32(MACH64_BM_ADDR + APERTURE_OFFSET);
table_ptr[DMA_SYS_MEM_ADDR] = cpu_to_le32(page);
table_ptr[DMA_COMMAND] = cpu_to_le32(remainder | 0x80000000 | 0x40000000);
table_ptr[DMA_RESERVED] = 0;
tableDwords += 4;
@ -527,7 +527,7 @@ static void mach64_dma_dispatch_vertex( drm_device_t *dev,
while ( used ) {
u32 reg, count;
reg = *p++;
reg = le32_to_cpu(*p++);
used--;
count = (reg >> 16) + 1;
@ -543,8 +543,8 @@ static void mach64_dma_dispatch_vertex( drm_device_t *dev,
}
--fifo;
MACH64_WRITE( reg, *p++ );
/* data is already little-endian */
MACH64_DEREF(reg) = *p++;
used--;
reg += 4;
@ -561,12 +561,11 @@ static void mach64_dma_dispatch_vertex( drm_device_t *dev,
buf_priv->age = dev_priv->sarea_priv->last_dispatch;
/* Emit the vertex buffer age */
BEGIN_RING( 2 );
DMAGETPTR( dev_priv, 1 );
OUT_RING( CCE_PACKET0( MACH64_LAST_DISPATCH_REG, 0 ) );
OUT_RING( buf_priv->age );
ADVANCE_RING();
DMAOUTREG( MACH64_LAST_DISPATCH_REG, buf_priv->age );
DMAADVANCE( dev_priv );
buf->pending = 1;
buf->used = 0;