&gPciCfgPpi\r
};\r
\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
+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
\r
{\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
{\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
IN CONST EFI_PEI_PCI_CFG2_PPI *This,\r
IN EFI_PEI_PCI_CFG_PPI_WIDTH Width,\r
IN UINT64 Address,\r
- IN CONST VOID *SetBits,\r
- IN CONST VOID *ClearBits\r
+ IN VOID *SetBits,\r
+ IN VOID *ClearBits\r
)\r
{\r
- UINTN PciLibAddress;\r
+ UINTN PciLibAddress;\r
+ UINT16 ClearValue16;\r
+ UINT16 SetValue16;\r
+ UINT32 ClearValue32;\r
+ UINT32 SetValue32;\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
+ PciAndThenOr8 (PciLibAddress, (UINT8) (~(*(UINT8 *) ClearBits)), *((UINT8 *) SetBits));\r
} else if (Width == EfiPeiPciCfgWidthUint16) {\r
- PciAndThenOr16 (PciLibAddress, ~ReadUnaligned16 ((UINT16 *) ClearBits), ReadUnaligned16 ((UINT16 *) SetBits));\r
+ ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits));\r
+ SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits);\r
+ PciAndThenOr16 (PciLibAddress, ClearValue16, SetValue16);\r
} else if (Width == EfiPeiPciCfgWidthUint32) {\r
- PciAndThenOr32 (PciLibAddress, ~ReadUnaligned32 ((UINT32 *) ClearBits), ReadUnaligned32 ((UINT32 *) SetBits));\r
+ ClearValue32 = (UINT32) (~ReadUnaligned32 ((UINT32 *) ClearBits));\r
+ SetValue32 = ReadUnaligned32 ((UINT32 *) SetBits);\r
+ PciAndThenOr32 (PciLibAddress, ClearValue32, SetValue32);\r
} else {\r
return EFI_INVALID_PARAMETER;\r
}\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Module's entry function. \r
+ This routine will install EFI_PEI_PCI_CFG2_PPI or EFI_PEI_PCI_CFG_PPI\r
+ according to PeiServices's version.\r
+ \r
+ @param FileHandle Handle of the file being invoked.\r
+ @param PeiServices Describes the list of possible PEI Services.\r
\r
+ @return Whether success to install service\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PeimInitializePciCfg (\r
- IN EFI_FFS_FILE_HEADER *FfsHeader,\r
- IN EFI_PEI_SERVICES **PeiServices\r
+ IN EFI_PEI_FILE_HANDLE FileHandle,\r
+ IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
EFI_STATUS Status;\r
// FrameworkPeiServices = (FRAMEWORK_PEI_SERVICES **) PeiServices;\r
// (**FrameworkPeiServices).PciCfg = &mPciCfgPpi;\r
// \r
- (**PeiServices).PciCfg = (EFI_PEI_PCI_CFG2_PPI *) &gPciCfgPpi;\r
+ (**(EFI_PEI_SERVICES**)PeiServices).PciCfg = (EFI_PEI_PCI_CFG2_PPI *) &gPciCfgPpi;\r
} else {\r
- (**PeiServices).PciCfg = &gPciCfg2Ppi;\r
+ (**(EFI_PEI_SERVICES**)PeiServices).PciCfg = &gPciCfg2Ppi;\r
}\r
\r
if (!FeaturePcdGet (PcdPciCfgDisable)) {\r
\r
return Status;\r
}\r
+\r