Message ID | 20230216164125.1945633-6-sunilvl@ventanamicro.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add basic ACPI support for risc-v virt | expand |
On Thu, Feb 16, 2023 at 10:11:22PM +0530, Sunil V L wrote: > Add Multiple APIC Description Table (MADT) with the > RINTC structure for each cpu. > > Signed-off-by: Sunil V L <sunilvl@ventanamicro.com> > Acked-by: Alistair Francis <alistair.francis@wdc.com> > --- > hw/riscv/virt-acpi-build.c | 44 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 44 insertions(+) > > diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c > index 30af974db3..58e49cd6d6 100644 > --- a/hw/riscv/virt-acpi-build.c > +++ b/hw/riscv/virt-acpi-build.c > @@ -32,6 +32,7 @@ > #include "sysemu/reset.h" > #include "migration/vmstate.h" > #include "hw/riscv/virt.h" > +#include "hw/riscv/numa.h" > > #define ACPI_BUILD_TABLE_SIZE 0x20000 > > @@ -123,6 +124,46 @@ static void build_dsdt(GArray *table_data, > free_aml_allocator(); > } > > +/* MADT */ > +static void build_madt(GArray *table_data, > + BIOSLinker *linker, > + RISCVVirtState *s) > +{ > + MachineState *ms = MACHINE(s); > + int socket; > + uint16_t base_hartid = 0; > + uint32_t cpu_id = 0; > + > + AcpiTable table = { .sig = "APIC", .rev = 6, .oem_id = s->oem_id, > + .oem_table_id = s->oem_table_id }; > + > + acpi_table_begin(&table, table_data); > + /* Local Interrupt Controller Address */ > + build_append_int_noprefix(table_data, 0, 4); > + build_append_int_noprefix(table_data, 0, 4); /* MADT Flags */ > + > + /* RISC-V Local INTC structures per HART */ > + for (socket = 0; socket < riscv_socket_count(ms); socket++) { > + base_hartid = riscv_socket_first_hartid(ms, socket); > + > + for (int i = 0; i < s->soc[socket].num_harts; i++) { > + build_append_int_noprefix(table_data, 0x18, 1); /* Type */ > + build_append_int_noprefix(table_data, 20, 1); /* Length */ > + build_append_int_noprefix(table_data, 1, 1); /* Version */ > + build_append_int_noprefix(table_data, 0, 1); /* Reserved */ > + build_append_int_noprefix(table_data, 1, 4); /* Flags */ > + build_append_int_noprefix(table_data, > + (base_hartid + i), 8); /* Hart ID */ > + > + /* ACPI Processor UID */ > + build_append_int_noprefix(table_data, cpu_id, 4); > + cpu_id++; > + } > + } > + > + acpi_table_end(linker, &table); > +} > + > static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) > { > GArray *table_offsets; > @@ -144,6 +185,9 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) > acpi_add_table(table_offsets, tables_blob); > build_fadt_rev6(tables_blob, tables->linker, s, dsdt); > > + acpi_add_table(table_offsets, tables_blob); > + build_madt(tables_blob, tables->linker, s); > + > /* XSDT is pointed to by RSDP */ > xsdt = tables_blob->len; > build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, > -- > 2.34.1 > Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Thanks, drew
diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index 30af974db3..58e49cd6d6 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -32,6 +32,7 @@ #include "sysemu/reset.h" #include "migration/vmstate.h" #include "hw/riscv/virt.h" +#include "hw/riscv/numa.h" #define ACPI_BUILD_TABLE_SIZE 0x20000 @@ -123,6 +124,46 @@ static void build_dsdt(GArray *table_data, free_aml_allocator(); } +/* MADT */ +static void build_madt(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s) +{ + MachineState *ms = MACHINE(s); + int socket; + uint16_t base_hartid = 0; + uint32_t cpu_id = 0; + + AcpiTable table = { .sig = "APIC", .rev = 6, .oem_id = s->oem_id, + .oem_table_id = s->oem_table_id }; + + acpi_table_begin(&table, table_data); + /* Local Interrupt Controller Address */ + build_append_int_noprefix(table_data, 0, 4); + build_append_int_noprefix(table_data, 0, 4); /* MADT Flags */ + + /* RISC-V Local INTC structures per HART */ + for (socket = 0; socket < riscv_socket_count(ms); socket++) { + base_hartid = riscv_socket_first_hartid(ms, socket); + + for (int i = 0; i < s->soc[socket].num_harts; i++) { + build_append_int_noprefix(table_data, 0x18, 1); /* Type */ + build_append_int_noprefix(table_data, 20, 1); /* Length */ + build_append_int_noprefix(table_data, 1, 1); /* Version */ + build_append_int_noprefix(table_data, 0, 1); /* Reserved */ + build_append_int_noprefix(table_data, 1, 4); /* Flags */ + build_append_int_noprefix(table_data, + (base_hartid + i), 8); /* Hart ID */ + + /* ACPI Processor UID */ + build_append_int_noprefix(table_data, cpu_id, 4); + cpu_id++; + } + } + + acpi_table_end(linker, &table); +} + static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) { GArray *table_offsets; @@ -144,6 +185,9 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables_blob); build_fadt_rev6(tables_blob, tables->linker, s, dsdt); + acpi_add_table(table_offsets, tables_blob); + build_madt(tables_blob, tables->linker, s); + /* XSDT is pointed to by RSDP */ xsdt = tables_blob->len; build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id,