/** @file
The EFI_SWAP_ADDRESS_RANGE_PROTOCOL is used to abstract the swap operation of boot block
and backup block of FV. This swap is especially needed when updating the boot block of FV. If a
power failure happens during the boot block update, the swapped backup block (now the boot block)
can boot the machine with the old boot block backed up in it. The swap operation is platform dependent, so
other protocols such as FTW (Fault Tolerant Write) should use this protocol instead of handling hardware directly.

Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _EFI_SWAP_ADDRESS_RANGE_PROTOCOL_H_
#define _EFI_SWAP_ADDRESS_RANGE_PROTOCOL_H_

#define EFI_SWAP_ADDRESS_RANGE_PROTOCOL_GUID \
  { \
    0x1259f60d, 0xb754, 0x468e, {0xa7, 0x89, 0x4d, 0xb8, 0x5d, 0x55, 0xe8, 0x7e } \
  }

//
// Forward reference for pure ANSI compatability
//
typedef struct _EFI_SWAP_ADDRESS_RANGE_PROTOCOL EFI_SWAP_ADDRESS_RANGE_PROTOCOL;

#define EFI_UNSUPPORT_LOCK  0
#define EFI_SOFTWARE_LOCK   1
#define EFI_HARDWARE_LOCK   2

typedef UINT8 EFI_SWAP_LOCK_CAPABILITY;

//
// Protocol APIs
//

/**
  This function gets the address range location of
  boot block and backup block.

  @param This             Indicates the calling context.
  @param BootBlockBase    The base address of current boot block.
  @param BootBlockSize    The size (in bytes) of current boot block.
  @param BackupBlockBase  The base address of current backup block.
  @param BackupBlockSize  The size (in bytes) of current backup block.

  @retval EFI_SUCCESS  The call was successful.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_GET_RANGE_LOCATION)(
  IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL            *This,
  OUT EFI_PHYSICAL_ADDRESS                      *BootBlockBase,
  OUT UINTN                                     *BootBlockSize,
  OUT EFI_PHYSICAL_ADDRESS                      *BackupBlockBase,
  OUT UINTN                                     *BackupBlockSize
  );

/**
  This service checks if the boot block and backup block has been swapped.

  @param This          Indicates the calling context.
  @param SwapState     True if the boot block and backup block has been swapped.
                       False if the boot block and backup block has not been swapped.

  @retval EFI_SUCCESS  The call was successful.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_GET_SWAP_STATE)(
  IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL            *This,
  OUT BOOLEAN                                   *SwapState
  );

/**
  This service swaps the boot block and backup block, or swaps them back.

  It also acquires and releases software swap lock during operation. The setting of the new swap state
  is not affected by the old swap state.

  @param This            Indicates the calling context.
  @param NewSwapState    True to swap real boot block and backup block, False to swap them back.

  @retval EFI_SUCCESS  The call was successful.
  @retval EFI_ABORTED  Set swap state error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SET_SWAP_STATE)(
  IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL            *This,
  IN BOOLEAN                                    NewSwapState
  );

/**
  This service checks if a Real Time Clock (RTC) power failure happened.

  If parameter RtcPowerFailed is true after the function returns, RTC power supply failed or was removed.
  It is recommended to check RTC power status before calling GetSwapState().

  @param This             Indicates the calling context.
  @param RtcPowerFailed   True if the RTC (Real Time Clock) power failed or was removed.

  @retval EFI_SUCCESS The call was successful.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_GET_RTC_POWER_STATUS)(
  IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL            *This,
  OUT BOOLEAN                                   *RtcPowerFailed
  );

/**
  This service returns all lock methods for swap operations that the current platform
  supports. Could be software lock, hardware lock, or unsupport lock.
  Note that software and hardware lock methods can be used simultaneously.

  @param This             Indicates the calling context.
  @param LockCapability   The current lock method for swap operations.

  @retval EFI_SUCCESS The call was successful.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_GET_SWAP_LOCK_CAPABILITY)(
  IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL            *This,
  OUT EFI_SWAP_LOCK_CAPABILITY                  *LockCapability
  );

/**
  This service is used to acquire or release appointed kind of lock for Swap Address Range operations.

  Note that software and hardware lock mothod can be used simultaneously.

  @param This              Indicates the calling context.
  @param LockCapability    Indicates which lock to acquire or release.
  @param NewLockState      True to acquire lock; False to release lock.

  @retval EFI_SUCCESS The call was successful.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SET_SWAP_LOCK)(
  IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL            *This,
  IN EFI_SWAP_LOCK_CAPABILITY                   LockCapability,
  IN BOOLEAN                                    NewLockState
  );

struct _EFI_SWAP_ADDRESS_RANGE_PROTOCOL {
  EFI_GET_RANGE_LOCATION          GetRangeLocation;      // has output parameters for base and length
  EFI_GET_SWAP_STATE              GetSwapState;          // are ranges swapped or not
  EFI_SET_SWAP_STATE              SetSwapState;          // swap or unswap ranges
  EFI_GET_RTC_POWER_STATUS        GetRtcPowerStatus;     // checks RTC battery, or whatever...
  EFI_GET_SWAP_LOCK_CAPABILITY    GetSwapLockCapability; // Get TOP_SWAP lock capability,
  EFI_SET_SWAP_LOCK               SetSwapLock;           // Set TOP_SWAP lock state
};

extern EFI_GUID  gEfiSwapAddressRangeProtocolGuid;

#endif
