diff options
-rw-r--r-- | arch/mips/Kconfig | 13 | ||||
-rw-r--r-- | arch/mips/kernel/entry.S | 2 | ||||
-rw-r--r-- | arch/mips/kernel/genex.S | 2 | ||||
-rw-r--r-- | include/asm-mips/irq.h | 2 |
4 files changed, 18 insertions, 1 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index a00fabe2e4e0..49f02e351244 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -1404,6 +1404,19 @@ config MIPS_MT_SMTC_INSTANT_REPLAY | |||
1404 | it off), but ensures that IPIs are handled promptly even under | 1404 | it off), but ensures that IPIs are handled promptly even under |
1405 | heavy I/O interrupt load. | 1405 | heavy I/O interrupt load. |
1406 | 1406 | ||
1407 | config MIPS_MT_SMTC_IM_BACKSTOP | ||
1408 | bool "Use per-TC register bits as backstop for inhibited IM bits" | ||
1409 | depends on MIPS_MT_SMTC | ||
1410 | default y | ||
1411 | help | ||
1412 | To support multiple TC microthreads acting as "CPUs" within | ||
1413 | a VPE, VPE-wide interrupt mask bits must be specially manipulated | ||
1414 | during interrupt handling. To support legacy drivers and interrupt | ||
1415 | controller management code, SMTC has a "backstop" to track and | ||
1416 | if necessary restore the interrupt mask. This has some performance | ||
1417 | impact on interrupt service overhead. Disable it only if you know | ||
1418 | what you are doing. | ||
1419 | |||
1407 | config MIPS_VPE_LOADER_TOM | 1420 | config MIPS_VPE_LOADER_TOM |
1408 | bool "Load VPE program into memory hidden from linux" | 1421 | bool "Load VPE program into memory hidden from linux" |
1409 | depends on MIPS_VPE_LOADER | 1422 | depends on MIPS_VPE_LOADER |
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index 686249c5c328..e29598ae939d 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S | |||
@@ -84,6 +84,7 @@ FEXPORT(restore_all) # restore full frame | |||
84 | LONG_S sp, TI_REGS($28) | 84 | LONG_S sp, TI_REGS($28) |
85 | jal deferred_smtc_ipi | 85 | jal deferred_smtc_ipi |
86 | LONG_S s0, TI_REGS($28) | 86 | LONG_S s0, TI_REGS($28) |
87 | #ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP | ||
87 | /* Re-arm any temporarily masked interrupts not explicitly "acked" */ | 88 | /* Re-arm any temporarily masked interrupts not explicitly "acked" */ |
88 | mfc0 v0, CP0_TCSTATUS | 89 | mfc0 v0, CP0_TCSTATUS |
89 | ori v1, v0, TCSTATUS_IXMT | 90 | ori v1, v0, TCSTATUS_IXMT |
@@ -110,6 +111,7 @@ FEXPORT(restore_all) # restore full frame | |||
110 | _ehb | 111 | _ehb |
111 | xor t0, t0, t3 | 112 | xor t0, t0, t3 |
112 | mtc0 t0, CP0_TCCONTEXT | 113 | mtc0 t0, CP0_TCCONTEXT |
114 | #endif /* CONFIG_MIPS_MT_SMTC_IM_BACKSTOP */ | ||
113 | #endif /* CONFIG_MIPS_MT_SMTC */ | 115 | #endif /* CONFIG_MIPS_MT_SMTC */ |
114 | .set noat | 116 | .set noat |
115 | RESTORE_TEMP | 117 | RESTORE_TEMP |
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index 297bd56c2347..c0f19d638b98 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
@@ -243,9 +243,11 @@ NESTED(except_vec_vi_handler, 0, sp) | |||
243 | */ | 243 | */ |
244 | mfc0 t1, CP0_STATUS | 244 | mfc0 t1, CP0_STATUS |
245 | and t0, a0, t1 | 245 | and t0, a0, t1 |
246 | #ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP | ||
246 | mfc0 t2, CP0_TCCONTEXT | 247 | mfc0 t2, CP0_TCCONTEXT |
247 | or t0, t0, t2 | 248 | or t0, t0, t2 |
248 | mtc0 t0, CP0_TCCONTEXT | 249 | mtc0 t0, CP0_TCCONTEXT |
250 | #endif /* CONFIG_MIPS_MT_SMTC_IM_BACKSTOP */ | ||
249 | xor t1, t1, t0 | 251 | xor t1, t1, t0 |
250 | mtc0 t1, CP0_STATUS | 252 | mtc0 t1, CP0_STATUS |
251 | _ehb | 253 | _ehb |
diff --git a/include/asm-mips/irq.h b/include/asm-mips/irq.h index 3ca6a076124d..97102ebc54b1 100644 --- a/include/asm-mips/irq.h +++ b/include/asm-mips/irq.h | |||
@@ -24,7 +24,7 @@ static inline int irq_canonicalize(int irq) | |||
24 | #define irq_canonicalize(irq) (irq) /* Sane hardware, sane code ... */ | 24 | #define irq_canonicalize(irq) (irq) /* Sane hardware, sane code ... */ |
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | #ifdef CONFIG_MIPS_MT_SMTC | 27 | #ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP |
28 | /* | 28 | /* |
29 | * Clear interrupt mask handling "backstop" if irq_hwmask | 29 | * Clear interrupt mask handling "backstop" if irq_hwmask |
30 | * entry so indicates. This implies that the ack() or end() | 30 | * entry so indicates. This implies that the ack() or end() |