Lines Matching +full:- +full:- +full:disable +full:- +full:numa
5 * Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
32 #include "qemu/error-report.h"
35 #include "hw/acpi/acpi-defs.h"
39 #include "hw/acpi/bios-linker-loader.h"
40 #include "hw/acpi/aml-build.h"
52 #include "hw/pci-host/gpex.h"
56 #include "hw/platform-bus.h"
57 #include "system/numa.h"
63 #include "hw/virtio/virtio-acpi.h"
75 for (i = 0; i < ms->smp.cpus; i++) { in acpi_dsdt_add_cpus()
91 aml_append(crs, aml_memory32_fixed(uart_memmap->base, in acpi_dsdt_add_uart()
92 uart_memmap->size, AML_READ_WRITE)); in acpi_dsdt_add_uart()
104 hwaddr base = flash_memmap->base; in acpi_dsdt_add_flash()
105 hwaddr size = flash_memmap->size / 2; in acpi_dsdt_add_flash()
145 int ecam_id = VIRT_ECAM_ID(vms->highmem_ecam); in acpi_dsdt_add_pci()
147 PCIBus *bus = vms->bus; in acpi_dsdt_add_pci()
150 if (vms->acpi_dev) { in acpi_dsdt_add_pci()
151 acpi_pcihp = object_property_get_bool(OBJECT(vms->acpi_dev), in acpi_dsdt_add_pci()
161 .bus = vms->bus, in acpi_dsdt_add_pci()
165 if (vms->highmem_mmio) { in acpi_dsdt_add_pci()
170 QLIST_FOREACH(bus, &vms->bus->child, sibling) { in acpi_dsdt_add_pci()
188 aml_append(crs, aml_memory32_fixed(gpio_memmap->base, gpio_memmap->size, in acpi_dsdt_add_gpio()
213 PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev); in acpi_dsdt_add_tpm()
214 hwaddr pbus_base = vms->memmap[VIRT_PLATFORM_BUS].base; in acpi_dsdt_add_tpm()
224 assert(tpm_base != -1); in acpi_dsdt_add_tpm()
261 /* Number of IDs - The number of IDs in the range minus one */ in build_iort_id_mapping()
262 build_append_int_noprefix(table_data, id_count - 1, 4); in build_iort_id_mapping()
282 PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus; in iort_host_bridges()
291 .id_count = (max_bus - min_bus + 1) << 8, in iort_host_bridges()
305 return idmap_a->input_base - idmap_b->input_base; in iort_idmap_compare()
317 * node and do not pass through the SMMU, by subtracting the SMMU-bound in create_rc_its_idmaps()
320 for (int i = 0; i < smmu_idmaps->len; i++) { in create_rc_its_idmaps()
323 if (next_range.input_base < idmap->input_base) { in create_rc_its_idmaps()
324 next_range.id_count = idmap->input_base - next_range.input_base; in create_rc_its_idmaps()
328 next_range.input_base = idmap->input_base + idmap->id_count; in create_rc_its_idmaps()
332 * Append the last RC -> ITS ID mapping. in create_rc_its_idmaps()
334 * RIDs are 16-bit, according to the PCI Express 2.0 Base Specification, rev in create_rc_its_idmaps()
335 * 0.9, section 2.2.6.2, "Transaction Descriptor - Transaction ID Field", in create_rc_its_idmaps()
339 next_range.id_count = 0x10000 - next_range.input_base; in create_rc_its_idmaps()
359 AcpiTable table = { .sig = "IORT", .rev = 3, .oem_id = vms->oem_id, in build_iort()
360 .oem_table_id = vms->oem_table_id }; in build_iort()
364 if (vms->iommu == VIRT_IOMMU_SMMUV3) { in build_iort()
372 rc_mapping_count = rc_smmu_idmaps->len; in build_iort()
374 if (vms->its) { in build_iort()
382 rc_mapping_count += rc_its_idmaps->len; in build_iort()
385 if (vms->its) { in build_iort()
400 if (vms->its) { in build_iort()
414 if (vms->iommu == VIRT_IOMMU_SMMUV3) { in build_iort()
415 int irq = vms->irqmap[VIRT_SMMU] + ARM_SPI_BASE; in build_iort()
418 if (vms->its) { in build_iort()
425 smmu_offset = table_data->len - table.table_offset; in build_iort()
438 build_append_int_noprefix(table_data, vms->memmap[VIRT_SMMU].base, 8); in build_iort()
444 build_append_int_noprefix(table_data, 0 /* Generic SMMU-v3 */, 4); in build_iort()
489 if (vms->iommu == VIRT_IOMMU_SMMUV3) { in build_iort()
493 * Map RIDs (input) from RC to SMMUv3 nodes: RC -> SMMUv3. in build_iort()
495 * N.B.: The mapping from SMMUv3 to ITS Group node (SMMUv3 -> ITS) is in build_iort()
499 for (i = 0; i < rc_smmu_idmaps->len; i++) { in build_iort()
502 build_iort_id_mapping(table_data, range->input_base, in build_iort()
503 range->id_count, smmu_offset); in build_iort()
506 if (vms->its) { in build_iort()
509 * ITS Group node directly: RC -> ITS. in build_iort()
511 for (i = 0; i < rc_its_idmaps->len; i++) { in build_iort()
514 build_iort_id_mapping(table_data, range->input_base, in build_iort()
515 range->id_count, IORT_NODE_OFFSET); in build_iort()
521 * SMMU: RC -> ITS. in build_iort()
545 .base_addr.addr = vms->memmap[VIRT_UART0].base, in spcr_setup()
548 .interrupt = (vms->irqmap[VIRT_UART0] + ARM_SPI_BASE), in spcr_setup()
567 build_spcr(table_data, linker, &serial, 2, vms->oem_id, vms->oem_table_id, in spcr_setup()
582 const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms); in build_srat()
583 AcpiTable table = { .sig = "SRAT", .rev = 3, .oem_id = vms->oem_id, in build_srat()
584 .oem_table_id = vms->oem_table_id }; in build_srat()
590 for (i = 0; i < cpu_list->len; ++i) { in build_srat()
591 uint32_t nodeid = cpu_list->cpus[i].props.node_id; in build_srat()
599 /* Flags, Table 5-76 */ in build_srat()
604 mem_base = vms->memmap[VIRT_MEM].base; in build_srat()
605 for (i = 0; i < ms->numa_state->num_nodes; ++i) { in build_srat()
606 if (ms->numa_state->nodes[i].node_mem > 0) { in build_srat()
608 ms->numa_state->nodes[i].node_mem, i, in build_srat()
610 mem_base += ms->numa_state->nodes[i].node_mem; in build_srat()
616 if (ms->nvdimms_state->is_enabled) { in build_srat()
620 if (ms->device_memory) { in build_srat()
621 build_srat_memory(table_data, ms->device_memory->base, in build_srat()
622 memory_region_size(&ms->device_memory->mr), in build_srat()
623 ms->numa_state->num_nodes - 1, in build_srat()
638 * Table 5-117 Flag Definitions in build_gtdt()
643 AcpiTable table = { .sig = "GTDT", .rev = 3, .oem_id = vms->oem_id, in build_gtdt()
644 .oem_table_id = vms->oem_table_id }; in build_gtdt()
659 /* Non-Secure EL1 timer GSIV */ in build_gtdt()
661 /* Non-Secure EL1 timer Flags */ in build_gtdt()
663 1UL << 2, /* Always-on Capability */ in build_gtdt()
669 /* Non-Secure EL2 timer GSIV */ in build_gtdt()
671 /* Non-Secure EL2 timer Flags */ in build_gtdt()
679 if (vms->ns_el2_virt_timer_irq) { in build_gtdt()
695 AcpiTable table = { .sig = "DBG2", .rev = 0, .oem_id = vms->oem_id, in build_dbg2()
696 .oem_table_id = vms->oem_table_id }; in build_dbg2()
737 vms->memmap[VIRT_UART0].base); in build_dbg2()
741 vms->memmap[VIRT_UART0].size, 4); in build_dbg2()
767 const MemMapEntry *memmap = vms->memmap; in build_madt()
768 AcpiTable table = { .sig = "APIC", .rev = 4, .oem_id = vms->oem_id, in build_madt()
769 .oem_table_id = vms->oem_table_id }; in build_madt()
785 build_append_int_noprefix(table_data, vms->gic_version, 1); in build_madt()
788 for (i = 0; i < MACHINE(vms)->smp.cpus; i++) { in build_madt()
791 uint32_t vgic_interrupt = vms->virt ? ARCH_GIC_MAINT_IRQ : 0; in build_madt()
792 uint32_t pmu_interrupt = arm_feature(&armcpu->env, ARM_FEATURE_PMU) ? in build_madt()
795 if (vms->gic_version == VIRT_GIC_VERSION_2) { in build_madt()
829 if (vms->gic_version != VIRT_GIC_VERSION_2) { in build_madt()
837 if (vms->its) { in build_madt()
852 const uint16_t spi_base = vms->irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE; in build_madt()
881 switch (vms->psci_conduit) { in build_fadt_rev6()
896 build_fadt(table_data, linker, &fadt, vms->oem_id, vms->oem_table_id); in build_fadt_rev6()
906 const MemMapEntry *memmap = vms->memmap; in build_dsdt()
907 const int *irqmap = vms->irqmap; in build_dsdt()
908 AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = vms->oem_id, in build_dsdt()
909 .oem_table_id = vms->oem_table_id }; in build_dsdt()
916 * While UEFI can use libfdt to disable the RTC device node in the DTB that in build_dsdt()
924 if (vms->second_ns_uart_present) { in build_dsdt()
928 if (vmc->acpi_expose_flash) { in build_dsdt()
936 if (vms->acpi_dev) { in build_dsdt()
938 HOTPLUG_HANDLER(vms->acpi_dev), in build_dsdt()
946 if (vms->acpi_dev) { in build_dsdt()
947 uint32_t event = object_property_get_uint(OBJECT(vms->acpi_dev), in build_dsdt()
948 "ged-event", &error_abort); in build_dsdt()
951 build_memory_hotplug_aml(scope, ms->ram_slots, "\\_SB", NULL, in build_dsdt()
967 build_append_pci_bus_devices(pci0_scope, vms->bus); in build_dsdt()
968 if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) { in build_dsdt()
969 build_append_pcihp_slots(pci0_scope, vms->bus); in build_dsdt()
972 if (vms->acpi_dev) { in build_dsdt()
975 acpi_pcihp = object_property_get_bool(OBJECT(vms->acpi_dev), in build_dsdt()
986 build_append_notification_callback(pci0_scope, vms->bus); in build_dsdt()
992 g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); in build_dsdt()
1023 GArray *tables_blob = tables->table_data; in virt_acpi_build()
1029 bios_linker_loader_alloc(tables->linker, in virt_acpi_build()
1034 dsdt = tables_blob->len; in virt_acpi_build()
1035 build_dsdt(tables_blob, tables->linker, vms); in virt_acpi_build()
1039 build_fadt_rev6(tables_blob, tables->linker, vms, dsdt); in virt_acpi_build()
1042 build_madt(tables_blob, tables->linker, vms); in virt_acpi_build()
1044 if (!vmc->no_cpu_topology) { in virt_acpi_build()
1046 build_pptt(tables_blob, tables->linker, ms, in virt_acpi_build()
1047 vms->oem_id, vms->oem_table_id); in virt_acpi_build()
1051 build_gtdt(tables_blob, tables->linker, vms); in virt_acpi_build()
1056 .base = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].base, in virt_acpi_build()
1057 .size = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].size, in virt_acpi_build()
1059 build_mcfg(tables_blob, tables->linker, &mcfg, vms->oem_id, in virt_acpi_build()
1060 vms->oem_table_id); in virt_acpi_build()
1065 if (ms->acpi_spcr_enabled) { in virt_acpi_build()
1066 spcr_setup(tables_blob, tables->linker, vms); in virt_acpi_build()
1070 build_dbg2(tables_blob, tables->linker, vms); in virt_acpi_build()
1072 if (vms->ras) { in virt_acpi_build()
1074 acpi_build_hest(tables_blob, tables->hardware_errors, tables->linker, in virt_acpi_build()
1075 vms->oem_id, vms->oem_table_id); in virt_acpi_build()
1078 if (ms->numa_state->num_nodes > 0) { in virt_acpi_build()
1080 build_srat(tables_blob, tables->linker, vms); in virt_acpi_build()
1081 if (ms->numa_state->have_numa_distance) { in virt_acpi_build()
1083 build_slit(tables_blob, tables->linker, ms, vms->oem_id, in virt_acpi_build()
1084 vms->oem_table_id); in virt_acpi_build()
1087 if (ms->numa_state->hmat_enabled) { in virt_acpi_build()
1089 build_hmat(tables_blob, tables->linker, ms->numa_state, in virt_acpi_build()
1090 vms->oem_id, vms->oem_table_id); in virt_acpi_build()
1094 if (vms->cxl_devices_state.is_enabled) { in virt_acpi_build()
1095 cxl_build_cedt(table_offsets, tables_blob, tables->linker, in virt_acpi_build()
1096 vms->oem_id, vms->oem_table_id, &vms->cxl_devices_state); in virt_acpi_build()
1099 if (ms->nvdimms_state->is_enabled) { in virt_acpi_build()
1100 nvdimm_build_acpi(table_offsets, tables_blob, tables->linker, in virt_acpi_build()
1101 ms->nvdimms_state, ms->ram_slots, vms->oem_id, in virt_acpi_build()
1102 vms->oem_table_id); in virt_acpi_build()
1106 build_iort(tables_blob, tables->linker, vms); in virt_acpi_build()
1111 build_tpm2(tables_blob, tables->linker, tables->tcpalog, vms->oem_id, in virt_acpi_build()
1112 vms->oem_table_id); in virt_acpi_build()
1116 if (vms->iommu == VIRT_IOMMU_VIRTIO) { in virt_acpi_build()
1118 build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf, in virt_acpi_build()
1119 vms->oem_id, vms->oem_table_id); in virt_acpi_build()
1123 xsdt = tables_blob->len; in virt_acpi_build()
1124 build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id, in virt_acpi_build()
1125 vms->oem_table_id); in virt_acpi_build()
1131 .oem_id = vms->oem_id, in virt_acpi_build()
1135 build_rsdp(tables->rsdp, tables->linker, &rsdp_data); in virt_acpi_build()
1142 if (tables_blob->len > ACPI_BUILD_TABLE_SIZE / 2) { in virt_acpi_build()
1145 tables_blob->len, ACPI_BUILD_TABLE_SIZE / 2); in virt_acpi_build()
1146 error_printf("Try removing CPUs, NUMA nodes, memory slots" in virt_acpi_build()
1160 /* Make sure RAM size is correct - in case it got changed in acpi_ram_update()
1164 memcpy(memory_region_get_ram_ptr(mr), data->data, size); in acpi_ram_update()
1174 if (!build_state || build_state->patched) { in virt_acpi_build_update()
1177 build_state->patched = true; in virt_acpi_build_update()
1183 acpi_ram_update(build_state->table_mr, tables.table_data); in virt_acpi_build_update()
1184 acpi_ram_update(build_state->rsdp_mr, tables.rsdp); in virt_acpi_build_update()
1185 acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob); in virt_acpi_build_update()
1193 build_state->patched = false; in virt_acpi_build_reset()
1212 if (!vms->fw_cfg) { in virt_acpi_setup()
1228 build_state->table_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()
1231 assert(build_state->table_mr != NULL); in virt_acpi_setup()
1233 build_state->linker_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()
1235 tables.linker->cmd_blob, in virt_acpi_setup()
1238 fw_cfg_add_file(vms->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data, in virt_acpi_setup()
1241 if (vms->ras) { in virt_acpi_setup()
1242 assert(vms->acpi_dev); in virt_acpi_setup()
1243 acpi_ged_state = ACPI_GED(vms->acpi_dev); in virt_acpi_setup()
1244 acpi_ghes_add_fw_cfg(&acpi_ged_state->ghes_state, in virt_acpi_setup()
1245 vms->fw_cfg, tables.hardware_errors); in virt_acpi_setup()
1248 build_state->rsdp_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()