arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / arch / loongarch / include / asm / asm.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Some useful macros for LoongArch assembler code
4  *
5  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
6  *
7  * Derived from MIPS:
8  * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle
9  * Copyright (C) 1999 by Silicon Graphics, Inc.
10  * Copyright (C) 2001 MIPS Technologies, Inc.
11  * Copyright (C) 2002  Maciej W. Rozycki
12  */
13 #ifndef __ASM_ASM_H
14 #define __ASM_ASM_H
15
16 /* LoongArch pref instruction. */
17 #ifdef CONFIG_CPU_HAS_PREFETCH
18
19 #define PREF(hint, addr, offs)                          \
20                 preld   hint, addr, offs;               \
21
22 #define PREFX(hint, addr, index)                        \
23                 preldx  hint, addr, index;              \
24
25 #else /* !CONFIG_CPU_HAS_PREFETCH */
26
27 #define PREF(hint, addr, offs)
28 #define PREFX(hint, addr, index)
29
30 #endif /* !CONFIG_CPU_HAS_PREFETCH */
31
32 /*
33  * Stack alignment
34  */
35 #define STACK_ALIGN     ~(0xf)
36
37 /*
38  * Macros to handle different pointer/register sizes for 32/64-bit code
39  */
40
41 /*
42  * Size of a register
43  */
44 #ifndef __loongarch64
45 #define SZREG   4
46 #else
47 #define SZREG   8
48 #endif
49
50 /*
51  * Use the following macros in assemblercode to load/store registers,
52  * pointers etc.
53  */
54 #if (SZREG == 4)
55 #define REG_L           ld.w
56 #define REG_S           st.w
57 #define REG_ADD         add.w
58 #define REG_SUB         sub.w
59 #else /* SZREG == 8 */
60 #define REG_L           ld.d
61 #define REG_S           st.d
62 #define REG_ADD         add.d
63 #define REG_SUB         sub.d
64 #endif
65
66 /*
67  * How to add/sub/load/store/shift C int variables.
68  */
69 #if (__SIZEOF_INT__ == 4)
70 #define INT_ADD         add.w
71 #define INT_ADDI        addi.w
72 #define INT_SUB         sub.w
73 #define INT_L           ld.w
74 #define INT_S           st.w
75 #define INT_SLL         slli.w
76 #define INT_SLLV        sll.w
77 #define INT_SRL         srli.w
78 #define INT_SRLV        srl.w
79 #define INT_SRA         srai.w
80 #define INT_SRAV        sra.w
81 #endif
82
83 #if (__SIZEOF_INT__ == 8)
84 #define INT_ADD         add.d
85 #define INT_ADDI        addi.d
86 #define INT_SUB         sub.d
87 #define INT_L           ld.d
88 #define INT_S           st.d
89 #define INT_SLL         slli.d
90 #define INT_SLLV        sll.d
91 #define INT_SRL         srli.d
92 #define INT_SRLV        srl.d
93 #define INT_SRA         srai.d
94 #define INT_SRAV        sra.d
95 #endif
96
97 /*
98  * How to add/sub/load/store/shift C long variables.
99  */
100 #if (__SIZEOF_LONG__ == 4)
101 #define LONG_ADD        add.w
102 #define LONG_ADDI       addi.w
103 #define LONG_SUB        sub.w
104 #define LONG_L          ld.w
105 #define LONG_S          st.w
106 #define LONG_SLL        slli.w
107 #define LONG_SLLV       sll.w
108 #define LONG_SRL        srli.w
109 #define LONG_SRLV       srl.w
110 #define LONG_SRA        srai.w
111 #define LONG_SRAV       sra.w
112
113 #ifdef __ASSEMBLY__
114 #define LONG            .word
115 #endif
116 #define LONGSIZE        4
117 #define LONGMASK        3
118 #define LONGLOG         2
119 #endif
120
121 #if (__SIZEOF_LONG__ == 8)
122 #define LONG_ADD        add.d
123 #define LONG_ADDI       addi.d
124 #define LONG_SUB        sub.d
125 #define LONG_L          ld.d
126 #define LONG_S          st.d
127 #define LONG_SLL        slli.d
128 #define LONG_SLLV       sll.d
129 #define LONG_SRL        srli.d
130 #define LONG_SRLV       srl.d
131 #define LONG_SRA        srai.d
132 #define LONG_SRAV       sra.d
133
134 #ifdef __ASSEMBLY__
135 #define LONG            .dword
136 #endif
137 #define LONGSIZE        8
138 #define LONGMASK        7
139 #define LONGLOG         3
140 #endif
141
142 /*
143  * How to add/sub/load/store/shift pointers.
144  */
145 #if (__SIZEOF_POINTER__ == 4)
146 #define PTR_ADD         add.w
147 #define PTR_ADDI        addi.w
148 #define PTR_SUB         sub.w
149 #define PTR_L           ld.w
150 #define PTR_S           st.w
151 #define PTR_LI          li.w
152 #define PTR_SLL         slli.w
153 #define PTR_SLLV        sll.w
154 #define PTR_SRL         srli.w
155 #define PTR_SRLV        srl.w
156 #define PTR_SRA         srai.w
157 #define PTR_SRAV        sra.w
158
159 #define PTR_SCALESHIFT  2
160
161 #ifdef __ASSEMBLY__
162 #define PTR             .word
163 #endif
164 #define PTRSIZE         4
165 #define PTRLOG          2
166 #endif
167
168 #if (__SIZEOF_POINTER__ == 8)
169 #define PTR_ADD         add.d
170 #define PTR_ADDI        addi.d
171 #define PTR_SUB         sub.d
172 #define PTR_L           ld.d
173 #define PTR_S           st.d
174 #define PTR_LI          li.d
175 #define PTR_SLL         slli.d
176 #define PTR_SLLV        sll.d
177 #define PTR_SRL         srli.d
178 #define PTR_SRLV        srl.d
179 #define PTR_SRA         srai.d
180 #define PTR_SRAV        sra.d
181
182 #define PTR_SCALESHIFT  3
183
184 #ifdef __ASSEMBLY__
185 #define PTR             .dword
186 #endif
187 #define PTRSIZE         8
188 #define PTRLOG          3
189 #endif
190
191 /* Annotate a function as being unsuitable for kprobes. */
192 #ifdef CONFIG_KPROBES
193 #define _ASM_NOKPROBE(name)                             \
194         .pushsection "_kprobe_blacklist", "aw";         \
195         .quad   name;                                   \
196         .popsection
197 #else
198 #define _ASM_NOKPROBE(name)
199 #endif
200
201 #endif /* __ASM_ASM_H */