/** @file
  Defines the APIs that enable PEI services to work with
  the underlying capsule capabilities of the platform.

Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is introduced in PI Version 1.4.

**/

#ifndef _PEI_CAPSULE_PPI_H_
#define _PEI_CAPSULE_PPI_H_

///
/// Global ID for the EFI_PEI_CAPSULE_PPI.
///
#define EFI_PEI_CAPSULE_PPI_GUID \
  { \
    0x3acf33ee, 0xd892, 0x40f4, {0xa2, 0xfc, 0x38, 0x54, 0xd2, 0xe1, 0x32, 0x3d } \
  }

///
/// Forward declaration for the EFI_PEI_CAPSULE_PPI.
///
typedef struct _EFI_PEI_CAPSULE_PPI EFI_PEI_CAPSULE_PPI;

///
/// Keep name backwards compatible before PI Version 1.4
///
typedef struct _EFI_PEI_CAPSULE_PPI PEI_CAPSULE_PPI;

/**
  Upon determining that there is a capsule to operate on, this service
  will use a series of EFI_CAPSULE_BLOCK_DESCRIPTOR entries to determine
  the current location of the various capsule fragments and coalesce them
  into a contiguous region of system memory.

  @param[in]  PeiServices   Pointer to the PEI Services Table.
  @param[out] MemoryBase    Pointer to the base of a block of memory into which the buffers will be coalesced.
                            On output, this variable will hold the base address
                            of a coalesced capsule.
  @param[out] MemorySize    Size of the memory region pointed to by MemoryBase.
                            On output, this variable will contain the size of the
                            coalesced capsule.

  @retval EFI_NOT_FOUND          If: boot mode could not be determined, or the
                                 boot mode is not flash-update, or the capsule descriptors were not found.
  @retval EFI_BUFFER_TOO_SMALL   The capsule could not be coalesced in the provided memory region.
  @retval EFI_SUCCESS            There was no capsule, or the capsule was processed successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_CAPSULE_COALESCE)(
  IN EFI_PEI_SERVICES  **PeiServices,
  IN OUT VOID          **MemoryBase,
  IN OUT UINTN         *MemSize
  );

/**
  Determine if a capsule needs to be processed.
  The means by which the presence of a capsule is determined is platform
  specific. For example, an implementation could be driven by the presence
  of a Capsule EFI Variable containing a list of EFI_CAPSULE_BLOCK_DESCRIPTOR
  entries. If present, return EFI_SUCCESS, otherwise return EFI_NOT_FOUND.

  @param[in] PeiServices   Pointer to the PEI Services Table.

  @retval EFI_SUCCESS     If a capsule is available.
  @retval EFI_NOT_FOUND   No capsule detected.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_CAPSULE_CHECK_CAPSULE_UPDATE)(
  IN EFI_PEI_SERVICES  **PeiServices
  );

/**
  The Capsule PPI service that gets called after memory is available. The
  capsule coalesce function, which must be called first, returns a base
  address and size. Once the memory init PEIM has discovered memory,
  it should call this function and pass in the base address and size
  returned by the Coalesce() function. Then this function can create a
  capsule HOB and return.

  @par Notes:
    This function assumes it will not be called until the
    actual capsule update.

  @param[in] PeiServices   Pointer to the PEI Services Table.
  @param[in] CapsuleBase   Address returned by the capsule coalesce function.
  @param[in] CapsuleSize   Value returned by the capsule coalesce function.

  @retval EFI_VOLUME_CORRUPTED   CapsuleBase does not appear to point to a
                                 coalesced capsule.
  @retval EFI_SUCCESS            Capsule HOB was created successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_CAPSULE_CREATE_STATE)(
  IN EFI_PEI_SERVICES  **PeiServices,
  IN VOID              *CapsuleBase,
  IN UINTN             CapsuleSize
  );

///
/// This PPI provides several services in PEI to work with the underlying
/// capsule capabilities of the platform.  These services include the ability
/// for PEI to coalesce a capsule from a scattered set of memory locations
/// into a contiguous space in memory, detect if a capsule is present for
/// processing, and once memory is available, create a HOB for the capsule.
///
struct _EFI_PEI_CAPSULE_PPI {
  EFI_PEI_CAPSULE_COALESCE                Coalesce;
  EFI_PEI_CAPSULE_CHECK_CAPSULE_UPDATE    CheckCapsuleUpdate;
  EFI_PEI_CAPSULE_CREATE_STATE            CreateState;
};

///
/// Keep name backwards compatible before PI Version 1.4
///
extern EFI_GUID  gPeiCapsulePpiGuid;

extern EFI_GUID  gEfiPeiCapsulePpiGuid;

#endif // #ifndef _PEI_CAPSULE_PPI_H_
