Skip to content

Commit

Permalink
target/riscv: Use official extension names for AIA CSRs
Browse files Browse the repository at this point in the history
The arch review of AIA spec is completed and we now have official
extension names for AIA: Smaia (M-mode AIA CSRs) and Ssaia (S-mode
AIA CSRs).

Refer, section 1.6 of the latest AIA v0.3.1 stable specification at
https://github.com/riscv/riscv-aia/releases/download/0.3.1-draft.32/riscv-interrupts-032.pdf)

Based on above, we update QEMU RISC-V to:
1) Have separate config options for Smaia and Ssaia extensions
   which replace RISCV_FEATURE_AIA in CPU features
2) Not generate AIA INTC compatible string in virt machine

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-id: 20220820042958.377018-1-apatel@ventanamicro.com
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
  • Loading branch information
avpatel authored and alistair23 committed Sep 7, 2022
1 parent e0dea2f commit dc9acc9
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 26 deletions.
4 changes: 3 additions & 1 deletion hw/intc/riscv_imsic.c
Expand Up @@ -344,9 +344,11 @@ static void riscv_imsic_realize(DeviceState *dev, Error **errp)

/* Force select AIA feature and setup CSR read-modify-write callback */
if (env) {
riscv_set_feature(env, RISCV_FEATURE_AIA);
if (!imsic->mmode) {
rcpu->cfg.ext_ssaia = true;
riscv_cpu_set_geilen(env, imsic->num_pages - 1);
} else {
rcpu->cfg.ext_smaia = true;
}
riscv_cpu_set_aia_ireg_rmw_fn(env, (imsic->mmode) ? PRV_M : PRV_S,
riscv_imsic_rmw, imsic);
Expand Down
13 changes: 2 additions & 11 deletions hw/riscv/virt.c
Expand Up @@ -260,17 +260,8 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket,
qemu_fdt_add_subnode(mc->fdt, intc_name);
qemu_fdt_setprop_cell(mc->fdt, intc_name, "phandle",
intc_phandles[cpu]);
if (riscv_feature(&s->soc[socket].harts[cpu].env,
RISCV_FEATURE_AIA)) {
static const char * const compat[2] = {
"riscv,cpu-intc-aia", "riscv,cpu-intc"
};
qemu_fdt_setprop_string_array(mc->fdt, intc_name, "compatible",
(char **)&compat, ARRAY_SIZE(compat));
} else {
qemu_fdt_setprop_string(mc->fdt, intc_name, "compatible",
"riscv,cpu-intc");
}
qemu_fdt_setprop_string(mc->fdt, intc_name, "compatible",
"riscv,cpu-intc");
qemu_fdt_setprop(mc->fdt, intc_name, "interrupt-controller", NULL, 0);
qemu_fdt_setprop_cell(mc->fdt, intc_name, "#interrupt-cells", 1);

Expand Down
9 changes: 4 additions & 5 deletions target/riscv/cpu.c
Expand Up @@ -99,6 +99,8 @@ static const struct isa_ext_data isa_edata_arr[] = {
ISA_EXT_DATA_ENTRY(zve64f, true, PRIV_VERSION_1_12_0, ext_zve64f),
ISA_EXT_DATA_ENTRY(zhinx, true, PRIV_VERSION_1_12_0, ext_zhinx),
ISA_EXT_DATA_ENTRY(zhinxmin, true, PRIV_VERSION_1_12_0, ext_zhinxmin),
ISA_EXT_DATA_ENTRY(smaia, true, PRIV_VERSION_1_12_0, ext_smaia),
ISA_EXT_DATA_ENTRY(ssaia, true, PRIV_VERSION_1_12_0, ext_ssaia),
ISA_EXT_DATA_ENTRY(svinval, true, PRIV_VERSION_1_12_0, ext_svinval),
ISA_EXT_DATA_ENTRY(svnapot, true, PRIV_VERSION_1_12_0, ext_svnapot),
ISA_EXT_DATA_ENTRY(svpbmt, true, PRIV_VERSION_1_12_0, ext_svpbmt),
Expand Down Expand Up @@ -666,10 +668,6 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
}
}

if (cpu->cfg.aia) {
riscv_set_feature(env, RISCV_FEATURE_AIA);
}

