From: Shannon Zhao <shannon.z...@linaro.org> Add PCIe info struct, prepare for building PCIe table. And generate MCFG table.
Signed-off-by: Shannon Zhao <zhaoshengl...@huawei.com> Signed-off-by: Shannon Zhao <shannon.z...@linaro.org> --- hw/arm/virt-acpi-build.c | 21 +++++++++++++++++++++ include/hw/arm/virt-acpi-build.h | 9 +++++++++ 2 files changed, 30 insertions(+) diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index caa7096..ceea689 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -181,6 +181,24 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt) return rsdp_table; } +static void +build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info) +{ + AcpiTableMcfg *mcfg; + AcpiPcieInfo *info = guest_info->pcie_info; + int len = sizeof(*mcfg) + sizeof(mcfg->allocation[0]); + + mcfg = acpi_data_push(table_data, len); + mcfg->allocation[0].address = cpu_to_le64(info->pcie_ecam.addr); + + /* Only a single allocation so no need to play with segments */ + mcfg->allocation[0].pci_segment = cpu_to_le16(0); + mcfg->allocation[0].start_bus_number = 0; + mcfg->allocation[0].end_bus_number = info->nr_pcie_buses - 1; + + build_header(linker, table_data, (void *)mcfg, "MCFG", len, 1); +} + /* GTDT */ static void build_gtdt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info) @@ -349,6 +367,9 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables_blob); build_gtdt(tables_blob, tables->linker, guest_info); + acpi_add_table(table_offsets, tables_blob); + build_mcfg(tables_blob, tables->linker, guest_info); + /* RSDT is pointed to by RSDP */ rsdt = tables_blob->len; build_rsdt(tables_blob, tables->linker, table_offsets); diff --git a/include/hw/arm/virt-acpi-build.h b/include/hw/arm/virt-acpi-build.h index 60d6f0f..4dbc5d3 100644 --- a/include/hw/arm/virt-acpi-build.h +++ b/include/hw/arm/virt-acpi-build.h @@ -53,6 +53,14 @@ typedef struct AcpiDsdtInfo { const MemMap *flash_memmap; } AcpiDsdtInfo; +typedef struct AcpiPcieInfo { + const int *pcie_irq; + MemMap pcie_mmio; + MemMap pcie_ioport; + MemMap pcie_ecam; + int nr_pcie_buses; +} AcpiPcieInfo; + typedef struct VirtGuestInfo { int smp_cpus; int max_cpus; @@ -60,6 +68,7 @@ typedef struct VirtGuestInfo { AcpiMadtInfo *madt_info; AcpiDsdtInfo *dsdt_info; AcpiGtdtInfo *gtdt_info; + AcpiPcieInfo *pcie_info; } VirtGuestInfo; -- 2.0.4