diff options
Diffstat (limited to 'drivers/cpufreq/cppc_cpufreq.c')
| -rw-r--r-- | drivers/cpufreq/cppc_cpufreq.c | 46 | 
1 files changed, 44 insertions, 2 deletions
| diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index bc5fc1630876..b15115a48775 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -126,6 +126,49 @@ static void cppc_cpufreq_stop_cpu(struct cpufreq_policy *policy)  				cpu->perf_caps.lowest_perf, cpu_num, ret);  } +/* + * The PCC subspace describes the rate at which platform can accept commands + * on the shared PCC channel (including READs which do not count towards freq + * trasition requests), so ideally we need to use the PCC values as a fallback + * if we don't have a platform specific transition_delay_us + */ +#ifdef CONFIG_ARM64 +#include <asm/cputype.h> + +static unsigned int cppc_cpufreq_get_transition_delay_us(int cpu) +{ +	unsigned long implementor = read_cpuid_implementor(); +	unsigned long part_num = read_cpuid_part_number(); +	unsigned int delay_us = 0; + +	switch (implementor) { +	case ARM_CPU_IMP_QCOM: +		switch (part_num) { +		case QCOM_CPU_PART_FALKOR_V1: +		case QCOM_CPU_PART_FALKOR: +			delay_us = 10000; +			break; +		default: +			delay_us = cppc_get_transition_latency(cpu) / NSEC_PER_USEC; +			break; +		} +		break; +	default: +		delay_us = cppc_get_transition_latency(cpu) / NSEC_PER_USEC; +		break; +	} + +	return delay_us; +} + +#else + +static unsigned int cppc_cpufreq_get_transition_delay_us(int cpu) +{ +	return cppc_get_transition_latency(cpu) / NSEC_PER_USEC; +} +#endif +  static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy)  {  	struct cppc_cpudata *cpu; @@ -162,8 +205,7 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy)  		cpu->perf_caps.highest_perf;  	policy->cpuinfo.max_freq = cppc_dmi_max_khz; -	policy->transition_delay_us = cppc_get_transition_latency(cpu_num) / -		NSEC_PER_USEC; +	policy->transition_delay_us = cppc_cpufreq_get_transition_delay_us(cpu_num);  	policy->shared_type = cpu->shared_type;  	if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) { |