if (cpu->cfg.debug) {
riscv_set_feature(env, RISCV_FEATURE_DEBUG);
}
Expand Down Expand Up @@ -1038,7 +1036,8 @@ static Property riscv_cpu_extensions[] = {
DEFINE_PROP_BOOL("x-j", RISCVCPU, cfg.ext_j, false),
/* ePMP 0.9.3 */
DEFINE_PROP_BOOL("x-epmp", RISCVCPU, cfg.epmp, false),
DEFINE_PROP_BOOL("x-aia", RISCVCPU, cfg.aia, false),
DEFINE_PROP_BOOL("x-smaia", RISCVCPU, cfg.ext_smaia, false),
DEFINE_PROP_BOOL("x-ssaia", RISCVCPU, cfg.ext_ssaia, false),

DEFINE_PROP_END_OF_LIST(),
};
Expand Down
4 changes: 2 additions & 2 deletions target/riscv/cpu.h
Expand Up @@ -85,7 +85,6 @@ enum {
RISCV_FEATURE_PMP,
RISCV_FEATURE_EPMP,
RISCV_FEATURE_MISA,
RISCV_FEATURE_AIA,
RISCV_FEATURE_DEBUG
};

Expand Down Expand Up @@ -439,6 +438,8 @@ struct RISCVCPUConfig {
bool ext_zve32f;
bool ext_zve64f;
bool ext_zmmul;
bool ext_smaia;
bool ext_ssaia;
bool rvv_ta_all_1s;
bool rvv_ma_all_1s;

Expand All @@ -459,7 +460,6 @@ struct RISCVCPUConfig {
bool mmu;
bool pmp;
bool epmp;
bool aia;
bool debug;
uint64_t resetvec;

Expand Down
3 changes: 2 additions & 1 deletion target/riscv/cpu_helper.c
Expand Up @@ -307,6 +307,7 @@ static int riscv_cpu_pending_to_irq(CPURISCVState *env,
int extirq, unsigned int extirq_def_prio,
uint64_t pending, uint8_t *iprio)
{
RISCVCPU *cpu = env_archcpu(env);
int irq, best_irq = RISCV_EXCP_NONE;
unsigned int prio, best_prio = UINT_MAX;

Expand All @@ -315,7 +316,7 @@ static int riscv_cpu_pending_to_irq(CPURISCVState *env,
}

irq = ctz64(pending);
if (!riscv_feature(env, RISCV_FEATURE_AIA)) {
if (!((extirq == IRQ_M_EXT) ? cpu->cfg.ext_smaia : cpu->cfg.ext_ssaia)) {
return irq;
}

Expand Down
24 changes: 18 additions & 6 deletions target/riscv/csr.c
Expand Up @@ -257,7 +257,9 @@ static RISCVException any32(CPURISCVState *env, int csrno)

static int aia_any(CPURISCVState *env, int csrno)
{
if (!riscv_feature(env, RISCV_FEATURE_AIA)) {
RISCVCPU *cpu = env_archcpu(env);

if (!cpu->cfg.ext_smaia) {
return RISCV_EXCP_ILLEGAL_INST;
}

Expand All @@ -266,7 +268,9 @@ static int aia_any(CPURISCVState *env, int csrno)

static int aia_any32(CPURISCVState *env, int csrno)
{
if (!riscv_feature(env, RISCV_FEATURE_AIA)) {
RISCVCPU *cpu = env_archcpu(env);

if (!cpu->cfg.ext_smaia) {
return RISCV_EXCP_ILLEGAL_INST;
}

Expand All @@ -293,7 +297,9 @@ static int smode32(CPURISCVState *env, int csrno)

static int aia_smode(CPURISCVState *env, int csrno)
{
if (!riscv_feature(env, RISCV_FEATURE_AIA)) {
RISCVCPU *cpu = env_archcpu(env);

if (!cpu->cfg.ext_ssaia) {
return RISCV_EXCP_ILLEGAL_INST;
}

Expand All @@ -302,7 +308,9 @@ static int aia_smode(CPURISCVState *env, int csrno)

static int aia_smode32(CPURISCVState *env, int csrno)
{
if (!riscv_feature(env, RISCV_FEATURE_AIA)) {
RISCVCPU *cpu = env_archcpu(env);

if (!cpu->cfg.ext_ssaia) {
return RISCV_EXCP_ILLEGAL_INST;
}

Expand Down Expand Up @@ -358,7 +366,9 @@ static RISCVException pointer_masking(CPURISCVState *env, int csrno)

static int aia_hmode(CPURISCVState *env, int csrno)
{
if (!riscv_feature(env, RISCV_FEATURE_AIA)) {
RISCVCPU *cpu = env_archcpu(env);

if (!cpu->cfg.ext_ssaia) {
return RISCV_EXCP_ILLEGAL_INST;
}

Expand All @@ -367,7 +377,9 @@ static int aia_hmode(CPURISCVState *env, int csrno)

static int aia_hmode32(CPURISCVState *env, int csrno)
{
if (!riscv_feature(env, RISCV_FEATURE_AIA)) {
RISCVCPU *cpu = env_archcpu(env);

if (!cpu->cfg.ext_ssaia) {
return RISCV_EXCP_ILLEGAL_INST;
}

Expand Down

0 comments on commit dc9acc9

Please sign in to comment.