summaryrefslogtreecommitdiffstats
path: root/MdePkg/Include/Register/LoongArch64/Csr.h
blob: aa22a265640f4aa61acd812a92cdc7be002d0e04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
/** @file

  Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Glossary:
    - EXC     - Exception
    - CSR     - CPU Status Register
**/

#ifndef LOONGARCH_CSR_H_
#define LOONGARCH_CSR_H_

#include <Base.h>

//
// CSR register numbers
//

//
// Basic CSR registers
//
#define LOONGARCH_CSR_CRMD     0x0
#define LOONGARCH_CSR_PRMD     0x1
#define LOONGARCH_CSR_EUEN     0x2
#define CSR_EUEN_LBTEN_SHIFT   3
#define CSR_EUEN_LBTEN         (0x1ULL << CSR_EUEN_LBTEN_SHIFT)
#define CSR_EUEN_LASXEN_SHIFT  2
#define CSR_EUEN_LASXEN        (0x1ULL << CSR_EUEN_LASXEN_SHIFT)
#define CSR_EUEN_LSXEN_SHIFT   1
#define CSR_EUEN_LSXEN         (0x1ULL << CSR_EUEN_LSXEN_SHIFT)
#define CSR_EUEN_FPEN_SHIFT    0
#define CSR_EUEN_FPEN          (0x1ULL << CSR_EUEN_FPEN_SHIFT)
#define LOONGARCH_CSR_MISC     0x3
#define LOONGARCH_CSR_ECFG     0x4

#define LOONGARCH_CSR_ESTAT       0x5
#define CSR_ESTAT_ESUBCODE_SHIFT  22
#define CSR_ESTAT_ESUBCODE_WIDTH  9
#define CSR_ESTAT_ESUBCODE        (0x1ffULL << CSR_ESTAT_ESUBCODE_SHIFT)
#define CSR_ESTAT_EXC_SHIFT       16
#define CSR_ESTAT_EXC_WIDTH       6
#define CSR_ESTAT_EXC             (0x3FULL << CSR_ESTAT_EXC_SHIFT)
#define CSR_ESTAT_IS_SHIFT        0
#define CSR_ESTAT_IS_WIDTH        15
#define CSR_ESTAT_IS              (0x7FFFULL << CSR_ESTAT_IS_SHIFT)

#define LOONGARCH_CSR_ERA    0x6
#define LOONGARCH_CSR_BADV   0x7
#define LOONGARCH_CSR_BADI   0x8
#define LOONGARCH_CSR_EBASE  0xC     // Exception entry base address

//
// TLB related CSR registers
//
#define LOONGARCH_CSR_TLBIDX      0x10      // TLB Index, EHINV, PageSize, NP
#define LOONGARCH_CSR_TLBEHI      0x11      // TLB EntryHi
#define LOONGARCH_CSR_TLBELO0     0x12      // TLB EntryLo0
#define LOONGARCH_CSR_TLBELO1     0x13      // TLB EntryLo1
#define LOONGARCH_CSR_ASID        0x18      // ASID
#define LOONGARCH_CSR_PGDL        0x19      // Page table base address when VA[47] = 0
#define LOONGARCH_CSR_PGDH        0x1A      // Page table base address when VA[47] = 1
#define LOONGARCH_CSR_PGD         0x1B      // Page table base
#define LOONGARCH_CSR_PWCTL0      0x1C      // PWCtl0
#define LOONGARCH_CSR_PWCTL1      0x1D      // PWCtl1
#define LOONGARCH_CSR_STLBPGSIZE  0x1E
#define LOONGARCH_CSR_RVACFG      0x1F

///
/// Page table property definitions
///
#define PAGE_VALID_SHIFT   0
#define PAGE_DIRTY_SHIFT   1
#define PAGE_PLV_SHIFT     2  // 2~3, two bits
#define CACHE_SHIFT        4  // 4~5, two bits
#define PAGE_GLOBAL_SHIFT  6
#define PAGE_HUGE_SHIFT    6  // HUGE is a PMD bit

#define PAGE_HGLOBAL_SHIFT  12 // HGlobal is a PMD bit
#define PAGE_PFN_SHIFT      12
#define PAGE_PFN_END_SHIFT  48
#define PAGE_NO_READ_SHIFT  61
#define PAGE_NO_EXEC_SHIFT  62
#define PAGE_RPLV_SHIFT     63

