/** @file
  This file declares Recovery Module PPI.  This PPI is used to find and load the
  recovery files.

  A module that produces this PPI has many roles and is responsible for the following:
    -# Calling the driver recovery PPI EFI_PEI_DEVICE_RECOVERY_MODULE_PPI.
       GetNumberRecoveryCapsules() to determine if one or more DXE recovery
       entities exist.
    -# If no capsules exist, then performing appropriate error handling.
    -# Allocating a buffer of MaxRecoveryCapsuleSize as determined by
       EFI_PEI_DEVICE_RECOVERY_MODULE_PPI.GetRecoveryCapsuleInfo() or
       larger.
    -# Determining the policy in which DXE recovery capsules are loaded.
    -# Calling the driver recovery PPI EFI_PEI_DEVICE_RECOVERY_MODULE_PPI.
       LoadRecoveryCapsule() for capsule number x.
    -# If the load failed, performing appropriate error handling.
    -# Performing security checks for a loaded DXE recovery capsule.
    -# If the security checks failed, then logging the failure in a data HOB.
    -# If the security checks failed, then determining the next
       EFI_PEI_DEVICE_RECOVERY_MODULE_PPI.LoadRecoveryCapsule()capsule number;
       otherwise, go to step 11.
    -# If more DXE recovery capsules exist, then go to step 5; otherwise, perform
       error handling.
    -# Decomposing the capsule loaded by EFI_PEI_DEVICE_RECOVERY_MODULE_PPI.
       LoadRecoveryCapsule() into its components. It is assumed that the path
       parameters are redundant for recovery and Setup parameters are either
       redundant or canned.
    -# Invalidating all HOB entries for updateable firmware volume entries.
       This invalidation prevents possible errant drivers from being executed.
    -# Updating the HOB table with the recovery DXE firmware volume information
       generated from the capsule decomposition.
    -# Returning to the PEI Dispatcher.

  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is defined in UEFI Platform Initialization Specification 1.2 Errata B Volume 1:
  Pre-EFI Initialization Core Interface

**/

#pragma once

#define EFI_PEI_RECOVERY_MODULE_PPI_GUID \
  { \
    0xFB6D9542, 0x612D, 0x4f45, {0x87, 0x2F, 0x5C, 0xFF, 0x52, 0xE9, 0x3D, 0xCF } \
  }

typedef struct _EFI_PEI_RECOVERY_MODULE_PPI EFI_PEI_RECOVERY_MODULE_PPI;

/**
  Loads a DXE capsule from some media into memory and updates the HOB table
  with the DXE firmware volume information.

  @param  PeiServices   General-purpose services that are available to every PEIM.
  @param  This          Indicates the EFI_PEI_RECOVERY_MODULE_PPI instance.

  @retval EFI_SUCCESS        The capsule was loaded correctly.
  @retval EFI_DEVICE_ERROR   A device error occurred.
  @retval EFI_NOT_FOUND      A recovery DXE capsule cannot be found.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_LOAD_RECOVERY_CAPSULE)(
  IN EFI_PEI_SERVICES             **PeiServices,
  IN EFI_PEI_RECOVERY_MODULE_PPI  *This
  );

///
///  Finds and loads the recovery files.
///
struct _EFI_PEI_RECOVERY_MODULE_PPI {
  EFI_PEI_LOAD_RECOVERY_CAPSULE    LoadRecoveryCapsule; ///< Loads a DXE binary capsule into memory.
};

extern EFI_GUID  gEfiPeiRecoveryModulePpiGuid;
