1 #ifndef __ARM_CPUERRATA_H__
2 #define __ARM_CPUERRATA_H__
3 
4 #include <asm/cpufeature.h>
5 #include <asm/alternative.h>
6 
7 void check_local_cpu_errata(void);
8 void enable_errata_workarounds(void);
9 
10 #define CHECK_WORKAROUND_HELPER(erratum, feature, arch)         \
11 static inline bool check_workaround_##erratum(void)             \
12 {                                                               \
13     if ( !IS_ENABLED(arch) )                                    \
14         return false;                                           \
15     else                                                        \
16     {                                                           \
17         register_t ret;                                         \
18                                                                 \
19         asm_inline volatile (                                   \
20             ALTERNATIVE("mov %0, #0",                           \
21                         "mov %0, #1", feature)                  \
22             : "=r" (ret) );                                     \
23                                                                 \
24         return unlikely(ret);                                   \
25     }                                                           \
26 }
27 
28 CHECK_WORKAROUND_HELPER(766422, ARM32_WORKAROUND_766422, CONFIG_ARM_32)
29 CHECK_WORKAROUND_HELPER(834220, ARM64_WORKAROUND_834220, CONFIG_ARM_64)
30 CHECK_WORKAROUND_HELPER(ssbd, ARM_SSBD, CONFIG_ARM_SSBD)
31 CHECK_WORKAROUND_HELPER(858921, ARM_WORKAROUND_858921,
32                         CONFIG_ARM_ERRATUM_858921)
33 
34 #undef CHECK_WORKAROUND_HELPER
35 
36 enum ssbd_state
37 {
38     ARM_SSBD_UNKNOWN,
39     ARM_SSBD_FORCE_DISABLE,
40     ARM_SSBD_RUNTIME,
41     ARM_SSBD_FORCE_ENABLE,
42     ARM_SSBD_MITIGATED,
43 };
44 
45 #ifdef CONFIG_ARM_SSBD
46 
47 #include <asm/current.h>
48 
49 extern enum ssbd_state ssbd_state;
50 
get_ssbd_state(void)51 static inline enum ssbd_state get_ssbd_state(void)
52 {
53     return ssbd_state;
54 }
55 
56 DECLARE_PER_CPU(register_t, ssbd_callback_required);
57 
cpu_require_ssbd_mitigation(void)58 static inline bool cpu_require_ssbd_mitigation(void)
59 {
60     return this_cpu(ssbd_callback_required);
61 }
62 
63 #else
64 
cpu_require_ssbd_mitigation(void)65 static inline bool cpu_require_ssbd_mitigation(void)
66 {
67     return false;
68 }
69 
get_ssbd_state(void)70 static inline enum ssbd_state get_ssbd_state(void)
71 {
72     return ARM_SSBD_UNKNOWN;
73 }
74 
75 #endif
76 
77 #endif /* __ARM_CPUERRATA_H__ */
78 /*
79  * Local variables:
80  * mode: C
81  * c-file-style: "BSD"
82  * c-basic-offset: 4
83  * indent-tabs-mode: nil
84  * End:
85  */
86