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 */ 60398cecb9SXiaojuan Yang FIELD(CSR_TLBEHI, VPPN, 13, 35) 61398cecb9SXiaojuan Yang 62398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBELO0 0x12 /* TLB EntryLo0 */ 63398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBELO1 0x13 /* TLB EntryLo1 */ 64398cecb9SXiaojuan Yang FIELD(TLBENTRY, V, 0, 1) 65398cecb9SXiaojuan Yang FIELD(TLBENTRY, D, 1, 1) 66398cecb9SXiaojuan Yang FIELD(TLBENTRY, PLV, 2, 2) 67398cecb9SXiaojuan Yang FIELD(TLBENTRY, MAT, 4, 2) 68398cecb9SXiaojuan Yang FIELD(TLBENTRY, G, 6, 1) 69e70bb6fbSJiajie Chen FIELD(TLBENTRY_32, PPN, 8, 24) 70e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, PPN, 12, 36) 71e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, NR, 61, 1) 72e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, NX, 62, 1) 73e70bb6fbSJiajie Chen FIELD(TLBENTRY_64, RPLV, 63, 1) 74398cecb9SXiaojuan Yang 75398cecb9SXiaojuan Yang #define LOONGARCH_CSR_ASID 0x18 /* Address space identifier */ 76398cecb9SXiaojuan Yang FIELD(CSR_ASID, ASID, 0, 10) 77398cecb9SXiaojuan Yang FIELD(CSR_ASID, ASIDBITS, 16, 8) 78398cecb9SXiaojuan Yang 79398cecb9SXiaojuan Yang /* Page table base address when badv[47] = 0 */ 80398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PGDL 0x19 81398cecb9SXiaojuan Yang /* Page table base address when badv[47] = 1 */ 82398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PGDH 0x1a 83398cecb9SXiaojuan Yang 84398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PGD 0x1b /* Page table base address */ 85398cecb9SXiaojuan Yang 86398cecb9SXiaojuan Yang /* Page walk controller's low addr */ 87398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PWCL 0x1c 88398cecb9SXiaojuan Yang FIELD(CSR_PWCL, PTBASE, 0, 5) 89398cecb9SXiaojuan Yang FIELD(CSR_PWCL, PTWIDTH, 5, 5) 90398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR1_BASE, 10, 5) 91398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR1_WIDTH, 15, 5) 92398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR2_BASE, 20, 5) 93398cecb9SXiaojuan Yang FIELD(CSR_PWCL, DIR2_WIDTH, 25, 5) 94398cecb9SXiaojuan Yang FIELD(CSR_PWCL, PTEWIDTH, 30, 2) 95398cecb9SXiaojuan Yang 96398cecb9SXiaojuan Yang /* Page walk controller's high addr */ 97398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PWCH 0x1d 98398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR3_BASE, 0, 6) 99398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR3_WIDTH, 6, 6) 100398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR4_BASE, 12, 6) 101398cecb9SXiaojuan Yang FIELD(CSR_PWCH, DIR4_WIDTH, 18, 6) 102398cecb9SXiaojuan Yang 103398cecb9SXiaojuan Yang #define LOONGARCH_CSR_STLBPS 0x1e /* Stlb page size */ 104398cecb9SXiaojuan Yang FIELD(CSR_STLBPS, PS, 0, 5) 105398cecb9SXiaojuan Yang 106398cecb9SXiaojuan Yang #define LOONGARCH_CSR_RVACFG 0x1f /* Reduced virtual address config */ 107398cecb9SXiaojuan Yang FIELD(CSR_RVACFG, RBITS, 0, 4) 108398cecb9SXiaojuan Yang 109398cecb9SXiaojuan Yang /* Config CSRs */ 110398cecb9SXiaojuan Yang #define LOONGARCH_CSR_CPUID 0x20 /* CPU core id */ 111398cecb9SXiaojuan Yang 112398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PRCFG1 0x21 /* Config1 */ 113398cecb9SXiaojuan Yang FIELD(CSR_PRCFG1, SAVE_NUM, 0, 4) 114398cecb9SXiaojuan Yang FIELD(CSR_PRCFG1, TIMER_BITS, 4, 8) 115398cecb9SXiaojuan Yang FIELD(CSR_PRCFG1, VSMAX, 12, 3) 116398cecb9SXiaojuan Yang 117398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PRCFG2 0x22 /* Config2 */ 118398cecb9SXiaojuan Yang 119398cecb9SXiaojuan Yang #define LOONGARCH_CSR_PRCFG3 0x23 /* Config3 */ 120398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, TLB_TYPE, 0, 4) 121398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, MTLB_ENTRY, 4, 8) 122398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, STLB_WAYS, 12, 8) 123398cecb9SXiaojuan Yang FIELD(CSR_PRCFG3, STLB_SETS, 20, 8) 124398cecb9SXiaojuan Yang 125398cecb9SXiaojuan Yang /* 126398cecb9SXiaojuan Yang * Save registers count can read from PRCFG1.SAVE_NUM 127398cecb9SXiaojuan Yang * The Min count is 1. Max count is 15. 128398cecb9SXiaojuan Yang */ 129398cecb9SXiaojuan Yang #define LOONGARCH_CSR_SAVE(N) (0x30 + N) 130398cecb9SXiaojuan Yang 131398cecb9SXiaojuan Yang /* Timer CSRs */ 132398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TID 0x40 /* Timer ID */ 133398cecb9SXiaojuan Yang 134398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TCFG 0x41 /* Timer config */ 135398cecb9SXiaojuan Yang FIELD(CSR_TCFG, EN, 0, 1) 136398cecb9SXiaojuan Yang FIELD(CSR_TCFG, PERIODIC, 1, 1) 137398cecb9SXiaojuan Yang FIELD(CSR_TCFG, INIT_VAL, 2, 46) 138398cecb9SXiaojuan Yang 139398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TVAL 0x42 /* Timer ticks remain */ 140398cecb9SXiaojuan Yang 141398cecb9SXiaojuan Yang #define LOONGARCH_CSR_CNTC 0x43 /* Timer offset */ 142398cecb9SXiaojuan Yang 143398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TICLR 0x44 /* Timer interrupt clear */ 144398cecb9SXiaojuan Yang 145398cecb9SXiaojuan Yang /* LLBCTL CSRs */ 146398cecb9SXiaojuan Yang #define LOONGARCH_CSR_LLBCTL 0x60 /* LLBit control */ 147398cecb9SXiaojuan Yang FIELD(CSR_LLBCTL, ROLLB, 0, 1) 148398cecb9SXiaojuan Yang FIELD(CSR_LLBCTL, WCLLB, 1, 1) 149398cecb9SXiaojuan Yang FIELD(CSR_LLBCTL, KLO, 2, 1) 150398cecb9SXiaojuan Yang 151398cecb9SXiaojuan Yang /* Implement dependent */ 152398cecb9SXiaojuan Yang #define LOONGARCH_CSR_IMPCTL1 0x80 /* LoongArch config1 */ 153398cecb9SXiaojuan Yang 154398cecb9SXiaojuan Yang #define LOONGARCH_CSR_IMPCTL2 0x81 /* LoongArch config2*/ 155398cecb9SXiaojuan Yang 156398cecb9SXiaojuan Yang /* TLB Refill CSRs */ 157398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRENTRY 0x88 /* TLB refill exception address */ 158398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRBADV 0x89 /* TLB refill badvaddr */ 159398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRERA 0x8a /* TLB refill ERA */ 160398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRSAVE 0x8b /* KScratch for TLB refill */ 161398cecb9SXiaojuan Yang FIELD(CSR_TLBRERA, ISTLBR, 0, 1) 162398cecb9SXiaojuan Yang FIELD(CSR_TLBRERA, PC, 2, 62) 163398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRELO0 0x8c /* TLB refill entrylo0 */ 164398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRELO1 0x8d /* TLB refill entrylo1 */ 165398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBREHI 0x8e /* TLB refill entryhi */ 166398cecb9SXiaojuan Yang FIELD(CSR_TLBREHI, PS, 0, 6) 167398cecb9SXiaojuan Yang FIELD(CSR_TLBREHI, VPPN, 13, 35) 168398cecb9SXiaojuan Yang #define LOONGARCH_CSR_TLBRPRMD 0x8f /* TLB refill mode info */ 169398cecb9SXiaojuan Yang FIELD(CSR_TLBRPRMD, PPLV, 0, 2) 170398cecb9SXiaojuan Yang FIELD(CSR_TLBRPRMD, PIE, 2, 1) 171398cecb9SXiaojuan Yang FIELD(CSR_TLBRPRMD, PWE, 4, 1) 172398cecb9SXiaojuan Yang 173398cecb9SXiaojuan Yang /* Machine Error CSRs */ 174398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRCTL 0x90 /* ERRCTL */ 175398cecb9SXiaojuan Yang FIELD(CSR_MERRCTL, ISMERR, 0, 1) 176398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRINFO1 0x91 177398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRINFO2 0x92 178398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRENTRY 0x93 /* MError exception base */ 179398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRERA 0x94 /* MError exception PC */ 180398cecb9SXiaojuan Yang #define LOONGARCH_CSR_MERRSAVE 0x95 /* KScratch for error exception */ 181398cecb9SXiaojuan Yang 182398cecb9SXiaojuan Yang #define LOONGARCH_CSR_CTAG 0x98 /* TagLo + TagHi */ 183398cecb9SXiaojuan Yang 184398cecb9SXiaojuan Yang /* Direct map windows CSRs*/ 185398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DMW(N) (0x180 + N) 186398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV0, 0, 1) 187398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV1, 1, 1) 188398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV2, 2, 1) 189398cecb9SXiaojuan Yang FIELD(CSR_DMW, PLV3, 3, 1) 190398cecb9SXiaojuan Yang FIELD(CSR_DMW, MAT, 4, 2) 191*eece5764SJiajie Chen FIELD(CSR_DMW_32, PSEG, 25, 3) 192*eece5764SJiajie Chen FIELD(CSR_DMW_32, VSEG, 29, 3) 193*eece5764SJiajie Chen FIELD(CSR_DMW_64, VSEG, 60, 4) 194398cecb9SXiaojuan Yang 195398cecb9SXiaojuan Yang /* Debug CSRs */ 196398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DBG 0x500 /* debug config */ 197398cecb9SXiaojuan Yang FIELD(CSR_DBG, DST, 0, 1) 198398cecb9SXiaojuan Yang FIELD(CSR_DBG, DREV, 1, 7) 199398cecb9SXiaojuan Yang FIELD(CSR_DBG, DEI, 8, 1) 200398cecb9SXiaojuan Yang FIELD(CSR_DBG, DCL, 9, 1) 201398cecb9SXiaojuan Yang FIELD(CSR_DBG, DFW, 10, 1) 202398cecb9SXiaojuan Yang FIELD(CSR_DBG, DMW, 11, 1) 203398cecb9SXiaojuan Yang FIELD(CSR_DBG, ECODE, 16, 6) 204398cecb9SXiaojuan Yang 205398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DERA 0x501 /* Debug era */ 206398cecb9SXiaojuan Yang #define LOONGARCH_CSR_DSAVE 0x502 /* Debug save */ 207398cecb9SXiaojuan Yang 208398cecb9SXiaojuan Yang #endif /* LOONGARCH_CPU_CSR_H */ 209