xref: /openbmc/qemu/target/loongarch/cpu-csr.h (revision e4ef2a09f39982ad53d148966001676b9275aa38)
1398cecb9SXiaojuan Yang /* SPDX-License-Identifier: GPL-2.0-or-later */
2398cecb9SXiaojuan Yang /*
3398cecb9SXiaojuan Yang  * QEMU LoongArch CSRs
4398cecb9SXiaojuan Yang  *
5398cecb9SXiaojuan Yang  * Copyright (c) 2021 Loongson Technology Corporation Limited
6398cecb9SXiaojuan Yang  */
7398cecb9SXiaojuan Yang 
8398cecb9SXiaojuan Yang #ifndef LOONGARCH_CPU_CSR_H
9398cecb9SXiaojuan Yang #define LOONGARCH_CPU_CSR_H
10398cecb9SXiaojuan Yang 
11398cecb9SXiaojuan Yang #include "hw/registerfields.h"
12398cecb9SXiaojuan Yang 
138b81968cSMichael Tokarev /* Based on kernel definitions: arch/loongarch/include/asm/loongarch.h */
14398cecb9SXiaojuan Yang 
15398cecb9SXiaojuan Yang /* Basic CSRs */
16398cecb9SXiaojuan Yang #define LOONGARCH_CSR_CRMD           0x0 /* Current mode info */
17398cecb9SXiaojuan Yang 
18398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PRMD           0x1 /* Prev-exception mode info */
19398cecb9SXiaojuan Yang FIELD(CSR_PRMD, PPLV, 0, 2)
20398cecb9SXiaojuan Yang FIELD(CSR_PRMD, PIE, 2, 1)
21398cecb9SXiaojuan Yang FIELD(CSR_PRMD, PWE, 3, 1)
22398cecb9SXiaojuan Yang 
23398cecb9SXiaojuan Yang #define LOONGARCH_CSR_EUEN           0x2 /* Extended unit enable */
24398cecb9SXiaojuan Yang FIELD(CSR_EUEN, FPE, 0, 1)
25398cecb9SXiaojuan Yang FIELD(CSR_EUEN, SXE, 1, 1)
26398cecb9SXiaojuan Yang FIELD(CSR_EUEN, ASXE, 2, 1)
27398cecb9SXiaojuan Yang FIELD(CSR_EUEN, BTE, 3, 1)
28398cecb9SXiaojuan Yang 
29398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MISC           0x3 /* Misc config */
30398cecb9SXiaojuan Yang FIELD(CSR_MISC, VA32, 0, 4)
31398cecb9SXiaojuan Yang FIELD(CSR_MISC, DRDTL, 4, 4)
32398cecb9SXiaojuan Yang FIELD(CSR_MISC, RPCNTL, 8, 4)
33398cecb9SXiaojuan Yang FIELD(CSR_MISC, ALCL, 12, 4)
34398cecb9SXiaojuan Yang FIELD(CSR_MISC, DWPL, 16, 3)
35398cecb9SXiaojuan Yang 
36398cecb9SXiaojuan Yang #define LOONGARCH_CSR_ECFG           0x4 /* Exception config */
37398cecb9SXiaojuan Yang FIELD(CSR_ECFG, LIE, 0, 13)
38398cecb9SXiaojuan Yang FIELD(CSR_ECFG, VS, 16, 3)
39398cecb9SXiaojuan Yang 
40398cecb9SXiaojuan Yang #define LOONGARCH_CSR_ESTAT          0x5 /* Exception status */
41398cecb9SXiaojuan Yang FIELD(CSR_ESTAT, IS, 0, 13)
42398cecb9SXiaojuan Yang FIELD(CSR_ESTAT, ECODE, 16, 6)
43398cecb9SXiaojuan Yang FIELD(CSR_ESTAT, ESUBCODE, 22, 9)
44398cecb9SXiaojuan Yang 
45398cecb9SXiaojuan Yang #define LOONGARCH_CSR_ERA            0x6 /* Exception return address */
46398cecb9SXiaojuan Yang 
47398cecb9SXiaojuan Yang #define LOONGARCH_CSR_BADV           0x7 /* Bad virtual address */
48398cecb9SXiaojuan Yang 
49398cecb9SXiaojuan Yang #define LOONGARCH_CSR_BADI           0x8 /* Bad instruction */
50398cecb9SXiaojuan Yang 
51398cecb9SXiaojuan Yang #define LOONGARCH_CSR_EENTRY         0xc /* Exception entry address */
52398cecb9SXiaojuan Yang 
53398cecb9SXiaojuan Yang /* TLB related CSRs */
54398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBIDX         0x10 /* TLB Index, EHINV, PageSize, NP */
55398cecb9SXiaojuan Yang FIELD(CSR_TLBIDX, INDEX, 0, 12)
56398cecb9SXiaojuan Yang FIELD(CSR_TLBIDX, PS, 24, 6)
57398cecb9SXiaojuan Yang FIELD(CSR_TLBIDX, NE, 31, 1)
58398cecb9SXiaojuan Yang 
59398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBEHI         0x11 /* TLB EntryHi */
6050fffcc4SJiajie Chen FIELD(CSR_TLBEHI_32, VPPN, 13, 19)
6150fffcc4SJiajie Chen FIELD(CSR_TLBEHI_64, VPPN, 13, 35)
62398cecb9SXiaojuan Yang 
63398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBELO0        0x12 /* TLB EntryLo0 */
64398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBELO1        0x13 /* TLB EntryLo1 */
65398cecb9SXiaojuan Yang FIELD(TLBENTRY, V, 0, 1)
66398cecb9SXiaojuan Yang FIELD(TLBENTRY, D, 1, 1)
67398cecb9SXiaojuan Yang FIELD(TLBENTRY, PLV, 2, 2)
68398cecb9SXiaojuan Yang FIELD(TLBENTRY, MAT, 4, 2)
69398cecb9SXiaojuan Yang FIELD(TLBENTRY, G, 6, 1)
70*9c70db9aSXianglai Li FIELD(TLBENTRY, HUGE, 6, 1)
71*9c70db9aSXianglai Li FIELD(TLBENTRY, HGLOBAL, 12, 1)
72*9c70db9aSXianglai Li FIELD(TLBENTRY, LEVEL, 13, 2)
73e70bb6fbSJiajie Chen FIELD(TLBENTRY_32, PPN, 8, 24)
74e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, PPN, 12, 36)
75e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, NR, 61, 1)
76e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, NX, 62, 1)
77e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, RPLV, 63, 1)
78398cecb9SXiaojuan Yang 
79398cecb9SXiaojuan Yang #define LOONGARCH_CSR_ASID           0x18 /* Address space identifier */
80398cecb9SXiaojuan Yang FIELD(CSR_ASID, ASID, 0, 10)
81398cecb9SXiaojuan Yang FIELD(CSR_ASID, ASIDBITS, 16, 8)
82398cecb9SXiaojuan Yang 
83398cecb9SXiaojuan Yang /* Page table base address when badv[47] = 0 */
84398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PGDL           0x19
85398cecb9SXiaojuan Yang /* Page table base address when badv[47] = 1 */
86398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PGDH           0x1a
87398cecb9SXiaojuan Yang 
88398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PGD            0x1b /* Page table base address */
89398cecb9SXiaojuan Yang 
90398cecb9SXiaojuan Yang /* Page walk controller's low addr */
91398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PWCL           0x1c
92398cecb9SXiaojuan Yang FIELD(CSR_PWCL, PTBASE, 0, 5)
93398cecb9SXiaojuan Yang FIELD(CSR_PWCL, PTWIDTH, 5, 5)
94398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR1_BASE, 10, 5)
95398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR1_WIDTH, 15, 5)
96398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR2_BASE, 20, 5)
97398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR2_WIDTH, 25, 5)
98398cecb9SXiaojuan Yang FIELD(CSR_PWCL, PTEWIDTH, 30, 2)
99398cecb9SXiaojuan Yang 
100398cecb9SXiaojuan Yang /* Page walk controller's high addr */
101398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PWCH           0x1d
102398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR3_BASE, 0, 6)
103398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR3_WIDTH, 6, 6)
104398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR4_BASE, 12, 6)
105398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR4_WIDTH, 18, 6)
106398cecb9SXiaojuan Yang 
107398cecb9SXiaojuan Yang #define LOONGARCH_CSR_STLBPS         0x1e /* Stlb page size */
108398cecb9SXiaojuan Yang FIELD(CSR_STLBPS, PS, 0, 5)
109398cecb9SXiaojuan Yang 
110398cecb9SXiaojuan Yang #define LOONGARCH_CSR_RVACFG         0x1f /* Reduced virtual address config */
111398cecb9SXiaojuan Yang FIELD(CSR_RVACFG, RBITS, 0, 4)
112398cecb9SXiaojuan Yang 
113398cecb9SXiaojuan Yang /* Config CSRs */
114398cecb9SXiaojuan Yang #define LOONGARCH_CSR_CPUID          0x20 /* CPU core id */
115398cecb9SXiaojuan Yang 
116398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PRCFG1         0x21 /* Config1 */
117398cecb9SXiaojuan Yang FIELD(CSR_PRCFG1, SAVE_NUM, 0, 4)
118398cecb9SXiaojuan Yang FIELD(CSR_PRCFG1, TIMER_BITS, 4, 8)
119398cecb9SXiaojuan Yang FIELD(CSR_PRCFG1, VSMAX, 12, 3)
120398cecb9SXiaojuan Yang 
121398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PRCFG2         0x22 /* Config2 */
122398cecb9SXiaojuan Yang 
123398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PRCFG3         0x23 /* Config3 */
124398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, TLB_TYPE, 0, 4)
125398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, MTLB_ENTRY, 4, 8)
126398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, STLB_WAYS, 12, 8)
127398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, STLB_SETS, 20, 8)
128398cecb9SXiaojuan Yang 
129398cecb9SXiaojuan Yang /*
130398cecb9SXiaojuan Yang  * Save registers count can read from PRCFG1.SAVE_NUM
131398cecb9SXiaojuan Yang  * The Min count is 1. Max count is 15.
132398cecb9SXiaojuan Yang  */
133398cecb9SXiaojuan Yang #define LOONGARCH_CSR_SAVE(N)        (0x30 + N)
134398cecb9SXiaojuan Yang 
135398cecb9SXiaojuan Yang /* Timer CSRs */
136398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TID            0x40 /* Timer ID */
137398cecb9SXiaojuan Yang 
138398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TCFG           0x41 /* Timer config */
139398cecb9SXiaojuan Yang FIELD(CSR_TCFG, EN, 0, 1)
140398cecb9SXiaojuan Yang FIELD(CSR_TCFG, PERIODIC, 1, 1)
141398cecb9SXiaojuan Yang FIELD(CSR_TCFG, INIT_VAL, 2, 46)
142398cecb9SXiaojuan Yang 
143398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TVAL           0x42 /* Timer ticks remain */
144398cecb9SXiaojuan Yang 
145398cecb9SXiaojuan Yang #define LOONGARCH_CSR_CNTC           0x43 /* Timer offset */
146398cecb9SXiaojuan Yang 
147398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TICLR          0x44 /* Timer interrupt clear */
148398cecb9SXiaojuan Yang 
149398cecb9SXiaojuan Yang /* LLBCTL CSRs */
150398cecb9SXiaojuan Yang #define LOONGARCH_CSR_LLBCTL         0x60 /* LLBit control */
151398cecb9SXiaojuan Yang FIELD(CSR_LLBCTL, ROLLB, 0, 1)
152398cecb9SXiaojuan Yang FIELD(CSR_LLBCTL, WCLLB, 1, 1)
153398cecb9SXiaojuan Yang FIELD(CSR_LLBCTL, KLO, 2, 1)
154398cecb9SXiaojuan Yang 
155398cecb9SXiaojuan Yang /* Implement dependent */
156398cecb9SXiaojuan Yang #define LOONGARCH_CSR_IMPCTL1        0x80 /* LoongArch config1 */
157398cecb9SXiaojuan Yang 
158398cecb9SXiaojuan Yang #define LOONGARCH_CSR_IMPCTL2        0x81 /* LoongArch config2*/
159398cecb9SXiaojuan Yang 
160398cecb9SXiaojuan Yang /* TLB Refill CSRs */
161398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRENTRY      0x88 /* TLB refill exception address */
162398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRBADV       0x89 /* TLB refill badvaddr */
163398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRERA        0x8a /* TLB refill ERA */
164398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRSAVE       0x8b /* KScratch for TLB refill */
165398cecb9SXiaojuan Yang FIELD(CSR_TLBRERA, ISTLBR, 0, 1)
166398cecb9SXiaojuan Yang FIELD(CSR_TLBRERA, PC, 2, 62)
167398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRELO0       0x8c /* TLB refill entrylo0 */
168398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRELO1       0x8d /* TLB refill entrylo1 */
169398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBREHI        0x8e /* TLB refill entryhi */
170398cecb9SXiaojuan Yang FIELD(CSR_TLBREHI, PS, 0, 6)
17150fffcc4SJiajie Chen FIELD(CSR_TLBREHI_32, VPPN, 13, 19)
17250fffcc4SJiajie Chen FIELD(CSR_TLBREHI_64, VPPN, 13, 35)
173398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRPRMD       0x8f /* TLB refill mode info */
174398cecb9SXiaojuan Yang FIELD(CSR_TLBRPRMD, PPLV, 0, 2)
175398cecb9SXiaojuan Yang FIELD(CSR_TLBRPRMD, PIE, 2, 1)
176398cecb9SXiaojuan Yang FIELD(CSR_TLBRPRMD, PWE, 4, 1)
177398cecb9SXiaojuan Yang 
178398cecb9SXiaojuan Yang /* Machine Error CSRs */
179398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRCTL        0x90 /* ERRCTL */
180398cecb9SXiaojuan Yang FIELD(CSR_MERRCTL, ISMERR, 0, 1)
181398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRINFO1      0x91
182398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRINFO2      0x92
183398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRENTRY      0x93 /* MError exception base */
184398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRERA        0x94 /* MError exception PC */
185398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRSAVE       0x95 /* KScratch for error exception */
186398cecb9SXiaojuan Yang 
187398cecb9SXiaojuan Yang #define LOONGARCH_CSR_CTAG           0x98 /* TagLo + TagHi */
188398cecb9SXiaojuan Yang 
189398cecb9SXiaojuan Yang /* Direct map windows CSRs*/
190398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DMW(N)         (0x180 + N)
191398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV0, 0, 1)
192398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV1, 1, 1)
193398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV2, 2, 1)
194398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV3, 3, 1)
195398cecb9SXiaojuan Yang FIELD(CSR_DMW, MAT, 4, 2)
196eece5764SJiajie Chen FIELD(CSR_DMW_32, PSEG, 25, 3)
197eece5764SJiajie Chen FIELD(CSR_DMW_32, VSEG, 29, 3)
198eece5764SJiajie Chen FIELD(CSR_DMW_64, VSEG, 60, 4)
199398cecb9SXiaojuan Yang 
200398cecb9SXiaojuan Yang /* Debug CSRs */
201398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DBG            0x500 /* debug config */
202398cecb9SXiaojuan Yang FIELD(CSR_DBG, DST, 0, 1)
203398cecb9SXiaojuan Yang FIELD(CSR_DBG, DREV, 1, 7)
204398cecb9SXiaojuan Yang FIELD(CSR_DBG, DEI, 8, 1)
205398cecb9SXiaojuan Yang FIELD(CSR_DBG, DCL, 9, 1)
206398cecb9SXiaojuan Yang FIELD(CSR_DBG, DFW, 10, 1)
207398cecb9SXiaojuan Yang FIELD(CSR_DBG, DMW, 11, 1)
208398cecb9SXiaojuan Yang FIELD(CSR_DBG, ECODE, 16, 6)
209398cecb9SXiaojuan Yang 
210398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DERA           0x501 /* Debug era */
211398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DSAVE          0x502 /* Debug save */
212398cecb9SXiaojuan Yang 
213398cecb9SXiaojuan Yang #endif /* LOONGARCH_CPU_CSR_H */
214