/** @file
  PI PEI master include file. This file should match the PI spec.

Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  PI Version 1.7.

**/

#ifndef __PI_PEICIS_H__
#define __PI_PEICIS_H__

#include <Uefi/UefiMultiPhase.h>
#include <Pi/PiMultiPhase.h>

///
/// The handles of EFI FV.
///
typedef VOID *EFI_PEI_FV_HANDLE;

///
/// The handles of EFI FFS.
///
typedef VOID *EFI_PEI_FILE_HANDLE;

///
/// Declare the forward reference data structure for EFI_PEI_SERVICE.
///
typedef struct _EFI_PEI_SERVICES EFI_PEI_SERVICES;

///
/// Declare the forward reference data structure for EFI_PEI_NOTIFY_DESCRIPTOR.
///
typedef struct _EFI_PEI_NOTIFY_DESCRIPTOR EFI_PEI_NOTIFY_DESCRIPTOR;

#include <Ppi/CpuIo.h>
#include <Ppi/PciCfg2.h>

/**
  The PEI Dispatcher will invoke each PEIM one time.  During this pass, the PEI
  Dispatcher will pass control to the PEIM at the AddressOfEntryPoint in the PE Header.

  @param  FileHandle       Pointer to the FFS file header.
  @param  PeiServices      Describes the list of possible PEI Services.

  @retval EFI_SUCCESS      The PEI completed successfully.
  @retval !EFI_SUCCESS     There is error in PEIM.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEIM_ENTRY_POINT2)(
  IN EFI_PEI_FILE_HANDLE             FileHandle,
  IN CONST EFI_PEI_SERVICES          **PeiServices
  );

/**
  Entry point of the notification callback function itself within the PEIM.

  @param  PeiServices      Indirect reference to the PEI Services Table.
  @param  NotifyDescriptor Address of the notification descriptor data structure.
  @param  Ppi              Address of the PPI that was installed.

  @return Status of the notification.
          The status code returned from this function is ignored.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEIM_NOTIFY_ENTRY_POINT)(
  IN EFI_PEI_SERVICES           **PeiServices,
  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
  IN VOID                       *Ppi
  );

//
// PEI Ppi Services List Descriptors
//
#define EFI_PEI_PPI_DESCRIPTOR_PIC              0x00000001
#define EFI_PEI_PPI_DESCRIPTOR_PPI              0x00000010
#define EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK  0x00000020
#define EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH  0x00000040
#define EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES     0x00000060
#define EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST   0x80000000

///
/// The data structure through which a PEIM describes available services to the PEI Foundation.
///
typedef struct {
  ///
  /// This field is a set of flags describing the characteristics of this imported table entry.
  /// All flags are defined as EFI_PEI_PPI_DESCRIPTOR_***, which can also be combined into one.
  ///
  UINTN       Flags;
  ///
  /// The address of the EFI_GUID that names the interface.
  ///
  EFI_GUID    *Guid;
  ///
  /// A pointer to the PPI. It contains the information necessary to install a service.
  ///
  VOID        *Ppi;
} EFI_PEI_PPI_DESCRIPTOR;

///
/// The data structure in a given PEIM that tells the PEI
/// Foundation where to invoke the notification service.
///
struct _EFI_PEI_NOTIFY_DESCRIPTOR {
  ///
  /// Details if the type of notification are callback or dispatch.
  ///
  UINTN                          Flags;
  ///
  /// The address of the EFI_GUID that names the interface.
  ///
  EFI_GUID                       *Guid;
  ///
  /// Address of the notification callback function itself within the PEIM.
  ///
  EFI_PEIM_NOTIFY_ENTRY_POINT    Notify;
};

///
/// This data structure is the means by which callable services are installed and
/// notifications are registered in the PEI phase.
///
typedef union {
  ///
  /// The typedef structure of the notification descriptor.
  ///
  EFI_PEI_NOTIFY_DESCRIPTOR    Notify;
  ///
  /// The typedef structure of the PPI descriptor.
  ///
  EFI_PEI_PPI_DESCRIPTOR       Ppi;
} EFI_PEI_DESCRIPTOR;

/**
  This service is the first one provided by the PEI Foundation.  This function
  installs an interface in the PEI PPI database by GUID.  The purpose of the
  service is to publish an interface that other parties can use to call
  additional PEIMs.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table
                           published by the PEI Foundation.
  @param  PpiList          A pointer to the list of interfaces that the caller shall install.

  @retval EFI_SUCCESS           The interface was successfully installed.
  @retval EFI_INVALID_PARAMETER The PpiList pointer is NULL or Any of the PEI PPI
                                descriptors in the list do not have the
                                EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field.
  @retval EFI_OUT_OF_RESOURCES  There is no additional space in the PPI database.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_INSTALL_PPI)(
  IN CONST EFI_PEI_SERVICES            **PeiServices,
  IN CONST EFI_PEI_PPI_DESCRIPTOR      *PpiList
  );

/**
  This function reinstalls an interface in the PEI PPI database by GUID.
  The purpose of the service is to publish an interface that other parties
  can use to replace a same-named interface in the protocol database
  with a different interface.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table
                           published by the PEI Foundation.
  @param  OldPpi           A pointer to the former PPI in the database.
  @param  NewPpi           A pointer to the new interfaces that the caller shall install.

  @retval EFI_SUCCESS           The interface was successfully installed.
  @retval EFI_INVALID_PARAMETER The PpiList pointer is NULL or Any of the PEI PPI descriptors in the
                                list do not have the EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field.
  @retval EFI_OUT_OF_RESOURCES  There is no additional space in the PPI database.
  @retval EFI_NOT_FOUND         The PPI for which the reinstallation was requested has not been installed.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_REINSTALL_PPI)(
  IN CONST EFI_PEI_SERVICES                **PeiServices,
  IN CONST EFI_PEI_PPI_DESCRIPTOR          *OldPpi,
  IN CONST EFI_PEI_PPI_DESCRIPTOR          *NewPpi
  );

/**
  This function locates an interface in the PEI PPI database by GUID.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES published by the PEI Foundation.
  @param  Guid             A pointer to the GUID whose corresponding interface needs to be found.
  @param  Instance         The N-th instance of the interface that is required.
  @param  PpiDescriptor    A pointer to instance of the EFI_PEI_PPI_DESCRIPTOR.
  @param  Ppi              A pointer to the instance of the interface.

  @retval EFI_SUCCESS           The interface was successfully returned.
  @retval EFI_NOT_FOUND         The PPI descriptor is not found in the database.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_LOCATE_PPI)(
  IN CONST EFI_PEI_SERVICES            **PeiServices,
  IN CONST EFI_GUID                    *Guid,
  IN UINTN                             Instance,
  IN OUT   EFI_PEI_PPI_DESCRIPTOR      **PpiDescriptor OPTIONAL,
  IN OUT   VOID                        **Ppi
  );

/**
  This function installs a notification service to be called back when a
  given interface is installed or reinstalled.  The purpose of the service
  is to publish an interface that other parties can use to call additional PPIs
  that may materialize later.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation
  @param  NotifyList       A pointer to the list of notification interfaces that the caller shall install.

  @retval EFI_SUCCESS           The interface was successfully installed.
  @retval EFI_INVALID_PARAMETER The PpiList pointer is NULL, or any of the PEI PPI descriptors in the
                                list do not have the EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES bit set in the Flags field.
  @retval EFI_OUT_OF_RESOURCES  There is no additional space in the PPI database.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_NOTIFY_PPI)(
  IN CONST EFI_PEI_SERVICES                **PeiServices,
  IN CONST EFI_PEI_NOTIFY_DESCRIPTOR       *NotifyList
  );

/**
  This function returns the present value of the boot mode.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  BootMode         A pointer to contain the value of the boot mode.

  @retval EFI_SUCCESS           The boot mode returned successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_GET_BOOT_MODE)(
  IN CONST EFI_PEI_SERVICES            **PeiServices,
  OUT EFI_BOOT_MODE                    *BootMode
  );

/**
  This function sets the value of the boot mode.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation
  @param  BootMode         The value of the boot mode to set.

  @retval EFI_SUCCESS           The boot mode returned successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_SET_BOOT_MODE)(
  IN CONST EFI_PEI_SERVICES            **PeiServices,
  IN EFI_BOOT_MODE                     BootMode
  );

/**
  This function returns the pointer to the list of Hand-Off Blocks (HOBs) in memory.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation
  @param  HobList          A pointer to the list of HOBs that the PEI Foundation will initialize

  @retval EFI_SUCCESS           The list was successfully returned.
  @retval EFI_NOT_AVAILABLE_YET The HOB list is not yet published.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_GET_HOB_LIST)(
  IN CONST EFI_PEI_SERVICES        **PeiServices,
  OUT VOID                         **HobList
  );

/**
  This service, published by the PEI Foundation, abstracts the creation of a Hand-Off Block's (HOB's) headers.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  Type             The type of HOB to be installed.
  @param  Length           The length of the HOB to be added.
  @param  Hob              The address of a pointer that will contain the HOB header.

  @retval EFI_SUCCESS           The HOB was successfully created.
  @retval EFI_OUT_OF_RESOURCES  There is no additional space for HOB creation.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_CREATE_HOB)(
  IN CONST EFI_PEI_SERVICES            **PeiServices,
  IN UINT16                            Type,
  IN UINT16                            Length,
  IN OUT VOID                          **Hob
  );

/**
  The purpose of the service is to abstract the capability of the PEI
  Foundation to discover instances of firmware volumes in the system.

  This service enables PEIMs to discover additional firmware volumes. The PEI Foundation uses this
  service to abstract the locations and formats of various firmware volumes. These volumes include
  the Boot Firmware Volume and any other volumes exposed by EFI_PEI_FV_PPI. The service
  returns a volume handle of type EFI_PEI_FV_HANDLE, which must be unique within the system.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  Instance         This instance of the firmware volume to find.
                           The value 0 is the Boot Firmware Volume (BFV).
  @param  VolumeHandle     On exit, points to the next volumn handle or NULL if it does not exist.

  @retval EFI_SUCCESS           The volume was found.
  @retval EFI_NOT_FOUND         The volume was not found.
  @retval EFI_INVALID_PARAMETER VolumeHandle is NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_NEXT_VOLUME2)(
  IN CONST EFI_PEI_SERVICES                **PeiServices,
  IN UINTN                                 Instance,
  OUT EFI_PEI_FV_HANDLE                    *VolumeHandle
  );

/**
  Searches for the next matching file in the firmware volume.

  This service enables PEIMs to discover firmware files within a specified volume.
  To find the first instance of a firmware file, pass a FileHandle value of NULL into the service.
  The service returns a file handle of type EFI_PEI_FILE_HANDLE, which must be unique within
  the system.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  SearchType       A filter to find files only of this type.
  @param  FvHandle         Handle of firmware volume in which to search.
  @param  FileHandle       On entry, points to the current handle from which to begin searching
                           or NULL to start at the beginning of the firmware volume.
                           On exit, points the file handle of the next file in the volume or NULL
                           if there are no more files.

  @retval EFI_SUCCESS      The file was found.
  @retval EFI_NOT_FOUND    The file was not found.
  @retval EFI_NOT_FOUND    The header checksum was not zero.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_NEXT_FILE2)(
  IN CONST EFI_PEI_SERVICES                **PeiServices,
  IN EFI_FV_FILETYPE                       SearchType,
  IN CONST EFI_PEI_FV_HANDLE               FvHandle,
  IN OUT EFI_PEI_FILE_HANDLE               *FileHandle
  );

/**
  Searches for the next matching section within the specified file.

  This service enables PEI modules to discover the first section of a given type within a valid file.
  This service will search within encapsulation sections (compression and GUIDed) as well. It will
  search inside of a GUIDed section or a compressed section, but may not, for example, search a
  GUIDed section inside a GUIDes section.
  This service will not search within compression sections or GUIDed sections that require
  extraction if memory is not present.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  SectionType      The value of the section type to find.
  @param  FileHandle       Handle of the firmware file to search.
  @param  SectionData      A pointer to the discovered section, if successful.

  @retval EFI_SUCCESS      The section was found.
  @retval EFI_NOT_FOUND    The section was not found.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_SECTION_DATA2)(
  IN CONST EFI_PEI_SERVICES            **PeiServices,
  IN EFI_SECTION_TYPE                  SectionType,
  IN EFI_PEI_FILE_HANDLE               FileHandle,
  OUT VOID                             **SectionData
  );

/**
  Searches for the next matching section within the specified file.

  This service enables PEI modules to discover the section of a given type within a valid file.
  This service will search within encapsulation sections (compression and GUIDed) as well. It will
  search inside of a GUIDed section or a compressed section, but may not, for example, search a
  GUIDed section inside a GUIDes section.
  This service will not search within compression sections or GUIDed sections that require
  extraction if memory is not present.

  @param  PeiServices           An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  SectionType           The value of the section type to find.
  @param  SectionInstance       Section instance to find.
  @param  FileHandle            Handle of the firmware file to search.
  @param  SectionData           A pointer to the discovered section, if successful.
  @param  AuthenticationStatus  A pointer to the authentication status for this section.

  @retval EFI_SUCCESS      The section was found.
  @retval EFI_NOT_FOUND    The section was not found.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_SECTION_DATA3)(
  IN CONST EFI_PEI_SERVICES            **PeiServices,
  IN EFI_SECTION_TYPE                  SectionType,
  IN UINTN                             SectionInstance,
  IN EFI_PEI_FILE_HANDLE               FileHandle,
  OUT VOID                             **SectionData,
  OUT UINT32                           *AuthenticationStatus
  );

/**
  This function registers the found memory configuration with the PEI Foundation.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  MemoryBegin      The value of a region of installed memory.
  @param  MemoryLength     The corresponding length of a region of installed memory.

  @retval EFI_SUCCESS           The region was successfully installed in a HOB.
  @retval EFI_INVALID_PARAMETER MemoryBegin and MemoryLength are illegal for this system.
  @retval EFI_OUT_OF_RESOURCES  There is no additional space for HOB creation.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_INSTALL_PEI_MEMORY)(
  IN CONST EFI_PEI_SERVICES     **PeiServices,
  IN EFI_PHYSICAL_ADDRESS       MemoryBegin,
  IN UINT64                     MemoryLength
  );

/**
  The purpose of the service is to publish an interface that allows
  PEIMs to allocate memory ranges that are managed by the PEI Foundation.

  Prior to InstallPeiMemory() being called, PEI will allocate pages from the heap.
  After InstallPeiMemory() is called, PEI will allocate pages within the region
  of memory provided by InstallPeiMemory() service in a best-effort fashion.
  Location-specific allocations are not managed by the PEI foundation code.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  MemoryType       The type of memory to allocate.
  @param  Pages            The number of contiguous 4 KB pages to allocate.
  @param  Memory           A pointer to a physical address. On output, the address is set to the base
                           of the page range that was allocated.

  @retval EFI_SUCCESS           The memory range was successfully allocated.
  @retval EFI_OUT_OF_RESOURCES  The pages could not be allocated.
  @retval EFI_INVALID_PARAMETER The type is not equal to EfiLoaderCode, EfiLoaderData, EfiRuntimeServicesCode,
                                EfiRuntimeServicesData, EfiBootServicesCode, EfiBootServicesData,
                                EfiACPIReclaimMemory, EfiReservedMemoryType, or EfiACPIMemoryNVS.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_ALLOCATE_PAGES)(
  IN CONST EFI_PEI_SERVICES     **PeiServices,
  IN EFI_MEMORY_TYPE            MemoryType,
  IN UINTN                      Pages,
  OUT EFI_PHYSICAL_ADDRESS      *Memory
  );

/**
  Frees memory pages.

  @param[in] PeiServices        An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param[in] Memory             The base physical address of the pages to be freed.
  @param[in] Pages              The number of contiguous 4 KB pages to free.

  @retval EFI_SUCCESS           The requested pages were freed.
  @retval EFI_INVALID_PARAMETER Memory is not a page-aligned address or Pages is invalid.
  @retval EFI_NOT_FOUND         The requested memory pages were not allocated with
                                AllocatePages().

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FREE_PAGES)(
  IN CONST EFI_PEI_SERVICES     **PeiServices,
  IN EFI_PHYSICAL_ADDRESS       Memory,
  IN UINTN                      Pages
  );

/**
  The purpose of this service is to publish an interface that
  allows PEIMs to allocate memory ranges that are managed by the PEI Foundation.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  Size             The number of bytes to allocate from the pool.
  @param  Buffer           If the call succeeds, a pointer to a pointer to the allocated buffer; undefined otherwise.

  @retval EFI_SUCCESS           The allocation was successful.
  @retval EFI_OUT_OF_RESOURCES  There is not enough heap to allocate the requested size.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_ALLOCATE_POOL)(
  IN CONST EFI_PEI_SERVICES     **PeiServices,
  IN UINTN                      Size,
  OUT VOID                      **Buffer
  );

/**
  This service copies the contents of one buffer to another buffer.

  @param  Destination      The pointer to the destination buffer of the memory copy.
  @param  Source           The pointer to the source buffer of the memory copy.
  @param  Length           The number of bytes to copy from Source to Destination.

**/
typedef
VOID
(EFIAPI *EFI_PEI_COPY_MEM)(
  IN VOID                       *Destination,
  IN VOID                       *Source,
  IN UINTN                      Length
  );

