Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ASM_X86_I8259_H
0003 #define _ASM_X86_I8259_H
0004 
0005 #include <linux/delay.h>
0006 #include <asm/io.h>
0007 
0008 extern unsigned int cached_irq_mask;
0009 
0010 #define __byte(x, y)        (((unsigned char *)&(y))[x])
0011 #define cached_master_mask  (__byte(0, cached_irq_mask))
0012 #define cached_slave_mask   (__byte(1, cached_irq_mask))
0013 
0014 /* i8259A PIC registers */
0015 #define PIC_MASTER_CMD      0x20
0016 #define PIC_MASTER_IMR      0x21
0017 #define PIC_MASTER_ISR      PIC_MASTER_CMD
0018 #define PIC_MASTER_POLL     PIC_MASTER_ISR
0019 #define PIC_MASTER_OCW3     PIC_MASTER_ISR
0020 #define PIC_SLAVE_CMD       0xa0
0021 #define PIC_SLAVE_IMR       0xa1
0022 #define PIC_ELCR1       0x4d0
0023 #define PIC_ELCR2       0x4d1
0024 
0025 /* i8259A PIC related value */
0026 #define PIC_CASCADE_IR      2
0027 #define MASTER_ICW4_DEFAULT 0x01
0028 #define SLAVE_ICW4_DEFAULT  0x01
0029 #define PIC_ICW4_AEOI       2
0030 
0031 extern raw_spinlock_t i8259A_lock;
0032 
0033 /* the PIC may need a careful delay on some platforms, hence specific calls */
0034 static inline unsigned char inb_pic(unsigned int port)
0035 {
0036     unsigned char value = inb(port);
0037 
0038     /*
0039      * delay for some accesses to PIC on motherboard or in chipset
0040      * must be at least one microsecond, so be safe here:
0041      */
0042     udelay(2);
0043 
0044     return value;
0045 }
0046 
0047 static inline void outb_pic(unsigned char value, unsigned int port)
0048 {
0049     outb(value, port);
0050     /*
0051      * delay for some accesses to PIC on motherboard or in chipset
0052      * must be at least one microsecond, so be safe here:
0053      */
0054     udelay(2);
0055 }
0056 
0057 extern struct irq_chip i8259A_chip;
0058 
0059 struct legacy_pic {
0060     int nr_legacy_irqs;
0061     struct irq_chip *chip;
0062     void (*mask)(unsigned int irq);
0063     void (*unmask)(unsigned int irq);
0064     void (*mask_all)(void);
0065     void (*restore_mask)(void);
0066     void (*init)(int auto_eoi);
0067     int (*probe)(void);
0068     int (*irq_pending)(unsigned int irq);
0069     void (*make_irq)(unsigned int irq);
0070 };
0071 
0072 extern struct legacy_pic *legacy_pic;
0073 extern struct legacy_pic null_legacy_pic;
0074 
0075 static inline bool has_legacy_pic(void)
0076 {
0077     return legacy_pic != &null_legacy_pic;
0078 }
0079 
0080 static inline int nr_legacy_irqs(void)
0081 {
0082     return legacy_pic->nr_legacy_irqs;
0083 }
0084 
0085 #endif /* _ASM_X86_I8259_H */