-/**\r
+/** @file\r
+ Installs Single Segment Pci Configuration PPI.\r
\r
Copyright (c) 2006 - 2007, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
#include <Library/PciLib.h>\r
#include <Library/PeimEntryPoint.h>\r
\r
-#include <IndustryStandard\Pci.h>\r
+#include <IndustryStandard/Pci.h>\r
+\r
+/**\r
+ Convert EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS to PCI_LIB_ADDRESS.\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
+ @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
EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
PciCfg2Read (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN CONST EFI_PEI_PCI_CFG2_PPI *This,\r
\r
**/\r
EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
PciCfg2Write (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN CONST EFI_PEI_PCI_CFG2_PPI *This,\r
\r
**/\r
EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
PciCfg2Modify (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\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
\r
\r
**/\r
EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
PciCfg2Read (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN CONST EFI_PEI_PCI_CFG2_PPI *This,\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
**/\r
EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
PciCfg2Write (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN CONST EFI_PEI_PCI_CFG2_PPI *This,\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
\r
**/\r
EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
PciCfg2Modify (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\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
ASSERT ((**PeiServices).Hdr.Revision >= PEI_SERVICES_REVISION);\r
\r
(**PeiServices).PciCfg = &gPciCfg2Ppi;\r
- Status = (**PeiServices).InstallPpi (PeiServices, &gPciCfg2PpiList);\r
+ Status = (**PeiServices).InstallPpi ((CONST EFI_PEI_SERVICES **)PeiServices, &gPciCfg2PpiList);\r
\r
return Status;\r
}\r