On 7/12/23 13:39, 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(-)
>
> diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c
> index ebdc3bffea..9f2d0c92b0 100644
> --- a/hw/riscv/virt-acpi-build.c
> +++ b/hw/riscv/virt-acpi-build.c
> @@ -276,9 +276,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;
> @@ -340,6 +340,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);
> }
>