Subject: linux-next: manual merge of the arm64 tree with Linus' tree

From: Stephen Rothwell <[email-masked]>
Date: Mon, 28 Oct 2019 08:39:14 +1100

Hi all,

Today's linux-next merge of the arm64 tree got conflicts in:

  arch/arm64/include/asm/cpucaps.h
  arch/arm64/kernel/cpu_errata.c

between commits:

  d3ec3a08fa70 ("arm64: KVM: Trap VM ops when ARM64_WORKAROUND_CAVIUM_TX2_219_TVM is set")
  93916beb7014 ("arm64: Enable workaround for Cavium TX2 erratum 219 when running SMT")
  9405447ef79b ("arm64: Avoid Cavium TX2 erratum 219 when switching TTBR")

from Linus' tree and commit:

  05460849c3b5 ("arm64: errata: Hide CTR_EL0.DIC on systems affected by Neoverse-N1 #1542419")

from the arm64 tree.

I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

-- 
Cheers,
Stephen Rothwell

diff --cc arch/arm64/include/asm/cpucaps.h
index ac1dbca3d0cd,f05afaec18cd..000000000000
--- a/arch/arm64/include/asm/cpucaps.h
+++ b/arch/arm64/include/asm/cpucaps.h
@@@ -52,9 -52,8 +52,10 @@@
  #define ARM64_HAS_IRQ_PRIO_MASKING		42
  #define ARM64_HAS_DCPODP			43
  #define ARM64_WORKAROUND_1463225		44
 -#define ARM64_WORKAROUND_1542419		45
 +#define ARM64_WORKAROUND_CAVIUM_TX2_219_TVM	45
 +#define ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM	46
++#define ARM64_WORKAROUND_1542419		47
  
- #define ARM64_NCAPS				47
 -#define ARM64_NCAPS				46
++#define ARM64_NCAPS				48
  
  #endif /* __ASM_CPUCAPS_H */
diff --cc arch/arm64/kernel/cpu_errata.c
index 6c3b10a41bd8,bf29b59e096f..000000000000
--- a/arch/arm64/kernel/cpu_errata.c
+++ b/arch/arm64/kernel/cpu_errata.c
@@@ -624,30 -618,18 +619,42 @@@ check_branch_predictor(const struct arm
  	return (need_wa > 0);
  }
  
 +static const __maybe_unused struct midr_range tx2_family_cpus[] = {
 +	MIDR_ALL_VERSIONS(MIDR_BRCM_VULCAN),
 +	MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
 +	{},
 +};
 +
 +static bool __maybe_unused
 +needs_tx2_tvm_workaround(const struct arm64_cpu_capabilities *entry,
 +			 int scope)
 +{
 +	int i;
 +
 +	if (!is_affected_midr_range_list(entry, scope) ||
 +	    !is_hyp_mode_available())
 +		return false;
 +
 +	for_each_possible_cpu(i) {
 +		if (MPIDR_AFFINITY_LEVEL(cpu_logical_map(i), 0) != 0)
 +			return true;
 +	}
 +
 +	return false;
 +}
 +
+ static bool __maybe_unused
+ has_neoverse_n1_erratum_1542419(const struct arm64_cpu_capabilities *entry,
+ 				int scope)
+ {
+ 	u32 midr = read_cpuid_id();
+ 	bool has_dic = read_cpuid_cachetype() & BIT(CTR_DIC_SHIFT);
+ 	const struct midr_range range = MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1);
+ 
+ 	WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
+ 	return is_midr_in_range(midr, &range) && has_dic;
+ }
+ 
  #ifdef CONFIG_HARDEN_EL2_VECTORS
  
  static const struct midr_range arm64_harden_el2_vectors[] = {
@@@ -877,18 -859,15 +884,28 @@@ const struct arm64_cpu_capabilities arm
  		.matches = has_cortex_a76_erratum_1463225,
  	},
  #endif
 +#ifdef CONFIG_CAVIUM_TX2_ERRATUM_219
 +	{
 +		.desc = "Cavium ThunderX2 erratum 219 (KVM guest sysreg trapping)",
 +		.capability = ARM64_WORKAROUND_CAVIUM_TX2_219_TVM,
 +		ERRATA_MIDR_RANGE_LIST(tx2_family_cpus),
 +		.matches = needs_tx2_tvm_workaround,
 +	},
 +	{
 +		.desc = "Cavium ThunderX2 erratum 219 (PRFM removal)",
 +		.capability = ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM,
 +		ERRATA_MIDR_RANGE_LIST(tx2_family_cpus),
 +	},
++#endif
+ #ifdef CONFIG_ARM64_ERRATUM_1542419
+ 	{
+ 		/* we depend on the firmware portion for correctness */
+ 		.desc = "ARM erratum 1542419 (kernel portion)",
+ 		.capability = ARM64_WORKAROUND_1542419,
+ 		.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
+ 		.matches = has_neoverse_n1_erratum_1542419,
+ 		.cpu_enable = cpu_enable_trap_ctr_access,
+ 	},
  #endif
  	{
  	}