/**
  The service fills a buffer with a specified value.

  @param  Buffer           The pointer to the buffer to fill.
  @param  Size             The number of bytes in Buffer to fill.
  @param  Value            The value to fill Buffer with.

**/
typedef
VOID
(EFIAPI *EFI_PEI_SET_MEM)(
  IN VOID                       *Buffer,
  IN UINTN                      Size,
  IN UINT8                      Value
  );

/**
  This service publishes an interface that allows PEIMs to report status codes.

  ReportStatusCode() is called by PEIMs that wish to report status information on their
  progress. The principal use model is for a PEIM to emit one of the standard 32-bit error codes. This
  will allow a platform owner to ascertain the state of the system, especially under conditions where
  the full consoles might not have been installed.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param  Type             Indicates the type of status code being reported.
  @param  Value            Describes the current status of a hardware or
                           software entity. This includes information about the class and
                           subclass that is used to classify the entity as well as an operation.
                           For progress codes, the operation is the current activity.
                           For error codes, it is the exception.For debug codes,it is not defined at this time.
  @param  Instance         The enumeration of a hardware or software entity within
                           the system. A system may contain multiple entities that match a class/subclass
                           pairing. The instance differentiates between them. An instance of 0 indicates
                           that instance information is unavailable, not meaningful, or not relevant.
                           Valid instance numbers start with 1.
  @param  CallerId         This optional parameter may be used to identify the caller.
                           This parameter allows the status code driver to apply different rules to
                           different callers.
  @param  Data             This optional parameter may be used to pass additional data.

  @retval EFI_SUCCESS           The function completed successfully.
  @retval EFI_NOT_AVAILABLE_YET No progress code provider has installed an interface in the system.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_REPORT_STATUS_CODE)(
  IN CONST EFI_PEI_SERVICES         **PeiServices,
  IN EFI_STATUS_CODE_TYPE           Type,
  IN EFI_STATUS_CODE_VALUE          Value,
  IN UINT32                         Instance,
  IN CONST EFI_GUID                 *CallerId OPTIONAL,
  IN CONST EFI_STATUS_CODE_DATA     *Data OPTIONAL
  );

/**
  Resets the entire platform.

  This service resets the entire platform, including all processors
  and devices, and reboots the system.
  This service will never return EFI_SUCCESS.

  @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES
                           table published by the PEI Foundation.

  @retval EFI_NOT_AVAILABLE_YET The service has not been installed yet.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_RESET_SYSTEM)(
  IN CONST EFI_PEI_SERVICES   **PeiServices
  );

/**
  Resets the entire platform.

  @param[in] ResetType      The type of reset to perform.
  @param[in] ResetStatus    The status code for the reset.
  @param[in] DataSize       The size, in bytes, of ResetData.
  @param[in] ResetData      For a ResetType of EfiResetCold, EfiResetWarm, or EfiResetShutdown
                            the data buffer starts with a Null-terminated string, optionally
                            followed by additional binary data. The string is a description
                            that the caller may use to further indicate the reason for the
                            system reset.

**/
typedef
VOID
(EFIAPI *EFI_PEI_RESET2_SYSTEM)(
  IN EFI_RESET_TYPE     ResetType,
  IN EFI_STATUS         ResetStatus,
  IN UINTN              DataSize,
  IN VOID               *ResetData OPTIONAL
  );

