2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2025-01-02 02:34:05 +08:00

thermal/drivers/devfreq_cooling: Fix the build when !ENERGY_MODEL

Prevent build failure if the option CONFIG_ENERGY_MODEL is not set. The
devfreq cooling is able to operate without the Energy Model.
Don't use dev->em_pd directly and use local pointer.

Fixes: 615510fe13 ("thermal: devfreq_cooling: remove old power model and use EM")
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20201215154221.8828-1-lukasz.luba@arm.com
This commit is contained in:
Lukasz Luba 2020-12-15 15:42:21 +00:00 committed by Daniel Lezcano
parent 1fa34e49e4
commit 4401117bf7

View File

@ -48,6 +48,7 @@ static DEFINE_IDA(devfreq_ida);
* @capped_state: index to cooling state with in dynamic power budget * @capped_state: index to cooling state with in dynamic power budget
* @req_max_freq: PM QoS request for limiting the maximum frequency * @req_max_freq: PM QoS request for limiting the maximum frequency
* of the devfreq device. * of the devfreq device.
* @em_pd: Energy Model for the associated Devfreq device
*/ */
struct devfreq_cooling_device { struct devfreq_cooling_device {
int id; int id;
@ -60,6 +61,7 @@ struct devfreq_cooling_device {
u32 res_util; u32 res_util;
int capped_state; int capped_state;
struct dev_pm_qos_request req_max_freq; struct dev_pm_qos_request req_max_freq;
struct em_perf_domain *em_pd;
}; };
static int devfreq_cooling_get_max_state(struct thermal_cooling_device *cdev, static int devfreq_cooling_get_max_state(struct thermal_cooling_device *cdev,
@ -99,9 +101,9 @@ static int devfreq_cooling_set_cur_state(struct thermal_cooling_device *cdev,
if (state > dfc->max_state) if (state > dfc->max_state)
return -EINVAL; return -EINVAL;
if (dev->em_pd) { if (dfc->em_pd) {
perf_idx = dfc->max_state - state; perf_idx = dfc->max_state - state;
freq = dev->em_pd->table[perf_idx].frequency * 1000; freq = dfc->em_pd->table[perf_idx].frequency * 1000;
} else { } else {
freq = dfc->freq_table[state]; freq = dfc->freq_table[state];
} }
@ -181,7 +183,6 @@ static int devfreq_cooling_get_requested_power(struct thermal_cooling_device *cd
{ {
struct devfreq_cooling_device *dfc = cdev->devdata; struct devfreq_cooling_device *dfc = cdev->devdata;
struct devfreq *df = dfc->devfreq; struct devfreq *df = dfc->devfreq;
struct device *dev = df->dev.parent;
struct devfreq_dev_status status; struct devfreq_dev_status status;
unsigned long state; unsigned long state;
unsigned long freq; unsigned long freq;
@ -204,7 +205,7 @@ static int devfreq_cooling_get_requested_power(struct thermal_cooling_device *cd
res = dfc->power_ops->get_real_power(df, power, freq, voltage); res = dfc->power_ops->get_real_power(df, power, freq, voltage);
if (!res) { if (!res) {
state = dfc->capped_state; state = dfc->capped_state;
dfc->res_util = dev->em_pd->table[state].power; dfc->res_util = dfc->em_pd->table[state].power;
dfc->res_util *= SCALE_ERROR_MITIGATION; dfc->res_util *= SCALE_ERROR_MITIGATION;
if (*power > 1) if (*power > 1)
@ -214,7 +215,7 @@ static int devfreq_cooling_get_requested_power(struct thermal_cooling_device *cd
} }
} else { } else {
/* Energy Model frequencies are in kHz */ /* Energy Model frequencies are in kHz */
perf_idx = get_perf_idx(dev->em_pd, freq / 1000); perf_idx = get_perf_idx(dfc->em_pd, freq / 1000);
if (perf_idx < 0) { if (perf_idx < 0) {
res = -EAGAIN; res = -EAGAIN;
goto fail; goto fail;
@ -223,7 +224,7 @@ static int devfreq_cooling_get_requested_power(struct thermal_cooling_device *cd
_normalize_load(&status); _normalize_load(&status);
/* Scale power for utilization */ /* Scale power for utilization */
*power = dev->em_pd->table[perf_idx].power; *power = dfc->em_pd->table[perf_idx].power;
*power *= status.busy_time; *power *= status.busy_time;
*power >>= 10; *power >>= 10;
} }
@ -241,15 +242,13 @@ static int devfreq_cooling_state2power(struct thermal_cooling_device *cdev,
unsigned long state, u32 *power) unsigned long state, u32 *power)
{ {
struct devfreq_cooling_device *dfc = cdev->devdata; struct devfreq_cooling_device *dfc = cdev->devdata;
struct devfreq *df = dfc->devfreq;
struct device *dev = df->dev.parent;
int perf_idx; int perf_idx;
if (state > dfc->max_state) if (state > dfc->max_state)
return -EINVAL; return -EINVAL;
perf_idx = dfc->max_state - state; perf_idx = dfc->max_state - state;
*power = dev->em_pd->table[perf_idx].power; *power = dfc->em_pd->table[perf_idx].power;
return 0; return 0;
} }
@ -259,7 +258,6 @@ static int devfreq_cooling_power2state(struct thermal_cooling_device *cdev,
{ {
struct devfreq_cooling_device *dfc = cdev->devdata; struct devfreq_cooling_device *dfc = cdev->devdata;
struct devfreq *df = dfc->devfreq; struct devfreq *df = dfc->devfreq;
struct device *dev = df->dev.parent;
struct devfreq_dev_status status; struct devfreq_dev_status status;
unsigned long freq; unsigned long freq;
s32 est_power; s32 est_power;
@ -287,7 +285,7 @@ static int devfreq_cooling_power2state(struct thermal_cooling_device *cdev,
* budget. The EM power table is sorted ascending. * budget. The EM power table is sorted ascending.
*/ */
for (i = dfc->max_state; i > 0; i--) for (i = dfc->max_state; i > 0; i--)
if (est_power >= dev->em_pd->table[i].power) if (est_power >= dfc->em_pd->table[i].power)
break; break;
*state = dfc->max_state - i; *state = dfc->max_state - i;
@ -374,7 +372,8 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df,
dfc->devfreq = df; dfc->devfreq = df;
if (dev->em_pd) { dfc->em_pd = em_pd_get(dev);
if (dfc->em_pd) {
devfreq_cooling_ops.get_requested_power = devfreq_cooling_ops.get_requested_power =
devfreq_cooling_get_requested_power; devfreq_cooling_get_requested_power;
devfreq_cooling_ops.state2power = devfreq_cooling_state2power; devfreq_cooling_ops.state2power = devfreq_cooling_state2power;
@ -382,7 +381,7 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df,
dfc->power_ops = dfc_power; dfc->power_ops = dfc_power;
num_opps = em_pd_nr_perf_states(dev->em_pd); num_opps = em_pd_nr_perf_states(dfc->em_pd);
} else { } else {
/* Backward compatibility for drivers which do not use IPA */ /* Backward compatibility for drivers which do not use IPA */
dev_dbg(dev, "missing EM for cooling device\n"); dev_dbg(dev, "missing EM for cooling device\n");