[patch 3/8] powerpc: cpu_idle implementation for systemsim
Arnd Bergmann
arndb at de.ibm.com
Sat Jan 14 05:41:16 EST 2006
The original cpu_idle hack from the systemsim git
tree is a bit strange, because it unconditionally
changes the native_idle function. This one instead
introduces a new idle implementation that is only
used on systemsim.
Signed-off-by: Arnd Bergmann <arndb at de.ibm.com>
Index: linux-2.6.16-rc/arch/powerpc/Kconfig
===================================================================
--- linux-2.6.16-rc.orig/arch/powerpc/Kconfig
+++ linux-2.6.16-rc/arch/powerpc/Kconfig
@@ -380,6 +380,15 @@ config PPC_SYSTEMSIM
The Full system simulator is available for download from
http://www.alphaworks.ibm.com/tech/.
+config SYSTEMSIM_IDLE
+ bool " Optimized idle loop for systemsim"
+ depends on PPC_SYSTEMSIM
+ help
+ Selecting this option will enable an more optimized idle loop
+ for running on the IBM Full System Simulator that
+ significantly reduces the load on the host system when
+ simulating an idle system.
+
config XICS
depends on PPC_PSERIES
bool
Index: linux-2.6.16-rc/arch/powerpc/kernel/setup_64.c
===================================================================
--- linux-2.6.16-rc.orig/arch/powerpc/kernel/setup_64.c
+++ linux-2.6.16-rc/arch/powerpc/kernel/setup_64.c
@@ -554,6 +554,23 @@ static void __init emergency_stack_init(
}
/*
+ * Detect if we are running on top of the IBM Full System Simulator.
+ * If we are, use the optimized idle loop for that case.
+ */
+static void __init setup_systemsim_idle(void)
+{
+#ifdef CONFIG_SYSTEMSIM_IDLE
+ struct device_node *mambo_node;
+
+ mambo_node = of_find_node_by_path("/mambo");
+ if (mambo_node) {
+ ppc_md.idle_loop = systemsim_idle;
+ of_node_put(mambo_node);
+ }
+#endif
+}
+
+/*
* Called into from start_kernel, after lock_kernel has been called.
* Initializes bootmem, which is unsed to manage page allocation until
* mem_init is called.
@@ -600,6 +617,8 @@ void __init setup_arch(char **cmdline_p)
ppc_md.setup_arch();
+ setup_systemsim_idle();
+
/* Use the default idle loop if the platform hasn't provided one. */
if (NULL == ppc_md.idle_loop) {
ppc_md.idle_loop = default_idle;
Index: linux-2.6.16-rc/include/asm-powerpc/machdep.h
===================================================================
--- linux-2.6.16-rc.orig/include/asm-powerpc/machdep.h
+++ linux-2.6.16-rc/include/asm-powerpc/machdep.h
@@ -244,6 +244,7 @@ struct machdep_calls {
extern void default_idle(void);
extern void native_idle(void);
+extern void systemsim_idle(void);
extern struct machdep_calls ppc_md;
extern char cmd_line[COMMAND_LINE_SIZE];
Index: linux-2.6.16-rc/arch/powerpc/kernel/idle_systemsim.c
===================================================================
--- /dev/null
+++ linux-2.6.16-rc/arch/powerpc/kernel/idle_systemsim.c
@@ -0,0 +1,35 @@
+/*
+ * Idle daemon for the IBM Full System Simulator.
+ *
+ * Originally Written by Cort Dougan (cort at cs.nmt.edu)
+ * Copyright (c) 2003-2006 IBM Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/sched.h>
+#include <linux/preempt.h>
+
+#include <asm/systemsim.h>
+
+#define SIM_HALT_CODE 126
+
+static inline void systemsim_halt(void)
+{
+ callthru0(SIM_HALT_CODE);
+}
+
+void systemsim_idle(void)
+{
+ while (1) {
+ while (!need_resched())
+ systemsim_halt();
+
+ preempt_enable_no_resched();
+ schedule();
+ preempt_disable();
+ }
+}
Index: linux-2.6.16-rc/arch/powerpc/kernel/Makefile
===================================================================
--- linux-2.6.16-rc.orig/arch/powerpc/kernel/Makefile
+++ linux-2.6.16-rc/arch/powerpc/kernel/Makefile
@@ -21,6 +21,7 @@ obj-$(CONFIG_PPC64) += setup_64.o binfm
obj-$(CONFIG_PPC64) += vdso64/
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
obj-$(CONFIG_POWER4) += idle_power4.o
+obj-$(CONFIG_SYSTEMSIM_IDLE) += idle_systemsim.o
obj-$(CONFIG_PPC_OF) += of_device.o prom_parse.o
procfs-$(CONFIG_PPC64) := proc_ppc64.o
obj-$(CONFIG_PROC_FS) += $(procfs-y)
--
More information about the Linuxppc64-dev
mailing list