/**
  Find a file within a volume by its name.

  This service searches for files with a specific name, within
  either the specified firmware volume or all firmware volumes.
  The service returns a file handle of type EFI_PEI_FILE_HANDLE,
  which must be unique within the system.

  @param FileName       A pointer to the name of the file to
                        find within the firmware volume.
  @param VolumeHandle   The firmware volume to search.
  @param FileHandle     Upon exit, points to the found file's
                        handle or NULL if it could not be found.

  @retval EFI_SUCCESS             The file was found.
  @retval EFI_NOT_FOUND           The file was not found.
  @retval EFI_INVALID_PARAMETER   VolumeHandle or FileHandle or
                                  FileName was NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_FIND_BY_NAME)(
  IN  CONST  EFI_GUID            *FileName,
  IN  EFI_PEI_FV_HANDLE          VolumeHandle,
  OUT EFI_PEI_FILE_HANDLE        *FileHandle
  );

///
/// The information of the FV file.
///
typedef struct {
  ///
  /// Name of the file.
  ///
  EFI_GUID                  FileName;
  ///
  /// File type.
  ///
  EFI_FV_FILETYPE           FileType;
  ///
  /// Attributes of the file.
  ///
  EFI_FV_FILE_ATTRIBUTES    FileAttributes;
  ///
  /// Points to the file's data (not the header).
  /// Not valid if EFI_FV_FILE_ATTRIB_MEMORY_MAPPED
  /// is zero.
  ///
  VOID                      *Buffer;
  ///
  /// Size of the file's data.
  ///
  UINT32                    BufferSize;
} EFI_FV_FILE_INFO;

///
/// The information with authentication status of the FV file.
///
typedef struct {
  ///
  /// Name of the file.
  ///
  EFI_GUID                  FileName;
  ///
  /// File type.
  ///
  EFI_FV_FILETYPE           FileType;
  ///
  /// Attributes of the file.
  ///
  EFI_FV_FILE_ATTRIBUTES    FileAttributes;
  ///
  /// Points to the file's data (not the header).
  /// Not valid if EFI_FV_FILE_ATTRIB_MEMORY_MAPPED
  /// is zero.
  ///
  VOID                      *Buffer;
  ///
  /// Size of the file's data.
  ///
  UINT32                    BufferSize;
  ///
  /// Authentication status for this file.
  ///
  UINT32                    AuthenticationStatus;
} EFI_FV_FILE_INFO2;

/**
  Returns information about a specific file.

  This function returns information about a specific file,
  including its file name, type, attributes, starting address and
  size. If the firmware volume is not memory mapped, then the
  Buffer member will be NULL.

  @param FileHandle   The handle of the file.
  @param FileInfo     Upon exit, points to the file's
                      information.

  @retval EFI_SUCCESS             File information was returned.
  @retval EFI_INVALID_PARAMETER   FileHandle does not
                                  represent a valid file.
  @retval EFI_INVALID_PARAMETER   FileInfo is NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_GET_FILE_INFO)(
  IN  EFI_PEI_FILE_HANDLE         FileHandle,
  OUT EFI_FV_FILE_INFO            *FileInfo
  );

/**
  Returns information about a specific file.

  This function returns information about a specific file,
  including its file name, type, attributes, starting address, size and authentication status.
  If the firmware volume is not memory mapped, then the Buffer member will be NULL.

  @param FileHandle   The handle of the file.
  @param FileInfo     Upon exit, points to the file's
                      information.

  @retval EFI_SUCCESS             File information was returned.
  @retval EFI_INVALID_PARAMETER   FileHandle does not
                                  represent a valid file.
  @retval EFI_INVALID_PARAMETER   FileInfo is NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_GET_FILE_INFO2)(
  IN  EFI_PEI_FILE_HANDLE         FileHandle,
  OUT EFI_FV_FILE_INFO2           *FileInfo
  );

///
/// The information of the FV volume.
///
typedef struct {
  ///
  /// Attributes of the firmware volume.
  ///
  EFI_FVB_ATTRIBUTES_2    FvAttributes;
  ///
  /// Format of the firmware volume.
  ///
  EFI_GUID                FvFormat;
  ///
  /// Name of the firmware volume.
  ///
  EFI_GUID                FvName;
  ///
  /// Points to the first byte of the firmware
  /// volume, if bit EFI_FVB_MEMORY_MAPPED is
  /// set in FvAttributes.
  ///
  VOID                    *FvStart;
  ///
  /// Size of the firmware volume.
  ///
  UINT64                  FvSize;
} EFI_FV_INFO;

/**
  Returns information about the specified volume.

  This function returns information about a specific firmware
  volume, including its name, type, attributes, starting address
  and size.

  @param VolumeHandle   Handle of the volume.
  @param VolumeInfo     Upon exit, points to the volume's information.

  @retval EFI_SUCCESS             The volume information returned.
  @retval EFI_INVALID_PARAMETER   If VolumeHandle does not represent a valid volume.
  @retval EFI_INVALID_PARAMETER   If VolumeHandle is NULL.
  @retval EFI_SUCCESS             Information was successfully returned.
  @retval EFI_INVALID_PARAMETER   The volume designated by the VolumeHandle is not available.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_FFS_GET_VOLUME_INFO)(
  IN  EFI_PEI_FV_HANDLE       VolumeHandle,
  OUT EFI_FV_INFO             *VolumeInfo
  );

/**
  Register a PEIM so that it will be shadowed and called again.

  This service registers a file handle so that after memory is
  available, the PEIM will be re-loaded into permanent memory and
  re-initialized. The PEIM registered this way will always be
  initialized twice. The first time, this function call will
  return EFI_SUCCESS. The second time, this function call will
  return EFI_ALREADY_STARTED. Depending on the order in which
  PEIMs are dispatched, the PEIM making this call may be
  initialized after permanent memory is installed, even the first
  time.

  @param  FileHandle            PEIM's file handle. Must be the currently
                                executing PEIM.

  @retval EFI_SUCCESS           The PEIM was successfully registered for
                                shadowing.
  @retval EFI_ALREADY_STARTED   The PEIM was previously
                                registered for shadowing.
  @retval EFI_NOT_FOUND         The FileHandle does not refer to a
                                valid file handle.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_REGISTER_FOR_SHADOW)(
  IN  EFI_PEI_FILE_HANDLE FileHandle
  );

//
// PEI Specification Revision information
//
#define PEI_SPECIFICATION_MAJOR_REVISION  1
#define PEI_SPECIFICATION_MINOR_REVISION  70
///
/// Specification inconsistency here:
/// In the PI1.0 spec, PEI_SERVICES_SIGNATURE is defined as 0x5652455320494550. But
/// to pass a multiple tool chain, it appends an ULL.
///
//
// PEI Services Table
//
#define PEI_SERVICES_SIGNATURE  0x5652455320494550ULL
///
/// Specification inconsistency here:
/// In the PI1.0 specification, there is a typo error in PEI_SERVICES_REVISION. In the specification the defintion is
/// #define ((PEI_SPECIFICATION_MAJOR_REVISION<<16) |(PEI_SPECIFICATION_MINOR_REVISION))
/// and it should be as follows:
///
#define PEI_SERVICES_REVISION  ((PEI_SPECIFICATION_MAJOR_REVISION<<16) | (PEI_SPECIFICATION_MINOR_REVISION))

///
/// EFI_PEI_SERVICES is a collection of functions whose implementation is provided by the PEI
/// Foundation. These services fall into various classes, including the following:
/// - Managing the boot mode
/// - Allocating both early and permanent memory
/// - Supporting the Firmware File System (FFS)
/// - Abstracting the PPI database abstraction
/// - Creating Hand-Off Blocks (HOBs).
///
struct _EFI_PEI_SERVICES {
  ///
  /// The table header for the PEI Services Table.
  ///
  EFI_TABLE_HEADER                  Hdr;

  //
  // PPI Functions
  //
  EFI_PEI_INSTALL_PPI               InstallPpi;
  EFI_PEI_REINSTALL_PPI             ReInstallPpi;
  EFI_PEI_LOCATE_PPI                LocatePpi;
  EFI_PEI_NOTIFY_PPI                NotifyPpi;

  //
  // Boot Mode Functions
  //
  EFI_PEI_GET_BOOT_MODE             GetBootMode;
  EFI_PEI_SET_BOOT_MODE             SetBootMode;

  //
  // HOB Functions
  //
  EFI_PEI_GET_HOB_LIST              GetHobList;
  EFI_PEI_CREATE_HOB                CreateHob;

  //
  // Firmware Volume Functions
  //
  EFI_PEI_FFS_FIND_NEXT_VOLUME2     FfsFindNextVolume;
  EFI_PEI_FFS_FIND_NEXT_FILE2       FfsFindNextFile;
  EFI_PEI_FFS_FIND_SECTION_DATA2    FfsFindSectionData;

  //
  // PEI Memory Functions
  //
  EFI_PEI_INSTALL_PEI_MEMORY        InstallPeiMemory;
  EFI_PEI_ALLOCATE_PAGES            AllocatePages;
  EFI_PEI_ALLOCATE_POOL             AllocatePool;
  EFI_PEI_COPY_MEM                  CopyMem;
  EFI_PEI_SET_MEM                   SetMem;

  //
  // Status Code
  //
  EFI_PEI_REPORT_STATUS_CODE        ReportStatusCode;

  //
  // Reset
  //
  EFI_PEI_RESET_SYSTEM              ResetSystem;

  //
  // (the following interfaces are installed by publishing PEIM)
  // I/O Abstractions
  //
  EFI_PEI_CPU_IO_PPI                *CpuIo;
  EFI_PEI_PCI_CFG2_PPI              *PciCfg;

  //
  // Future Installed Services
  //
  EFI_PEI_FFS_FIND_BY_NAME          FfsFindFileByName;
  EFI_PEI_FFS_GET_FILE_INFO         FfsGetFileInfo;
  EFI_PEI_FFS_GET_VOLUME_INFO       FfsGetVolumeInfo;
  EFI_PEI_REGISTER_FOR_SHADOW       RegisterForShadow;
  EFI_PEI_FFS_FIND_SECTION_DATA3    FindSectionData3;
  EFI_PEI_FFS_GET_FILE_INFO2        FfsGetFileInfo2;
  EFI_PEI_RESET2_SYSTEM             ResetSystem2;
  EFI_PEI_FREE_PAGES                FreePages;
};

///
/// EFI_SEC_PEI_HAND_OFF structure holds information about
/// PEI core's operating environment, such as the size of location of
/// temporary RAM, the stack location and BFV location.
///
typedef struct _EFI_SEC_PEI_HAND_OFF {
  ///
  /// Size of the data structure.
  ///
  UINT16    DataSize;

  ///
  /// Points to the first byte of the boot firmware volume,
  /// which the PEI Dispatcher should search for
  /// PEI modules.
  ///
  VOID      *BootFirmwareVolumeBase;

  ///
  /// Size of the boot firmware volume, in bytes.
  ///
  UINTN     BootFirmwareVolumeSize;

  ///
  /// Points to the first byte of the temporary RAM.
  ///
  VOID      *TemporaryRamBase;

  ///
  /// Size of the temporary RAM, in bytes.
  ///
  UINTN     TemporaryRamSize;

  ///
  /// Points to the first byte of the temporary RAM
  /// available for use by the PEI Foundation. The area
  /// described by PeiTemporaryRamBase and PeiTemporaryRamSize
  /// must not extend outside beyond the area described by
  /// TemporaryRamBase & TemporaryRamSize. This area should not
  /// overlap with the area reported by StackBase and
  /// StackSize.
  ///
  VOID     *PeiTemporaryRamBase;

  ///
  /// The size of the available temporary RAM available for
  /// use by the PEI Foundation, in bytes.
  ///
  UINTN    PeiTemporaryRamSize;

  ///
  /// Points to the first byte of the stack.
  /// This are may be part of the memory described by
  /// TemporaryRamBase and TemporaryRamSize
  /// or may be an entirely separate area.
  ///
  VOID     *StackBase;

  ///
  /// Size of the stack, in bytes.
  ///
  UINTN    StackSize;
} EFI_SEC_PEI_HAND_OFF;

/**
  The entry point of PEI Foundation.

  This function is the entry point for the PEI Foundation, which
  allows the SEC phase to pass information about the stack,
  temporary RAM and the Boot Firmware Volume. In addition, it also
  allows the SEC phase to pass services and data forward for use
  during the PEI phase in the form of one or more PPIs. These PPI's
  will be installed and/or immediately signaled if they are
  notification type. There is no limit to the number of additional
  PPIs that can be passed from SEC into the PEI Foundation. As part
  of its initialization phase, the PEI Foundation will add these
  SEC-hosted PPIs to its PPI database such that both the PEI
  Foundation and any modules can leverage the associated service
  calls and/or code in these early PPIs.

  @param SecCoreData    Points to a data structure containing
                        information about the PEI core's
                        operating environment, such as the size
                        and location of temporary RAM, the stack
                        location and the BFV location.

  @param PpiList        Points to a list of one or more PPI
                        descriptors to be installed initially by
                        the PEI core. An empty PPI list consists
                        of a single descriptor with the end-tag
                        EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
                        As part of its initialization phase, the
                        PEI Foundation will add these SEC-hosted
                        PPIs to its PPI database such that both
                        the PEI Foundation and any modules can
                        leverage the associated service calls
                        and/or code in these early PPIs.


**/
typedef
VOID
(EFIAPI *EFI_PEI_CORE_ENTRY_POINT)(
  IN CONST  EFI_SEC_PEI_HAND_OFF    *SecCoreData,
  IN CONST  EFI_PEI_PPI_DESCRIPTOR  *PpiList
  );

#endif
