thermal: cpu_cooling: Make the power-related code depend on IPA
The core CPU cooling infrastructure has power-related functions that have only one client: IPA. Since there can be no user of those functions if IPA is not compiled in, make sure to guard them with checks on CONFIG_THERMAL_GOV_POWER_ALLOCATOR to not waste space unnecessarily. Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Suggested-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: Quentin Perret <qperret@google.com> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Link: https://lore.kernel.org/r/20191030151451.7961-4-qperret@google.com
This commit is contained in:
parent
27a47e422e
commit
5a4e5b7895
|
@ -47,7 +47,9 @@
|
||||||
*/
|
*/
|
||||||
struct freq_table {
|
struct freq_table {
|
||||||
u32 frequency;
|
u32 frequency;
|
||||||
|
#ifdef CONFIG_THERMAL_GOV_POWER_ALLOCATOR
|
||||||
u32 power;
|
u32 power;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,8 +97,7 @@ static DEFINE_IDA(cpufreq_ida);
|
||||||
static DEFINE_MUTEX(cooling_list_lock);
|
static DEFINE_MUTEX(cooling_list_lock);
|
||||||
static LIST_HEAD(cpufreq_cdev_list);
|
static LIST_HEAD(cpufreq_cdev_list);
|
||||||
|
|
||||||
/* Below code defines functions to be used for cpufreq as cooling device */
|
#ifdef CONFIG_THERMAL_GOV_POWER_ALLOCATOR
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_level: Find the level for a particular frequency
|
* get_level: Find the level for a particular frequency
|
||||||
* @cpufreq_cdev: cpufreq_cdev for which the property is required
|
* @cpufreq_cdev: cpufreq_cdev for which the property is required
|
||||||
|
@ -265,76 +266,6 @@ static u32 get_dynamic_power(struct cpufreq_cooling_device *cpufreq_cdev,
|
||||||
return (raw_cpu_power * cpufreq_cdev->last_load) / 100;
|
return (raw_cpu_power * cpufreq_cdev->last_load) / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cpufreq cooling device callback functions are defined below */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cpufreq_get_max_state - callback function to get the max cooling state.
|
|
||||||
* @cdev: thermal cooling device pointer.
|
|
||||||
* @state: fill this variable with the max cooling state.
|
|
||||||
*
|
|
||||||
* Callback for the thermal cooling device to return the cpufreq
|
|
||||||
* max cooling state.
|
|
||||||
*
|
|
||||||
* Return: 0 on success, an error code otherwise.
|
|
||||||
*/
|
|
||||||
static int cpufreq_get_max_state(struct thermal_cooling_device *cdev,
|
|
||||||
unsigned long *state)
|
|
||||||
{
|
|
||||||
struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;
|
|
||||||
|
|
||||||
*state = cpufreq_cdev->max_level;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cpufreq_get_cur_state - callback function to get the current cooling state.
|
|
||||||
* @cdev: thermal cooling device pointer.
|
|
||||||
* @state: fill this variable with the current cooling state.
|
|
||||||
*
|
|
||||||
* Callback for the thermal cooling device to return the cpufreq
|
|
||||||
* current cooling state.
|
|
||||||
*
|
|
||||||
* Return: 0 on success, an error code otherwise.
|
|
||||||
*/
|
|
||||||
static int cpufreq_get_cur_state(struct thermal_cooling_device *cdev,
|
|
||||||
unsigned long *state)
|
|
||||||
{
|
|
||||||
struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;
|
|
||||||
|
|
||||||
*state = cpufreq_cdev->cpufreq_state;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cpufreq_set_cur_state - callback function to set the current cooling state.
|
|
||||||
* @cdev: thermal cooling device pointer.
|
|
||||||
* @state: set this variable to the current cooling state.
|
|
||||||
*
|
|
||||||
* Callback for the thermal cooling device to change the cpufreq
|
|
||||||
* current cooling state.
|
|
||||||
*
|
|
||||||
* Return: 0 on success, an error code otherwise.
|
|
||||||
*/
|
|
||||||
static int cpufreq_set_cur_state(struct thermal_cooling_device *cdev,
|
|
||||||
unsigned long state)
|
|
||||||
{
|
|
||||||
struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;
|
|
||||||
|
|
||||||
/* Request state should be less than max_level */
|
|
||||||
if (WARN_ON(state > cpufreq_cdev->max_level))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Check if the old cooling action is same as new cooling action */
|
|
||||||
if (cpufreq_cdev->cpufreq_state == state)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cpufreq_cdev->cpufreq_state = state;
|
|
||||||
|
|
||||||
return freq_qos_update_request(&cpufreq_cdev->qos_req,
|
|
||||||
cpufreq_cdev->freq_table[state].frequency);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpufreq_get_requested_power() - get the current power
|
* cpufreq_get_requested_power() - get the current power
|
||||||
* @cdev: &thermal_cooling_device pointer
|
* @cdev: &thermal_cooling_device pointer
|
||||||
|
@ -478,22 +409,84 @@ static int cpufreq_power2state(struct thermal_cooling_device *cdev,
|
||||||
power);
|
power);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_THERMAL_GOV_POWER_ALLOCATOR */
|
||||||
|
|
||||||
|
/* cpufreq cooling device callback functions are defined below */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cpufreq_get_max_state - callback function to get the max cooling state.
|
||||||
|
* @cdev: thermal cooling device pointer.
|
||||||
|
* @state: fill this variable with the max cooling state.
|
||||||
|
*
|
||||||
|
* Callback for the thermal cooling device to return the cpufreq
|
||||||
|
* max cooling state.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, an error code otherwise.
|
||||||
|
*/
|
||||||
|
static int cpufreq_get_max_state(struct thermal_cooling_device *cdev,
|
||||||
|
unsigned long *state)
|
||||||
|
{
|
||||||
|
struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;
|
||||||
|
|
||||||
|
*state = cpufreq_cdev->max_level;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cpufreq_get_cur_state - callback function to get the current cooling state.
|
||||||
|
* @cdev: thermal cooling device pointer.
|
||||||
|
* @state: fill this variable with the current cooling state.
|
||||||
|
*
|
||||||
|
* Callback for the thermal cooling device to return the cpufreq
|
||||||
|
* current cooling state.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, an error code otherwise.
|
||||||
|
*/
|
||||||
|
static int cpufreq_get_cur_state(struct thermal_cooling_device *cdev,
|
||||||
|
unsigned long *state)
|
||||||
|
{
|
||||||
|
struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;
|
||||||
|
|
||||||
|
*state = cpufreq_cdev->cpufreq_state;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cpufreq_set_cur_state - callback function to set the current cooling state.
|
||||||
|
* @cdev: thermal cooling device pointer.
|
||||||
|
* @state: set this variable to the current cooling state.
|
||||||
|
*
|
||||||
|
* Callback for the thermal cooling device to change the cpufreq
|
||||||
|
* current cooling state.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, an error code otherwise.
|
||||||
|
*/
|
||||||
|
static int cpufreq_set_cur_state(struct thermal_cooling_device *cdev,
|
||||||
|
unsigned long state)
|
||||||
|
{
|
||||||
|
struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;
|
||||||
|
|
||||||
|
/* Request state should be less than max_level */
|
||||||
|
if (WARN_ON(state > cpufreq_cdev->max_level))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* Check if the old cooling action is same as new cooling action */
|
||||||
|
if (cpufreq_cdev->cpufreq_state == state)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cpufreq_cdev->cpufreq_state = state;
|
||||||
|
|
||||||
|
return freq_qos_update_request(&cpufreq_cdev->qos_req,
|
||||||
|
cpufreq_cdev->freq_table[state].frequency);
|
||||||
|
}
|
||||||
|
|
||||||
/* Bind cpufreq callbacks to thermal cooling device ops */
|
/* Bind cpufreq callbacks to thermal cooling device ops */
|
||||||
|
|
||||||
static struct thermal_cooling_device_ops cpufreq_cooling_ops = {
|
static struct thermal_cooling_device_ops cpufreq_cooling_ops = {
|
||||||
.get_max_state = cpufreq_get_max_state,
|
|
||||||
.get_cur_state = cpufreq_get_cur_state,
|
|
||||||
.set_cur_state = cpufreq_set_cur_state,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct thermal_cooling_device_ops cpufreq_power_cooling_ops = {
|
|
||||||
.get_max_state = cpufreq_get_max_state,
|
.get_max_state = cpufreq_get_max_state,
|
||||||
.get_cur_state = cpufreq_get_cur_state,
|
.get_cur_state = cpufreq_get_cur_state,
|
||||||
.set_cur_state = cpufreq_set_cur_state,
|
.set_cur_state = cpufreq_set_cur_state,
|
||||||
.get_requested_power = cpufreq_get_requested_power,
|
|
||||||
.state2power = cpufreq_state2power,
|
|
||||||
.power2state = cpufreq_power2state,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int find_next_max(struct cpufreq_frequency_table *table,
|
static unsigned int find_next_max(struct cpufreq_frequency_table *table,
|
||||||
|
@ -603,17 +596,20 @@ __cpufreq_cooling_register(struct device_node *np,
|
||||||
pr_debug("%s: freq:%u KHz\n", __func__, freq);
|
pr_debug("%s: freq:%u KHz\n", __func__, freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cooling_ops = &cpufreq_cooling_ops;
|
||||||
|
|
||||||
|
#ifdef CONFIG_THERMAL_GOV_POWER_ALLOCATOR
|
||||||
if (capacitance) {
|
if (capacitance) {
|
||||||
ret = update_freq_table(cpufreq_cdev, capacitance);
|
ret = update_freq_table(cpufreq_cdev, capacitance);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
cdev = ERR_PTR(ret);
|
cdev = ERR_PTR(ret);
|
||||||
goto remove_ida;
|
goto remove_ida;
|
||||||
}
|
}
|
||||||
|
cooling_ops->get_requested_power = cpufreq_get_requested_power;
|
||||||
cooling_ops = &cpufreq_power_cooling_ops;
|
cooling_ops->state2power = cpufreq_state2power;
|
||||||
} else {
|
cooling_ops->power2state = cpufreq_power2state;
|
||||||
cooling_ops = &cpufreq_cooling_ops;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = freq_qos_add_request(&policy->constraints,
|
ret = freq_qos_add_request(&policy->constraints,
|
||||||
&cpufreq_cdev->qos_req, FREQ_QOS_MAX,
|
&cpufreq_cdev->qos_req, FREQ_QOS_MAX,
|
||||||
|
|
Loading…
Reference in New Issue