clean
[linux-2.4.21-pre4.git] / include / asm-ppc / irq.h
1 /*
2  * BK Id: SCCS/s.irq.h 1.23 01/07/03 22:59:12 paulus
3  */
4 #ifdef __KERNEL__
5 #ifndef _ASM_IRQ_H
6 #define _ASM_IRQ_H
7
8 #include <linux/config.h>
9 #include <asm/machdep.h>                /* ppc_md */
10 #include <asm/atomic.h>
11
12 extern void disable_irq(unsigned int);
13 extern void disable_irq_nosync(unsigned int);
14 extern void enable_irq(unsigned int);
15
16 /*
17  * These constants are used for passing information about interrupt
18  * signal polarity and level/edge sensing to the low-level PIC chip
19  * drivers.
20  */
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 */
24
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 */
28
29 #if defined(CONFIG_40x)
30 #include <asm/ibm4xx.h>
31
32 #ifndef NR_BOARD_IRQS
33 #define NR_BOARD_IRQS 0
34 #endif
35
36 #ifndef UIC_WIDTH /* Number of interrupts per device */
37 #define UIC_WIDTH 32
38 #endif
39
40 #ifndef NR_UICS /* number  of UIC devices */
41 #define NR_UICS 1
42 #endif
43
44 #if defined (CONFIG_403)
45 /*
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.
51  *
52  */
53
54 #define NR_AIC_IRQS 32 
55 #define NR_IRQS  (NR_AIC_IRQS + NR_BOARD_IRQS)
56
57 #elif !defined (CONFIG_403)
58
59 /*
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.
64  *
65  */
66
67
68 #define NR_UIC_IRQS UIC_WIDTH
69 #define NR_IRQS         ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS)
70 #endif
71 static __inline__ int
72 irq_cannonicalize(int irq)
73 {
74         return (irq);
75 }
76
77 #elif defined(CONFIG_440)
78 #include <asm/ibm440.h>
79
80 #define NR_UIC_IRQS     32
81 #define NR_IRQS         ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS)
82
83 static __inline__ int
84 irq_cannonicalize(int irq)
85 {
86         return (irq);
87 }
88
89 #elif defined(CONFIG_8xx)
90
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. 
96  *
97  * On some implementations, there is also the possibility of an 8259
98  * through the PCI and PCI-ISA bridges.
99  */
100 #define NR_SIU_INTS     16
101
102 #define NR_IRQS (NR_SIU_INTS + NR_8259_INTS)
103
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.
109  */
110 #define SIU_IRQ0        (0)     /* Highest priority */
111 #define SIU_LEVEL0      (1)
112 #define SIU_IRQ1        (2)
113 #define SIU_LEVEL1      (3)
114 #define SIU_IRQ2        (4)
115 #define SIU_LEVEL2      (5)
116 #define SIU_IRQ3        (6)
117 #define SIU_LEVEL3      (7)
118 #define SIU_IRQ4        (8)
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)
126
127 /* Now include the board configuration specific associations.
128 */
129 #include <asm/mpc8xx.h>
130
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.
134  */
135 #ifndef PIT_INTERRUPT
136 #define PIT_INTERRUPT           SIU_LEVEL0
137 #endif
138 #ifndef CPM_INTERRUPT
139 #define CPM_INTERRUPT           SIU_LEVEL2
140 #endif
141 #ifndef PCMCIA_INTERRUPT
142 #define PCMCIA_INTERRUPT        SIU_LEVEL6
143 #endif
144 #ifndef DEC_INTERRUPT
145 #define DEC_INTERRUPT           SIU_LEVEL7
146 #endif
147
148 /* Some internal interrupt registers use an 8-bit mask for the interrupt
149  * level instead of a number.
150  */
151 #define mk_int_int_mask(IL) (1 << (7 - (IL/2)))
152
153 /* always the same on 8xx -- Cort */
154 static __inline__ int irq_cannonicalize(int irq)
155 {
156         return irq;
157 }
158
159 #else /* CONFIG_40x + CONFIG_8xx */
160 /*
161  * this is the # irq's for all ppc arch's (pmac/chrp/prep)
162  * so it is the max of them all
163  */
164 #define NR_IRQS                 256
165
166 #ifndef CONFIG_8260
167
168 #define NUM_8259_INTERRUPTS     16
169
170 #else /* CONFIG_8260 */
171
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).
180  */
181 #define NR_SIU_INTS     64
182
183 /* There are many more than these, we will add them as we need them.
184 */
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)
194
195 #endif /* CONFIG_8260 */
196
197 /*
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.
201  */
202 static __inline__ int irq_cannonicalize(int irq)
203 {
204         if (ppc_md.irq_cannonicalize)
205                 return ppc_md.irq_cannonicalize(irq);
206         return irq;
207 }
208
209 #endif
210
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;
216
217 #endif /* _ASM_IRQ_H */
218 #endif /* __KERNEL__ */