1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef _LINUX_OPENPIC_H
27#define _LINUX_OPENPIC_H
28
29#ifdef __KERNEL__
30
31#include <linux/config.h>
32
33
34
35
36
37#define OPENPIC_MAX_SOURCES 2048
38#define OPENPIC_MAX_PROCESSORS 32
39#define OPENPIC_MAX_ISU 32
40
41#define OPENPIC_NUM_TIMERS 4
42#define OPENPIC_NUM_IPI 4
43#define OPENPIC_NUM_PRI 16
44#define OPENPIC_NUM_VECTORS OPENPIC_MAX_SOURCES
45
46
47
48
49
50typedef struct _OpenPIC_Reg {
51 u_int Reg;
52 char Pad[0xc];
53} OpenPIC_Reg;
54
55
56
57
58
59
60typedef struct _OpenPIC_Processor {
61
62
63
64 u_int IPI0_Dispatch_Shadow;
65 char Pad1[0x4];
66 u_int IPI0_Vector_Priority_Shadow;
67 char Pad2[0x34];
68
69
70
71 OpenPIC_Reg _IPI_Dispatch[OPENPIC_NUM_IPI];
72
73
74
75 OpenPIC_Reg _Current_Task_Priority;
76 char Pad3[0x10];
77
78
79
80 OpenPIC_Reg _Interrupt_Acknowledge;
81
82
83
84 OpenPIC_Reg _EOI;
85 char Pad5[0xf40];
86} OpenPIC_Processor;
87
88
89
90
91
92
93typedef struct _OpenPIC_Timer {
94 OpenPIC_Reg _Current_Count;
95 OpenPIC_Reg _Base_Count;
96 OpenPIC_Reg _Vector_Priority;
97 OpenPIC_Reg _Destination;
98} OpenPIC_Timer;
99
100
101
102
103
104
105typedef struct _OpenPIC_Global {
106
107
108
109 OpenPIC_Reg _Feature_Reporting0;
110 OpenPIC_Reg _Feature_Reporting1;
111
112
113
114 OpenPIC_Reg _Global_Configuration0;
115 OpenPIC_Reg _Global_Configuration1;
116
117
118
119 OpenPIC_Reg _Vendor_Specific[4];
120
121
122
123 OpenPIC_Reg _Vendor_Identification;
124
125
126
127 OpenPIC_Reg _Processor_Initialization;
128
129
130
131 OpenPIC_Reg _IPI_Vector_Priority[OPENPIC_NUM_IPI];
132
133
134
135 OpenPIC_Reg _Spurious_Vector;
136
137
138
139 OpenPIC_Reg _Timer_Frequency;
140 OpenPIC_Timer Timer[OPENPIC_NUM_TIMERS];
141 char Pad1[0xee00];
142} OpenPIC_Global;
143
144
145
146
147
148
149typedef struct _OpenPIC_Source {
150 OpenPIC_Reg _Vector_Priority;
151 OpenPIC_Reg _Destination;
152} OpenPIC_Source, *OpenPIC_SourcePtr;
153
154
155
156
157
158
159struct OpenPIC {
160 char Pad1[0x1000];
161
162
163
164 OpenPIC_Global Global;
165
166
167
168 OpenPIC_Source Source[OPENPIC_MAX_SOURCES];
169
170
171
172 OpenPIC_Processor Processor[OPENPIC_MAX_PROCESSORS];
173};
174
175extern volatile struct OpenPIC *OpenPIC;
176
177
178
179
180
181
182#define OPENPIC_CURRENT_TASK_PRIORITY_MASK 0x0000000f
183
184
185
186
187
188#define OPENPIC_WHO_AM_I_ID_MASK 0x0000001f
189
190
191
192
193
194#define OPENPIC_FEATURE_LAST_SOURCE_MASK 0x07ff0000
195#define OPENPIC_FEATURE_LAST_SOURCE_SHIFT 16
196#define OPENPIC_FEATURE_LAST_PROCESSOR_MASK 0x00001f00
197#define OPENPIC_FEATURE_LAST_PROCESSOR_SHIFT 8
198#define OPENPIC_FEATURE_VERSION_MASK 0x000000ff
199
200
201
202
203
204#define OPENPIC_CONFIG_RESET 0x80000000
205#define OPENPIC_CONFIG_8259_PASSTHROUGH_DISABLE 0x20000000
206#define OPENPIC_CONFIG_BASE_MASK 0x000fffff
207
208
209
210
211
212#define OPENPIC_VENDOR_ID_STEPPING_MASK 0x00ff0000
213#define OPENPIC_VENDOR_ID_STEPPING_SHIFT 16
214#define OPENPIC_VENDOR_ID_DEVICE_ID_MASK 0x0000ff00
215#define OPENPIC_VENDOR_ID_DEVICE_ID_SHIFT 8
216#define OPENPIC_VENDOR_ID_VENDOR_ID_MASK 0x000000ff
217
218
219
220
221
222#define OPENPIC_MASK 0x80000000
223#define OPENPIC_ACTIVITY 0x40000000
224#define OPENPIC_PRIORITY_MASK 0x000f0000
225#define OPENPIC_PRIORITY_SHIFT 16
226#define OPENPIC_VECTOR_MASK 0x000007ff
227
228
229
230
231
232
233#define OPENPIC_POLARITY_POSITIVE 0x00800000
234#define OPENPIC_POLARITY_NEGATIVE 0x00000000
235#define OPENPIC_POLARITY_MASK 0x00800000
236#define OPENPIC_SENSE_LEVEL 0x00400000
237#define OPENPIC_SENSE_EDGE 0x00000000
238#define OPENPIC_SENSE_MASK 0x00400000
239
240
241
242
243
244
245#define OPENPIC_COUNT_MASK 0x7fffffff
246#define OPENPIC_TIMER_TOGGLE 0x80000000
247#define OPENPIC_TIMER_COUNT_INHIBIT 0x80000000
248
249
250
251
252
253
254
255#define IPI_Dispatch(i) _IPI_Dispatch[i].Reg
256#define Current_Task_Priority _Current_Task_Priority.Reg
257#define Interrupt_Acknowledge _Interrupt_Acknowledge.Reg
258#define EOI _EOI.Reg
259
260
261#define Feature_Reporting0 _Feature_Reporting0.Reg
262#define Feature_Reporting1 _Feature_Reporting1.Reg
263#define Global_Configuration0 _Global_Configuration0.Reg
264#define Global_Configuration1 _Global_Configuration1.Reg
265#define Vendor_Specific(i) _Vendor_Specific[i].Reg
266#define Vendor_Identification _Vendor_Identification.Reg
267#define Processor_Initialization _Processor_Initialization.Reg
268#define IPI_Vector_Priority(i) _IPI_Vector_Priority[i].Reg
269#define Spurious_Vector _Spurious_Vector.Reg
270#define Timer_Frequency _Timer_Frequency.Reg
271
272
273#define Current_Count _Current_Count.Reg
274#define Base_Count _Base_Count.Reg
275#define Vector_Priority _Vector_Priority.Reg
276#define Destination _Destination.Reg
277
278
279#define Vector_Priority _Vector_Priority.Reg
280#define Destination _Destination.Reg
281
282
283
284
285
286
287
288static void openpic_reset(void);
289static void openpic_enable_8259_pass_through(void);
290static void openpic_disable_8259_pass_through(void);
291static u_int openpic_irq(void);
292static void openpic_eoi(void);
293static u_int openpic_get_priority(void);
294static void openpic_set_priority(u_int pri);
295static u_int openpic_get_spurious(void);
296static void openpic_set_spurious(u_int vector);
297
298#ifdef CONFIG_SMP
299
300static void openpic_initipi(u_int ipi, u_int pri, u_int vector);
301static void openpic_ipi_action(int cpl, void *dev_id, struct pt_regs *regs);
302#endif
303
304
305static void openpic_inittimer(u_int timer, u_int pri, u_int vector);
306static void openpic_maptimer(u_int timer, u_int cpumask);
307
308
309static void openpic_enable_irq(u_int irq);
310static void openpic_disable_irq(u_int irq);
311static void openpic_initirq(u_int irq, u_int pri, u_int vector, int polarity,
312 int is_level);
313static void openpic_mapirq(u_int irq, u_int cpumask);
314static void openpic_set_sense(u_int irq, int sense);
315
316#endif
317
318#endif
319