///
/// Used by TLB hardware (placed in EntryLo*)
///
#define PAGE_VALID    ((UINTN)(1) << PAGE_VALID_SHIFT)
#define PAGE_DIRTY    ((UINTN)(1) << PAGE_DIRTY_SHIFT)
#define PAGE_PLV      ((UINTN)(3) << PAGE_PLV_SHIFT)
#define PAGE_GLOBAL   ((UINTN)(1) << PAGE_GLOBAL_SHIFT)
#define PAGE_HUGE     ((UINTN)(1) << PAGE_HUGE_SHIFT)
#define PAGE_HGLOBAL  ((UINTN)(1) << PAGE_HGLOBAL_SHIFT)
#define PAGE_NO_READ  ((UINTN)(1) << PAGE_NO_READ_SHIFT)
#define PAGE_NO_EXEC  ((UINTN)(1) << PAGE_NO_EXEC_SHIFT)
#define PAGE_RPLV     ((UINTN)(1) << PAGE_RPLV_SHIFT)
#define CACHE_MASK    ((UINTN)(3) << CACHE_SHIFT)
#define PFN_SHIFT     (EFI_PAGE_SHIFT - 12 + PAGE_PFN_SHIFT)

#define PLV_KERNEL  0
#define PLV_USER    3

#define PAGE_USER    (PLV_USER << PAGE_PLV_SHIFT)
#define PAGE_KERNEL  (PLV_KERN << PAGE_PLV_SHIFT)

#define CACHE_SUC  (0 << CACHE_SHIFT) // Strong-ordered UnCached
#define CACHE_CC   (1 << CACHE_SHIFT) // Coherent Cached
#define CACHE_WUC  (2 << CACHE_SHIFT) // Weak-ordered UnCached

//
// Config CSR registers
//
#define LOONGARCH_CSR_CPUNUM  0x20    // CPU core number
#define LOONGARCH_CSR_PRCFG1  0x21    // Config1
#define LOONGARCH_CSR_PRCFG2  0x22    // Config2
#define LOONGARCH_CSR_PRCFG3  0x23    // Config3

//
// Kscratch registers
//
#define LOONGARCH_CSR_KS0  0x30
#define LOONGARCH_CSR_KS1  0x31
#define LOONGARCH_CSR_KS2  0x32
#define LOONGARCH_CSR_KS3  0x33
#define LOONGARCH_CSR_KS4  0x34
#define LOONGARCH_CSR_KS5  0x35
#define LOONGARCH_CSR_KS6  0x36
#define LOONGARCH_CSR_KS7  0x37
#define LOONGARCH_CSR_KS8  0x38

//
// Stable timer registers
//
#define LOONGARCH_CSR_TMID           0x40  // Timer ID
#define LOONGARCH_CSR_TMCFG          0x41
#define LOONGARCH_CSR_TMCFG_EN       (1ULL << 0)
#define LOONGARCH_CSR_TMCFG_PERIOD   (1ULL << 1)
#define LOONGARCH_CSR_TMCFG_TIMEVAL  (0x3FFFFFFFFFFFULL << 2)
#define LOONGARCH_CSR_TVAL           0x42    // Timer value
#define LOONGARCH_CSR_CNTC           0x43    // Timer offset
#define LOONGARCH_CSR_TINTCLR        0x44    // Timer interrupt clear

//
// TLB refill exception base address
//
#define LOONGARCH_CSR_TLBREBASE  0x88    // TLB refill exception entry
#define LOONGARCH_CSR_TLBRBADV   0x89    // TLB refill badvaddr
#define LOONGARCH_CSR_TLBRERA    0x8a    // TLB refill ERA
#define LOONGARCH_CSR_TLBRSAVE   0x8b    // KScratch for TLB refill exception
#define LOONGARCH_CSR_TLBRELO0   0x8c    // TLB refill entrylo0
#define LOONGARCH_CSR_TLBRELO1   0x8d    // TLB refill entrylo1
#define LOONGARCH_CSR_TLBREHI    0x8e    // TLB refill entryhi

//
// Direct map windows registers
//
#define LOONGARCH_CSR_DMWIN0  0x180   // 64 direct map win0: MEM & IF
#define LOONGARCH_CSR_DMWIN1  0x181   // 64 direct map win1: MEM & IF
#define LOONGARCH_CSR_DMWIN2  0x182   // 64 direct map win2: MEM
#define LOONGARCH_CSR_DMWIN3  0x183   // 64 direct map win3: MEM
//
// CSR register numbers end
//

