]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/PlatformInitLib: dynamic mmio window size
authorGerd Hoffmann <kraxel@redhat.com>
Tue, 4 Oct 2022 13:47:27 +0000 (15:47 +0200)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 7 Oct 2022 18:14:05 +0000 (18:14 +0000)
In case we have a reliable PhysMemAddressWidth use that to dynamically
size the 64bit address window.  Allocate 1/8 of the physical address
space and place the window at the upper end of the address space.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
OvmfPkg/Library/PlatformInitLib/MemDetect.c

index 16ecbfadc30cdd35bb6575bf957c6ce21cc84b2f..ae217d0242ed1c26277069d6d0c861fab773c4ed 100644 (file)
@@ -604,6 +604,33 @@ PlatformAddressWidthFromCpuid (
   }\r
 }\r
 \r
+VOID\r
+EFIAPI\r
+PlatformDynamicMmioWindow (\r
+  IN OUT EFI_HOB_PLATFORM_INFO  *PlatformInfoHob\r
+  )\r
+{\r
+  UINT64  AddrSpace, MmioSpace;\r
+\r
+  AddrSpace = LShiftU64 (1, PlatformInfoHob->PhysMemAddressWidth);\r
+  MmioSpace = LShiftU64 (1, PlatformInfoHob->PhysMemAddressWidth - 3);\r
+\r
+  if ((PlatformInfoHob->PcdPciMmio64Size < MmioSpace) &&\r
+      (PlatformInfoHob->PcdPciMmio64Base + MmioSpace < AddrSpace))\r
+  {\r
+    DEBUG ((DEBUG_INFO, "%a: using dynamic mmio window\n", __func__));\r
+    DEBUG ((DEBUG_INFO, "%a:   Addr Space 0x%Lx (%Ld GB)\n", __func__, AddrSpace, RShiftU64 (AddrSpace, 30)));\r
+    DEBUG ((DEBUG_INFO, "%a:   MMIO Space 0x%Lx (%Ld GB)\n", __func__, MmioSpace, RShiftU64 (MmioSpace, 30)));\r
+    PlatformInfoHob->PcdPciMmio64Size = MmioSpace;\r
+    PlatformInfoHob->PcdPciMmio64Base = AddrSpace - MmioSpace;\r
+  } else {\r
+    DEBUG ((DEBUG_INFO, "%a: using classic mmio window\n", __func__));\r
+  }\r
+\r
+  DEBUG ((DEBUG_INFO, "%a:   Pci64 Base 0x%Lx\n", __func__, PlatformInfoHob->PcdPciMmio64Base));\r
+  DEBUG ((DEBUG_INFO, "%a:   Pci64 Size 0x%Lx\n", __func__, PlatformInfoHob->PcdPciMmio64Size));\r
+}\r
+\r
 /**\r
   Iterate over the PCI host bridges resources information optionally provided\r
   in fw-cfg and find the highest address contained in the PCI MMIO windows. If\r
@@ -765,6 +792,7 @@ PlatformAddressWidthInitialization (
   if (PlatformInfoHob->PhysMemAddressWidth != 0) {\r
     // physical address width is known\r
     PlatformInfoHob->FirstNonAddress = FirstNonAddress;\r
+    PlatformDynamicMmioWindow (PlatformInfoHob);\r
     return;\r
   }\r
 \r