]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Include/Protocol/SwapAddressRange.h
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Include / Protocol / SwapAddressRange.h
1 /** @file
2 The EFI_SWAP_ADDRESS_RANGE_PROTOCOL is used to abstract the swap operation of boot block
3 and backup block of FV. This swap is especially needed when updating the boot block of FV. If a
4 power failure happens during the boot block update, the swapped backup block (now the boot block)
5 can boot the machine with the old boot block backed up in it. The swap operation is platform dependent, so
6 other protocols such as FTW (Fault Tolerant Write) should use this protocol instead of handling hardware directly.
7
8 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
9 SPDX-License-Identifier: BSD-2-Clause-Patent
10
11 **/
12
13 #ifndef _EFI_SWAP_ADDRESS_RANGE_PROTOCOL_H_
14 #define _EFI_SWAP_ADDRESS_RANGE_PROTOCOL_H_
15
16 #define EFI_SWAP_ADDRESS_RANGE_PROTOCOL_GUID \
17 { \
18 0x1259f60d, 0xb754, 0x468e, {0xa7, 0x89, 0x4d, 0xb8, 0x5d, 0x55, 0xe8, 0x7e } \
19 }
20
21 //
22 // Forward reference for pure ANSI compatability
23 //
24 typedef struct _EFI_SWAP_ADDRESS_RANGE_PROTOCOL EFI_SWAP_ADDRESS_RANGE_PROTOCOL;
25
26 #define EFI_UNSUPPORT_LOCK 0
27 #define EFI_SOFTWARE_LOCK 1
28 #define EFI_HARDWARE_LOCK 2
29
30 typedef UINT8 EFI_SWAP_LOCK_CAPABILITY;
31
32 //
33 // Protocol APIs
34 //
35
36 /**
37 This function gets the address range location of
38 boot block and backup block.
39
40 @param This Indicates the calling context.
41 @param BootBlockBase The base address of current boot block.
42 @param BootBlockSize The size (in bytes) of current boot block.
43 @param BackupBlockBase The base address of current backup block.
44 @param BackupBlockSize The size (in bytes) of current backup block.
45
46 @retval EFI_SUCCESS The call was successful.
47
48 **/
49 typedef
50 EFI_STATUS
51 (EFIAPI *EFI_GET_RANGE_LOCATION)(
52 IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
53 OUT EFI_PHYSICAL_ADDRESS *BootBlockBase,
54 OUT UINTN *BootBlockSize,
55 OUT EFI_PHYSICAL_ADDRESS *BackupBlockBase,
56 OUT UINTN *BackupBlockSize
57 );
58
59 /**
60 This service checks if the boot block and backup block has been swapped.
61
62 @param This Indicates the calling context.
63 @param SwapState True if the boot block and backup block has been swapped.
64 False if the boot block and backup block has not been swapped.
65
66 @retval EFI_SUCCESS The call was successful.
67
68 **/
69 typedef
70 EFI_STATUS
71 (EFIAPI *EFI_GET_SWAP_STATE)(
72 IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
73 OUT BOOLEAN *SwapState
74 );
75
76 /**
77 This service swaps the boot block and backup block, or swaps them back.
78
79 It also acquires and releases software swap lock during operation. The setting of the new swap state
80 is not affected by the old swap state.
81
82 @param This Indicates the calling context.
83 @param NewSwapState True to swap real boot block and backup block, False to swap them back.
84
85 @retval EFI_SUCCESS The call was successful.
86 @retval EFI_ABORTED Set swap state error.
87
88 **/
89 typedef
90 EFI_STATUS
91 (EFIAPI *EFI_SET_SWAP_STATE)(
92 IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
93 IN BOOLEAN NewSwapState
94 );
95
96
97
98 /**
99 This service checks if a Real Time Clock (RTC) power failure happened.
100
101 If parameter RtcPowerFailed is true after the function returns, RTC power supply failed or was removed.
102 It is recommended to check RTC power status before calling GetSwapState().
103
104 @param This Indicates the calling context.
105 @param RtcPowerFailed True if the RTC (Real Time Clock) power failed or was removed.
106
107 @retval EFI_SUCCESS The call was successful.
108
109 **/
110 typedef
111 EFI_STATUS
112 (EFIAPI *EFI_GET_RTC_POWER_STATUS)(
113 IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
114 OUT BOOLEAN *RtcPowerFailed
115 );
116
117 /**
118 This service returns all lock methods for swap operations that the current platform
119 supports. Could be software lock, hardware lock, or unsupport lock.
120 Note that software and hardware lock methods can be used simultaneously.
121
122 @param This Indicates the calling context.
123 @param LockCapability The current lock method for swap operations.
124
125 @retval EFI_SUCCESS The call was successful.
126
127 **/
128 typedef
129 EFI_STATUS
130 (EFIAPI *EFI_GET_SWAP_LOCK_CAPABILITY)(
131 IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
132 OUT EFI_SWAP_LOCK_CAPABILITY *LockCapability
133 );
134
135
136
137 /**
138 This service is used to acquire or release appointed kind of lock for Swap Address Range operations.
139
140 Note that software and hardware lock mothod can be used simultaneously.
141
142 @param This Indicates the calling context.
143 @param LockCapability Indicates which lock to acquire or release.
144 @param NewLockState True to acquire lock; False to release lock.
145
146 @retval EFI_SUCCESS The call was successful.
147
148 **/
149 typedef
150 EFI_STATUS
151 (EFIAPI *EFI_SET_SWAP_LOCK)(
152 IN EFI_SWAP_ADDRESS_RANGE_PROTOCOL *This,
153 IN EFI_SWAP_LOCK_CAPABILITY LockCapability,
154 IN BOOLEAN NewLockState
155 );
156
157 struct _EFI_SWAP_ADDRESS_RANGE_PROTOCOL {
158 EFI_GET_RANGE_LOCATION GetRangeLocation; // has output parameters for base and length
159 EFI_GET_SWAP_STATE GetSwapState; // are ranges swapped or not
160 EFI_SET_SWAP_STATE SetSwapState; // swap or unswap ranges
161 EFI_GET_RTC_POWER_STATUS GetRtcPowerStatus; // checks RTC battery, or whatever...
162 EFI_GET_SWAP_LOCK_CAPABILITY GetSwapLockCapability; // Get TOP_SWAP lock capability,
163 EFI_SET_SWAP_LOCK SetSwapLock; // Set TOP_SWAP lock state
164 };
165
166 extern EFI_GUID gEfiSwapAddressRangeProtocolGuid;
167
168 #endif