From patchwork Fri May 8 09:11:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiongfeng Wang X-Patchwork-Id: 11536073 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3C857913 for ; Fri, 8 May 2020 09:17:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2D9ED208DB for ; Fri, 8 May 2020 09:17:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725815AbgEHJR3 (ORCPT ); Fri, 8 May 2020 05:17:29 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:4298 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725710AbgEHJR3 (ORCPT ); Fri, 8 May 2020 05:17:29 -0400 Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id B24ECF3F380C0B35799A; Fri, 8 May 2020 17:17:26 +0800 (CST) Received: from linux-ibm.site (10.175.102.37) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.487.0; Fri, 8 May 2020 17:17:18 +0800 From: Xiongfeng Wang To: , , , CC: , , , , , , Subject: [RFC PATCH 1/3] cpufreq: fix the return value in 'cpufreq_boost_set_sw()' Date: Fri, 8 May 2020 17:11:02 +0800 Message-ID: <1588929064-30270-2-git-send-email-wangxiongfeng2@huawei.com> X-Mailer: git-send-email 1.7.12.4 In-Reply-To: <1588929064-30270-1-git-send-email-wangxiongfeng2@huawei.com> References: <1588929064-30270-1-git-send-email-wangxiongfeng2@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.102.37] X-CFilter-Loop: Reflected Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org When I try to add SW BOOST support for CPPC, I got the following error: cpufreq: cpufreq_boost_trigger_state: Cannot enable BOOST cpufreq: store_boost: Cannot enable BOOST! It is because return value 1 of 'freq_qos_update_request()' means the effective constraint value has changed, not a error code on failures. But for 'cpufreq_driver.set_boost()', a nonzero return value means failure. So change 'ret' to zero when 'freq_qos_update_request()' returns a positive value. Signed-off-by: Xiongfeng Wang --- drivers/cpufreq/cpufreq.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 4adac3a..475fb1b 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -2522,6 +2522,8 @@ static int cpufreq_boost_set_sw(int state) ret = freq_qos_update_request(policy->max_freq_req, policy->max); if (ret < 0) break; + else + ret = 0; } return ret; From patchwork Fri May 8 09:11:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiongfeng Wang X-Patchwork-Id: 11536079 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5AEA3913 for ; Fri, 8 May 2020 09:17:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 40F1420A8B for ; Fri, 8 May 2020 09:17:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726627AbgEHJR3 (ORCPT ); Fri, 8 May 2020 05:17:29 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:4297 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725379AbgEHJR3 (ORCPT ); Fri, 8 May 2020 05:17:29 -0400 Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id BE68A22B3D822B2B4BE1; Fri, 8 May 2020 17:17:26 +0800 (CST) Received: from linux-ibm.site (10.175.102.37) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.487.0; Fri, 8 May 2020 17:17:19 +0800 From: Xiongfeng Wang To: , , , CC: , , , , , , Subject: [RFC PATCH 2/3] cpufreq: Add SW BOOST support for drivers without frequency table Date: Fri, 8 May 2020 17:11:03 +0800 Message-ID: <1588929064-30270-3-git-send-email-wangxiongfeng2@huawei.com> X-Mailer: git-send-email 1.7.12.4 In-Reply-To: <1588929064-30270-1-git-send-email-wangxiongfeng2@huawei.com> References: <1588929064-30270-1-git-send-email-wangxiongfeng2@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.102.37] X-CFilter-Loop: Reflected Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Software-managed BOOST get the boost frequency by check the flag CPUFREQ_BOOST_FREQ at driver's frequency table. But some cpufreq driver don't have frequency table and use other methods to get the frequency range, such CPPC cpufreq driver. To add SW BOOST support for drivers without frequency table, we add members in 'cpufreq_policy.cpufreq_cpuinfo' to record the max frequency of boost mode and non-boost mode. The cpufreq driver initialize these two members when probing. Signed-off-by: Xiongfeng Wang --- drivers/cpufreq/cpufreq.c | 23 +++++++++++++++-------- include/linux/cpufreq.h | 2 ++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 475fb1b..a299426 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -2508,15 +2508,22 @@ static int cpufreq_boost_set_sw(int state) int ret = -EINVAL; for_each_active_policy(policy) { - if (!policy->freq_table) - continue; - - ret = cpufreq_frequency_table_cpuinfo(policy, + if (policy->freq_table) { + ret = cpufreq_frequency_table_cpuinfo(policy, policy->freq_table); - if (ret) { - pr_err("%s: Policy frequency update failed\n", - __func__); - break; + if (ret) { + pr_err("%s: Policy frequency update failed\n", + __func__); + break; + } + } else if (policy->cpuinfo.boost_max_freq) { + if (state) + policy->max = policy->cpuinfo.boost_max_freq; + else + policy->max = policy->cpuinfo.nonboost_max_freq; + policy->cpuinfo.max_freq = policy->max; + } else { + continue; } ret = freq_qos_update_request(policy->max_freq_req, policy->max); diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 018dce8..c3449e6 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -43,6 +43,8 @@ enum cpufreq_table_sorting { struct cpufreq_cpuinfo { unsigned int max_freq; unsigned int min_freq; + unsigned int boost_max_freq; + unsigned int nonboost_max_freq; /* in 10^(-9) s = nanoseconds */ unsigned int transition_latency; From patchwork Fri May 8 09:11:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiongfeng Wang X-Patchwork-Id: 11536075 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 38238159A for ; Fri, 8 May 2020 09:17:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 279A224959 for ; Fri, 8 May 2020 09:17:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726900AbgEHJRa (ORCPT ); Fri, 8 May 2020 05:17:30 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:4296 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725784AbgEHJRa (ORCPT ); Fri, 8 May 2020 05:17:30 -0400 Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id B83CBBFAB580C12AB99B; Fri, 8 May 2020 17:17:26 +0800 (CST) Received: from linux-ibm.site (10.175.102.37) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.487.0; Fri, 8 May 2020 17:17:20 +0800 From: Xiongfeng Wang To: , , , CC: , , , , , , Subject: [RFC PATCH 3/3] CPPC: add support for SW BOOST Date: Fri, 8 May 2020 17:11:04 +0800 Message-ID: <1588929064-30270-4-git-send-email-wangxiongfeng2@huawei.com> X-Mailer: git-send-email 1.7.12.4 In-Reply-To: <1588929064-30270-1-git-send-email-wangxiongfeng2@huawei.com> References: <1588929064-30270-1-git-send-email-wangxiongfeng2@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.102.37] X-CFilter-Loop: Reflected Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org To add SW BOOST support for CPPC, we need to get the max frequency of boost mode and non-boost mode. ACPI spec 6.2 section 8.4.7.1 describe the following two CPC registers. "Highest performance is the absolute maximum performance an individual processor may reach, assuming ideal conditions. This performance level may not be sustainable for long durations, and may only be achievable if other platform components are in a specific state; for example, it may require other processors be in an idle state. Nominal Performance is the maximum sustained performance level of the processor, assuming ideal operating conditions. In absence of an external constraint (power, thermal, etc.) this is the performance level the platform is expected to be able to maintain continuously. All processors are expected to be able to sustain their nominal performance state simultaneously." To add SW BOOST support for CPPC, we can use Highest Performance as the max performance in boost mode and Nominal Performance as the max performance in non-boost mode. If the Highest Performance is greater than the Nominal Performance, we assume SW BOOST is supported. The current CPPC driver does not support SW BOOST and use 'Highest Performance' as the max performance the CPU can achieve. 'Nominal Performance' is used to convert 'performance' to 'frequency'. That means, if firmware enable boost and provide a value for Highest Performance which is greater than Nominal Performance, boost feature is enabled by default. Because SW BOOST is disabled by default, so, after this patch, boost feature is disabled by default even if boost is enabled by firmware. Signed-off-by: Xiongfeng Wang --- drivers/cpufreq/cppc_cpufreq.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index bda0b24..6ae070f 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -310,7 +310,7 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy) * Section 8.4.7.1.1.5 of ACPI 6.1 spec) */ policy->min = cppc_cpufreq_perf_to_khz(cpu, cpu->perf_caps.lowest_nonlinear_perf); - policy->max = cppc_cpufreq_perf_to_khz(cpu, cpu->perf_caps.highest_perf); + policy->max = cppc_cpufreq_perf_to_khz(cpu, cpu->perf_caps.nominal_perf); /* * Set cpuinfo.min_freq to Lowest to make the full range of performance @@ -318,7 +318,7 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy) * nonlinear perf */ policy->cpuinfo.min_freq = cppc_cpufreq_perf_to_khz(cpu, cpu->perf_caps.lowest_perf); - policy->cpuinfo.max_freq = cppc_cpufreq_perf_to_khz(cpu, cpu->perf_caps.highest_perf); + policy->cpuinfo.max_freq = cppc_cpufreq_perf_to_khz(cpu, cpu->perf_caps.nominal_perf); policy->transition_delay_us = cppc_cpufreq_get_transition_delay_us(cpu_num); policy->shared_type = cpu->shared_type; @@ -343,6 +343,19 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy) cpu->cur_policy = policy; + /* + * If 'highest_perf' is greater than 'nominal_perf', we assume CPU Boost + * is supported. + */ + if (cpu->perf_caps.highest_perf > cpu->perf_caps.nominal_perf) { + policy->cpuinfo.boost_max_freq = cppc_cpufreq_perf_to_khz(cpu, + cpu->perf_caps.highest_perf); + policy->cpuinfo.nonboost_max_freq = cppc_cpufreq_perf_to_khz(cpu, + cpu->perf_caps.nominal_perf); + + cpufreq_enable_boost_support(); + } + /* Set policy->cur to max now. The governors will adjust later. */ policy->cur = cppc_cpufreq_perf_to_khz(cpu, cpu->perf_caps.highest_perf);