diff options
Diffstat (limited to 'arch/mn10300')
-rw-r--r-- | arch/mn10300/Kconfig | 74 | ||||
-rw-r--r-- | arch/mn10300/include/asm/irqflags.h | 8 |
2 files changed, 76 insertions, 6 deletions
diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index a1f334ce0a36..a0a16e6e4a4e 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig | |||
@@ -351,6 +351,80 @@ config MN10300_TTYSM2_CTS | |||
351 | 351 | ||
352 | endmenu | 352 | endmenu |
353 | 353 | ||
354 | menu "Interrupt request priority options" | ||
355 | |||
356 | comment "[!] NOTE: A lower number/level indicates a higher priority (0 is highest, 6 is lowest)" | ||
357 | |||
358 | comment "____Non-maskable interrupt levels____" | ||
359 | comment "The following must be set to a higher priority than local_irq_disable() and on-chip serial" | ||
360 | |||
361 | config GDBSTUB_IRQ_LEVEL | ||
362 | int "GDBSTUB interrupt priority" | ||
363 | depends on GDBSTUB | ||
364 | range 0 1 if LINUX_CLI_LEVEL = 2 | ||
365 | range 0 2 if LINUX_CLI_LEVEL = 3 | ||
366 | range 0 3 if LINUX_CLI_LEVEL = 4 | ||
367 | range 0 4 if LINUX_CLI_LEVEL = 5 | ||
368 | range 0 5 if LINUX_CLI_LEVEL = 6 | ||
369 | default 0 | ||
370 | |||
371 | comment "The following must be set to a higher priority than local_irq_disable()" | ||
372 | |||
373 | config MN10300_SERIAL_IRQ_LEVEL | ||
374 | int "MN10300 on-chip serial interrupt priority" | ||
375 | depends on MN10300_TTYSM | ||
376 | range 1 1 if LINUX_CLI_LEVEL = 2 | ||
377 | range 1 2 if LINUX_CLI_LEVEL = 3 | ||
378 | range 1 3 if LINUX_CLI_LEVEL = 4 | ||
379 | range 1 4 if LINUX_CLI_LEVEL = 5 | ||
380 | range 1 5 if LINUX_CLI_LEVEL = 6 | ||
381 | default 1 | ||
382 | |||
383 | comment "-" | ||
384 | comment "____Maskable interrupt levels____" | ||
385 | |||
386 | config LINUX_CLI_LEVEL | ||
387 | int "The highest interrupt priority excluded by local_irq_disable() (2-6)" | ||
388 | range 2 6 | ||
389 | default 2 | ||
390 | help | ||
391 | local_irq_disable() doesn't actually disable maskable interrupts - | ||
392 | what it does is restrict the levels of interrupt which are permitted | ||
393 | (a lower level indicates a higher priority) by lowering the value in | ||
394 | EPSW.IM from 7. Any interrupt is permitted for which the level is | ||
395 | lower than EPSW.IM. | ||
396 | |||
397 | Certain interrupts, such as GDBSTUB and virtual MN10300 on-chip | ||
398 | serial DMA interrupts are allowed to interrupt normal disabled | ||
399 | sections. | ||
400 | |||
401 | comment "The following must be set to a equal to or lower priority than LINUX_CLI_LEVEL" | ||
402 | |||
403 | config TIMER_IRQ_LEVEL | ||
404 | int "Kernel timer interrupt priority" | ||
405 | range LINUX_CLI_LEVEL 6 | ||
406 | default 4 | ||
407 | |||
408 | config PCI_IRQ_LEVEL | ||
409 | int "PCI interrupt priority" | ||
410 | depends on PCI | ||
411 | range LINUX_CLI_LEVEL 6 | ||
412 | default 5 | ||
413 | |||
414 | config ETHERNET_IRQ_LEVEL | ||
415 | int "Ethernet interrupt priority" | ||
416 | depends on SMC91X || SMC911X || SMSC911X | ||
417 | range LINUX_CLI_LEVEL 6 | ||
418 | default 6 | ||
419 | |||
420 | config EXT_SERIAL_IRQ_LEVEL | ||
421 | int "External serial port interrupt priority" | ||
422 | depends on SERIAL_8250 | ||
423 | range LINUX_CLI_LEVEL 6 | ||
424 | default 6 | ||
425 | |||
426 | endmenu | ||
427 | |||
354 | source "mm/Kconfig" | 428 | source "mm/Kconfig" |
355 | 429 | ||
356 | menu "Power management options" | 430 | menu "Power management options" |
diff --git a/arch/mn10300/include/asm/irqflags.h b/arch/mn10300/include/asm/irqflags.h index f1b64b256060..b3ab2071354d 100644 --- a/arch/mn10300/include/asm/irqflags.h +++ b/arch/mn10300/include/asm/irqflags.h | |||
@@ -23,11 +23,7 @@ | |||
23 | * - level 6 - timer interrupt | 23 | * - level 6 - timer interrupt |
24 | * - "enabled": run in IM7 | 24 | * - "enabled": run in IM7 |
25 | */ | 25 | */ |
26 | #ifdef CONFIG_MN10300_TTYSM | 26 | #define MN10300_CLI_LEVEL (CONFIG_LINUX_CLI_LEVEL << EPSW_IM_SHIFT) |
27 | #define MN10300_CLI_LEVEL EPSW_IM_2 | ||
28 | #else | ||
29 | #define MN10300_CLI_LEVEL EPSW_IM_1 | ||
30 | #endif | ||
31 | 27 | ||
32 | #ifndef __ASSEMBLY__ | 28 | #ifndef __ASSEMBLY__ |
33 | 29 | ||
@@ -94,7 +90,7 @@ static inline void arch_local_irq_restore(unsigned long flags) | |||
94 | 90 | ||
95 | static inline bool arch_irqs_disabled_flags(unsigned long flags) | 91 | static inline bool arch_irqs_disabled_flags(unsigned long flags) |
96 | { | 92 | { |
97 | return (flags & EPSW_IM) <= MN10300_CLI_LEVEL; | 93 | return (flags & (EPSW_IE | EPSW_IM)) != (EPSW_IE | EPSW_IM_7); |
98 | } | 94 | } |
99 | 95 | ||
100 | static inline bool arch_irqs_disabled(void) | 96 | static inline bool arch_irqs_disabled(void) |