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

Commit 4d66ddf2 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Rafael J. Wysocki
Browse files

cpufreq: acpi-cpufreq: Convert to hotplug state machine



Install the callbacks via the state machine.

Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 7a3ba767
Loading
Loading
Loading
Loading
+45 −47
Original line number Original line Diff line number Diff line
@@ -536,45 +536,32 @@ static void free_acpi_perf_data(void)
	free_percpu(acpi_perf_data);
	free_percpu(acpi_perf_data);
}
}


static int boost_notify(struct notifier_block *nb, unsigned long action,
static int cpufreq_boost_online(unsigned int cpu)
		      void *hcpu)
{
{
	unsigned cpu = (long)hcpu;
	const struct cpumask *cpumask;
	const struct cpumask *cpumask;


	cpumask = get_cpu_mask(cpu);
	cpumask = get_cpu_mask(cpu);

	/*
	/*
	 * Clear the boost-disable bit on the CPU_DOWN path so that
	 * On the CPU_UP path we simply keep the boost-disable flag
	 * this cpu cannot block the remaining ones from boosting. On
	 * in sync with the current global state.
	 * the CPU_UP path we simply keep the boost-disable flag in
	 * sync with the current global state.
	 */
	 */

	switch (action) {
	case CPU_DOWN_FAILED:
	case CPU_DOWN_FAILED_FROZEN:
	case CPU_ONLINE:
	case CPU_ONLINE_FROZEN:
	boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
	boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
		break;
	return 0;

	case CPU_DOWN_PREPARE:
	case CPU_DOWN_PREPARE_FROZEN:
		boost_set_msrs(1, cpumask);
		break;

	default:
		break;
}
}


	return NOTIFY_OK;
static int cpufreq_boost_down_prep(unsigned int cpu)
}
{
	const struct cpumask *cpumask;


	cpumask = get_cpu_mask(cpu);


static struct notifier_block boost_nb = {
	/*
	.notifier_call          = boost_notify,
	 * Clear the boost-disable bit on the CPU_DOWN path so that
};
	 * this cpu cannot block the remaining ones from boosting.
	 */
	boost_set_msrs(1, cpumask);
	return 0;
}


/*
/*
 * acpi_cpufreq_early_init - initialize ACPI P-States library
 * acpi_cpufreq_early_init - initialize ACPI P-States library
@@ -922,9 +909,15 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
	.attr		= acpi_cpufreq_attr,
	.attr		= acpi_cpufreq_attr,
};
};


static enum cpuhp_state acpi_cpufreq_online;

static void __init acpi_cpufreq_boost_init(void)
static void __init acpi_cpufreq_boost_init(void)
{
{
	if (boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA)) {
	int ret;

	if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA)))
		return;

	msrs = msrs_alloc();
	msrs = msrs_alloc();


	if (!msrs)
	if (!msrs)
@@ -933,27 +926,32 @@ static void __init acpi_cpufreq_boost_init(void)
	acpi_cpufreq_driver.set_boost = set_boost;
	acpi_cpufreq_driver.set_boost = set_boost;
	acpi_cpufreq_driver.boost_enabled = boost_state(0);
	acpi_cpufreq_driver.boost_enabled = boost_state(0);


		cpu_notifier_register_begin();
	/*

	 * This calls the online callback on all online cpu and forces all
		/* Force all MSRs to the same value */
	 * MSRs to the same value.
		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
	 */
			       cpu_online_mask);
	ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "cpufreq/acpi:online",

				cpufreq_boost_online, cpufreq_boost_down_prep);
		__register_cpu_notifier(&boost_nb);
	if (ret < 0) {

		pr_err("acpi_cpufreq: failed to register hotplug callbacks\n");
		cpu_notifier_register_done();
		msrs_free(msrs);
		msrs = NULL;
		return;
	}
	}
	acpi_cpufreq_online = ret;
}
}


static void acpi_cpufreq_boost_exit(void)
static void acpi_cpufreq_boost_exit(void)
{
{
	if (msrs) {
	if (!msrs)
		unregister_cpu_notifier(&boost_nb);
		return;

	if (acpi_cpufreq_online >= 0)
		cpuhp_remove_state_nocalls(acpi_cpufreq_online);


	msrs_free(msrs);
	msrs_free(msrs);
	msrs = NULL;
	msrs = NULL;
}
}
}


static int __init acpi_cpufreq_init(void)
static int __init acpi_cpufreq_init(void)
{
{