Message ID | 20231025200713.580814-14-sunilvl@ventanamicro.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | RISC-V: ACPI: Enable AIA, PLIC and update RHCT | expand |
On Thu, Oct 26, 2023 at 6:15 AM Sunil V L <sunilvl@ventanamicro.com> wrote: > > Add PLIC structures for each socket in the MADT when system is > configured with PLIC as the external interrupt controller. > > Signed-off-by: Haibo Xu <haibo1.xu@intel.com> > Signed-off-by: Sunil V L <sunilvl@ventanamicro.com> > Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Acked-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > hw/riscv/virt-acpi-build.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c > index c410fe7d5c..cc934a5c4b 100644 > --- a/hw/riscv/virt-acpi-build.c > +++ b/hw/riscv/virt-acpi-build.c > @@ -85,6 +85,12 @@ static void riscv_acpi_madt_add_rintc(uint32_t uid, > arch_ids->cpus[uid].props.node_id, > local_cpu_id), > 4); > + } else if (aia_type == VIRT_AIA_TYPE_NONE) { > + build_append_int_noprefix(entry, > + ACPI_BUILD_INTC_ID( > + arch_ids->cpus[uid].props.node_id, > + 2 * local_cpu_id + 1), > + 4); > } else { > build_append_int_noprefix(entry, 0, 4); > } > @@ -515,6 +521,29 @@ static void build_madt(GArray *table_data, > build_append_int_noprefix(table_data, > s->memmap[VIRT_APLIC_S].size, 4); > } > + } else { > + /* PLICs */ > + for (socket = 0; socket < riscv_socket_count(ms); socket++) { > + aplic_addr = s->memmap[VIRT_PLIC].base + > + s->memmap[VIRT_PLIC].size * socket; > + gsi_base = VIRT_IRQCHIP_NUM_SOURCES * socket; > + build_append_int_noprefix(table_data, 0x1B, 1); /* Type */ > + build_append_int_noprefix(table_data, 36, 1); /* Length */ > + build_append_int_noprefix(table_data, 1, 1); /* Version */ > + build_append_int_noprefix(table_data, socket, 1); /* PLIC ID */ > + build_append_int_noprefix(table_data, 0, 8); /* Hardware ID */ > + /* Total External Interrupt Sources Supported */ > + build_append_int_noprefix(table_data, > + VIRT_IRQCHIP_NUM_SOURCES - 1, 2); > + build_append_int_noprefix(table_data, 0, 2); /* Max Priority */ > + build_append_int_noprefix(table_data, 0, 4); /* Flags */ > + /* PLIC Size */ > + build_append_int_noprefix(table_data, s->memmap[VIRT_PLIC].size, 4); > + /* PLIC Address */ > + build_append_int_noprefix(table_data, aplic_addr, 8); > + /* Global System Interrupt Vector Base */ > + build_append_int_noprefix(table_data, gsi_base, 4); > + } > } > > acpi_table_end(linker, &table); > -- > 2.39.2 > >
diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index c410fe7d5c..cc934a5c4b 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -85,6 +85,12 @@ static void riscv_acpi_madt_add_rintc(uint32_t uid, arch_ids->cpus[uid].props.node_id, local_cpu_id), 4); + } else if (aia_type == VIRT_AIA_TYPE_NONE) { + build_append_int_noprefix(entry, + ACPI_BUILD_INTC_ID( + arch_ids->cpus[uid].props.node_id, + 2 * local_cpu_id + 1), + 4); } else { build_append_int_noprefix(entry, 0, 4); } @@ -515,6 +521,29 @@ static void build_madt(GArray *table_data, build_append_int_noprefix(table_data, s->memmap[VIRT_APLIC_S].size, 4); } + } else { + /* PLICs */ + for (socket = 0; socket < riscv_socket_count(ms); socket++) { + aplic_addr = s->memmap[VIRT_PLIC].base + + s->memmap[VIRT_PLIC].size * socket; + gsi_base = VIRT_IRQCHIP_NUM_SOURCES * socket; + build_append_int_noprefix(table_data, 0x1B, 1); /* Type */ + build_append_int_noprefix(table_data, 36, 1); /* Length */ + build_append_int_noprefix(table_data, 1, 1); /* Version */ + build_append_int_noprefix(table_data, socket, 1); /* PLIC ID */ + build_append_int_noprefix(table_data, 0, 8); /* Hardware ID */ + /* Total External Interrupt Sources Supported */ + build_append_int_noprefix(table_data, + VIRT_IRQCHIP_NUM_SOURCES - 1, 2); + build_append_int_noprefix(table_data, 0, 2); /* Max Priority */ + build_append_int_noprefix(table_data, 0, 4); /* Flags */ + /* PLIC Size */ + build_append_int_noprefix(table_data, s->memmap[VIRT_PLIC].size, 4); + /* PLIC Address */ + build_append_int_noprefix(table_data, aplic_addr, 8); + /* Global System Interrupt Vector Base */ + build_append_int_noprefix(table_data, gsi_base, 4); + } } acpi_table_end(linker, &table);