xref: /utopia/UTPA2-700.0.x/modules/msos/hal/k6/msos/nuttx/risc32_spr.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #ifndef __RISC32_SPR_H__
2*53ee8cc1Swenshuai.xi #define __RISC32_SPR_H__
3*53ee8cc1Swenshuai.xi 
4*53ee8cc1Swenshuai.xi #if defined (__arm__)
5*53ee8cc1Swenshuai.xi #define set_cpsr(value) asm volatile ("msr cpsr, %0": :"r"(value))
6*53ee8cc1Swenshuai.xi #define get_cpsr() \
7*53ee8cc1Swenshuai.xi     ({  \
8*53ee8cc1Swenshuai.xi         unsigned long value; \
9*53ee8cc1Swenshuai.xi         asm volatile ("mrs\t\t%0,cpsr": "=r"(value) : ); \
10*53ee8cc1Swenshuai.xi         value; \
11*53ee8cc1Swenshuai.xi      })
12*53ee8cc1Swenshuai.xi #define mem_barrier(value) asm volatile ("mcr p15, 0, %0, c7, c10, 4": :"r"(value))
13*53ee8cc1Swenshuai.xi 
14*53ee8cc1Swenshuai.xi #elif defined (__mips__)
15*53ee8cc1Swenshuai.xi 
16*53ee8cc1Swenshuai.xi #define mtsr(value) asm volatile (" mtc0 %0, $12" : : "r" (value))
17*53ee8cc1Swenshuai.xi #define mfsr() \
18*53ee8cc1Swenshuai.xi     ({ \
19*53ee8cc1Swenshuai.xi         unsigned long value; \
20*53ee8cc1Swenshuai.xi         asm volatile ("mfc0\t\t%0,$12" : "=r" (value) : ); \
21*53ee8cc1Swenshuai.xi         value; \
22*53ee8cc1Swenshuai.xi     })
23*53ee8cc1Swenshuai.xi 
24*53ee8cc1Swenshuai.xi #define mtcause(value) asm volatile (" mtc0 %0, $13" : : "r" (value))
25*53ee8cc1Swenshuai.xi #define mfcause() \
26*53ee8cc1Swenshuai.xi     ({ \
27*53ee8cc1Swenshuai.xi         unsigned long value; \
28*53ee8cc1Swenshuai.xi         asm volatile ("mfc0\t\t%0,$13" : "=r" (value) : ); \
29*53ee8cc1Swenshuai.xi         value; \
30*53ee8cc1Swenshuai.xi     })
31*53ee8cc1Swenshuai.xi 
32*53ee8cc1Swenshuai.xi #define mtepc(value) asm volatile (" mtc0 %0, $14" : : "r" (value))
33*53ee8cc1Swenshuai.xi #define mfepc() \
34*53ee8cc1Swenshuai.xi     ({ \
35*53ee8cc1Swenshuai.xi         unsigned long value; \
36*53ee8cc1Swenshuai.xi         asm volatile ("mfc0\t\t%0,$14" : "=r" (value) : ); \
37*53ee8cc1Swenshuai.xi         value; \
38*53ee8cc1Swenshuai.xi     })
39*53ee8cc1Swenshuai.xi 
40*53ee8cc1Swenshuai.xi 
41*53ee8cc1Swenshuai.xi #else
42*53ee8cc1Swenshuai.xi /*
43*53ee8cc1Swenshuai.xi  * macros for SPR access
44*53ee8cc1Swenshuai.xi  *
45*53ee8cc1Swenshuai.xi  */
46*53ee8cc1Swenshuai.xi #define mtspr(spr, value) \
47*53ee8cc1Swenshuai.xi     __asm__ __volatile__ ("l.mtspr\t\t%0,%1,0" : : "r" (spr), "r" (value))
48*53ee8cc1Swenshuai.xi 
49*53ee8cc1Swenshuai.xi #define mfspr(spr) \
50*53ee8cc1Swenshuai.xi     ({ \
51*53ee8cc1Swenshuai.xi         unsigned long value; \
52*53ee8cc1Swenshuai.xi         __asm__ __volatile__ ("l.mfspr\t\t%0,%1,0" : "=r" (value) : "r" (spr) : "memory"); \
53*53ee8cc1Swenshuai.xi         value; \
54*53ee8cc1Swenshuai.xi     })
55*53ee8cc1Swenshuai.xi #endif
56*53ee8cc1Swenshuai.xi 
57*53ee8cc1Swenshuai.xi #define MAX_GRPS                (32)
58*53ee8cc1Swenshuai.xi #define MAX_SPRS_PER_GRP_BITS   (11)
59*53ee8cc1Swenshuai.xi #define MAX_SPRS_PER_GRP        (1 << MAX_SPRS_PER_GRP_BITS)
60*53ee8cc1Swenshuai.xi #define MAX_SPRS                (0x10000)
61*53ee8cc1Swenshuai.xi 
62*53ee8cc1Swenshuai.xi /* Base addresses for the groups */
63*53ee8cc1Swenshuai.xi #define SPRGROUP_SYS            (0 << MAX_SPRS_PER_GRP_BITS)
64*53ee8cc1Swenshuai.xi #define SPRGROUP_DMMU           (1 << MAX_SPRS_PER_GRP_BITS)
65*53ee8cc1Swenshuai.xi #define SPRGROUP_IMMU           (2 << MAX_SPRS_PER_GRP_BITS)
66*53ee8cc1Swenshuai.xi #define SPRGROUP_DC             (3 << MAX_SPRS_PER_GRP_BITS)
67*53ee8cc1Swenshuai.xi #define SPRGROUP_IC             (4 << MAX_SPRS_PER_GRP_BITS)
68*53ee8cc1Swenshuai.xi #define SPRGROUP_MAC            (5 << MAX_SPRS_PER_GRP_BITS)
69*53ee8cc1Swenshuai.xi #define SPRGROUP_D              (6 << MAX_SPRS_PER_GRP_BITS)
70*53ee8cc1Swenshuai.xi #define SPRGROUP_PC             (7 << MAX_SPRS_PER_GRP_BITS)
71*53ee8cc1Swenshuai.xi #define SPRGROUP_PM             (8 << MAX_SPRS_PER_GRP_BITS)
72*53ee8cc1Swenshuai.xi #define SPRGROUP_PIC            (9 << MAX_SPRS_PER_GRP_BITS)
73*53ee8cc1Swenshuai.xi #define SPRGROUP_TT             (10<< MAX_SPRS_PER_GRP_BITS)
74*53ee8cc1Swenshuai.xi 
75*53ee8cc1Swenshuai.xi /* System control and status group */
76*53ee8cc1Swenshuai.xi #define SPR_VR                  (SPRGROUP_SYS + 0)
77*53ee8cc1Swenshuai.xi #define SPR_UPR                 (SPRGROUP_SYS + 1)
78*53ee8cc1Swenshuai.xi #define SPR_CPUCFGR             (SPRGROUP_SYS + 2)
79*53ee8cc1Swenshuai.xi #define SPR_DMMUCFGR            (SPRGROUP_SYS + 3)
80*53ee8cc1Swenshuai.xi #define SPR_IMMUCFGR            (SPRGROUP_SYS + 4)
81*53ee8cc1Swenshuai.xi #define SPR_DCCFGR              (SPRGROUP_SYS + 5)
82*53ee8cc1Swenshuai.xi #define SPR_ICCFGR              (SPRGROUP_SYS + 6)
83*53ee8cc1Swenshuai.xi #define SPR_DCFGR               (SPRGROUP_SYS + 7)
84*53ee8cc1Swenshuai.xi #define SPR_PCCFGR              (SPRGROUP_SYS + 8)
85*53ee8cc1Swenshuai.xi #define SPR_NPC                 (SPRGROUP_SYS + 16)
86*53ee8cc1Swenshuai.xi #define SPR_SR                  (SPRGROUP_SYS + 17)
87*53ee8cc1Swenshuai.xi #define SPR_PPC                 (SPRGROUP_SYS + 18)
88*53ee8cc1Swenshuai.xi #define SPR_EPCR_BASE           (SPRGROUP_SYS + 32)
89*53ee8cc1Swenshuai.xi #define SPR_EPCR_LAST           (SPRGROUP_SYS + 47)
90*53ee8cc1Swenshuai.xi #define SPR_EEAR_BASE           (SPRGROUP_SYS + 48)
91*53ee8cc1Swenshuai.xi #define SPR_EEAR_LAST           (SPRGROUP_SYS + 63)
92*53ee8cc1Swenshuai.xi #define SPR_ESR_BASE            (SPRGROUP_SYS + 64)
93*53ee8cc1Swenshuai.xi #define SPR_ESR_LAST            (SPRGROUP_SYS + 79)
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi /* Data cache group */
96*53ee8cc1Swenshuai.xi #define SPR_DCCR                (SPRGROUP_DC + 0)
97*53ee8cc1Swenshuai.xi #define SPR_DCBPR               (SPRGROUP_DC + 1)
98*53ee8cc1Swenshuai.xi #define SPR_DCBFR               (SPRGROUP_DC + 2)
99*53ee8cc1Swenshuai.xi #define SPR_DCBIR               (SPRGROUP_DC + 3)
100*53ee8cc1Swenshuai.xi #define SPR_DCBWR               (SPRGROUP_DC + 4)
101*53ee8cc1Swenshuai.xi #define SPR_DCBLR               (SPRGROUP_DC + 5)
102*53ee8cc1Swenshuai.xi #define SPR_DCR_BASE(WAY)       (SPRGROUP_DC + 0x200 + (WAY) * 0x200)
103*53ee8cc1Swenshuai.xi #define SPR_DCR_LAST(WAY)       (SPRGROUP_DC + 0x3ff + (WAY) * 0x200)
104*53ee8cc1Swenshuai.xi 
105*53ee8cc1Swenshuai.xi /* Instruction cache group */
106*53ee8cc1Swenshuai.xi #define SPR_ICCR                (SPRGROUP_IC + 0)
107*53ee8cc1Swenshuai.xi #define SPR_ICBPR               (SPRGROUP_IC + 1)
108*53ee8cc1Swenshuai.xi #define SPR_ICBIR               (SPRGROUP_IC + 2)
109*53ee8cc1Swenshuai.xi #define SPR_ICBLR               (SPRGROUP_IC + 3)
110*53ee8cc1Swenshuai.xi #define SPR_ICR_BASE(WAY)       (SPRGROUP_IC + 0x200 + (WAY) * 0x200)
111*53ee8cc1Swenshuai.xi #define SPR_ICR_LAST(WAY)       (SPRGROUP_IC + 0x3ff + (WAY) * 0x200)
112*53ee8cc1Swenshuai.xi 
113*53ee8cc1Swenshuai.xi /* MAC group */
114*53ee8cc1Swenshuai.xi #define SPR_MACLO               (SPRGROUP_MAC + 1)
115*53ee8cc1Swenshuai.xi #define SPR_MACHI               (SPRGROUP_MAC + 2)
116*53ee8cc1Swenshuai.xi #define SPR_MACHI2              (SPRGROUP_MAC + 3)
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi /* PIC group */
119*53ee8cc1Swenshuai.xi #define SPR_PICMR               (SPRGROUP_PIC + 0)
120*53ee8cc1Swenshuai.xi #define SPR_PICPR               (SPRGROUP_PIC + 1)
121*53ee8cc1Swenshuai.xi #define SPR_PICSR               (SPRGROUP_PIC + 2)
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi /* Tick Timer group */
124*53ee8cc1Swenshuai.xi #define SPR_TTMR                (SPRGROUP_TT + 0)
125*53ee8cc1Swenshuai.xi #define SPR_TTCR                (SPRGROUP_TT + 1)
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi /*
128*53ee8cc1Swenshuai.xi  * Bit definitions for the Supervision Register
129*53ee8cc1Swenshuai.xi  *
130*53ee8cc1Swenshuai.xi  */
131*53ee8cc1Swenshuai.xi #define SPR_SR_CID      0xf0000000  /* Context ID */
132*53ee8cc1Swenshuai.xi #define SPR_SR_SUMRA    0x00010000  /* Supervisor SPR read access */
133*53ee8cc1Swenshuai.xi #define SPR_SR_FO       0x00008000  /* Fixed one */
134*53ee8cc1Swenshuai.xi #define SPR_SR_EPH      0x00004000  /* Exception Prefix High */
135*53ee8cc1Swenshuai.xi #define SPR_SR_DSX      0x00002000  /* Delay Slot Exception */
136*53ee8cc1Swenshuai.xi #if 1//M10/M12 R2
137*53ee8cc1Swenshuai.xi #define SPR_SR_TDE      0x00001000  /* Trap Disable Exception */
138*53ee8cc1Swenshuai.xi #else
139*53ee8cc1Swenshuai.xi #define SPR_SR_OVE      0x00001000  /* Overflow flag Exception */
140*53ee8cc1Swenshuai.xi #endif
141*53ee8cc1Swenshuai.xi #define SPR_SR_OV       0x00000800  /* Overflow flag */
142*53ee8cc1Swenshuai.xi #define SPR_SR_CY       0x00000400  /* Carry flag */
143*53ee8cc1Swenshuai.xi #define SPR_SR_F        0x00000200  /* Condition Flag */
144*53ee8cc1Swenshuai.xi #define SPR_SR_CE       0x00000100  /* CID Enable */
145*53ee8cc1Swenshuai.xi #define SPR_SR_LEE      0x00000080  /* Little Endian Enable */
146*53ee8cc1Swenshuai.xi #define SPR_SR_IME      0x00000040  /* Instruction MMU Enable */
147*53ee8cc1Swenshuai.xi #define SPR_SR_DME      0x00000020  /* Data MMU Enable */
148*53ee8cc1Swenshuai.xi #define SPR_SR_ICE      0x00000010  /* Instruction Cache Enable */
149*53ee8cc1Swenshuai.xi #define SPR_SR_DCE      0x00000008  /* Data Cache Enable */
150*53ee8cc1Swenshuai.xi #define SPR_SR_IEE      0x00000004  /* Interrupt Exception Enable */
151*53ee8cc1Swenshuai.xi #define SPR_SR_TEE      0x00000002  /* Tick timer Exception Enable */
152*53ee8cc1Swenshuai.xi #define SPR_SR_SM       0x00000001  /* Supervisor Mode */
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi /*
155*53ee8cc1Swenshuai.xi  * Bit definitions for Data Cache Control register
156*53ee8cc1Swenshuai.xi  *
157*53ee8cc1Swenshuai.xi  */
158*53ee8cc1Swenshuai.xi #define SPR_DCCR_EW 0x000000ff  /* Enable ways */
159*53ee8cc1Swenshuai.xi 
160*53ee8cc1Swenshuai.xi /*
161*53ee8cc1Swenshuai.xi  * Bit definitions for Insn Cache Control register
162*53ee8cc1Swenshuai.xi  *
163*53ee8cc1Swenshuai.xi  */
164*53ee8cc1Swenshuai.xi #define SPR_ICCR_EW 0x000000ff  /* Enable ways */
165*53ee8cc1Swenshuai.xi 
166*53ee8cc1Swenshuai.xi /*
167*53ee8cc1Swenshuai.xi  * Bit definitions for PICMR
168*53ee8cc1Swenshuai.xi  *
169*53ee8cc1Swenshuai.xi  */
170*53ee8cc1Swenshuai.xi #define SPR_PICMR_IUM   0xfffffffc  /* Interrupt unmask */
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi /*
173*53ee8cc1Swenshuai.xi  * Bit definitions for PICPR
174*53ee8cc1Swenshuai.xi  *
175*53ee8cc1Swenshuai.xi  */
176*53ee8cc1Swenshuai.xi #define SPR_PICPR_IPRIO 0xfffffffc  /* Interrupt priority */
177*53ee8cc1Swenshuai.xi 
178*53ee8cc1Swenshuai.xi /*
179*53ee8cc1Swenshuai.xi  * Bit definitions for PICSR
180*53ee8cc1Swenshuai.xi  *
181*53ee8cc1Swenshuai.xi  */
182*53ee8cc1Swenshuai.xi #define SPR_PICSR_IS    0xffffffff  /* Interrupt status */
183*53ee8cc1Swenshuai.xi 
184*53ee8cc1Swenshuai.xi /*
185*53ee8cc1Swenshuai.xi  * Bit definitions for Tick Timer Control Register
186*53ee8cc1Swenshuai.xi  *
187*53ee8cc1Swenshuai.xi  */
188*53ee8cc1Swenshuai.xi #define SPR_TTCR_PERIOD 0x0fffffff  /* Time Period */
189*53ee8cc1Swenshuai.xi #define SPR_TTMR_PERIOD SPR_TTCR_PERIOD
190*53ee8cc1Swenshuai.xi #define SPR_TTMR_IP     0x10000000  /* Interrupt Pending */
191*53ee8cc1Swenshuai.xi #define SPR_TTMR_IE     0x20000000  /* Interrupt Enable */
192*53ee8cc1Swenshuai.xi #define SPR_TTMR_RT     0x40000000  /* Restart tick */
193*53ee8cc1Swenshuai.xi #define SPR_TTMR_SR     0x80000000  /* Single run */
194*53ee8cc1Swenshuai.xi #define SPR_TTMR_CR     0xc0000000  /* Continuous run */
195*53ee8cc1Swenshuai.xi #define SPR_TTMR_M      0xc0000000  /* Tick mode */
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi #endif /* __RISC32_SPR_H__ */
198