Lines Matching +full:ecam +full:- +full:based
5 * Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
32 #include "qemu/error-report.h"
35 #include "hw/acpi/acpi-defs.h"
38 #include "hw/acpi/bios-linker-loader.h"
39 #include "hw/acpi/aml-build.h"
49 #include "hw/pci-host/gpex.h"
53 #include "hw/platform-bus.h"
60 #include "hw/virtio/virtio-acpi.h"
72 for (i = 0; i < ms->smp.cpus; i++) { in acpi_dsdt_add_cpus()
88 aml_append(crs, aml_memory32_fixed(uart_memmap->base, in acpi_dsdt_add_uart()
89 uart_memmap->size, AML_READ_WRITE)); in acpi_dsdt_add_uart()
101 hwaddr base = flash_memmap->base; in acpi_dsdt_add_flash()
102 hwaddr size = flash_memmap->size / 2; in acpi_dsdt_add_flash()
125 int ecam_id = VIRT_ECAM_ID(vms->highmem_ecam); in acpi_dsdt_add_pci()
129 .ecam = memmap[ecam_id], in acpi_dsdt_add_pci()
131 .bus = vms->bus, in acpi_dsdt_add_pci()
134 if (vms->highmem_mmio) { in acpi_dsdt_add_pci()
149 aml_append(crs, aml_memory32_fixed(gpio_memmap->base, gpio_memmap->size, in acpi_dsdt_add_gpio()
174 PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev); in acpi_dsdt_add_tpm()
175 hwaddr pbus_base = vms->memmap[VIRT_PLATFORM_BUS].base; in acpi_dsdt_add_tpm()
185 assert(tpm_base != -1); in acpi_dsdt_add_tpm()
222 /* Number of IDs - The number of IDs in the range minus one */ in build_iort_id_mapping()
223 build_append_int_noprefix(table_data, id_count - 1, 4); in build_iort_id_mapping()
243 PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus; in iort_host_bridges()
252 .id_count = (max_bus - min_bus + 1) << 8, in iort_host_bridges()
266 return idmap_a->input_base - idmap_b->input_base; in iort_idmap_compare()
284 AcpiTable table = { .sig = "IORT", .rev = 3, .oem_id = vms->oem_id, in build_iort()
285 .oem_table_id = vms->oem_table_id }; in build_iort()
289 if (vms->iommu == VIRT_IOMMU_SMMUV3) { in build_iort()
302 for (i = 0; i < smmu_idmaps->len; i++) { in build_iort()
305 if (next_range.input_base < idmap->input_base) { in build_iort()
306 next_range.id_count = idmap->input_base - next_range.input_base; in build_iort()
310 next_range.input_base = idmap->input_base + idmap->id_count; in build_iort()
313 /* Append the last RC -> ITS ID mapping */ in build_iort()
315 next_range.id_count = 0x10000 - next_range.input_base; in build_iort()
320 rc_mapping_count = smmu_idmaps->len + its_idmaps->len; in build_iort()
344 if (vms->iommu == VIRT_IOMMU_SMMUV3) { in build_iort()
345 int irq = vms->irqmap[VIRT_SMMU] + ARM_SPI_BASE; in build_iort()
347 smmu_offset = table_data->len - table.table_offset; in build_iort()
358 build_append_int_noprefix(table_data, vms->memmap[VIRT_SMMU].base, 8); in build_iort()
364 build_append_int_noprefix(table_data, 0 /* Generic SMMU-v3 */, 4); in build_iort()
370 /* DeviceID mapping index (ignored since interrupts are GSIV based) */ in build_iort()
407 if (vms->iommu == VIRT_IOMMU_SMMUV3) { in build_iort()
410 /* translated RIDs connect to SMMUv3 node: RC -> SMMUv3 -> ITS */ in build_iort()
411 for (i = 0; i < smmu_idmaps->len; i++) { in build_iort()
414 build_iort_id_mapping(table_data, range->input_base, in build_iort()
415 range->id_count, smmu_offset); in build_iort()
418 /* bypassed RIDs connect to ITS group node directly: RC -> ITS */ in build_iort()
419 for (i = 0; i < its_idmaps->len; i++) { in build_iort()
422 build_iort_id_mapping(table_data, range->input_base, in build_iort()
423 range->id_count, IORT_NODE_OFFSET); in build_iort()
448 .base_addr.addr = vms->memmap[VIRT_UART0].base, in spcr_setup()
451 .interrupt = (vms->irqmap[VIRT_UART0] + ARM_SPI_BASE), in spcr_setup()
467 build_spcr(table_data, linker, &serial, 2, vms->oem_id, vms->oem_table_id); in spcr_setup()
481 const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms); in build_srat()
482 AcpiTable table = { .sig = "SRAT", .rev = 3, .oem_id = vms->oem_id, in build_srat()
483 .oem_table_id = vms->oem_table_id }; in build_srat()
489 for (i = 0; i < cpu_list->len; ++i) { in build_srat()
490 uint32_t nodeid = cpu_list->cpus[i].props.node_id; in build_srat()
498 /* Flags, Table 5-76 */ in build_srat()
503 mem_base = vms->memmap[VIRT_MEM].base; in build_srat()
504 for (i = 0; i < ms->numa_state->num_nodes; ++i) { in build_srat()
505 if (ms->numa_state->nodes[i].node_mem > 0) { in build_srat()
507 ms->numa_state->nodes[i].node_mem, i, in build_srat()
509 mem_base += ms->numa_state->nodes[i].node_mem; in build_srat()
515 if (ms->nvdimms_state->is_enabled) { in build_srat()
519 if (ms->device_memory) { in build_srat()
520 build_srat_memory(table_data, ms->device_memory->base, in build_srat()
521 memory_region_size(&ms->device_memory->mr), in build_srat()
522 ms->numa_state->num_nodes - 1, in build_srat()
538 * Table 5-117 Flag Definitions in build_gtdt()
542 uint32_t irqflags = vmc->claim_edge_triggered_timers ? in build_gtdt()
545 AcpiTable table = { .sig = "GTDT", .rev = 3, .oem_id = vms->oem_id, in build_gtdt()
546 .oem_table_id = vms->oem_table_id }; in build_gtdt()
561 /* Non-Secure EL1 timer GSIV */ in build_gtdt()
563 /* Non-Secure EL1 timer Flags */ in build_gtdt()
565 1UL << 2, /* Always-on Capability */ in build_gtdt()
571 /* Non-Secure EL2 timer GSIV */ in build_gtdt()
573 /* Non-Secure EL2 timer Flags */ in build_gtdt()
581 if (vms->ns_el2_virt_timer_irq) { in build_gtdt()
597 AcpiTable table = { .sig = "DBG2", .rev = 0, .oem_id = vms->oem_id, in build_dbg2()
598 .oem_table_id = vms->oem_table_id }; in build_dbg2()
639 vms->memmap[VIRT_UART0].base); in build_dbg2()
643 vms->memmap[VIRT_UART0].size, 4); in build_dbg2()
670 const MemMapEntry *memmap = vms->memmap; in build_madt()
671 AcpiTable table = { .sig = "APIC", .rev = 4, .oem_id = vms->oem_id, in build_madt()
672 .oem_table_id = vms->oem_table_id }; in build_madt()
688 build_append_int_noprefix(table_data, vms->gic_version, 1); in build_madt()
691 for (i = 0; i < MACHINE(vms)->smp.cpus; i++) { in build_madt()
694 uint32_t vgic_interrupt = vms->virt ? ARCH_GIC_MAINT_IRQ : 0; in build_madt()
695 uint32_t pmu_interrupt = arm_feature(&armcpu->env, ARM_FEATURE_PMU) ? in build_madt()
698 if (vms->gic_version == VIRT_GIC_VERSION_2) { in build_madt()
732 if (vms->gic_version != VIRT_GIC_VERSION_2) { in build_madt()
740 if (its_class_name() && !vmc->no_its) { in build_madt()
755 const uint16_t spi_base = vms->irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE; in build_madt()
784 switch (vms->psci_conduit) { in build_fadt_rev6()
799 build_fadt(table_data, linker, &fadt, vms->oem_id, vms->oem_table_id); in build_fadt_rev6()
809 const MemMapEntry *memmap = vms->memmap; in build_dsdt()
810 const int *irqmap = vms->irqmap; in build_dsdt()
811 AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = vms->oem_id, in build_dsdt()
812 .oem_table_id = vms->oem_table_id }; in build_dsdt()
826 if (vms->second_ns_uart_present) { in build_dsdt()
830 if (vmc->acpi_expose_flash) { in build_dsdt()
838 if (vms->acpi_dev) { in build_dsdt()
840 HOTPLUG_HANDLER(vms->acpi_dev), in build_dsdt()
848 if (vms->acpi_dev) { in build_dsdt()
849 uint32_t event = object_property_get_uint(OBJECT(vms->acpi_dev), in build_dsdt()
850 "ged-event", &error_abort); in build_dsdt()
853 build_memory_hotplug_aml(scope, ms->ram_slots, "\\_SB", NULL, in build_dsdt()
867 g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); in build_dsdt()
898 GArray *tables_blob = tables->table_data; in virt_acpi_build()
904 bios_linker_loader_alloc(tables->linker, in virt_acpi_build()
909 dsdt = tables_blob->len; in virt_acpi_build()
910 build_dsdt(tables_blob, tables->linker, vms); in virt_acpi_build()
914 build_fadt_rev6(tables_blob, tables->linker, vms, dsdt); in virt_acpi_build()
917 build_madt(tables_blob, tables->linker, vms); in virt_acpi_build()
919 if (!vmc->no_cpu_topology) { in virt_acpi_build()
921 build_pptt(tables_blob, tables->linker, ms, in virt_acpi_build()
922 vms->oem_id, vms->oem_table_id); in virt_acpi_build()
926 build_gtdt(tables_blob, tables->linker, vms); in virt_acpi_build()
931 .base = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].base, in virt_acpi_build()
932 .size = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].size, in virt_acpi_build()
934 build_mcfg(tables_blob, tables->linker, &mcfg, vms->oem_id, in virt_acpi_build()
935 vms->oem_table_id); in virt_acpi_build()
939 spcr_setup(tables_blob, tables->linker, vms); in virt_acpi_build()
942 build_dbg2(tables_blob, tables->linker, vms); in virt_acpi_build()
944 if (vms->ras) { in virt_acpi_build()
945 build_ghes_error_table(tables->hardware_errors, tables->linker); in virt_acpi_build()
947 acpi_build_hest(tables_blob, tables->linker, vms->oem_id, in virt_acpi_build()
948 vms->oem_table_id); in virt_acpi_build()
951 if (ms->numa_state->num_nodes > 0) { in virt_acpi_build()
953 build_srat(tables_blob, tables->linker, vms); in virt_acpi_build()
954 if (ms->numa_state->have_numa_distance) { in virt_acpi_build()
956 build_slit(tables_blob, tables->linker, ms, vms->oem_id, in virt_acpi_build()
957 vms->oem_table_id); in virt_acpi_build()
960 if (ms->numa_state->hmat_enabled) { in virt_acpi_build()
962 build_hmat(tables_blob, tables->linker, ms->numa_state, in virt_acpi_build()
963 vms->oem_id, vms->oem_table_id); in virt_acpi_build()
967 if (ms->nvdimms_state->is_enabled) { in virt_acpi_build()
968 nvdimm_build_acpi(table_offsets, tables_blob, tables->linker, in virt_acpi_build()
969 ms->nvdimms_state, ms->ram_slots, vms->oem_id, in virt_acpi_build()
970 vms->oem_table_id); in virt_acpi_build()
973 if (its_class_name() && !vmc->no_its) { in virt_acpi_build()
975 build_iort(tables_blob, tables->linker, vms); in virt_acpi_build()
981 build_tpm2(tables_blob, tables->linker, tables->tcpalog, vms->oem_id, in virt_acpi_build()
982 vms->oem_table_id); in virt_acpi_build()
986 if (vms->iommu == VIRT_IOMMU_VIRTIO) { in virt_acpi_build()
988 build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf, in virt_acpi_build()
989 vms->oem_id, vms->oem_table_id); in virt_acpi_build()
993 xsdt = tables_blob->len; in virt_acpi_build()
994 build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id, in virt_acpi_build()
995 vms->oem_table_id); in virt_acpi_build()
1001 .oem_id = vms->oem_id, in virt_acpi_build()
1005 build_rsdp(tables->rsdp, tables->linker, &rsdp_data); in virt_acpi_build()
1012 if (tables_blob->len > ACPI_BUILD_TABLE_SIZE / 2) { in virt_acpi_build()
1015 tables_blob->len, ACPI_BUILD_TABLE_SIZE / 2); in virt_acpi_build()
1030 /* Make sure RAM size is correct - in case it got changed in acpi_ram_update()
1034 memcpy(memory_region_get_ram_ptr(mr), data->data, size); in acpi_ram_update()
1044 if (!build_state || build_state->patched) { in virt_acpi_build_update()
1047 build_state->patched = true; in virt_acpi_build_update()
1053 acpi_ram_update(build_state->table_mr, tables.table_data); in virt_acpi_build_update()
1054 acpi_ram_update(build_state->rsdp_mr, tables.rsdp); in virt_acpi_build_update()
1055 acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob); in virt_acpi_build_update()
1063 build_state->patched = false; in virt_acpi_build_reset()
1082 if (!vms->fw_cfg) { in virt_acpi_setup()
1098 build_state->table_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()
1101 assert(build_state->table_mr != NULL); in virt_acpi_setup()
1103 build_state->linker_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()
1105 tables.linker->cmd_blob, in virt_acpi_setup()
1108 fw_cfg_add_file(vms->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data, in virt_acpi_setup()
1111 if (vms->ras) { in virt_acpi_setup()
1112 assert(vms->acpi_dev); in virt_acpi_setup()
1113 acpi_ged_state = ACPI_GED(vms->acpi_dev); in virt_acpi_setup()
1114 acpi_ghes_add_fw_cfg(&acpi_ged_state->ghes_state, in virt_acpi_setup()
1115 vms->fw_cfg, tables.hardware_errors); in virt_acpi_setup()
1118 build_state->rsdp_mr = acpi_add_rom_blob(virt_acpi_build_update, in virt_acpi_setup()