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

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