From nobody Thu Dec 18 15:08:27 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 74146C4167B for ; Wed, 29 Nov 2023 11:10:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231735AbjK2LKP (ORCPT ); Wed, 29 Nov 2023 06:10:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56046 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231875AbjK2LJf (ORCPT ); Wed, 29 Nov 2023 06:09:35 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C52AA1BF9; Wed, 29 Nov 2023 03:08:47 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A1B982F4; Wed, 29 Nov 2023 03:09:34 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.4.241]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 14FD73F5A1; Wed, 29 Nov 2023 03:08:44 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, rafael@kernel.org Cc: lukasz.luba@arm.com, dietmar.eggemann@arm.com, rui.zhang@intel.com, amit.kucheria@verdurent.com, amit.kachhap@gmail.com, daniel.lezcano@linaro.org, viresh.kumar@linaro.org, len.brown@intel.com, pavel@ucw.cz, mhiramat@kernel.org, qyousef@layalina.io, wvw@google.com Subject: [PATCH v5 17/23] powercap/dtpm_devfreq: Use new Energy Model interface to get table Date: Wed, 29 Nov 2023 11:08:47 +0000 Message-Id: <20231129110853.94344-18-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231129110853.94344-1-lukasz.luba@arm.com> References: <20231129110853.94344-1-lukasz.luba@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Energy Model framework support modifications at runtime of the power values. Use the new EM table API which is protected with RCU. Align the code so that this RCU read section is short. This change is not expected to alter the general functionality. Signed-off-by: Lukasz Luba --- drivers/powercap/dtpm_devfreq.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/drivers/powercap/dtpm_devfreq.c b/drivers/powercap/dtpm_devfre= q.c index 612c3b59dd5b..514aa0d9d9c2 100644 --- a/drivers/powercap/dtpm_devfreq.c +++ b/drivers/powercap/dtpm_devfreq.c @@ -37,11 +37,15 @@ static int update_pd_power_uw(struct dtpm *dtpm) struct devfreq *devfreq =3D dtpm_devfreq->devfreq; struct device *dev =3D devfreq->dev.parent; struct em_perf_domain *pd =3D em_pd_get(dev); + struct em_perf_state *table; =20 - dtpm->power_min =3D pd->table[0].power; + table =3D em_get_table(pd); =20 - dtpm->power_max =3D pd->table[pd->nr_perf_states - 1].power; + dtpm->power_min =3D table[0].power; =20 + dtpm->power_max =3D table[pd->nr_perf_states - 1].power; + + em_put_table(); return 0; } =20 @@ -51,20 +55,22 @@ static u64 set_pd_power_limit(struct dtpm *dtpm, u64 po= wer_limit) struct devfreq *devfreq =3D dtpm_devfreq->devfreq; struct device *dev =3D devfreq->dev.parent; struct em_perf_domain *pd =3D em_pd_get(dev); + struct em_perf_state *table; unsigned long freq; int i; =20 + table =3D em_get_table(pd); for (i =3D 0; i < pd->nr_perf_states; i++) { - if (pd->table[i].power > power_limit) + if (table[i].power > power_limit) break; } =20 - freq =3D pd->table[i - 1].frequency; + freq =3D table[i - 1].frequency; + power_limit =3D table[i - 1].power; + em_put_table(); =20 dev_pm_qos_update_request(&dtpm_devfreq->qos_req, freq); =20 - power_limit =3D pd->table[i - 1].power; - return power_limit; } =20 @@ -89,8 +95,9 @@ static u64 get_pd_power_uw(struct dtpm *dtpm) struct device *dev =3D devfreq->dev.parent; struct em_perf_domain *pd =3D em_pd_get(dev); struct devfreq_dev_status status; + struct em_perf_state *table; unsigned long freq; - u64 power; + u64 power =3D 0; int i; =20 mutex_lock(&devfreq->lock); @@ -100,19 +107,21 @@ static u64 get_pd_power_uw(struct dtpm *dtpm) freq =3D DIV_ROUND_UP(status.current_frequency, HZ_PER_KHZ); _normalize_load(&status); =20 + table =3D em_get_table(pd); for (i =3D 0; i < pd->nr_perf_states; i++) { =20 - if (pd->table[i].frequency < freq) + if (table[i].frequency < freq) continue; =20 - power =3D pd->table[i].power; + power =3D table[i].power; power *=3D status.busy_time; power >>=3D 10; =20 - return power; + break; } + em_put_table(); =20 - return 0; + return power; } =20 static void pd_release(struct dtpm *dtpm) --=20 2.25.1