From: Quentin Perret <quentin.perret@arm.com>
To: linux-pm@vger.kernel.org
Cc: rjw@rjwysocki.net, vireshk@kernel.org, nm@ti.com,
sboyd@codeaurora.org, sudeep.holla@arm.com,
amit.kachhap@gmail.com, javi.merino@kernel.org,
rui.zhang@intel.com, edubezval@gmail.com, matthias.bgg@gmail.com,
dietmar.eggemann@arm.com, morten.rasmussen@arm.com,
patrick.bellasi@arm.com, ionela.voinescu@arm.com
Subject: [PATCH 2/2] thermal: cpu_cooling: use power models from the OPP library
Date: Tue, 9 Jan 2018 11:02:52 +0000 [thread overview]
Message-ID: <20180109110252.13557-3-quentin.perret@arm.com> (raw)
In-Reply-To: <20180109110252.13557-1-quentin.perret@arm.com>
Now that the OPP library features a power estimator, the existing code
in IPA can be modified to rely only on dev_pm_opp_get_power() without
having to care about the dynamic-power-coefficient DT binding.
Signed-off-by: Quentin Perret <quentin.perret@arm.com>
---
drivers/cpufreq/arm_big_little.c | 2 ++
drivers/cpufreq/cpufreq-dt.c | 2 ++
drivers/cpufreq/mediatek-cpufreq.c | 2 ++
drivers/thermal/cpu_cooling.c | 33 +++++++++------------------------
4 files changed, 15 insertions(+), 24 deletions(-)
diff --git a/drivers/cpufreq/arm_big_little.c b/drivers/cpufreq/arm_big_little.c
index c56b57dcfda5..3ae67c3510b6 100644
--- a/drivers/cpufreq/arm_big_little.c
+++ b/drivers/cpufreq/arm_big_little.c
@@ -497,6 +497,8 @@ static int bL_cpufreq_init(struct cpufreq_policy *policy)
if (is_bL_switching_enabled())
per_cpu(cpu_last_req_freq, policy->cpu) = clk_get_cpu_rate(policy->cpu);
+ dev_pm_opp_of_estimate_power(cpu_dev);
+
dev_info(cpu_dev, "%s: CPU %d initialized\n", __func__, policy->cpu);
return 0;
}
diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c
index de3d104c25d7..b05b0d8eb3f2 100644
--- a/drivers/cpufreq/cpufreq-dt.c
+++ b/drivers/cpufreq/cpufreq-dt.c
@@ -284,6 +284,8 @@ static int cpufreq_init(struct cpufreq_policy *policy)
policy->cpuinfo.transition_latency = transition_latency;
policy->dvfs_possible_from_any_cpu = true;
+ dev_pm_opp_of_estimate_power(cpu_dev);
+
return 0;
out_free_cpufreq_table:
diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c
index 8c04dddd3c28..c1b2fb67a73e 100644
--- a/drivers/cpufreq/mediatek-cpufreq.c
+++ b/drivers/cpufreq/mediatek-cpufreq.c
@@ -470,6 +470,8 @@ static int mtk_cpufreq_init(struct cpufreq_policy *policy)
policy->driver_data = info;
policy->clk = info->cpu_clk;
+ dev_pm_opp_of_estimate_power(info->cpu_dev);
+
return 0;
out_free_cpufreq_table:
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index dfd23245f778..b961bd6a198b 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -187,7 +187,6 @@ static int cpufreq_thermal_notifier(struct notifier_block *nb,
/**
* update_freq_table() - Update the freq table with power numbers
* @cpufreq_cdev: the cpufreq cooling device in which to update the table
- * @capacitance: dynamic power coefficient for these cpus
*
* Update the freq table with power numbers. This table will be used in
* cpu_power_to_freq() and cpu_freq_to_power() to convert between power and
@@ -197,8 +196,7 @@ static int cpufreq_thermal_notifier(struct notifier_block *nb,
* Return: 0 on success, -EINVAL if there are no OPPs for any CPUs,
* or -ENOMEM if we run out of memory.
*/
-static int update_freq_table(struct cpufreq_cooling_device *cpufreq_cdev,
- u32 capacitance)
+static int update_freq_table(struct cpufreq_cooling_device *cpufreq_cdev)
{
struct freq_table *freq_table = cpufreq_cdev->freq_table;
struct dev_pm_opp *opp;
@@ -227,9 +225,6 @@ static int update_freq_table(struct cpufreq_cooling_device *cpufreq_cdev,
for (i = 0; i <= cpufreq_cdev->max_level; i++) {
unsigned long freq = freq_table[i].frequency * 1000;
- u32 freq_mhz = freq_table[i].frequency / 1000;
- u64 power;
- u32 voltage_mv;
/*
* Find ceil frequency as 'freq' may be slightly lower than OPP
@@ -242,18 +237,9 @@ static int update_freq_table(struct cpufreq_cooling_device *cpufreq_cdev,
return -EINVAL;
}
- voltage_mv = dev_pm_opp_get_voltage(opp) / 1000;
- dev_pm_opp_put(opp);
-
- /*
- * Do the multiplication with MHz and millivolt so as
- * to not overflow.
- */
- power = (u64)capacitance * freq_mhz * voltage_mv * voltage_mv;
- do_div(power, 1000000000);
-
/* power is stored in mW */
- freq_table[i].power = power;
+ freq_table[i].power = dev_pm_opp_get_power(opp) / 1000;
+ dev_pm_opp_put(opp);
}
return 0;
@@ -606,7 +592,7 @@ static unsigned int find_next_max(struct cpufreq_frequency_table *table,
*/
static struct thermal_cooling_device *
__cpufreq_cooling_register(struct device_node *np,
- struct cpufreq_policy *policy, u32 capacitance)
+ struct cpufreq_policy *policy, bool power_model)
{
struct thermal_cooling_device *cdev;
struct cpufreq_cooling_device *cpufreq_cdev;
@@ -675,8 +661,8 @@ __cpufreq_cooling_register(struct device_node *np,
pr_debug("%s: freq:%u KHz\n", __func__, freq);
}
- if (capacitance) {
- ret = update_freq_table(cpufreq_cdev, capacitance);
+ if (power_model) {
+ ret = update_freq_table(cpufreq_cdev);
if (ret) {
cdev = ERR_PTR(ret);
goto remove_ida;
@@ -760,7 +746,7 @@ of_cpufreq_cooling_register(struct cpufreq_policy *policy)
{
struct device_node *np = of_get_cpu_node(policy->cpu, NULL);
struct thermal_cooling_device *cdev = NULL;
- u32 capacitance = 0;
+ bool has_power;
if (!np) {
pr_err("cpu_cooling: OF node not available for cpu%d\n",
@@ -769,10 +755,9 @@ of_cpufreq_cooling_register(struct cpufreq_policy *policy)
}
if (of_find_property(np, "#cooling-cells", NULL)) {
- of_property_read_u32(np, "dynamic-power-coefficient",
- &capacitance);
+ has_power = dev_pm_opp_has_power(get_cpu_device(policy->cpu));
- cdev = __cpufreq_cooling_register(np, policy, capacitance);
+ cdev = __cpufreq_cooling_register(np, policy, has_power);
if (IS_ERR(cdev)) {
pr_err("cpu_cooling: cpu%d is not running as cooling device: %ld\n",
policy->cpu, PTR_ERR(cdev));
--
2.15.1
next prev parent reply other threads:[~2018-01-09 11:03 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-09 11:02 [PATCH 0/2] thermal, OPP: move the CPU power estimation to the OPP library Quentin Perret
2018-01-09 11:02 ` [PATCH 1/2] PM / OPP: introduce an OPP power estimation helper Quentin Perret
2018-01-10 4:36 ` Viresh Kumar
2018-01-10 10:20 ` Quentin Perret
2018-01-10 10:25 ` Viresh Kumar
2018-01-10 10:36 ` Quentin Perret
2018-01-09 11:02 ` Quentin Perret [this message]
2018-01-10 4:37 ` [PATCH 2/2] thermal: cpu_cooling: use power models from the OPP library Viresh Kumar
2018-01-10 19:34 ` [PATCH 0/2] thermal, OPP: move the CPU power estimation to " Eduardo Valentin
2018-01-11 9:42 ` Viresh Kumar
2018-01-11 9:42 ` Quentin Perret
2018-01-12 17:24 ` Eduardo Valentin
2018-01-12 17:44 ` Quentin Perret
2018-01-12 17:47 ` Eduardo Valentin
2018-01-12 17:50 ` Quentin Perret
2018-01-15 4:26 ` Viresh Kumar
2018-01-15 17:46 ` Eduardo Valentin
2018-01-16 9:16 ` Quentin Perret
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180109110252.13557-3-quentin.perret@arm.com \
--to=quentin.perret@arm.com \
--cc=amit.kachhap@gmail.com \
--cc=dietmar.eggemann@arm.com \
--cc=edubezval@gmail.com \
--cc=ionela.voinescu@arm.com \
--cc=javi.merino@kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=matthias.bgg@gmail.com \
--cc=morten.rasmussen@arm.com \
--cc=nm@ti.com \
--cc=patrick.bellasi@arm.com \
--cc=rjw@rjwysocki.net \
--cc=rui.zhang@intel.com \
--cc=sboyd@codeaurora.org \
--cc=sudeep.holla@arm.com \
--cc=vireshk@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.