From: Srikar Srimath Tirumala <srikars@xxxxxxxxxx> Add support to configure the CPUFREQ reduction percentage and set the maximum number of throttling steps accordingly. Current implementation of processor_thermal performs software throttling in fixed steps of "20%" which can be too coarse for some platforms. Change that by adding new config to provide the reduction percentage. Signed-off-by: Srikar Srimath Tirumala <srikars@xxxxxxxxxx> Signed-off-by: Sumit Gupta <sumitg@xxxxxxxxxx> --- drivers/acpi/Kconfig | 15 +++++++++++++++ drivers/acpi/processor_thermal.c | 19 ++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index 00dd309b6682..287cf58defbf 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig @@ -254,6 +254,21 @@ config ACPI_DOCK config ACPI_CPU_FREQ_PSS bool +config ACPI_CPU_FREQ_THERM_HAS_PARAMS + bool "CPU frequency throttling control" + depends on ACPI_PROCESSOR + +config ACPI_CPU_FREQ_THERM_MIN_THROT_PCTG + int "Minimum throttle percentage for processor_thermal cooling device" + depends on ACPI_CPU_FREQ_THERM_HAS_PARAMS + default 20 + help + The processor_thermal driver uses this config to calculate the + percentage amount by which cpu frequency must be reduced for each + cooling state. The config is also used to calculate the maximum number + of throttling steps or cooling states supported by the driver. Value + must be an unsigned integer in the range [1, 50]. + config ACPI_PROCESSOR_CSTATE def_bool y depends on ACPI_PROCESSOR diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index b7c6287eccca..ee443cc69b73 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c @@ -25,8 +25,20 @@ * _any_ cpufreq driver and not only the acpi-cpufreq driver. */ -#define CPUFREQ_THERMAL_MIN_STEP 0 -#define CPUFREQ_THERMAL_MAX_STEP 3 +#define CPUFREQ_THERMAL_MIN_STEP 0 +#ifdef CONFIG_ACPI_CPU_FREQ_THERM_HAS_PARAMS +#define CPUFREQ_THERMAL_PCTG CONFIG_ACPI_CPU_FREQ_THERM_MIN_THROT_PCTG + +/* Derive the MAX_STEP from minimum throttle percentage so that the reduction + * percentage does end up becoming negative. Also cap the MAX_STEP so that + * the CPU performance doesn't become 0. + */ +#define CPUFREQ_THERMAL_MAX_STEP ((100 / CPUFREQ_THERMAL_PCTG) - 1) + +#else +#define CPUFREQ_THERMAL_MAX_STEP 3 +#define CPUFREQ_THERMAL_PCTG 20 +#endif static DEFINE_PER_CPU(unsigned int, cpufreq_thermal_reduction_pctg); @@ -113,7 +125,8 @@ static int cpufreq_set_cur_state(unsigned int cpu, int state) if (!policy) return -EINVAL; - max_freq = (policy->cpuinfo.max_freq * (100 - reduction_pctg(i) * 20)) / 100; + max_freq = (policy->cpuinfo.max_freq * + (100 - reduction_pctg(i) * CPUFREQ_THERMAL_PCTG)) / 100; cpufreq_cpu_put(policy); -- 2.17.1