Fix bug in PciCfg to support PCI express address.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3549 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
yshang1 2007-08-06 03:52:01 +00:00
parent 38d64b3250
commit d8b61daacc
9 changed files with 70 additions and 25 deletions

View File

@ -53,7 +53,7 @@ PciCfgRead (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
switch (Width) { switch (Width) {
case EfiPeiPciCfgWidthUint8: case EfiPeiPciCfgWidthUint8:
* (UINT8 *) Buffer = PciRead8 (PciLibAddress); * (UINT8 *) Buffer = PciRead8 (PciLibAddress);
@ -103,7 +103,7 @@ PciCfgWrite (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
switch (Width) { switch (Width) {
case EfiPeiPciCfgWidthUint8: case EfiPeiPciCfgWidthUint8:
PciWrite8 (PciLibAddress, *(UINT8 *) Buffer); PciWrite8 (PciLibAddress, *(UINT8 *) Buffer);
@ -153,7 +153,7 @@ PciCfgModify (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
switch (Width) { switch (Width) {
case EfiPeiPciCfgWidthUint8: case EfiPeiPciCfgWidthUint8:
PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits); PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits);

View File

@ -71,6 +71,28 @@ EFI_PEI_PPI_DESCRIPTOR gPciCfgPpiList = {
&gPciCfgPpi &gPciCfgPpi
}; };
/**
Convert EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS to PCI_LIB_ADDRESS.
@param Address PCI address with
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS format.
@return The PCI address with PCI_LIB_ADDRESS format.
**/
UINTN
PciCfgAddressConvert (
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *Address
)
{
if (Address->ExtendedRegister == 0) {
return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->Register);
}
return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->ExtendedRegister);
}
/** /**
Reads from a given location in the PCI configuration space. Reads from a given location in the PCI configuration space.
@ -107,7 +129,7 @@ PciCfg2Read (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
if (Width == EfiPeiPciCfgWidthUint8) { if (Width == EfiPeiPciCfgWidthUint8) {
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress); *((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
@ -158,7 +180,7 @@ PciCfg2Write (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
if (Width == EfiPeiPciCfgWidthUint8) { if (Width == EfiPeiPciCfgWidthUint8) {
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
@ -216,7 +238,7 @@ PciCfg2Modify (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
if (Width == EfiPeiPciCfgWidthUint8) { if (Width == EfiPeiPciCfgWidthUint8) {
PciAndThenOr8 (PciLibAddress, ~(*(UINT8 *)ClearBits), *((UINT8 *) SetBits)); PciAndThenOr8 (PciLibAddress, ~(*(UINT8 *)ClearBits), *((UINT8 *) SetBits));

View File

@ -28,12 +28,20 @@
#include <IndustryStandard\Pci.h> #include <IndustryStandard\Pci.h>
#define COMMON_TO_PCILIB_ADDRESS(A) (UINTN)PCI_LIB_ADDRESS( \
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Bus, \ /**
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Device, \ Convert EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS to PCI_LIB_ADDRESS.
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Function, \
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Register \ @param Address PCI address with
) EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS format.
@return The PCI address with PCI_LIB_ADDRESS format.
**/
UINTN
PciCfgAddressConvert (
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *Address
);
/** /**

View File

@ -67,7 +67,6 @@
BaseMemoryLib BaseMemoryLib
PeiServicesTablePointerLib PeiServicesTablePointerLib
CustomDecompressLib CustomDecompressLib
TianoDecompressLib
UefiDecompressLib UefiDecompressLib
PeCoffLoaderLib PeCoffLoaderLib
CacheMaintenanceLib CacheMaintenanceLib

View File

@ -79,7 +79,7 @@
ReportStatusCodeLib|IntelFrameworkPkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ReportStatusCodeLib|IntelFrameworkPkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
SmBusLib|MdePkg/Library/PeiSmbusLibSmbus2Ppi/PeiSmbusLib.inf SmBusLib|MdePkg/Library/PeiSmbusLibSmbus2Ppi/PeiSmbusLibSmbus2Ppi.inf
[LibraryClasses.common.DXE_CORE] [LibraryClasses.common.DXE_CORE]
HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf

View File

@ -22,13 +22,27 @@
#include <IndustryStandard\Pci.h> #include <IndustryStandard\Pci.h>
#define COMMON_TO_PCILIB_ADDRESS(A) (UINTN)PCI_LIB_ADDRESS( \ /**
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Bus, \ Convert EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS to PCI_LIB_ADDRESS.
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Device, \
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Function, \
((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &A)->Register \
)
@param Address PCI address with
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS format.
@return The PCI address with PCI_LIB_ADDRESS format.
**/
STATIC
UINTN
PciCfgAddressConvert (
EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *Address
)
{
if (Address->ExtendedRegister == 0) {
return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->Register);
}
return PCI_LIB_ADDRESS (Address->Bus, Address->Device, Address->Function, Address->ExtendedRegister);
}
/** /**
Reads from a given location in the PCI configuration space. Reads from a given location in the PCI configuration space.
@ -206,7 +220,7 @@ PciCfg2Read (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
if (Width == EfiPeiPciCfgWidthUint8) { if (Width == EfiPeiPciCfgWidthUint8) {
*((UINT8 *) Buffer) = PciRead8 (PciLibAddress); *((UINT8 *) Buffer) = PciRead8 (PciLibAddress);
@ -257,7 +271,7 @@ PciCfg2Write (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
if (Width == EfiPeiPciCfgWidthUint8) { if (Width == EfiPeiPciCfgWidthUint8) {
PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); PciWrite8 (PciLibAddress, *((UINT8 *) Buffer));
@ -315,7 +329,7 @@ PciCfg2Modify (
{ {
UINTN PciLibAddress; UINTN PciLibAddress;
PciLibAddress = COMMON_TO_PCILIB_ADDRESS (Address); PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address);
if (Width == EfiPeiPciCfgWidthUint8) { if (Width == EfiPeiPciCfgWidthUint8) {
PciAndThenOr8 (PciLibAddress, ~(*(UINT8 *)ClearBits), *((UINT8 *) SetBits)); PciAndThenOr8 (PciLibAddress, ~(*(UINT8 *)ClearBits), *((UINT8 *) SetBits));

View File

@ -84,7 +84,7 @@
MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf
MdePkg/Library/PeiServicesLib/PeiServicesLib.inf MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
MdePkg/Library/PeiSmbusLibSmbus2Ppi/PeiSmbusLib.inf MdePkg/Library/PeiSmbusLibSmbus2Ppi/PeiSmbusLibSmbus2Ppi.inf
MdePkg/Library/SerialPortLibNull/SerialPortLibNull.inf MdePkg/Library/SerialPortLibNull/SerialPortLibNull.inf
MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf

View File

@ -101,6 +101,7 @@
PeCoffLoaderLib|MdeModulePkg/Library/DxePeCoffLoaderFromHobLib/DxePeCoffLoaderFromHobLib.inf PeCoffLoaderLib|MdeModulePkg/Library/DxePeCoffLoaderFromHobLib/DxePeCoffLoaderFromHobLib.inf
UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
DebugLib|IntelFrameworkPkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf DebugLib|IntelFrameworkPkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
[LibraryClasses.common.DXE_SMM_DRIVER] [LibraryClasses.common.DXE_SMM_DRIVER]
@ -250,7 +251,6 @@
PcdReportStatusCodePropertyMask|gEfiMdePkgTokenSpaceGuid|0x0f PcdReportStatusCodePropertyMask|gEfiMdePkgTokenSpaceGuid|0x0f
PcdDebugPropertyMask|gEfiMdePkgTokenSpaceGuid|0x1f PcdDebugPropertyMask|gEfiMdePkgTokenSpaceGuid|0x1f
PcdDebugClearMemoryValue|gEfiMdePkgTokenSpaceGuid|0xAF PcdDebugClearMemoryValue|gEfiMdePkgTokenSpaceGuid|0xAF
PcdDebugPrintErrorLevel|gEfiMdePkgTokenSpaceGuid|0x80000040
PcdPerformanceLibraryPropertyMask|gEfiMdePkgTokenSpaceGuid|0 PcdPerformanceLibraryPropertyMask|gEfiMdePkgTokenSpaceGuid|0
PcdMaxPeiPcdCallBackNumberPerPcdEntry|gEfiMdeModulePkgTokenSpaceGuid|0x08 PcdMaxPeiPcdCallBackNumberPerPcdEntry|gEfiMdeModulePkgTokenSpaceGuid|0x08
PcdVpdBaseAddress|gEfiMdeModulePkgTokenSpaceGuid|0x0 PcdVpdBaseAddress|gEfiMdeModulePkgTokenSpaceGuid|0x0
@ -349,6 +349,8 @@
PcdFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid|0 PcdFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid|0
PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid|0 PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid|0
PcdDebugPrintErrorLevel|gEfiMdePkgTokenSpaceGuid|0x80000040
################################################################################ ################################################################################
# #
# Components Section - list of all EDK II Modules needed by this Platform # Components Section - list of all EDK II Modules needed by this Platform