diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sh/Kconfig | 10 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/init.c | 19 |
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 4d16d8917074..2715834f72be 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -366,6 +366,16 @@ config SH_STORE_QUEUES | |||
366 | Selecting this option will enable an in-kernel API for manipulating | 366 | Selecting this option will enable an in-kernel API for manipulating |
367 | the store queues integrated in the SH-4 processors. | 367 | the store queues integrated in the SH-4 processors. |
368 | 368 | ||
369 | config SPECULATIVE_EXECUTION | ||
370 | bool "Speculative subroutine return" | ||
371 | depends on CPU_SUBTYPE_SH7780 && EXPERIMENTAL | ||
372 | help | ||
373 | This enables support for a speculative instruction fetch for | ||
374 | subroutine return. There are various pitfalls associated with | ||
375 | this, as outlined in the SH7780 hardware manual. | ||
376 | |||
377 | If unsure, say N. | ||
378 | |||
369 | config CPU_HAS_INTEVT | 379 | config CPU_HAS_INTEVT |
370 | bool | 380 | bool |
371 | 381 | ||
diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c index 726acfcb9b77..6451ad630174 100644 --- a/arch/sh/kernel/cpu/init.c +++ b/arch/sh/kernel/cpu/init.c | |||
@@ -41,6 +41,23 @@ __setup("no" __stringify(x), x##_setup); | |||
41 | onchip_setup(fpu); | 41 | onchip_setup(fpu); |
42 | onchip_setup(dsp); | 42 | onchip_setup(dsp); |
43 | 43 | ||
44 | #ifdef CONFIG_SPECULATIVE_EXECUTION | ||
45 | #define CPUOPM 0xff2f0000 | ||
46 | #define CPUOPM_RABD (1 << 5) | ||
47 | |||
48 | static void __init speculative_execution_init(void) | ||
49 | { | ||
50 | /* Clear RABD */ | ||
51 | ctrl_outl(ctrl_inl(CPUOPM) & ~CPUOPM_RABD, CPUOPM); | ||
52 | |||
53 | /* Flush the update */ | ||
54 | (void)ctrl_inl(CPUOPM); | ||
55 | ctrl_barrier(); | ||
56 | } | ||
57 | #else | ||
58 | #define speculative_execution_init() do { } while (0) | ||
59 | #endif | ||
60 | |||
44 | /* | 61 | /* |
45 | * Generic first-level cache init | 62 | * Generic first-level cache init |
46 | */ | 63 | */ |
@@ -261,4 +278,6 @@ asmlinkage void __init sh_cpu_init(void) | |||
261 | */ | 278 | */ |
262 | ubc_wakeup(); | 279 | ubc_wakeup(); |
263 | #endif | 280 | #endif |
281 | |||
282 | speculative_execution_init(); | ||
264 | } | 283 | } |