}\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
if (PlatformInfoHob->PhysMemAddressWidth != 0) {\r
// physical address width is known\r
PlatformInfoHob->FirstNonAddress = FirstNonAddress;\r
+ PlatformDynamicMmioWindow (PlatformInfoHob);\r
return;\r
}\r
\r