mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-25 16:37:42 +01:00
7c0aa811ec
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
169 lines
5.8 KiB
C
169 lines
5.8 KiB
C
/** @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
|