summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2009-01-21 09:47:43 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2009-01-21 09:47:43 +0000
commit4c9c0f719df00f211790eadf04d21a93a0cdf76c (patch)
tree90a4d5a29da41787f75ac11191f707e8f2215f5e /EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk
parent96827f17562a5f055b7e14817f3388e881f33020 (diff)
downloadedk2-platforms-4c9c0f719df00f211790eadf04d21a93a0cdf76c.tar.xz
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
Diffstat (limited to 'EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk')
-rw-r--r--EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.c450
-rw-r--r--EdkCompatibilityPkg/Compatibility/PciCfg2OnPciCfgThunk/PciCfg2ToPciCfgThunk.inf108
2 files changed, 558 insertions, 0 deletions
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. <BR>
+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 <PiPei.h>
+#include <Ppi/PciCfg.h>
+#include <Ppi/PciCfg2.h>
+#include <Ppi/EcpPciCfg.h>
+#include <Library/DebugLib.h>
+
+//
+// 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