1 /* 2 * QEMU RISC-V CPU CFG 3 * 4 * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu 5 * Copyright (c) 2017-2018 SiFive, Inc. 6 * Copyright (c) 2021-2023 PLCT Lab 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms and conditions of the GNU General Public License, 10 * version 2 or later, as published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along with 18 * this program. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #ifndef RISCV_CPU_CFG_H 22 #define RISCV_CPU_CFG_H 23 24 /* 25 * map is a 16-bit bitmap: the most significant set bit in map is the maximum 26 * satp mode that is supported. It may be chosen by the user and must respect 27 * what qemu implements (valid_1_10_32/64) and what the hw is capable of 28 * (supported bitmap below). 29 * 30 * init is a 16-bit bitmap used to make sure the user selected a correct 31 * configuration as per the specification. 32 * 33 * supported is a 16-bit bitmap used to reflect the hw capabilities. 34 */ 35 typedef struct { 36 uint16_t map, init, supported; 37 } RISCVSATPMap; 38 39 struct RISCVCPUConfig { 40 bool ext_zba; 41 bool ext_zbb; 42 bool ext_zbc; 43 bool ext_zbkb; 44 bool ext_zbkc; 45 bool ext_zbkx; 46 bool ext_zbs; 47 bool ext_zca; 48 bool ext_zcb; 49 bool ext_zcd; 50 bool ext_zce; 51 bool ext_zcf; 52 bool ext_zcmp; 53 bool ext_zcmt; 54 bool ext_zk; 55 bool ext_zkn; 56 bool ext_zknd; 57 bool ext_zkne; 58 bool ext_zknh; 59 bool ext_zkr; 60 bool ext_zks; 61 bool ext_zksed; 62 bool ext_zksh; 63 bool ext_zkt; 64 bool ext_zifencei; 65 bool ext_zicntr; 66 bool ext_zicsr; 67 bool ext_zicbom; 68 bool ext_zicbop; 69 bool ext_zicboz; 70 bool ext_zicond; 71 bool ext_zihintntl; 72 bool ext_zihintpause; 73 bool ext_zihpm; 74 bool ext_smstateen; 75 bool ext_sstc; 76 bool ext_svadu; 77 bool ext_svinval; 78 bool ext_svnapot; 79 bool ext_svpbmt; 80 bool ext_zdinx; 81 bool ext_zaamo; 82 bool ext_zacas; 83 bool ext_zalrsc; 84 bool ext_zawrs; 85 bool ext_zfa; 86 bool ext_zfbfmin; 87 bool ext_zfh; 88 bool ext_zfhmin; 89 bool ext_zfinx; 90 bool ext_zhinx; 91 bool ext_zhinxmin; 92 bool ext_zve32f; 93 bool ext_zve64f; 94 bool ext_zve64d; 95 bool ext_zvbb; 96 bool ext_zvbc; 97 bool ext_zvkb; 98 bool ext_zvkg; 99 bool ext_zvkned; 100 bool ext_zvknha; 101 bool ext_zvknhb; 102 bool ext_zvksed; 103 bool ext_zvksh; 104 bool ext_zvkt; 105 bool ext_zvkn; 106 bool ext_zvknc; 107 bool ext_zvkng; 108 bool ext_zvks; 109 bool ext_zvksc; 110 bool ext_zvksg; 111 bool ext_zmmul; 112 bool ext_zvfbfmin; 113 bool ext_zvfbfwma; 114 bool ext_zvfh; 115 bool ext_zvfhmin; 116 bool ext_smaia; 117 bool ext_ssaia; 118 bool ext_sscofpmf; 119 bool ext_smepmp; 120 bool rvv_ta_all_1s; 121 bool rvv_ma_all_1s; 122 123 uint32_t mvendorid; 124 uint64_t marchid; 125 uint64_t mimpid; 126 127 /* Named features */ 128 bool ext_svade; 129 bool ext_zic64b; 130 131 /* 132 * Always 'true' boolean for named features 133 * TCG always implement/can't be disabled. 134 */ 135 bool ext_always_enabled; 136 137 /* Vendor-specific custom extensions */ 138 bool ext_xtheadba; 139 bool ext_xtheadbb; 140 bool ext_xtheadbs; 141 bool ext_xtheadcmo; 142 bool ext_xtheadcondmov; 143 bool ext_xtheadfmemidx; 144 bool ext_xtheadfmv; 145 bool ext_xtheadmac; 146 bool ext_xtheadmemidx; 147 bool ext_xtheadmempair; 148 bool ext_xtheadsync; 149 bool ext_XVentanaCondOps; 150 151 uint32_t pmu_mask; 152 uint16_t vlenb; 153 uint16_t elen; 154 uint16_t cbom_blocksize; 155 uint16_t cbop_blocksize; 156 uint16_t cboz_blocksize; 157 bool mmu; 158 bool pmp; 159 bool debug; 160 bool misa_w; 161 162 bool short_isa_string; 163 164 #ifndef CONFIG_USER_ONLY 165 RISCVSATPMap satp_mode; 166 #endif 167 }; 168 169 typedef struct RISCVCPUConfig RISCVCPUConfig; 170 171 /* Helper functions to test for extensions. */ 172 173 static inline bool always_true_p(const RISCVCPUConfig *cfg __attribute__((__unused__))) 174 { 175 return true; 176 } 177 178 static inline bool has_xthead_p(const RISCVCPUConfig *cfg) 179 { 180 return cfg->ext_xtheadba || cfg->ext_xtheadbb || 181 cfg->ext_xtheadbs || cfg->ext_xtheadcmo || 182 cfg->ext_xtheadcondmov || 183 cfg->ext_xtheadfmemidx || cfg->ext_xtheadfmv || 184 cfg->ext_xtheadmac || cfg->ext_xtheadmemidx || 185 cfg->ext_xtheadmempair || cfg->ext_xtheadsync; 186 } 187 188 #define MATERIALISE_EXT_PREDICATE(ext) \ 189 static inline bool has_ ## ext ## _p(const RISCVCPUConfig *cfg) \ 190 { \ 191 return cfg->ext_ ## ext ; \ 192 } 193 194 MATERIALISE_EXT_PREDICATE(xtheadba) 195 MATERIALISE_EXT_PREDICATE(xtheadbb) 196 MATERIALISE_EXT_PREDICATE(xtheadbs) 197 MATERIALISE_EXT_PREDICATE(xtheadcmo) 198 MATERIALISE_EXT_PREDICATE(xtheadcondmov) 199 MATERIALISE_EXT_PREDICATE(xtheadfmemidx) 200 MATERIALISE_EXT_PREDICATE(xtheadfmv) 201 MATERIALISE_EXT_PREDICATE(xtheadmac) 202 MATERIALISE_EXT_PREDICATE(xtheadmemidx) 203 MATERIALISE_EXT_PREDICATE(xtheadmempair) 204 MATERIALISE_EXT_PREDICATE(xtheadsync) 205 MATERIALISE_EXT_PREDICATE(XVentanaCondOps) 206 207 #endif 208