blob: 4f05624b249ec38d06f61a72d1afea9a80b42ba2 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * arch/ppc/kernel/open_pic_defs.h -- OpenPIC definitions
3 *
4 * Copyright (C) 1997 Geert Uytterhoeven
5 *
6 * This file is based on the following documentation:
7 *
8 * The Open Programmable Interrupt Controller (PIC)
9 * Register Interface Specification Revision 1.2
10 *
11 * Issue Date: October 1995
12 *
13 * Issued jointly by Advanced Micro Devices and Cyrix Corporation
14 *
15 * AMD is a registered trademark of Advanced Micro Devices, Inc.
16 * Copyright (C) 1995, Advanced Micro Devices, Inc. and Cyrix, Inc.
17 * All Rights Reserved.
18 *
19 * To receive a copy of this documentation, send an email to openpic@amd.com.
20 *
21 * This file is subject to the terms and conditions of the GNU General Public
22 * License. See the file COPYING in the main directory of this archive
23 * for more details.
24 */
25
26#ifndef _LINUX_OPENPIC_H
27#define _LINUX_OPENPIC_H
28
29#ifdef __KERNEL__
30
31 /*
32 * OpenPIC supports up to 2048 interrupt sources and up to 32 processors
33 */
34
35#define OPENPIC_MAX_SOURCES 2048
36#define OPENPIC_MAX_PROCESSORS 32
37#define OPENPIC_MAX_ISU 16
38
39#define OPENPIC_NUM_TIMERS 4
40#define OPENPIC_NUM_IPI 4
41#define OPENPIC_NUM_PRI 16
42#define OPENPIC_NUM_VECTORS 256
43
44
45
46 /*
47 * OpenPIC Registers are 32 bits and aligned on 128 bit boundaries
48 */
49
50typedef struct _OpenPIC_Reg {
51 u_int Reg; /* Little endian! */
52 char Pad[0xc];
53} OpenPIC_Reg;
54
55
56 /*
57 * Per Processor Registers
58 */
59
60typedef struct _OpenPIC_Processor {
61 /*
62 * Private Shadow Registers (for SLiC backwards compatibility)
63 */
64 u_int IPI0_Dispatch_Shadow; /* Write Only */
65 char Pad1[0x4];
66 u_int IPI0_Vector_Priority_Shadow; /* Read/Write */
67 char Pad2[0x34];
68 /*
69 * Interprocessor Interrupt Command Ports
70 */
71 OpenPIC_Reg _IPI_Dispatch[OPENPIC_NUM_IPI]; /* Write Only */
72 /*
73 * Current Task Priority Register
74 */
75 OpenPIC_Reg _Current_Task_Priority; /* Read/Write */
76 char Pad3[0x10];
77 /*
78 * Interrupt Acknowledge Register
79 */
80 OpenPIC_Reg _Interrupt_Acknowledge; /* Read Only */
81 /*
82 * End of Interrupt (EOI) Register
83 */
84 OpenPIC_Reg _EOI; /* Read/Write */
85 char Pad5[0xf40];
86} OpenPIC_Processor;
87
88
89 /*
90 * Timer Registers
91 */
92
93typedef struct _OpenPIC_Timer {
94 OpenPIC_Reg _Current_Count; /* Read Only */
95 OpenPIC_Reg _Base_Count; /* Read/Write */
96 OpenPIC_Reg _Vector_Priority; /* Read/Write */
97 OpenPIC_Reg _Destination; /* Read/Write */
98} OpenPIC_Timer;
99
100
101 /*
102 * Global Registers
103 */
104
105typedef struct _OpenPIC_Global {
106 /*
107 * Feature Reporting Registers
108 */
109 OpenPIC_Reg _Feature_Reporting0; /* Read Only */
110 OpenPIC_Reg _Feature_Reporting1; /* Future Expansion */
111 /*
112 * Global Configuration Registers
113 */
114 OpenPIC_Reg _Global_Configuration0; /* Read/Write */
115 OpenPIC_Reg _Global_Configuration1; /* Future Expansion */
116 /*
117 * Vendor Specific Registers
118 */
119 OpenPIC_Reg _Vendor_Specific[4];
120 /*
121 * Vendor Identification Register
122 */
123 OpenPIC_Reg _Vendor_Identification; /* Read Only */
124 /*
125 * Processor Initialization Register
126 */
127 OpenPIC_Reg _Processor_Initialization; /* Read/Write */
128 /*
129 * IPI Vector/Priority Registers
130 */
131 OpenPIC_Reg _IPI_Vector_Priority[OPENPIC_NUM_IPI]; /* Read/Write */
132 /*
133 * Spurious Vector Register
134 */
135 OpenPIC_Reg _Spurious_Vector; /* Read/Write */
136 /*
137 * Global Timer Registers
138 */
139 OpenPIC_Reg _Timer_Frequency; /* Read/Write */
140 OpenPIC_Timer Timer[OPENPIC_NUM_TIMERS];
141 char Pad1[0xee00];
142} OpenPIC_Global;
143
144
145 /*
146 * Interrupt Source Registers
147 */
148
149typedef struct _OpenPIC_Source {
150 OpenPIC_Reg _Vector_Priority; /* Read/Write */
151 OpenPIC_Reg _Destination; /* Read/Write */
152} OpenPIC_Source, *OpenPIC_SourcePtr;
153
154
155 /*
156 * OpenPIC Register Map
157 */
158
159struct OpenPIC {
160 char Pad1[0x1000];
161 /*
162 * Global Registers
163 */
164 OpenPIC_Global Global;
165 /*
166 * Interrupt Source Configuration Registers
167 */
168 OpenPIC_Source Source[OPENPIC_MAX_SOURCES];
169 /*
170 * Per Processor Registers
171 */
172 OpenPIC_Processor Processor[OPENPIC_MAX_PROCESSORS];
173};
174
175extern volatile struct OpenPIC __iomem *OpenPIC;
176
177
178 /*
179 * Current Task Priority Register
180 */
181
182#define OPENPIC_CURRENT_TASK_PRIORITY_MASK 0x0000000f
183
184 /*
185 * Who Am I Register
186 */
187
188#define OPENPIC_WHO_AM_I_ID_MASK 0x0000001f
189
190 /*
191 * Feature Reporting Register 0
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 * Global Configuration Register 0
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 * Global Configuration Register 1
210 * This is the EICR on EPICs.
211 */
212
213#define OPENPIC_EICR_S_CLK_MASK 0x70000000
214#define OPENPIC_EICR_SIE 0x08000000
215
216 /*
217 * Vendor Identification Register
218 */
219
220#define OPENPIC_VENDOR_ID_STEPPING_MASK 0x00ff0000
221#define OPENPIC_VENDOR_ID_STEPPING_SHIFT 16
222#define OPENPIC_VENDOR_ID_DEVICE_ID_MASK 0x0000ff00
223#define OPENPIC_VENDOR_ID_DEVICE_ID_SHIFT 8
224#define OPENPIC_VENDOR_ID_VENDOR_ID_MASK 0x000000ff
225
226 /*
227 * Vector/Priority Registers
228 */
229
230#define OPENPIC_MASK 0x80000000
231#define OPENPIC_ACTIVITY 0x40000000 /* Read Only */
232#define OPENPIC_PRIORITY_MASK 0x000f0000
233#define OPENPIC_PRIORITY_SHIFT 16
234#define OPENPIC_VECTOR_MASK 0x000000ff
235
236
237 /*
238 * Interrupt Source Registers
239 */
240
241#define OPENPIC_POLARITY_POSITIVE 0x00800000
242#define OPENPIC_POLARITY_NEGATIVE 0x00000000
243#define OPENPIC_POLARITY_MASK 0x00800000
244#define OPENPIC_SENSE_LEVEL 0x00400000
245#define OPENPIC_SENSE_EDGE 0x00000000
246#define OPENPIC_SENSE_MASK 0x00400000
247
248
249 /*
250 * Timer Registers
251 */
252
253#define OPENPIC_COUNT_MASK 0x7fffffff
254#define OPENPIC_TIMER_TOGGLE 0x80000000
255#define OPENPIC_TIMER_COUNT_INHIBIT 0x80000000
256
257
258 /*
259 * Aliases to make life simpler
260 */
261
262/* Per Processor Registers */
263#define IPI_Dispatch(i) _IPI_Dispatch[i].Reg
264#define Current_Task_Priority _Current_Task_Priority.Reg
265#define Interrupt_Acknowledge _Interrupt_Acknowledge.Reg
266#define EOI _EOI.Reg
267
268/* Global Registers */
269#define Feature_Reporting0 _Feature_Reporting0.Reg
270#define Feature_Reporting1 _Feature_Reporting1.Reg
271#define Global_Configuration0 _Global_Configuration0.Reg
272#define Global_Configuration1 _Global_Configuration1.Reg
273#define Vendor_Specific(i) _Vendor_Specific[i].Reg
274#define Vendor_Identification _Vendor_Identification.Reg
275#define Processor_Initialization _Processor_Initialization.Reg
276#define IPI_Vector_Priority(i) _IPI_Vector_Priority[i].Reg
277#define Spurious_Vector _Spurious_Vector.Reg
278#define Timer_Frequency _Timer_Frequency.Reg
279
280/* Timer Registers */
281#define Current_Count _Current_Count.Reg
282#define Base_Count _Base_Count.Reg
283#define Vector_Priority _Vector_Priority.Reg
284#define Destination _Destination.Reg
285
286/* Interrupt Source Registers */
287#define Vector_Priority _Vector_Priority.Reg
288#define Destination _Destination.Reg
289
290#endif /* __KERNEL__ */
291
292#endif /* _LINUX_OPENPIC_H */