blob: 0d2c4c0d630b34b932413d25bec64c10c0cd42b2 [file] [log] [blame]
Arvind Ram Prakash10cd41d2024-08-05 16:11:42 -05001/*
Govindraj Raja8c6068f2025-01-29 15:01:10 -06002 * Copyright (c) 2024-2025, Arm Limited and Contributors. All rights reserved.
Arvind Ram Prakash10cd41d2024-08-05 16:11:42 -05003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7/* Runtime C routines for errata workarounds and common routines */
8
9#include <arch.h>
10#include <arch_helpers.h>
Sona Mathew578d3572024-07-10 18:04:40 -050011#include <cortex_a75.h>
Govindraj Raja8c6068f2025-01-29 15:01:10 -060012#include <cortex_a520.h>
Govindraj Rajac32e3a32025-01-21 12:32:14 -060013#include <cortex_a710.h>
Govindraj Raja3b8a3ad2025-01-21 17:00:11 -060014#include <cortex_a715.h>
Govindraj Rajac7d5de92025-01-21 17:12:33 -060015#include <cortex_a720.h>
Govindraj Raja2296df62025-01-21 18:02:51 -060016#include <cortex_x2.h>
Govindraj Rajaed4bd3c2025-01-21 18:12:35 -060017#include <cortex_x3.h>
Arvind Ram Prakash10cd41d2024-08-05 16:11:42 -050018#include <cortex_x4.h>
19#include <lib/cpus/cpu_ops.h>
20#include <lib/cpus/errata.h>
21
22#if ERRATA_A520_2938996 || ERRATA_X4_2726228
23unsigned int check_if_affected_core(void)
24{
25 uint32_t midr_val = read_midr();
26 long rev_var = cpu_get_rev_var();
27
28 if (EXTRACT_PARTNUM(midr_val) == EXTRACT_PARTNUM(CORTEX_A520_MIDR)) {
29 return check_erratum_cortex_a520_2938996(rev_var);
30 } else if (EXTRACT_PARTNUM(midr_val) == EXTRACT_PARTNUM(CORTEX_X4_MIDR)) {
31 return check_erratum_cortex_x4_2726228(rev_var);
32 }
33
34 return ERRATA_NOT_APPLIES;
35}
36#endif
Sona Mathew578d3572024-07-10 18:04:40 -050037
38#if ERRATA_A75_764081
39bool errata_a75_764081_applies(void)
40{
41 long rev_var = cpu_get_rev_var();
42
43 if (check_erratum_cortex_a75_764081(rev_var) == ERRATA_APPLIES) {
44 return true;
45 }
46 return false;
47}
48#endif /* ERRATA_A75_764081 */
49
Govindraj Raja8c6068f2025-01-29 15:01:10 -060050bool errata_ich_vmcr_el2_applies(void)
51{
52 switch (EXTRACT_PARTNUM(read_midr())) {
Govindraj Rajac32e3a32025-01-21 12:32:14 -060053#if ERRATA_A710_3701772
54 case EXTRACT_PARTNUM(CORTEX_A710_MIDR):
55 if (check_erratum_cortex_a710_3701772(cpu_get_rev_var()) == ERRATA_APPLIES)
56 return true;
57 break;
58#endif /* ERRATA_A710_3701772 */
59
Govindraj Raja3b8a3ad2025-01-21 17:00:11 -060060#if ERRATA_A715_3699560
61 case EXTRACT_PARTNUM(CORTEX_A715_MIDR):
62 if (check_erratum_cortex_a715_3699560(cpu_get_rev_var()) == ERRATA_APPLIES)
63 return true;
64 break;
65#endif /* ERRATA_A715_3699560 */
66
Govindraj Rajac7d5de92025-01-21 17:12:33 -060067#if ERRATA_A720_3699561
68 case EXTRACT_PARTNUM(CORTEX_A720_MIDR):
69 if (check_erratum_cortex_a720_3699561(cpu_get_rev_var()) == ERRATA_APPLIES)
70 return true;;
71 break;
72#endif /* ERRATA_A720_3699561 */
73
Govindraj Raja2296df62025-01-21 18:02:51 -060074#if ERRATA_X2_3701772
75 case EXTRACT_PARTNUM(CORTEX_X2_MIDR):
76 if (check_erratum_cortex_x2_3701772(cpu_get_rev_var()) == ERRATA_APPLIES)
77 return true;
78 break;
79#endif /* ERRATA_X2_3701772 */
80
Govindraj Rajaed4bd3c2025-01-21 18:12:35 -060081#if ERRATA_X3_3701769
82 case EXTRACT_PARTNUM(CORTEX_X3_MIDR):
83 if (check_erratum_cortex_x3_3701769(cpu_get_rev_var()) == ERRATA_APPLIES)
84 return true;
85 break;
86#endif /* ERRATA_X3_3701769 */
87
Govindraj Raja395f67e2025-01-21 18:24:57 -060088#if ERRATA_X4_3701758
89 case EXTRACT_PARTNUM(CORTEX_X4_MIDR):
90 if (check_erratum_cortex_x4_3701758(cpu_get_rev_var()) == ERRATA_APPLIES)
91 return true;
92 break;
93#endif /* ERRATA_X4_3701758 */
94
Govindraj Raja8c6068f2025-01-29 15:01:10 -060095 default:
96 break;
97 }
98
99 return false;
100}