2 * BK Id: SCCS/s.irq.h 1.23 01/07/03 22:59:12 paulus
8 #include <linux/config.h>
9 #include <asm/machdep.h> /* ppc_md */
10 #include <asm/atomic.h>
12 extern void disable_irq(unsigned int);
13 extern void disable_irq_nosync(unsigned int);
14 extern void enable_irq(unsigned int);
17 * These constants are used for passing information about interrupt
18 * signal polarity and level/edge sensing to the low-level PIC chip
21 #define IRQ_SENSE_MASK 0x1
22 #define IRQ_SENSE_LEVEL 0x1 /* interrupt on active level */
23 #define IRQ_SENSE_EDGE 0x0 /* interrupt triggered by edge */
25 #define IRQ_POLARITY_MASK 0x2
26 #define IRQ_POLARITY_POSITIVE 0x2 /* high level or low->high edge */
27 #define IRQ_POLARITY_NEGATIVE 0x0 /* low level or high->low edge */
29 #if defined(CONFIG_40x)
30 #include <asm/ibm4xx.h>
33 #define NR_BOARD_IRQS 0
36 #ifndef UIC_WIDTH /* Number of interrupts per device */
40 #ifndef NR_UICS /* number of UIC devices */
44 #if defined (CONFIG_403)
46 * The PowerPC 403 cores' Asynchronous Interrupt Controller (AIC) has
47 * 32 possible interrupts, a majority of which are not implemented on
48 * all cores. There are six configurable, external interrupt pins and
49 * there are eight internal interrupts for the on-chip serial port
50 * (SPU), DMA controller, and JTAG controller.
54 #define NR_AIC_IRQS 32
55 #define NR_IRQS (NR_AIC_IRQS + NR_BOARD_IRQS)
57 #elif !defined (CONFIG_403)
60 * The PowerPC 405 cores' Universal Interrupt Controller (UIC) has 32
61 * possible interrupts as well. There are seven, configurable external
62 * interrupt pins and there are 17 internal interrupts for the on-chip
63 * serial port, DMA controller, on-chip Ethernet controller, PCI, etc.
68 #define NR_UIC_IRQS UIC_WIDTH
69 #define NR_IRQS ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS)
72 irq_cannonicalize(int irq)
77 #elif defined(CONFIG_440)
78 #include <asm/ibm440.h>
80 #define NR_UIC_IRQS 32
81 #define NR_IRQS ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS)
84 irq_cannonicalize(int irq)
89 #elif defined(CONFIG_8xx)
91 /* The MPC8xx cores have 16 possible interrupts. There are eight
92 * possible level sensitive interrupts assigned and generated internally
93 * from such devices as CPM, PCMCIA, RTC, PIT, TimeBase and Decrementer.
94 * There are eight external interrupts (IRQs) that can be configured
95 * as either level or edge sensitive.
97 * On some implementations, there is also the possibility of an 8259
98 * through the PCI and PCI-ISA bridges.
100 #define NR_SIU_INTS 16
102 #define NR_IRQS (NR_SIU_INTS + NR_8259_INTS)
104 /* These values must be zero-based and map 1:1 with the SIU configuration.
105 * They are used throughout the 8xx I/O subsystem to generate
106 * interrupt masks, flags, and other control patterns. This is why the
107 * current kernel assumption of the 8259 as the base controller is such
108 * a pain in the butt.
110 #define SIU_IRQ0 (0) /* Highest priority */
111 #define SIU_LEVEL0 (1)
113 #define SIU_LEVEL1 (3)
115 #define SIU_LEVEL2 (5)
117 #define SIU_LEVEL3 (7)
119 #define SIU_LEVEL4 (9)
120 #define SIU_IRQ5 (10)
121 #define SIU_LEVEL5 (11)
122 #define SIU_IRQ6 (12)
123 #define SIU_LEVEL6 (13)
124 #define SIU_IRQ7 (14)
125 #define SIU_LEVEL7 (15)
127 /* Now include the board configuration specific associations.
129 #include <asm/mpc8xx.h>
131 /* The internal interrupts we can configure as we see fit.
132 * My personal preference is CPM at level 2, which puts it above the
133 * MBX PCI/ISA/IDE interrupts.
135 #ifndef PIT_INTERRUPT
136 #define PIT_INTERRUPT SIU_LEVEL0
138 #ifndef CPM_INTERRUPT
139 #define CPM_INTERRUPT SIU_LEVEL2
141 #ifndef PCMCIA_INTERRUPT
142 #define PCMCIA_INTERRUPT SIU_LEVEL6
144 #ifndef DEC_INTERRUPT
145 #define DEC_INTERRUPT SIU_LEVEL7
148 /* Some internal interrupt registers use an 8-bit mask for the interrupt
149 * level instead of a number.
151 #define mk_int_int_mask(IL) (1 << (7 - (IL/2)))
153 /* always the same on 8xx -- Cort */
154 static __inline__ int irq_cannonicalize(int irq)
159 #else /* CONFIG_40x + CONFIG_8xx */
161 * this is the # irq's for all ppc arch's (pmac/chrp/prep)
162 * so it is the max of them all
168 #define NUM_8259_INTERRUPTS 16
170 #else /* CONFIG_8260 */
172 /* The 8260 has an internal interrupt controller with a maximum of
173 * 64 IRQs. We will use NR_IRQs from above since it is large enough.
174 * Don't be confused by the 8260 documentation where they list an
175 * "interrupt number" and "interrupt vector". We are only interested
176 * in the interrupt vector. There are "reserved" holes where the
177 * vector number increases, but the interrupt number in the table does not.
178 * (Document errata updates have fixed this...make sure you have up to
179 * date processor documentation -- Dan).
181 #define NR_SIU_INTS 64
183 /* There are many more than these, we will add them as we need them.
185 #define SIU_INT_SMC1 ((uint)0x04)
186 #define SIU_INT_SMC2 ((uint)0x05)
187 #define SIU_INT_FCC1 ((uint)0x20)
188 #define SIU_INT_FCC2 ((uint)0x21)
189 #define SIU_INT_FCC3 ((uint)0x22)
190 #define SIU_INT_SCC1 ((uint)0x28)
191 #define SIU_INT_SCC2 ((uint)0x29)
192 #define SIU_INT_SCC3 ((uint)0x2a)
193 #define SIU_INT_SCC4 ((uint)0x2b)
195 #endif /* CONFIG_8260 */
198 * This gets called from serial.c, which is now used on
199 * powermacs as well as prep/chrp boxes.
200 * Prep and chrp both have cascaded 8259 PICs.
202 static __inline__ int irq_cannonicalize(int irq)
204 if (ppc_md.irq_cannonicalize)
205 return ppc_md.irq_cannonicalize(irq);
211 #define NR_MASK_WORDS ((NR_IRQS + 31) / 32)
212 /* pedantic: these are long because they are used with set_bit --RR */
213 extern unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
214 extern unsigned long ppc_lost_interrupts[NR_MASK_WORDS];
215 extern atomic_t ppc_n_lost_interrupts;
217 #endif /* _ASM_IRQ_H */
218 #endif /* __KERNEL__ */