//
// IOCSR register numbers
//
#define LOONGARCH_IOCSR_FEATURES  0x8
#define  IOCSRF_TEMP              (1ULL << 0)
#define  IOCSRF_NODECNT           (1ULL << 1)
#define  IOCSRF_MSI               (1ULL << 2)
#define  IOCSRF_EXTIOI            (1ULL << 3)
#define  IOCSRF_CSRIPI            (1ULL << 4)
#define  IOCSRF_FREQCSR           (1ULL << 5)
#define  IOCSRF_FREQSCALE         (1ULL << 6)
#define  IOCSRF_DVFSV1            (1ULL << 7)
#define  IOCSRF_EXTIOI_DECODE     (1ULL << 9)
#define  IOCSRF_FLATMODE          (1ULL << 10)
#define  IOCSRF_VM                (1ULL << 11)

#define LOONGARCH_IOCSR_VENDOR  0x10

#define LOONGARCH_IOCSR_CPUNAME  0x20

#define LOONGARCH_IOCSR_NODECNT  0x408

#define LOONGARCH_IOCSR_MISC_FUNC     0x420
#define  IOCSR_MISC_FUNC_TIMER_RESET  (1ULL << 21)
#define  IOCSR_MISC_FUNC_EXT_IOI_EN   (1ULL << 48)

#define LOONGARCH_IOCSR_CPUTEMP  0x428

//
// PerCore CSR, only accessable by local cores
//
#define LOONGARCH_IOCSR_IPI_STATUS  0x1000
#define LOONGARCH_IOCSR_IPI_EN      0x1004
#define LOONGARCH_IOCSR_IPI_SET     0x1008
#define LOONGARCH_IOCSR_IPI_CLEAR   0x100c
#define LOONGARCH_IOCSR_MBUF0       0x1020
#define LOONGARCH_IOCSR_MBUF1       0x1028
#define LOONGARCH_IOCSR_MBUF2       0x1030
#define LOONGARCH_IOCSR_MBUF3       0x1038

#define LOONGARCH_IOCSR_IPI_SEND   0x1040
#define  IOCSR_IPI_SEND_IP_SHIFT   0
#define  IOCSR_IPI_SEND_CPU_SHIFT  16
#define  IOCSR_IPI_SEND_BLOCKING   (1ULL << 31)

#define LOONGARCH_IOCSR_MBUF_SEND   0x1048
#define  IOCSR_MBUF_SEND_BLOCKING   (1ULL << 31)
#define  IOCSR_MBUF_SEND_BOX_SHIFT  2
#define  IOCSR_MBUF_SEND_BOX_LO(box)  (box << 1)
#define  IOCSR_MBUF_SEND_BOX_HI(box)  ((box << 1) + 1)
#define  IOCSR_MBUF_SEND_CPU_SHIFT  16
#define  IOCSR_MBUF_SEND_BUF_SHIFT  32
#define  IOCSR_MBUF_SEND_H32_MASK   0xFFFFFFFF00000000ULL

#define LOONGARCH_IOCSR_ANY_SEND    0x1158
#define  IOCSR_ANY_SEND_BLOCKING    (1ULL << 31)
#define  IOCSR_ANY_SEND_CPU_SHIFT   16
#define  IOCSR_ANY_SEND_MASK_SHIFT  27
#define  IOCSR_ANY_SEND_BUF_SHIFT   32
#define  IOCSR_ANY_SEND_H32_MASK    0xFFFFFFFF00000000ULL

//
// Register offset and bit definition for CSR access
//
#define LOONGARCH_IOCSR_TIMER_CFG   0x1060
#define LOONGARCH_IOCSR_TIMER_TICK  0x1070
#define  IOCSR_TIMER_CFG_RESERVED   BIT63
#define  IOCSR_TIMER_CFG_PERIODIC   BIT62
#define  IOCSR_TIMER_CFG_EN         BIT61
#define  IOCSR_TIMER_MASK           0x0FFFFFFFFFFFFULL
#define  IOCSR_TIMER_INITVAL_RST    (0xFFFFULL << 48)
//
// IOCSR register numbers end
//

//
// Invalid addr with global=1 or matched asid in current TLB
//
#define INVTLB_ADDR_GTRUE_OR_ASID  0x6

//
// Bits 8 and 9 of FPU Status Register specify the rounding mode
//
#define FPU_CSR_RM  0x300
#define FPU_CSR_RN  0x000   // nearest
#define FPU_CSR_RZ  0x100   // towards zero
#define FPU_CSR_RU  0x200   // towards +Infinity
#define FPU_CSR_RD  0x300   // towards -Infinity

#define DEFAULT_PAGE_SIZE     0x0c
#define CSR_TLBIDX_SIZE_MASK  0x3f000000
#define CSR_TLBIDX_PS_SHIFT   24
#define CSR_TLBIDX_SIZE       CSR_TLBIDX_PS_SHIFT
#define CSR_TLBREHI_PS_SHIFT  0x0
#define CSR_TLBREHI_PS        0x3f

#endif