1/* 2 * Copyright (c) 2019-2021, Arm Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7#include <arch.h> 8#include <asm_macros.S> 9#include <common/bl_common.h> 10#include <neoverse_v1.h> 11#include <cpu_macros.S> 12#include <plat_macros.S> 13 14/* Hardware handled coherency */ 15#if HW_ASSISTED_COHERENCY == 0 16#error "Neoverse V1 must be compiled with HW_ASSISTED_COHERENCY enabled" 17#endif 18 19/* 64-bit only core */ 20#if CTX_INCLUDE_AARCH32_REGS == 1 21#error "Neoverse-V1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 22#endif 23 24 /* -------------------------------------------------- 25 * Errata Workaround for Neoverse V1 Errata #1774420. 26 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 27 * x0: variant[4:7] and revision[0:3] of current cpu. 28 * Shall clobber: x0-x17 29 * -------------------------------------------------- 30 */ 31func errata_neoverse_v1_1774420_wa 32 /* Check workaround compatibility. */ 33 mov x17, x30 34 bl check_errata_1774420 35 cbz x0, 1f 36 37 /* Set bit 53 in CPUECTLR_EL1 */ 38 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 39 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_53 40 msr NEOVERSE_V1_CPUECTLR_EL1, x1 41 isb 421: 43 ret x17 44endfunc errata_neoverse_v1_1774420_wa 45 46func check_errata_1774420 47 /* Applies to r0p0 and r1p0. */ 48 mov x1, #0x10 49 b cpu_rev_var_ls 50endfunc check_errata_1774420 51 52 /* -------------------------------------------------- 53 * Errata Workaround for Neoverse V1 Errata #1791573. 54 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 55 * x0: variant[4:7] and revision[0:3] of current cpu. 56 * Shall clobber: x0-x17 57 * -------------------------------------------------- 58 */ 59func errata_neoverse_v1_1791573_wa 60 /* Check workaround compatibility. */ 61 mov x17, x30 62 bl check_errata_1791573 63 cbz x0, 1f 64 65 /* Set bit 2 in ACTLR2_EL1 */ 66 mrs x1, NEOVERSE_V1_ACTLR2_EL1 67 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2 68 msr NEOVERSE_V1_ACTLR2_EL1, x1 69 isb 701: 71 ret x17 72endfunc errata_neoverse_v1_1791573_wa 73 74func check_errata_1791573 75 /* Applies to r0p0 and r1p0. */ 76 mov x1, #0x10 77 b cpu_rev_var_ls 78endfunc check_errata_1791573 79 80 /* -------------------------------------------------- 81 * Errata Workaround for Neoverse V1 Errata #1852267. 82 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 83 * x0: variant[4:7] and revision[0:3] of current cpu. 84 * Shall clobber: x0-x17 85 * -------------------------------------------------- 86 */ 87func errata_neoverse_v1_1852267_wa 88 /* Check workaround compatibility. */ 89 mov x17, x30 90 bl check_errata_1852267 91 cbz x0, 1f 92 93 /* Set bit 28 in ACTLR2_EL1 */ 94 mrs x1, NEOVERSE_V1_ACTLR2_EL1 95 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_28 96 msr NEOVERSE_V1_ACTLR2_EL1, x1 97 isb 981: 99 ret x17 100endfunc errata_neoverse_v1_1852267_wa 101 102func check_errata_1852267 103 /* Applies to r0p0 and r1p0. */ 104 mov x1, #0x10 105 b cpu_rev_var_ls 106endfunc check_errata_1852267 107 108 /* -------------------------------------------------- 109 * Errata Workaround for Neoverse V1 Errata #1925756. 110 * This applies to revisions <= r1p1. 111 * x0: variant[4:7] and revision[0:3] of current cpu. 112 * Shall clobber: x0-x17 113 * -------------------------------------------------- 114 */ 115func errata_neoverse_v1_1925756_wa 116 /* Check workaround compatibility. */ 117 mov x17, x30 118 bl check_errata_1925756 119 cbz x0, 1f 120 121 /* Set bit 8 in CPUECTLR_EL1 */ 122 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 123 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_8 124 msr NEOVERSE_V1_CPUECTLR_EL1, x1 125 isb 1261: 127 ret x17 128endfunc errata_neoverse_v1_1925756_wa 129 130func check_errata_1925756 131 /* Applies to <= r1p1. */ 132 mov x1, #0x11 133 b cpu_rev_var_ls 134endfunc check_errata_1925756 135 136 /* -------------------------------------------------- 137 * Errata Workaround for Neoverse V1 Erratum #1940577 138 * This applies to revisions r1p0 - r1p1 and is open. 139 * It also exists in r0p0 but there is no fix in that 140 * revision. 141 * Inputs: 142 * x0: variant[4:7] and revision[0:3] of current cpu. 143 * Shall clobber: x0-x17 144 * -------------------------------------------------- 145 */ 146func errata_neoverse_v1_1940577_wa 147 /* Compare x0 against revisions r1p0 - r1p1 */ 148 mov x17, x30 149 bl check_errata_1940577 150 cbz x0, 1f 151 152 mov x0, #0 153 msr S3_6_C15_C8_0, x0 154 ldr x0, =0x10E3900002 155 msr S3_6_C15_C8_2, x0 156 ldr x0, =0x10FFF00083 157 msr S3_6_C15_C8_3, x0 158 ldr x0, =0x2001003FF 159 msr S3_6_C15_C8_1, x0 160 161 mov x0, #1 162 msr S3_6_C15_C8_0, x0 163 ldr x0, =0x10E3800082 164 msr S3_6_C15_C8_2, x0 165 ldr x0, =0x10FFF00083 166 msr S3_6_C15_C8_3, x0 167 ldr x0, =0x2001003FF 168 msr S3_6_C15_C8_1, x0 169 170 mov x0, #2 171 msr S3_6_C15_C8_0, x0 172 ldr x0, =0x10E3800200 173 msr S3_6_C15_C8_2, x0 174 ldr x0, =0x10FFF003E0 175 msr S3_6_C15_C8_3, x0 176 ldr x0, =0x2001003FF 177 msr S3_6_C15_C8_1, x0 178 179 isb 1801: 181 ret x17 182endfunc errata_neoverse_v1_1940577_wa 183 184func check_errata_1940577 185 /* Applies to revisions r1p0 - r1p1. */ 186 mov x1, #0x10 187 mov x2, #0x11 188 b cpu_rev_var_range 189endfunc check_errata_1940577 190 191 /* -------------------------------------------------- 192 * Errata Workaround for Neoverse V1 Errata #1966096 193 * This applies to revisions r1p0 - r1p1 and is open. 194 * It also exists in r0p0 but there is no workaround 195 * for that revision. 196 * x0: variant[4:7] and revision[0:3] of current cpu. 197 * Shall clobber: x0-x17 198 * -------------------------------------------------- 199 */ 200func errata_neoverse_v1_1966096_wa 201 /* Check workaround compatibility. */ 202 mov x17, x30 203 bl check_errata_1966096 204 cbz x0, 1f 205 206 /* Apply the workaround. */ 207 mov x0, #0x3 208 msr S3_6_C15_C8_0, x0 209 ldr x0, =0xEE010F12 210 msr S3_6_C15_C8_2, x0 211 ldr x0, =0xFFFF0FFF 212 msr S3_6_C15_C8_3, x0 213 ldr x0, =0x80000000003FF 214 msr S3_6_C15_C8_1, x0 215 isb 216 2171: 218 ret x17 219endfunc errata_neoverse_v1_1966096_wa 220 221func check_errata_1966096 222 mov x1, #0x10 223 mov x2, #0x11 224 b cpu_rev_var_range 225endfunc check_errata_1966096 226 227 /* -------------------------------------------------- 228 * Errata Workaround for Neoverse V1 Errata #2139242. 229 * This applies to revisions r0p0, r1p0, and r1p1, it 230 * is still open. 231 * x0: variant[4:7] and revision[0:3] of current cpu. 232 * Shall clobber: x0-x17 233 * -------------------------------------------------- 234 */ 235func errata_neoverse_v1_2139242_wa 236 /* Check workaround compatibility. */ 237 mov x17, x30 238 bl check_errata_2139242 239 cbz x0, 1f 240 241 /* Apply the workaround. */ 242 mov x0, #0x3 243 msr S3_6_C15_C8_0, x0 244 ldr x0, =0xEE720F14 245 msr S3_6_C15_C8_2, x0 246 ldr x0, =0xFFFF0FDF 247 msr S3_6_C15_C8_3, x0 248 ldr x0, =0x40000005003FF 249 msr S3_6_C15_C8_1, x0 250 isb 251 2521: 253 ret x17 254endfunc errata_neoverse_v1_2139242_wa 255 256func check_errata_2139242 257 /* Applies to r0p0, r1p0, r1p1 */ 258 mov x1, #0x11 259 b cpu_rev_var_ls 260endfunc check_errata_2139242 261 262 /* --------------------------------------------- 263 * HW will do the cache maintenance while powering down 264 * --------------------------------------------- 265 */ 266func neoverse_v1_core_pwr_dwn 267 /* --------------------------------------------- 268 * Enable CPU power down bit in power control register 269 * --------------------------------------------- 270 */ 271 mrs x0, NEOVERSE_V1_CPUPWRCTLR_EL1 272 orr x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 273 msr NEOVERSE_V1_CPUPWRCTLR_EL1, x0 274 isb 275 ret 276endfunc neoverse_v1_core_pwr_dwn 277 278 /* 279 * Errata printing function for Neoverse V1. Must follow AAPCS. 280 */ 281#if REPORT_ERRATA 282func neoverse_v1_errata_report 283 stp x8, x30, [sp, #-16]! 284 285 bl cpu_get_rev_var 286 mov x8, x0 287 288 /* 289 * Report all errata. The revision-variant information is passed to 290 * checking functions of each errata. 291 */ 292 report_errata ERRATA_V1_1774420, neoverse_v1, 1774420 293 report_errata ERRATA_V1_1791573, neoverse_v1, 1791573 294 report_errata ERRATA_V1_1852267, neoverse_v1, 1852267 295 report_errata ERRATA_V1_1925756, neoverse_v1, 1925756 296 report_errata ERRATA_V1_1940577, neoverse_v1, 1940577 297 report_errata ERRATA_V1_1966096, neoverse_v1, 1966096 298 report_errata ERRATA_V1_2139242, neoverse_v1, 2139242 299 300 ldp x8, x30, [sp], #16 301 ret 302endfunc neoverse_v1_errata_report 303#endif 304 305func neoverse_v1_reset_func 306 mov x19, x30 307 308 /* Disable speculative loads */ 309 msr SSBS, xzr 310 isb 311 312#if ERRATA_V1_1774420 313 mov x0, x18 314 bl errata_neoverse_v1_1774420_wa 315#endif 316 317#if ERRATA_V1_1791573 318 mov x0, x18 319 bl errata_neoverse_v1_1791573_wa 320#endif 321 322#if ERRATA_V1_1852267 323 mov x0, x18 324 bl errata_neoverse_v1_1852267_wa 325#endif 326 327#if ERRATA_V1_1925756 328 mov x0, x18 329 bl errata_neoverse_v1_1925756_wa 330#endif 331 332#if ERRATA_V1_1940577 333 mov x0, x18 334 bl errata_neoverse_v1_1940577_wa 335#endif 336 337#if ERRATA_V1_1966096 338 mov x0, x18 339 bl errata_neoverse_v1_1966096_wa 340#endif 341 342#if ERRATA_V1_2139242 343 mov x0, x18 344 bl errata_neoverse_v1_2139242_wa 345#endif 346 347 ret x19 348endfunc neoverse_v1_reset_func 349 350 /* --------------------------------------------- 351 * This function provides Neoverse-V1 specific 352 * register information for crash reporting. 353 * It needs to return with x6 pointing to 354 * a list of register names in ascii and 355 * x8 - x15 having values of registers to be 356 * reported. 357 * --------------------------------------------- 358 */ 359.section .rodata.neoverse_v1_regs, "aS" 360neoverse_v1_regs: /* The ascii list of register names to be reported */ 361 .asciz "cpuectlr_el1", "" 362 363func neoverse_v1_cpu_reg_dump 364 adr x6, neoverse_v1_regs 365 mrs x8, NEOVERSE_V1_CPUECTLR_EL1 366 ret 367endfunc neoverse_v1_cpu_reg_dump 368 369declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \ 370 neoverse_v1_reset_func, \ 371 neoverse_v1_core_pwr_dwn 372