cpu_errata.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Contains CPU specific errata definitions
  4. *
  5. * Copyright (C) 2014 ARM Ltd.
  6. */
  7. #include <linux/arm-smccc.h>
  8. #include <linux/types.h>
  9. #include <linux/cpu.h>
  10. #include <asm/cpu.h>
  11. #include <asm/cputype.h>
  12. #include <asm/cpufeature.h>
  13. #include <asm/kvm_asm.h>
  14. #include <asm/smp_plat.h>
  15. static bool __maybe_unused
  16. is_affected_midr_range(const struct arm64_cpu_capabilities *entry, int scope)
  17. {
  18. const struct arm64_midr_revidr *fix;
  19. u32 midr = read_cpuid_id(), revidr;
  20. WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
  21. if (!is_midr_in_range(midr, &entry->midr_range))
  22. return false;
  23. midr &= MIDR_REVISION_MASK | MIDR_VARIANT_MASK;
  24. revidr = read_cpuid(REVIDR_EL1);
  25. for (fix = entry->fixed_revs; fix && fix->revidr_mask; fix++)
  26. if (midr == fix->midr_rv && (revidr & fix->revidr_mask))
  27. return false;
  28. return true;
  29. }
  30. static bool __maybe_unused
  31. is_affected_midr_range_list(const struct arm64_cpu_capabilities *entry,
  32. int scope)
  33. {
  34. WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
  35. return is_midr_in_range_list(read_cpuid_id(), entry->midr_range_list);
  36. }
  37. static bool __maybe_unused
  38. is_kryo_midr(const struct arm64_cpu_capabilities *entry, int scope)
  39. {
  40. u32 model;
  41. WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
  42. model = read_cpuid_id();
  43. model &= MIDR_IMPLEMENTOR_MASK | (0xf00 << MIDR_PARTNUM_SHIFT) |
  44. MIDR_ARCHITECTURE_MASK;
  45. return model == entry->midr_range.model;
  46. }
  47. static bool
  48. has_mismatched_cache_type(const struct arm64_cpu_capabilities *entry,
  49. int scope)
  50. {
  51. u64 mask = arm64_ftr_reg_ctrel0.strict_mask;
  52. u64 sys = arm64_ftr_reg_ctrel0.sys_val & mask;
  53. u64 ctr_raw, ctr_real;
  54. WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
  55. /*
  56. * We want to make sure that all the CPUs in the system expose
  57. * a consistent CTR_EL0 to make sure that applications behaves
  58. * correctly with migration.
  59. *
  60. * If a CPU has CTR_EL0.IDC but does not advertise it via CTR_EL0 :
  61. *
  62. * 1) It is safe if the system doesn't support IDC, as CPU anyway
  63. * reports IDC = 0, consistent with the rest.
  64. *
  65. * 2) If the system has IDC, it is still safe as we trap CTR_EL0
  66. * access on this CPU via the ARM64_HAS_CACHE_IDC capability.
  67. *
  68. * So, we need to make sure either the raw CTR_EL0 or the effective
  69. * CTR_EL0 matches the system's copy to allow a secondary CPU to boot.
  70. */
  71. ctr_raw = read_cpuid_cachetype() & mask;
  72. ctr_real = read_cpuid_effective_cachetype() & mask;
  73. return (ctr_real != sys) && (ctr_raw != sys);
  74. }
  75. static void
  76. cpu_enable_trap_ctr_access(const struct arm64_cpu_capabilities *cap)
  77. {
  78. u64 mask = arm64_ftr_reg_ctrel0.strict_mask;
  79. bool enable_uct_trap = false;
  80. /* Trap CTR_EL0 access on this CPU, only if it has a mismatch */
  81. if ((read_cpuid_cachetype() & mask) !=
  82. (arm64_ftr_reg_ctrel0.sys_val & mask))
  83. enable_uct_trap = true;
  84. /* ... or if the system is affected by an erratum */
  85. if (cap->capability == ARM64_WORKAROUND_1542419)
  86. enable_uct_trap = true;
  87. if (enable_uct_trap)
  88. sysreg_clear_set(sctlr_el1, SCTLR_EL1_UCT, 0);
  89. }
  90. #ifdef CONFIG_ARM64_ERRATUM_1463225
  91. static bool
  92. has_cortex_a76_erratum_1463225(const struct arm64_cpu_capabilities *entry,
  93. int scope)
  94. {
  95. return is_affected_midr_range_list(entry, scope) && is_kernel_in_hyp_mode();
  96. }
  97. #endif
  98. static void __maybe_unused
  99. cpu_enable_cache_maint_trap(const struct arm64_cpu_capabilities *__unused)
  100. {
  101. sysreg_clear_set(sctlr_el1, SCTLR_EL1_UCI, 0);
  102. }
  103. #define CAP_MIDR_RANGE(model, v_min, r_min, v_max, r_max) \
  104. .matches = is_affected_midr_range, \
  105. .midr_range = MIDR_RANGE(model, v_min, r_min, v_max, r_max)
  106. #define CAP_MIDR_ALL_VERSIONS(model) \
  107. .matches = is_affected_midr_range, \
  108. .midr_range = MIDR_ALL_VERSIONS(model)
  109. #define MIDR_FIXED(rev, revidr_mask) \
  110. .fixed_revs = (struct arm64_midr_revidr[]){{ (rev), (revidr_mask) }, {}}
  111. #define ERRATA_MIDR_RANGE(model, v_min, r_min, v_max, r_max) \
  112. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, \
  113. CAP_MIDR_RANGE(model, v_min, r_min, v_max, r_max)
  114. #define CAP_MIDR_RANGE_LIST(list) \
  115. .matches = is_affected_midr_range_list, \
  116. .midr_range_list = list
  117. /* Errata affecting a range of revisions of given model variant */
  118. #define ERRATA_MIDR_REV_RANGE(m, var, r_min, r_max) \
  119. ERRATA_MIDR_RANGE(m, var, r_min, var, r_max)
  120. /* Errata affecting a single variant/revision of a model */
  121. #define ERRATA_MIDR_REV(model, var, rev) \
  122. ERRATA_MIDR_RANGE(model, var, rev, var, rev)
  123. /* Errata affecting all variants/revisions of a given a model */
  124. #define ERRATA_MIDR_ALL_VERSIONS(model) \
  125. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, \
  126. CAP_MIDR_ALL_VERSIONS(model)
  127. /* Errata affecting a list of midr ranges, with same work around */
  128. #define ERRATA_MIDR_RANGE_LIST(midr_list) \
  129. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, \
  130. CAP_MIDR_RANGE_LIST(midr_list)
  131. static const __maybe_unused struct midr_range tx2_family_cpus[] = {
  132. MIDR_ALL_VERSIONS(MIDR_BRCM_VULCAN),
  133. MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
  134. {},
  135. };
  136. static bool __maybe_unused
  137. needs_tx2_tvm_workaround(const struct arm64_cpu_capabilities *entry,
  138. int scope)
  139. {
  140. int i;
  141. if (!is_affected_midr_range_list(entry, scope) ||
  142. !is_hyp_mode_available())
  143. return false;
  144. for_each_possible_cpu(i) {
  145. if (MPIDR_AFFINITY_LEVEL(cpu_logical_map(i), 0) != 0)
  146. return true;
  147. }
  148. return false;
  149. }
  150. static bool __maybe_unused
  151. has_neoverse_n1_erratum_1542419(const struct arm64_cpu_capabilities *entry,
  152. int scope)
  153. {
  154. u32 midr = read_cpuid_id();
  155. bool has_dic = read_cpuid_cachetype() & BIT(CTR_EL0_DIC_SHIFT);
  156. const struct midr_range range = MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1);
  157. WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
  158. return is_midr_in_range(midr, &range) && has_dic;
  159. }
  160. #ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI
  161. static const struct arm64_cpu_capabilities arm64_repeat_tlbi_list[] = {
  162. #ifdef CONFIG_QCOM_FALKOR_ERRATUM_1009
  163. {
  164. ERRATA_MIDR_REV(MIDR_QCOM_FALKOR_V1, 0, 0)
  165. },
  166. {
  167. .midr_range.model = MIDR_QCOM_KRYO,
  168. .matches = is_kryo_midr,
  169. },
  170. #endif
  171. #ifdef CONFIG_ARM64_ERRATUM_1286807
  172. {
  173. ERRATA_MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 0),
  174. },
  175. {
  176. /* Kryo4xx Gold (rcpe to rfpe) => (r0p0 to r3p0) */
  177. ERRATA_MIDR_RANGE(MIDR_QCOM_KRYO_4XX_GOLD, 0xc, 0xe, 0xf, 0xe),
  178. },
  179. #endif
  180. #ifdef CONFIG_ARM64_ERRATUM_2441007
  181. {
  182. ERRATA_MIDR_ALL_VERSIONS(MIDR_CORTEX_A55),
  183. },
  184. #endif
  185. #ifdef CONFIG_ARM64_ERRATUM_2441009
  186. {
  187. /* Cortex-A510 r0p0 -> r1p1. Fixed in r1p2 */
  188. ERRATA_MIDR_RANGE(MIDR_CORTEX_A510, 0, 0, 1, 1),
  189. },
  190. #endif
  191. {},
  192. };
  193. #endif
  194. #ifdef CONFIG_CAVIUM_ERRATUM_23154
  195. static const struct midr_range cavium_erratum_23154_cpus[] = {
  196. MIDR_ALL_VERSIONS(MIDR_THUNDERX),
  197. MIDR_ALL_VERSIONS(MIDR_THUNDERX_81XX),
  198. MIDR_ALL_VERSIONS(MIDR_THUNDERX_83XX),
  199. MIDR_ALL_VERSIONS(MIDR_OCTX2_98XX),
  200. MIDR_ALL_VERSIONS(MIDR_OCTX2_96XX),
  201. MIDR_ALL_VERSIONS(MIDR_OCTX2_95XX),
  202. MIDR_ALL_VERSIONS(MIDR_OCTX2_95XXN),
  203. MIDR_ALL_VERSIONS(MIDR_OCTX2_95XXMM),
  204. MIDR_ALL_VERSIONS(MIDR_OCTX2_95XXO),
  205. {},
  206. };
  207. #endif
  208. #ifdef CONFIG_CAVIUM_ERRATUM_27456
  209. const struct midr_range cavium_erratum_27456_cpus[] = {
  210. /* Cavium ThunderX, T88 pass 1.x - 2.1 */
  211. MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1),
  212. /* Cavium ThunderX, T81 pass 1.0 */
  213. MIDR_REV(MIDR_THUNDERX_81XX, 0, 0),
  214. {},
  215. };
  216. #endif
  217. #ifdef CONFIG_CAVIUM_ERRATUM_30115
  218. static const struct midr_range cavium_erratum_30115_cpus[] = {
  219. /* Cavium ThunderX, T88 pass 1.x - 2.2 */
  220. MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 2),
  221. /* Cavium ThunderX, T81 pass 1.0 - 1.2 */
  222. MIDR_REV_RANGE(MIDR_THUNDERX_81XX, 0, 0, 2),
  223. /* Cavium ThunderX, T83 pass 1.0 */
  224. MIDR_REV(MIDR_THUNDERX_83XX, 0, 0),
  225. {},
  226. };
  227. #endif
  228. #ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003
  229. static const struct arm64_cpu_capabilities qcom_erratum_1003_list[] = {
  230. {
  231. ERRATA_MIDR_REV(MIDR_QCOM_FALKOR_V1, 0, 0),
  232. },
  233. {
  234. .midr_range.model = MIDR_QCOM_KRYO,
  235. .matches = is_kryo_midr,
  236. },
  237. {},
  238. };
  239. #endif
  240. #ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE
  241. static const struct midr_range workaround_clean_cache[] = {
  242. #if defined(CONFIG_ARM64_ERRATUM_826319) || \
  243. defined(CONFIG_ARM64_ERRATUM_827319) || \
  244. defined(CONFIG_ARM64_ERRATUM_824069)
  245. /* Cortex-A53 r0p[012]: ARM errata 826319, 827319, 824069 */
  246. MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 2),
  247. #endif
  248. #ifdef CONFIG_ARM64_ERRATUM_819472
  249. /* Cortex-A53 r0p[01] : ARM errata 819472 */
  250. MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 1),
  251. #endif
  252. {},
  253. };
  254. #endif
  255. #ifdef CONFIG_ARM64_ERRATUM_1418040
  256. /*
  257. * - 1188873 affects r0p0 to r2p0
  258. * - 1418040 affects r0p0 to r3p1
  259. */
  260. static const struct midr_range erratum_1418040_list[] = {
  261. /* Cortex-A76 r0p0 to r3p1 */
  262. MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 1),
  263. /* Neoverse-N1 r0p0 to r3p1 */
  264. MIDR_RANGE(MIDR_NEOVERSE_N1, 0, 0, 3, 1),
  265. /* Kryo4xx Gold (rcpe to rfpf) => (r0p0 to r3p1) */
  266. MIDR_RANGE(MIDR_QCOM_KRYO_4XX_GOLD, 0xc, 0xe, 0xf, 0xf),
  267. {},
  268. };
  269. #endif
  270. #ifdef CONFIG_ARM64_ERRATUM_845719
  271. static const struct midr_range erratum_845719_list[] = {
  272. /* Cortex-A53 r0p[01234] */
  273. MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
  274. /* Brahma-B53 r0p[0] */
  275. MIDR_REV(MIDR_BRAHMA_B53, 0, 0),
  276. /* Kryo2XX Silver rAp4 */
  277. MIDR_REV(MIDR_QCOM_KRYO_2XX_SILVER, 0xa, 0x4),
  278. {},
  279. };
  280. #endif
  281. #ifdef CONFIG_ARM64_ERRATUM_843419
  282. static const struct arm64_cpu_capabilities erratum_843419_list[] = {
  283. {
  284. /* Cortex-A53 r0p[01234] */
  285. .matches = is_affected_midr_range,
  286. ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
  287. MIDR_FIXED(0x4, BIT(8)),
  288. },
  289. {
  290. /* Brahma-B53 r0p[0] */
  291. .matches = is_affected_midr_range,
  292. ERRATA_MIDR_REV(MIDR_BRAHMA_B53, 0, 0),
  293. },
  294. {},
  295. };
  296. #endif
  297. #ifdef CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT
  298. static const struct midr_range erratum_speculative_at_list[] = {
  299. #ifdef CONFIG_ARM64_ERRATUM_1165522
  300. /* Cortex A76 r0p0 to r2p0 */
  301. MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 2, 0),
  302. #endif
  303. #ifdef CONFIG_ARM64_ERRATUM_1319367
  304. MIDR_ALL_VERSIONS(MIDR_CORTEX_A57),
  305. MIDR_ALL_VERSIONS(MIDR_CORTEX_A72),
  306. #endif
  307. #ifdef CONFIG_ARM64_ERRATUM_1530923
  308. /* Cortex A55 r0p0 to r2p0 */
  309. MIDR_RANGE(MIDR_CORTEX_A55, 0, 0, 2, 0),
  310. /* Kryo4xx Silver (rdpe => r1p0) */
  311. MIDR_REV(MIDR_QCOM_KRYO_4XX_SILVER, 0xd, 0xe),
  312. #endif
  313. {},
  314. };
  315. #endif
  316. #ifdef CONFIG_ARM64_ERRATUM_1463225
  317. static const struct midr_range erratum_1463225[] = {
  318. /* Cortex-A76 r0p0 - r3p1 */
  319. MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 1),
  320. /* Kryo4xx Gold (rcpe to rfpf) => (r0p0 to r3p1) */
  321. MIDR_RANGE(MIDR_QCOM_KRYO_4XX_GOLD, 0xc, 0xe, 0xf, 0xf),
  322. {},
  323. };
  324. #endif
  325. #ifdef CONFIG_ARM64_WORKAROUND_TRBE_OVERWRITE_FILL_MODE
  326. static const struct midr_range trbe_overwrite_fill_mode_cpus[] = {
  327. #ifdef CONFIG_ARM64_ERRATUM_2139208
  328. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
  329. MIDR_ALL_VERSIONS(MIDR_MICROSOFT_AZURE_COBALT_100),
  330. #endif
  331. #ifdef CONFIG_ARM64_ERRATUM_2119858
  332. MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
  333. MIDR_RANGE(MIDR_CORTEX_X2, 0, 0, 2, 0),
  334. #endif
  335. {},
  336. };
  337. #endif /* CONFIG_ARM64_WORKAROUND_TRBE_OVERWRITE_FILL_MODE */
  338. #ifdef CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE
  339. static const struct midr_range tsb_flush_fail_cpus[] = {
  340. #ifdef CONFIG_ARM64_ERRATUM_2067961
  341. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
  342. MIDR_ALL_VERSIONS(MIDR_MICROSOFT_AZURE_COBALT_100),
  343. #endif
  344. #ifdef CONFIG_ARM64_ERRATUM_2054223
  345. MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
  346. #endif
  347. {},
  348. };
  349. #endif /* CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE */
  350. #ifdef CONFIG_ARM64_WORKAROUND_TRBE_WRITE_OUT_OF_RANGE
  351. static struct midr_range trbe_write_out_of_range_cpus[] = {
  352. #ifdef CONFIG_ARM64_ERRATUM_2253138
  353. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
  354. MIDR_ALL_VERSIONS(MIDR_MICROSOFT_AZURE_COBALT_100),
  355. #endif
  356. #ifdef CONFIG_ARM64_ERRATUM_2224489
  357. MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
  358. MIDR_RANGE(MIDR_CORTEX_X2, 0, 0, 2, 0),
  359. #endif
  360. {},
  361. };
  362. #endif /* CONFIG_ARM64_WORKAROUND_TRBE_WRITE_OUT_OF_RANGE */
  363. #ifdef CONFIG_ARM64_ERRATUM_1742098
  364. static struct midr_range broken_aarch32_aes[] = {
  365. MIDR_RANGE(MIDR_CORTEX_A57, 0, 1, 0xf, 0xf),
  366. MIDR_ALL_VERSIONS(MIDR_CORTEX_A72),
  367. {},
  368. };
  369. #endif /* CONFIG_ARM64_WORKAROUND_TRBE_WRITE_OUT_OF_RANGE */
  370. #ifdef CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD
  371. static const struct midr_range erratum_spec_unpriv_load_list[] = {
  372. #ifdef CONFIG_ARM64_ERRATUM_3117295
  373. MIDR_ALL_VERSIONS(MIDR_CORTEX_A510),
  374. #endif
  375. #ifdef CONFIG_ARM64_ERRATUM_2966298
  376. /* Cortex-A520 r0p0 to r0p1 */
  377. MIDR_REV_RANGE(MIDR_CORTEX_A520, 0, 0, 1),
  378. #endif
  379. {},
  380. };
  381. #endif
  382. #ifdef CONFIG_ARM64_ERRATUM_3194386
  383. static const struct midr_range erratum_spec_ssbs_list[] = {
  384. MIDR_ALL_VERSIONS(MIDR_CORTEX_A76),
  385. MIDR_ALL_VERSIONS(MIDR_CORTEX_A77),
  386. MIDR_ALL_VERSIONS(MIDR_CORTEX_A78),
  387. MIDR_ALL_VERSIONS(MIDR_CORTEX_A78C),
  388. MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
  389. MIDR_ALL_VERSIONS(MIDR_CORTEX_A715),
  390. MIDR_ALL_VERSIONS(MIDR_CORTEX_A720),
  391. MIDR_ALL_VERSIONS(MIDR_CORTEX_A725),
  392. MIDR_ALL_VERSIONS(MIDR_CORTEX_X1),
  393. MIDR_ALL_VERSIONS(MIDR_CORTEX_X1C),
  394. MIDR_ALL_VERSIONS(MIDR_CORTEX_X2),
  395. MIDR_ALL_VERSIONS(MIDR_CORTEX_X3),
  396. MIDR_ALL_VERSIONS(MIDR_CORTEX_X4),
  397. MIDR_ALL_VERSIONS(MIDR_CORTEX_X925),
  398. MIDR_ALL_VERSIONS(MIDR_MICROSOFT_AZURE_COBALT_100),
  399. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1),
  400. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
  401. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N3),
  402. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1),
  403. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2),
  404. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V3),
  405. MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V3AE),
  406. {}
  407. };
  408. #endif
  409. #ifdef CONFIG_AMPERE_ERRATUM_AC03_CPU_38
  410. static const struct midr_range erratum_ac03_cpu_38_list[] = {
  411. MIDR_ALL_VERSIONS(MIDR_AMPERE1),
  412. MIDR_ALL_VERSIONS(MIDR_AMPERE1A),
  413. {},
  414. };
  415. #endif
  416. const struct arm64_cpu_capabilities arm64_errata[] = {
  417. #ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE
  418. {
  419. .desc = "ARM errata 826319, 827319, 824069, or 819472",
  420. .capability = ARM64_WORKAROUND_CLEAN_CACHE,
  421. ERRATA_MIDR_RANGE_LIST(workaround_clean_cache),
  422. .cpu_enable = cpu_enable_cache_maint_trap,
  423. },
  424. #endif
  425. #ifdef CONFIG_ARM64_ERRATUM_832075
  426. {
  427. /* Cortex-A57 r0p0 - r1p2 */
  428. .desc = "ARM erratum 832075",
  429. .capability = ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE,
  430. ERRATA_MIDR_RANGE(MIDR_CORTEX_A57,
  431. 0, 0,
  432. 1, 2),
  433. },
  434. #endif
  435. #ifdef CONFIG_ARM64_ERRATUM_834220
  436. {
  437. /* Cortex-A57 r0p0 - r1p2 */
  438. .desc = "ARM erratum 834220",
  439. .capability = ARM64_WORKAROUND_834220,
  440. ERRATA_MIDR_RANGE(MIDR_CORTEX_A57,
  441. 0, 0,
  442. 1, 2),
  443. },
  444. #endif
  445. #ifdef CONFIG_ARM64_ERRATUM_843419
  446. {
  447. .desc = "ARM erratum 843419",
  448. .capability = ARM64_WORKAROUND_843419,
  449. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  450. .matches = cpucap_multi_entry_cap_matches,
  451. .match_list = erratum_843419_list,
  452. },
  453. #endif
  454. #ifdef CONFIG_ARM64_ERRATUM_845719
  455. {
  456. .desc = "ARM erratum 845719",
  457. .capability = ARM64_WORKAROUND_845719,
  458. ERRATA_MIDR_RANGE_LIST(erratum_845719_list),
  459. },
  460. #endif
  461. #ifdef CONFIG_CAVIUM_ERRATUM_23154
  462. {
  463. .desc = "Cavium errata 23154 and 38545",
  464. .capability = ARM64_WORKAROUND_CAVIUM_23154,
  465. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  466. ERRATA_MIDR_RANGE_LIST(cavium_erratum_23154_cpus),
  467. },
  468. #endif
  469. #ifdef CONFIG_CAVIUM_ERRATUM_27456
  470. {
  471. .desc = "Cavium erratum 27456",
  472. .capability = ARM64_WORKAROUND_CAVIUM_27456,
  473. ERRATA_MIDR_RANGE_LIST(cavium_erratum_27456_cpus),
  474. },
  475. #endif
  476. #ifdef CONFIG_CAVIUM_ERRATUM_30115
  477. {
  478. .desc = "Cavium erratum 30115",
  479. .capability = ARM64_WORKAROUND_CAVIUM_30115,
  480. ERRATA_MIDR_RANGE_LIST(cavium_erratum_30115_cpus),
  481. },
  482. #endif
  483. {
  484. .desc = "Mismatched cache type (CTR_EL0)",
  485. .capability = ARM64_MISMATCHED_CACHE_TYPE,
  486. .matches = has_mismatched_cache_type,
  487. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  488. .cpu_enable = cpu_enable_trap_ctr_access,
  489. },
  490. #ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003
  491. {
  492. .desc = "Qualcomm Technologies Falkor/Kryo erratum 1003",
  493. .capability = ARM64_WORKAROUND_QCOM_FALKOR_E1003,
  494. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  495. .matches = cpucap_multi_entry_cap_matches,
  496. .match_list = qcom_erratum_1003_list,
  497. },
  498. #endif
  499. #ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI
  500. {
  501. .desc = "Qualcomm erratum 1009, or ARM erratum 1286807, 2441009",
  502. .capability = ARM64_WORKAROUND_REPEAT_TLBI,
  503. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  504. .matches = cpucap_multi_entry_cap_matches,
  505. .match_list = arm64_repeat_tlbi_list,
  506. },
  507. #endif
  508. #ifdef CONFIG_ARM64_ERRATUM_858921
  509. {
  510. /* Cortex-A73 all versions */
  511. .desc = "ARM erratum 858921",
  512. .capability = ARM64_WORKAROUND_858921,
  513. ERRATA_MIDR_ALL_VERSIONS(MIDR_CORTEX_A73),
  514. },
  515. #endif
  516. {
  517. .desc = "Spectre-v2",
  518. .capability = ARM64_SPECTRE_V2,
  519. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  520. .matches = has_spectre_v2,
  521. .cpu_enable = spectre_v2_enable_mitigation,
  522. },
  523. #ifdef CONFIG_RANDOMIZE_BASE
  524. {
  525. /* Must come after the Spectre-v2 entry */
  526. .desc = "Spectre-v3a",
  527. .capability = ARM64_SPECTRE_V3A,
  528. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  529. .matches = has_spectre_v3a,
  530. .cpu_enable = spectre_v3a_enable_mitigation,
  531. },
  532. #endif
  533. {
  534. .desc = "Spectre-v4",
  535. .capability = ARM64_SPECTRE_V4,
  536. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  537. .matches = has_spectre_v4,
  538. .cpu_enable = spectre_v4_enable_mitigation,
  539. },
  540. {
  541. .desc = "Spectre-BHB",
  542. .capability = ARM64_SPECTRE_BHB,
  543. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  544. .matches = is_spectre_bhb_affected,
  545. .cpu_enable = spectre_bhb_enable_mitigation,
  546. },
  547. #ifdef CONFIG_ARM64_ERRATUM_1418040
  548. {
  549. .desc = "ARM erratum 1418040",
  550. .capability = ARM64_WORKAROUND_1418040,
  551. ERRATA_MIDR_RANGE_LIST(erratum_1418040_list),
  552. /*
  553. * We need to allow affected CPUs to come in late, but
  554. * also need the non-affected CPUs to be able to come
  555. * in at any point in time. Wonderful.
  556. */
  557. .type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE,
  558. },
  559. #endif
  560. #ifdef CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT
  561. {
  562. .desc = "ARM errata 1165522, 1319367, or 1530923",
  563. .capability = ARM64_WORKAROUND_SPECULATIVE_AT,
  564. ERRATA_MIDR_RANGE_LIST(erratum_speculative_at_list),
  565. },
  566. #endif
  567. #ifdef CONFIG_ARM64_ERRATUM_1463225
  568. {
  569. .desc = "ARM erratum 1463225",
  570. .capability = ARM64_WORKAROUND_1463225,
  571. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  572. .matches = has_cortex_a76_erratum_1463225,
  573. .midr_range_list = erratum_1463225,
  574. },
  575. #endif
  576. #ifdef CONFIG_CAVIUM_TX2_ERRATUM_219
  577. {
  578. .desc = "Cavium ThunderX2 erratum 219 (KVM guest sysreg trapping)",
  579. .capability = ARM64_WORKAROUND_CAVIUM_TX2_219_TVM,
  580. ERRATA_MIDR_RANGE_LIST(tx2_family_cpus),
  581. .matches = needs_tx2_tvm_workaround,
  582. },
  583. {
  584. .desc = "Cavium ThunderX2 erratum 219 (PRFM removal)",
  585. .capability = ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM,
  586. ERRATA_MIDR_RANGE_LIST(tx2_family_cpus),
  587. },
  588. #endif
  589. #ifdef CONFIG_ARM64_ERRATUM_1542419
  590. {
  591. /* we depend on the firmware portion for correctness */
  592. .desc = "ARM erratum 1542419 (kernel portion)",
  593. .capability = ARM64_WORKAROUND_1542419,
  594. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  595. .matches = has_neoverse_n1_erratum_1542419,
  596. .cpu_enable = cpu_enable_trap_ctr_access,
  597. },
  598. #endif
  599. #ifdef CONFIG_ARM64_ERRATUM_1508412
  600. {
  601. /* we depend on the firmware portion for correctness */
  602. .desc = "ARM erratum 1508412 (kernel portion)",
  603. .capability = ARM64_WORKAROUND_1508412,
  604. ERRATA_MIDR_RANGE(MIDR_CORTEX_A77,
  605. 0, 0,
  606. 1, 0),
  607. },
  608. #endif
  609. #ifdef CONFIG_NVIDIA_CARMEL_CNP_ERRATUM
  610. {
  611. /* NVIDIA Carmel */
  612. .desc = "NVIDIA Carmel CNP erratum",
  613. .capability = ARM64_WORKAROUND_NVIDIA_CARMEL_CNP,
  614. ERRATA_MIDR_ALL_VERSIONS(MIDR_NVIDIA_CARMEL),
  615. },
  616. #endif
  617. #ifdef CONFIG_ARM64_WORKAROUND_TRBE_OVERWRITE_FILL_MODE
  618. {
  619. /*
  620. * The erratum work around is handled within the TRBE
  621. * driver and can be applied per-cpu. So, we can allow
  622. * a late CPU to come online with this erratum.
  623. */
  624. .desc = "ARM erratum 2119858 or 2139208",
  625. .capability = ARM64_WORKAROUND_TRBE_OVERWRITE_FILL_MODE,
  626. .type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE,
  627. CAP_MIDR_RANGE_LIST(trbe_overwrite_fill_mode_cpus),
  628. },
  629. #endif
  630. #ifdef CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE
  631. {
  632. .desc = "ARM erratum 2067961 or 2054223",
  633. .capability = ARM64_WORKAROUND_TSB_FLUSH_FAILURE,
  634. ERRATA_MIDR_RANGE_LIST(tsb_flush_fail_cpus),
  635. },
  636. #endif
  637. #ifdef CONFIG_ARM64_WORKAROUND_TRBE_WRITE_OUT_OF_RANGE
  638. {
  639. .desc = "ARM erratum 2253138 or 2224489",
  640. .capability = ARM64_WORKAROUND_TRBE_WRITE_OUT_OF_RANGE,
  641. .type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE,
  642. CAP_MIDR_RANGE_LIST(trbe_write_out_of_range_cpus),
  643. },
  644. #endif
  645. #ifdef CONFIG_ARM64_ERRATUM_2645198
  646. {
  647. .desc = "ARM erratum 2645198",
  648. .capability = ARM64_WORKAROUND_2645198,
  649. ERRATA_MIDR_ALL_VERSIONS(MIDR_CORTEX_A715)
  650. },
  651. #endif
  652. #ifdef CONFIG_ARM64_ERRATUM_2077057
  653. {
  654. .desc = "ARM erratum 2077057",
  655. .capability = ARM64_WORKAROUND_2077057,
  656. ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A510, 0, 0, 2),
  657. },
  658. #endif
  659. #ifdef CONFIG_ARM64_ERRATUM_2064142
  660. {
  661. .desc = "ARM erratum 2064142",
  662. .capability = ARM64_WORKAROUND_2064142,
  663. /* Cortex-A510 r0p0 - r0p2 */
  664. ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A510, 0, 0, 2)
  665. },
  666. #endif
  667. #ifdef CONFIG_ARM64_ERRATUM_2457168
  668. {
  669. .desc = "ARM erratum 2457168",
  670. .capability = ARM64_WORKAROUND_2457168,
  671. .type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE,
  672. /* Cortex-A510 r0p0-r1p1 */
  673. CAP_MIDR_RANGE(MIDR_CORTEX_A510, 0, 0, 1, 1)
  674. },
  675. #endif
  676. #ifdef CONFIG_ARM64_ERRATUM_2038923
  677. {
  678. .desc = "ARM erratum 2038923",
  679. .capability = ARM64_WORKAROUND_2038923,
  680. /* Cortex-A510 r0p0 - r0p2 */
  681. ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A510, 0, 0, 2)
  682. },
  683. #endif
  684. #ifdef CONFIG_ARM64_ERRATUM_1902691
  685. {
  686. .desc = "ARM erratum 1902691",
  687. .capability = ARM64_WORKAROUND_1902691,
  688. /* Cortex-A510 r0p0 - r0p1 */
  689. ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A510, 0, 0, 1)
  690. },
  691. #endif
  692. #ifdef CONFIG_ARM64_ERRATUM_1742098
  693. {
  694. .desc = "ARM erratum 1742098",
  695. .capability = ARM64_WORKAROUND_1742098,
  696. CAP_MIDR_RANGE_LIST(broken_aarch32_aes),
  697. .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
  698. },
  699. #endif
  700. #ifdef CONFIG_ARM64_ERRATUM_2658417
  701. {
  702. .desc = "ARM erratum 2658417",
  703. .capability = ARM64_WORKAROUND_2658417,
  704. /* Cortex-A510 r0p0 - r1p1 */
  705. ERRATA_MIDR_RANGE(MIDR_CORTEX_A510, 0, 0, 1, 1),
  706. MIDR_FIXED(MIDR_CPU_VAR_REV(1,1), BIT(25)),
  707. },
  708. #endif
  709. #ifdef CONFIG_ARM64_ERRATUM_3194386
  710. {
  711. .desc = "SSBS not fully self-synchronizing",
  712. .capability = ARM64_WORKAROUND_SPECULATIVE_SSBS,
  713. ERRATA_MIDR_RANGE_LIST(erratum_spec_ssbs_list),
  714. },
  715. #endif
  716. #ifdef CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD
  717. {
  718. .desc = "ARM errata 2966298, 3117295",
  719. .capability = ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD,
  720. /* Cortex-A520 r0p0 - r0p1 */
  721. ERRATA_MIDR_RANGE_LIST(erratum_spec_unpriv_load_list),
  722. },
  723. #endif
  724. #ifdef CONFIG_AMPERE_ERRATUM_AC03_CPU_38
  725. {
  726. .desc = "AmpereOne erratum AC03_CPU_38",
  727. .capability = ARM64_WORKAROUND_AMPERE_AC03_CPU_38,
  728. ERRATA_MIDR_RANGE_LIST(erratum_ac03_cpu_38_list),
  729. },
  730. #endif
  731. {
  732. }
  733. };