From 4c9c0f719df00f211790eadf04d21a93a0cdf76c Mon Sep 17 00:00:00 2001 From: qwang12 Date: Wed, 21 Jan 2009 09:47:43 +0000 Subject: Rename module name from ***To*** to ***On***. AAAOnBBB means this module produce AAA Protocol/PPI based on BBB. This change improves the readability. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7328 6f19259b-4bc3-4df7-8a09-765794883524 --- .../PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.c | 450 +++++++++++++++++++++ .../PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.inf | 108 +++++ 2 files changed, 558 insertions(+) create mode 100644 EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.c create mode 100644 EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.inf (limited to 'EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk') diff --git a/EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.c b/EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.c new file mode 100644 index 0000000000..24196b1c86 --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.c @@ -0,0 +1,450 @@ +/** @file + Module produces PciCfgPpi2 on top of PciCfgPpi. It also updates the + PciCfg2Ppi pointer in the EFI_PEI_SERVICES upon a installation of + EcpPeiPciCfgPpi. + + EcpPeiPciCfgPpi is installed by a framework module which + produce PciCfgPpi originally. Such framework module is updated based on the + following rule to install EcpPeiPciCfgPpi instead of updating the PciCfg pointer + in the Framework PeiServicesTable: + + Search pattern: + PeiServices->PciCfg = <*>; + Replace pattern: + { + static EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEcpPeiPciCfgPpiGuid, + <*> + }; + (**PeiServices).InstallPpi (PeiServices, gEcpPeiPciCfgPpiList); + } + + In addition, the PeiServicesTable definition in PeiApi.h is updated to + + struct _EFI_PEI_SERVICES { + EFI_TABLE_HEADER Hdr; + ... + + // + // Pointer to PPI interface + // + if (PI_SPECIFICATION_VERSION < 0x00010000) + + PEI_CPU_IO_PPI *CpuIo; + ECP_PEI_PCI_CFG_PPI *PciCfg; //Changed. + else + ... + endif + + }; + + This change enable the detection of code segment which invokes PeiServices->PciCfg->Modify. + Such code causes a build break as ECP_PEI_PCI_CFG_PPI does not has "Modify" field. + This should be updated to a call to PeiLibPciCfgModify as shown below: + + Search pattern: + *->Modify(<*>); + Replace pattern: + PeiLibPciCfgModify(<*>); + + + +PIWG's PI specification replaces Inte's EFI Specification 1.10. +EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by +EFI_PEI_PCI_CFG2_PPI in PI 1.0. +This module produces PciCfgPpi on top of PciCfgPpi2. This module is used on platform when both of +these two conditions are true: +1) Framework module present that produces PCI CFG PPI AND +2) PI module that produces PCI CFG2 is not present + +Copyright (c) 2006 - 2008 Intel Corporation.
+All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include +#include +#include + +// +// Function Prototypes +// + +/** + Notification service to be called when gEcpPeiPciCfgPpiGuid is installed. + + @param PeiServices Indirect reference to the PEI Services Table. + @param NotifyDescriptor Address of the notification descriptor data structure. Type + EFI_PEI_NOTIFY_DESCRIPTOR is defined above. + @param Ppi Address of the PPI that was installed. + + @retval EFI_STATUS This function will install a PPI to PPI database. The status + code will be the code for (*PeiServices)->InstallPpi. + +**/ +EFI_STATUS +EFIAPI +EcpPciCfgPpiNotifyCallback ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi + ); + +// +// Function Prototypes +// +/** + Reads from a given location in the PCI configuration space. + + @param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. + + @param This Pointer to local data for the interface. + + @param Width The width of the access. Enumerated in bytes. + See EFI_PEI_PCI_CFG_PPI_WIDTH above. + + @param Address The physical address of the access. The format of + the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS. + + @param Buffer A pointer to the buffer of data.. + + + @retval EFI_SUCCESS The function completed successfully. + + @retval EFI_DEVICE_ERROR There was a problem with the transaction. + + @retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this + time. + +**/ +EFI_STATUS +EFIAPI +PciCfg2Read ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN CONST EFI_PEI_PCI_CFG2_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN OUT VOID *Buffer + ); + +/** + Write to a given location in the PCI configuration space. + + @param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. + + @param This Pointer to local data for the interface. + + @param Width The width of the access. Enumerated in bytes. + See EFI_PEI_PCI_CFG_PPI_WIDTH above. + + @param Address The physical address of the access. The format of + the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS. + + @param Buffer A pointer to the buffer of data.. + + + @retval EFI_SUCCESS The function completed successfully. + + @retval EFI_DEVICE_ERROR There was a problem with the transaction. + + @retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this + time. + +**/ +EFI_STATUS +EFIAPI +PciCfg2Write ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN CONST EFI_PEI_PCI_CFG2_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN OUT VOID *Buffer + ); + +/** + PCI read-modify-write operation. + + @param PeiServices An indirect pointer to the PEI Services Table + published by the PEI Foundation. + + @param This Pointer to local data for the interface. + + @param Width The width of the access. Enumerated in bytes. Type + EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read(). + + @param Address The physical address of the access. + + @param SetBits Points to value to bitwise-OR with the read configuration value. + The size of the value is determined by Width. + + @param ClearBits Points to the value to negate and bitwise-AND with the read configuration value. + The size of the value is determined by Width. + + + @retval EFI_SUCCESS The function completed successfully. + + @retval EFI_DEVICE_ERROR There was a problem with the transaction. + + @retval EFI_DEVICE_NOT_READY The device is not capable of supporting + the operation at this time. + +**/ +EFI_STATUS +EFIAPI +PciCfg2Modify ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN CONST EFI_PEI_PCI_CFG2_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN VOID *SetBits, + IN VOID *ClearBits + ); + +// +// Module globals +// +EFI_PEI_NOTIFY_DESCRIPTOR mNotifyOnEcpPciCfgList = { + (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEcpPeiPciCfgPpiGuid, + EcpPciCfgPpiNotifyCallback +}; + +EFI_PEI_PCI_CFG2_PPI mPciCfg2Ppi = { + PciCfg2Read, + PciCfg2Write, + PciCfg2Modify, + 0 +}; + +EFI_PEI_PPI_DESCRIPTOR mPpiListPciCfg2 = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPciCfg2PpiGuid, + &mPciCfg2Ppi +}; + + +/** + + Standard PEIM entry point. + + @param FfsHeadher The FFS file header + @param PeiServices General purpose services available to every PEIM. + + + @retval EFI_SUCCESS if the interface could be successfully + installed + +--*/ +EFI_STATUS +EFIAPI +PeimInitializePciCfg2 ( + IN EFI_PEI_FILE_HANDLE FfsHeader, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + VOID *Ppi; + + // + // Make sure no other module has install the first instance of gEfiPciCfg2PpiGuid. + // + Status = (*PeiServices)->LocatePpi (PeiServices, &gEfiPciCfg2PpiGuid, 0, NULL, &Ppi); + ASSERT (Status == EFI_NOT_FOUND); + + // + // Register a notification for ECP PCI CFG PPI + // + Status = (*PeiServices)->NotifyPpi (PeiServices, &mNotifyOnEcpPciCfgList); + ASSERT_EFI_ERROR (Status); + return Status; +} + + +/** + Notification service to be called when gEcpPeiPciCfgPpiGuid is installed. + + @param PeiServices Indirect reference to the PEI Services Table. + @param NotifyDescriptor Address of the notification descriptor data structure. Type + EFI_PEI_NOTIFY_DESCRIPTOR is defined above. + @param Ppi Address of the PPI that was installed. + + @retval EFI_STATUS This function will install a PPI to PPI database. The status + code will be the code for (*PeiServices)->InstallPpi. + +**/ +EFI_STATUS +EFIAPI +EcpPciCfgPpiNotifyCallback ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi + ) +{ + // + // When ECP PCI CFG PPI is installed, publish the PCI CFG2 PPI in the + // PEI Services Table and the PPI database + // + (*PeiServices)->PciCfg = &mPciCfg2Ppi; + return (*PeiServices)->InstallPpi ((CONST EFI_PEI_SERVICES **)PeiServices, &mPpiListPciCfg2); +} + +/** + Reads from a given location in the PCI configuration space. + + @param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. + + @param This Pointer to local data for the interface. + + @param Width The width of the access. Enumerated in bytes. + See EFI_PEI_PCI_CFG_PPI_WIDTH above. + + @param Address The physical address of the access. The format of + the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS. + + @param Buffer A pointer to the buffer of data.. + + + @retval EFI_SUCCESS The function completed successfully. + + @retval EFI_DEVICE_ERROR There was a problem with the transaction. + + @retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this + time. + +**/ +EFI_STATUS +EFIAPI +PciCfg2Read ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN CONST EFI_PEI_PCI_CFG2_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN OUT VOID *Buffer + ) +{ + EFI_STATUS Status; + EFI_PEI_PCI_CFG_PPI *PciCfg; + + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gEcpPeiPciCfgPpiGuid, + 0, + NULL, + (VOID **)&PciCfg + ); + ASSERT_EFI_ERROR (Status); + + return PciCfg->Read ((EFI_PEI_SERVICES **)PeiServices, PciCfg, Width, Address, Buffer); +} + +/** + Write to a given location in the PCI configuration space. + + @param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. + + @param This Pointer to local data for the interface. + + @param Width The width of the access. Enumerated in bytes. + See EFI_PEI_PCI_CFG_PPI_WIDTH above. + + @param Address The physical address of the access. The format of + the address is described by EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS. + + @param Buffer A pointer to the buffer of data.. + + + @retval EFI_SUCCESS The function completed successfully. + + @retval EFI_DEVICE_ERROR There was a problem with the transaction. + + @retval EFI_DEVICE_NOT_READY The device is not capable of supporting the operation at this + time. + +**/ +EFI_STATUS +EFIAPI +PciCfg2Write ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN CONST EFI_PEI_PCI_CFG2_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN OUT VOID *Buffer + ) +{ + EFI_STATUS Status; + EFI_PEI_PCI_CFG_PPI *PciCfg; + + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gEcpPeiPciCfgPpiGuid, + 0, + NULL, + (VOID **)&PciCfg + ); + ASSERT_EFI_ERROR (Status); + + return PciCfg->Write ((EFI_PEI_SERVICES **)PeiServices, PciCfg, Width, Address, Buffer); +} + +/** + PCI read-modify-write operation. + + @param PeiServices An indirect pointer to the PEI Services Table + published by the PEI Foundation. + + @param This Pointer to local data for the interface. + + @param Width The width of the access. Enumerated in bytes. Type + EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read(). + + @param Address The physical address of the access. + + @param SetBits Points to value to bitwise-OR with the read configuration value. + The size of the value is determined by Width. + + @param ClearBits Points to the value to negate and bitwise-AND with the read configuration value. + The size of the value is determined by Width. + + + @retval EFI_SUCCESS The function completed successfully. + + @retval EFI_DEVICE_ERROR There was a problem with the transaction. + + @retval EFI_DEVICE_NOT_READY The device is not capable of supporting + the operation at this time. + +**/ +EFI_STATUS +EFIAPI +PciCfg2Modify ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN CONST EFI_PEI_PCI_CFG2_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN VOID *SetBits, + IN VOID *ClearBits + ) +{ + EFI_STATUS Status; + EFI_PEI_PCI_CFG_PPI *PciCfg; + + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gEfiPciCfgPpiInServiceTableGuid, + 0, + NULL, + (VOID **)&PciCfg + ); + ASSERT_EFI_ERROR (Status); + + return PciCfg->Modify ((EFI_PEI_SERVICES **)PeiServices, PciCfg, Width, Address, *(UINTN *)SetBits, *(UINTN *)ClearBits); +} diff --git a/EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.inf b/EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.inf new file mode 100644 index 0000000000..ea1b5c89dc --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.inf @@ -0,0 +1,108 @@ +#/** @file +# Module produces PciCfgPpi2 on top of PciCfgPpi. It also updates the +# PciCfg2Ppi pointer in the EFI_PEI_SERVICES upon a installation of +# EcpPeiPciCfgPpi. +# +# EcpPeiPciCfgPpi is installed by a framework module which +# produce PciCfgPpi originally. Such framework module is updated based on the +# following rule to install EcpPeiPciCfgPpi instead of updating the PciCfg pointer +# in the Framework PeiServicesTable: +# +# Search pattern: +# PeiServices->PciCfg = <*>; +# Replace pattern: +# { +# static EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { +# (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), +# &gEcpPeiPciCfgPpiGuid, +# <*> +# }; +# (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList); +# } +# +# In addition, the PeiServicesTable definition in PeiApi.h is updated to +# +# struct _EFI_PEI_SERVICES { +# EFI_TABLE_HEADER Hdr; +# ... +# +# // +# // Pointer to PPI interface +# // +# #if (PI_SPECIFICATION_VERSION < 0x00010000) +# +# PEI_CPU_IO_PPI *CpuIo; +# ECP_PEI_PCI_CFG_PPI *PciCfg; //Changed. +# #else +# ... +# #endif +# +# }; +# +# This change enable the detection of code segment which invokes PeiServices->PciCfg->Modify. +# Such code causes a build break as ECP_PEI_PCI_CFG_PPI does not has "Modify" field. +# This should be updated to a call to PeiLibPciCfgModify as shown below: +# +# Search pattern: +# *->Modify(<*>); +# Replace pattern: +# PeiLibPciCfgModify(<*>); +# +# PIWG's PI specification replaces Inte's EFI Specification 1.10. +# EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by +# EFI_PEI_PCI_CFG2_PPI in PI 1.0. +# This module produces PciCfgPpi on top of PciCfgPpi2. This module is used on platform when both of +# these two conditions are true: +# 1) Framework module present that produces PCI CFG PPI AND +# 2) PI module that produces PCI CFG2 is not present + +# +# PEIM to provide the Variable functionality. +# Copyright (c) 2006 - 2007, Intel Corporation +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciCfg2ToPciCfgThunk + FILE_GUID = 41401688-2862-431b-BAAC-6ECADAC384AB + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + ENTRY_POINT = PeimInitializePciCfg2 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources.common] + PciCfg2ToPciCfgThunk.c + +[Packages] + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + EdkCompatibilityPkg/EdkCompatibilityPkg.dec + +[LibraryClasses] + PeimEntryPoint + DebugLib + +[Ppis] + gEfiPciCfgPpiInServiceTableGuid + gEfiPciCfg2PpiGuid + gEcpPeiPciCfgPpiGuid + +[Depex] + TRUE -- cgit v1.2.3