diff options
| author | Paul Mackerras <paulus@samba.org> | 2006-03-26 23:03:03 -0500 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2006-03-26 23:03:03 -0500 |
| commit | a0652fc9a28c3ef8cd59264bfcb089c44d1b0e06 (patch) | |
| tree | a28527b65237b3067553a993f5ad06dfb24df044 | |
| parent | 55aab8cd3a498201b769a19de861c77516bdfd45 (diff) | |
powerpc: Unify the 32 and 64 bit idle loops
This unifies the 32-bit (ARCH=ppc and ARCH=powerpc) and 64-bit idle
loops. It brings over the concept of having a ppc_md.power_save
function from 32-bit to ARCH=powerpc, which lets us get rid of
native_idle(). With this we will also be able to simplify the idle
handling for pSeries and cell.
Signed-off-by: Paul Mackerras <paulus@samba.org>
| -rw-r--r-- | arch/powerpc/kernel/Makefile | 6 | ||||
| -rw-r--r-- | arch/powerpc/kernel/entry_32.S | 8 | ||||
| -rw-r--r-- | arch/powerpc/kernel/idle.c (renamed from arch/powerpc/kernel/idle_64.c) | 79 | ||||
| -rw-r--r-- | arch/powerpc/kernel/idle_6xx.S | 15 | ||||
| -rw-r--r-- | arch/powerpc/kernel/idle_power4.S | 15 | ||||
| -rw-r--r-- | arch/powerpc/kernel/setup_32.c | 7 | ||||
| -rw-r--r-- | arch/powerpc/kernel/setup_64.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/platforms/maple/setup.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powermac/setup.c | 2 | ||||
| -rw-r--r-- | arch/ppc/Makefile | 2 | ||||
| -rw-r--r-- | arch/ppc/kernel/Makefile | 4 | ||||
| -rw-r--r-- | arch/ppc/kernel/entry.S | 8 | ||||
| -rw-r--r-- | arch/ppc/kernel/idle.c | 112 | ||||
| -rw-r--r-- | arch/ppc/kernel/idle_6xx.S | 233 | ||||
| -rw-r--r-- | arch/ppc/kernel/idle_power4.S | 91 | ||||
| -rw-r--r-- | include/asm-powerpc/machdep.h | 13 | ||||
| -rw-r--r-- | include/asm-powerpc/reg.h | 4 | ||||
| -rw-r--r-- | include/asm-ppc/machdep.h | 2 |
18 files changed, 74 insertions, 535 deletions
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 80e9fe2632b8..f2c47e907037 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
| @@ -12,12 +12,12 @@ endif | |||
| 12 | 12 | ||
| 13 | obj-y := semaphore.o cputable.o ptrace.o syscalls.o \ | 13 | obj-y := semaphore.o cputable.o ptrace.o syscalls.o \ |
| 14 | irq.o align.o signal_32.o pmc.o vdso.o \ | 14 | irq.o align.o signal_32.o pmc.o vdso.o \ |
| 15 | init_task.o process.o systbl.o | 15 | init_task.o process.o systbl.o idle.o |
| 16 | obj-y += vdso32/ | 16 | obj-y += vdso32/ |
| 17 | obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \ | 17 | obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \ |
| 18 | signal_64.o ptrace32.o \ | 18 | signal_64.o ptrace32.o \ |
| 19 | paca.o cpu_setup_power4.o \ | 19 | paca.o cpu_setup_power4.o \ |
| 20 | firmware.o sysfs.o idle_64.o | 20 | firmware.o sysfs.o |
| 21 | obj-$(CONFIG_PPC64) += vdso64/ | 21 | obj-$(CONFIG_PPC64) += vdso64/ |
| 22 | obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o | 22 | obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o |
| 23 | obj-$(CONFIG_POWER4) += idle_power4.o | 23 | obj-$(CONFIG_POWER4) += idle_power4.o |
| @@ -34,6 +34,7 @@ obj-$(CONFIG_IBMEBUS) += ibmebus.o | |||
| 34 | obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o | 34 | obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o |
| 35 | obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o | 35 | obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o |
| 36 | obj-$(CONFIG_CRASH_DUMP) += crash_dump.o | 36 | obj-$(CONFIG_CRASH_DUMP) += crash_dump.o |
| 37 | obj-$(CONFIG_6xx) += idle_6xx.o | ||
| 37 | 38 | ||
| 38 | ifeq ($(CONFIG_PPC_MERGE),y) | 39 | ifeq ($(CONFIG_PPC_MERGE),y) |
| 39 | 40 | ||
| @@ -51,7 +52,6 @@ obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o | |||
| 51 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o | 52 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o |
| 52 | obj-$(CONFIG_MODULES) += ppc_ksyms.o | 53 | obj-$(CONFIG_MODULES) += ppc_ksyms.o |
| 53 | obj-$(CONFIG_BOOTX_TEXT) += btext.o | 54 | obj-$(CONFIG_BOOTX_TEXT) += btext.o |
| 54 | obj-$(CONFIG_6xx) += idle_6xx.o | ||
| 55 | obj-$(CONFIG_SMP) += smp.o | 55 | obj-$(CONFIG_SMP) += smp.o |
| 56 | obj-$(CONFIG_KPROBES) += kprobes.o | 56 | obj-$(CONFIG_KPROBES) += kprobes.o |
| 57 | obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o | 57 | obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 4827ca1ec89b..b3a979467225 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
| @@ -135,10 +135,10 @@ transfer_to_handler: | |||
| 135 | mfspr r11,SPRN_HID0 | 135 | mfspr r11,SPRN_HID0 |
| 136 | mtcr r11 | 136 | mtcr r11 |
| 137 | BEGIN_FTR_SECTION | 137 | BEGIN_FTR_SECTION |
| 138 | bt- 8,power_save_6xx_restore /* Check DOZE */ | 138 | bt- 8,4f /* Check DOZE */ |
| 139 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) | 139 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) |
| 140 | BEGIN_FTR_SECTION | 140 | BEGIN_FTR_SECTION |
| 141 | bt- 9,power_save_6xx_restore /* Check NAP */ | 141 | bt- 9,4f /* Check NAP */ |
| 142 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) | 142 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) |
| 143 | #endif /* CONFIG_6xx */ | 143 | #endif /* CONFIG_6xx */ |
| 144 | .globl transfer_to_handler_cont | 144 | .globl transfer_to_handler_cont |
| @@ -157,6 +157,10 @@ transfer_to_handler_cont: | |||
| 157 | SYNC | 157 | SYNC |
| 158 | RFI /* jump to handler, enable MMU */ | 158 | RFI /* jump to handler, enable MMU */ |
| 159 | 159 | ||
| 160 | #ifdef CONFIG_6xx | ||
| 161 | 4: b power_save_6xx_restore | ||
| 162 | #endif | ||
| 163 | |||
| 160 | /* | 164 | /* |
| 161 | * On kernel stack overflow, load up an initial stack pointer | 165 | * On kernel stack overflow, load up an initial stack pointer |
| 162 | * and call StackOverflow(regs), which should not return. | 166 | * and call StackOverflow(regs), which should not return. |
diff --git a/arch/powerpc/kernel/idle_64.c b/arch/powerpc/kernel/idle.c index b879d3057ef8..e9f321d74d85 100644 --- a/arch/powerpc/kernel/idle_64.c +++ b/arch/powerpc/kernel/idle.c | |||
| @@ -2,13 +2,17 @@ | |||
| 2 | * Idle daemon for PowerPC. Idle daemon will handle any action | 2 | * Idle daemon for PowerPC. Idle daemon will handle any action |
| 3 | * that needs to be taken when the system becomes idle. | 3 | * that needs to be taken when the system becomes idle. |
| 4 | * | 4 | * |
| 5 | * Originally Written by Cort Dougan (cort@cs.nmt.edu) | 5 | * Originally written by Cort Dougan (cort@cs.nmt.edu). |
| 6 | * Subsequent 32-bit hacking by Tom Rini, Armin Kuster, | ||
| 7 | * Paul Mackerras and others. | ||
| 6 | * | 8 | * |
| 7 | * iSeries supported added by Mike Corrigan <mikejc@us.ibm.com> | 9 | * iSeries supported added by Mike Corrigan <mikejc@us.ibm.com> |
| 8 | * | 10 | * |
| 9 | * Additional shared processor, SMT, and firmware support | 11 | * Additional shared processor, SMT, and firmware support |
| 10 | * Copyright (c) 2003 Dave Engebretsen <engebret@us.ibm.com> | 12 | * Copyright (c) 2003 Dave Engebretsen <engebret@us.ibm.com> |
| 11 | * | 13 | * |
| 14 | * 32-bit and 64-bit versions merged by Paul Mackerras <paulus@samba.org> | ||
| 15 | * | ||
| 12 | * This program is free software; you can redistribute it and/or | 16 | * This program is free software; you can redistribute it and/or |
| 13 | * modify it under the terms of the GNU General Public License | 17 | * modify it under the terms of the GNU General Public License |
| 14 | * as published by the Free Software Foundation; either version | 18 | * as published by the Free Software Foundation; either version |
| @@ -29,18 +33,43 @@ | |||
| 29 | #include <asm/machdep.h> | 33 | #include <asm/machdep.h> |
| 30 | #include <asm/smp.h> | 34 | #include <asm/smp.h> |
| 31 | 35 | ||
| 32 | extern void power4_idle(void); | 36 | #ifdef CONFIG_HOTPLUG_CPU |
| 37 | #define cpu_should_die() (cpu_is_offline(smp_processor_id()) && \ | ||
| 38 | system_state == SYSTEM_RUNNING) | ||
| 39 | #else | ||
| 40 | #define cpu_should_die() 0 | ||
| 41 | #endif | ||
| 33 | 42 | ||
| 34 | void default_idle(void) | 43 | /* |
| 44 | * The body of the idle task. | ||
| 45 | */ | ||
| 46 | void cpu_idle(void) | ||
| 35 | { | 47 | { |
| 36 | unsigned int cpu = smp_processor_id(); | 48 | if (ppc_md.idle_loop) |
| 37 | set_thread_flag(TIF_POLLING_NRFLAG); | 49 | ppc_md.idle_loop(); /* doesn't return */ |
| 38 | 50 | ||
| 51 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
| 39 | while (1) { | 52 | while (1) { |
| 40 | if (!need_resched()) { | 53 | ppc64_runlatch_off(); |
| 41 | while (!need_resched() && !cpu_is_offline(cpu)) { | ||
| 42 | ppc64_runlatch_off(); | ||
| 43 | 54 | ||
| 55 | while (!need_resched() && !cpu_should_die()) { | ||
| 56 | if (ppc_md.power_save) { | ||
| 57 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
| 58 | /* | ||
| 59 | * smp_mb is so clearing of TIF_POLLING_NRFLAG | ||
| 60 | * is ordered w.r.t. need_resched() test. | ||
| 61 | */ | ||
| 62 | smp_mb(); | ||
| 63 | local_irq_disable(); | ||
| 64 | |||
| 65 | /* check again after disabling irqs */ | ||
| 66 | if (!need_resched() && !cpu_should_die()) | ||
| 67 | ppc_md.power_save(); | ||
| 68 | |||
| 69 | local_irq_enable(); | ||
| 70 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
| 71 | |||
| 72 | } else { | ||
| 44 | /* | 73 | /* |
| 45 | * Go into low thread priority and possibly | 74 | * Go into low thread priority and possibly |
| 46 | * low power mode. | 75 | * low power mode. |
| @@ -48,46 +77,18 @@ void default_idle(void) | |||
| 48 | HMT_low(); | 77 | HMT_low(); |
| 49 | HMT_very_low(); | 78 | HMT_very_low(); |
| 50 | } | 79 | } |
| 51 | |||
| 52 | HMT_medium | ||
