1.1 --- a/src/asic.c Wed Feb 15 13:11:50 2006 +0000
1.2 +++ b/src/asic.c Thu Mar 30 11:26:45 2006 +0000
1.5 - * $Id: asic.c,v 1.12 2006-02-15 13:11:42 nkeynes Exp $
1.6 + * $Id: asic.c,v 1.13 2006-03-22 14:29:00 nkeynes Exp $
1.8 * Support for the miscellaneous ASIC functions (Primarily event multiplexing,
1.11 register_io_region( &mmio_region_ASIC );
1.12 register_io_region( &mmio_region_EXTDMA );
1.13 mmio_region_ASIC.trace_flag = 0; /* Because this is called so often */
1.14 - asic_event( EVENT_GDROM_CMD );
1.17 void mmio_region_ASIC_write( uint32_t reg, uint32_t val )
1.21 + val = val & 0xFFFFFFFE; /* Prevent the IDE event from clearing */
1.26 /* Clear any interrupts */
1.27 MMIO_WRITE( ASIC, reg, MMIO_READ(ASIC, reg)&~val );
1.28 @@ -143,6 +144,14 @@
1.29 intc_raise_interrupt( INT_IRQ9 );
1.32 +void asic_clear_event( int event ) {
1.33 + int offset = ((event&0x60)>>3);
1.34 + uint32_t result = MMIO_READ(ASIC, PIRQ0 + offset) & (~(1<<(event&0x1F)));
1.35 + MMIO_WRITE( ASIC, PIRQ0 + offset, result );
1.37 + asic_check_cleared_events();
1.40 void asic_check_cleared_events( )
1.42 int i, setA = 0, setB = 0, setC = 0;
1.43 @@ -164,46 +173,55 @@
1.45 MMIO_REGION_WRITE_FN( EXTDMA, reg, val )
1.47 + WARN( "EXTDMA write %08X <= %08X", reg, val );
1.50 - case IDEALTSTATUS: /* Device control */
1.51 - ide_write_control( val );
1.54 - ide_write_data_pio( val );
1.57 - if( ide_can_write_regs() )
1.58 - idereg.feature = (uint8_t)val;
1.61 - if( ide_can_write_regs() )
1.62 - idereg.count = (uint8_t)val;
1.65 - if( ide_can_write_regs() )
1.66 - idereg.lba0 = (uint8_t)val;
1.69 - if( ide_can_write_regs() )
1.70 - idereg.lba1 = (uint8_t)val;
1.73 - if( ide_can_write_regs() )
1.74 - idereg.lba2 = (uint8_t)val;
1.77 - if( ide_can_write_regs() )
1.78 - idereg.device = (uint8_t)val;
1.81 - if( ide_can_write_regs() ) {
1.82 - ide_clear_interrupt();
1.83 - ide_write_command( (uint8_t)val );
1.87 - WARN( "EXTDMA write %08X <= %08X", reg, val );
1.89 + case IDEALTSTATUS: /* Device control */
1.90 + ide_write_control( val );
1.93 + ide_write_data_pio( val );
1.96 + if( ide_can_write_regs() )
1.97 + idereg.feature = (uint8_t)val;
1.100 + if( ide_can_write_regs() )
1.101 + idereg.count = (uint8_t)val;
1.104 + if( ide_can_write_regs() )
1.105 + idereg.lba0 = (uint8_t)val;
1.108 + if( ide_can_write_regs() )
1.109 + idereg.lba1 = (uint8_t)val;
1.112 + if( ide_can_write_regs() )
1.113 + idereg.lba2 = (uint8_t)val;
1.116 + if( ide_can_write_regs() )
1.117 + idereg.device = (uint8_t)val;
1.120 + if( ide_can_write_regs() ) {
1.121 + ide_write_command( (uint8_t)val );
1.126 + MMIO_WRITE( EXTDMA, reg, val );
1.127 + if( MMIO_READ( EXTDMA, IDEDMACTL1 ) == 1 &&
1.128 + MMIO_READ( EXTDMA, IDEDMACTL2 ) == 1 ) {
1.129 + uint32_t target_addr = MMIO_READ( EXTDMA, IDEDMASH4 );
1.130 + uint32_t length = MMIO_READ( EXTDMA, IDEDMASIZ );
1.131 + int dir = MMIO_READ( EXTDMA, IDEDMADIR );
1.135 MMIO_WRITE( EXTDMA, reg, val );
1.138 @@ -221,8 +239,7 @@
1.139 case IDELBA2: return idereg.lba2;
1.140 case IDEDEV: return idereg.device;
1.142 - ide_clear_interrupt();
1.143 - return idereg.status;
1.144 + return ide_read_status();
1.146 val = MMIO_READ( EXTDMA, reg );
1.147 //DEBUG( "EXTDMA read %08X => %08X", reg, val );