Commit 962e7bd4 authored by Deepthi Dharwar's avatar Deepthi Dharwar Committed by Benjamin Herrenschmidt

powerpc/pseries/cpuidle: Move processor_idle.c to drivers/cpuidle.

Move the file from arch specific pseries/processor_idle.c
to drivers/cpuidle/cpuidle-pseries.c
Make the relevant Makefile and Kconfig changes.
Also, introduce Kconfig.powerpc in drivers/cpuidle
for all powerpc cpuidle drivers.
Signed-off-by: default avatarDeepthi Dharwar <deepthi@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent d765ff23
...@@ -451,7 +451,7 @@ enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF}; ...@@ -451,7 +451,7 @@ enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF};
extern int powersave_nap; /* set if nap mode can be used in idle loop */ extern int powersave_nap; /* set if nap mode can be used in idle loop */
extern void power7_nap(void); extern void power7_nap(void);
#ifdef CONFIG_PSERIES_IDLE #ifdef CONFIG_PSERIES_CPUIDLE
extern void update_smt_snooze_delay(int cpu, int residency); extern void update_smt_snooze_delay(int cpu, int residency);
#else #else
static inline void update_smt_snooze_delay(int cpu, int residency) {} static inline void update_smt_snooze_delay(int cpu, int residency) {}
......
...@@ -119,12 +119,3 @@ config DTL ...@@ -119,12 +119,3 @@ config DTL
which are accessible through a debugfs file. which are accessible through a debugfs file.
Say N if you are unsure. Say N if you are unsure.
config PSERIES_IDLE
bool "Cpuidle driver for pSeries platforms"
depends on CPU_IDLE
depends on PPC_PSERIES
default y
help
Select this option to enable processor idle state management
through cpuidle subsystem.
...@@ -21,7 +21,6 @@ obj-$(CONFIG_HCALL_STATS) += hvCall_inst.o ...@@ -21,7 +21,6 @@ obj-$(CONFIG_HCALL_STATS) += hvCall_inst.o
obj-$(CONFIG_CMM) += cmm.o obj-$(CONFIG_CMM) += cmm.o
obj-$(CONFIG_DTL) += dtl.o obj-$(CONFIG_DTL) += dtl.o
obj-$(CONFIG_IO_EVENT_IRQ) += io_event_irq.o obj-$(CONFIG_IO_EVENT_IRQ) += io_event_irq.o
obj-$(CONFIG_PSERIES_IDLE) += processor_idle.o
obj-$(CONFIG_LPARCFG) += lparcfg.o obj-$(CONFIG_LPARCFG) += lparcfg.o
ifeq ($(CONFIG_PPC_PSERIES),y) ifeq ($(CONFIG_PPC_PSERIES),y)
......
...@@ -35,6 +35,11 @@ depends on ARM ...@@ -35,6 +35,11 @@ depends on ARM
source "drivers/cpuidle/Kconfig.arm" source "drivers/cpuidle/Kconfig.arm"
endmenu endmenu
menu "POWERPC CPU Idle Drivers"
depends on PPC
source "drivers/cpuidle/Kconfig.powerpc"
endmenu
endif endif
config ARCH_NEEDS_CPU_IDLE_COUPLED config ARCH_NEEDS_CPU_IDLE_COUPLED
......
#
# POWERPC CPU Idle Drivers
#
config PSERIES_CPUIDLE
bool "Cpuidle driver for pSeries platforms"
depends on CPU_IDLE
depends on PPC_PSERIES
default y
help
Select this option to enable processor idle state management
through cpuidle subsystem.
...@@ -13,3 +13,7 @@ obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o ...@@ -13,3 +13,7 @@ obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o
obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o
obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o
obj-$(CONFIG_ARM_AT91_CPUIDLE) += cpuidle-at91.o obj-$(CONFIG_ARM_AT91_CPUIDLE) += cpuidle-at91.o
###############################################################################
# POWERPC drivers
obj-$(CONFIG_PSERIES_CPUIDLE) += cpuidle-pseries.o
/* /*
* processor_idle - idle state cpuidle driver. * cpuidle-pseries - idle state cpuidle driver.
* Adapted from drivers/idle/intel_idle.c and * Adapted from drivers/idle/intel_idle.c and
* drivers/acpi/processor_idle.c * drivers/acpi/processor_idle.c
* *
...@@ -27,6 +27,7 @@ struct cpuidle_driver pseries_idle_driver = { ...@@ -27,6 +27,7 @@ struct cpuidle_driver pseries_idle_driver = {
#define MAX_IDLE_STATE_COUNT 2 #define MAX_IDLE_STATE_COUNT 2
static int max_idle_state = MAX_IDLE_STATE_COUNT - 1; static int max_idle_state = MAX_IDLE_STATE_COUNT - 1;
static struct cpuidle_device __percpu *pseries_cpuidle_devices;
static struct cpuidle_state *cpuidle_state_table; static struct cpuidle_state *cpuidle_state_table;
static inline void idle_loop_prolog(unsigned long *in_purr) static inline void idle_loop_prolog(unsigned long *in_purr)
...@@ -187,7 +188,7 @@ static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n, ...@@ -187,7 +188,7 @@ static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
{ {
int hotcpu = (unsigned long)hcpu; int hotcpu = (unsigned long)hcpu;
struct cpuidle_device *dev = struct cpuidle_device *dev =
per_cpu_ptr(cpuidle_devices, hotcpu); per_cpu_ptr(pseries_cpuidle_devices, hotcpu);
if (dev && cpuidle_get_driver()) { if (dev && cpuidle_get_driver()) {
switch (action) { switch (action) {
...@@ -244,6 +245,50 @@ static int pseries_cpuidle_driver_init(void) ...@@ -244,6 +245,50 @@ static int pseries_cpuidle_driver_init(void)
return 0; return 0;
} }
/* pseries_idle_devices_uninit(void)
* unregister cpuidle devices and de-allocate memory
*/
static void pseries_idle_devices_uninit(void)
{
int i;
struct cpuidle_device *dev;
for_each_possible_cpu(i) {
dev = per_cpu_ptr(pseries_cpuidle_devices, i);
cpuidle_unregister_device(dev);
}
free_percpu(pseries_cpuidle_devices);
return;
}
/* pseries_idle_devices_init()
* allocate, initialize and register cpuidle device
*/
static int pseries_idle_devices_init(void)
{
int i;
struct cpuidle_driver *drv = &pseries_idle_driver;
struct cpuidle_device *dev;
pseries_cpuidle_devices = alloc_percpu(struct cpuidle_device);
if (pseries_cpuidle_devices == NULL)
return -ENOMEM;
for_each_possible_cpu(i) {
dev = per_cpu_ptr(pseries_cpuidle_devices, i);
dev->state_count = drv->state_count;
dev->cpu = i;
if (cpuidle_register_device(dev)) {
printk(KERN_DEBUG \
"cpuidle_register_device %d failed!\n", i);
return -EIO;
}
}
return 0;
}
/* /*
* pseries_idle_probe() * pseries_idle_probe()
* Choose state table for shared versus dedicated partition * Choose state table for shared versus dedicated partition
...@@ -279,12 +324,19 @@ static int __init pseries_processor_idle_init(void) ...@@ -279,12 +324,19 @@ static int __init pseries_processor_idle_init(void)
return retval; return retval;
pseries_cpuidle_driver_init(); pseries_cpuidle_driver_init();
retval = cpuidle_register(&pseries_idle_driver, NULL); retval = cpuidle_register_driver(&pseries_idle_driver);
if (retval) { if (retval) {
printk(KERN_DEBUG "Registration of pseries driver failed.\n"); printk(KERN_DEBUG "Registration of pseries driver failed.\n");
return retval; return retval;
} }
retval = pseries_idle_devices_init();
if (retval) {
pseries_idle_devices_uninit();
cpuidle_unregister_driver(&pseries_idle_driver);
return retval;
}
register_cpu_notifier(&setup_hotplug_notifier); register_cpu_notifier(&setup_hotplug_notifier);
printk(KERN_DEBUG "pseries_idle_driver registered\n"); printk(KERN_DEBUG "pseries_idle_driver registered\n");
...@@ -295,7 +347,8 @@ static void __exit pseries_processor_idle_exit(void) ...@@ -295,7 +347,8 @@ static void __exit pseries_processor_idle_exit(void)
{ {
unregister_cpu_notifier(&setup_hotplug_notifier); unregister_cpu_notifier(&setup_hotplug_notifier);
cpuidle_unregister(&pseries_idle_driver); pseries_idle_devices_uninit();
cpuidle_unregister_driver(&pseries_idle_driver);
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment