Lines Matching +full:- +full:- +full:disable +full:- +full:numa
4 * RISC-V virt ACPI generation
6 * Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
10 * Copyright (C) 2021-2023 Ventana Micro Systems Inc
27 #include "hw/acpi/acpi-defs.h"
29 #include "hw/acpi/aml-build.h"
34 #include "hw/pci-host/gpex.h"
36 #include "hw/riscv/numa.h"
37 #include "hw/virtio/virtio-acpi.h"
40 #include "qemu/error-report.h"
69 uint8_t guest_index_bits = imsic_num_bits(s->aia_guests + 1); in riscv_acpi_madt_add_rintc()
70 uint64_t hart_id = arch_ids->cpus[uid].arch_id; in riscv_acpi_madt_add_rintc()
75 socket_id = arch_ids->cpus[uid].props.node_id; in riscv_acpi_madt_add_rintc()
76 local_cpu_id = (arch_ids->cpus[uid].arch_id - in riscv_acpi_madt_add_rintc()
79 imsic_socket_addr = s->memmap[VIRT_IMSIC_S].base + in riscv_acpi_madt_add_rintc()
91 if (s->aia_type == VIRT_AIA_TYPE_APLIC) { in riscv_acpi_madt_add_rintc()
94 arch_ids->cpus[uid].props.node_id, in riscv_acpi_madt_add_rintc()
97 } else if (s->aia_type == VIRT_AIA_TYPE_NONE) { in riscv_acpi_madt_add_rintc()
100 arch_ids->cpus[uid].props.node_id, in riscv_acpi_madt_add_rintc()
107 if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) { in riscv_acpi_madt_add_rintc()
122 const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); in acpi_dsdt_add_cpus()
124 for (int i = 0; i < arch_ids->len; i++) { in acpi_dsdt_add_cpus()
131 aml_int(arch_ids->cpus[i].arch_id))); in acpi_dsdt_add_cpus()
136 aml_buffer(madt_buf->len, in acpi_dsdt_add_cpus()
137 (uint8_t *)madt_buf->data))); in acpi_dsdt_add_cpus()
177 aml_append(crs, aml_memory32_fixed(uart_memmap->base, in acpi_dsdt_add_uart()
178 uart_memmap->size, AML_READ_WRITE)); in acpi_dsdt_add_uart()
185 aml_append(pkg, aml_string("clock-frequency")); in acpi_dsdt_add_uart()
188 Aml *UUID = aml_touuid("DAFFD814-6EBA-4D8C-8A91-BC9BBF4AA301"); in acpi_dsdt_add_uart()
203 * ACPI ID for IOMMU is defined in the section 6.2 of RISC-V BRS spec.
204 * https://github.com/riscv-non-isa/riscv-brs/releases/download/v0.8/riscv-brs-spec.pdf
216 aml_append(crs, aml_memory32_fixed(iommu_memmap->base, in acpi_dsdt_add_iommu_sys()
217 iommu_memmap->size, AML_READ_WRITE)); in acpi_dsdt_add_iommu_sys()
242 .base_addr.addr = s->memmap[VIRT_UART0].base, in spcr_setup()
243 .interrupt_type = (1 << 4),/* Bit[4] RISC-V PLIC/APLIC */ in spcr_setup()
265 build_spcr(table_data, linker, &serial, 4, s->oem_id, s->oem_table_id, in spcr_setup()
274 * 5.2.36 RISC-V Hart Capabilities Table (RHCT)
275 * REF: https://github.com/riscv-non-isa/riscv-acpi/issues/16
276 * https://drive.google.com/file/d/1nP3nFiH4jkPMp6COOxP6123DCZKR-tia/view
285 const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); in build_rhct()
288 RISCVCPU *cpu = &s->soc[0].harts[0]; in build_rhct()
293 AcpiTable table = { .sig = "RHCT", .rev = 1, .oem_id = s->oem_id, in build_rhct()
294 .oem_table_id = s->oem_table_id }; in build_rhct()
305 num_rhct_nodes = 1 + ms->smp.cpus; in build_rhct()
306 if (cpu->cfg.ext_zicbom || cpu->cfg.ext_zicboz) { in build_rhct()
310 if (!rv32 && cpu->cfg.max_satp_mode >= VM_1_10_SV39) { in build_rhct()
321 isa_offset = table_data->len - table.table_offset; in build_rhct()
340 if (cpu->cfg.ext_zicbom || cpu->cfg.ext_zicboz) { in build_rhct()
341 cmo_offset = table_data->len - table.table_offset; in build_rhct()
348 if (cpu->cfg.cbom_blocksize) { in build_rhct()
350 __builtin_ctz(cpu->cfg.cbom_blocksize), in build_rhct()
360 if (cpu->cfg.cboz_blocksize) { in build_rhct()
362 __builtin_ctz(cpu->cfg.cboz_blocksize), in build_rhct()
370 if (!rv32 && cpu->cfg.max_satp_mode >= VM_1_10_SV39) { in build_rhct()
371 mmu_offset = table_data->len - table.table_offset; in build_rhct()
377 if (cpu->cfg.max_satp_mode == VM_1_10_SV57) { in build_rhct()
379 } else if (cpu->cfg.max_satp_mode == VM_1_10_SV48) { in build_rhct()
381 } else if (cpu->cfg.max_satp_mode == VM_1_10_SV39) { in build_rhct()
389 for (int i = 0; i < arch_ids->len; i++) { in build_rhct()
437 build_fadt(table_data, linker, &fadt, s->oem_id, s->oem_table_id); in build_fadt_rev6()
448 const MemMapEntry *memmap = s->memmap; in build_dsdt()
449 AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = s->oem_id, in build_dsdt()
450 .oem_table_id = s->oem_table_id }; in build_dsdt()
458 * While UEFI can use libfdt to disable the RTC device node in the DTB that in build_dsdt()
469 if (s->aia_type == VIRT_AIA_TYPE_NONE) { in build_dsdt()
504 g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); in build_dsdt()
513 * REF: https://github.com/riscv-non-isa/riscv-acpi/issues/15
514 * https://drive.google.com/file/d/1R6k4MshhN3WTT-hwqAquu5nX6xSEqK2l/view
515 * https://drive.google.com/file/d/1oMGPyOD58JaPgMl1pKasT-VKsIKia7zR/view
523 const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); in build_madt()
525 uint8_t guest_index_bits = imsic_num_bits(s->aia_guests + 1); in build_madt()
533 if (imsic_max_hart_per_socket < s->soc[socket].num_harts) { in build_madt()
534 imsic_max_hart_per_socket = s->soc[socket].num_harts; in build_madt()
540 AcpiTable table = { .sig = "APIC", .rev = 6, .oem_id = s->oem_id, in build_madt()
541 .oem_table_id = s->oem_table_id }; in build_madt()
548 /* RISC-V Local INTC structures per HART */ in build_madt()
549 for (int i = 0; i < arch_ids->len; i++) { in build_madt()
554 if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) { in build_madt()
575 if (s->aia_type != VIRT_AIA_TYPE_NONE) { in build_madt()
578 aplic_addr = s->memmap[VIRT_APLIC_S].base + in build_madt()
579 s->memmap[VIRT_APLIC_S].size * socket; in build_madt()
588 if (s->aia_type == VIRT_AIA_TYPE_APLIC) { in build_madt()
590 s->soc[socket].num_harts, in build_madt()
603 s->memmap[VIRT_APLIC_S].size, 4); in build_madt()
608 aplic_addr = s->memmap[VIRT_PLIC].base + in build_madt()
609 s->memmap[VIRT_PLIC].size * socket; in build_madt()
618 VIRT_IRQCHIP_NUM_SOURCES - 1, 2); in build_madt()
622 build_append_int_noprefix(table_data, s->memmap[VIRT_PLIC].size, 4); in build_madt()
669 PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus; in rimt_host_bridges()
678 .num_ids = (max_bus - min_bus + 1) << 8, in rimt_host_bridges()
692 return idmap_a->source_id_base - idmap_b->source_id_base; in rimt_idmap_compare()
696 * RISC-V IO Mapping Table (RIMT)
697 * https://github.com/riscv-non-isa/riscv-acpi-rimt/releases/download/v0.99/rimt-spec.pdf
708 AcpiTable table = { .sig = "RIMT", .rev = 1, .oem_id = s->oem_id, in build_rimt()
709 .oem_table_id = s->oem_table_id }; in build_rimt()
720 rc_mapping_count = iommu_idmaps->len; in build_rimt()
728 iommu_offset = table_data->len - table.table_offset; in build_rimt()
730 build_append_int_noprefix(table_data, 0, 1); /* Type - IOMMU*/ in build_rimt()
748 s->memmap[VIRT_IOMMU_SYS].base, 8); in build_rimt()
771 build_append_int_noprefix(table_data, s->pci_iommu_bdf, 2); in build_rimt()
799 for (i = 0; i < iommu_idmaps->len; i++) { in build_rimt()
802 range->source_id_base = 0; in build_rimt()
804 range->source_id_base = s->pci_iommu_bdf + 1; in build_rimt()
806 range->num_ids = 0xffff - s->pci_iommu_bdf; in build_rimt()
807 build_rimt_id_mapping(table_data, range->source_id_base, in build_rimt()
808 range->num_ids, iommu_offset); in build_rimt()
817 * REF: https://github.com/riscv-non-isa/riscv-acpi/issues/25
818 * https://drive.google.com/file/d/1YTdDx2IPm5IeZjAW932EYU-tUtgS08tX/view
827 const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms); in build_srat()
828 AcpiTable table = { .sig = "SRAT", .rev = 3, .oem_id = vms->oem_id, in build_srat()
829 .oem_table_id = vms->oem_table_id }; in build_srat()
835 for (i = 0; i < cpu_list->len; ++i) { in build_srat()
836 uint32_t nodeid = cpu_list->cpus[i].props.node_id; in build_srat()
845 /* Flags, Table 5-70 */ in build_srat()
850 mem_base = vms->memmap[VIRT_DRAM].base; in build_srat()
851 for (i = 0; i < ms->numa_state->num_nodes; ++i) { in build_srat()
852 if (ms->numa_state->nodes[i].node_mem > 0) { in build_srat()
854 ms->numa_state->nodes[i].node_mem, i, in build_srat()
856 mem_base += ms->numa_state->nodes[i].node_mem; in build_srat()
867 GArray *tables_blob = tables->table_data; in virt_acpi_build()
873 bios_linker_loader_alloc(tables->linker, in virt_acpi_build()
878 dsdt = tables_blob->len; in virt_acpi_build()
879 build_dsdt(tables_blob, tables->linker, s); in virt_acpi_build()
883 build_fadt_rev6(tables_blob, tables->linker, s, dsdt); in virt_acpi_build()
886 build_madt(tables_blob, tables->linker, s); in virt_acpi_build()
889 build_rhct(tables_blob, tables->linker, s); in virt_acpi_build()
891 if (virt_is_iommu_sys_enabled(s) || s->pci_iommu_bdf) { in virt_acpi_build()
893 build_rimt(tables_blob, tables->linker, s); in virt_acpi_build()
897 spcr_setup(tables_blob, tables->linker, s); in virt_acpi_build()
902 .base = s->memmap[VIRT_PCIE_ECAM].base, in virt_acpi_build()
903 .size = s->memmap[VIRT_PCIE_ECAM].size, in virt_acpi_build()
905 build_mcfg(tables_blob, tables->linker, &mcfg, s->oem_id, in virt_acpi_build()
906 s->oem_table_id); in virt_acpi_build()
909 if (ms->numa_state->num_nodes > 0) { in virt_acpi_build()
911 build_srat(tables_blob, tables->linker, s); in virt_acpi_build()
912 if (ms->numa_state->have_numa_distance) { in virt_acpi_build()
914 build_slit(tables_blob, tables->linker, ms, s->oem_id, in virt_acpi_build()
915 s->oem_table_id); in virt_acpi_build()
920 xsdt = tables_blob->len; in virt_acpi_build()
921 build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, in virt_acpi_build()
922 s->oem_table_id); in virt_acpi_build()
928 .oem_id = s->oem_id, in virt_acpi_build()
932 build_rsdp(tables->rsdp, tables->linker, &rsdp_data); in virt_acpi_build()
939 if (tables_blob->len > ACPI_BUILD_TABLE_SIZE / 2) { in virt_acpi_build()
942 tables_blob->len, ACPI_BUILD_TABLE_SIZE / 2); in virt_acpi_build()
957 * Make sure RAM size is correct - in case it got changed in acpi_ram_update()
962 memcpy(memory_region_get_ram_ptr(mr), data->data, size); in acpi_ram_update()
972 if (!build_state || build_state->patched) { in virt_acpi_build_update()
976 build_state->patched = true; in virt_acpi_build_update()
982 acpi_ram_update(build_state->table_mr, tables.table_data); in virt_acpi_build_update()
983 acpi_ram_update(build_state->rsdp_mr, tables.rsdp); in virt_acpi_build_update()
984 acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob); in virt_acpi_build_update()
992 build_state->patched = false; in virt_acpi_build_reset()
1016 build_state->table_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()
1019 assert(build_state->table_mr != NULL); in virt_acpi_setup()
1021 build_state->linker_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()
1023 tables.linker->cmd_blob, in virt_acpi_setup()
1026 build_state->rsdp_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()