csr.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2015 Regents of the University of California
  4. */
  5. #ifndef _ASM_RISCV_CSR_H
  6. #define _ASM_RISCV_CSR_H
  7. #include <linux/bits.h>
  8. /* Status register flags */
  9. #define SR_SIE _AC(0x00000002, UL) /* Supervisor Interrupt Enable */
  10. #define SR_MIE _AC(0x00000008, UL) /* Machine Interrupt Enable */
  11. #define SR_SPIE _AC(0x00000020, UL) /* Previous Supervisor IE */
  12. #define SR_MPIE _AC(0x00000080, UL) /* Previous Machine IE */
  13. #define SR_SPP _AC(0x00000100, UL) /* Previously Supervisor */
  14. #define SR_MPP _AC(0x00001800, UL) /* Previously Machine */
  15. #define SR_SUM _AC(0x00040000, UL) /* Supervisor User Memory Access */
  16. #define SR_FS _AC(0x00006000, UL) /* Floating-point Status */
  17. #define SR_FS_OFF _AC(0x00000000, UL)
  18. #define SR_FS_INITIAL _AC(0x00002000, UL)
  19. #define SR_FS_CLEAN _AC(0x00004000, UL)
  20. #define SR_FS_DIRTY _AC(0x00006000, UL)
  21. #define SR_VS _AC(0x00000600, UL) /* Vector Status */
  22. #define SR_VS_OFF _AC(0x00000000, UL)
  23. #define SR_VS_INITIAL _AC(0x00000200, UL)
  24. #define SR_VS_CLEAN _AC(0x00000400, UL)
  25. #define SR_VS_DIRTY _AC(0x00000600, UL)
  26. #define SR_XS _AC(0x00018000, UL) /* Extension Status */
  27. #define SR_XS_OFF _AC(0x00000000, UL)
  28. #define SR_XS_INITIAL _AC(0x00008000, UL)
  29. #define SR_XS_CLEAN _AC(0x00010000, UL)
  30. #define SR_XS_DIRTY _AC(0x00018000, UL)
  31. #define SR_FS_VS (SR_FS | SR_VS) /* Vector and Floating-Point Unit */
  32. #ifndef CONFIG_64BIT
  33. #define SR_SD _AC(0x80000000, UL) /* FS/VS/XS dirty */
  34. #else
  35. #define SR_SD _AC(0x8000000000000000, UL) /* FS/VS/XS dirty */
  36. #endif
  37. #ifdef CONFIG_64BIT
  38. #define SR_UXL _AC(0x300000000, UL) /* XLEN mask for U-mode */
  39. #define SR_UXL_32 _AC(0x100000000, UL) /* XLEN = 32 for U-mode */
  40. #define SR_UXL_64 _AC(0x200000000, UL) /* XLEN = 64 for U-mode */
  41. #endif
  42. /* SATP flags */
  43. #ifndef CONFIG_64BIT
  44. #define SATP_PPN _AC(0x003FFFFF, UL)
  45. #define SATP_MODE_32 _AC(0x80000000, UL)
  46. #define SATP_MODE_SHIFT 31
  47. #define SATP_ASID_BITS 9
  48. #define SATP_ASID_SHIFT 22
  49. #define SATP_ASID_MASK _AC(0x1FF, UL)
  50. #else
  51. #define SATP_PPN _AC(0x00000FFFFFFFFFFF, UL)
  52. #define SATP_MODE_39 _AC(0x8000000000000000, UL)
  53. #define SATP_MODE_48 _AC(0x9000000000000000, UL)
  54. #define SATP_MODE_57 _AC(0xa000000000000000, UL)
  55. #define SATP_MODE_SHIFT 60
  56. #define SATP_ASID_BITS 16
  57. #define SATP_ASID_SHIFT 44
  58. #define SATP_ASID_MASK _AC(0xFFFF, UL)
  59. #endif
  60. /* Exception cause high bit - is an interrupt if set */
  61. #define CAUSE_IRQ_FLAG (_AC(1, UL) << (__riscv_xlen - 1))
  62. /* Interrupt causes (minus the high bit) */
  63. #define IRQ_S_SOFT 1
  64. #define IRQ_VS_SOFT 2
  65. #define IRQ_M_SOFT 3
  66. #define IRQ_S_TIMER 5
  67. #define IRQ_VS_TIMER 6
  68. #define IRQ_M_TIMER 7
  69. #define IRQ_S_EXT 9
  70. #define IRQ_VS_EXT 10
  71. #define IRQ_M_EXT 11
  72. #define IRQ_S_GEXT 12
  73. #define IRQ_PMU_OVF 13
  74. #define IRQ_LOCAL_MAX (IRQ_PMU_OVF + 1)
  75. #define IRQ_LOCAL_MASK GENMASK((IRQ_LOCAL_MAX - 1), 0)
  76. /* Exception causes */
  77. #define EXC_INST_MISALIGNED 0
  78. #define EXC_INST_ACCESS 1
  79. #define EXC_INST_ILLEGAL 2
  80. #define EXC_BREAKPOINT 3
  81. #define EXC_LOAD_MISALIGNED 4
  82. #define EXC_LOAD_ACCESS 5
  83. #define EXC_STORE_MISALIGNED 6
  84. #define EXC_STORE_ACCESS 7
  85. #define EXC_SYSCALL 8
  86. #define EXC_HYPERVISOR_SYSCALL 9
  87. #define EXC_SUPERVISOR_SYSCALL 10
  88. #define EXC_INST_PAGE_FAULT 12
  89. #define EXC_LOAD_PAGE_FAULT 13
  90. #define EXC_STORE_PAGE_FAULT 15
  91. #define EXC_INST_GUEST_PAGE_FAULT 20
  92. #define EXC_LOAD_GUEST_PAGE_FAULT 21
  93. #define EXC_VIRTUAL_INST_FAULT 22
  94. #define EXC_STORE_GUEST_PAGE_FAULT 23
  95. /* PMP configuration */
  96. #define PMP_R 0x01
  97. #define PMP_W 0x02
  98. #define PMP_X 0x04
  99. #define PMP_A 0x18
  100. #define PMP_A_TOR 0x08
  101. #define PMP_A_NA4 0x10
  102. #define PMP_A_NAPOT 0x18
  103. #define PMP_L 0x80
  104. /* HSTATUS flags */
  105. #ifdef CONFIG_64BIT
  106. #define HSTATUS_VSXL _AC(0x300000000, UL)
  107. #define HSTATUS_VSXL_SHIFT 32
  108. #endif
  109. #define HSTATUS_VTSR _AC(0x00400000, UL)
  110. #define HSTATUS_VTW _AC(0x00200000, UL)
  111. #define HSTATUS_VTVM _AC(0x00100000, UL)
  112. #define HSTATUS_VGEIN _AC(0x0003f000, UL)
  113. #define HSTATUS_VGEIN_SHIFT 12
  114. #define HSTATUS_HU _AC(0x00000200, UL)
  115. #define HSTATUS_SPVP _AC(0x00000100, UL)
  116. #define HSTATUS_SPV _AC(0x00000080, UL)
  117. #define HSTATUS_GVA _AC(0x00000040, UL)
  118. #define HSTATUS_VSBE _AC(0x00000020, UL)
  119. /* HGATP flags */
  120. #define HGATP_MODE_OFF _AC(0, UL)
  121. #define HGATP_MODE_SV32X4 _AC(1, UL)
  122. #define HGATP_MODE_SV39X4 _AC(8, UL)
  123. #define HGATP_MODE_SV48X4 _AC(9, UL)
  124. #define HGATP_MODE_SV57X4 _AC(10, UL)
  125. #define HGATP32_MODE_SHIFT 31
  126. #define HGATP32_VMID_SHIFT 22
  127. #define HGATP32_VMID GENMASK(28, 22)
  128. #define HGATP32_PPN GENMASK(21, 0)
  129. #define HGATP64_MODE_SHIFT 60
  130. #define HGATP64_VMID_SHIFT 44
  131. #define HGATP64_VMID GENMASK(57, 44)
  132. #define HGATP64_PPN GENMASK(43, 0)
  133. #define HGATP_PAGE_SHIFT 12
  134. #ifdef CONFIG_64BIT
  135. #define HGATP_PPN HGATP64_PPN
  136. #define HGATP_VMID_SHIFT HGATP64_VMID_SHIFT
  137. #define HGATP_VMID HGATP64_VMID
  138. #define HGATP_MODE_SHIFT HGATP64_MODE_SHIFT
  139. #else
  140. #define HGATP_PPN HGATP32_PPN
  141. #define HGATP_VMID_SHIFT HGATP32_VMID_SHIFT
  142. #define HGATP_VMID HGATP32_VMID
  143. #define HGATP_MODE_SHIFT HGATP32_MODE_SHIFT
  144. #endif
  145. /* VSIP & HVIP relation */
  146. #define VSIP_TO_HVIP_SHIFT (IRQ_VS_SOFT - IRQ_S_SOFT)
  147. #define VSIP_VALID_MASK ((_AC(1, UL) << IRQ_S_SOFT) | \
  148. (_AC(1, UL) << IRQ_S_TIMER) | \
  149. (_AC(1, UL) << IRQ_S_EXT) | \
  150. (_AC(1, UL) << IRQ_PMU_OVF))
  151. /* AIA CSR bits */
  152. #define TOPI_IID_SHIFT 16
  153. #define TOPI_IID_MASK GENMASK(11, 0)
  154. #define TOPI_IPRIO_MASK GENMASK(7, 0)
  155. #define TOPI_IPRIO_BITS 8
  156. #define TOPEI_ID_SHIFT 16
  157. #define TOPEI_ID_MASK GENMASK(10, 0)
  158. #define TOPEI_PRIO_MASK GENMASK(10, 0)
  159. #define ISELECT_IPRIO0 0x30
  160. #define ISELECT_IPRIO15 0x3f
  161. #define ISELECT_MASK GENMASK(8, 0)
  162. #define HVICTL_VTI BIT(30)
  163. #define HVICTL_IID GENMASK(27, 16)
  164. #define HVICTL_IID_SHIFT 16
  165. #define HVICTL_DPR BIT(9)
  166. #define HVICTL_IPRIOM BIT(8)
  167. #define HVICTL_IPRIO GENMASK(7, 0)
  168. /* xENVCFG flags */
  169. #define ENVCFG_STCE (_AC(1, ULL) << 63)
  170. #define ENVCFG_PBMTE (_AC(1, ULL) << 62)
  171. #define ENVCFG_CBZE (_AC(1, UL) << 7)
  172. #define ENVCFG_CBCFE (_AC(1, UL) << 6)
  173. #define ENVCFG_CBIE_SHIFT 4
  174. #define ENVCFG_CBIE (_AC(0x3, UL) << ENVCFG_CBIE_SHIFT)
  175. #define ENVCFG_CBIE_ILL _AC(0x0, UL)
  176. #define ENVCFG_CBIE_FLUSH _AC(0x1, UL)
  177. #define ENVCFG_CBIE_INV _AC(0x3, UL)
  178. #define ENVCFG_FIOM _AC(0x1, UL)
  179. /* Smstateen bits */
  180. #define SMSTATEEN0_AIA_IMSIC_SHIFT 58
  181. #define SMSTATEEN0_AIA_IMSIC (_ULL(1) << SMSTATEEN0_AIA_IMSIC_SHIFT)
  182. #define SMSTATEEN0_AIA_SHIFT 59
  183. #define SMSTATEEN0_AIA (_ULL(1) << SMSTATEEN0_AIA_SHIFT)
  184. #define SMSTATEEN0_AIA_ISEL_SHIFT 60
  185. #define SMSTATEEN0_AIA_ISEL (_ULL(1) << SMSTATEEN0_AIA_ISEL_SHIFT)
  186. #define SMSTATEEN0_HSENVCFG_SHIFT 62
  187. #define SMSTATEEN0_HSENVCFG (_ULL(1) << SMSTATEEN0_HSENVCFG_SHIFT)
  188. #define SMSTATEEN0_SSTATEEN0_SHIFT 63
  189. #define SMSTATEEN0_SSTATEEN0 (_ULL(1) << SMSTATEEN0_SSTATEEN0_SHIFT)
  190. /* symbolic CSR names: */
  191. #define CSR_CYCLE 0xc00
  192. #define CSR_TIME 0xc01
  193. #define CSR_INSTRET 0xc02
  194. #define CSR_HPMCOUNTER3 0xc03
  195. #define CSR_HPMCOUNTER4 0xc04
  196. #define CSR_HPMCOUNTER5 0xc05
  197. #define CSR_HPMCOUNTER6 0xc06
  198. #define CSR_HPMCOUNTER7 0xc07
  199. #define CSR_HPMCOUNTER8 0xc08
  200. #define CSR_HPMCOUNTER9 0xc09
  201. #define CSR_HPMCOUNTER10 0xc0a
  202. #define CSR_HPMCOUNTER11 0xc0b
  203. #define CSR_HPMCOUNTER12 0xc0c
  204. #define CSR_HPMCOUNTER13 0xc0d
  205. #define CSR_HPMCOUNTER14 0xc0e
  206. #define CSR_HPMCOUNTER15 0xc0f
  207. #define CSR_HPMCOUNTER16 0xc10
  208. #define CSR_HPMCOUNTER17 0xc11
  209. #define CSR_HPMCOUNTER18 0xc12
  210. #define CSR_HPMCOUNTER19 0xc13
  211. #define CSR_HPMCOUNTER20 0xc14
  212. #define CSR_HPMCOUNTER21 0xc15
  213. #define CSR_HPMCOUNTER22 0xc16
  214. #define CSR_HPMCOUNTER23 0xc17
  215. #define CSR_HPMCOUNTER24 0xc18
  216. #define CSR_HPMCOUNTER25 0xc19
  217. #define CSR_HPMCOUNTER26 0xc1a
  218. #define CSR_HPMCOUNTER27 0xc1b
  219. #define CSR_HPMCOUNTER28 0xc1c
  220. #define CSR_HPMCOUNTER29 0xc1d
  221. #define CSR_HPMCOUNTER30 0xc1e
  222. #define CSR_HPMCOUNTER31 0xc1f
  223. #define CSR_CYCLEH 0xc80
  224. #define CSR_TIMEH 0xc81
  225. #define CSR_INSTRETH 0xc82
  226. #define CSR_HPMCOUNTER3H 0xc83
  227. #define CSR_HPMCOUNTER4H 0xc84
  228. #define CSR_HPMCOUNTER5H 0xc85
  229. #define CSR_HPMCOUNTER6H 0xc86
  230. #define CSR_HPMCOUNTER7H 0xc87
  231. #define CSR_HPMCOUNTER8H 0xc88
  232. #define CSR_HPMCOUNTER9H 0xc89
  233. #define CSR_HPMCOUNTER10H 0xc8a
  234. #define CSR_HPMCOUNTER11H 0xc8b
  235. #define CSR_HPMCOUNTER12H 0xc8c
  236. #define CSR_HPMCOUNTER13H 0xc8d
  237. #define CSR_HPMCOUNTER14H 0xc8e
  238. #define CSR_HPMCOUNTER15H 0xc8f
  239. #define CSR_HPMCOUNTER16H 0xc90
  240. #define CSR_HPMCOUNTER17H 0xc91
  241. #define CSR_HPMCOUNTER18H 0xc92
  242. #define CSR_HPMCOUNTER19H 0xc93
  243. #define CSR_HPMCOUNTER20H 0xc94
  244. #define CSR_HPMCOUNTER21H 0xc95
  245. #define CSR_HPMCOUNTER22H 0xc96
  246. #define CSR_HPMCOUNTER23H 0xc97
  247. #define CSR_HPMCOUNTER24H 0xc98
  248. #define CSR_HPMCOUNTER25H 0xc99
  249. #define CSR_HPMCOUNTER26H 0xc9a
  250. #define CSR_HPMCOUNTER27H 0xc9b
  251. #define CSR_HPMCOUNTER28H 0xc9c
  252. #define CSR_HPMCOUNTER29H 0xc9d
  253. #define CSR_HPMCOUNTER30H 0xc9e
  254. #define CSR_HPMCOUNTER31H 0xc9f
  255. #define CSR_SCOUNTOVF 0xda0
  256. #define CSR_SSTATUS 0x100
  257. #define CSR_SIE 0x104
  258. #define CSR_STVEC 0x105
  259. #define CSR_SCOUNTEREN 0x106
  260. #define CSR_SENVCFG 0x10a
  261. #define CSR_SSTATEEN0 0x10c
  262. #define CSR_SSCRATCH 0x140
  263. #define CSR_SEPC 0x141
  264. #define CSR_SCAUSE 0x142
  265. #define CSR_STVAL 0x143
  266. #define CSR_SIP 0x144
  267. #define CSR_SATP 0x180
  268. #define CSR_STIMECMP 0x14D
  269. #define CSR_STIMECMPH 0x15D
  270. /* Supervisor-Level Window to Indirectly Accessed Registers (AIA) */
  271. #define CSR_SISELECT 0x150
  272. #define CSR_SIREG 0x151
  273. /* Supervisor-Level Interrupts (AIA) */
  274. #define CSR_STOPEI 0x15c
  275. #define CSR_STOPI 0xdb0
  276. /* Supervisor-Level High-Half CSRs (AIA) */
  277. #define CSR_SIEH 0x114
  278. #define CSR_SIPH 0x154
  279. #define CSR_VSSTATUS 0x200
  280. #define CSR_VSIE 0x204
  281. #define CSR_VSTVEC 0x205
  282. #define CSR_VSSCRATCH 0x240
  283. #define CSR_VSEPC 0x241
  284. #define CSR_VSCAUSE 0x242
  285. #define CSR_VSTVAL 0x243
  286. #define CSR_VSIP 0x244
  287. #define CSR_VSATP 0x280
  288. #define CSR_VSTIMECMP 0x24D
  289. #define CSR_VSTIMECMPH 0x25D
  290. #define CSR_HSTATUS 0x600
  291. #define CSR_HEDELEG 0x602
  292. #define CSR_HIDELEG 0x603
  293. #define CSR_HIE 0x604
  294. #define CSR_HTIMEDELTA 0x605
  295. #define CSR_HCOUNTEREN 0x606
  296. #define CSR_HGEIE 0x607
  297. #define CSR_HENVCFG 0x60a
  298. #define CSR_HTIMEDELTAH 0x615
  299. #define CSR_HENVCFGH 0x61a
  300. #define CSR_HTVAL 0x643
  301. #define CSR_HIP 0x644
  302. #define CSR_HVIP 0x645
  303. #define CSR_HTINST 0x64a
  304. #define CSR_HGATP 0x680
  305. #define CSR_HGEIP 0xe12
  306. /* Virtual Interrupts and Interrupt Priorities (H-extension with AIA) */
  307. #define CSR_HVIEN 0x608
  308. #define CSR_HVICTL 0x609
  309. #define CSR_HVIPRIO1 0x646
  310. #define CSR_HVIPRIO2 0x647
  311. /* VS-Level Window to Indirectly Accessed Registers (H-extension with AIA) */
  312. #define CSR_VSISELECT 0x250
  313. #define CSR_VSIREG 0x251
  314. /* VS-Level Interrupts (H-extension with AIA) */
  315. #define CSR_VSTOPEI 0x25c
  316. #define CSR_VSTOPI 0xeb0
  317. /* Hypervisor and VS-Level High-Half CSRs (H-extension with AIA) */
  318. #define CSR_HIDELEGH 0x613
  319. #define CSR_HVIENH 0x618
  320. #define CSR_HVIPH 0x655
  321. #define CSR_HVIPRIO1H 0x656
  322. #define CSR_HVIPRIO2H 0x657
  323. #define CSR_VSIEH 0x214
  324. #define CSR_VSIPH 0x254
  325. /* Hypervisor stateen CSRs */
  326. #define CSR_HSTATEEN0 0x60c
  327. #define CSR_HSTATEEN0H 0x61c
  328. #define CSR_MSTATUS 0x300
  329. #define CSR_MISA 0x301
  330. #define CSR_MIDELEG 0x303
  331. #define CSR_MIE 0x304
  332. #define CSR_MTVEC 0x305
  333. #define CSR_MENVCFG 0x30a
  334. #define CSR_MENVCFGH 0x31a
  335. #define CSR_MSCRATCH 0x340
  336. #define CSR_MEPC 0x341
  337. #define CSR_MCAUSE 0x342
  338. #define CSR_MTVAL 0x343
  339. #define CSR_MIP 0x344
  340. #define CSR_PMPCFG0 0x3a0
  341. #define CSR_PMPADDR0 0x3b0
  342. #define CSR_MVENDORID 0xf11
  343. #define CSR_MARCHID 0xf12
  344. #define CSR_MIMPID 0xf13
  345. #define CSR_MHARTID 0xf14
  346. /* Machine-Level Window to Indirectly Accessed Registers (AIA) */
  347. #define CSR_MISELECT 0x350
  348. #define CSR_MIREG 0x351
  349. /* Machine-Level Interrupts (AIA) */
  350. #define CSR_MTOPEI 0x35c
  351. #define CSR_MTOPI 0xfb0
  352. /* Virtual Interrupts for Supervisor Level (AIA) */
  353. #define CSR_MVIEN 0x308
  354. #define CSR_MVIP 0x309
  355. /* Machine-Level High-Half CSRs (AIA) */
  356. #define CSR_MIDELEGH 0x313
  357. #define CSR_MIEH 0x314
  358. #define CSR_MVIENH 0x318
  359. #define CSR_MVIPH 0x319
  360. #define CSR_MIPH 0x354
  361. #define CSR_VSTART 0x8
  362. #define CSR_VCSR 0xf
  363. #define CSR_VL 0xc20
  364. #define CSR_VTYPE 0xc21
  365. #define CSR_VLENB 0xc22
  366. #ifdef CONFIG_RISCV_M_MODE
  367. # define CSR_STATUS CSR_MSTATUS
  368. # define CSR_IE CSR_MIE
  369. # define CSR_TVEC CSR_MTVEC
  370. # define CSR_SCRATCH CSR_MSCRATCH
  371. # define CSR_EPC CSR_MEPC
  372. # define CSR_CAUSE CSR_MCAUSE
  373. # define CSR_TVAL CSR_MTVAL
  374. # define CSR_IP CSR_MIP
  375. # define CSR_IEH CSR_MIEH
  376. # define CSR_ISELECT CSR_MISELECT
  377. # define CSR_IREG CSR_MIREG
  378. # define CSR_IPH CSR_MIPH
  379. # define CSR_TOPEI CSR_MTOPEI
  380. # define CSR_TOPI CSR_MTOPI
  381. # define SR_IE SR_MIE
  382. # define SR_PIE SR_MPIE
  383. # define SR_PP SR_MPP
  384. # define RV_IRQ_SOFT IRQ_M_SOFT
  385. # define RV_IRQ_TIMER IRQ_M_TIMER
  386. # define RV_IRQ_EXT IRQ_M_EXT
  387. #else /* CONFIG_RISCV_M_MODE */
  388. # define CSR_STATUS CSR_SSTATUS
  389. # define CSR_IE CSR_SIE
  390. # define CSR_TVEC CSR_STVEC
  391. # define CSR_SCRATCH CSR_SSCRATCH
  392. # define CSR_EPC CSR_SEPC
  393. # define CSR_CAUSE CSR_SCAUSE
  394. # define CSR_TVAL CSR_STVAL
  395. # define CSR_IP CSR_SIP
  396. # define CSR_IEH CSR_SIEH
  397. # define CSR_ISELECT CSR_SISELECT
  398. # define CSR_IREG CSR_SIREG
  399. # define CSR_IPH CSR_SIPH
  400. # define CSR_TOPEI CSR_STOPEI
  401. # define CSR_TOPI CSR_STOPI
  402. # define SR_IE SR_SIE
  403. # define SR_PIE SR_SPIE
  404. # define SR_PP SR_SPP
  405. # define RV_IRQ_SOFT IRQ_S_SOFT
  406. # define RV_IRQ_TIMER IRQ_S_TIMER
  407. # define RV_IRQ_EXT IRQ_S_EXT
  408. # define RV_IRQ_PMU IRQ_PMU_OVF
  409. # define SIP_LCOFIP (_AC(0x1, UL) << IRQ_PMU_OVF)
  410. #endif /* !CONFIG_RISCV_M_MODE */
  411. /* IE/IP (Supervisor/Machine Interrupt Enable/Pending) flags */
  412. #define IE_SIE (_AC(0x1, UL) << RV_IRQ_SOFT)
  413. #define IE_TIE (_AC(0x1, UL) << RV_IRQ_TIMER)
  414. #define IE_EIE (_AC(0x1, UL) << RV_IRQ_EXT)
  415. #ifdef __ASSEMBLER__
  416. #define __ASM_STR(x) x
  417. #else
  418. #define __ASM_STR(x) #x
  419. #endif
  420. #ifndef __ASSEMBLER__
  421. #define csr_swap(csr, val) \
  422. ({ \
  423. unsigned long __v = (unsigned long)(val); \
  424. __asm__ __volatile__ ("csrrw %0, " __ASM_STR(csr) ", %1"\
  425. : "=r" (__v) : "rK" (__v) \
  426. : "memory"); \
  427. __v; \
  428. })
  429. #define csr_read(csr) \
  430. ({ \
  431. register unsigned long __v; \
  432. __asm__ __volatile__ ("csrr %0, " __ASM_STR(csr) \
  433. : "=r" (__v) : \
  434. : "memory"); \
  435. __v; \
  436. })
  437. #define csr_write(csr, val) \
  438. ({ \
  439. unsigned long __v = (unsigned long)(val); \
  440. __asm__ __volatile__ ("csrw " __ASM_STR(csr) ", %0" \
  441. : : "rK" (__v) \
  442. : "memory"); \
  443. })
  444. #define csr_read_set(csr, val) \
  445. ({ \
  446. unsigned long __v = (unsigned long)(val); \
  447. __asm__ __volatile__ ("csrrs %0, " __ASM_STR(csr) ", %1"\
  448. : "=r" (__v) : "rK" (__v) \
  449. : "memory"); \
  450. __v; \
  451. })
  452. #define csr_set(csr, val) \
  453. ({ \
  454. unsigned long __v = (unsigned long)(val); \
  455. __asm__ __volatile__ ("csrs " __ASM_STR(csr) ", %0" \
  456. : : "rK" (__v) \
  457. : "memory"); \
  458. })
  459. #define csr_read_clear(csr, val) \
  460. ({ \
  461. unsigned long __v = (unsigned long)(val); \
  462. __asm__ __volatile__ ("csrrc %0, " __ASM_STR(csr) ", %1"\
  463. : "=r" (__v) : "rK" (__v) \
  464. : "memory"); \
  465. __v; \
  466. })
  467. #define csr_clear(csr, val) \
  468. ({ \
  469. unsigned long __v = (unsigned long)(val); \
  470. __asm__ __volatile__ ("csrc " __ASM_STR(csr) ", %0" \
  471. : : "rK" (__v) \
  472. : "memory"); \
  473. })
  474. #endif /* __ASSEMBLER__ */
  475. #endif /* _ASM_RISCV_CSR_H */