Message ID | 20231019132648.23703-7-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 19, 2023 at 06:56:42PM +0530, Sunil V L wrote: > Add APLIC structures for each socket in the MADT when system is configured > with APLIC as the external wired interrupt controller. > > Signed-off-by: Sunil V L <sunilvl@ventanamicro.com> > Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > --- > hw/riscv/virt-acpi-build.c | 36 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 34 insertions(+), 2 deletions(-) > Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
On Thu, Oct 19, 2023 at 11:29 PM Sunil V L <sunilvl@ventanamicro.com> wrote: > > Add APLIC structures for each socket in the MADT when system is configured > with APLIC as the external wired interrupt controller. > > Signed-off-by: Sunil V L <sunilvl@ventanamicro.com> > Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Acked-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > hw/riscv/virt-acpi-build.c | 36 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 34 insertions(+), 2 deletions(-) > > diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c > index 7f1a370e54..8fa358d034 100644 > --- a/hw/riscv/virt-acpi-build.c > +++ b/hw/riscv/virt-acpi-build.c > @@ -277,9 +277,9 @@ static void build_madt(GArray *table_data, > MachineClass *mc = MACHINE_GET_CLASS(s); > MachineState *ms = MACHINE(s); > const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); > - uint64_t imsic_socket_addr, imsic_addr; > + uint64_t imsic_socket_addr, imsic_addr, aplic_addr; > + uint32_t imsic_size, gsi_base; > uint8_t guest_index_bits; > - uint32_t imsic_size; > uint32_t local_cpu_id, socket_id; > uint8_t hart_index_bits, group_index_bits, group_index_shift; > uint16_t imsic_max_hart_per_socket = 0; > @@ -341,6 +341,38 @@ static void build_madt(GArray *table_data, > build_append_int_noprefix(table_data, group_index_shift, 1); > } > > + if (s->aia_type != VIRT_AIA_TYPE_NONE) { > + /* APLICs */ > + for (socket = 0; socket < riscv_socket_count(ms); socket++) { > + aplic_addr = s->memmap[VIRT_APLIC_S].base + > + s->memmap[VIRT_APLIC_S].size * socket; > + gsi_base = VIRT_IRQCHIP_NUM_SOURCES * socket; > + build_append_int_noprefix(table_data, 0x1A, 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); /* APLIC ID */ > + build_append_int_noprefix(table_data, 0, 4); /* Flags */ > + build_append_int_noprefix(table_data, 0, 8); /* Hardware ID */ > + /* Number of IDCs */ > + if (s->aia_type == VIRT_AIA_TYPE_APLIC) { > + build_append_int_noprefix(table_data, > + s->soc[socket].num_harts, > + 2); > + } else { > + build_append_int_noprefix(table_data, 0, 2); > + } > + /* Total External Interrupt Sources Supported */ > + build_append_int_noprefix(table_data, VIRT_IRQCHIP_NUM_SOURCES, 2); > + /* Global System Interrupt Base */ > + build_append_int_noprefix(table_data, gsi_base, 4); > + /* APLIC Address */ > + build_append_int_noprefix(table_data, aplic_addr, 8); > + /* APLIC size */ > + build_append_int_noprefix(table_data, > + s->memmap[VIRT_APLIC_S].size, 4); > + } > + } > + > acpi_table_end(linker, &table); > } > > -- > 2.34.1 > >
diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index 7f1a370e54..8fa358d034 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -277,9 +277,9 @@ static void build_madt(GArray *table_data, MachineClass *mc = MACHINE_GET_CLASS(s); MachineState *ms = MACHINE(s); const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); - uint64_t imsic_socket_addr, imsic_addr; + uint64_t imsic_socket_addr, imsic_addr, aplic_addr; + uint32_t imsic_size, gsi_base; uint8_t guest_index_bits; - uint32_t imsic_size; uint32_t local_cpu_id, socket_id; uint8_t hart_index_bits, group_index_bits, group_index_shift; uint16_t imsic_max_hart_per_socket = 0; @@ -341,6 +341,38 @@ static void build_madt(GArray *table_data, build_append_int_noprefix(table_data, group_index_shift, 1); } + if (s->aia_type != VIRT_AIA_TYPE_NONE) { + /* APLICs */ + for (socket = 0; socket < riscv_socket_count(ms); socket++) { + aplic_addr = s->memmap[VIRT_APLIC_S].base + + s->memmap[VIRT_APLIC_S].size * socket; + gsi_base = VIRT_IRQCHIP_NUM_SOURCES * socket; + build_append_int_noprefix(table_data, 0x1A, 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); /* APLIC ID */ + build_append_int_noprefix(table_data, 0, 4); /* Flags */ + build_append_int_noprefix(table_data, 0, 8); /* Hardware ID */ + /* Number of IDCs */ + if (s->aia_type == VIRT_AIA_TYPE_APLIC) { + build_append_int_noprefix(table_data, + s->soc[socket].num_harts, + 2); + } else { + build_append_int_noprefix(table_data, 0, 2); + } + /* Total External Interrupt Sources Supported */ + build_append_int_noprefix(table_data, VIRT_IRQCHIP_NUM_SOURCES, 2); + /* Global System Interrupt Base */ + build_append_int_noprefix(table_data, gsi_base, 4); + /* APLIC Address */ + build_append_int_noprefix(table_data, aplic_addr, 8); + /* APLIC size */ + build_append_int_noprefix(table_data, + s->memmap[VIRT_APLIC_S].size, 4); + } + } + acpi_table_end(linker, &table); }