[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 15/17] hvmloader: Set MCFG in ACPI table



This patch extends hvmloader_acpi_build_tables() to detect if MMCONFIG
is available by obtaining its base address and size from the hypercall
HVMOP_get_ecam_space and sets the flag ACPI_HAS_MCFG in the ACPI config
if needed.

This also sets the MMCONFIG area in E820 map using the same method.

Signed-off-by: Thierry Escande <thierry.escande@xxxxxxxxxx>
---
 tools/firmware/hvmloader/e820.c | 11 +++++++++++
 tools/firmware/hvmloader/util.c |  9 +++++++++
 2 files changed, 20 insertions(+)

diff --git a/tools/firmware/hvmloader/e820.c b/tools/firmware/hvmloader/e820.c
index 86d39544e8..ff5c270f57 100644
--- a/tools/firmware/hvmloader/e820.c
+++ b/tools/firmware/hvmloader/e820.c
@@ -158,6 +158,8 @@ int build_e820_table(struct e820entry *e820,
     unsigned long acpi_mem_end = acpi_enabled ?
         ACPI_MEMORY_DYNAMIC_START + (acpi_pages_allocated() << PAGE_SHIFT) :
         RESERVED_MEMBASE;
+    uint64_t mmconfig_addr;
+    uint32_t mmconfig_size;
 
     if ( !lowmem_reserved_base )
             lowmem_reserved_base = 0xA0000;
@@ -260,6 +262,15 @@ int build_e820_table(struct e820entry *e820,
         nr++;
     }
 
+    /* mark MMCONFIG area */
+    if ( ! hvm_get_ecam_space(&mmconfig_addr, &mmconfig_size) )
+    {
+        e820[nr].addr = mmconfig_addr;
+        e820[nr].size = mmconfig_size;
+        e820[nr].type = E820_RESERVED;
+        nr++;
+    }
+
     /* Low RAM goes here. Reserve space for special pages. */
     BUG_ON(low_mem_end < MB(2));
 
diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
index ee7a09b5bc..2cd1cadfc3 100644
--- a/tools/firmware/hvmloader/util.c
+++ b/tools/firmware/hvmloader/util.c
@@ -903,6 +903,8 @@ void hvmloader_acpi_build_tables(struct acpi_config *config,
     struct acpi_ctxt ctxt;
     long long tpm_version;
     char *end;
+    uint64_t mmconfig_addr;
+    uint32_t mmconfig_size;
 
     /* Allocate and initialise the acpi info area. */
     mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1);
@@ -953,6 +955,13 @@ void hvmloader_acpi_build_tables(struct acpi_config 
*config,
         config->pci_hi_len = pci_hi_mem_end - pci_hi_mem_start;
     }
 
+    if ( ! hvm_get_ecam_space(&mmconfig_addr, &mmconfig_size) )
+    {
+        config->table_flags |= ACPI_HAS_MCFG;
+        config->mmconfig_addr = mmconfig_addr;
+        config->mmconfig_size = mmconfig_size;
+    }
+
     s = xenstore_read("platform/generation-id", "0:0");
     if ( s )
     {
-- 
2.51.0



--
Thierry Escande | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.