Skip to content

Commit

Permalink
powercap/dtpm_devfreq: Use new Energy Model interface to get table
Browse files Browse the repository at this point in the history
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.

Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Lukasz Luba authored and Rafael J. Wysocki committed Feb 8, 2024
1 parent e20b7a8 commit 27d2c37
Showing 1 changed file with 23 additions and 11 deletions.
34 changes: 23 additions & 11 deletions drivers/powercap/dtpm_devfreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,16 @@ static int update_pd_power_uw(struct dtpm *dtpm)
struct devfreq *devfreq = dtpm_devfreq->devfreq;
struct device *dev = devfreq->dev.parent;
struct em_perf_domain *pd = em_pd_get(dev);
struct em_perf_state *table;

dtpm->power_min = pd->table[0].power;
rcu_read_lock();
table = em_perf_state_from_pd(pd);

dtpm->power_max = pd->table[pd->nr_perf_states - 1].power;
dtpm->power_min = table[0].power;

dtpm->power_max = table[pd->nr_perf_states - 1].power;

rcu_read_unlock();
return 0;
}

Expand All @@ -51,20 +56,23 @@ static u64 set_pd_power_limit(struct dtpm *dtpm, u64 power_limit)
struct devfreq *devfreq = dtpm_devfreq->devfreq;
struct device *dev = devfreq->dev.parent;
struct em_perf_domain *pd = em_pd_get(dev);
struct em_perf_state *table;
unsigned long freq;
int i;

rcu_read_lock();
table = em_perf_state_from_pd(pd);
for (i = 0; i < pd->nr_perf_states; i++) {
if (pd->table[i].power > power_limit)
if (table[i].power > power_limit)
break;
}

freq = pd->table[i - 1].frequency;
freq = table[i - 1].frequency;
power_limit = table[i - 1].power;
rcu_read_unlock();

dev_pm_qos_update_request(&dtpm_devfreq->qos_req, freq);

power_limit = pd->table[i - 1].power;

return power_limit;
}

Expand All @@ -89,8 +97,9 @@ static u64 get_pd_power_uw(struct dtpm *dtpm)
struct device *dev = devfreq->dev.parent;
struct em_perf_domain *pd = em_pd_get(dev);
struct devfreq_dev_status status;
struct em_perf_state *table;
unsigned long freq;
u64 power;
u64 power = 0;
int i;

mutex_lock(&devfreq->lock);
Expand All @@ -100,19 +109,22 @@ static u64 get_pd_power_uw(struct dtpm *dtpm)
freq = DIV_ROUND_UP(status.current_frequency, HZ_PER_KHZ);
_normalize_load(&status);

rcu_read_lock();
table = em_perf_state_from_pd(pd);
for (i = 0; i < pd->nr_perf_states; i++) {

if (pd->table[i].frequency < freq)
if (table[i].frequency < freq)
continue;

power = pd->table[i].power;
power = table[i].power;
power *= status.busy_time;
power >>= 10;

return power;
break;
}
rcu_read_unlock();

return 0;
return power;
}

static void pd_release(struct dtpm *dtpm)
Expand Down

0 comments on commit 27d2c37

Please sign in to comment.