1.1 --- a/src/sh4/dmac.c Tue Jan 01 05:08:38 2008 +0000
1.2 +++ b/src/sh4/dmac.c Fri Oct 31 01:07:44 2008 +0000
1.4 uint32_t oldval = DMA_CONTROL(channel);
1.6 MMIO_WRITE( DMAC, CHCR0 + (channel<<4), val );
1.9 /* If TE or IE are cleared, clear the interrupt request */
1.10 if( IS_CHANNEL_IRQ_ACTIVE(oldval) &&
1.11 - !IS_CHANNEL_IRQ_ACTIVE(val) )
1.12 - intc_clear_interrupt( INT_DMA_DMTE0+channel );
1.14 + !IS_CHANNEL_IRQ_ACTIVE(val) )
1.15 + intc_clear_interrupt( INT_DMA_DMTE0+channel );
1.17 resource = CHANNEL_RESOURCE(val);
1.18 if( IS_CHANNEL_ENABLED(val) ) {
1.19 - if( resource >= DMARES_MEMORY_TO_MEMORY_AUTO &&
1.20 - resource < DMARES_SCI_TRANSMIT_EMPTY ) {
1.23 + if( resource >= DMARES_MEMORY_TO_MEMORY_AUTO &&
1.24 + resource < DMARES_SCI_TRANSMIT_EMPTY ) {
1.29 /* Everything else we don't need to care about until we actually try to
1.34 - MMIO_WRITE( DMAC, reg, val );
1.36 + MMIO_WRITE( DMAC, reg, val );
1.38 case CHCR0: DMAC_set_control( 0, val ); break;
1.39 case CHCR1: DMAC_set_control( 1, val ); break;
1.40 case CHCR2: DMAC_set_control( 2, val ); break;
1.41 case CHCR3: DMAC_set_control( 3, val ); break;
1.43 - MMIO_WRITE( DMAC, reg, val );
1.44 + MMIO_WRITE( DMAC, reg, val );
1.48 @@ -118,46 +118,46 @@
1.49 uint32_t control = DMA_CONTROL(channel);
1.51 if( IS_CHANNEL_ENABLED(control) ) {
1.52 - uint32_t source = DMA_SOURCE(channel);
1.53 - uint32_t dest = DMA_DEST(channel);
1.54 - uint32_t count = DMA_COUNT( channel );
1.56 - count = 0x01000000;
1.57 - if( run_count == 0 || run_count > count )
1.58 - run_count = count;
1.59 - uint32_t xfersize = DMAC_xfer_size[ (control >> 4)&0x07 ];
1.60 - int source_step, dest_step;
1.61 - int resource = (control >> 8) & 0x0F;
1.62 - switch( (control >> 14) & 0x03 ) {
1.63 - case 0: dest_step = 0; break;
1.64 - case 1: dest_step = xfersize; break;
1.65 - case 2: dest_step = -xfersize; break;
1.66 - case 3: dest_step = 0; break; /* Illegal */
1.68 - switch( (control >> 12) & 0x03 ) {
1.69 - case 0: source_step = 0; break;
1.70 - case 1: source_step = xfersize; break;
1.71 - case 2: source_step = -xfersize; break;
1.72 - case 3: source_step = 0; break; /* Illegal */
1.75 - while( run_count > 0 ) {
1.77 - if( (resource & 0x02) == 0 ) {
1.78 - /* Source is a normal memory address */
1.85 - if( (resource & 0x01) == 0 ) {
1.86 - /* Destination is a normal memory address */
1.92 + uint32_t source = DMA_SOURCE(channel);
1.93 + uint32_t dest = DMA_DEST(channel);
1.94 + uint32_t count = DMA_COUNT( channel );
1.96 + count = 0x01000000;
1.97 + if( run_count == 0 || run_count > count )
1.98 + run_count = count;
1.99 + uint32_t xfersize = DMAC_xfer_size[ (control >> 4)&0x07 ];
1.100 + int source_step, dest_step;
1.101 + int resource = (control >> 8) & 0x0F;
1.102 + switch( (control >> 14) & 0x03 ) {
1.103 + case 0: dest_step = 0; break;
1.104 + case 1: dest_step = xfersize; break;
1.105 + case 2: dest_step = -xfersize; break;
1.106 + case 3: dest_step = 0; break; /* Illegal */
1.108 + switch( (control >> 12) & 0x03 ) {
1.109 + case 0: source_step = 0; break;
1.110 + case 1: source_step = xfersize; break;
1.111 + case 2: source_step = -xfersize; break;
1.112 + case 3: source_step = 0; break; /* Illegal */
1.115 + while( run_count > 0 ) {
1.117 + if( (resource & 0x02) == 0 ) {
1.118 + /* Source is a normal memory address */
1.124 + /* Destination */
1.125 + if( (resource & 0x01) == 0 ) {
1.126 + /* Destination is a normal memory address */
1.135 @@ -177,14 +177,14 @@
1.138 if( !IS_CHANNEL_ENABLED(control) || !IS_DMAC_ENABLED() )
1.143 if( ((control >> 8) & 0x0F) != DMARES_MEMORY_TO_DEVICE ) {
1.153 source = DMA_SOURCE(channel);
1.154 count = DMA_COUNT(channel);
1.155 if( count == 0 ) count = 0x01000000;
1.156 @@ -192,33 +192,33 @@
1.157 size = DMAC_xfer_size[ (control >> 4)&0x07 ];
1.158 run_count = numBytes / size;
1.159 if( run_count > count || run_count == 0 )
1.160 - run_count = count;
1.161 + run_count = count;
1.163 /* Do copy - FIXME: doesn't work when crossing regions */
1.164 sh4ptr_t region = mem_get_region( source );
1.165 switch( (control >> 12) & 0x03 ) {
1.167 - memcpy( tmp, region, size );
1.168 - for( i=0; i<run_count; i++ ) {
1.169 - memcpy( buf, tmp, size );
1.173 + memcpy( tmp, region, size );
1.174 + for( i=0; i<run_count; i++ ) {
1.175 + memcpy( buf, tmp, size );
1.180 - i = run_count * size;
1.181 - memcpy( buf, region, i );
1.184 + i = run_count * size;
1.185 + memcpy( buf, region, i );
1.189 - for( i=0; i<run_count; i++ ) {
1.190 - memcpy( buf, region, size );
1.194 - source -= (run_count * size);
1.196 + for( i=0; i<run_count; i++ ) {
1.197 + memcpy( buf, region, size );
1.201 + source -= (run_count * size);
1.204 - return 0; /* Illegal */
1.205 + return 0; /* Illegal */
1.208 /* Update the channel registers */
1.209 @@ -226,10 +226,10 @@
1.210 MMIO_WRITE( DMAC, SAR0 + (channel<<4), source );
1.211 MMIO_WRITE( DMAC, DMATCR0 + (channel<<4), count );
1.213 - control |= CHCR_TE;
1.214 - if( IS_CHANNEL_IRQ_ENABLED(control) )
1.215 - intc_raise_interrupt( INT_DMA_DMTE0 + channel );
1.216 - MMIO_WRITE( DMAC, CHCR0 + (channel<<4), control );
1.217 + control |= CHCR_TE;
1.218 + if( IS_CHANNEL_IRQ_ENABLED(control) )
1.219 + intc_raise_interrupt( INT_DMA_DMTE0 + channel );
1.220 + MMIO_WRITE( DMAC, CHCR0 + (channel<<4), control );
1.223 return run_count * size;
1.224 @@ -241,13 +241,13 @@
1.225 uint32_t dest, count, run_count, size, i;
1.227 if( !IS_CHANNEL_ENABLED(control) || !IS_DMAC_ENABLED() )
1.232 if( ((control >> 8) & 0x0F) != DMARES_DEVICE_TO_MEMORY ) {
1.240 dest = DMA_DEST(channel);
1.241 count = DMA_COUNT(channel);
1.242 if( count == 0 ) count = 0x01000000;
1.243 @@ -255,33 +255,33 @@
1.244 size = DMAC_xfer_size[ (control >> 4)&0x07 ];
1.245 run_count = numBytes / size;
1.246 if( run_count > count || run_count == 0 )
1.247 - run_count = count;
1.248 + run_count = count;
1.250 /* Do copy - FIXME: doesn't work when crossing regions */
1.251 sh4ptr_t region = mem_get_region( dest );
1.252 switch( (control >> 12) & 0x03 ) {
1.254 - for( i=0; i<run_count; i++ ) {
1.255 - /* Doesn't make a whole lot of sense, but hey... */
1.256 - memcpy( region, buf, size );
1.260 + for( i=0; i<run_count; i++ ) {
1.261 + /* Doesn't make a whole lot of sense, but hey... */
1.262 + memcpy( region, buf, size );
1.267 - i = run_count * size;
1.268 - memcpy( region, buf, i );
1.271 + i = run_count * size;
1.272 + memcpy( region, buf, i );
1.276 - for( i=0; i<run_count; i++ ) {
1.277 - memcpy( region, buf, size );
1.281 - dest -= (run_count * size);
1.283 + for( i=0; i<run_count; i++ ) {
1.284 + memcpy( region, buf, size );
1.288 + dest -= (run_count * size);
1.291 - return 0; /* Illegal */
1.292 + return 0; /* Illegal */
1.295 /* Update the channel registers */
1.296 @@ -289,10 +289,10 @@
1.297 MMIO_WRITE( DMAC, DAR0 + (channel<<4), dest );
1.298 MMIO_WRITE( DMAC, DMATCR0 + (channel<<4), count );
1.300 - control |= CHCR_TE;
1.301 - if( IS_CHANNEL_IRQ_ENABLED(control) )
1.302 - intc_raise_interrupt( INT_DMA_DMTE0 + channel );
1.303 - MMIO_WRITE( DMAC, CHCR0 + (channel<<4), control );
1.304 + control |= CHCR_TE;
1.305 + if( IS_CHANNEL_IRQ_ENABLED(control) )
1.306 + intc_raise_interrupt( INT_DMA_DMTE0 + channel );
1.307 + MMIO_WRITE( DMAC, CHCR0 + (channel<<4), control );
1.309 return run_count * size;
1.311 @@ -316,37 +316,37 @@
1.314 if( !IS_DMAC_ENABLED() )
1.317 for( i=0; i<4; i++ ) {
1.318 - uint32_t control = DMA_CONTROL(i);
1.319 - if( IS_CHANNEL_ENABLED(control) ) {
1.320 - uint32_t channel_res = CHANNEL_RESOURCE(control);
1.321 - switch( resource ) {
1.322 - case DMAC_EXTERNAL:
1.323 - if( channel_res == DMARES_MEMORY_TO_MEMORY )
1.324 - DMAC_run_channel(i,1);
1.326 - case DMAC_SCI_TDE:
1.327 - if( channel_res == DMARES_SCI_TRANSMIT_EMPTY )
1.328 - DMAC_run_channel(i,1);
1.330 - case DMAC_SCI_RDF:
1.331 - if( channel_res == DMARES_SCI_RECEIVE_FULL )
1.332 - DMAC_run_channel(i,1);
1.334 - case DMAC_SCIF_TDE:
1.335 - if( channel_res == DMARES_SCIF_TRANSMIT_EMPTY )
1.336 - DMAC_run_channel(i,1);
1.338 - case DMAC_SCIF_RDF:
1.339 - if( channel_res == DMARES_SCIF_RECEIVE_FULL )
1.340 - DMAC_run_channel(i,1);
1.342 - case DMAC_TMU_ICI:
1.343 - if( channel_res >= DMARES_MEMORY_TO_MEMORY_TMU )
1.344 - DMAC_run_channel(i,1);
1.348 + uint32_t control = DMA_CONTROL(i);
1.349 + if( IS_CHANNEL_ENABLED(control) ) {
1.350 + uint32_t channel_res = CHANNEL_RESOURCE(control);
1.351 + switch( resource ) {
1.352 + case DMAC_EXTERNAL:
1.353 + if( channel_res == DMARES_MEMORY_TO_MEMORY )
1.354 + DMAC_run_channel(i,1);
1.356 + case DMAC_SCI_TDE:
1.357 + if( channel_res == DMARES_SCI_TRANSMIT_EMPTY )
1.358 + DMAC_run_channel(i,1);
1.360 + case DMAC_SCI_RDF:
1.361 + if( channel_res == DMARES_SCI_RECEIVE_FULL )
1.362 + DMAC_run_channel(i,1);
1.364 + case DMAC_SCIF_TDE:
1.365 + if( channel_res == DMARES_SCIF_TRANSMIT_EMPTY )
1.366 + DMAC_run_channel(i,1);
1.368 + case DMAC_SCIF_RDF:
1.369 + if( channel_res == DMARES_SCIF_RECEIVE_FULL )
1.370 + DMAC_run_channel(i,1);
1.372 + case DMAC_TMU_ICI:
1.373 + if( channel_res >= DMARES_MEMORY_TO_MEMORY_TMU )
1.374 + DMAC_run_channel(i,1);