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

Commit 9612a461 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branch 'pm-cpuidle'

* pm-cpuidle:
  intel_idle: remove superfluous dev->state_count initialization
  intel_idle: do C1E promotion disable quirk for hotplugged CPUs
  ACPI / cpuidle: remove dev->state_count setting
  ACPI / cpuidle: fix max idle state handling with hotplug CPU support
  POWERPC: pseries: cpuidle: use the common cpuidle_[un]register() routines
  POWERPC: pseries: cpuidle: remove superfluous dev->state_count initialization
  ARM: EXYNOS: cpuidle: fix AFTR mode check
parents 4ff91337 4955a541
Loading
Loading
Loading
Loading
+2 −6
Original line number Original line Diff line number Diff line
@@ -151,8 +151,8 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev,
{
{
	int new_index = index;
	int new_index = index;


	/* This mode only can be entered when other core's are offline */
	/* AFTR can only be entered when cores other than CPU0 are offline */
	if (num_online_cpus() > 1)
	if (num_online_cpus() > 1 || dev->cpu != 0)
		new_index = drv->safe_state_index;
		new_index = drv->safe_state_index;


	if (new_index == 0)
	if (new_index == 0)
@@ -214,10 +214,6 @@ static int exynos_cpuidle_probe(struct platform_device *pdev)
		device = &per_cpu(exynos4_cpuidle_device, cpu_id);
		device = &per_cpu(exynos4_cpuidle_device, cpu_id);
		device->cpu = cpu_id;
		device->cpu = cpu_id;


		/* Support IDLE only */
		if (cpu_id != 0)
			device->state_count = 1;

		ret = cpuidle_register_device(device);
		ret = cpuidle_register_device(device);
		if (ret) {
		if (ret) {
			dev_err(&pdev->dev, "failed to register cpuidle device\n");
			dev_err(&pdev->dev, "failed to register cpuidle device\n");
+3 −56
Original line number Original line Diff line number Diff line
@@ -28,7 +28,6 @@ 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)
@@ -191,7 +190,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(pseries_cpuidle_devices, hotcpu);
			per_cpu_ptr(cpuidle_devices, hotcpu);


	if (dev && cpuidle_get_driver()) {
	if (dev && cpuidle_get_driver()) {
		switch (action) {
		switch (action) {
@@ -248,50 +247,6 @@ 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
@@ -327,19 +282,12 @@ static int __init pseries_processor_idle_init(void)
		return retval;
		return retval;


	pseries_cpuidle_driver_init();
	pseries_cpuidle_driver_init();
	retval = cpuidle_register_driver(&pseries_idle_driver);
	retval = cpuidle_register(&pseries_idle_driver, NULL);
	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");


@@ -350,8 +298,7 @@ static void __exit pseries_processor_idle_exit(void)
{
{


	unregister_cpu_notifier(&setup_hotplug_notifier);
	unregister_cpu_notifier(&setup_hotplug_notifier);
	pseries_idle_devices_uninit();
	cpuidle_unregister(&pseries_idle_driver);
	cpuidle_unregister_driver(&pseries_idle_driver);


	return;
	return;
}
}
+14 −15
Original line number Original line Diff line number Diff line
@@ -783,6 +783,13 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
	if (unlikely(!pr))
	if (unlikely(!pr))
		return -EINVAL;
		return -EINVAL;


#ifdef CONFIG_HOTPLUG_CPU
	if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
	    !pr->flags.has_cst &&
	    !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
		return acpi_idle_enter_c1(dev, drv, CPUIDLE_DRIVER_STATE_START);
#endif

	if (cx->entry_method == ACPI_CSTATE_FFH) {
	if (cx->entry_method == ACPI_CSTATE_FFH) {
		if (current_set_polling_and_test())
		if (current_set_polling_and_test())
			return -EINVAL;
			return -EINVAL;
@@ -829,6 +836,13 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
	if (unlikely(!pr))
	if (unlikely(!pr))
		return -EINVAL;
		return -EINVAL;


#ifdef CONFIG_HOTPLUG_CPU
	if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
	    !pr->flags.has_cst &&
	    !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
		return acpi_idle_enter_c1(dev, drv, CPUIDLE_DRIVER_STATE_START);
#endif

	if (!cx->bm_sts_skip && acpi_idle_bm_check()) {
	if (!cx->bm_sts_skip && acpi_idle_bm_check()) {
		if (drv->safe_state_index >= 0) {
		if (drv->safe_state_index >= 0) {
			return drv->states[drv->safe_state_index].enter(dev,
			return drv->states[drv->safe_state_index].enter(dev,
@@ -930,12 +944,6 @@ static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr,
		if (!cx->valid)
		if (!cx->valid)
			continue;
			continue;


#ifdef CONFIG_HOTPLUG_CPU
		if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
		    !pr->flags.has_cst &&
		    !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
			continue;
#endif
		per_cpu(acpi_cstate[count], dev->cpu) = cx;
		per_cpu(acpi_cstate[count], dev->cpu) = cx;


		count++;
		count++;
@@ -943,8 +951,6 @@ static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr,
			break;
			break;
	}
	}


	dev->state_count = count;

	if (!count)
	if (!count)
		return -EINVAL;
		return -EINVAL;


@@ -985,13 +991,6 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr)
		if (!cx->valid)
		if (!cx->valid)
			continue;
			continue;


#ifdef CONFIG_HOTPLUG_CPU
		if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
		    !pr->flags.has_cst &&
		    !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
			continue;
#endif

		state = &drv->states[count];
		state = &drv->states[count];
		snprintf(state->name, CPUIDLE_NAME_LEN, "C%d", i);
		snprintf(state->name, CPUIDLE_NAME_LEN, "C%d", i);
		strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);
		strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);
+3 −29
Original line number Original line Diff line number Diff line
@@ -644,39 +644,10 @@ static int __init intel_idle_cpuidle_driver_init(void)
 */
 */
static int intel_idle_cpu_init(int cpu)
static int intel_idle_cpu_init(int cpu)
{
{
	int cstate;
	struct cpuidle_device *dev;
	struct cpuidle_device *dev;


	dev = per_cpu_ptr(intel_idle_cpuidle_devices, cpu);
	dev = per_cpu_ptr(intel_idle_cpuidle_devices, cpu);


	dev->state_count = 1;

	for (cstate = 0; cstate < CPUIDLE_STATE_MAX; ++cstate) {
		int num_substates, mwait_hint, mwait_cstate, mwait_substate;

		if (cpuidle_state_table[cstate].enter == NULL)
			break;

		if (cstate + 1 > max_cstate) {
			printk(PREFIX "max_cstate %d reached\n", max_cstate);
			break;
		}

		mwait_hint = flg2MWAIT(cpuidle_state_table[cstate].flags);
		mwait_cstate = MWAIT_HINT2CSTATE(mwait_hint);
		mwait_substate = MWAIT_HINT2SUBSTATE(mwait_hint);

		/* does the state exist in CPUID.MWAIT? */
		num_substates = (mwait_substates >> ((mwait_cstate + 1) * 4))
					& MWAIT_SUBSTATE_MASK;

		/* if sub-state in table is not enumerated by CPUID */
		if ((mwait_substate + 1) > num_substates)
			continue;

		dev->state_count += 1;
	}

	dev->cpu = cpu;
	dev->cpu = cpu;


	if (cpuidle_register_device(dev)) {
	if (cpuidle_register_device(dev)) {
@@ -688,6 +659,9 @@ static int intel_idle_cpu_init(int cpu)
	if (icpu->auto_demotion_disable_flags)
	if (icpu->auto_demotion_disable_flags)
		smp_call_function_single(cpu, auto_demotion_disable, NULL, 1);
		smp_call_function_single(cpu, auto_demotion_disable, NULL, 1);


	if (icpu->disable_promotion_to_c1e)
		smp_call_function_single(cpu, c1e_promotion_disable, NULL, 1);

	return 0;
	return 0;
}
}