diff options
author | Chris Dearman <chris@mips.com> | 2009-07-10 04:54:09 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-11-02 06:00:06 -0500 |
commit | 7098f748283b4c056cca9c284c476b03f004ca12 (patch) | |
tree | 51d3f09abeabfe27dff3351a212b8c8a976ebba4 /arch/mips/include/asm/gic.h | |
parent | 2ee0a42961c942c6a2fb70700ef4e25c0acf5fca (diff) |
MIPS: GIC: Random fixes and enhancements.
Signed-off-by: Chris Dearman <chris@mips.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/include/asm/gic.h')
-rw-r--r-- | arch/mips/include/asm/gic.h | 188 |
1 files changed, 18 insertions, 170 deletions
diff --git a/arch/mips/include/asm/gic.h b/arch/mips/include/asm/gic.h index a8f57341f123..9b9436a4d816 100644 --- a/arch/mips/include/asm/gic.h +++ b/arch/mips/include/asm/gic.h | |||
@@ -12,7 +12,6 @@ | |||
12 | #define _ASM_GICREGS_H | 12 | #define _ASM_GICREGS_H |
13 | 13 | ||
14 | #undef GICISBYTELITTLEENDIAN | 14 | #undef GICISBYTELITTLEENDIAN |
15 | #define GICISWORDLITTLEENDIAN | ||
16 | 15 | ||
17 | /* Constants */ | 16 | /* Constants */ |
18 | #define GIC_POL_POS 1 | 17 | #define GIC_POL_POS 1 |
@@ -20,11 +19,7 @@ | |||
20 | #define GIC_TRIG_EDGE 1 | 19 | #define GIC_TRIG_EDGE 1 |
21 | #define GIC_TRIG_LEVEL 0 | 20 | #define GIC_TRIG_LEVEL 0 |
22 | 21 | ||
23 | #ifdef CONFIG_SMP | ||
24 | #define GIC_NUM_INTRS (24 + NR_CPUS * 2) | 22 | #define GIC_NUM_INTRS (24 + NR_CPUS * 2) |
25 | #else | ||
26 | #define GIC_NUM_INTRS 32 | ||
27 | #endif | ||
28 | 23 | ||
29 | #define MSK(n) ((1 << (n)) - 1) | 24 | #define MSK(n) ((1 << (n)) - 1) |
30 | #define REG32(addr) (*(volatile unsigned int *) (addr)) | 25 | #define REG32(addr) (*(volatile unsigned int *) (addr)) |
@@ -70,13 +65,13 @@ | |||
70 | #define USM_VISIBLE_SECTION_SIZE 0x10000 | 65 | #define USM_VISIBLE_SECTION_SIZE 0x10000 |
71 | 66 | ||
72 | /* Register Map for Shared Section */ | 67 | /* Register Map for Shared Section */ |
73 | #if defined(CONFIG_CPU_LITTLE_ENDIAN) || defined(GICISWORDLITTLEENDIAN) | ||
74 | 68 | ||
75 | #define GIC_SH_CONFIG_OFS 0x0000 | 69 | #define GIC_SH_CONFIG_OFS 0x0000 |
76 | 70 | ||
77 | /* Shared Global Counter */ | 71 | /* Shared Global Counter */ |
78 | #define GIC_SH_COUNTER_31_00_OFS 0x0010 | 72 | #define GIC_SH_COUNTER_31_00_OFS 0x0010 |
79 | #define GIC_SH_COUNTER_63_32_OFS 0x0014 | 73 | #define GIC_SH_COUNTER_63_32_OFS 0x0014 |
74 | #define GIC_SH_REVISIONID_OFS 0x0020 | ||
80 | 75 | ||
81 | /* Interrupt Polarity */ | 76 | /* Interrupt Polarity */ |
82 | #define GIC_SH_POL_31_0_OFS 0x0100 | 77 | #define GIC_SH_POL_31_0_OFS 0x0100 |
@@ -164,24 +159,31 @@ | |||
164 | (GIC_SH_INTR_MAP_TO_VPE_BASE_OFS + (32 * (intr)) + (((vpe) / 32) * 4)) | 159 | (GIC_SH_INTR_MAP_TO_VPE_BASE_OFS + (32 * (intr)) + (((vpe) / 32) * 4)) |
165 | #define GIC_SH_MAP_TO_VPE_REG_BIT(vpe) (1 << ((vpe) % 32)) | 160 | #define GIC_SH_MAP_TO_VPE_REG_BIT(vpe) (1 << ((vpe) % 32)) |
166 | 161 | ||
162 | /* Convert an interrupt number to a byte offset/bit for multi-word registers */ | ||
163 | #define GIC_INTR_OFS(intr) (((intr) / 32)*4) | ||
164 | #define GIC_INTR_BIT(intr) ((intr) % 32) | ||
165 | |||
167 | /* Polarity : Reset Value is always 0 */ | 166 | /* Polarity : Reset Value is always 0 */ |
168 | #define GIC_SH_SET_POLARITY_OFS 0x0100 | 167 | #define GIC_SH_SET_POLARITY_OFS 0x0100 |
169 | #define GIC_SET_POLARITY(intr, pol) \ | 168 | #define GIC_SET_POLARITY(intr, pol) \ |
170 | GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_POLARITY_OFS + (((intr) / 32) * 4)), (pol) << ((intr) % 32)) | 169 | GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_POLARITY_OFS + \ |
170 | GIC_INTR_OFS(intr)), (pol) << GIC_INTR_BIT(intr)) | ||
171 | 171 | ||
172 | /* Triggering : Reset Value is always 0 */ | 172 | /* Triggering : Reset Value is always 0 */ |
173 | #define GIC_SH_SET_TRIGGER_OFS 0x0180 | 173 | #define GIC_SH_SET_TRIGGER_OFS 0x0180 |
174 | #define GIC_SET_TRIGGER(intr, trig) \ | 174 | #define GIC_SET_TRIGGER(intr, trig) \ |
175 | GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_TRIGGER_OFS + (((intr) / 32) * 4)), (trig) << ((intr) % 32)) | 175 | GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_TRIGGER_OFS + \ |
176 | GIC_INTR_OFS(intr)), (trig) << GIC_INTR_BIT(intr)) | ||
176 | 177 | ||
177 | /* Mask manipulation */ | 178 | /* Mask manipulation */ |
178 | #define GIC_SH_SMASK_OFS 0x0380 | 179 | #define GIC_SH_SMASK_OFS 0x0380 |
179 | #define GIC_SET_INTR_MASK(intr, val) \ | 180 | #define GIC_SET_INTR_MASK(intr) \ |
180 | GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_SMASK_OFS + (((intr) / 32) * 4)), ((val) << ((intr) % 32))) | 181 | GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_SMASK_OFS + \ |
181 | 182 | GIC_INTR_OFS(intr)), 1 << GIC_INTR_BIT(intr)) | |
182 | #define GIC_SH_RMASK_OFS 0x0300 | 183 | #define GIC_SH_RMASK_OFS 0x0300 |
183 | #define GIC_CLR_INTR_MASK(intr, val) \ | 184 | #define GIC_CLR_INTR_MASK(intr) \ |
184 | GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_RMASK_OFS + (((intr) / 32) * 4)), ((val) << ((intr) % 32))) | 185 | GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_RMASK_OFS + \ |
186 | GIC_INTR_OFS(intr)), 1 << GIC_INTR_BIT(intr)) | ||
185 | 187 | ||
186 | /* Register Map for Local Section */ | 188 | /* Register Map for Local Section */ |
187 | #define GIC_VPE_CTL_OFS 0x0000 | 189 | #define GIC_VPE_CTL_OFS 0x0000 |
@@ -219,161 +221,6 @@ | |||
219 | #define GIC_UMV_SH_COUNTER_31_00_OFS 0x0000 | 221 | #define GIC_UMV_SH_COUNTER_31_00_OFS 0x0000 |
220 | #define GIC_UMV_SH_COUNTER_63_32_OFS 0x0004 | 222 | #define GIC_UMV_SH_COUNTER_63_32_OFS 0x0004 |
221 | 223 | ||
222 | #else /* CONFIG_CPU_BIG_ENDIAN */ | ||
223 | |||
224 | #define GIC_SH_CONFIG_OFS 0x0000 | ||
225 | |||
226 | /* Shared Global Counter */ | ||
227 | #define GIC_SH_COUNTER_31_00_OFS 0x0014 | ||
228 | #define GIC_SH_COUNTER_63_32_OFS 0x0010 | ||
229 | |||
230 | /* Interrupt Polarity */ | ||
231 | #define GIC_SH_POL_31_0_OFS 0x0104 | ||
232 | #define GIC_SH_POL_63_32_OFS 0x0100 | ||
233 | #define GIC_SH_POL_95_64_OFS 0x010c | ||
234 | #define GIC_SH_POL_127_96_OFS 0x0108 | ||
235 | #define GIC_SH_POL_159_128_OFS 0x0114 | ||
236 | #define GIC_SH_POL_191_160_OFS 0x0110 | ||
237 | #define GIC_SH_POL_223_192_OFS 0x011c | ||
238 | #define GIC_SH_POL_255_224_OFS 0x0118 | ||
239 | |||
240 | /* Edge/Level Triggering */ | ||
241 | #define GIC_SH_TRIG_31_0_OFS 0x0184 | ||
242 | #define GIC_SH_TRIG_63_32_OFS 0x0180 | ||
243 | #define GIC_SH_TRIG_95_64_OFS 0x018c | ||
244 | #define GIC_SH_TRIG_127_96_OFS 0x0188 | ||
245 | #define GIC_SH_TRIG_159_128_OFS 0x0194 | ||
246 | #define GIC_SH_TRIG_191_160_OFS 0x0190 | ||
247 | #define GIC_SH_TRIG_223_192_OFS 0x019c | ||
248 | #define GIC_SH_TRIG_255_224_OFS 0x0198 | ||
249 | |||
250 | /* Dual Edge Triggering */ | ||
251 | #define GIC_SH_DUAL_31_0_OFS 0x0204 | ||
252 | #define GIC_SH_DUAL_63_32_OFS 0x0200 | ||
253 | #define GIC_SH_DUAL_95_64_OFS 0x020c | ||
254 | #define GIC_SH_DUAL_127_96_OFS 0x0208 | ||
255 | #define GIC_SH_DUAL_159_128_OFS 0x0214 | ||
256 | #define GIC_SH_DUAL_191_160_OFS 0x0210 | ||
257 | #define GIC_SH_DUAL_223_192_OFS 0x021c | ||
258 | #define GIC_SH_DUAL_255_224_OFS 0x0218 | ||
259 | |||
260 | /* Set/Clear corresponding bit in Edge Detect Register */ | ||
261 | #define GIC_SH_WEDGE_OFS 0x0280 | ||
262 | |||
263 | /* Reset Mask - Disables Interrupt */ | ||
264 | #define GIC_SH_RMASK_31_0_OFS 0x0304 | ||
265 | #define GIC_SH_RMASK_63_32_OFS 0x0300 | ||
266 | #define GIC_SH_RMASK_95_64_OFS 0x030c | ||
267 | #define GIC_SH_RMASK_127_96_OFS 0x0308 | ||
268 | #define GIC_SH_RMASK_159_128_OFS 0x0314 | ||
269 | #define GIC_SH_RMASK_191_160_OFS 0x0310 | ||
270 | #define GIC_SH_RMASK_223_192_OFS 0x031c | ||
271 | #define GIC_SH_RMASK_255_224_OFS 0x0318 | ||
272 | |||
273 | /* Set Mask (WO) - Enables Interrupt */ | ||
274 | #define GIC_SH_SMASK_31_0_OFS 0x0384 | ||
275 | #define GIC_SH_SMASK_63_32_OFS 0x0380 | ||
276 | #define GIC_SH_SMASK_95_64_OFS 0x038c | ||
277 | #define GIC_SH_SMASK_127_96_OFS 0x0388 | ||
278 | #define GIC_SH_SMASK_159_128_OFS 0x0394 | ||
279 | #define GIC_SH_SMASK_191_160_OFS 0x0390 | ||
280 | #define GIC_SH_SMASK_223_192_OFS 0x039c | ||
281 | #define GIC_SH_SMASK_255_224_OFS 0x0398 | ||
282 | |||
283 | /* Global Interrupt Mask Register (RO) - Bit Set == Interrupt enabled */ | ||
284 | #define GIC_SH_MASK_31_0_OFS 0x0404 | ||
285 | #define GIC_SH_MASK_63_32_OFS 0x0400 | ||
286 | #define GIC_SH_MASK_95_64_OFS 0x040c | ||
287 | #define GIC_SH_MASK_127_96_OFS 0x0408 | ||
288 | #define GIC_SH_MASK_159_128_OFS 0x0414 | ||
289 | #define GIC_SH_MASK_191_160_OFS 0x0410 | ||
290 | #define GIC_SH_MASK_223_192_OFS 0x041c | ||
291 | #define GIC_SH_MASK_255_224_OFS 0x0418 | ||
292 | |||
293 | /* Pending Global Interrupts (RO) */ | ||
294 | #define GIC_SH_PEND_31_0_OFS 0x0484 | ||
295 | #define GIC_SH_PEND_63_32_OFS 0x0480 | ||
296 | #define GIC_SH_PEND_95_64_OFS 0x048c | ||
297 | #define GIC_SH_PEND_127_96_OFS 0x0488 | ||
298 | #define GIC_SH_PEND_159_128_OFS 0x0494 | ||
299 | #define GIC_SH_PEND_191_160_OFS 0x0490 | ||
300 | #define GIC_SH_PEND_223_192_OFS 0x049c | ||
301 | #define GIC_SH_PEND_255_224_OFS 0x0498 | ||
302 | |||
303 | #define GIC_SH_INTR_MAP_TO_PIN_BASE_OFS 0x0500 | ||
304 | |||
305 | /* Maps Interrupt X to a Pin */ | ||
306 | #define GIC_SH_MAP_TO_PIN(intr) \ | ||
307 | (GIC_SH_INTR_MAP_TO_PIN_BASE_OFS + (4 * intr)) | ||
308 | |||
309 | #define GIC_SH_INTR_MAP_TO_VPE_BASE_OFS 0x2004 | ||
310 | |||
311 | /* | ||
312 | * Maps Interrupt X to a VPE. This is more complex than the LE case, as | ||
313 | * odd and even registers need to be transposed. It does work - trust me! | ||
314 | */ | ||
315 | #define GIC_SH_MAP_TO_VPE_REG_OFF(intr, vpe) \ | ||
316 | (GIC_SH_INTR_MAP_TO_VPE_BASE_OFS + (32 * (intr)) + \ | ||
317 | (((((vpe) / 32) ^ 1) - 1) * 4)) | ||
318 | #define GIC_SH_MAP_TO_VPE_REG_BIT(vpe) (1 << ((vpe) % 32)) | ||
319 | |||
320 | /* Polarity */ | ||
321 | #define GIC_SH_SET_POLARITY_OFS 0x0100 | ||
322 | #define GIC_SET_POLARITY(intr, pol) \ | ||
323 | GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_POLARITY_OFS + 4 + (((((intr) / 32) ^ 1) - 1) * 4)), (pol) << ((intr) % 32)) | ||
324 | |||
325 | /* Triggering */ | ||
326 | #define GIC_SH_SET_TRIGGER_OFS 0x0180 | ||
327 | #define GIC_SET_TRIGGER(intr, trig) \ | ||
328 | GICBIS(GIC_REG_ADDR(SHARED, GIC_SH_SET_TRIGGER_OFS + 4 + (((((intr) / 32) ^ 1) - 1) * 4)), (trig) << ((intr) % 32)) | ||
329 | |||
330 | /* Mask manipulation */ | ||
331 | #define GIC_SH_SMASK_OFS 0x0380 | ||
332 | #define GIC_SET_INTR_MASK(intr, val) \ | ||
333 | GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_SMASK_OFS + 4 + (((((intr) / 32) ^ 1) - 1) * 4)), ((val) << ((intr) % 32))) | ||
334 | |||
335 | #define GIC_SH_RMASK_OFS 0x0300 | ||
336 | #define GIC_CLR_INTR_MASK(intr, val) \ | ||
337 | GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_RMASK_OFS + 4 + (((((intr) / 32) ^ 1) - 1) * 4)), ((val) << ((intr) % 32))) | ||
338 | |||
339 | /* Register Map for Local Section */ | ||
340 | #define GIC_VPE_CTL_OFS 0x0000 | ||
341 | #define GIC_VPE_PEND_OFS 0x0004 | ||
342 | #define GIC_VPE_MASK_OFS 0x0008 | ||
343 | #define GIC_VPE_RMASK_OFS 0x000c | ||
344 | #define GIC_VPE_SMASK_OFS 0x0010 | ||
345 | #define GIC_VPE_WD_MAP_OFS 0x0040 | ||
346 | #define GIC_VPE_COMPARE_MAP_OFS 0x0044 | ||
347 | #define GIC_VPE_TIMER_MAP_OFS 0x0048 | ||
348 | #define GIC_VPE_PERFCTR_MAP_OFS 0x0050 | ||
349 | #define GIC_VPE_SWINT0_MAP_OFS 0x0054 | ||
350 | #define GIC_VPE_SWINT1_MAP_OFS 0x0058 | ||
351 | #define GIC_VPE_OTHER_ADDR_OFS 0x0080 | ||
352 | #define GIC_VPE_WD_CONFIG0_OFS 0x0090 | ||
353 | #define GIC_VPE_WD_COUNT0_OFS 0x0094 | ||
354 | #define GIC_VPE_WD_INITIAL0_OFS 0x0098 | ||
355 | #define GIC_VPE_COMPARE_LO_OFS 0x00a4 | ||
356 | #define GIC_VPE_COMPARE_HI_OFS 0x00a0 | ||
357 | |||
358 | #define GIC_VPE_EIC_SHADOW_SET_BASE 0x0100 | ||
359 | #define GIC_VPE_EIC_SS(intr) \ | ||
360 | (GIC_EIC_SHADOW_SET_BASE + (4 * intr)) | ||
361 | |||
362 | #define GIC_VPE_EIC_VEC_BASE 0x0800 | ||
363 | #define GIC_VPE_EIC_VEC(intr) \ | ||
364 | (GIC_VPE_EIC_VEC_BASE + (4 * intr)) | ||
365 | |||
366 | #define GIC_VPE_TENABLE_NMI_OFS 0x1000 | ||
367 | #define GIC_VPE_TENABLE_YQ_OFS 0x1004 | ||
368 | #define GIC_VPE_TENABLE_INT_31_0_OFS 0x1080 | ||
369 | #define GIC_VPE_TENABLE_INT_63_32_OFS 0x1084 | ||
370 | |||
371 | /* User Mode Visible Section Register Map */ | ||
372 | #define GIC_UMV_SH_COUNTER_31_00_OFS 0x0004 | ||
373 | #define GIC_UMV_SH_COUNTER_63_32_OFS 0x0000 | ||
374 | |||
375 | #endif /* !LE */ | ||
376 | |||
377 | /* Masks */ | 224 | /* Masks */ |
378 | #define GIC_SH_CONFIG_COUNTSTOP_SHF 28 | 225 | #define GIC_SH_CONFIG_COUNTSTOP_SHF 28 |
379 | #define GIC_SH_CONFIG_COUNTSTOP_MSK (MSK(1) << GIC_SH_CONFIG_COUNTSTOP_SHF) | 226 | #define GIC_SH_CONFIG_COUNTSTOP_MSK (MSK(1) << GIC_SH_CONFIG_COUNTSTOP_SHF) |
@@ -473,12 +320,13 @@ struct gic_intrmask_regs { | |||
473 | * in building ipi_map. | 320 | * in building ipi_map. |
474 | */ | 321 | */ |
475 | struct gic_intr_map { | 322 | struct gic_intr_map { |
476 | unsigned int intrnum; /* Ext Intr Num */ | ||
477 | unsigned int cpunum; /* Directed to this CPU */ | 323 | unsigned int cpunum; /* Directed to this CPU */ |
478 | unsigned int pin; /* Directed to this Pin */ | 324 | unsigned int pin; /* Directed to this Pin */ |
479 | unsigned int polarity; /* Polarity : +/- */ | 325 | unsigned int polarity; /* Polarity : +/- */ |
480 | unsigned int trigtype; /* Trigger : Edge/Levl */ | 326 | unsigned int trigtype; /* Trigger : Edge/Levl */ |
481 | unsigned int ipiflag; /* Is used for IPI ? */ | 327 | unsigned int flags; /* Misc flags */ |
328 | #define GIC_FLAG_IPI 0x01 | ||
329 | #define GIC_FLAG_TRANSPARENT 0x02 | ||
482 | }; | 330 | }; |
483 | 331 | ||
484 | extern void gic_init(unsigned long gic_base_addr, | 332 | extern void gic_init(unsigned long gic_base_addr, |