Skip to content

Commit 27d2c37

Browse files
lukaszluba-armrafaeljw
authored andcommitted
powercap/dtpm_devfreq: Use new Energy Model interface to get table
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>
1 parent e20b7a8 commit 27d2c37

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

drivers/powercap/dtpm_devfreq.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,16 @@ static int update_pd_power_uw(struct dtpm *dtpm)
3737
struct devfreq *devfreq = dtpm_devfreq->devfreq;
3838
struct device *dev = devfreq->dev.parent;
3939
struct em_perf_domain *pd = em_pd_get(dev);
40+
struct em_perf_state *table;
4041

41-
dtpm->power_min = pd->table[0].power;
42+
rcu_read_lock();
43+
table = em_perf_state_from_pd(pd);
4244

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

47+
dtpm->power_max = table[pd->nr_perf_states - 1].power;
48+
49+
rcu_read_unlock();
4550
return 0;
4651
}
4752

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

63+
rcu_read_lock();
64+
table = em_perf_state_from_pd(pd);
5765
for (i = 0; i < pd->nr_perf_states; i++) {
58-
if (pd->table[i].power > power_limit)
66+
if (table[i].power > power_limit)
5967
break;
6068
}
6169

62-
freq = pd->table[i - 1].frequency;
70+
freq = table[i - 1].frequency;
71+
power_limit = table[i - 1].power;
72+
rcu_read_unlock();
6373

6474
dev_pm_qos_update_request(&dtpm_devfreq->qos_req, freq);
6575

66-
power_limit = pd->table[i - 1].power;
67-
6876
return power_limit;
6977
}
7078

@@ -89,8 +97,9 @@ static u64 get_pd_power_uw(struct dtpm *dtpm)
8997
struct device *dev = devfreq->dev.parent;
9098
struct em_perf_domain *pd = em_pd_get(dev);
9199
struct devfreq_dev_status status;
100+
struct em_perf_state *table;
92101
unsigned long freq;
93-
u64 power;
102+
u64 power = 0;
94103
int i;
95104

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

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

105-
if (pd->table[i].frequency < freq)
116+
if (table[i].frequency < freq)
106117
continue;
107118

108-
power = pd->table[i].power;
119+
power = table[i].power;
109120
power *= status.busy_time;
110121
power >>= 10;
111122

112-
return power;
123+
break;
113124
}
125+
rcu_read_unlock();
114126

115-
return 0;
127+
return power;
116128
}
117129

118130
static void pd_release(struct dtpm *dtpm)

0 commit comments

Comments
 (0)