]> Git Repo - linux.git/blob - include/linux/soc/marvell/octeontx2/asm.h
Merge patch series "riscv: Extension parsing fixes"
[linux.git] / include / linux / soc / marvell / octeontx2 / asm.h
1 /* SPDX-License-Identifier: GPL-2.0-only
2  * Copyright (C) 2020 Marvell.
3  */
4
5 #ifndef __SOC_OTX2_ASM_H
6 #define __SOC_OTX2_ASM_H
7
8 #include <linux/types.h>
9 #if defined(CONFIG_ARM64)
10 /*
11  * otx2_lmt_flush is used for LMT store operation.
12  * On octeontx2 platform CPT instruction enqueue and
13  * NIX packet send are only possible via LMTST
14  * operations and it uses LDEOR instruction targeting
15  * the coprocessor address.
16  */
17 #define otx2_lmt_flush(ioaddr)                          \
18 ({                                                      \
19         u64 result = 0;                                 \
20         __asm__ volatile(".cpu  generic+lse\n"          \
21                          "ldeor xzr, %x[rf], [%[rs]]"   \
22                          : [rf]"=r" (result)            \
23                          : [rs]"r" (ioaddr));           \
24         (result);                                       \
25 })
26 /*
27  * STEORL store to memory with release semantics.
28  * This will avoid using DMB barrier after each LMTST
29  * operation.
30  */
31 #define cn10k_lmt_flush(val, addr)                      \
32 ({                                                      \
33         __asm__ volatile(".cpu  generic+lse\n"          \
34                          "steorl %x[rf],[%[rs]]"                \
35                          : [rf] "+r"(val)               \
36                          : [rs] "r"(addr));             \
37 })
38
39 static inline u64 otx2_atomic64_fetch_add(u64 incr, u64 *ptr)
40 {
41         u64 result;
42
43         asm volatile (".cpu  generic+lse\n"
44                       "ldadda %x[i], %x[r], [%[b]]"
45                       : [r] "=r" (result), "+m" (*ptr)
46                       : [i] "r" (incr), [b] "r" (ptr)
47                       : "memory");
48         return result;
49 }
50
51 #else
52 #define otx2_lmt_flush(ioaddr)          ({ 0; })
53 #define cn10k_lmt_flush(val, addr)      ({ addr = val; })
54 #define otx2_atomic64_fetch_add(incr, ptr)      ({ incr; })
55 #endif
56
57 #endif /* __SOC_OTX2_ASM_H */
This page took 0.040834 seconds and 4 git commands to generate.