4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe EFI_SWAP_ADDRESS_RANGE_PROTOCOL is used to abstract the swap operation of boot block
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand backup block of FV. This swap is especially needed when updating the boot block of FV. If a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncpower failure happens during the boot block update, the swapped backup block (now the boot block)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccan boot the machine with the old boot block backed up in it. The swap operation is platform dependent, so
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncother protocols such as FTW (Fault Tolerant Write) should use this protocol instead of handling hardware directly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials are licensed and made available under
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncthe terms and conditions of the BSD License that accompanies this distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef _EFI_SWAP_ADDRESS_RANGE_PROTOCOL_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _EFI_SWAP_ADDRESS_RANGE_PROTOCOL_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_SWAP_ADDRESS_RANGE_PROTOCOL_GUID \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x1259f60d, 0xb754, 0x468e, {0xa7, 0x89, 0x4d, 0xb8, 0x5d, 0x55, 0xe8, 0x7e } \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Forward reference for pure ANSI compatability
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _EFI_SWAP_ADDRESS_RANGE_PROTOCOL EFI_SWAP_ADDRESS_RANGE_PROTOCOL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_UNSUPPORT_LOCK 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_SOFTWARE_LOCK 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_HARDWARE_LOCK 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef UINT8 EFI_SWAP_LOCK_CAPABILITY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Protocol APIs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function gets the address range location of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync boot block and backup block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the calling context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BootBlockBase The base address of current boot block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BootBlockSize The size (in bytes) of current boot block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BackupBlockBase The base address of current backup block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BackupBlockSize The size (in bytes) of current backup block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The call was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *EFI_GET_RANGE_LOCATION)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_PHYSICAL_ADDRESS *BootBlockBase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *BootBlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_PHYSICAL_ADDRESS *BackupBlockBase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *BackupBlockSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This service checks if the boot block and backup block has been swapped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the calling context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SwapState True if the boot block and backup block has been swapped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync False if the boot block and backup block has not been swapped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The call was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *EFI_GET_SWAP_STATE)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN *SwapState
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This service swaps the boot block and backup block, or swaps them back.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It also acquires and releases software swap lock during operation. The setting of the new swap state
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not affected by the old swap state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the calling context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NewSwapState True to swap real boot block and backup block, False to swap them back.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The call was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED Set swap state error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *EFI_SET_SWAP_STATE)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN NewSwapState
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This service checks if a Real Time Clock (RTC) power failure happened.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If parameter RtcPowerFailed is true after the function returns, RTC power supply failed or was removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It is recommended to check RTC power status before calling GetSwapState().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the calling context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RtcPowerFailed True if the RTC (Real Time Clock) power failed or was removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The call was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *EFI_GET_RTC_POWER_STATUS)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN *RtcPowerFailed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This service returns all lock methods for swap operations that the current platform
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync supports. Could be software lock, hardware lock, or unsupport lock.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note that software and hardware lock methods can be used simultaneously.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the calling context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param LockCapability The current lock method for swap operations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The call was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *EFI_GET_SWAP_LOCK_CAPABILITY)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_SWAP_LOCK_CAPABILITY *LockCapability
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This service is used to acquire or release appointed kind of lock for Swap Address Range operations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note that software and hardware lock mothod can be used simultaneously.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Indicates the calling context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param LockCapability Indicates which lock to acquire or release.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NewLockState True to acquire lock; False to release lock.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The call was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *EFI_SET_SWAP_LOCK)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SWAP_LOCK_CAPABILITY LockCapability,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN NewLockState
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _EFI_SWAP_ADDRESS_RANGE_PROTOCOL {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GET_RANGE_LOCATION GetRangeLocation; // has output parameters for base and length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GET_SWAP_STATE GetSwapState; // are ranges swapped or not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SET_SWAP_STATE SetSwapState; // swap or unswap ranges
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GET_RTC_POWER_STATUS GetRtcPowerStatus; // checks RTC battery, or whatever...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GET_SWAP_LOCK_CAPABILITY GetSwapLockCapability; // Get TOP_SWAP lock capability,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SET_SWAP_LOCK SetSwapLock; // Set TOP_SWAP lock state
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern EFI_GUID gEfiSwapAddressRangeProtocolGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif