You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pic8259.h 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Basic support for controlling the 8259 Programmable Interrupt Controllers.
  3. *
  4. * Initially written by Michael Brown (mcb30).
  5. */
  6. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  7. #ifndef PIC8259_H
  8. #define PIC8259_H
  9. #include <ipxe/io.h>
  10. #define IRQ_PIC_CUTOFF 8
  11. /* 8259 register locations */
  12. #define PIC1_ICW1 0x20
  13. #define PIC1_OCW2 0x20
  14. #define PIC1_OCW3 0x20
  15. #define PIC1_ICR 0x20
  16. #define PIC1_IRR 0x20
  17. #define PIC1_ISR 0x20
  18. #define PIC1_ICW2 0x21
  19. #define PIC1_ICW3 0x21
  20. #define PIC1_ICW4 0x21
  21. #define PIC1_IMR 0x21
  22. #define PIC2_ICW1 0xa0
  23. #define PIC2_OCW2 0xa0
  24. #define PIC2_OCW3 0xa0
  25. #define PIC2_ICR 0xa0
  26. #define PIC2_IRR 0xa0
  27. #define PIC2_ISR 0xa0
  28. #define PIC2_ICW2 0xa1
  29. #define PIC2_ICW3 0xa1
  30. #define PIC2_ICW4 0xa1
  31. #define PIC2_IMR 0xa1
  32. /* Register command values */
  33. #define OCW3_ID 0x08
  34. #define OCW3_READ_IRR 0x03
  35. #define OCW3_READ_ISR 0x02
  36. #define ICR_EOI_NON_SPECIFIC 0x20
  37. #define ICR_EOI_NOP 0x40
  38. #define ICR_EOI_SPECIFIC 0x60
  39. #define ICR_EOI_SET_PRIORITY 0xc0
  40. /* Macros to enable/disable IRQs */
  41. #define IMR_REG(x) ( (x) < IRQ_PIC_CUTOFF ? PIC1_IMR : PIC2_IMR )
  42. #define IMR_BIT(x) ( 1 << ( (x) % IRQ_PIC_CUTOFF ) )
  43. #define irq_enabled(x) ( ( inb ( IMR_REG(x) ) & IMR_BIT(x) ) == 0 )
  44. #define enable_irq(x) outb ( inb( IMR_REG(x) ) & ~IMR_BIT(x), IMR_REG(x) )
  45. #define disable_irq(x) outb ( inb( IMR_REG(x) ) | IMR_BIT(x), IMR_REG(x) )
  46. /* Macros for acknowledging IRQs */
  47. #define ICR_REG( irq ) ( (irq) < IRQ_PIC_CUTOFF ? PIC1_ICR : PIC2_ICR )
  48. #define ICR_VALUE( irq ) ( (irq) % IRQ_PIC_CUTOFF )
  49. #define CHAINED_IRQ 2
  50. /* Utility macros to convert IRQ numbers to INT numbers and INT vectors */
  51. #define IRQ_INT( irq ) ( ( ( (irq) - IRQ_PIC_CUTOFF ) ^ 0x70 ) & 0x7f )
  52. /* Other constants */
  53. #define IRQ_MAX 15
  54. #define IRQ_NONE -1U
  55. /* Function prototypes
  56. */
  57. void send_eoi ( unsigned int irq );
  58. #endif /* PIC8259_H */