xref: /qemu/target/riscv/cpu_cfg.h (revision 1aef44805df33f3f6e6302984660f4ea6b31fb3e)
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_zimop;
75      bool ext_zcmop;
76      bool ext_ztso;
77      bool ext_smstateen;
78      bool ext_sstc;
79      bool ext_smcntrpmf;
80      bool ext_svadu;
81      bool ext_svinval;
82      bool ext_svnapot;
83      bool ext_svpbmt;
84      bool ext_zdinx;
85      bool ext_zaamo;
86      bool ext_zacas;
87      bool ext_zama16b;
88      bool ext_zabha;
89      bool ext_zalrsc;
90      bool ext_zawrs;
91      bool ext_zfa;
92      bool ext_zfbfmin;
93      bool ext_zfh;
94      bool ext_zfhmin;
95      bool ext_zfinx;
96      bool ext_zhinx;
97      bool ext_zhinxmin;
98      bool ext_zve32f;
99      bool ext_zve32x;
100      bool ext_zve64f;
101      bool ext_zve64d;
102      bool ext_zve64x;
103      bool ext_zvbb;
104      bool ext_zvbc;
105      bool ext_zvkb;
106      bool ext_zvkg;
107      bool ext_zvkned;
108      bool ext_zvknha;
109      bool ext_zvknhb;
110      bool ext_zvksed;
111      bool ext_zvksh;
112      bool ext_zvkt;
113      bool ext_zvkn;
114      bool ext_zvknc;
115      bool ext_zvkng;
116      bool ext_zvks;
117      bool ext_zvksc;
118      bool ext_zvksg;
119      bool ext_zmmul;
120      bool ext_zvfbfmin;
121      bool ext_zvfbfwma;
122      bool ext_zvfh;
123      bool ext_zvfhmin;
124      bool ext_smaia;
125      bool ext_ssaia;
126      bool ext_sscofpmf;
127      bool ext_smepmp;
128      bool rvv_ta_all_1s;
129      bool rvv_ma_all_1s;
130  
131      uint32_t mvendorid;
132      uint64_t marchid;
133      uint64_t mimpid;
134  
135      /* Named features  */
136      bool ext_svade;
137      bool ext_zic64b;
138  
139      /*
140       * Always 'true' booleans for named features
141       * TCG always implement/can't be user disabled,
142       * based on spec version.
143       */
144      bool has_priv_1_13;
145      bool has_priv_1_12;
146      bool has_priv_1_11;
147  
148      /* Vendor-specific custom extensions */
149      bool ext_xtheadba;
150      bool ext_xtheadbb;
151      bool ext_xtheadbs;
152      bool ext_xtheadcmo;
153      bool ext_xtheadcondmov;
154      bool ext_xtheadfmemidx;
155      bool ext_xtheadfmv;
156      bool ext_xtheadmac;
157      bool ext_xtheadmemidx;
158      bool ext_xtheadmempair;
159      bool ext_xtheadsync;
160      bool ext_XVentanaCondOps;
161  
162      uint32_t pmu_mask;
163      uint16_t vlenb;
164      uint16_t elen;
165      uint16_t cbom_blocksize;
166      uint16_t cbop_blocksize;
167      uint16_t cboz_blocksize;
168      bool mmu;
169      bool pmp;
170      bool debug;
171      bool misa_w;
172  
173      bool short_isa_string;
174  
175  #ifndef CONFIG_USER_ONLY
176      RISCVSATPMap satp_mode;
177  #endif
178  };
179  
180  typedef struct RISCVCPUConfig RISCVCPUConfig;
181  
182  /* Helper functions to test for extensions.  */
183  
184  static inline bool always_true_p(const RISCVCPUConfig *cfg __attribute__((__unused__)))
185  {
186      return true;
187  }
188  
189  static inline bool has_xthead_p(const RISCVCPUConfig *cfg)
190  {
191      return cfg->ext_xtheadba || cfg->ext_xtheadbb ||
192             cfg->ext_xtheadbs || cfg->ext_xtheadcmo ||
193             cfg->ext_xtheadcondmov ||
194             cfg->ext_xtheadfmemidx || cfg->ext_xtheadfmv ||
195             cfg->ext_xtheadmac || cfg->ext_xtheadmemidx ||
196             cfg->ext_xtheadmempair || cfg->ext_xtheadsync;
197  }
198  
199  #define MATERIALISE_EXT_PREDICATE(ext) \
200      static inline bool has_ ## ext ## _p(const RISCVCPUConfig *cfg) \
201      { \
202          return cfg->ext_ ## ext ; \
203      }
204  
205  MATERIALISE_EXT_PREDICATE(xtheadba)
206  MATERIALISE_EXT_PREDICATE(xtheadbb)
207  MATERIALISE_EXT_PREDICATE(xtheadbs)
208  MATERIALISE_EXT_PREDICATE(xtheadcmo)
209  MATERIALISE_EXT_PREDICATE(xtheadcondmov)
210  MATERIALISE_EXT_PREDICATE(xtheadfmemidx)
211  MATERIALISE_EXT_PREDICATE(xtheadfmv)
212  MATERIALISE_EXT_PREDICATE(xtheadmac)
213  MATERIALISE_EXT_PREDICATE(xtheadmemidx)
214  MATERIALISE_EXT_PREDICATE(xtheadmempair)
215  MATERIALISE_EXT_PREDICATE(xtheadsync)
216  MATERIALISE_EXT_PREDICATE(XVentanaCondOps)
217  
218  #endif
219