xref: /onnv-gate/usr/src/grub/grub-0.97/netboot/pic8259.h (revision 8044:b3af80bbf173)
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