1 /*
2  * Copyright (c) 2015, Wind River Systems, Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef _CORTEX_M_CPU_H
8 #define _CORTEX_M_CPU_H
9 
10 #ifdef _ASMLANGUAGE
11 
12 #define _SCS_BASE_ADDR _PPB_INT_SCS
13 
14 /* ICSR defines */
15 #define _SCS_ICSR (_SCS_BASE_ADDR + 0xd04)
16 #define _SCS_ICSR_PENDSV (1 << 28)
17 #define _SCS_ICSR_UNPENDSV (1 << 27)
18 #define _SCS_ICSR_RETTOBASE (1 << 11)
19 
20 #define _SCS_MPU_CTRL (_SCS_BASE_ADDR + 0xd94)
21 
22 /* CONTROL defines */
23 #define _CONTROL_FPCA_Msk (1 << 2)
24 
25 /* EXC_RETURN defines */
26 #define _EXC_RETURN_SPSEL_Msk (1 << 2)
27 #define _EXC_RETURN_FTYPE_Msk (1 << 4)
28 
29 #else
30 #include <stdint.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 /* CP10 Access Bits */
37 #define CPACR_CP10_Pos          20U
38 #define CPACR_CP10_Msk          (3UL << CPACR_CP10_Pos)
39 #define CPACR_CP10_NO_ACCESS    (0UL << CPACR_CP10_Pos)
40 #define CPACR_CP10_PRIV_ACCESS  (1UL << CPACR_CP10_Pos)
41 #define CPACR_CP10_RESERVED     (2UL << CPACR_CP10_Pos)
42 #define CPACR_CP10_FULL_ACCESS  (3UL << CPACR_CP10_Pos)
43 
44 /* CP11 Access Bits */
45 #define CPACR_CP11_Pos          22U
46 #define CPACR_CP11_Msk          (3UL << CPACR_CP11_Pos)
47 #define CPACR_CP11_NO_ACCESS    (0UL << CPACR_CP11_Pos)
48 #define CPACR_CP11_PRIV_ACCESS  (1UL << CPACR_CP11_Pos)
49 #define CPACR_CP11_RESERVED     (2UL << CPACR_CP11_Pos)
50 #define CPACR_CP11_FULL_ACCESS  (3UL << CPACR_CP11_Pos)
51 
52 #ifdef CONFIG_PM_S2RAM
53 
54 struct __cpu_context {
55 	/* GPRs are saved onto the stack */
56 	uint32_t msp;
57 	uint32_t psp;
58 	uint32_t primask;
59 	uint32_t control;
60 
61 #if defined(CONFIG_ARMV7_M_ARMV8_M_MAINLINE)
62 	/* Registers present only on ARMv7-M and ARMv8-M Mainline */
63 	uint32_t faultmask;
64 	uint32_t basepri;
65 #endif /* CONFIG_ARMV7_M_ARMV8_M_MAINLINE */
66 
67 #if defined(CONFIG_CPU_CORTEX_M_HAS_SPLIM)
68 	/* Registers present only on certain ARMv8-M implementations */
69 	uint32_t msplim;
70 	uint32_t psplim;
71 #endif /* CONFIG_CPU_CORTEX_M_HAS_SPLIM */
72 };
73 
74 typedef struct __cpu_context _cpu_context_t;
75 
76 #endif /* CONFIG_PM_S2RAM */
77 
78 #ifdef __cplusplus
79 }
80 #endif
81 
82 #endif /* _ASMLANGUAGE */
83 
84 #endif /* _CORTEX_M_CPU_H */
85