/** @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

**/

#pragma once

#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;
