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:
parent
1fa34e49e4
commit
4401117bf7
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user