Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65b7f839 authored by Thomas Renninger's avatar Thomas Renninger Committed by Len Brown
Browse files

intel_idle: Split up and provide per CPU initialization func



Function split up, should have no functional change.

Provides entry point for physically hotplugged CPUs
to initialize and activate cpuidle.

Signed-off-by: default avatarThomas Renninger <trenn@suse.de>
CC: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
CC: Shaohua Li <shaohua.li@intel.com>
CC: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 3bd81a87
Loading
Loading
Loading
Loading
+42 −40
Original line number Diff line number Diff line
@@ -478,20 +478,16 @@ static int intel_idle_cpuidle_driver_init(void)


/*
 * intel_idle_cpuidle_devices_init()
 * intel_idle_cpu_init()
 * allocate, initialize, register cpuidle_devices
 * @cpu: cpu/core to initialize
 */
static int intel_idle_cpuidle_devices_init(void)
int intel_idle_cpu_init(int cpu)
{
	int i, cstate;
	int cstate;
	struct cpuidle_device *dev;

	intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
	if (intel_idle_cpuidle_devices == NULL)
		return -ENOMEM;

	for_each_online_cpu(i) {
		dev = per_cpu_ptr(intel_idle_cpuidle_devices, i);
	dev = per_cpu_ptr(intel_idle_cpuidle_devices, cpu);

	dev->state_count = 1;

@@ -510,24 +506,24 @@ static int intel_idle_cpuidle_devices_init(void)
		if (num_substates == 0)
			continue;
		/* is the state not enabled? */
			if (cpuidle_state_table[cstate].enter == NULL) {
		if (cpuidle_state_table[cstate].enter == NULL)
			continue;
			}

		dev->states_usage[dev->state_count].driver_data =
			(void *)get_driver_data(cstate);

			dev->state_count += 1;
		}
	dev->cpu = cpu;

		dev->cpu = i;
	if (cpuidle_register_device(dev)) {
			pr_debug(PREFIX "cpuidle_register_device %d failed!\n",
				 i);
		pr_debug(PREFIX "cpuidle_register_device %d failed!\n", cpu);
		intel_idle_cpuidle_devices_uninit();
		return -EIO;
	}
	}

	if (auto_demotion_disable_flags)
		smp_call_function_single(cpu, auto_demotion_disable, NULL, 1);

	return 0;
}
@@ -535,7 +531,7 @@ static int intel_idle_cpuidle_devices_init(void)

static int __init intel_idle_init(void)
{
	int retval;
	int retval, i;

	/* Do not load intel_idle at all for now if idle= is passed */
	if (boot_option_idle_override != IDLE_NO_OVERRIDE)
@@ -553,11 +549,17 @@ static int __init intel_idle_init(void)
		return retval;
	}

	retval = intel_idle_cpuidle_devices_init();
	intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
	if (intel_idle_cpuidle_devices == NULL)
		return -ENOMEM;

	for_each_online_cpu(i) {
		retval = intel_idle_cpu_init(i);
		if (retval) {
			cpuidle_unregister_driver(&intel_idle_driver);
			return retval;
		}
	}

	return 0;
}
+7 −0
Original line number Diff line number Diff line
@@ -188,7 +188,14 @@ struct cpuidle_governor {
extern int cpuidle_register_governor(struct cpuidle_governor *gov);
extern void cpuidle_unregister_governor(struct cpuidle_governor *gov);

#ifdef CONFIG_INTEL_IDLE
extern int intel_idle_cpu_init(int cpu);
#else
static inline int intel_idle_cpu_init(int cpu) { return -1; }
#endif

#else
static inline int intel_idle_cpu_init(int cpu) { return -1; }

static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
{return 0;}