hw/riscv/virt-acpi-build.c: Add APLIC in the MADT
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> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Acked-by: Alistair Francis <alistair.francis@wdc.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Message-ID: <20231218150247.466427-8-sunilvl@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
66ac45b759
commit
7d189186f6
@ -274,6 +274,8 @@ static void build_madt(GArray *table_data,
|
||||
uint8_t guest_index_bits = imsic_num_bits(s->aia_guests + 1);
|
||||
uint16_t imsic_max_hart_per_socket = 0;
|
||||
uint8_t hart_index_bits;
|
||||
uint64_t aplic_addr;
|
||||
uint32_t gsi_base;
|
||||
uint8_t socket;
|
||||
|
||||
for (socket = 0; socket < riscv_socket_count(ms); socket++) {
|
||||
@ -319,6 +321,38 @@ static void build_madt(GArray *table_data,
|
||||
build_append_int_noprefix(table_data, IMSIC_MMIO_GROUP_MIN_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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user