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