WIP: irq_handler
[ppcskel.git] / irq.h
1 #ifndef __IRQ_H__
2 #define __IRQ_H__
3
4 #include "types.h"
5
6 #ifdef CAN_HAZ_IRQ
7 #define IRQ_TIMER       0
8 #define IRQ_NAND        1
9 #define IRQ_AES         2
10 #define IRQ_SHA1        3
11 #define IRQ_EHCI        4
12 #define IRQ_OHCI0       5
13 #define IRQ_OHCI1       6
14 #define IRQ_SDHC        7
15 #define IRQ_WIFI        8
16 #define IRQ_GPIO1B      10
17 #define IRQ_GPIO1       11
18 #define IRQ_RESET       17
19 #define IRQ_PPCIPC      30
20 #define IRQ_IPC         31
21
22 #define IRQF_TIMER      (1<<IRQ_TIMER)
23 #define IRQF_NAND       (1<<IRQ_NAND)
24 #define IRQF_AES        (1<<IRQ_AES)
25 #define IRQF_SDHC       (1<<IRQ_SDHC)
26 #define IRQF_GPIO1B     (1<<IRQ_GPIO1B)
27 #define IRQF_GPIO1      (1<<IRQ_GPIO1)
28 #define IRQF_RESET      (1<<IRQ_RESET)
29 #define IRQF_IPC        (1<<IRQ_IPC)
30 #define IRQF_OHCI0      (1<<IRQ_OHCI0)
31 #define IRQF_OHCI1      (1<<IRQ_OHCI1)
32
33 #define IRQF_ALL        ( \
34         IRQF_TIMER|IRQF_NAND|IRQF_GPIO1B|IRQF_GPIO1| \
35         IRQF_RESET|IRQF_IPC|IRQF_AES|IRQF_SDHC| \
36         IRQF_OHCI0|IRQF_OHCI1 \
37         )
38
39 /* broadway.h? :o */
40 /* broadway processor interface registers */
41 #define BW_PI_IRQFLAG (0x0c003000)
42 #define BW_PI_IRQMASK (0x0c003004)
43
44 // http://hitmen.c02.at/files/yagcd/yagcd/chap5.html#sec5.4
45 #define BW_PI_IRQ_RESET         1
46 #define BW_PI_IRQ_DI            2
47 #define BW_PI_IRQ_SI            3
48 #define BW_PI_IRQ_EXI           4
49 #define BW_PI_IRQ_AI            5
50 #define BW_PI_IRQ_DSP           6
51 #define BW_PI_IRQ_MEM           7
52 #define BW_PI_IRQ_VI            8
53 #define BW_PI_IRQ_PE_TOKEN      9
54 #define BW_PI_IRQ_PE_FINISH     10
55 #define BW_PI_IRQ_CP            11
56 #define BW_PI_IRQ_DEBUG         12
57 #define BW_PI_IRQ_HSP           13
58 #define BW_PI_IRQ_HW            14 //hollywood pic
59
60 /* stolen from libogc - gc/ogc/machine/processor.h */
61 #define _CPU_ISR_Enable() \
62         { register u32 _val = 0; \
63           __asm__ __volatile__ ( \
64                 "mfmsr %0\n" \
65                 "ori %0,%0,0x8000\n" \
66                 "mtmsr %0" \
67                 : "=&r" ((_val)) : "0" ((_val)) \
68           ); \
69         }
70
71 #define _CPU_ISR_Disable( _isr_cookie ) \
72   { register u32 _disable_mask = 0; \
73         _isr_cookie = 0; \
74     __asm__ __volatile__ ( \
75           "mfmsr %0\n" \
76           "rlwinm %1,%0,0,17,15\n" \
77           "mtmsr %1\n" \
78           "extrwi %0,%0,1,16" \
79           : "=&r" ((_isr_cookie)), "=&r" ((_disable_mask)) \
80           : "0" ((_isr_cookie)), "1" ((_disable_mask)) \
81         ); \
82   }
83
84 #define _CPU_ISR_Restore( _isr_cookie )  \
85   { register u32 _enable_mask = 0; \
86         __asm__ __volatile__ ( \
87     "    cmpwi %0,0\n" \
88         "    beq 1f\n" \
89         "    mfmsr %1\n" \
90         "    ori %1,%1,0x8000\n" \
91         "    mtmsr %1\n" \
92         "1:" \
93         : "=r"((_isr_cookie)),"=&r" ((_enable_mask)) \
94         : "0"((_isr_cookie)),"1" ((_enable_mask)) \
95         ); \
96   }
97
98 void irq_initialize(void);
99 void irq_shutdown(void);
100
101 void irq_handler(void);
102
103 void irq_bw_enable(u32 irq);
104 void irq_bw_disable(u32 irq);
105 void irq_hw_enable(u32 irq);
106 void irq_hw_disable(u32 irq);
107
108 u32 irq_kill(void);
109 void irq_restore(u32 cookie);
110
111 /* TODO: port to ppc 
112 static inline void irq_wait(void)
113 {
114         u32 data = 0;
115         __asm__ volatile ( "mcr\tp15, 0, %0, c7, c0, 4" : : "r" (data) );
116 }
117 */
118
119 #endif
120
121 #else
122 // stub functions allow us to avoid sprinkling other code with ifdefs
123 static inline u32 irq_kill(void) {
124         return 0;
125 }
126
127 static inline void irq_restore(u32 cookie) {
128         (void)cookie;
129 }
130 #endif
131
132