From patchwork Mon Feb 29 20:36:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Pandruvada X-Patchwork-Id: 8457971 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 254A49F52D for ; Mon, 29 Feb 2016 20:38:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3FC6E2021A for ; Mon, 29 Feb 2016 20:38:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 51B5A20173 for ; Mon, 29 Feb 2016 20:38:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750836AbcB2UiU (ORCPT ); Mon, 29 Feb 2016 15:38:20 -0500 Received: from mga03.intel.com ([134.134.136.65]:51101 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750729AbcB2UiU (ORCPT ); Mon, 29 Feb 2016 15:38:20 -0500 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga103.jf.intel.com with ESMTP; 29 Feb 2016 12:38:19 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,521,1449561600"; d="scan'208";a="923718380" Received: from spandruv-desk3.jf.intel.com ([10.7.199.80]) by orsmga002.jf.intel.com with ESMTP; 29 Feb 2016 12:38:18 -0800 From: Srinivas Pandruvada To: rjw@rjwysocki.net, viresh.kumar@linaro.org Cc: linux-pm@vger.kernel.org, Srinivas Pandruvada Subject: [PATCH] cpufreq: acpi_cpufreq: base frequency attribute support Date: Mon, 29 Feb 2016 12:36:45 -0800 Message-Id: <1456778205-19197-1-git-send-email-srinivas.pandruvada@linux.intel.com> X-Mailer: git-send-email 2.5.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently scaling_available_frequencies displays list of available frequencies which can be used to set max/min or current scaling frequency. >cat scaling_available_frequencies 2301000 2300000 2200000 2000000 1900000 1800000 1700000 1500000 1400000 1300000 1100000 1000000 900000 800000 600000 500000 Here traditionally it is assumed that only 2301000 is a turbo frequency, which is purely opportunistic, anything else user can request and may get it. But because of configurable thermal design power implementation in several Intel CPUs, the opportunistic frequency start can be any frequency in this range. For example it can be 2300000 or any lower value. This change adds an optional new attribute called "base_frequency", which displays the max non-turbo frequency (base frequency). For example: >cat base_frequency 2200000 This will allow user to choose a certain frequency which is not opportunistic. Signed-off-by: Srinivas Pandruvada --- drivers/cpufreq/acpi-cpufreq.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 51eef87..76edd28 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -646,6 +646,21 @@ static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) } #endif +static ssize_t show_base_frequency(struct cpufreq_policy *policy, char *buf) +{ + u64 tar; + int err; + + err = rdmsrl_safe_on_cpu(policy->cpu, MSR_TURBO_ACTIVATION_RATIO, &tar); + if (!err) + /* Refer to IA64, IA32 SDM table 35-20, unit = 100 MHz */ + return sprintf(buf, "%llu\n", tar * 100000); + + return err; +} + +cpufreq_freq_attr_ro(base_frequency); + static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) { unsigned int i; @@ -889,6 +904,7 @@ static struct freq_attr *acpi_cpufreq_attr[] = { &cpb, #endif NULL, + NULL, }; static struct cpufreq_driver acpi_cpufreq_driver = { @@ -971,6 +987,26 @@ static int __init acpi_cpufreq_init(void) } } #endif + + if (boot_cpu_has(X86_FEATURE_IDA)) { + u64 plat_info, tar; + int err; + + err = rdmsrl_safe_on_cpu(0, MSR_PLATFORM_INFO, &plat_info); + /* Check number of config TDP levels > 0 */ + if (!err && ((plat_info >> 33) & 0x03) > 0) { + err = rdmsrl_safe_on_cpu(0, MSR_TURBO_ACTIVATION_RATIO, + &tar); + if (!err) { + struct freq_attr **attr; + + for (attr = acpi_cpufreq_attr; *attr; attr++) + ; + *attr = &base_frequency; + } + } + } + acpi_cpufreq_boost_init(); ret = cpufreq_register_driver(&acpi_cpufreq_driver);