From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,USER_AGENT_MUTT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0C3E1C282DA for ; Fri, 1 Feb 2019 12:05:06 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CE788218AC for ; Fri, 1 Feb 2019 12:05:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="joJkJaZ4" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CE788218AC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=jUKgCg1vJl5gZn8cB0KVcRayepDWY6631+zQGHDRgtQ=; b=joJkJaZ4zyW5QI 68tlRi71ZC+kHO4Fx4JRQT4PyH79az0mWl+YR6TEleOfhzGHGSN4WyJJOlqUPhAzpm7ToEP4X30aZ cXix68k/cPZTjvCY7OVv2j7Pq2Xq4s2xXtfqr0wjZYq9nhIikwrp4ACUspC5lSy4zvuTeDXXX3W/l HuaZnZoulQcNH2sbpEhfpr4EPSNCsC2gDbo3ahgQMRqQySOaJxvZcdkUTlDPRj12lMDmuCHEwdfvA 1CNN6jUXPkoKT57FBGaDY12kD4LLPBW+jsaiCwDLv7UlfRgVNR6wEEOOg4Jb7p7oACTeixxlXPou1 763ftkpT7A6+Gnpyqb4A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gpXZ9-0005pX-Ju; Fri, 01 Feb 2019 12:05:03 +0000 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70] helo=foss.arm.com) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gpXZ5-0005d2-Ht for linux-arm-kernel@lists.infradead.org; Fri, 01 Feb 2019 12:05:01 +0000 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 B5CBF80D; Fri, 1 Feb 2019 04:04:57 -0800 (PST) Received: from e107155-lin (e107155-lin.cambridge.arm.com [10.1.196.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E9AB13F59C; Fri, 1 Feb 2019 04:04:55 -0800 (PST) Date: Fri, 1 Feb 2019 12:04:53 +0000 From: Sudeep Holla To: Quentin Perret Subject: Re: [PATCH v3 1/5] PM / OPP: Introduce a power estimation helper Message-ID: <20190201120453.GC10042@e107155-lin> References: <20190201093101.31869-1-quentin.perret@arm.com> <20190201093101.31869-2-quentin.perret@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190201093101.31869-2-quentin.perret@arm.com> User-Agent: Mutt/1.9.4 (2018-02-28) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190201_040459_600047_B8C5B1E4 X-CRM114-Status: GOOD ( 29.68 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: nm@ti.com, linux-pm@vger.kernel.org, sboyd@kernel.org, viresh.kumar@linaro.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, mka@chromium.org, dietmar.eggemann@arm.com, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, Feb 01, 2019 at 09:30:57AM +0000, Quentin Perret wrote: > The Energy Model (EM) framework provides an API to let drivers register > the active power of CPUs. The drivers are expected to provide a callback > method which estimates the power consumed by a CPU at each available > performance levels. How exactly this should be implemented, however, > depends on the platform. > > On some systems, PM_OPP knows the voltage and frequency at which CPUs > can run. When coupled with the CPU 'capacitance' (as provided by the > 'dynamic-power-coefficient' devicetree binding), it is possible to > estimate the dynamic power consumption of a CPU as P = C * V^2 * f, with > C its capacitance and V and f respectively the voltage and frequency of > the OPP. The Intelligent Power Allocator (IPA) thermal governor already > implements that estimation method, in the thermal framework. > > However, this power estimation method can be applied to any platform > where all the parameters are known (C, V and f), and not only those > suffering thermal issues. As such, the code implementing this feature > can be re-used to also populate the EM framework now used by EAS. > > As a first step, introduce in PM_OPP a helper function which CPUFreq > drivers can use to register into the EM framework. This duplicates the > power estimation done in IPA until it can be migrated to using the EM > framework. This will be done later, once the EM framework has support > for at least all platforms currently supported by IPA. > > Signed-off-by: Quentin Perret > Tested-by: Matthias Kaehlcke > --- > drivers/opp/of.c | 96 ++++++++++++++++++++++++++++++++++++++++++ > include/linux/pm_opp.h | 6 +++ > 2 files changed, 102 insertions(+) > > diff --git a/drivers/opp/of.c b/drivers/opp/of.c > index 06f0f632ec47..4bde13d94dc2 100644 > --- a/drivers/opp/of.c > +++ b/drivers/opp/of.c > @@ -20,6 +20,7 @@ > #include > #include > #include > +#include > > #include "opp.h" > > @@ -1047,3 +1048,98 @@ struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp) > return of_node_get(opp->np); > } > EXPORT_SYMBOL_GPL(dev_pm_opp_get_of_node); > + > +/* > + * Callback function provided to the Energy Model framework upon registration. > + * This computes the power estimated by @CPU at @kHz if it is the frequency > + * of an existing OPP, or at the frequency of the first OPP above @kHz otherwise > + * (see dev_pm_opp_find_freq_ceil()). This function updates @kHz to the ceiled > + * frequency and @mW to the associated power. The power is estimated as > + * P = C * V^2 * f with C being the CPU's capacitance and V and f respectively > + * the voltage and frequency of the OPP. > + * > + * Returns -ENODEV if the CPU device cannot be found, -EINVAL if the power > + * calculation failed because of missing parameters, 0 otherwise. > + */ > +static int __maybe_unused _get_cpu_power(unsigned long *mW, unsigned long *kHz, > + int cpu) > +{ > + struct device *cpu_dev; > + struct dev_pm_opp *opp; > + struct device_node *np; > + unsigned long mV, Hz; > + u32 cap; > + u64 tmp; > + int ret; > + > + cpu_dev = get_cpu_device(cpu); > + if (!cpu_dev) > + return -ENODEV; > + > + np = of_node_get(cpu_dev->of_node); > + if (!np) > + return -EINVAL; > + > + ret = of_property_read_u32(np, "dynamic-power-coefficient", &cap); > + of_node_put(np); > + if (ret) > + 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); > + if (!mV) > + return -EINVAL; > + > + tmp = (u64)cap * mV * mV * (Hz / 1000000); > + do_div(tmp, 1000000000); > + > + *mW = (unsigned long)tmp; > + *kHz = Hz / 1000; > + > + return 0; > +} > + > +/** > + * dev_pm_opp_of_register_em() - Attempt to register an Energy Model > + * @cpus : CPUs for which an Energy Model has to be registered > + * @nr_opp : Number of OPPs to register in the Energy Model > + * > + * This checks whether the "dynamic-power-coefficient" devicetree property has > + * been specified, and tries to register an Energy Model with it if it has. > + */ > +void dev_pm_opp_of_register_em(struct cpumask *cpus, int nr_opp) > +{ > + struct em_data_callback em_cb = EM_DATA_CB(_get_cpu_power); > + int ret, cpu = cpumask_first(cpus); > + struct device *cpu_dev; > + struct device_node *np; > + u32 cap; > + > + cpu_dev = get_cpu_device(cpu); > + if (!cpu_dev) > + return; > + > + np = of_node_get(cpu_dev->of_node); > + if (!np) > + return; > + Does it make sense to add the check for OPP count here. You need not pass that as parameter. Just makes one less thing to check in new drivers adding this support. Thoughts ? -- Regards, Sudeep _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel