mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
Power management updates for 5.11-rc2
- Fix recently introduced crash in the intel_pstate driver that occurs if scale-invariance is disabled during resume from suspend-to-RAM due to inconsistent changes of APERF or MPERF MSR values made by the platform firmware (Rafael Wysocki). - Fix a memory leak and add a missing clk_put() in error paths in the OPP framework (Quanyang Wang, Viresh Kumar). - Add new C-states table for SnowRidge processors to the intel_idle driver (Artem Bityutskiy). - Update the MAINTAINERS entry for cpuidle to make it clear that the governors are covered by it too (Lukas Bulwahn). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAl/wOgQSHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxe7wQAIP06E92PVDN1tDf88FN2BpBIziQvHPF T99v8RWQZCaMOQz5b1nXTqbQrKWFgqHiQK+6VjQcMW6xTWt7EM0eNdzGQtEsv9vd Ux4UIQp6CZnhorXLC9ZmTo+7tFze2L/KV4qVUQkkrcOXQ1qIqJiZdktYULRXgl37 pJwUroPacKT9WiYwzyXZ2dkt337DQBb1AyumHZ/5gOik6Xo+uVK0kuDzECjRHQ+5 R2aZftqAm/u6/JaeEgKQG+0LOAt1wJ6y9xcsFq303K/xDMKyRw4P3ngcVRfbyUSI 2t3GfL9h2+41wtUpLKeJiADIJEov5P9ngwMedHNOpIX+aLL4cBbXG/LFc86QakD4 qVcN+NOl13kNfn6eSSVz8mmf36juoEcYu1RhenPZfClwesqOZk0YcIoovT7k5A8B BnfEkQrjN6jFTfgc+A7rDXbLvRjhkIw2qr9Do+77AdYu0LkvgWlV3It3No10SzKw NshvNIedX3KF6xBISoFJhsGUrC8Xfpc5DIsfqYyQBIIKMEtSA00gK2XOHIpmhnUY 0jXwL3DNIf2xC4BXHUgxJa6QpUyjKeLdqqwpnUryChHo+b8z78oE/gMza7iAV56t G7pQcdsX2ogLeNKtOvDbhYDa1janQpkiJoD/fy+QD7V5RO+YaxOVM5gFUrQegJKY 1Qm6LXaswei8 =51jM -----END PGP SIGNATURE----- Merge tag 'pm-5.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull power management fixes from Rafael Wysocki: "These fix a crash in intel_pstate during resume from suspend-to-RAM that may occur after recent changes and two resource leaks in error paths in the operating performance points (OPP) framework, add a new C-states table to intel_idle and update the cpuidle MAINTAINERS entry to cover the governors too. Specifics: - Fix recently introduced crash in the intel_pstate driver that occurs if scale-invariance is disabled during resume from suspend-to-RAM due to inconsistent changes of APERF or MPERF MSR values made by the platform firmware (Rafael Wysocki). - Fix a memory leak and add a missing clk_put() in error paths in the OPP framework (Quanyang Wang, Viresh Kumar). - Add new C-states table for SnowRidge processors to the intel_idle driver (Artem Bityutskiy). - Update the MAINTAINERS entry for cpuidle to make it clear that the governors are covered by it too (Lukas Bulwahn)" * tag 'pm-5.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: intel_idle: add SnowRidge C-state table cpufreq: intel_pstate: Fix fast-switch fallback path opp: Call the missing clk_put() on error opp: fix memory leak in _allocate_opp_table MAINTAINERS: include governors into CPU IDLE TIME MANAGEMENT FRAMEWORK
This commit is contained in:
commit
d9296a7bd9
@ -4588,7 +4588,7 @@ B: https://bugzilla.kernel.org
|
|||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
|
||||||
F: Documentation/admin-guide/pm/cpuidle.rst
|
F: Documentation/admin-guide/pm/cpuidle.rst
|
||||||
F: Documentation/driver-api/pm/cpuidle.rst
|
F: Documentation/driver-api/pm/cpuidle.rst
|
||||||
F: drivers/cpuidle/*
|
F: drivers/cpuidle/
|
||||||
F: include/linux/cpuidle.h
|
F: include/linux/cpuidle.h
|
||||||
|
|
||||||
CPU POWER MONITORING SUBSYSTEM
|
CPU POWER MONITORING SUBSYSTEM
|
||||||
|
@ -3086,7 +3086,6 @@ static int __init intel_pstate_init(void)
|
|||||||
intel_pstate.attr = hwp_cpufreq_attrs;
|
intel_pstate.attr = hwp_cpufreq_attrs;
|
||||||
intel_cpufreq.attr = hwp_cpufreq_attrs;
|
intel_cpufreq.attr = hwp_cpufreq_attrs;
|
||||||
intel_cpufreq.flags |= CPUFREQ_NEED_UPDATE_LIMITS;
|
intel_cpufreq.flags |= CPUFREQ_NEED_UPDATE_LIMITS;
|
||||||
intel_cpufreq.fast_switch = NULL;
|
|
||||||
intel_cpufreq.adjust_perf = intel_cpufreq_adjust_perf;
|
intel_cpufreq.adjust_perf = intel_cpufreq_adjust_perf;
|
||||||
if (!default_driver)
|
if (!default_driver)
|
||||||
default_driver = &intel_pstate;
|
default_driver = &intel_pstate;
|
||||||
|
@ -963,6 +963,39 @@ static struct cpuidle_state dnv_cstates[] __initdata = {
|
|||||||
.enter = NULL }
|
.enter = NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note, depending on HW and FW revision, SnowRidge SoC may or may not support
|
||||||
|
* C6, and this is indicated in the CPUID mwait leaf.
|
||||||
|
*/
|
||||||
|
static struct cpuidle_state snr_cstates[] __initdata = {
|
||||||
|
{
|
||||||
|
.name = "C1",
|
||||||
|
.desc = "MWAIT 0x00",
|
||||||
|
.flags = MWAIT2flg(0x00),
|
||||||
|
.exit_latency = 2,
|
||||||
|
.target_residency = 2,
|
||||||
|
.enter = &intel_idle,
|
||||||
|
.enter_s2idle = intel_idle_s2idle, },
|
||||||
|
{
|
||||||
|
.name = "C1E",
|
||||||
|
.desc = "MWAIT 0x01",
|
||||||
|
.flags = MWAIT2flg(0x01) | CPUIDLE_FLAG_ALWAYS_ENABLE,
|
||||||
|
.exit_latency = 15,
|
||||||
|
.target_residency = 25,
|
||||||
|
.enter = &intel_idle,
|
||||||
|
.enter_s2idle = intel_idle_s2idle, },
|
||||||
|
{
|
||||||
|
.name = "C6",
|
||||||
|
.desc = "MWAIT 0x20",
|
||||||
|
.flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||||
|
.exit_latency = 130,
|
||||||
|
.target_residency = 500,
|
||||||
|
.enter = &intel_idle,
|
||||||
|
.enter_s2idle = intel_idle_s2idle, },
|
||||||
|
{
|
||||||
|
.enter = NULL }
|
||||||
|
};
|
||||||
|
|
||||||
static const struct idle_cpu idle_cpu_nehalem __initconst = {
|
static const struct idle_cpu idle_cpu_nehalem __initconst = {
|
||||||
.state_table = nehalem_cstates,
|
.state_table = nehalem_cstates,
|
||||||
.auto_demotion_disable_flags = NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE,
|
.auto_demotion_disable_flags = NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE,
|
||||||
@ -1084,6 +1117,12 @@ static const struct idle_cpu idle_cpu_dnv __initconst = {
|
|||||||
.use_acpi = true,
|
.use_acpi = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct idle_cpu idle_cpu_snr __initconst = {
|
||||||
|
.state_table = snr_cstates,
|
||||||
|
.disable_promotion_to_c1e = true,
|
||||||
|
.use_acpi = true,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct x86_cpu_id intel_idle_ids[] __initconst = {
|
static const struct x86_cpu_id intel_idle_ids[] __initconst = {
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(NEHALEM_EP, &idle_cpu_nhx),
|
X86_MATCH_INTEL_FAM6_MODEL(NEHALEM_EP, &idle_cpu_nhx),
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(NEHALEM, &idle_cpu_nehalem),
|
X86_MATCH_INTEL_FAM6_MODEL(NEHALEM, &idle_cpu_nehalem),
|
||||||
@ -1122,7 +1161,7 @@ static const struct x86_cpu_id intel_idle_ids[] __initconst = {
|
|||||||
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT, &idle_cpu_bxt),
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT, &idle_cpu_bxt),
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT_PLUS, &idle_cpu_bxt),
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT_PLUS, &idle_cpu_bxt),
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT_D, &idle_cpu_dnv),
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT_D, &idle_cpu_dnv),
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D, &idle_cpu_dnv),
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D, &idle_cpu_snr),
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1092,7 +1092,7 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
|
|||||||
if (IS_ERR(opp_table->clk)) {
|
if (IS_ERR(opp_table->clk)) {
|
||||||
ret = PTR_ERR(opp_table->clk);
|
ret = PTR_ERR(opp_table->clk);
|
||||||
if (ret == -EPROBE_DEFER)
|
if (ret == -EPROBE_DEFER)
|
||||||
goto err;
|
goto remove_opp_dev;
|
||||||
|
|
||||||
dev_dbg(dev, "%s: Couldn't find clock: %d\n", __func__, ret);
|
dev_dbg(dev, "%s: Couldn't find clock: %d\n", __func__, ret);
|
||||||
}
|
}
|
||||||
@ -1101,7 +1101,7 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
|
|||||||
ret = dev_pm_opp_of_find_icc_paths(dev, opp_table);
|
ret = dev_pm_opp_of_find_icc_paths(dev, opp_table);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret == -EPROBE_DEFER)
|
if (ret == -EPROBE_DEFER)
|
||||||
goto err;
|
goto put_clk;
|
||||||
|
|
||||||
dev_warn(dev, "%s: Error finding interconnect paths: %d\n",
|
dev_warn(dev, "%s: Error finding interconnect paths: %d\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
@ -1113,6 +1113,11 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
|
|||||||
|
|
||||||
return opp_table;
|
return opp_table;
|
||||||
|
|
||||||
|
put_clk:
|
||||||
|
if (!IS_ERR(opp_table->clk))
|
||||||
|
clk_put(opp_table->clk);
|
||||||
|
remove_opp_dev:
|
||||||
|
_remove_opp_dev(opp_dev, opp_table);
|
||||||
err:
|
err:
|
||||||
kfree(opp_table);
|
kfree(opp_table);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
Loading…
Reference in New Issue
Block a user