1.1 --- a/src/asic.c Wed Jan 17 21:27:20 2007 +0000
1.2 +++ b/src/asic.c Thu Jan 18 11:14:01 2007 +0000
1.5 - * $Id: asic.c,v 1.24 2007-01-17 21:27:20 nkeynes Exp $
1.6 + * $Id: asic.c,v 1.25 2007-01-18 11:14:01 nkeynes Exp $
1.8 * Support for the miscellaneous ASIC functions (Primarily event multiplexing,
1.10 @@ -217,13 +217,27 @@
1.11 intc_raise_interrupt( INT_IRQ11 );
1.12 if( result & MMIO_READ(ASIC, IRQC0 + offset) )
1.13 intc_raise_interrupt( INT_IRQ9 );
1.15 + if( event >= 64 ) { /* Third word */
1.16 + asic_event( EVENT_CASCADE2 );
1.17 + } else if( event >= 32 ) { /* Second word */
1.18 + asic_event( EVENT_CASCADE1 );
1.22 void asic_clear_event( int event ) {
1.23 int offset = ((event&0x60)>>3);
1.24 uint32_t result = MMIO_READ(ASIC, PIRQ0 + offset) & (~(1<<(event&0x1F)));
1.25 MMIO_WRITE( ASIC, PIRQ0 + offset, result );
1.27 + if( result == 0 ) {
1.28 + /* clear cascades if necessary */
1.29 + if( event >= 64 ) {
1.30 + MMIO_WRITE( ASIC, PIRQ0, MMIO_READ( ASIC, PIRQ0 ) & 0x7FFFFFFF );
1.31 + } else if( event >= 32 ) {
1.32 + MMIO_WRITE( ASIC, PIRQ0, MMIO_READ( ASIC, PIRQ0 ) & 0xBFFFFFFF );
1.36 asic_check_cleared_events();
1.39 @@ -297,12 +311,19 @@
1.43 - val = val & 0xFFFFFFFE; /* Prevent the IDE event from clearing */
1.45 + break; /* Treat this as read-only for the moment */
1.47 + val = val & 0x3FFFFFFF; /* Top two bits aren't clearable */
1.48 + MMIO_WRITE( ASIC, reg, MMIO_READ(ASIC, reg)&~val );
1.49 + asic_check_cleared_events();
1.52 - /* Clear any interrupts */
1.53 - MMIO_WRITE( ASIC, reg, MMIO_READ(ASIC, reg)&~val );
1.54 + /* Clear any events */
1.55 + val = MMIO_READ(ASIC, reg)&(~val);
1.56 + MMIO_WRITE( ASIC, reg, val );
1.57 + if( val == 0 ) { /* all clear - clear the cascade bit */
1.58 + MMIO_WRITE( ASIC, PIRQ0, MMIO_READ( ASIC, PIRQ0 ) & 0x7FFFFFFF );
1.60 asic_check_cleared_events();