69b3849bff
Using a mask instead of the number of PMU devices supports the accurate emulation of platforms that have a discontinuous set of PMU counters. The "pmu-num" property now generates a warning when used by the user on the command line. Rather than storing the value for "pmu-num" convert it directly to the mask if it is specified (overwriting the default "pmu-mask" value) likewise the value is calculated from the mask if the property value is obtained. In the unusual situation that both "pmu-mask" and "pmu-num" are provided then then the order on the command line determines which takes precedence (later overwriting earlier.) Signed-off-by: Rob Bradford <rbradford@rivosinc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20231031154000.18134-5-rbradford@rivosinc.com> [Changes by AF - Fixup ext_zihpm logic after rebase ] Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
197 lines
4.8 KiB
C
197 lines
4.8 KiB
C
/*
|
|
* QEMU RISC-V CPU CFG
|
|
*
|
|
* Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu
|
|
* Copyright (c) 2017-2018 SiFive, Inc.
|
|
* Copyright (c) 2021-2023 PLCT Lab
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2 or later, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef RISCV_CPU_CFG_H
|
|
#define RISCV_CPU_CFG_H
|
|
|
|
/*
|
|
* map is a 16-bit bitmap: the most significant set bit in map is the maximum
|
|
* satp mode that is supported. It may be chosen by the user and must respect
|
|
* what qemu implements (valid_1_10_32/64) and what the hw is capable of
|
|
* (supported bitmap below).
|
|
*
|
|
* init is a 16-bit bitmap used to make sure the user selected a correct
|
|
* configuration as per the specification.
|
|
*
|
|
* supported is a 16-bit bitmap used to reflect the hw capabilities.
|
|
*/
|
|
typedef struct {
|
|
uint16_t map, init, supported;
|
|
} RISCVSATPMap;
|
|
|
|
struct RISCVCPUConfig {
|
|
bool ext_zba;
|
|
bool ext_zbb;
|
|
bool ext_zbc;
|
|
bool ext_zbkb;
|
|
bool ext_zbkc;
|
|
bool ext_zbkx;
|
|
bool ext_zbs;
|
|
bool ext_zca;
|
|
bool ext_zcb;
|
|
bool ext_zcd;
|
|
bool ext_zce;
|
|
bool ext_zcf;
|
|
bool ext_zcmp;
|
|
bool ext_zcmt;
|
|
bool ext_zk;
|
|
bool ext_zkn;
|
|
bool ext_zknd;
|
|
bool ext_zkne;
|
|
bool ext_zknh;
|
|
bool ext_zkr;
|
|
bool ext_zks;
|
|
bool ext_zksed;
|
|
bool ext_zksh;
|
|
bool ext_zkt;
|
|
bool ext_zifencei;
|
|
bool ext_zicntr;
|
|
bool ext_zicsr;
|
|
bool ext_zicbom;
|
|
bool ext_zicboz;
|
|
bool ext_zicond;
|
|
bool ext_zihintntl;
|
|
bool ext_zihintpause;
|
|
bool ext_zihpm;
|
|
bool ext_smstateen;
|
|
bool ext_sstc;
|
|
bool ext_svadu;
|
|
bool ext_svinval;
|
|
bool ext_svnapot;
|
|
bool ext_svpbmt;
|
|
bool ext_zdinx;
|
|
bool ext_zawrs;
|
|
bool ext_zfa;
|
|
bool ext_zfbfmin;
|
|
bool ext_zfh;
|
|
bool ext_zfhmin;
|
|
bool ext_zfinx;
|
|
bool ext_zhinx;
|
|
bool ext_zhinxmin;
|
|
bool ext_zve32f;
|
|
bool ext_zve64f;
|
|
bool ext_zve64d;
|
|
bool ext_zvbb;
|
|
bool ext_zvbc;
|
|
bool ext_zvkb;
|
|
bool ext_zvkg;
|
|
bool ext_zvkned;
|
|
bool ext_zvknha;
|
|
bool ext_zvknhb;
|
|
bool ext_zvksed;
|
|
bool ext_zvksh;
|
|
bool ext_zvkt;
|
|
bool ext_zvkn;
|
|
bool ext_zvknc;
|
|
bool ext_zvkng;
|
|
bool ext_zvks;
|
|
bool ext_zvksc;
|
|
bool ext_zvksg;
|
|
bool ext_zmmul;
|
|
bool ext_zvfbfmin;
|
|
bool ext_zvfbfwma;
|
|
bool ext_zvfh;
|
|
bool ext_zvfhmin;
|
|
bool ext_smaia;
|
|
bool ext_ssaia;
|
|
bool ext_sscofpmf;
|
|
bool ext_smepmp;
|
|
bool rvv_ta_all_1s;
|
|
bool rvv_ma_all_1s;
|
|
|
|
uint32_t mvendorid;
|
|
uint64_t marchid;
|
|
uint64_t mimpid;
|
|
|
|
/* Vendor-specific custom extensions */
|
|
bool ext_xtheadba;
|
|
bool ext_xtheadbb;
|
|
bool ext_xtheadbs;
|
|
bool ext_xtheadcmo;
|
|
bool ext_xtheadcondmov;
|
|
bool ext_xtheadfmemidx;
|
|
bool ext_xtheadfmv;
|
|
bool ext_xtheadmac;
|
|
bool ext_xtheadmemidx;
|
|
bool ext_xtheadmempair;
|
|
bool ext_xtheadsync;
|
|
bool ext_XVentanaCondOps;
|
|
|
|
uint32_t pmu_mask;
|
|
char *priv_spec;
|
|
char *user_spec;
|
|
char *bext_spec;
|
|
char *vext_spec;
|
|
uint16_t vlen;
|
|
uint16_t elen;
|
|
uint16_t cbom_blocksize;
|
|
uint16_t cboz_blocksize;
|
|
bool mmu;
|
|
bool pmp;
|
|
bool debug;
|
|
bool misa_w;
|
|
|
|
bool short_isa_string;
|
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
RISCVSATPMap satp_mode;
|
|
#endif
|
|
};
|
|
|
|
typedef struct RISCVCPUConfig RISCVCPUConfig;
|
|
|
|
/* Helper functions to test for extensions. */
|
|
|
|
static inline bool always_true_p(const RISCVCPUConfig *cfg __attribute__((__unused__)))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
static inline bool has_xthead_p(const RISCVCPUConfig *cfg)
|
|
{
|
|
return cfg->ext_xtheadba || cfg->ext_xtheadbb ||
|
|
cfg->ext_xtheadbs || cfg->ext_xtheadcmo ||
|
|
cfg->ext_xtheadcondmov ||
|
|
cfg->ext_xtheadfmemidx || cfg->ext_xtheadfmv ||
|
|
cfg->ext_xtheadmac || cfg->ext_xtheadmemidx ||
|
|
cfg->ext_xtheadmempair || cfg->ext_xtheadsync;
|
|
}
|
|
|
|
#define MATERIALISE_EXT_PREDICATE(ext) \
|
|
static inline bool has_ ## ext ## _p(const RISCVCPUConfig *cfg) \
|
|
{ \
|
|
return cfg->ext_ ## ext ; \
|
|
}
|
|
|
|
MATERIALISE_EXT_PREDICATE(xtheadba)
|
|
MATERIALISE_EXT_PREDICATE(xtheadbb)
|
|
MATERIALISE_EXT_PREDICATE(xtheadbs)
|
|
MATERIALISE_EXT_PREDICATE(xtheadcmo)
|
|
MATERIALISE_EXT_PREDICATE(xtheadcondmov)
|
|
MATERIALISE_EXT_PREDICATE(xtheadfmemidx)
|
|
MATERIALISE_EXT_PREDICATE(xtheadfmv)
|
|
MATERIALISE_EXT_PREDICATE(xtheadmac)
|
|
MATERIALISE_EXT_PREDICATE(xtheadmemidx)
|
|
MATERIALISE_EXT_PREDICATE(xtheadmempair)
|
|
MATERIALISE_EXT_PREDICATE(xtheadsync)
|
|
MATERIALISE_EXT_PREDICATE(XVentanaCondOps)
|
|
|
|
#endif
|