public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Nate DeSimone" <nathaniel.l.desimone@intel.com>
To: "Luo, Heng" <heng.luo@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Chaganty, Rangasai V" <rangasai.v.chaganty@intel.com>
Subject: Re: [PATCH 31/40] TigerlakeSiliconPkg/Library: Add package common library instances
Date: Thu, 4 Feb 2021 03:56:31 +0000	[thread overview]
Message-ID: <BN6PR1101MB2147F39E8534A2FE4BEB836DCDB39@BN6PR1101MB2147.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210201013657.1833-31-heng.luo@intel.com>

Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>

> -----Original Message-----
> From: Luo, Heng <heng.luo@intel.com>
> Sent: Sunday, January 31, 2021 5:37 PM
> To: devel@edk2.groups.io
> Cc: Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Desimone,
> Nathaniel L <nathaniel.l.desimone@intel.com>
> Subject: [PATCH 31/40] TigerlakeSiliconPkg/Library: Add package common
> library instances
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3171
> 
> Adds the following files:
>   * Library/BasePciSegmentMultiSegLibPci
>   * Library/BaseSiConfigBlockLib
>   * Library/PeiDxeSmmMmPciLib
> 
> Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
> Signed-off-by: Heng Luo <heng.luo@intel.com>
> ---
> 
> Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Base
> PciSegmentMultiSegLibPci.inf |   38 +++++++++++++++++++++++++++
> 
> Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Base
> PciSegmentMultiSegLibPci.uni |   14 ++++++++++
> 
> Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/PciS
> egmentLib.c                  | 1280
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++++++++++++++
> 
> Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfigBl
> ockLib.c                   |   86
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++
> 
> Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfigBl
> ockLib.inf                 |   33 +++++++++++++++++++++++
> 
> Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSmm
> MmPciLib.c                         |   35 +++++++++++++++++++++++++
> 
> Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSmm
> MmPciLib.inf                       |   43 ++++++++++++++++++++++++++++++
>  7 files changed, 1529 insertions(+)
> 
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Ba
> sePciSegmentMultiSegLibPci.inf
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Ba
> sePciSegmentMultiSegLibPci.inf
> new file mode 100644
> index 0000000000..b04bce9cf0
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Ba
> sePciSegmentMultiSegLibPci.inf
> @@ -0,0 +1,38 @@
> +## @file
> 
> +# Instance of PCI Segment Library based on PCI Library.
> 
> +#
> 
> +# PCI Segment Library that layers on top of the PCI Library which only
> 
> +#  supports segment 0 and segment 1 PCI configuration access.
> 
> +#
> 
> +#  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +#
> 
> +##
> 
> +
> 
> +[Defines]
> 
> +  INF_VERSION                    = 0x00010005
> 
> +  BASE_NAME                      = BasePciSegmentMultiSegLibPci
> 
> +  MODULE_UNI_FILE                = BasePciSegmentMultiSegLibPci.uni
> 
> +  FILE_GUID                      = AC65B409-DF03-466e-8D2B-6FCE1079F0B2
> 
> +  MODULE_TYPE                    = BASE
> 
> +  VERSION_STRING                 = 1.0
> 
> +  LIBRARY_CLASS                  = PciSegmentLib
> 
> +
> 
> +#
> 
> +# The following information is for reference only and not required by the
> build tools.
> 
> +#
> 
> +#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
> 
> +#
> 
> +
> 
> +[Sources]
> 
> +  PciSegmentLib.c
> 
> +
> 
> +[Packages]
> 
> +  MdePkg/MdePkg.dec
> 
> +  TigerlakeSiliconPkg/SiPkg.dec
> 
> +
> 
> +[LibraryClasses]
> 
> +  BaseLib
> 
> +  PciLib
> 
> +  DebugLib
> 
> +  PcdLib
> 
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Ba
> sePciSegmentMultiSegLibPci.uni
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Ba
> sePciSegmentMultiSegLibPci.uni
> new file mode 100644
> index 0000000000..09bd0f5cfc
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Ba
> sePciSegmentMultiSegLibPci.uni
> @@ -0,0 +1,14 @@
> +/** @file
> 
> +  Instance of PCI Segment Library based on PCI Library.
> 
> +
> 
> +  PCI Segment Library that layers on top of the PCI Library which only
> 
> +   supports segment 0 and segment 1 PCI configuration access.
> 
> +
> 
> +  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +**/
> 
> +
> 
> +
> 
> +#string STR_MODULE_ABSTRACT             #language en-US "Instance of PCI
> Segment Library based on PCI Library."
> 
> +
> 
> +#string STR_MODULE_DESCRIPTION          #language en-US "PCI Segment
> Library that layers on top of the PCI Library which only supports segment 0
> and segment 1 PCI configuration access."
> 
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Pc
> iSegmentLib.c
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Pc
> iSegmentLib.c
> new file mode 100644
> index 0000000000..0d0c64be3f
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BasePciSegmentMultiSegLibPci/Pc
> iSegmentLib.c
> @@ -0,0 +1,1280 @@
> +/** @file
> 
> +  PCI Segment Library that layers on top of the PCI Library which only
> 
> +   supports segment 0 and segment 1 PCI configuration access.
> 
> +
> 
> +  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +**/
> 
> +
> 
> +#include <Base.h>
> 
> +#include <Library/BaseLib.h>
> 
> +#include <Library/DebugLib.h>
> 
> +#include <Library/PciLib.h>
> 
> +#include <Library/PciSegmentLib.h>
> 
> +
> 
> +/**
> 
> +  Assert the validity of a PCI Segment address.
> 
> +  A valid PCI Segment address should not contain 1's in bits 28..31 and 33..63
> 
> +  and the segment should be 0 or 1.
> 
> +
> 
> +  @param  A The address to validate.
> 
> +  @param  M Additional bits to assert to be zero.
> 
> +
> 
> +**/
> 
> +#define ASSERT_INVALID_PCI_SEGMENT_ADDRESS(A,M) \
> 
> +  ASSERT (((A) & (0xfffffffef0000000ULL | (M))) == 0)
> 
> +
> 
> +/**
> 
> +  Convert the PCI Segment library address to PCI library address.
> 
> +  From ICL generation support the multiple segment, and the segment
> number start from BIT28,
> 
> +  So we convert the Segment Number offset from BIT32 to BIT28
> 
> +
> 
> +  @param A The address to convert.
> 
> +**/
> 
> +#define PCI_SEGMENT_TO_PCI_ADDRESS(A) ((UINTN) (UINT32) ((A) |
> ((RShiftU64 ((A) & BIT32, 4)))))
> 
> +
> 
> +/**
> 
> +  Register a PCI device so PCI configuration registers may be accessed after
> 
> +  SetVirtualAddressMap().
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +
> 
> +  @param  Address The address that encodes the PCI Bus, Device, Function
> and
> 
> +                  Register.
> 
> +
> 
> +  @retval RETURN_SUCCESS           The PCI device was registered for runtime
> access.
> 
> +  @retval RETURN_UNSUPPORTED       An attempt was made to call this
> function
> 
> +                                   after ExitBootServices().
> 
> +  @retval RETURN_UNSUPPORTED       The resources required to access the
> PCI device
> 
> +                                   at runtime could not be mapped.
> 
> +  @retval RETURN_OUT_OF_RESOURCES  There are not enough resources
> available to
> 
> +                                   complete the registration.
> 
> +
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +PciSegmentRegisterForRuntimeAccess (
> 
> +  IN UINTN  Address
> 
> +  )
> 
> +{
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 0);
> 
> +  return PciRegisterForRuntimeAccess (PCI_SEGMENT_TO_PCI_ADDRESS
> (Address));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads an 8-bit PCI configuration register.
> 
> +
> 
> +  Reads and returns the 8-bit PCI configuration register specified by Address.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +
> 
> +  @return The 8-bit PCI configuration register specified by Address.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentRead8 (
> 
> +  IN UINT64                    Address
> 
> +  )
> 
> +{
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 0);
> 
> +
> 
> +  return PciRead8 (PCI_SEGMENT_TO_PCI_ADDRESS (Address));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Writes an 8-bit PCI configuration register.
> 
> +
> 
> +  Writes the 8-bit PCI configuration register specified by Address with the
> value specified by Value.
> 
> +  Value is returned.  This function must guarantee that all PCI read and write
> operations are serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +
> 
> +  @param  Address     The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  Value       The value to write.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentWrite8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT8                     Value
> 
> +  )
> 
> +{
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 0);
> 
> +
> 
> +  return PciWrite8 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), Value);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise OR of an 8-bit PCI configuration register with an 8-bit
> value.
> 
> +
> 
> +  Reads the 8-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise OR between the read result and the value specified by
> OrData,
> 
> +  and writes the result to the 8-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentOr8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT8                     OrData
> 
> +  )
> 
> +{
> 
> +  return PciWrite8 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), (UINT8)
> (PciSegmentRead8 (Address) | OrData));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit
> value.
> 
> +
> 
> +  Reads the 8-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise AND between the read result and the value specified
> by AndData,
> 
> +  and writes the result to the 8-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentAnd8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT8                     AndData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite8 (Address, (UINT8) (PciSegmentRead8 (Address)
> & AndData));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit
> value,
> 
> +  followed a  bitwise OR with another 8-bit value.
> 
> +
> 
> +  Reads the 8-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise AND between the read result and the value specified
> by AndData,
> 
> +  performs a bitwise OR between the result of the AND operation and the
> value specified by OrData,
> 
> +  and writes the result to the 8-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  AndData    The value to AND with the PCI configuration register.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentAndThenOr8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT8                     AndData,
> 
> +  IN UINT8                     OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite8 (Address, (UINT8) ((PciSegmentRead8 (Address)
> & AndData) | OrData));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field of a PCI configuration register.
> 
> +
> 
> +  Reads the bit field in an 8-bit PCI configuration register. The bit field is
> 
> +  specified by the StartBit and the EndBit. The value of the bit field is
> 
> +  returned.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 7, then ASSERT().
> 
> +  If EndBit is greater than 7, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to read.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +
> 
> +  @return The value of the bit field read from the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentBitFieldRead8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit
> 
> +  )
> 
> +{
> 
> +  return BitFieldRead8 (PciSegmentRead8 (Address), StartBit, EndBit);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Writes a bit field to a PCI configuration register.
> 
> +
> 
> +  Writes Value to the bit field of the PCI configuration register. The bit
> 
> +  field is specified by the StartBit and the EndBit. All other bits in the
> 
> +  destination PCI configuration register are preserved. The new value of the
> 
> +  8-bit register is returned.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 7, then ASSERT().
> 
> +  If EndBit is greater than 7, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If Value is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  Value     The new value of the bit field.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentBitFieldWrite8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT8                     Value
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite8 (
> 
> +           Address,
> 
> +           BitFieldWrite8 (PciSegmentRead8 (Address), StartBit, EndBit, Value)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in an 8-bit PCI configuration, performs a bitwise OR, and
> 
> +  writes the result back to the bit field in the 8-bit port.
> 
> +
> 
> +  Reads the 8-bit PCI configuration register specified by Address, performs a
> 
> +  bitwise OR between the read result and the value specified by
> 
> +  OrData, and writes the result to the 8-bit PCI configuration register
> 
> +  specified by Address. The value written to the PCI configuration register is
> 
> +  returned. This function must guarantee that all PCI read and write
> operations
> 
> +  are serialized. Extra left bits in OrData are stripped.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 7, then ASSERT().
> 
> +  If EndBit is greater than 7, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If OrData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentBitFieldOr8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT8                     OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite8 (
> 
> +           Address,
> 
> +           BitFieldOr8 (PciSegmentRead8 (Address), StartBit, EndBit, OrData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in an 8-bit PCI configuration register, performs a bitwise
> 
> +  AND, and writes the result back to the bit field in the 8-bit register.
> 
> +
> 
> +  Reads the 8-bit PCI configuration register specified by Address, performs a
> 
> +  bitwise AND between the read result and the value specified by AndData,
> and
> 
> +  writes the result to the 8-bit PCI configuration register specified by
> 
> +  Address. The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> 
> +  serialized. Extra left bits in AndData are stripped.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 7, then ASSERT().
> 
> +  If EndBit is greater than 7, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If AndData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentBitFieldAnd8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT8                     AndData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite8 (
> 
> +           Address,
> 
> +           BitFieldAnd8 (PciSegmentRead8 (Address), StartBit, EndBit, AndData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in an 8-bit port, performs a bitwise AND followed by a
> 
> +  bitwise OR, and writes the result back to the bit field in the
> 
> +  8-bit port.
> 
> +
> 
> +  Reads the 8-bit PCI configuration register specified by Address, performs a
> 
> +  bitwise AND followed by a bitwise OR between the read result and
> 
> +  the value specified by AndData, and writes the result to the 8-bit PCI
> 
> +  configuration register specified by Address. The value written to the PCI
> 
> +  configuration register is returned. This function must guarantee that all PCI
> 
> +  read and write operations are serialized. Extra left bits in both AndData and
> 
> +  OrData are stripped.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 7, then ASSERT().
> 
> +  If EndBit is greater than 7, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If AndData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +  If OrData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..7.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +  @param  OrData    The value to OR with the result of the AND operation.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT8
> 
> +EFIAPI
> 
> +PciSegmentBitFieldAndThenOr8 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT8                     AndData,
> 
> +  IN UINT8                     OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite8 (
> 
> +           Address,
> 
> +           BitFieldAndThenOr8 (PciSegmentRead8 (Address), StartBit, EndBit,
> AndData, OrData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a 16-bit PCI configuration register.
> 
> +
> 
> +  Reads and returns the 16-bit PCI configuration register specified by
> Address.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +
> 
> +  @return The 16-bit PCI configuration register specified by Address.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentRead16 (
> 
> +  IN UINT64                    Address
> 
> +  )
> 
> +{
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 1);
> 
> +
> 
> +  return PciRead16 (PCI_SEGMENT_TO_PCI_ADDRESS (Address));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Writes a 16-bit PCI configuration register.
> 
> +
> 
> +  Writes the 16-bit PCI configuration register specified by Address with the
> value specified by Value.
> 
> +  Value is returned.  This function must guarantee that all PCI read and write
> operations are serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address     The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  Value       The value to write.
> 
> +
> 
> +  @return The parameter of Value.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentWrite16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT16                    Value
> 
> +  )
> 
> +{
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 1);
> 
> +
> 
> +  return PciWrite16 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), Value);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise OR of a 16-bit PCI configuration register with
> 
> +  a 16-bit value.
> 
> +
> 
> +  Reads the 16-bit PCI configuration register specified by Address, performs
> a
> 
> +  bitwise OR between the read result and the value specified by
> 
> +  OrData, and writes the result to the 16-bit PCI configuration register
> 
> +  specified by Address. The value written to the PCI configuration register is
> 
> +  returned. This function must guarantee that all PCI read and write
> operations
> 
> +  are serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address The address that encodes the PCI Segment, Bus, Device,
> Function and
> 
> +                  Register.
> 
> +  @param  OrData  The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentOr16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT16                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite16 (Address, (UINT16) (PciSegmentRead16
> (Address) | OrData));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit
> value.
> 
> +
> 
> +  Reads the 16-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise AND between the read result and the value specified
> by AndData,
> 
> +  and writes the result to the 16-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentAnd16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT16                    AndData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite16 (Address, (UINT16) (PciSegmentRead16
> (Address) & AndData));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit
> value,
> 
> +  followed a  bitwise OR with another 16-bit value.
> 
> +
> 
> +  Reads the 16-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise AND between the read result and the value specified
> by AndData,
> 
> +  performs a bitwise OR between the result of the AND operation and the
> value specified by OrData,
> 
> +  and writes the result to the 16-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  AndData    The value to AND with the PCI configuration register.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentAndThenOr16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT16                    AndData,
> 
> +  IN UINT16                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite16 (Address, (UINT16) ((PciSegmentRead16
> (Address) & AndData) | OrData));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field of a PCI configuration register.
> 
> +
> 
> +  Reads the bit field in a 16-bit PCI configuration register. The bit field is
> 
> +  specified by the StartBit and the EndBit. The value of the bit field is
> 
> +  returned.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +  If StartBit is greater than 15, then ASSERT().
> 
> +  If EndBit is greater than 15, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to read.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +
> 
> +  @return The value of the bit field read from the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentBitFieldRead16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit
> 
> +  )
> 
> +{
> 
> +  return BitFieldRead16 (PciSegmentRead16 (Address), StartBit, EndBit);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Writes a bit field to a PCI configuration register.
> 
> +
> 
> +  Writes Value to the bit field of the PCI configuration register. The bit
> 
> +  field is specified by the StartBit and the EndBit. All other bits in the
> 
> +  destination PCI configuration register are preserved. The new value of the
> 
> +  16-bit register is returned.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +  If StartBit is greater than 15, then ASSERT().
> 
> +  If EndBit is greater than 15, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If Value is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +  @param  Value     The new value of the bit field.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentBitFieldWrite16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT16                    Value
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite16 (
> 
> +           Address,
> 
> +           BitFieldWrite16 (PciSegmentRead16 (Address), StartBit, EndBit, Value)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads the 16-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise OR between the read result and the value specified by
> OrData,
> 
> +  and writes the result to the 16-bit PCI configuration register specified by
> Address.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +  If StartBit is greater than 15, then ASSERT().
> 
> +  If EndBit is greater than 15, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If OrData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentBitFieldOr16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT16                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite16 (
> 
> +           Address,
> 
> +           BitFieldOr16 (PciSegmentRead16 (Address), StartBit, EndBit, OrData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in a 16-bit PCI configuration, performs a bitwise OR,
> 
> +  and writes the result back to the bit field in the 16-bit port.
> 
> +
> 
> +  Reads the 16-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise OR between the read result and the value specified by
> OrData,
> 
> +  and writes the result to the 16-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +  Extra left bits in OrData are stripped.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> 
> +  If StartBit is greater than 7, then ASSERT().
> 
> +  If EndBit is greater than 7, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If AndData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    The ordinal of the least significant bit in a byte is bit 0.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    The ordinal of the most significant bit in a byte is bit 7.
> 
> +  @param  AndData   The value to AND with the read value from the PCI
> configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentBitFieldAnd16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT16                    AndData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite16 (
> 
> +           Address,
> 
> +           BitFieldAnd16 (PciSegmentRead16 (Address), StartBit, EndBit,
> AndData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in a 16-bit port, performs a bitwise AND followed by a
> 
> +  bitwise OR, and writes the result back to the bit field in the
> 
> +  16-bit port.
> 
> +
> 
> +  Reads the 16-bit PCI configuration register specified by Address, performs
> a
> 
> +  bitwise AND followed by a bitwise OR between the read result and
> 
> +  the value specified by AndData, and writes the result to the 16-bit PCI
> 
> +  configuration register specified by Address. The value written to the PCI
> 
> +  configuration register is returned. This function must guarantee that all PCI
> 
> +  read and write operations are serialized. Extra left bits in both AndData and
> 
> +  OrData are stripped.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 15, then ASSERT().
> 
> +  If EndBit is greater than 15, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If AndData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +  If OrData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..15.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +  @param  OrData    The value to OR with the result of the AND operation.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +PciSegmentBitFieldAndThenOr16 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT16                    AndData,
> 
> +  IN UINT16                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite16 (
> 
> +           Address,
> 
> +           BitFieldAndThenOr16 (PciSegmentRead16 (Address), StartBit, EndBit,
> AndData, OrData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a 32-bit PCI configuration register.
> 
> +
> 
> +  Reads and returns the 32-bit PCI configuration register specified by
> Address.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +
> 
> +  @return The 32-bit PCI configuration register specified by Address.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentRead32 (
> 
> +  IN UINT64                    Address
> 
> +  )
> 
> +{
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 3);
> 
> +
> 
> +  return PciRead32 (PCI_SEGMENT_TO_PCI_ADDRESS (Address));
> 
> +}
> 
> +
> 
> +/**
> 
> +  Writes a 32-bit PCI configuration register.
> 
> +
> 
> +  Writes the 32-bit PCI configuration register specified by Address with the
> value specified by Value.
> 
> +  Value is returned.  This function must guarantee that all PCI read and write
> operations are serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address     The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  Value       The value to write.
> 
> +
> 
> +  @return The parameter of Value.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentWrite32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT32                    Value
> 
> +  )
> 
> +{
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 3);
> 
> +
> 
> +  return PciWrite32 (PCI_SEGMENT_TO_PCI_ADDRESS (Address), Value);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise OR of a 32-bit PCI configuration register with a 32-bit
> value.
> 
> +
> 
> +  Reads the 32-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise OR between the read result and the value specified by
> OrData,
> 
> +  and writes the result to the 32-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentOr32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT32                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite32 (Address, PciSegmentRead32 (Address) |
> OrData);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit
> value.
> 
> +
> 
> +  Reads the 32-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise AND between the read result and the value specified
> by AndData,
> 
> +  and writes the result to the 32-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentAnd32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT32                    AndData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite32 (Address, PciSegmentRead32 (Address) &
> AndData);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit
> value,
> 
> +  followed a  bitwise OR with another 32-bit value.
> 
> +
> 
> +  Reads the 32-bit PCI configuration register specified by Address,
> 
> +  performs a bitwise AND between the read result and the value specified
> by AndData,
> 
> +  performs a bitwise OR between the result of the AND operation and the
> value specified by OrData,
> 
> +  and writes the result to the 32-bit PCI configuration register specified by
> Address.
> 
> +  The value written to the PCI configuration register is returned.
> 
> +  This function must guarantee that all PCI read and write operations are
> serialized.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +
> 
> +  @param  Address   The address that encodes the PCI Segment, Bus,
> Device, Function, and Register.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentAndThenOr32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINT32                    AndData,
> 
> +  IN UINT32                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite32 (Address, (PciSegmentRead32 (Address) &
> AndData) | OrData);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field of a PCI configuration register.
> 
> +
> 
> +  Reads the bit field in a 32-bit PCI configuration register. The bit field is
> 
> +  specified by the StartBit and the EndBit. The value of the bit field is
> 
> +  returned.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +  If StartBit is greater than 31, then ASSERT().
> 
> +  If EndBit is greater than 31, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to read.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +
> 
> +  @return The value of the bit field read from the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentBitFieldRead32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit
> 
> +  )
> 
> +{
> 
> +  return BitFieldRead32 (PciSegmentRead32 (Address), StartBit, EndBit);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Writes a bit field to a PCI configuration register.
> 
> +
> 
> +  Writes Value to the bit field of the PCI configuration register. The bit
> 
> +  field is specified by the StartBit and the EndBit. All other bits in the
> 
> +  destination PCI configuration register are preserved. The new value of the
> 
> +  32-bit register is returned.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +  If StartBit is greater than 31, then ASSERT().
> 
> +  If EndBit is greater than 31, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If Value is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  Value     The new value of the bit field.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentBitFieldWrite32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT32                    Value
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite32 (
> 
> +           Address,
> 
> +           BitFieldWrite32 (PciSegmentRead32 (Address), StartBit, EndBit, Value)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in a 32-bit PCI configuration, performs a bitwise OR, and
> 
> +  writes the result back to the bit field in the 32-bit port.
> 
> +
> 
> +  Reads the 32-bit PCI configuration register specified by Address, performs
> a
> 
> +  bitwise OR between the read result and the value specified by
> 
> +  OrData, and writes the result to the 32-bit PCI configuration register
> 
> +  specified by Address. The value written to the PCI configuration register is
> 
> +  returned. This function must guarantee that all PCI read and write
> operations
> 
> +  are serialized. Extra left bits in OrData are stripped.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 31, then ASSERT().
> 
> +  If EndBit is greater than 31, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If OrData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  OrData    The value to OR with the PCI configuration register.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentBitFieldOr32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT32                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite32 (
> 
> +           Address,
> 
> +           BitFieldOr32 (PciSegmentRead32 (Address), StartBit, EndBit, OrData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in a 32-bit PCI configuration register, performs a bitwise
> 
> +  AND, and writes the result back to the bit field in the 32-bit register.
> 
> +
> 
> +
> 
> +  Reads the 32-bit PCI configuration register specified by Address, performs
> a bitwise
> 
> +  AND between the read result and the value specified by AndData, and
> writes the result
> 
> +  to the 32-bit PCI configuration register specified by Address. The value
> written to
> 
> +  the PCI configuration register is returned.  This function must guarantee
> that all PCI
> 
> +  read and write operations are serialized.  Extra left bits in AndData are
> stripped.
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> 
> +  If StartBit is greater than 31, then ASSERT().
> 
> +  If EndBit is greater than 31, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If AndData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentBitFieldAnd32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT32                    AndData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite32 (
> 
> +           Address,
> 
> +           BitFieldAnd32 (PciSegmentRead32 (Address), StartBit, EndBit,
> AndData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a bit field in a 32-bit port, performs a bitwise AND followed by a
> 
> +  bitwise OR, and writes the result back to the bit field in the
> 
> +  32-bit port.
> 
> +
> 
> +  Reads the 32-bit PCI configuration register specified by Address, performs
> a
> 
> +  bitwise AND followed by a bitwise OR between the read result and
> 
> +  the value specified by AndData, and writes the result to the 32-bit PCI
> 
> +  configuration register specified by Address. The value written to the PCI
> 
> +  configuration register is returned. This function must guarantee that all PCI
> 
> +  read and write operations are serialized. Extra left bits in both AndData and
> 
> +  OrData are stripped.
> 
> +
> 
> +  If any reserved bits in Address are set, then ASSERT().
> 
> +  If StartBit is greater than 31, then ASSERT().
> 
> +  If EndBit is greater than 31, then ASSERT().
> 
> +  If EndBit is less than StartBit, then ASSERT().
> 
> +  If AndData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +  If OrData is larger than the bitmask value range specified by StartBit and
> EndBit, then ASSERT().
> 
> +
> 
> +  @param  Address   The PCI configuration register to write.
> 
> +  @param  StartBit  The ordinal of the least significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  EndBit    The ordinal of the most significant bit in the bit field.
> 
> +                    Range 0..31.
> 
> +  @param  AndData   The value to AND with the PCI configuration register.
> 
> +  @param  OrData    The value to OR with the result of the AND operation.
> 
> +
> 
> +  @return The value written back to the PCI configuration register.
> 
> +
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +PciSegmentBitFieldAndThenOr32 (
> 
> +  IN UINT64                    Address,
> 
> +  IN UINTN                     StartBit,
> 
> +  IN UINTN                     EndBit,
> 
> +  IN UINT32                    AndData,
> 
> +  IN UINT32                    OrData
> 
> +  )
> 
> +{
> 
> +  return PciSegmentWrite32 (
> 
> +           Address,
> 
> +           BitFieldAndThenOr32 (PciSegmentRead32 (Address), StartBit, EndBit,
> AndData, OrData)
> 
> +           );
> 
> +}
> 
> +
> 
> +/**
> 
> +  Reads a range of PCI configuration registers into a caller supplied buffer.
> 
> +
> 
> +  Reads the range of PCI configuration registers specified by StartAddress
> and
> 
> +  Size into the buffer specified by Buffer. This function only allows the PCI
> 
> +  configuration registers from a single PCI function to be read. Size is
> 
> +  returned. When possible 32-bit PCI configuration read cycles are used to
> read
> 
> +  from StartAdress to StartAddress + Size. Due to alignment restrictions, 8-
> bit
> 
> +  and 16-bit PCI configuration read cycles may be used at the beginning and
> the
> 
> +  end of the range.
> 
> +
> 
> +  If any reserved bits in StartAddress are set, then ASSERT().
> 
> +  If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
> 
> +  If Size > 0 and Buffer is NULL, then ASSERT().
> 
> +
> 
> +  @param  StartAddress  The starting address that encodes the PCI
> Segment, Bus, Device,
> 
> +                        Function and Register.
> 
> +  @param  Size          The size in bytes of the transfer.
> 
> +  @param  Buffer        The pointer to a buffer receiving the data read.
> 
> +
> 
> +  @return Size
> 
> +
> 
> +**/
> 
> +UINTN
> 
> +EFIAPI
> 
> +PciSegmentReadBuffer (
> 
> +  IN  UINT64                   StartAddress,
> 
> +  IN  UINTN                    Size,
> 
> +  OUT VOID                     *Buffer
> 
> +  )
> 
> +{
> 
> +  UINTN                                ReturnValue;
> 
> +
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (StartAddress, 0);
> 
> +  ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
> 
> +
> 
> +  if (Size == 0) {
> 
> +    return Size;
> 
> +  }
> 
> +
> 
> +  ASSERT (Buffer != NULL);
> 
> +
> 
> +  //
> 
> +  // Save Size for return
> 
> +  //
> 
> +  ReturnValue = Size;
> 
> +
> 
> +  if ((StartAddress & BIT0) != 0) {
> 
> +    //
> 
> +    // Read a byte if StartAddress is byte aligned
> 
> +    //
> 
> +    *(volatile UINT8 *)Buffer = PciSegmentRead8 (StartAddress);
> 
> +    StartAddress += sizeof (UINT8);
> 
> +    Size -= sizeof (UINT8);
> 
> +    Buffer = (UINT8*)Buffer + 1;
> 
> +  }
> 
> +
> 
> +  if (Size >= sizeof (UINT16) && (StartAddress & BIT1) != 0) {
> 
> +    //
> 
> +    // Read a word if StartAddress is word aligned
> 
> +    //
> 
> +    WriteUnaligned16 (Buffer, PciSegmentRead16 (StartAddress));
> 
> +    StartAddress += sizeof (UINT16);
> 
> +    Size -= sizeof (UINT16);
> 
> +    Buffer = (UINT16*)Buffer + 1;
> 
> +  }
> 
> +
> 
> +  while (Size >= sizeof (UINT32)) {
> 
> +    //
> 
> +    // Read as many double words as possible
> 
> +    //
> 
> +    WriteUnaligned32 (Buffer, PciSegmentRead32 (StartAddress));
> 
> +    StartAddress += sizeof (UINT32);
> 
> +    Size -= sizeof (UINT32);
> 
> +    Buffer = (UINT32*)Buffer + 1;
> 
> +  }
> 
> +
> 
> +  if (Size >= sizeof (UINT16)) {
> 
> +    //
> 
> +    // Read the last remaining word if exist
> 
> +    //
> 
> +    WriteUnaligned16 (Buffer, PciSegmentRead16 (StartAddress));
> 
> +    StartAddress += sizeof (UINT16);
> 
> +    Size -= sizeof (UINT16);
> 
> +    Buffer = (UINT16*)Buffer + 1;
> 
> +  }
> 
> +
> 
> +  if (Size >= sizeof (UINT8)) {
> 
> +    //
> 
> +    // Read the last remaining byte if exist
> 
> +    //
> 
> +    *(volatile UINT8 *)Buffer = PciSegmentRead8 (StartAddress);
> 
> +  }
> 
> +
> 
> +  return ReturnValue;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Copies the data in a caller supplied buffer to a specified range of PCI
> 
> +  configuration space.
> 
> +
> 
> +  Writes the range of PCI configuration registers specified by StartAddress
> and
> 
> +  Size from the buffer specified by Buffer. This function only allows the PCI
> 
> +  configuration registers from a single PCI function to be written. Size is
> 
> +  returned. When possible 32-bit PCI configuration write cycles are used to
> 
> +  write from StartAdress to StartAddress + Size. Due to alignment
> restrictions,
> 
> +  8-bit and 16-bit PCI configuration write cycles may be used at the beginning
> 
> +  and the end of the range.
> 
> +
> 
> +  If any reserved bits in StartAddress are set, then ASSERT().
> 
> +  If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
> 
> +  If Size > 0 and Buffer is NULL, then ASSERT().
> 
> +
> 
> +  @param  StartAddress  The starting address that encodes the PCI
> Segment, Bus, Device,
> 
> +                        Function and Register.
> 
> +  @param  Size          The size in bytes of the transfer.
> 
> +  @param  Buffer        The pointer to a buffer containing the data to write.
> 
> +
> 
> +  @return The parameter of Size.
> 
> +
> 
> +**/
> 
> +UINTN
> 
> +EFIAPI
> 
> +PciSegmentWriteBuffer (
> 
> +  IN UINT64                    StartAddress,
> 
> +  IN UINTN                     Size,
> 
> +  IN VOID                      *Buffer
> 
> +  )
> 
> +{
> 
> +  UINTN                                ReturnValue;
> 
> +
> 
> +  ASSERT_INVALID_PCI_SEGMENT_ADDRESS (StartAddress, 0);
> 
> +  ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
> 
> +
> 
> +  if (Size == 0) {
> 
> +    return 0;
> 
> +  }
> 
> +
> 
> +  ASSERT (Buffer != NULL);
> 
> +
> 
> +  //
> 
> +  // Save Size for return
> 
> +  //
> 
> +  ReturnValue = Size;
> 
> +
> 
> +  if ((StartAddress & BIT0) != 0) {
> 
> +    //
> 
> +    // Write a byte if StartAddress is byte aligned
> 
> +    //
> 
> +    PciSegmentWrite8 (StartAddress, *(UINT8*) Buffer);
> 
> +    StartAddress += sizeof (UINT8);
> 
> +    Size -= sizeof (UINT8);
> 
> +    Buffer = (UINT8*) Buffer + 1;
> 
> +  }
> 
> +
> 
> +  if (Size >= sizeof (UINT16) && (StartAddress & BIT1) != 0) {
> 
> +    //
> 
> +    // Write a word if StartAddress is word aligned
> 
> +    //
> 
> +    PciSegmentWrite16 (StartAddress, ReadUnaligned16 (Buffer));
> 
> +    StartAddress += sizeof (UINT16);
> 
> +    Size -= sizeof (UINT16);
> 
> +    Buffer = (UINT16*) Buffer + 1;
> 
> +  }
> 
> +
> 
> +  while (Size >= sizeof (UINT32)) {
> 
> +    //
> 
> +    // Write as many double words as possible
> 
> +    //
> 
> +    PciSegmentWrite32 (StartAddress, ReadUnaligned32 (Buffer));
> 
> +    StartAddress += sizeof (UINT32);
> 
> +    Size -= sizeof (UINT32);
> 
> +    Buffer = (UINT32*) Buffer + 1;
> 
> +  }
> 
> +
> 
> +  if (Size >= sizeof (UINT16)) {
> 
> +    //
> 
> +    // Write the last remaining word if exist
> 
> +    //
> 
> +    PciSegmentWrite16 (StartAddress, ReadUnaligned16 (Buffer));
> 
> +    StartAddress += sizeof (UINT16);
> 
> +    Size -= sizeof (UINT16);
> 
> +    Buffer = (UINT16*) Buffer + 1;
> 
> +  }
> 
> +
> 
> +  if (Size >= sizeof (UINT8)) {
> 
> +    //
> 
> +    // Write the last remaining byte if exist
> 
> +    //
> 
> +    PciSegmentWrite8 (StartAddress, *(UINT8*) Buffer);
> 
> +  }
> 
> +
> 
> +  return ReturnValue;
> 
> +}
> 
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfig
> BlockLib.c
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfi
> gBlockLib.c
> new file mode 100644
> index 0000000000..4644de9b74
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfi
> gBlockLib.c
> @@ -0,0 +1,86 @@
> +/** @file
> 
> +  This file is BaseSiConfigBlockLib library is used to add config blocks
> 
> +  to config block header.
> 
> +
> 
> +  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +**/
> 
> +#include <ConfigBlock.h>
> 
> +#include <Library/DebugLib.h>
> 
> +#include <Library/IoLib.h>
> 
> +#include <Library/BaseMemoryLib.h>
> 
> +#include <Library/ConfigBlockLib.h>
> 
> +#include <Library/SiConfigBlockLib.h>
> 
> +
> 
> +
> 
> +/**
> 
> +  GetComponentConfigBlockTotalSize get config block table total size.
> 
> +
> 
> +  @param[in] ComponentBlocks    Component blocks array
> 
> +  @param[in] TotalBlockCount    Number of blocks
> 
> +
> 
> +  @retval                       Size of config block table
> 
> +**/
> 
> +UINT16
> 
> +EFIAPI
> 
> +GetComponentConfigBlockTotalSize (
> 
> +  IN COMPONENT_BLOCK_ENTRY *ComponentBlocks,
> 
> +  IN UINT16                TotalBlockCount
> 
> +  )
> 
> +{
> 
> +  UINT16            TotalBlockSize;
> 
> +  UINT16            BlockCount;
> 
> +
> 
> +  TotalBlockSize = 0;
> 
> +  for (BlockCount = 0 ; BlockCount < TotalBlockCount; BlockCount++) {
> 
> +    TotalBlockSize += (UINT32) ComponentBlocks[BlockCount].Size;
> 
> +    DEBUG ((DEBUG_INFO, "TotalBlockSize after adding Block[0x%x]=
> 0x%x\n", BlockCount, TotalBlockSize));
> 
> +  }
> 
> +
> 
> +  return TotalBlockSize;
> 
> +}
> 
> +
> 
> +/**
> 
> +  AddComponentConfigBlocks add all config blocks.
> 
> +
> 
> +  @param[in] ConfigBlockTableAddress    The pointer to add config blocks
> 
> +  @param[in] ComponentBlocks            Config blocks array
> 
> +  @param[in] TotalBlockCount            Number of blocks
> 
> +
> 
> +  @retval EFI_SUCCESS                   The policy default is initialized.
> 
> +  @retval EFI_OUT_OF_RESOURCES          Insufficient resources to create
> buffer
> 
> +**/
> 
> +EFI_STATUS
> 
> +EFIAPI
> 
> +AddComponentConfigBlocks (
> 
> +  IN VOID                  *ConfigBlockTableAddress,
> 
> +  IN COMPONENT_BLOCK_ENTRY *ComponentBlocks,
> 
> +  IN UINT16                TotalBlockCount
> 
> +  )
> 
> +{
> 
> +  UINT16            BlockCount;
> 
> +  VOID              *ConfigBlockPointer;
> 
> +  CONFIG_BLOCK      ConfigBlockBuf;
> 
> +  EFI_STATUS        Status;
> 
> +
> 
> +  Status = EFI_SUCCESS;
> 
> +
> 
> +  //
> 
> +  // Initialize ConfigBlockPointer to NULL
> 
> +  //
> 
> +  ConfigBlockPointer = NULL;
> 
> +  //
> 
> +  // Loop to identify each config block from ComponentBlocks[] Table and
> add each of them
> 
> +  //
> 
> +  for (BlockCount = 0; BlockCount < TotalBlockCount; BlockCount++) {
> 
> +    ZeroMem (&ConfigBlockBuf, sizeof (CONFIG_BLOCK));
> 
> +    CopyMem (&(ConfigBlockBuf.Header.GuidHob.Name),
> ComponentBlocks[BlockCount].Guid, sizeof (EFI_GUID));
> 
> +    ConfigBlockBuf.Header.GuidHob.Header.HobLength =
> ComponentBlocks[BlockCount].Size;
> 
> +    ConfigBlockBuf.Header.Revision        =
> ComponentBlocks[BlockCount].Revision;
> 
> +    ConfigBlockPointer = (VOID *)&ConfigBlockBuf;
> 
> +    Status = AddConfigBlock ((VOID *)ConfigBlockTableAddress, (VOID
> *)&ConfigBlockPointer);
> 
> +    ASSERT_EFI_ERROR (Status);
> 
> +    ComponentBlocks[BlockCount].LoadDefault (ConfigBlockPointer);
> 
> +  }
> 
> +  return Status;
> 
> +}
> 
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfig
> BlockLib.inf
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfi
> gBlockLib.inf
> new file mode 100644
> index 0000000000..e23b2d342f
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/BaseSiConfigBlockLib/BaseSiConfi
> gBlockLib.inf
> @@ -0,0 +1,33 @@
> +## @file
> 
> +# Component description file for the BaseSiConfigBlockLib library.
> 
> +#
> 
> +#  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +#
> 
> +##
> 
> +
> 
> +
> 
> +[Defines]
> 
> +INF_VERSION = 0x00010017
> 
> +BASE_NAME = BaseSiConfigBlockLib
> 
> +FILE_GUID = 6C068D0F-F48E-48CB-B369-433E507AF4A2
> 
> +VERSION_STRING = 1.0
> 
> +MODULE_TYPE = BASE
> 
> +LIBRARY_CLASS = SiConfigBlockLib
> 
> +
> 
> +
> 
> +[LibraryClasses]
> 
> +DebugLib
> 
> +IoLib
> 
> +ConfigBlockLib
> 
> +
> 
> +
> 
> +[Packages]
> 
> +MdePkg/MdePkg.dec
> 
> +TigerlakeSiliconPkg/SiPkg.dec
> 
> +
> 
> +
> 
> +[Sources]
> 
> +BaseSiConfigBlockLib.c
> 
> +
> 
> +
> 
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm
> mMmPciLib.c
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm
> mMmPciLib.c
> new file mode 100644
> index 0000000000..48e14dc9ee
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm
> mMmPciLib.c
> @@ -0,0 +1,35 @@
> +/** @file
> 
> +  This file contains routines that get PCI Express Address
> 
> +
> 
> +  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +**/
> 
> +#include <Library/BaseLib.h>
> 
> +#include <Library/PcdLib.h>
> 
> +#include <Library/DebugLib.h>
> 
> +
> 
> +/**
> 
> +  This procedure will get PCIE address
> 
> +
> 
> +  @param[in] Bus                  Pci Bus Number
> 
> +  @param[in] Device               Pci Device Number
> 
> +  @param[in] Function             Pci Function Number
> 
> +
> 
> +  @retval PCIE address
> 
> +**/
> 
> +UINTN
> 
> +EFIAPI
> 
> +MmPciBase (
> 
> +  IN UINT32                       Bus,
> 
> +  IN UINT32                       Device,
> 
> +  IN UINT32                       Function
> 
> +  )
> 
> +{
> 
> +  ASSERT ((Bus <= 0xFF) && (Device <= 0x1F) && (Function <= 0x7));
> 
> +
> 
> +#ifdef FSP_FLAG
> 
> +  return ((UINTN) PcdGet64 (PcdSiPciExpressBaseAddress) + (UINTN) (Bus
> << 20) + (UINTN) (Device << 15) + (UINTN) (Function << 12));
> 
> +#else
> 
> +  return ((UINTN) PcdGet64 (PcdPciExpressBaseAddress)   + (UINTN) (Bus
> << 20) + (UINTN) (Device << 15) + (UINTN) (Function << 12));
> 
> +#endif
> 
> +}
> 
> diff --git
> a/Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm
> mMmPciLib.inf
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm
> mMmPciLib.inf
> new file mode 100644
> index 0000000000..353b97f3f6
> --- /dev/null
> +++
> b/Silicon/Intel/TigerlakeSiliconPkg/Library/PeiDxeSmmMmPciLib/PeiDxeSm
> mMmPciLib.inf
> @@ -0,0 +1,43 @@
> +## @file
> 
> +# Component description file for the PeiDxeSmmMmPciLib
> 
> +#
> 
> +#  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +#
> 
> +##
> 
> +
> 
> +
> 
> +[Defines]
> 
> +INF_VERSION = 0x00010017
> 
> +BASE_NAME = PeiDxeSmmMmPciLib
> 
> +FILE_GUID = D03D6670-A032-11E2-9E96-0800200C9A66
> 
> +VERSION_STRING = 1.0
> 
> +MODULE_TYPE = BASE
> 
> +LIBRARY_CLASS = MmPciLib
> 
> +#
> 
> +# The following information is for reference only and not required by the
> build tools.
> 
> +#
> 
> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC
> 
> +#
> 
> +
> 
> +
> 
> +
> 
> +[LibraryClasses]
> 
> +BaseLib
> 
> +PcdLib
> 
> +DebugLib
> 
> +
> 
> +
> 
> +[Packages]
> 
> +MdePkg/MdePkg.dec
> 
> +TigerlakeSiliconPkg/SiPkg.dec
> 
> +
> 
> +
> 
> +[Pcd]
> 
> +gSiPkgTokenSpaceGuid.PcdSiPciExpressBaseAddress
> 
> +
> 
> +[FixedPcd]
> 
> +gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
> 
> +
> 
> +[Sources]
> 
> +PeiDxeSmmMmPciLib.c
> 
> --
> 2.24.0.windows.2


  reply	other threads:[~2021-02-04  3:56 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-01  1:36 [PATCH 01/40] TigerlakeSiliconPkg: Add package and Include/ConfigBlock headers Heng Luo
2021-02-01  1:36 ` [PATCH 02/40] TigerlakeSiliconPkg/Include: Add Library, PPI and Protocol include headers Heng Luo
2021-02-04  3:51   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 03/40] TigerlakeSiliconPkg/Include: Add Pins, Register and other " Heng Luo
2021-02-04  3:52   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 04/40] TigerlakeSiliconPkg/Cpu: Add Include headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 05/40] TigerlakeSiliconPkg/Pch: Add include headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 06/40] TigerlakeSiliconPkg/Pch: Add IncludePrivate headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 07/40] TigerlakeSiliconPkg/SystemAgent: Add include headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 08/40] TigerlakeSiliconPkg/SystemAgent: Add IncludePrivate headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 09/40] TigerlakeSiliconPkg/Fru: Add TglCpu/Include headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 10/40] TigerlakeSiliconPkg/Fru: Add TglCpu/IncludePrivate headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 11/40] TigerlakeSiliconPkg/Fru: Add TglPch/Include headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 12/40] TigerlakeSiliconPkg/Fru: Add TglPch/IncludePrivate headers Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 13/40] TigerlakeSiliconPkg/IpBlock: Add Cnvi component Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 14/40] TigerlakeSiliconPkg/IpBlock: Add CpuPcieRp component Heng Luo
2021-02-04  3:53   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 15/40] TigerlakeSiliconPkg/IpBlock: Add Espi component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 16/40] TigerlakeSiliconPkg/IpBlock: Add Gbe component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 17/40] TigerlakeSiliconPkg/IpBlock: Add Gpio component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 18/40] TigerlakeSiliconPkg/IpBlock: Add Graphics component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 19/40] TigerlakeSiliconPkg/IpBlock: Add Hda component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 20/40] TigerlakeSiliconPkg/IpBlock: Add HostBridge component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 21/40] TigerlakeSiliconPkg/IpBlock: Add P2sb component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 22/40] TigerlakeSiliconPkg/IpBlock: Add PchDmi component Heng Luo
2021-02-04  3:54   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 23/40] TigerlakeSiliconPkg/IpBlock: Add PcieRp component Heng Luo
2021-02-04  3:55   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 24/40] TigerlakeSiliconPkg/IpBlock: Add Pmc component Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 25/40] TigerlakeSiliconPkg/IpBlock: Add Psf component Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 26/40] TigerlakeSiliconPkg/IpBlock: Add Sata component Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 27/40] TigerlakeSiliconPkg/IpBlock: Add SerialIo component Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 28/40] TigerlakeSiliconPkg/IpBlock: Add Smbus component Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 29/40] TigerlakeSiliconPkg/IpBlock: Add Spi component Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 30/40] TigerlakeSiliconPkg/IpBlock: Add Vtd component Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 31/40] TigerlakeSiliconPkg/Library: Add package common library instances Heng Luo
2021-02-04  3:56   ` Nate DeSimone [this message]
2021-02-01  1:36 ` [PATCH 32/40] TigerlakeSiliconPkg/Pch: Add Pch " Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 33/40] TigerlakeSiliconPkg/Pch: Add Pch private " Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 34/40] TigerlakeSiliconPkg/SystemAgent: Add Acpi Tables and " Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 35/40] TigerlakeSiliconPkg/Fru/TglCpu: Add CpuPcieRp and Vtd " Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 36/40] TigerlakeSiliconPkg/Pch: Add Pch modules Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 37/40] TigerlakeSiliconPkg/SystemAgent: Add SystemAgent modules Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 38/40] TigerlakeSiliconPkg/Fru: Add Fru DSC files Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 39/40] TigerlakeSiliconPkg: Add package " Heng Luo
2021-02-04  3:56   ` Nate DeSimone
2021-02-01  1:36 ` [PATCH 40/40] Maintainers.txt: Add TigerlakeSiliconPkg maintainers Heng Luo
2021-02-04  3:51   ` Nate DeSimone
2021-02-04  8:24     ` Heng Luo
2021-02-04  3:51 ` [PATCH 01/40] TigerlakeSiliconPkg: Add package and Include/ConfigBlock headers Nate DeSimone

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BN6PR1101MB2147F39E8534A2FE4BEB836DCDB39@BN6PR1101MB2147.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox