]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/PciHostBridgeLib/XenSupport.c
OvmfPkg/XenSupport: turn off address decoding before BAR sizing
[mirror_edk2.git] / OvmfPkg / Library / PciHostBridgeLib / XenSupport.c
index 76fca533c11a9623e98f9b4dc1feac534a57d700..b41bd6b3002bb54105ca93b10f60038fd75af518 100644 (file)
@@ -49,6 +49,22 @@ PcatPciRootBridgeBarExisted (
   EnableInterrupts ();\r
 }\r
 \r
+#define PCI_COMMAND_DECODE ((UINT16)(EFI_PCI_COMMAND_IO_SPACE | \\r
+                                     EFI_PCI_COMMAND_MEMORY_SPACE))\r
+STATIC\r
+VOID\r
+PcatPciRootBridgeDecodingDisable (\r
+  IN  UINTN                          Address\r
+  )\r
+{\r
+  UINT16                             Value;\r
+\r
+  Value = PciRead16 (Address);\r
+  if (Value & PCI_COMMAND_DECODE) {\r
+    PciWrite16 (Address, Value & ~(UINT32)PCI_COMMAND_DECODE);\r
+  }\r
+}\r
+\r
 STATIC\r
 VOID\r
 PcatPciRootBridgeParseBars (\r
@@ -75,6 +91,11 @@ PcatPciRootBridgeParseBars (
   UINT64                            Limit;\r
   PCI_ROOT_BRIDGE_APERTURE          *MemAperture;\r
 \r
+  // Disable address decoding for every device before OVMF starts sizing it\r
+  PcatPciRootBridgeDecodingDisable (\r
+    PCI_LIB_ADDRESS (Bus, Device, Function, PCI_COMMAND_OFFSET)\r
+  );\r
+\r
   for (Offset = BarOffsetBase; Offset < BarOffsetEnd; Offset += sizeof (UINT32)) {\r
     PcatPciRootBridgeBarExisted (\r
       PCI_LIB_ADDRESS (Bus, Device, Function, Offset),\r