Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3672592imm; Mon, 20 Aug 2018 02:47:18 -0700 (PDT) X-Google-Smtp-Source: AA+uWPwyKNWTq6eJSIHwZIwVCN62BLCKGiH/8Ftkc8prdyAborlmI2es6SaZZadKLCH/CPy5CBT+ X-Received: by 2002:a17:902:4e:: with SMTP id 72-v6mr11683077pla.318.1534758438774; Mon, 20 Aug 2018 02:47:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534758438; cv=none; d=google.com; s=arc-20160816; b=lRLMkEE1+4QgrlBNMJY2ljiKI4BMxXAR+nNp/mKSR9vgjgxGK0rm04yBliAd/erIvC fI+6JgVX1O69ozlr7o0R8N9c/yV+1wfuKJ28yNaP3yVM8Lix1eoDNp5F4BfSJQ+qRC87 0+zNUfKSyt0r56FwNST+cS6c+gq8kJjuanxgtQYzTLbR688cSXFhA85nU2Q/WUWfSnhL bTzm5JnaU5OaST/T2TXkLNw3814VwsFqICtRXTazjKCaNn5aAuY4g030hdPPgDirRyy4 mGxjxFFZgBwHtjs8zDuPkn2c3ZOWNlBsopXzocfvhjeRwuchP8KYku9YKJY2BV/Cea89 +0Cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=nDtoe6FiBEGmi8UNquZatfVTN8jWWJ0SMkNFH77hGs0=; b=0gI6qh+v/SZfO+1waSC93VrfQS2znhc4X3TsscBDeJFWZHKMnBgufs5qQHLiv6zSSN 1tJK5fimHYuwUY43ztJRQKRcPWgL4TQev5QMMR8ycId4vwq0BGSsyyJRD8vt6YTFy4Mj U7D/qFPXjZobeSmxwoaRlntuAx8SKUTpZUZkTV/gEJhrNh/xkD3gAjXZjKxAyRsGu8f9 3K+/k4AxJ171HvaNLCvydxapW8/xTcIrHQkgebxkCMCD051Dj27OrwalytXqs7nV3F3u fcxeh29x0OfvZcRSfEvnBY1kgWDP/IuHmgSEvskAot9C9l4aBzYrSCTiwFEVlYQuXCmh htUQ== 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 21-v6si8348524pgg.588.2018.08.20.02.47.03; Mon, 20 Aug 2018 02:47:18 -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 S1726950AbeHTNA3 (ORCPT + 99 others); Mon, 20 Aug 2018 09:00:29 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:35184 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726010AbeHTNA3 (ORCPT ); Mon, 20 Aug 2018 09:00:29 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 62CD780D; Mon, 20 Aug 2018 02:45:34 -0700 (PDT) Received: from queper01-lin.local (queper01-lin.emea.arm.com [10.4.13.27]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4B5F93F2EA; Mon, 20 Aug 2018 02:45:30 -0700 (PDT) From: Quentin Perret To: peterz@infradead.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Cc: gregkh@linuxfoundation.org, mingo@redhat.com, dietmar.eggemann@arm.com, morten.rasmussen@arm.com, chris.redpath@arm.com, patrick.bellasi@arm.com, valentin.schneider@arm.com, vincent.guittot@linaro.org, thara.gopinath@linaro.org, viresh.kumar@linaro.org, tkjos@google.com, joel@joelfernandes.org, smuckle@google.com, adharmap@codeaurora.org, skannan@codeaurora.org, pkondeti@codeaurora.org, juri.lelli@redhat.com, edubezval@gmail.com, srinivas.pandruvada@linux.intel.com, currojerez@riseup.net, javi.merino@kernel.org, quentin.perret@arm.com Subject: [PATCH v6 14/14] OPTIONAL: cpufreq: dt: Register an Energy Model Date: Mon, 20 Aug 2018 10:44:20 +0100 Message-Id: <20180820094420.26590-15-quentin.perret@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180820094420.26590-1-quentin.perret@arm.com> References: <20180820094420.26590-1-quentin.perret@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ******************************************************************* * This patch illustrates the usage of the newly introduced Energy * * Model framework and isn't supposed to be merged as-is. * ******************************************************************* The Energy Model framework provides an API to register the active power of CPUs. Call this API from the cpufreq-dt driver with an estimation of the power as P = C * V^2 * f with C, V, and f respectively the capacitance of the CPU and the voltage and frequency of the OPP. The CPU capacitance is read from the "dynamic-power-coefficient" DT binding (originally introduced for thermal/IPA), and the voltage and frequency values from PM_OPP. Cc: "Rafael J. Wysocki" Cc: Viresh Kumar Signed-off-by: Quentin Perret --- drivers/cpufreq/cpufreq-dt.c | 45 +++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 0a9ebf00be46..fd5903091631 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -149,8 +150,47 @@ static int resources_available(void) return 0; } +static int of_est_power(unsigned long *mW, unsigned long *KHz, int cpu) +{ + unsigned long mV, Hz, MHz; + struct device *cpu_dev; + struct dev_pm_opp *opp; + struct device_node *np; + u32 cap; + u64 tmp; + + cpu_dev = get_cpu_device(cpu); + if (!cpu_dev) + return -ENODEV; + + np = of_node_get(cpu_dev->of_node); + if (!np) + return -EINVAL; + + if (of_property_read_u32(np, "dynamic-power-coefficient", &cap)) + return -EINVAL; + + Hz = *KHz * 1000; + opp = dev_pm_opp_find_freq_ceil(cpu_dev, &Hz); + if (IS_ERR(opp)) + return -EINVAL; + + mV = dev_pm_opp_get_voltage(opp) / 1000; + dev_pm_opp_put(opp); + + MHz = Hz / 1000000; + tmp = (u64)cap * mV * mV * MHz; + do_div(tmp, 1000000000); + + *mW = (unsigned long)tmp; + *KHz = Hz / 1000; + + return 0; +} + static int cpufreq_init(struct cpufreq_policy *policy) { + struct em_data_callback em_cb = EM_DATA_CB(of_est_power); struct cpufreq_frequency_table *freq_table; struct opp_table *opp_table = NULL; struct private_data *priv; @@ -159,7 +199,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) unsigned int transition_latency; bool fallback = false; const char *name; - int ret; + int ret, nr_opp; cpu_dev = get_cpu_device(policy->cpu); if (!cpu_dev) { @@ -226,6 +266,7 @@ static int cpufreq_init(struct cpufreq_policy *policy) ret = -EPROBE_DEFER; goto out_free_opp; } + nr_opp = ret; if (fallback) { cpumask_setall(policy->cpus); @@ -278,6 +319,8 @@ static int cpufreq_init(struct cpufreq_policy *policy) policy->cpuinfo.transition_latency = transition_latency; policy->dvfs_possible_from_any_cpu = true; + em_register_perf_domain(policy->cpus, nr_opp, &em_cb); + return 0; out_free_cpufreq_table: -- 2.17.1