13 * 1) Does changing the mask after event occurance result in the
14 * interrupt being delivered immediately?
15 * 2) If the pending register is not cleared after an interrupt, does
16 * the interrupt line remain high? (ie does the IRQ reoccur?)
17 * TODO: Logic diagram of ASIC event/interrupt logic.
19 * ... don't even get me started on the "EXTDMA" page, about which, apparently,
20 * practically nothing is publicly known...
23 void asic_init( void )
25 register_io_region( &mmio_region_ASIC );
26 register_io_region( &mmio_region_EXTDMA );
27 mmio_region_ASIC.trace_flag = 0; /* Because this is called so often */
28 asic_event( EVENT_GDROM_CMD );
31 void mmio_region_ASIC_write( uint32_t reg, uint32_t val )
37 /* Clear any interrupts */
38 MMIO_WRITE( ASIC, reg, MMIO_READ(ASIC, reg)&~val );
41 MMIO_WRITE( ASIC, reg, val );
43 uint32_t maple_addr = MMIO_READ( ASIC, MAPLE_DMA) &0x1FFFFFE0;
44 WARN( "Maple request initiated at %08X, halting", maple_addr );
45 maple_handle_buffer( maple_addr );
46 MMIO_WRITE( ASIC, reg, 0 );
51 MMIO_WRITE( ASIC, reg, val );
52 WARN( "Write to ASIC (%03X <= %08X) [%s: %s]",
53 reg, val, MMIO_REGID(ASIC,reg), MMIO_REGDESC(ASIC,reg) );
57 int32_t mmio_region_ASIC_read( uint32_t reg )
69 val = MMIO_READ(ASIC, reg);
70 // WARN( "Read from ASIC (%03X => %08X) [%s: %s]",
71 // reg, val, MMIO_REGID(ASIC,reg), MMIO_REGDESC(ASIC,reg) );
74 return 0; /* find out later if there's any cases we actually need to care about */
76 val = MMIO_READ(ASIC, reg);
77 WARN( "Read from ASIC (%03X => %08X) [%s: %s]",
78 reg, val, MMIO_REGID(ASIC,reg), MMIO_REGDESC(ASIC,reg) );
84 void asic_event( int event )
86 int offset = ((event&0x60)>>3);
87 int result = (MMIO_READ(ASIC, PIRQ0 + offset)) |= (1<<(event&0x1F));
89 if( result & MMIO_READ(ASIC, IRQA0 + offset) )
90 intc_raise_interrupt( INT_IRQ13 );
91 if( result & MMIO_READ(ASIC, IRQB0 + offset) )
92 intc_raise_interrupt( INT_IRQ11 );
93 if( result & MMIO_READ(ASIC, IRQC0 + offset) )
94 intc_raise_interrupt( INT_IRQ9 );
99 MMIO_REGION_WRITE_FN( EXTDMA, reg, val )
102 case IDEALTSTATUS: /* Device control */
103 ide_write_control( val );
106 ide_write_data_pio( val );
109 if( ide_can_write_regs() )
110 idereg.feature = (uint8_t)val;
113 if( ide_can_write_regs() )
114 idereg.count = (uint8_t)val;
117 if( ide_can_write_regs() )
118 idereg.lba0 = (uint8_t)val;
121 if( ide_can_write_regs() )
122 idereg.lba1 = (uint8_t)val;
125 if( ide_can_write_regs() )
126 idereg.lba2 = (uint8_t)val;
129 if( ide_can_write_regs() )
130 idereg.device = (uint8_t)val;
133 if( ide_can_write_regs() ) {
134 ide_clear_interrupt();
135 ide_write_command( (uint8_t)val );
140 MMIO_WRITE( EXTDMA, reg, val );
144 MMIO_REGION_READ_FN( EXTDMA, reg )
147 case IDEALTSTATUS: return idereg.status;
148 case IDEDATA: return ide_read_data_pio( );
149 case IDEFEAT: return idereg.error;
150 case IDECOUNT:return idereg.count;
151 case IDELBA0: return idereg.disc;
152 case IDELBA1: return idereg.lba1;
153 case IDELBA2: return idereg.lba2;
154 case IDEDEV: return idereg.device;
156 ide_clear_interrupt();
157 return idereg.status;
159 return MMIO_READ( EXTDMA, reg );
.