aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-07-18 07:38:37 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-07-18 07:38:37 -0400
commit95d6c0857e54b788982746071130d822a795026b (patch)
tree1ad48cc12ce465cdc741b260435506766a9de282
parent9d3cce1e8b8561fed5f383d22a4d6949db4eadbe (diff)
cpufreq: intel_pstate: Register when ACPI PCCH is present
Currently, intel_pstate doesn't register if _PSS is not present on HP Proliant systems, because it expects the firmware to take over CPU performance scaling in that case. However, if ACPI PCCH is present, the firmware expects the kernel to use it for CPU performance scaling and the pcc-cpufreq driver is loaded for that. Unfortunately, the firmware interface used by that driver is not scalable for fundamental reasons, so pcc-cpufreq is way suboptimal on systems with more than just a few CPUs. In fact, it is better to avoid using it at all. For this reason, modify intel_pstate to look for ACPI PCCH if _PSS is not present and register if it is there. Also prevent the pcc-cpufreq driver from trying to initialize itself if intel_pstate has been registered already. Fixes: fbbcdc0744da (intel_pstate: skip the driver if ACPI has power mgmt option) Reported-by: Andreas Herrmann <aherrmann@suse.com> Reviewed-by: Andreas Herrmann <aherrmann@suse.com> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Tested-by: Andreas Herrmann <aherrmann@suse.com> Cc: 4.16+ <stable@vger.kernel.org> # 4.16+ Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/cpufreq/intel_pstate.c17
-rw-r--r--drivers/cpufreq/pcc-cpufreq.c4
2 files changed, 20 insertions, 1 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index ece120da3353..3c3971256130 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -2394,6 +2394,18 @@ static bool __init intel_pstate_no_acpi_pss(void)
2394 return true; 2394 return true;
2395} 2395}
2396 2396
2397static bool __init intel_pstate_no_acpi_pcch(void)
2398{
2399 acpi_status status;
2400 acpi_handle handle;
2401
2402 status = acpi_get_handle(NULL, "\\_SB", &handle);
2403 if (ACPI_FAILURE(status))
2404 return true;
2405
2406 return !acpi_has_method(handle, "PCCH");
2407}
2408
2397static bool __init intel_pstate_has_acpi_ppc(void) 2409static bool __init intel_pstate_has_acpi_ppc(void)
2398{ 2410{
2399 int i; 2411 int i;
@@ -2453,7 +2465,10 @@ static bool __init intel_pstate_platform_pwr_mgmt_exists(void)
2453 2465
2454 switch (plat_info[idx].data) { 2466 switch (plat_info[idx].data) {
2455 case PSS: 2467 case PSS:
2456 return intel_pstate_no_acpi_pss(); 2468 if (!intel_pstate_no_acpi_pss())
2469 return false;
2470
2471 return intel_pstate_no_acpi_pcch();
2457 case PPC: 2472 case PPC:
2458 return intel_pstate_has_acpi_ppc() && !force_load; 2473 return intel_pstate_has_acpi_ppc() && !force_load;
2459 } 2474 }
diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c
index 3f0ce2ae35ee..0c56c9759672 100644
--- a/drivers/cpufreq/pcc-cpufreq.c
+++ b/drivers/cpufreq/pcc-cpufreq.c
@@ -580,6 +580,10 @@ static int __init pcc_cpufreq_init(void)
580{ 580{
581 int ret; 581 int ret;
582 582
583 /* Skip initialization if another cpufreq driver is there. */
584 if (cpufreq_get_current_driver())
585 return 0;
586
583 if (acpi_disabled) 587 if (acpi_disabled)
584 return 0; 588 return 0;
585 589