Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3840319imm; Tue, 17 Jul 2018 11:09:25 -0700 (PDT) X-Google-Smtp-Source: AAOMgpeNogOvTDqSaMY7zvWRIrmAvw/6MxTnjGwPVjUmhhNDoqF+q186ih1RBUkMea6mh29kHhGO X-Received: by 2002:a63:f756:: with SMTP id f22-v6mr2512166pgk.289.1531850965915; Tue, 17 Jul 2018 11:09:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531850965; cv=none; d=google.com; s=arc-20160816; b=Gd3+sAa9aRKt/+Wujetd1AB96GOozFsBviQ+efMga6xiFynHRILw36VSKVKNi7GlSj Drx3DIh+HjBsRUYPhbokr0NEgqKkPRiwQmZ8QwWWSvVHpVixaW9R+Cti4VUkIVhTsaY9 lq7hBQEFDykJyp7jV++bGSf0b7KAe8ACk88Qki7174zPAUcebXEzCtU+zBw8TpyiPRQZ Zr7+wCBK6UG7L4Nvi1TpHRxNcuBtJrnR+2+7av9hFjHEhA5j76wPCGejZKxE8z2fYITd Ede2YqHbfuqhLQSrsrASBrp9HJXXltBdGj8rIP1dWoILI3NRk1tmRMMMdimE6BcUShSC 5W6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=SY9KLkp1r14IbuCFLxlc1hSMCsBiGy8/aVCdqMs8Td8=; b=Hbz0+x72GAj/1TiNLtjBHdX07QQ/qk2/Da3/Ih/r3CxanqycGGewJvSlmnUsMi8qJV QSux8uvZT4kbVfvia6kcl1DR2kYsIkXT8ZT7YiQHJcNDLrAlyPOIlFCTY3PMWqBslNb5 ydoEkiROnWW74TMQ3Z7Xn+hu2gEFVVpLKqbZCe0MKWlaJi6VMaRhAEVOWw8XpVwyaQuq NqP56SLStOew6FlCw9hRbKxA659oOi8O89YNw01QfEeHf+D5NE8rXUL+0OdyRILOobCx 3NmIv2TL3iXIfloUh4yLEX8BJORFIB0nXi9xcjAkgUI8yAqudTF6eIv93QVh5G8//im6 Rf8w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t62-v6si1390334pgd.485.2018.07.17.11.09.10; Tue, 17 Jul 2018 11:09:25 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729759AbeGQSmY (ORCPT + 99 others); Tue, 17 Jul 2018 14:42:24 -0400 Received: from cloudserver094114.home.pl ([79.96.170.134]:41476 "EHLO cloudserver094114.home.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729708AbeGQSmY (ORCPT ); Tue, 17 Jul 2018 14:42:24 -0400 Received: from 79.184.255.17.ipv4.supernova.orange.pl (79.184.255.17) (HELO aspire.rjw.lan) by serwer1319399.home.pl (79.96.170.134) with SMTP (IdeaSmtpServer 0.83) id 5a5eb709416a008b; Tue, 17 Jul 2018 20:08:33 +0200 From: "Rafael J. Wysocki" To: Andreas Herrmann , Srinivas Pandruvada , Linux PM Cc: "Rafael J. Wysocki" , Peter Zijlstra , Frederic Weisbecker , Viresh Kumar , Linux Kernel Mailing List Subject: [PATCH] cpufreq: intel_pstate: Register when ACPI PCCH is present Date: Tue, 17 Jul 2018 20:06:54 +0200 Message-ID: <2386802.jRaeHeNqoJ@aspire.rjw.lan> In-Reply-To: <8115130.Fhkpr82c7G@aspire.rjw.lan> References: <20180717065048.74mmgk4t5utjaa6a@suselix> <20180717140336.ayovaz4ksdlak6bb@suselix> <8115130.Fhkpr82c7G@aspire.rjw.lan> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rafael J. Wysocki Currently, intel_pstate doesn't load 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 if intel_pstate has been registered already. Fixes: fbbcdc0744da (intel_pstate: skip the driver if ACPI has power mgmt option) Reported-by: Andreas Herrmann Reviewed-by: Andreas Herrmann Acked-by: Srinivas Pandruvada Signed-off-by: Rafael J. Wysocki --- This is a replacement for https://patchwork.kernel.org/patch/10530091/ In addition to the intel_pstate changes in the above, it also prevents pcc-cpufreq from trying to initialize (which will fail ultimately, but may confuse the firmware in the meantime). Andreas, please test this one and let me know if it still works for you. Thanks, Rafael --- drivers/cpufreq/intel_pstate.c | 17 ++++++++++++++++- drivers/cpufreq/pcc-cpufreq.c | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) Index: linux-pm/drivers/cpufreq/intel_pstate.c =================================================================== --- linux-pm.orig/drivers/cpufreq/intel_pstate.c +++ linux-pm/drivers/cpufreq/intel_pstate.c @@ -2391,6 +2391,18 @@ static bool __init intel_pstate_no_acpi_ return true; } +static bool __init intel_pstate_no_acpi_pcch(void) +{ + acpi_status status; + acpi_handle handle; + + status = acpi_get_handle(NULL, "\\_SB", &handle); + if (ACPI_FAILURE(status)) + return true; + + return !acpi_has_method(handle, "PCCH"); +} + static bool __init intel_pstate_has_acpi_ppc(void) { int i; @@ -2450,7 +2462,10 @@ static bool __init intel_pstate_platform switch (plat_info[idx].data) { case PSS: - return intel_pstate_no_acpi_pss(); + if (!intel_pstate_no_acpi_pss()) + return false; + + return intel_pstate_no_acpi_pcch(); case PPC: return intel_pstate_has_acpi_ppc() && !force_load; } Index: linux-pm/drivers/cpufreq/pcc-cpufreq.c =================================================================== --- linux-pm.orig/drivers/cpufreq/pcc-cpufreq.c +++ linux-pm/drivers/cpufreq/pcc-cpufreq.c @@ -580,6 +580,10 @@ static int __init pcc_cpufreq_init(void) { int ret; + /* Skip initialization if another cpufreq driver is there. */ + if (cpufreq_get_current_driver()) + return 0; + if (acpi_disabled) return 0;