xref: /openbmc/qemu/target/riscv/cpu_cfg.h (revision a0952c15)
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