11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2abe38974SJens Wiklander /*
37706b33cSJens Wiklander * Copyright (c) 2016, Linaro Limited
4abe38974SJens Wiklander * Copyright (c) 2014, STMicroelectronics International N.V.
5abe38974SJens Wiklander */
6abe38974SJens Wiklander
7*d50fee03SEtienne Carriere #ifndef __ARM32_H
8*d50fee03SEtienne Carriere #define __ARM32_H
9abe38974SJens Wiklander
10faa22a1fSJerome Forissier #include <compiler.h>
11a681fabaSJerome Forissier #include <sys/cdefs.h>
12abe38974SJens Wiklander #include <stdint.h>
13007a97a2SJens Wiklander #include <util.h>
14abe38974SJens Wiklander
15abe38974SJens Wiklander #define CPSR_MODE_MASK ARM32_CPSR_MODE_MASK
16abe38974SJens Wiklander #define CPSR_MODE_USR ARM32_CPSR_MODE_USR
17abe38974SJens Wiklander #define CPSR_MODE_FIQ ARM32_CPSR_MODE_FIQ
18abe38974SJens Wiklander #define CPSR_MODE_IRQ ARM32_CPSR_MODE_IRQ
19abe38974SJens Wiklander #define CPSR_MODE_SVC ARM32_CPSR_MODE_SVC
20abe38974SJens Wiklander #define CPSR_MODE_MON ARM32_CPSR_MODE_MON
21abe38974SJens Wiklander #define CPSR_MODE_ABT ARM32_CPSR_MODE_ABT
22abe38974SJens Wiklander #define CPSR_MODE_UND ARM32_CPSR_MODE_UND
23abe38974SJens Wiklander #define CPSR_MODE_SYS ARM32_CPSR_MODE_SYS
24abe38974SJens Wiklander
25abe38974SJens Wiklander #define CPSR_T ARM32_CPSR_T
26abe38974SJens Wiklander #define CPSR_F_SHIFT ARM32_CPSR_F_SHIFT
27abe38974SJens Wiklander #define CPSR_F ARM32_CPSR_F
28abe38974SJens Wiklander #define CPSR_I ARM32_CPSR_I
29abe38974SJens Wiklander #define CPSR_A ARM32_CPSR_A
30abe38974SJens Wiklander #define CPSR_FIA ARM32_CPSR_FIA
31abe38974SJens Wiklander #define CPSR_IT_MASK ARM32_CPSR_IT_MASK
32abe38974SJens Wiklander #define CPSR_IT_MASK1 ARM32_CPSR_IT_MASK1
33abe38974SJens Wiklander #define CPSR_IT_MASK2 ARM32_CPSR_IT_MASK2
34abe38974SJens Wiklander
358267e19bSJerome Forissier #define PMCR_DP BIT32(5)
368267e19bSJerome Forissier
37007a97a2SJens Wiklander #define SCR_NS BIT32(0)
38007a97a2SJens Wiklander #define SCR_IRQ BIT32(1)
39007a97a2SJens Wiklander #define SCR_FIQ BIT32(2)
40007a97a2SJens Wiklander #define SCR_EA BIT32(3)
41007a97a2SJens Wiklander #define SCR_FW BIT32(4)
42007a97a2SJens Wiklander #define SCR_AW BIT32(5)
43007a97a2SJens Wiklander #define SCR_NET BIT32(6)
44007a97a2SJens Wiklander #define SCR_SCD BIT32(7)
45007a97a2SJens Wiklander #define SCR_HCE BIT32(8)
46007a97a2SJens Wiklander #define SCR_SIF BIT32(9)
47abe38974SJens Wiklander
48007a97a2SJens Wiklander #define SCTLR_M BIT32(0)
49007a97a2SJens Wiklander #define SCTLR_A BIT32(1)
50007a97a2SJens Wiklander #define SCTLR_C BIT32(2)
51007a97a2SJens Wiklander #define SCTLR_CP15BEN BIT32(5)
52007a97a2SJens Wiklander #define SCTLR_SW BIT32(10)
53007a97a2SJens Wiklander #define SCTLR_Z BIT32(11)
54007a97a2SJens Wiklander #define SCTLR_I BIT32(12)
55007a97a2SJens Wiklander #define SCTLR_V BIT32(13)
56007a97a2SJens Wiklander #define SCTLR_RR BIT32(14)
57007a97a2SJens Wiklander #define SCTLR_HA BIT32(17)
58007a97a2SJens Wiklander #define SCTLR_WXN BIT32(19)
59007a97a2SJens Wiklander #define SCTLR_UWXN BIT32(20)
60007a97a2SJens Wiklander #define SCTLR_FI BIT32(21)
615746bdefSJens Wiklander #define SCTLR_SPAN BIT32(23)
62007a97a2SJens Wiklander #define SCTLR_VE BIT32(24)
63007a97a2SJens Wiklander #define SCTLR_EE BIT32(25)
64e9f2e2abSVesa Jääskeläinen #define SCTLR_NMFI BIT32(27)
65007a97a2SJens Wiklander #define SCTLR_TRE BIT32(28)
66007a97a2SJens Wiklander #define SCTLR_AFE BIT32(29)
67007a97a2SJens Wiklander #define SCTLR_TE BIT32(30)
68abe38974SJens Wiklander
6902349cdbSJens Wiklander /* Only valid for Cortex-A15 */
7002349cdbSJens Wiklander #define ACTLR_CA15_ENABLE_INVALIDATE_BTB BIT(0)
71ae9208f1SJens Wiklander /* Only valid for Cortex-A8 */
72ae9208f1SJens Wiklander #define ACTLR_CA8_ENABLE_INVALIDATE_BTB BIT(6)
738d5160deSJordan Rhee /* Only valid for Cortex-A9 */
748d5160deSJordan Rhee #define ACTLR_CA9_WFLZ BIT(3)
7502349cdbSJens Wiklander
76007a97a2SJens Wiklander #define ACTLR_SMP BIT32(6)
77abe38974SJens Wiklander
78007a97a2SJens Wiklander #define NSACR_CP10 BIT32(10)
79007a97a2SJens Wiklander #define NSACR_CP11 BIT32(11)
80007a97a2SJens Wiklander #define NSACR_NSD32DIS BIT32(14)
81007a97a2SJens Wiklander #define NSACR_NSASEDIS BIT32(15)
82007a97a2SJens Wiklander #define NSACR_NS_L2ERR BIT32(17)
83007a97a2SJens Wiklander #define NSACR_NS_SMP BIT32(18)
84abe38974SJens Wiklander
85007a97a2SJens Wiklander #define CPACR_ASEDIS BIT32(31)
86007a97a2SJens Wiklander #define CPACR_D32DIS BIT32(30)
87007a97a2SJens Wiklander #define CPACR_CP(co_proc, access) SHIFT_U32((access), ((co_proc) * 2))
884a6784caSJens Wiklander #define CPACR_CP_ACCESS_DENIED U(0x0)
894a6784caSJens Wiklander #define CPACR_CP_ACCESS_PL1_ONLY U(0x1)
904a6784caSJens Wiklander #define CPACR_CP_ACCESS_FULL U(0x3)
91abe38974SJens Wiklander
92abe38974SJens Wiklander
93007a97a2SJens Wiklander #define DACR_DOMAIN(num, perm) SHIFT_U32((perm), ((num) * 2))
944a6784caSJens Wiklander #define DACR_DOMAIN_PERM_NO_ACCESS U(0x0)
954a6784caSJens Wiklander #define DACR_DOMAIN_PERM_CLIENT U(0x1)
964a6784caSJens Wiklander #define DACR_DOMAIN_PERM_MANAGER U(0x3)
97abe38974SJens Wiklander
98007a97a2SJens Wiklander #define PAR_F BIT32(0)
99007a97a2SJens Wiklander #define PAR_SS BIT32(1)
100007a97a2SJens Wiklander #define PAR_LPAE BIT32(11)
1014a6784caSJens Wiklander #define PAR_PA_SHIFT U(12)
102007a97a2SJens Wiklander #define PAR32_PA_MASK (BIT32(20) - 1)
103007a97a2SJens Wiklander #define PAR64_PA_MASK (BIT64(28) - 1)
1047706b33cSJens Wiklander
105abe38974SJens Wiklander /*
106abe38974SJens Wiklander * TTBCR has different register layout if LPAE is enabled or not.
107abe38974SJens Wiklander * TTBCR.EAE == 0 => LPAE is not enabled
108abe38974SJens Wiklander * TTBCR.EAE == 1 => LPAE is enabled
109abe38974SJens Wiklander */
110007a97a2SJens Wiklander #define TTBCR_EAE BIT32(31)
111abe38974SJens Wiklander
112abe38974SJens Wiklander /* When TTBCR.EAE == 0 */
113007a97a2SJens Wiklander #define TTBCR_PD0 BIT32(4)
114007a97a2SJens Wiklander #define TTBCR_PD1 BIT32(5)
115abe38974SJens Wiklander
116abe38974SJens Wiklander /* When TTBCR.EAE == 1 */
1174a6784caSJens Wiklander #define TTBCR_T0SZ_SHIFT U(0)
118007a97a2SJens Wiklander #define TTBCR_EPD0 BIT32(7)
1194a6784caSJens Wiklander #define TTBCR_IRGN0_SHIFT U(8)
1204a6784caSJens Wiklander #define TTBCR_ORGN0_SHIFT U(10)
1214a6784caSJens Wiklander #define TTBCR_SH0_SHIFT U(12)
1224a6784caSJens Wiklander #define TTBCR_T1SZ_SHIFT U(16)
123007a97a2SJens Wiklander #define TTBCR_A1 BIT32(22)
124007a97a2SJens Wiklander #define TTBCR_EPD1 BIT32(23)
1254a6784caSJens Wiklander #define TTBCR_IRGN1_SHIFT U(24)
1264a6784caSJens Wiklander #define TTBCR_ORGN1_SHIFT U(26)
1274a6784caSJens Wiklander #define TTBCR_SH1_SHIFT U(28)
128abe38974SJens Wiklander
129abe38974SJens Wiklander /* Normal memory, Inner/Outer Non-cacheable */
1304a6784caSJens Wiklander #define TTBCR_XRGNX_NC U(0x0)
131abe38974SJens Wiklander /* Normal memory, Inner/Outer Write-Back Write-Allocate Cacheable */
1324a6784caSJens Wiklander #define TTBCR_XRGNX_WB U(0x1)
133abe38974SJens Wiklander /* Normal memory, Inner/Outer Write-Through Cacheable */
1344a6784caSJens Wiklander #define TTBCR_XRGNX_WT U(0x2)
135abe38974SJens Wiklander /* Normal memory, Inner/Outer Write-Back no Write-Allocate Cacheable */
1364a6784caSJens Wiklander #define TTBCR_XRGNX_WBWA U(0x3)
137abe38974SJens Wiklander
138abe38974SJens Wiklander /* Non-shareable */
1394a6784caSJens Wiklander #define TTBCR_SHX_NSH U(0x0)
140abe38974SJens Wiklander /* Outer Shareable */
1414a6784caSJens Wiklander #define TTBCR_SHX_OSH U(0x2)
142abe38974SJens Wiklander /* Inner Shareable */
1434a6784caSJens Wiklander #define TTBCR_SHX_ISH U(0x3)
144abe38974SJens Wiklander
1454a6784caSJens Wiklander #define TTBR_ASID_MASK U(0xff)
1464a6784caSJens Wiklander #define TTBR_ASID_SHIFT U(48)
147abe38974SJens Wiklander
1484a6784caSJens Wiklander #define TLBI_MVA_SHIFT U(12)
1494a6784caSJens Wiklander #define TLBI_ASID_MASK U(0xff)
150abe38974SJens Wiklander
151007a97a2SJens Wiklander #define FSR_LPAE BIT32(9)
152007a97a2SJens Wiklander #define FSR_WNR BIT32(11)
153abe38974SJens Wiklander
154abe38974SJens Wiklander /* Valid if FSR.LPAE is 1 */
155007a97a2SJens Wiklander #define FSR_STATUS_MASK (BIT32(6) - 1)
156abe38974SJens Wiklander
157abe38974SJens Wiklander /* Valid if FSR.LPAE is 0 */
158007a97a2SJens Wiklander #define FSR_FS_MASK (BIT32(10) | (BIT32(4) - 1))
159abe38974SJens Wiklander
1605051b512SPeng Fan /* ID_PFR1 bit fields */
1614a6784caSJens Wiklander #define IDPFR1_VIRT_SHIFT U(12)
162135f53feSJens Wiklander #define IDPFR1_VIRT_MASK SHIFT_U32(0xF, IDPFR1_VIRT_SHIFT)
1634a6784caSJens Wiklander #define IDPFR1_GENTIMER_SHIFT U(16)
164135f53feSJens Wiklander #define IDPFR1_GENTIMER_MASK SHIFT_U32(0xF, IDPFR1_GENTIMER_SHIFT)
1655051b512SPeng Fan
166757331fcSJens Wiklander #ifndef __ASSEMBLER__
16718b58024SJens Wiklander #include <generated/arm32_sysreg.h>
168c3d0b15dSJens Wiklander #ifdef CFG_ARM_GICV3
169c3d0b15dSJens Wiklander #include <generated/arm32_gicv3_sysreg.h>
170c3d0b15dSJens Wiklander #endif
1719dc1c9edSEtienne Carriere
isb(void)172faa22a1fSJerome Forissier static inline __noprof void isb(void)
173abe38974SJens Wiklander {
17404b9df6cSJens Wiklander asm volatile ("isb" : : : "memory");
175abe38974SJens Wiklander }
176abe38974SJens Wiklander
dsb(void)177faa22a1fSJerome Forissier static inline __noprof void dsb(void)
178abe38974SJens Wiklander {
17904b9df6cSJens Wiklander asm volatile ("dsb" : : : "memory");
180abe38974SJens Wiklander }
181abe38974SJens Wiklander
dsb_ish(void)182faa22a1fSJerome Forissier static inline __noprof void dsb_ish(void)
183359f3d89SEtienne Carriere {
18404b9df6cSJens Wiklander asm volatile ("dsb ish" : : : "memory");
185359f3d89SEtienne Carriere }
186359f3d89SEtienne Carriere
dsb_ishst(void)187faa22a1fSJerome Forissier static inline __noprof void dsb_ishst(void)
188359f3d89SEtienne Carriere {
18904b9df6cSJens Wiklander asm volatile ("dsb ishst" : : : "memory");
190359f3d89SEtienne Carriere }
191359f3d89SEtienne Carriere
dmb(void)192faa22a1fSJerome Forissier static inline __noprof void dmb(void)
193cee96842Syanyan-wrs {
19404b9df6cSJens Wiklander asm volatile ("dmb" : : : "memory");
195cee96842Syanyan-wrs }
196cee96842Syanyan-wrs
sev(void)197faa22a1fSJerome Forissier static inline __noprof void sev(void)
198cee96842Syanyan-wrs {
19904b9df6cSJens Wiklander asm volatile ("sev" : : : "memory");
200cee96842Syanyan-wrs }
201cee96842Syanyan-wrs
wfe(void)202faa22a1fSJerome Forissier static inline __noprof void wfe(void)
203cee96842Syanyan-wrs {
20404b9df6cSJens Wiklander asm volatile ("wfe" : : : "memory");
205cee96842Syanyan-wrs }
206cee96842Syanyan-wrs
read_cpsr(void)207faa22a1fSJerome Forissier static inline __noprof uint32_t read_cpsr(void)
208abe38974SJens Wiklander {
209abe38974SJens Wiklander uint32_t cpsr;
210abe38974SJens Wiklander
211abe38974SJens Wiklander asm volatile ("mrs %[cpsr], cpsr"
212abe38974SJens Wiklander : [cpsr] "=r" (cpsr)
213abe38974SJens Wiklander );
214abe38974SJens Wiklander return cpsr;
215abe38974SJens Wiklander }
216abe38974SJens Wiklander
write_cpsr(uint32_t cpsr)217faa22a1fSJerome Forissier static inline __noprof void write_cpsr(uint32_t cpsr)
218abe38974SJens Wiklander {
219abe38974SJens Wiklander asm volatile ("msr cpsr_fsxc, %[cpsr]"
220abe38974SJens Wiklander : : [cpsr] "r" (cpsr)
221abe38974SJens Wiklander );
222abe38974SJens Wiklander }
223abe38974SJens Wiklander
read_spsr(void)224faa22a1fSJerome Forissier static inline __noprof uint32_t read_spsr(void)
225abe38974SJens Wiklander {
226abe38974SJens Wiklander uint32_t spsr;
227abe38974SJens Wiklander
228abe38974SJens Wiklander asm volatile ("mrs %[spsr], spsr"
229abe38974SJens Wiklander : [spsr] "=r" (spsr)
230abe38974SJens Wiklander );
231abe38974SJens Wiklander return spsr;
232abe38974SJens Wiklander }
233abe38974SJens Wiklander
wfi(void)234faa22a1fSJerome Forissier static inline __noprof void wfi(void)
235abe38974SJens Wiklander {
23604b9df6cSJens Wiklander asm volatile("wfi" : : : "memory");
2370c07a905SIgor Opaniuk }
2380c07a905SIgor Opaniuk
read_pc(void)239faa22a1fSJerome Forissier static __always_inline __noprof uint32_t read_pc(void)
240a681fabaSJerome Forissier {
241a681fabaSJerome Forissier uint32_t val;
242a681fabaSJerome Forissier
243a681fabaSJerome Forissier asm volatile ("adr %0, ." : "=r" (val));
244a681fabaSJerome Forissier return val;
245a681fabaSJerome Forissier }
246a681fabaSJerome Forissier
read_sp(void)247faa22a1fSJerome Forissier static __always_inline __noprof uint32_t read_sp(void)
248a681fabaSJerome Forissier {
249a681fabaSJerome Forissier uint32_t val;
250a681fabaSJerome Forissier
251a681fabaSJerome Forissier asm volatile ("mov %0, sp" : "=r" (val));
252a681fabaSJerome Forissier return val;
253a681fabaSJerome Forissier }
254a681fabaSJerome Forissier
read_lr(void)255faa22a1fSJerome Forissier static __always_inline __noprof uint32_t read_lr(void)
256a681fabaSJerome Forissier {
257a681fabaSJerome Forissier uint32_t val;
258a681fabaSJerome Forissier
259a681fabaSJerome Forissier asm volatile ("mov %0, lr" : "=r" (val));
260a681fabaSJerome Forissier return val;
261a681fabaSJerome Forissier }
26218e8c533SJerome Forissier
read_fp(void)263faa22a1fSJerome Forissier static __always_inline __noprof uint32_t read_fp(void)
26418e8c533SJerome Forissier {
26518e8c533SJerome Forissier uint32_t val;
26618e8c533SJerome Forissier
26718e8c533SJerome Forissier asm volatile ("mov %0, fp" : "=r" (val));
26818e8c533SJerome Forissier return val;
26918e8c533SJerome Forissier }
27018e8c533SJerome Forissier
read_r7(void)271faa22a1fSJerome Forissier static __always_inline __noprof uint32_t read_r7(void)
27218e8c533SJerome Forissier {
27318e8c533SJerome Forissier uint32_t val;
27418e8c533SJerome Forissier
27518e8c533SJerome Forissier asm volatile ("mov %0, r7" : "=r" (val));
27618e8c533SJerome Forissier return val;
27718e8c533SJerome Forissier }
27818901324SDavid Wang
279757331fcSJens Wiklander #endif /*__ASSEMBLER__*/
280abe38974SJens Wiklander
281*d50fee03SEtienne Carriere #endif /*__ARM32_H*/
282