]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/PciCfg2.c
Fix bug in PciCfg to support PCI express address.
[mirror_edk2.git] / MdeModulePkg / Universal / PcatSingleSegmentPciCfg2Pei / PciCfg2.c
index cab55126f82424c0524494b5e5dae2292a2c8c14..3542bdd6465c9af93bd29b8e8b9f1a74c7f5a66c 100644 (file)
 \r
 #include <IndustryStandard\Pci.h>\r
 \r
-#define COMMON_TO_PCILIB_ADDRESS(A) (UINTN)PCI_LIB_ADDRESS( \\r
-       ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Bus, \\r
-       ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Device, \\r
-       ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Function, \\r
-       ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Register \\r
-       )\r
+/**\r
+   Convert EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS to PCI_LIB_ADDRESS.\r
 \r
+   @param Address   PCI address with\r
+                    EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS format.\r
+   \r
+   @return The PCI address with PCI_LIB_ADDRESS format.\r
+   \r
+**/\r
+STATIC\r
+UINTN\r
+PciCfgAddressConvert (\r
+  EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *Address\r
+  )\r
+{\r
+  if (Address->ExtendedRegister == 0) {\r
+    return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->Register);\r
+  }\r
+\r
+  return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->ExtendedRegister);\r
+}\r
 \r
 /**\r
   Reads from a given location in the PCI configuration space.\r
@@ -206,7 +220,7 @@ PciCfg2Read (
 {\r
   UINTN  PciLibAddress;\r
 \r
-  PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address);\r
+  PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);\r
 \r
   if (Width == EfiPeiPciCfgWidthUint8) {\r
     *((UINT8 *) Buffer) = PciRead8 (PciLibAddress);\r
@@ -257,7 +271,7 @@ PciCfg2Write (
 {\r
   UINTN  PciLibAddress;\r
 \r
-  PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address);\r
+  PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);\r
 \r
   if (Width == EfiPeiPciCfgWidthUint8) {\r
     PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));\r
@@ -315,7 +329,7 @@ PciCfg2Modify (
 {\r
   UINTN  PciLibAddress;\r
 \r
-  PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address);\r
+  PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);\r
 \r
   if (Width == EfiPeiPciCfgWidthUint8) {\r
     PciAndThenOr8 (PciLibAddress, ~(*(UINT8 *)ClearBits), *((UINT8 *) SetBits));\r