patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / include / asm-ppc64 / irq.h
1 #ifdef __KERNEL__
2 #ifndef _ASM_IRQ_H
3 #define _ASM_IRQ_H
4
5 /*
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  */
11
12 #include <linux/threads.h>
13 #include <asm/atomic.h>
14
15 /*
16  * Maximum number of interrupt sources that we can handle.
17  */
18 #define NR_IRQS         512
19
20 extern void disable_irq(unsigned int);
21 extern void disable_irq_nosync(unsigned int);
22 extern void enable_irq(unsigned int);
23
24 /* this number is used when no interrupt has been assigned */
25 #define NO_IRQ                  (-1)
26
27 #define get_irq_desc(irq) (&irq_desc[(irq)])
28
29 /* Define a way to iterate across irqs. */
30 #define for_each_irq(i) \
31         for ((i) = 0; (i) < NR_IRQS; ++(i))
32
33 /* Interrupt numbers are virtual in case they are sparsely
34  * distributed by the hardware.
35  */
36 extern unsigned int virt_irq_to_real_map[NR_IRQS];
37
38 /* Create a mapping for a real_irq if it doesn't already exist.
39  * Return the virtual irq as a convenience.
40  */
41 int virt_irq_create_mapping(unsigned int real_irq);
42 void virt_irq_init(void);
43
44 static inline unsigned int virt_irq_to_real(unsigned int virt_irq)
45 {
46         return virt_irq_to_real_map[virt_irq];
47 }
48
49 /*
50  * Because many systems have two overlapping names spaces for
51  * interrupts (ISA and XICS for example), and the ISA interrupts
52  * have historically not been easy to renumber, we allow ISA
53  * interrupts to take values 0 - 15, and shift up the remaining
54  * interrupts by 0x10.
55  */
56 #define NUM_ISA_INTERRUPTS      0x10
57 extern int __irq_offset_value;
58
59 static inline int irq_offset_up(int irq)
60 {
61         return(irq + __irq_offset_value);
62 }
63
64 static inline int irq_offset_down(int irq)
65 {
66         return(irq - __irq_offset_value);
67 }
68
69 static inline int irq_offset_value(void)
70 {
71         return __irq_offset_value;
72 }
73
74 static __inline__ int irq_canonicalize(int irq)
75 {
76         return irq;
77 }
78
79 struct irqaction;
80 struct pt_regs;
81 int handle_irq_event(int, struct pt_regs *, struct irqaction *);
82
83 #ifdef CONFIG_IRQSTACKS
84 /*
85  * Per-cpu stacks for handling hard and soft interrupts.
86  */
87 extern struct thread_info *hardirq_ctx[NR_CPUS];
88 extern struct thread_info *softirq_ctx[NR_CPUS];
89
90 extern void irq_ctx_init(void);
91 extern void call_do_softirq(struct thread_info *tp);
92 extern int call_handle_irq_event(int irq, struct pt_regs *regs,
93                         struct irqaction *action, struct thread_info *tp);
94
95 #define __ARCH_HAS_DO_SOFTIRQ
96
97 #else
98 #define irq_ctx_init()
99
100 #endif /* CONFIG_IRQSTACKS */
101
102 #endif /* _ASM_IRQ_H */
103 #endif /* __KERNEL__ */