diff options
Diffstat (limited to 'drivers/base/arch_topology.c')
| -rw-r--r-- | drivers/base/arch_topology.c | 45 | 
1 files changed, 42 insertions, 3 deletions
diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c index 976154140f0b..1d6636ebaac5 100644 --- a/drivers/base/arch_topology.c +++ b/drivers/base/arch_topology.c @@ -339,6 +339,46 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)  	return !ret;  } +#ifdef CONFIG_ACPI_CPPC_LIB +#include <acpi/cppc_acpi.h> + +void topology_init_cpu_capacity_cppc(void) +{ +	struct cppc_perf_caps perf_caps; +	int cpu; + +	if (likely(acpi_disabled || !acpi_cpc_valid())) +		return; + +	raw_capacity = kcalloc(num_possible_cpus(), sizeof(*raw_capacity), +			       GFP_KERNEL); +	if (!raw_capacity) +		return; + +	for_each_possible_cpu(cpu) { +		if (!cppc_get_perf_caps(cpu, &perf_caps) && +		    (perf_caps.highest_perf >= perf_caps.nominal_perf) && +		    (perf_caps.highest_perf >= perf_caps.lowest_perf)) { +			raw_capacity[cpu] = perf_caps.highest_perf; +			pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n", +				 cpu, raw_capacity[cpu]); +			continue; +		} + +		pr_err("cpu_capacity: CPU%d missing/invalid highest performance.\n", cpu); +		pr_err("cpu_capacity: partial information: fallback to 1024 for all CPUs\n"); +		goto exit; +	} + +	topology_normalize_cpu_scale(); +	schedule_work(&update_topology_flags_work); +	pr_debug("cpu_capacity: cpu_capacity initialization done\n"); + +exit: +	free_raw_capacity(); +} +#endif +  #ifdef CONFIG_CPU_FREQ  static cpumask_var_t cpus_to_visit;  static void parsing_done_workfn(struct work_struct *work); @@ -387,9 +427,8 @@ static int __init register_cpufreq_notifier(void)  	int ret;  	/* -	 * on ACPI-based systems we need to use the default cpu capacity -	 * until we have the necessary code to parse the cpu capacity, so -	 * skip registering cpufreq notifier. +	 * On ACPI-based systems skip registering cpufreq notifier as cpufreq +	 * information is not needed for cpu capacity initialization.  	 */  	if (!acpi_disabled || !raw_capacity)  		return -EINVAL;  |