filename | src/asic.c |
changeset | 1269:50c63f63bf8f |
prev | 1237:377077d10d62 |
author | nkeynes |
date | Mon Mar 12 18:06:24 2012 +1000 (12 years ago) |
permissions | -rw-r--r-- |
last change | Break large PVR dma transfers up into blocks to avoid potentially allocating 8MB+ on the stack. Patch from guinux, thanks! |
file | annotate | diff | log | raw |
1.1 --- a/src/asic.c Sat Feb 25 09:56:10 2012 +10001.2 +++ b/src/asic.c Mon Mar 12 18:06:24 2012 +10001.3 @@ -337,17 +337,25 @@1.4 {1.5 sh4addr_t destaddr = MMIO_READ( ASIC, PVRDMADEST) &0x1FFFFFE0;1.6 uint32_t count = MMIO_READ( ASIC, PVRDMACNT );1.7 - unsigned char *data = alloca( count );1.8 - uint32_t rcount = DMAC_get_buffer( 2, data, count );1.9 - if( rcount != count )1.10 - WARN( "PVR received %08X bytes from DMA, expected %08X", rcount, count );1.11 + unsigned char data[8192];1.12 + uint32_t rcount;1.14 - pvr2_dma_write( destaddr, data, rcount );1.15 + while( count ) {1.16 + uint32_t chunksize = (count < 8192) ? count : 8192;1.17 + rcount = DMAC_get_buffer( 2, data, chunksize );1.18 + pvr2_dma_write( destaddr, data, rcount );1.19 + destaddr += rcount;1.20 + count -= rcount;1.21 + if( rcount != chunksize ) {1.22 + WARN( "PVR received %08X bytes from DMA, expected %08X", rcount, chunksize );1.23 + break;1.24 + }1.25 + }1.27 MMIO_WRITE( ASIC, PVRDMACTL, 0 );1.28 MMIO_WRITE( ASIC, PVRDMACNT, 0 );1.29 if( destaddr & 0x01000000 ) { /* Write to texture RAM */1.30 - MMIO_WRITE( ASIC, PVRDMADEST, destaddr + rcount );1.31 + MMIO_WRITE( ASIC, PVRDMADEST, destaddr );1.32 }1.33 asic_event( EVENT_PVR_DMA );1.34 }
.