diff options
Diffstat (limited to 'arch/arm/mm/proc-v7-bugs.c')
| -rw-r--r-- | arch/arm/mm/proc-v7-bugs.c | 24 | 
1 files changed, 10 insertions, 14 deletions
diff --git a/arch/arm/mm/proc-v7-bugs.c b/arch/arm/mm/proc-v7-bugs.c index 9a07916af8dd..c0fbfca5da8b 100644 --- a/arch/arm/mm/proc-v7-bugs.c +++ b/arch/arm/mm/proc-v7-bugs.c @@ -1,7 +1,6 @@  // SPDX-License-Identifier: GPL-2.0  #include <linux/arm-smccc.h>  #include <linux/kernel.h> -#include <linux/psci.h>  #include <linux/smp.h>  #include <asm/cp15.h> @@ -65,6 +64,9 @@ static void cpu_v7_spectre_init(void)  		break;  #ifdef CONFIG_ARM_PSCI +	case ARM_CPU_PART_BRAHMA_B53: +		/* Requires no workaround */ +		break;  	default:  		/* Other ARM CPUs require no workaround */  		if (read_cpuid_implementor() == ARM_CPU_IMP_ARM) @@ -75,26 +77,20 @@ static void cpu_v7_spectre_init(void)  	case ARM_CPU_PART_CORTEX_A72: {  		struct arm_smccc_res res; -		if (psci_ops.smccc_version == SMCCC_VERSION_1_0) -			break; +		arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, +				     ARM_SMCCC_ARCH_WORKAROUND_1, &res); +		if ((int)res.a0 != 0) +			return; -		switch (psci_ops.conduit) { -		case PSCI_CONDUIT_HVC: -			arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, -					  ARM_SMCCC_ARCH_WORKAROUND_1, &res); -			if ((int)res.a0 != 0) -				break; +		switch (arm_smccc_1_1_get_conduit()) { +		case SMCCC_CONDUIT_HVC:  			per_cpu(harden_branch_predictor_fn, cpu) =  				call_hvc_arch_workaround_1;  			cpu_do_switch_mm = cpu_v7_hvc_switch_mm;  			spectre_v2_method = "hypervisor";  			break; -		case PSCI_CONDUIT_SMC: -			arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, -					  ARM_SMCCC_ARCH_WORKAROUND_1, &res); -			if ((int)res.a0 != 0) -				break; +		case SMCCC_CONDUIT_SMC:  			per_cpu(harden_branch_predictor_fn, cpu) =  				call_smc_arch_workaround_1;  			cpu_do_switch_mm = cpu_v7_smc_switch_mm;  |