]> err.no Git - linux-2.6/commitdiff
sh: speculative execution support for SH7780.
authorPaul Mundt <lethal@linux-sh.org>
Thu, 8 Mar 2007 09:12:17 +0000 (18:12 +0900)
committerPaul Mundt <lethal@hera.kernel.org>
Mon, 7 May 2007 02:10:51 +0000 (02:10 +0000)
SH7780 has a speculative execution mode where it can speculatively
perform an instruction fetch for subroutine returns, this allows it
to be enabled. There are some various pitfalls associated with this
mode, so it's left as depending on CONFIG_EXPERIMENTAL and not
enabled by default.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/Kconfig
arch/sh/kernel/cpu/init.c

index 4d16d89170749ccff61b432972cacd6e0e5f36b5..2715834f72bef5e0bf3cafcd3173b9bd56f6818e 100644 (file)
@@ -366,6 +366,16 @@ config SH_STORE_QUEUES
          Selecting this option will enable an in-kernel API for manipulating
          the store queues integrated in the SH-4 processors.
 
+config SPECULATIVE_EXECUTION
+       bool "Speculative subroutine return"
+       depends on CPU_SUBTYPE_SH7780 && EXPERIMENTAL
+       help
+         This enables support for a speculative instruction fetch for
+         subroutine return. There are various pitfalls associated with
+         this, as outlined in the SH7780 hardware manual.
+
+         If unsure, say N.
+
 config CPU_HAS_INTEVT
        bool
 
index 726acfcb9b77bb8d94f879b6aeca4d309c9c1d82..6451ad630174b22646d1e7ab574945ff6059e8ec 100644 (file)
@@ -41,6 +41,23 @@ __setup("no" __stringify(x), x##_setup);
 onchip_setup(fpu);
 onchip_setup(dsp);
 
+#ifdef CONFIG_SPECULATIVE_EXECUTION
+#define CPUOPM         0xff2f0000
+#define CPUOPM_RABD    (1 << 5)
+
+static void __init speculative_execution_init(void)
+{
+       /* Clear RABD */
+       ctrl_outl(ctrl_inl(CPUOPM) & ~CPUOPM_RABD, CPUOPM);
+
+       /* Flush the update */
+       (void)ctrl_inl(CPUOPM);
+       ctrl_barrier();
+}
+#else
+#define speculative_execution_init()   do { } while (0)
+#endif
+
 /*
  * Generic first-level cache init
  */
@@ -261,4 +278,6 @@ asmlinkage void __init sh_cpu_init(void)
         */
        ubc_wakeup();
 #endif
+
+       speculative_execution_init();
 }