## @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 - 2011, Intel Corporation. All rights reserved.<BR>
#
#  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                      = PciCfg2OnPciCfgThunk
  FILE_GUID                      = 41401688-2862-431b-BAAC-6ECADAC384AB
  MODULE_TYPE                    = PEIM
  VERSION_STRING                 = 1.0

  ENTRY_POINT                    = PeimInitializePciCfg2

#
# The following information is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
#

[Sources]
  PciCfg2OnPciCfgThunk.c

[Packages]
  MdePkg/MdePkg.dec
  IntelFrameworkPkg/IntelFrameworkPkg.dec
  EdkCompatibilityPkg/EdkCompatibilityPkg.dec

[LibraryClasses]
  PeimEntryPoint
  DebugLib

[Ppis]
  gEfiPciCfgPpiInServiceTableGuid
  gEfiPciCfg2PpiGuid
  gEcpPeiPciCfgPpiGuid

[Depex]
  TRUE
