hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_LSE_H
#define __ASM_LSE_H
 
#include <asm/atomic_ll_sc.h>
 
#if defined(CONFIG_ARM64_LSE_ATOMICS) && !defined(BUILD_FIPS140_KO)
 
#define __LSE_PREAMBLE    ".arch_extension lse\n"
 
#include <linux/compiler_types.h>
#include <linux/export.h>
#include <linux/jump_label.h>
#include <linux/stringify.h>
#include <asm/alternative.h>
#include <asm/atomic_lse.h>
#include <asm/cpucaps.h>
 
extern struct static_key_false cpu_hwcap_keys[ARM64_NCAPS];
extern struct static_key_false arm64_const_caps_ready;
 
static inline bool system_uses_lse_atomics(void)
{
   return (static_branch_likely(&arm64_const_caps_ready)) &&
       static_branch_likely(&cpu_hwcap_keys[ARM64_HAS_LSE_ATOMICS]);
}
 
#define __lse_ll_sc_body(op, ...)                    \
({                                    \
   system_uses_lse_atomics() ?                    \
       __lse_##op(__VA_ARGS__) :                \
       __ll_sc_##op(__VA_ARGS__);                \
})
 
/* In-line patching at runtime */
#define ARM64_LSE_ATOMIC_INSN(llsc, lse)                \
   ALTERNATIVE(llsc, __LSE_PREAMBLE lse, ARM64_HAS_LSE_ATOMICS)
 
#else    /* CONFIG_ARM64_LSE_ATOMICS */
 
static inline bool system_uses_lse_atomics(void) { return false; }
 
#define __lse_ll_sc_body(op, ...)        __ll_sc_##op(__VA_ARGS__)
 
#define ARM64_LSE_ATOMIC_INSN(llsc, lse)    llsc
 
#endif    /* CONFIG_ARM64_LSE_ATOMICS */
#endif    /* __ASM_LSE_H */