i8259.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_X86_I8259_H
  3. #define _ASM_X86_I8259_H
  4. #include <linux/delay.h>
  5. #include <asm/io.h>
  6. extern unsigned int cached_irq_mask;
  7. #define __byte(x, y) (((unsigned char *)&(y))[x])
  8. #define cached_master_mask (__byte(0, cached_irq_mask))
  9. #define cached_slave_mask (__byte(1, cached_irq_mask))
  10. /* i8259A PIC registers */
  11. #define PIC_MASTER_CMD 0x20
  12. #define PIC_MASTER_IMR 0x21
  13. #define PIC_MASTER_ISR PIC_MASTER_CMD
  14. #define PIC_MASTER_POLL PIC_MASTER_ISR
  15. #define PIC_MASTER_OCW3 PIC_MASTER_ISR
  16. #define PIC_SLAVE_CMD 0xa0
  17. #define PIC_SLAVE_IMR 0xa1
  18. #define PIC_ELCR1 0x4d0
  19. #define PIC_ELCR2 0x4d1
  20. /* i8259A PIC related value */
  21. #define PIC_CASCADE_IR 2
  22. #define MASTER_ICW4_DEFAULT 0x01
  23. #define SLAVE_ICW4_DEFAULT 0x01
  24. #define PIC_ICW4_AEOI 2
  25. extern raw_spinlock_t i8259A_lock;
  26. /* the PIC may need a careful delay on some platforms, hence specific calls */
  27. static inline unsigned char inb_pic(unsigned int port)
  28. {
  29. unsigned char value = inb(port);
  30. /*
  31. * delay for some accesses to PIC on motherboard or in chipset
  32. * must be at least one microsecond, so be safe here:
  33. */
  34. udelay(2);
  35. return value;
  36. }
  37. static inline void outb_pic(unsigned char value, unsigned int port)
  38. {
  39. outb(value, port);
  40. /*
  41. * delay for some accesses to PIC on motherboard or in chipset
  42. * must be at least one microsecond, so be safe here:
  43. */
  44. udelay(2);
  45. }
  46. extern struct irq_chip i8259A_chip;
  47. struct legacy_pic {
  48. int nr_legacy_irqs;
  49. struct irq_chip *chip;
  50. void (*mask)(unsigned int irq);
  51. void (*unmask)(unsigned int irq);
  52. void (*mask_all)(void);
  53. void (*restore_mask)(void);
  54. void (*init)(int auto_eoi);
  55. int (*probe)(void);
  56. int (*irq_pending)(unsigned int irq);
  57. void (*make_irq)(unsigned int irq);
  58. };
  59. void legacy_pic_pcat_compat(void);
  60. extern struct legacy_pic *legacy_pic;
  61. extern struct legacy_pic null_legacy_pic;
  62. static inline bool has_legacy_pic(void)
  63. {
  64. return legacy_pic != &null_legacy_pic;
  65. }
  66. static inline int nr_legacy_irqs(void)
  67. {
  68. return legacy_pic->nr_legacy_irqs;
  69. }
  70. #endif /* _ASM_X86_I8259_H */