From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e23smtp03.au.ibm.com (e23smtp03.au.ibm.com [202.81.31.145]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "e23smtp03.au.ibm.com", Issuer "Equifax" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id E6E2CB6EDF for ; Wed, 26 Aug 2009 21:09:01 +1000 (EST) Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [202.81.31.246]) by e23smtp03.au.ibm.com (8.14.3/8.13.1) with ESMTP id n7QB6cSU026925 for ; Wed, 26 Aug 2009 21:06:38 +1000 Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id n7QB7TqE1773626 for ; Wed, 26 Aug 2009 21:07:29 +1000 Received: from d23av01.au.ibm.com (loopback [127.0.0.1]) by d23av01.au.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id n7QB7IY6013265 for ; Wed, 26 Aug 2009 21:07:19 +1000 Date: Wed, 26 Aug 2009 16:38:50 +0530 From: Arun R Bharadwaj To: Joel Schopp , Benjamin Herrenschmidt , Paul Mackerras , Peter Zijlstra , Ingo Molnar , Vaidyanathan Srinivasan , Dipankar Sarma , Balbir Singh , Gautham R Shenoy , Arun Bharadwaj Subject: [v2 PATCH 1/2]: pseries: Enable cpuidle for pSeries. Message-ID: <20090826110850.GB29759@linux.vnet.ibm.com> References: <20090826110721.GA29759@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 In-Reply-To: <20090826110721.GA29759@linux.vnet.ibm.com> Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Reply-To: arun@linux.vnet.ibm.com List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , * Arun R Bharadwaj [2009-08-26 16:37:21]: This patch enables the cpuidle option in Kconfig for pSeries. Currently cpuidle infrastructure is enabled only for x86. This code is almost completely borrowed from x86 to enable cpuidle for pSeries. Signed-off-by: Arun R Bharadwaj --- arch/powerpc/Kconfig | 17 +++++++++++++++++ arch/powerpc/include/asm/system.h | 2 ++ arch/powerpc/platforms/pseries/setup.c | 21 +++++++++++++++++++++ 3 files changed, 40 insertions(+) Index: linux.trees.git/arch/powerpc/Kconfig =================================================================== --- linux.trees.git.orig/arch/powerpc/Kconfig +++ linux.trees.git/arch/powerpc/Kconfig @@ -88,6 +88,9 @@ config ARCH_HAS_ILOG2_U64 bool default y if 64BIT +config ARCH_HAS_CPU_IDLE_WAIT + def_bool y + config GENERIC_HWEIGHT bool default y @@ -243,6 +246,20 @@ source "kernel/Kconfig.freezer" source "arch/powerpc/sysdev/Kconfig" source "arch/powerpc/platforms/Kconfig" +menu "Power management options" + +source "drivers/cpuidle/Kconfig" + +config PSERIES_PROCESSOR_IDLE + bool "Idle Power Management Support for pSeries" + depends on PPC_PSERIES && CPU_IDLE + default y + help + Idle Power Management Support for pSeries. This hooks onto cpuidle + infrastructure to help in idle cpu power management. + +endmenu + menu "Kernel options" config HIGHMEM Index: linux.trees.git/arch/powerpc/platforms/pseries/setup.c =================================================================== --- linux.trees.git.orig/arch/powerpc/platforms/pseries/setup.c +++ linux.trees.git/arch/powerpc/platforms/pseries/setup.c @@ -278,6 +278,27 @@ static struct notifier_block pci_dn_reco .notifier_call = pci_dn_reconfig_notifier, }; +static void do_nothing(void *unused) +{ +} + +/* + * cpu_idle_wait - Used to ensure that all the CPUs discard old value of + * pm_idle and update to new pm_idle value. Required while changing pm_idle + * handler on SMP systems. + * + * Caller must have changed pm_idle to the new value before the call. Old + * pm_idle value will not be used by any CPU after the return of this function. + */ +void cpu_idle_wait(void) +{ + /* Ensure that new value of pm_idle is set before proceeding */ + smp_mb(); + /* kick all the CPUs so that they exit out of pm_idle */ + smp_call_function(do_nothing, NULL, 1); +} +EXPORT_SYMBOL_GPL(cpu_idle_wait); + static void __init pSeries_setup_arch(void) { /* Discover PIC type and setup ppc_md accordingly */ Index: linux.trees.git/arch/powerpc/include/asm/system.h =================================================================== --- linux.trees.git.orig/arch/powerpc/include/asm/system.h +++ linux.trees.git/arch/powerpc/include/asm/system.h @@ -546,5 +546,7 @@ extern void account_system_vtime(struct extern struct dentry *powerpc_debugfs_root; +void cpu_idle_wait(void); + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_SYSTEM_H */