1*8044SWilliam.Kucharski@Sun.COM /* 2*8044SWilliam.Kucharski@Sun.COM * Basic support for controlling the 8259 Programmable Interrupt Controllers. 3*8044SWilliam.Kucharski@Sun.COM * 4*8044SWilliam.Kucharski@Sun.COM * Initially written by Michael Brown (mcb30). 5*8044SWilliam.Kucharski@Sun.COM */ 6*8044SWilliam.Kucharski@Sun.COM 7*8044SWilliam.Kucharski@Sun.COM #ifndef PIC8259_H 8*8044SWilliam.Kucharski@Sun.COM #define PIC8259_H 9*8044SWilliam.Kucharski@Sun.COM 10*8044SWilliam.Kucharski@Sun.COM /* For segoff_t */ 11*8044SWilliam.Kucharski@Sun.COM #include <segoff.h> 12*8044SWilliam.Kucharski@Sun.COM 13*8044SWilliam.Kucharski@Sun.COM #define IRQ_PIC_CUTOFF (8) 14*8044SWilliam.Kucharski@Sun.COM 15*8044SWilliam.Kucharski@Sun.COM /* 8259 register locations */ 16*8044SWilliam.Kucharski@Sun.COM #define PIC1_ICW1 (0x20) 17*8044SWilliam.Kucharski@Sun.COM #define PIC1_OCW2 (0x20) 18*8044SWilliam.Kucharski@Sun.COM #define PIC1_OCW3 (0x20) 19*8044SWilliam.Kucharski@Sun.COM #define PIC1_ICR (0x20) 20*8044SWilliam.Kucharski@Sun.COM #define PIC1_IRR (0x20) 21*8044SWilliam.Kucharski@Sun.COM #define PIC1_ISR (0x20) 22*8044SWilliam.Kucharski@Sun.COM #define PIC1_ICW2 (0x21) 23*8044SWilliam.Kucharski@Sun.COM #define PIC1_ICW3 (0x21) 24*8044SWilliam.Kucharski@Sun.COM #define PIC1_ICW4 (0x21) 25*8044SWilliam.Kucharski@Sun.COM #define PIC1_IMR (0x21) 26*8044SWilliam.Kucharski@Sun.COM #define PIC2_ICW1 (0xa0) 27*8044SWilliam.Kucharski@Sun.COM #define PIC2_OCW2 (0xa0) 28*8044SWilliam.Kucharski@Sun.COM #define PIC2_OCW3 (0xa0) 29*8044SWilliam.Kucharski@Sun.COM #define PIC2_ICR (0xa0) 30*8044SWilliam.Kucharski@Sun.COM #define PIC2_IRR (0xa0) 31*8044SWilliam.Kucharski@Sun.COM #define PIC2_ISR (0xa0) 32*8044SWilliam.Kucharski@Sun.COM #define PIC2_ICW2 (0xa1) 33*8044SWilliam.Kucharski@Sun.COM #define PIC2_ICW3 (0xa1) 34*8044SWilliam.Kucharski@Sun.COM #define PIC2_ICW4 (0xa1) 35*8044SWilliam.Kucharski@Sun.COM #define PIC2_IMR (0xa1) 36*8044SWilliam.Kucharski@Sun.COM 37*8044SWilliam.Kucharski@Sun.COM /* Register command values */ 38*8044SWilliam.Kucharski@Sun.COM #define OCW3_ID (0x08) 39*8044SWilliam.Kucharski@Sun.COM #define OCW3_READ_IRR (0x03) 40*8044SWilliam.Kucharski@Sun.COM #define OCW3_READ_ISR (0x02) 41*8044SWilliam.Kucharski@Sun.COM #define ICR_EOI_NON_SPECIFIC (0x20) 42*8044SWilliam.Kucharski@Sun.COM #define ICR_EOI_NOP (0x40) 43*8044SWilliam.Kucharski@Sun.COM #define ICR_EOI_SPECIFIC (0x60) 44*8044SWilliam.Kucharski@Sun.COM #define ICR_EOI_SET_PRIORITY (0xc0) 45*8044SWilliam.Kucharski@Sun.COM 46*8044SWilliam.Kucharski@Sun.COM /* Macros to enable/disable IRQs */ 47*8044SWilliam.Kucharski@Sun.COM #define IMR_REG(x) ( (x) < IRQ_PIC_CUTOFF ? PIC1_IMR : PIC2_IMR ) 48*8044SWilliam.Kucharski@Sun.COM #define IMR_BIT(x) ( 1 << ( (x) % IRQ_PIC_CUTOFF ) ) 49*8044SWilliam.Kucharski@Sun.COM #define irq_enabled(x) ( ( inb ( IMR_REG(x) ) & IMR_BIT(x) ) == 0 ) 50*8044SWilliam.Kucharski@Sun.COM #define enable_irq(x) outb ( inb( IMR_REG(x) ) & ~IMR_BIT(x), IMR_REG(x) ) 51*8044SWilliam.Kucharski@Sun.COM #define disable_irq(x) outb ( inb( IMR_REG(x) ) | IMR_BIT(x), IMR_REG(x) ) 52*8044SWilliam.Kucharski@Sun.COM 53*8044SWilliam.Kucharski@Sun.COM /* Macros for acknowledging IRQs */ 54*8044SWilliam.Kucharski@Sun.COM #define ICR_REG(x) ( (x) < IRQ_PIC_CUTOFF ? PIC1_ICR : PIC2_ICR ) 55*8044SWilliam.Kucharski@Sun.COM #define ICR_VALUE(x) ( (x) % IRQ_PIC_CUTOFF ) 56*8044SWilliam.Kucharski@Sun.COM #define CHAINED_IRQ 2 57*8044SWilliam.Kucharski@Sun.COM 58*8044SWilliam.Kucharski@Sun.COM /* Utility macros to convert IRQ numbers to INT numbers and INT vectors */ 59*8044SWilliam.Kucharski@Sun.COM #define IRQ_INT(x) ( (x)<IRQ_PIC_CUTOFF ? (x)+0x08 : (x)-IRQ_PIC_CUTOFF+0x70 ) 60*8044SWilliam.Kucharski@Sun.COM #define INT_VECTOR(x) ( (segoff_t*) phys_to_virt( 4 * (x) ) ) 61*8044SWilliam.Kucharski@Sun.COM #define IRQ_VECTOR(x) ( INT_VECTOR ( IRQ_INT(x) ) ) 62*8044SWilliam.Kucharski@Sun.COM 63*8044SWilliam.Kucharski@Sun.COM /* Other constants */ 64*8044SWilliam.Kucharski@Sun.COM typedef uint8_t irq_t; 65*8044SWilliam.Kucharski@Sun.COM #define IRQ_MAX (15) 66*8044SWilliam.Kucharski@Sun.COM #define IRQ_NONE (0xff) 67*8044SWilliam.Kucharski@Sun.COM 68*8044SWilliam.Kucharski@Sun.COM /* Labels in assembly code (asm.S) 69*8044SWilliam.Kucharski@Sun.COM */ 70*8044SWilliam.Kucharski@Sun.COM extern void _undi_irq_handler_start; 71*8044SWilliam.Kucharski@Sun.COM extern void _undi_irq_handler ( void ); 72*8044SWilliam.Kucharski@Sun.COM extern volatile uint16_t _undi_irq_trigger_count; 73*8044SWilliam.Kucharski@Sun.COM extern volatile uint16_t _undi_irq_fail_count; 74*8044SWilliam.Kucharski@Sun.COM extern volatile uint16_t _undi_irq_not_ours_count; 75*8044SWilliam.Kucharski@Sun.COM extern segoff_t _undi_irq_chain_to; 76*8044SWilliam.Kucharski@Sun.COM extern uint8_t _undi_irq_chain; 77*8044SWilliam.Kucharski@Sun.COM extern uint8_t _pxenv_undi_irq; 78*8044SWilliam.Kucharski@Sun.COM extern segoff_t _pxenv_undi_entrypointsp; 79*8044SWilliam.Kucharski@Sun.COM 80*8044SWilliam.Kucharski@Sun.COM /* Function prototypes 81*8044SWilliam.Kucharski@Sun.COM */ 82*8044SWilliam.Kucharski@Sun.COM int install_irq_handler ( irq_t irq, segoff_t *handler, 83*8044SWilliam.Kucharski@Sun.COM uint8_t *previously_enabled, 84*8044SWilliam.Kucharski@Sun.COM segoff_t *previous_handler ); 85*8044SWilliam.Kucharski@Sun.COM int remove_irq_handler ( irq_t irq, segoff_t *handler, 86*8044SWilliam.Kucharski@Sun.COM uint8_t *previously_enabled, 87*8044SWilliam.Kucharski@Sun.COM segoff_t *previous_handler ); 88*8044SWilliam.Kucharski@Sun.COM int install_undi_irq_handler ( irq_t irq, segoff_t ); 89*8044SWilliam.Kucharski@Sun.COM int remove_undi_irq_handler ( irq_t irq ); 90*8044SWilliam.Kucharski@Sun.COM int undi_irq_triggered ( irq_t irq ); 91*8044SWilliam.Kucharski@Sun.COM void send_specific_eoi ( irq_t irq ); 92*8044SWilliam.Kucharski@Sun.COM #ifdef DEBUG_IRQ 93*8044SWilliam.Kucharski@Sun.COM void dump_irq_status ( void ); 94*8044SWilliam.Kucharski@Sun.COM #else 95*8044SWilliam.Kucharski@Sun.COM #define dump_irq_status() 96*8044SWilliam.Kucharski@Sun.COM #endif 97*8044SWilliam.Kucharski@Sun.COM 98*8044SWilliam.Kucharski@Sun.COM #endif /* PIC8259_H */ 99