xref: /dflybsd-src/stand/contrib/edk2/MdePkg/Include/Uefi/UefiSpec.h (revision 1370a72311f999d5cc5041717aeea26d08ad6923)
1*1370a723SSascha Wildner /** @file
2*1370a723SSascha Wildner   Include file that supports UEFI.
3*1370a723SSascha Wildner 
4*1370a723SSascha Wildner   This include file must contain things defined in the UEFI 2.7 specification.
5*1370a723SSascha Wildner   If a code construct is defined in the UEFI 2.7 specification it must be included
6*1370a723SSascha Wildner   by this include file.
7*1370a723SSascha Wildner 
8*1370a723SSascha Wildner Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
9*1370a723SSascha Wildner Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
10*1370a723SSascha Wildner Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
11*1370a723SSascha Wildner 
12*1370a723SSascha Wildner SPDX-License-Identifier: BSD-2-Clause-Patent
13*1370a723SSascha Wildner 
14*1370a723SSascha Wildner **/
15*1370a723SSascha Wildner 
16*1370a723SSascha Wildner #ifndef __UEFI_SPEC_H__
17*1370a723SSascha Wildner #define __UEFI_SPEC_H__
18*1370a723SSascha Wildner 
19*1370a723SSascha Wildner #include <Uefi/UefiMultiPhase.h>
20*1370a723SSascha Wildner 
21*1370a723SSascha Wildner #include <Protocol/DevicePath.h>
22*1370a723SSascha Wildner #include <Protocol/SimpleTextIn.h>
23*1370a723SSascha Wildner #include <Protocol/SimpleTextInEx.h>
24*1370a723SSascha Wildner #include <Protocol/SimpleTextOut.h>
25*1370a723SSascha Wildner 
26*1370a723SSascha Wildner ///
27*1370a723SSascha Wildner /// Enumeration of EFI memory allocation types.
28*1370a723SSascha Wildner ///
29*1370a723SSascha Wildner typedef enum {
30*1370a723SSascha Wildner   ///
31*1370a723SSascha Wildner   /// Allocate any available range of pages that satisfies the request.
32*1370a723SSascha Wildner   ///
33*1370a723SSascha Wildner   AllocateAnyPages,
34*1370a723SSascha Wildner   ///
35*1370a723SSascha Wildner   /// Allocate any available range of pages whose uppermost address is less than
36*1370a723SSascha Wildner   /// or equal to a specified maximum address.
37*1370a723SSascha Wildner   ///
38*1370a723SSascha Wildner   AllocateMaxAddress,
39*1370a723SSascha Wildner   ///
40*1370a723SSascha Wildner   /// Allocate pages at a specified address.
41*1370a723SSascha Wildner   ///
42*1370a723SSascha Wildner   AllocateAddress,
43*1370a723SSascha Wildner   ///
44*1370a723SSascha Wildner   /// Maximum enumeration value that may be used for bounds checking.
45*1370a723SSascha Wildner   ///
46*1370a723SSascha Wildner   MaxAllocateType
47*1370a723SSascha Wildner } EFI_ALLOCATE_TYPE;
48*1370a723SSascha Wildner 
49*1370a723SSascha Wildner //
50*1370a723SSascha Wildner // Bit definitions for EFI_TIME.Daylight
51*1370a723SSascha Wildner //
52*1370a723SSascha Wildner #define EFI_TIME_ADJUST_DAYLIGHT  0x01
53*1370a723SSascha Wildner #define EFI_TIME_IN_DAYLIGHT      0x02
54*1370a723SSascha Wildner 
55*1370a723SSascha Wildner ///
56*1370a723SSascha Wildner /// Value definition for EFI_TIME.TimeZone.
57*1370a723SSascha Wildner ///
58*1370a723SSascha Wildner #define EFI_UNSPECIFIED_TIMEZONE  0x07FF
59*1370a723SSascha Wildner 
60*1370a723SSascha Wildner //
61*1370a723SSascha Wildner // Memory cacheability attributes
62*1370a723SSascha Wildner //
63*1370a723SSascha Wildner #define EFI_MEMORY_UC   0x0000000000000001ULL
64*1370a723SSascha Wildner #define EFI_MEMORY_WC   0x0000000000000002ULL
65*1370a723SSascha Wildner #define EFI_MEMORY_WT   0x0000000000000004ULL
66*1370a723SSascha Wildner #define EFI_MEMORY_WB   0x0000000000000008ULL
67*1370a723SSascha Wildner #define EFI_MEMORY_UCE  0x0000000000000010ULL
68*1370a723SSascha Wildner //
69*1370a723SSascha Wildner // Physical memory protection attributes
70*1370a723SSascha Wildner //
71*1370a723SSascha Wildner // Note: UEFI spec 2.5 and following: use EFI_MEMORY_RO as write-protected physical memory
72*1370a723SSascha Wildner // protection attribute. Also, EFI_MEMORY_WP means cacheability attribute.
73*1370a723SSascha Wildner //
74*1370a723SSascha Wildner #define EFI_MEMORY_WP  0x0000000000001000ULL
75*1370a723SSascha Wildner #define EFI_MEMORY_RP  0x0000000000002000ULL
76*1370a723SSascha Wildner #define EFI_MEMORY_XP  0x0000000000004000ULL
77*1370a723SSascha Wildner #define EFI_MEMORY_RO  0x0000000000020000ULL
78*1370a723SSascha Wildner //
79*1370a723SSascha Wildner // Physical memory persistence attribute.
80*1370a723SSascha Wildner // The memory region supports byte-addressable non-volatility.
81*1370a723SSascha Wildner //
82*1370a723SSascha Wildner #define EFI_MEMORY_NV  0x0000000000008000ULL
83*1370a723SSascha Wildner //
84*1370a723SSascha Wildner // The memory region provides higher reliability relative to other memory in the system.
85*1370a723SSascha Wildner // If all memory has the same reliability, then this bit is not used.
86*1370a723SSascha Wildner //
87*1370a723SSascha Wildner #define EFI_MEMORY_MORE_RELIABLE  0x0000000000010000ULL
88*1370a723SSascha Wildner 
89*1370a723SSascha Wildner //
90*1370a723SSascha Wildner // Note: UEFI spec 2.8 and following:
91*1370a723SSascha Wildner //
92*1370a723SSascha Wildner // Specific-purpose memory (SPM). The memory is earmarked for
93*1370a723SSascha Wildner // specific purposes such as for specific device drivers or applications.
94*1370a723SSascha Wildner // The SPM attribute serves as a hint to the OS to avoid allocating this
95*1370a723SSascha Wildner // memory for core OS data or code that can not be relocated.
96*1370a723SSascha Wildner //
97*1370a723SSascha Wildner #define EFI_MEMORY_SP  0x0000000000040000ULL
98*1370a723SSascha Wildner //
99*1370a723SSascha Wildner // If this flag is set, the memory region is capable of being
100*1370a723SSascha Wildner // protected with the CPU's memory cryptographic
101*1370a723SSascha Wildner // capabilities. If this flag is clear, the memory region is not
102*1370a723SSascha Wildner // capable of being protected with the CPU's memory
103*1370a723SSascha Wildner // cryptographic capabilities or the CPU does not support CPU
104*1370a723SSascha Wildner // memory cryptographic capabilities.
105*1370a723SSascha Wildner //
106*1370a723SSascha Wildner #define EFI_MEMORY_CPU_CRYPTO  0x0000000000080000ULL
107*1370a723SSascha Wildner 
108*1370a723SSascha Wildner //
109*1370a723SSascha Wildner // Runtime memory attribute
110*1370a723SSascha Wildner //
111*1370a723SSascha Wildner #define EFI_MEMORY_RUNTIME  0x8000000000000000ULL
112*1370a723SSascha Wildner 
113*1370a723SSascha Wildner //
114*1370a723SSascha Wildner // Attributes bitmasks, grouped by type
115*1370a723SSascha Wildner //
116*1370a723SSascha Wildner #define EFI_CACHE_ATTRIBUTE_MASK   (EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_WT | EFI_MEMORY_WB | EFI_MEMORY_UCE | EFI_MEMORY_WP)
117*1370a723SSascha Wildner #define EFI_MEMORY_ACCESS_MASK     (EFI_MEMORY_RP | EFI_MEMORY_XP | EFI_MEMORY_RO)
118*1370a723SSascha Wildner #define EFI_MEMORY_ATTRIBUTE_MASK  (EFI_MEMORY_ACCESS_MASK | EFI_MEMORY_SP | EFI_MEMORY_CPU_CRYPTO)
119*1370a723SSascha Wildner 
120*1370a723SSascha Wildner ///
121*1370a723SSascha Wildner /// Memory descriptor version number.
122*1370a723SSascha Wildner ///
123*1370a723SSascha Wildner #define EFI_MEMORY_DESCRIPTOR_VERSION  1
124*1370a723SSascha Wildner 
125*1370a723SSascha Wildner ///
126*1370a723SSascha Wildner /// Definition of an EFI memory descriptor.
127*1370a723SSascha Wildner ///
128*1370a723SSascha Wildner typedef struct {
129*1370a723SSascha Wildner   ///
130*1370a723SSascha Wildner   /// Type of the memory region.
131*1370a723SSascha Wildner   /// Type EFI_MEMORY_TYPE is defined in the
132*1370a723SSascha Wildner   /// AllocatePages() function description.
133*1370a723SSascha Wildner   ///
134*1370a723SSascha Wildner   UINT32                  Type;
135*1370a723SSascha Wildner   ///
136*1370a723SSascha Wildner   /// Physical address of the first byte in the memory region. PhysicalStart must be
137*1370a723SSascha Wildner   /// aligned on a 4 KiB boundary, and must not be above 0xfffffffffffff000. Type
138*1370a723SSascha Wildner   /// EFI_PHYSICAL_ADDRESS is defined in the AllocatePages() function description
139*1370a723SSascha Wildner   ///
140*1370a723SSascha Wildner   EFI_PHYSICAL_ADDRESS    PhysicalStart;
141*1370a723SSascha Wildner   ///
142*1370a723SSascha Wildner   /// Virtual address of the first byte in the memory region.
143*1370a723SSascha Wildner   /// VirtualStart must be aligned on a 4 KiB boundary,
144*1370a723SSascha Wildner   /// and must not be above 0xfffffffffffff000.
145*1370a723SSascha Wildner   ///
146*1370a723SSascha Wildner   EFI_VIRTUAL_ADDRESS     VirtualStart;
147*1370a723SSascha Wildner   ///
148*1370a723SSascha Wildner   /// NumberOfPagesNumber of 4 KiB pages in the memory region.
149*1370a723SSascha Wildner   /// NumberOfPages must not be 0, and must not be any value
150*1370a723SSascha Wildner   /// that would represent a memory page with a start address,
151*1370a723SSascha Wildner   /// either physical or virtual, above 0xfffffffffffff000.
152*1370a723SSascha Wildner   ///
153*1370a723SSascha Wildner   UINT64                  NumberOfPages;
154*1370a723SSascha Wildner   ///
155*1370a723SSascha Wildner   /// Attributes of the memory region that describe the bit mask of capabilities
156*1370a723SSascha Wildner   /// for that memory region, and not necessarily the current settings for that
157*1370a723SSascha Wildner   /// memory region.
158*1370a723SSascha Wildner   ///
159*1370a723SSascha Wildner   UINT64                  Attribute;
160*1370a723SSascha Wildner } EFI_MEMORY_DESCRIPTOR;
161*1370a723SSascha Wildner 
162*1370a723SSascha Wildner /**
163*1370a723SSascha Wildner   Allocates memory pages from the system.
164*1370a723SSascha Wildner 
165*1370a723SSascha Wildner   @param[in]       Type         The type of allocation to perform.
166*1370a723SSascha Wildner   @param[in]       MemoryType   The type of memory to allocate.
167*1370a723SSascha Wildner                                 MemoryType values in the range 0x70000000..0x7FFFFFFF
168*1370a723SSascha Wildner                                 are reserved for OEM use. MemoryType values in the range
169*1370a723SSascha Wildner                                 0x80000000..0xFFFFFFFF are reserved for use by UEFI OS loaders
170*1370a723SSascha Wildner                                 that are provided by operating system vendors.
171*1370a723SSascha Wildner   @param[in]       Pages        The number of contiguous 4 KB pages to allocate.
172*1370a723SSascha Wildner   @param[in, out]  Memory       The pointer to a physical address. On input, the way in which the address is
173*1370a723SSascha Wildner                                 used depends on the value of Type.
174*1370a723SSascha Wildner 
175*1370a723SSascha Wildner   @retval EFI_SUCCESS           The requested pages were allocated.
176*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER 1) Type is not AllocateAnyPages or
177*1370a723SSascha Wildner                                 AllocateMaxAddress or AllocateAddress.
178*1370a723SSascha Wildner                                 2) MemoryType is in the range
179*1370a723SSascha Wildner                                 EfiMaxMemoryType..0x6FFFFFFF.
180*1370a723SSascha Wildner                                 3) Memory is NULL.
181*1370a723SSascha Wildner                                 4) MemoryType is EfiPersistentMemory.
182*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  The pages could not be allocated.
183*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         The requested pages could not be found.
184*1370a723SSascha Wildner 
185*1370a723SSascha Wildner **/
186*1370a723SSascha Wildner typedef
187*1370a723SSascha Wildner EFI_STATUS
188*1370a723SSascha Wildner (EFIAPI *EFI_ALLOCATE_PAGES)(
189*1370a723SSascha Wildner   IN     EFI_ALLOCATE_TYPE            Type,
190*1370a723SSascha Wildner   IN     EFI_MEMORY_TYPE              MemoryType,
191*1370a723SSascha Wildner   IN     UINTN                        Pages,
192*1370a723SSascha Wildner   IN OUT EFI_PHYSICAL_ADDRESS         *Memory
193*1370a723SSascha Wildner   );
194*1370a723SSascha Wildner 
195*1370a723SSascha Wildner /**
196*1370a723SSascha Wildner   Frees memory pages.
197*1370a723SSascha Wildner 
198*1370a723SSascha Wildner   @param[in]  Memory      The base physical address of the pages to be freed.
199*1370a723SSascha Wildner   @param[in]  Pages       The number of contiguous 4 KB pages to free.
200*1370a723SSascha Wildner 
201*1370a723SSascha Wildner   @retval EFI_SUCCESS           The requested pages were freed.
202*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Memory is not a page-aligned address or Pages is invalid.
203*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         The requested memory pages were not allocated with
204*1370a723SSascha Wildner                                 AllocatePages().
205*1370a723SSascha Wildner 
206*1370a723SSascha Wildner **/
207*1370a723SSascha Wildner typedef
208*1370a723SSascha Wildner EFI_STATUS
209*1370a723SSascha Wildner (EFIAPI *EFI_FREE_PAGES)(
210*1370a723SSascha Wildner   IN  EFI_PHYSICAL_ADDRESS         Memory,
211*1370a723SSascha Wildner   IN  UINTN                        Pages
212*1370a723SSascha Wildner   );
213*1370a723SSascha Wildner 
214*1370a723SSascha Wildner /**
215*1370a723SSascha Wildner   Returns the current memory map.
216*1370a723SSascha Wildner 
217*1370a723SSascha Wildner   @param[in, out]  MemoryMapSize         A pointer to the size, in bytes, of the MemoryMap buffer.
218*1370a723SSascha Wildner                                          On input, this is the size of the buffer allocated by the caller.
219*1370a723SSascha Wildner                                          On output, it is the size of the buffer returned by the firmware if
220*1370a723SSascha Wildner                                          the buffer was large enough, or the size of the buffer needed to contain
221*1370a723SSascha Wildner                                          the map if the buffer was too small.
222*1370a723SSascha Wildner   @param[out]      MemoryMap             A pointer to the buffer in which firmware places the current memory
223*1370a723SSascha Wildner                                          map.
224*1370a723SSascha Wildner   @param[out]      MapKey                A pointer to the location in which firmware returns the key for the
225*1370a723SSascha Wildner                                          current memory map.
226*1370a723SSascha Wildner   @param[out]      DescriptorSize        A pointer to the location in which firmware returns the size, in bytes, of
227*1370a723SSascha Wildner                                          an individual EFI_MEMORY_DESCRIPTOR.
228*1370a723SSascha Wildner   @param[out]      DescriptorVersion     A pointer to the location in which firmware returns the version number
229*1370a723SSascha Wildner                                          associated with the EFI_MEMORY_DESCRIPTOR.
230*1370a723SSascha Wildner 
231*1370a723SSascha Wildner   @retval EFI_SUCCESS           The memory map was returned in the MemoryMap buffer.
232*1370a723SSascha Wildner   @retval EFI_BUFFER_TOO_SMALL  The MemoryMap buffer was too small. The current buffer size
233*1370a723SSascha Wildner                                 needed to hold the memory map is returned in MemoryMapSize.
234*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER 1) MemoryMapSize is NULL.
235*1370a723SSascha Wildner                                 2) The MemoryMap buffer is not too small and MemoryMap is
236*1370a723SSascha Wildner                                    NULL.
237*1370a723SSascha Wildner 
238*1370a723SSascha Wildner **/
239*1370a723SSascha Wildner typedef
240*1370a723SSascha Wildner EFI_STATUS
241*1370a723SSascha Wildner (EFIAPI *EFI_GET_MEMORY_MAP)(
242*1370a723SSascha Wildner   IN OUT UINTN                       *MemoryMapSize,
243*1370a723SSascha Wildner   OUT    EFI_MEMORY_DESCRIPTOR       *MemoryMap,
244*1370a723SSascha Wildner   OUT    UINTN                       *MapKey,
245*1370a723SSascha Wildner   OUT    UINTN                       *DescriptorSize,
246*1370a723SSascha Wildner   OUT    UINT32                      *DescriptorVersion
247*1370a723SSascha Wildner   );
248*1370a723SSascha Wildner 
249*1370a723SSascha Wildner /**
250*1370a723SSascha Wildner   Allocates pool memory.
251*1370a723SSascha Wildner 
252*1370a723SSascha Wildner   @param[in]   PoolType         The type of pool to allocate.
253*1370a723SSascha Wildner                                 MemoryType values in the range 0x70000000..0x7FFFFFFF
254*1370a723SSascha Wildner                                 are reserved for OEM use. MemoryType values in the range
255*1370a723SSascha Wildner                                 0x80000000..0xFFFFFFFF are reserved for use by UEFI OS loaders
256*1370a723SSascha Wildner                                 that are provided by operating system vendors.
257*1370a723SSascha Wildner   @param[in]   Size             The number of bytes to allocate from the pool.
258*1370a723SSascha Wildner   @param[out]  Buffer           A pointer to a pointer to the allocated buffer if the call succeeds;
259*1370a723SSascha Wildner                                 undefined otherwise.
260*1370a723SSascha Wildner 
261*1370a723SSascha Wildner   @retval EFI_SUCCESS           The requested number of bytes was allocated.
262*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  The pool requested could not be allocated.
263*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Buffer is NULL.
264*1370a723SSascha Wildner                                 PoolType is in the range EfiMaxMemoryType..0x6FFFFFFF.
265*1370a723SSascha Wildner                                 PoolType is EfiPersistentMemory.
266*1370a723SSascha Wildner 
267*1370a723SSascha Wildner **/
268*1370a723SSascha Wildner typedef
269*1370a723SSascha Wildner EFI_STATUS
270*1370a723SSascha Wildner (EFIAPI *EFI_ALLOCATE_POOL)(
271*1370a723SSascha Wildner   IN  EFI_MEMORY_TYPE              PoolType,
272*1370a723SSascha Wildner   IN  UINTN                        Size,
273*1370a723SSascha Wildner   OUT VOID                         **Buffer
274*1370a723SSascha Wildner   );
275*1370a723SSascha Wildner 
276*1370a723SSascha Wildner /**
277*1370a723SSascha Wildner   Returns pool memory to the system.
278*1370a723SSascha Wildner 
279*1370a723SSascha Wildner   @param[in]  Buffer            The pointer to the buffer to free.
280*1370a723SSascha Wildner 
281*1370a723SSascha Wildner   @retval EFI_SUCCESS           The memory was returned to the system.
282*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Buffer was invalid.
283*1370a723SSascha Wildner 
284*1370a723SSascha Wildner **/
285*1370a723SSascha Wildner typedef
286*1370a723SSascha Wildner EFI_STATUS
287*1370a723SSascha Wildner (EFIAPI *EFI_FREE_POOL)(
288*1370a723SSascha Wildner   IN  VOID                         *Buffer
289*1370a723SSascha Wildner   );
290*1370a723SSascha Wildner 
291*1370a723SSascha Wildner /**
292*1370a723SSascha Wildner   Changes the runtime addressing mode of EFI firmware from physical to virtual.
293*1370a723SSascha Wildner 
294*1370a723SSascha Wildner   @param[in]  MemoryMapSize     The size in bytes of VirtualMap.
295*1370a723SSascha Wildner   @param[in]  DescriptorSize    The size in bytes of an entry in the VirtualMap.
296*1370a723SSascha Wildner   @param[in]  DescriptorVersion The version of the structure entries in VirtualMap.
297*1370a723SSascha Wildner   @param[in]  VirtualMap        An array of memory descriptors which contain new virtual
298*1370a723SSascha Wildner                                 address mapping information for all runtime ranges.
299*1370a723SSascha Wildner 
300*1370a723SSascha Wildner   @retval EFI_SUCCESS           The virtual address map has been applied.
301*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       EFI firmware is not at runtime, or the EFI firmware is already in
302*1370a723SSascha Wildner                                 virtual address mapped mode.
303*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER DescriptorSize or DescriptorVersion is invalid.
304*1370a723SSascha Wildner   @retval EFI_NO_MAPPING        A virtual address was not supplied for a range in the memory
305*1370a723SSascha Wildner                                 map that requires a mapping.
306*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         A virtual address was supplied for an address that is not found
307*1370a723SSascha Wildner                                 in the memory map.
308*1370a723SSascha Wildner 
309*1370a723SSascha Wildner **/
310*1370a723SSascha Wildner typedef
311*1370a723SSascha Wildner EFI_STATUS
312*1370a723SSascha Wildner (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP)(
313*1370a723SSascha Wildner   IN  UINTN                        MemoryMapSize,
314*1370a723SSascha Wildner   IN  UINTN                        DescriptorSize,
315*1370a723SSascha Wildner   IN  UINT32                       DescriptorVersion,
316*1370a723SSascha Wildner   IN  EFI_MEMORY_DESCRIPTOR        *VirtualMap
317*1370a723SSascha Wildner   );
318*1370a723SSascha Wildner 
319*1370a723SSascha Wildner /**
320*1370a723SSascha Wildner   Connects one or more drivers to a controller.
321*1370a723SSascha Wildner 
322*1370a723SSascha Wildner   @param[in]  ControllerHandle      The handle of the controller to which driver(s) are to be connected.
323*1370a723SSascha Wildner   @param[in]  DriverImageHandle     A pointer to an ordered list handles that support the
324*1370a723SSascha Wildner                                     EFI_DRIVER_BINDING_PROTOCOL.
325*1370a723SSascha Wildner   @param[in]  RemainingDevicePath   A pointer to the device path that specifies a child of the
326*1370a723SSascha Wildner                                     controller specified by ControllerHandle.
327*1370a723SSascha Wildner   @param[in]  Recursive             If TRUE, then ConnectController() is called recursively
328*1370a723SSascha Wildner                                     until the entire tree of controllers below the controller specified
329*1370a723SSascha Wildner                                     by ControllerHandle have been created. If FALSE, then
330*1370a723SSascha Wildner                                     the tree of controllers is only expanded one level.
331*1370a723SSascha Wildner 
332*1370a723SSascha Wildner   @retval EFI_SUCCESS           1) One or more drivers were connected to ControllerHandle.
333*1370a723SSascha Wildner                                 2) No drivers were connected to ControllerHandle, but
334*1370a723SSascha Wildner                                 RemainingDevicePath is not NULL, and it is an End Device
335*1370a723SSascha Wildner                                 Path Node.
336*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
337*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         1) There are no EFI_DRIVER_BINDING_PROTOCOL instances
338*1370a723SSascha Wildner                                 present in the system.
339*1370a723SSascha Wildner                                 2) No drivers were connected to ControllerHandle.
340*1370a723SSascha Wildner   @retval EFI_SECURITY_VIOLATION
341*1370a723SSascha Wildner                                 The user has no permission to start UEFI device drivers on the device path
342*1370a723SSascha Wildner                                 associated with the ControllerHandle or specified by the RemainingDevicePath.
343*1370a723SSascha Wildner **/
344*1370a723SSascha Wildner typedef
345*1370a723SSascha Wildner EFI_STATUS
346*1370a723SSascha Wildner (EFIAPI *EFI_CONNECT_CONTROLLER)(
347*1370a723SSascha Wildner   IN  EFI_HANDLE                    ControllerHandle,
348*1370a723SSascha Wildner   IN  EFI_HANDLE                    *DriverImageHandle    OPTIONAL,
349*1370a723SSascha Wildner   IN  EFI_DEVICE_PATH_PROTOCOL      *RemainingDevicePath  OPTIONAL,
350*1370a723SSascha Wildner   IN  BOOLEAN                       Recursive
351*1370a723SSascha Wildner   );
352*1370a723SSascha Wildner 
353*1370a723SSascha Wildner /**
354*1370a723SSascha Wildner   Disconnects one or more drivers from a controller.
355*1370a723SSascha Wildner 
356*1370a723SSascha Wildner   @param[in]  ControllerHandle      The handle of the controller from which driver(s) are to be disconnected.
357*1370a723SSascha Wildner   @param[in]  DriverImageHandle     The driver to disconnect from ControllerHandle.
358*1370a723SSascha Wildner                                     If DriverImageHandle is NULL, then all the drivers currently managing
359*1370a723SSascha Wildner                                     ControllerHandle are disconnected from ControllerHandle.
360*1370a723SSascha Wildner   @param[in]  ChildHandle           The handle of the child to destroy.
361*1370a723SSascha Wildner                                     If ChildHandle is NULL, then all the children of ControllerHandle are
362*1370a723SSascha Wildner                                     destroyed before the drivers are disconnected from ControllerHandle.
363*1370a723SSascha Wildner 
364*1370a723SSascha Wildner   @retval EFI_SUCCESS           1) One or more drivers were disconnected from the controller.
365*1370a723SSascha Wildner                                 2) On entry, no drivers are managing ControllerHandle.
366*1370a723SSascha Wildner                                 3) DriverImageHandle is not NULL, and on entry
367*1370a723SSascha Wildner                                    DriverImageHandle is not managing ControllerHandle.
368*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER 1) ControllerHandle is NULL.
369*1370a723SSascha Wildner                                 2) DriverImageHandle is not NULL, and it is not a valid EFI_HANDLE.
370*1370a723SSascha Wildner                                 3) ChildHandle is not NULL, and it is not a valid EFI_HANDLE.
371*1370a723SSascha Wildner                                 4) DriverImageHandle does not support the EFI_DRIVER_BINDING_PROTOCOL.
372*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to disconnect any drivers from
373*1370a723SSascha Wildner                                 ControllerHandle.
374*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The controller could not be disconnected because of a device error.
375*1370a723SSascha Wildner 
376*1370a723SSascha Wildner **/
377*1370a723SSascha Wildner typedef
378*1370a723SSascha Wildner EFI_STATUS
379*1370a723SSascha Wildner (EFIAPI *EFI_DISCONNECT_CONTROLLER)(
380*1370a723SSascha Wildner   IN  EFI_HANDLE                     ControllerHandle,
381*1370a723SSascha Wildner   IN  EFI_HANDLE                     DriverImageHandle  OPTIONAL,
382*1370a723SSascha Wildner   IN  EFI_HANDLE                     ChildHandle        OPTIONAL
383*1370a723SSascha Wildner   );
384*1370a723SSascha Wildner 
385*1370a723SSascha Wildner //
386*1370a723SSascha Wildner // ConvertPointer DebugDisposition type.
387*1370a723SSascha Wildner //
388*1370a723SSascha Wildner #define EFI_OPTIONAL_PTR  0x00000001
389*1370a723SSascha Wildner 
390*1370a723SSascha Wildner /**
391*1370a723SSascha Wildner   Determines the new virtual address that is to be used on subsequent memory accesses.
392*1370a723SSascha Wildner 
393*1370a723SSascha Wildner   @param[in]       DebugDisposition  Supplies type information for the pointer being converted.
394*1370a723SSascha Wildner   @param[in, out]  Address           A pointer to a pointer that is to be fixed to be the value needed
395*1370a723SSascha Wildner                                      for the new virtual address mappings being applied.
396*1370a723SSascha Wildner 
397*1370a723SSascha Wildner   @retval EFI_SUCCESS           The pointer pointed to by Address was modified.
398*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER 1) Address is NULL.
399*1370a723SSascha Wildner                                 2) *Address is NULL and DebugDisposition does
400*1370a723SSascha Wildner                                 not have the EFI_OPTIONAL_PTR bit set.
401*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         The pointer pointed to by Address was not found to be part
402*1370a723SSascha Wildner                                 of the current memory map. This is normally fatal.
403*1370a723SSascha Wildner 
404*1370a723SSascha Wildner **/
405*1370a723SSascha Wildner typedef
406*1370a723SSascha Wildner EFI_STATUS
407*1370a723SSascha Wildner (EFIAPI *EFI_CONVERT_POINTER)(
408*1370a723SSascha Wildner   IN     UINTN                      DebugDisposition,
409*1370a723SSascha Wildner   IN OUT VOID                       **Address
410*1370a723SSascha Wildner   );
411*1370a723SSascha Wildner 
412*1370a723SSascha Wildner //
413*1370a723SSascha Wildner // These types can be ORed together as needed - for example,
414*1370a723SSascha Wildner // EVT_TIMER might be Ored with EVT_NOTIFY_WAIT or
415*1370a723SSascha Wildner // EVT_NOTIFY_SIGNAL.
416*1370a723SSascha Wildner //
417*1370a723SSascha Wildner #define EVT_TIMER          0x80000000
418*1370a723SSascha Wildner #define EVT_RUNTIME        0x40000000
419*1370a723SSascha Wildner #define EVT_NOTIFY_WAIT    0x00000100
420*1370a723SSascha Wildner #define EVT_NOTIFY_SIGNAL  0x00000200
421*1370a723SSascha Wildner 
422*1370a723SSascha Wildner #define EVT_SIGNAL_EXIT_BOOT_SERVICES      0x00000201
423*1370a723SSascha Wildner #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE  0x60000202
424*1370a723SSascha Wildner 
425*1370a723SSascha Wildner //
426*1370a723SSascha Wildner // The event's NotifyContext pointer points to a runtime memory
427*1370a723SSascha Wildner // address.
428*1370a723SSascha Wildner // The event is deprecated in UEFI2.0 and later specifications.
429*1370a723SSascha Wildner //
430*1370a723SSascha Wildner #define EVT_RUNTIME_CONTEXT  0x20000000
431*1370a723SSascha Wildner 
432*1370a723SSascha Wildner /**
433*1370a723SSascha Wildner   Invoke a notification event
434*1370a723SSascha Wildner 
435*1370a723SSascha Wildner   @param[in]  Event                 Event whose notification function is being invoked.
436*1370a723SSascha Wildner   @param[in]  Context               The pointer to the notification function's context,
437*1370a723SSascha Wildner                                     which is implementation-dependent.
438*1370a723SSascha Wildner 
439*1370a723SSascha Wildner **/
440*1370a723SSascha Wildner typedef
441*1370a723SSascha Wildner VOID
442*1370a723SSascha Wildner (EFIAPI *EFI_EVENT_NOTIFY)(
443*1370a723SSascha Wildner   IN  EFI_EVENT                Event,
444*1370a723SSascha Wildner   IN  VOID                     *Context
445*1370a723SSascha Wildner   );
446*1370a723SSascha Wildner 
447*1370a723SSascha Wildner /**
448*1370a723SSascha Wildner   Creates an event.
449*1370a723SSascha Wildner 
450*1370a723SSascha Wildner   @param[in]   Type             The type of event to create and its mode and attributes.
451*1370a723SSascha Wildner   @param[in]   NotifyTpl        The task priority level of event notifications, if needed.
452*1370a723SSascha Wildner   @param[in]   NotifyFunction   The pointer to the event's notification function, if any.
453*1370a723SSascha Wildner   @param[in]   NotifyContext    The pointer to the notification function's context; corresponds to parameter
454*1370a723SSascha Wildner                                 Context in the notification function.
455*1370a723SSascha Wildner   @param[out]  Event            The pointer to the newly created event if the call succeeds; undefined
456*1370a723SSascha Wildner                                 otherwise.
457*1370a723SSascha Wildner 
458*1370a723SSascha Wildner   @retval EFI_SUCCESS           The event structure was created.
459*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
460*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  The event could not be allocated.
461*1370a723SSascha Wildner 
462*1370a723SSascha Wildner **/
463*1370a723SSascha Wildner typedef
464*1370a723SSascha Wildner EFI_STATUS
465*1370a723SSascha Wildner (EFIAPI *EFI_CREATE_EVENT)(
466*1370a723SSascha Wildner   IN  UINT32                       Type,
467*1370a723SSascha Wildner   IN  EFI_TPL                      NotifyTpl,
468*1370a723SSascha Wildner   IN  EFI_EVENT_NOTIFY             NotifyFunction OPTIONAL,
469*1370a723SSascha Wildner   IN  VOID                         *NotifyContext OPTIONAL,
470*1370a723SSascha Wildner   OUT EFI_EVENT                    *Event
471*1370a723SSascha Wildner   );
472*1370a723SSascha Wildner 
473*1370a723SSascha Wildner /**
474*1370a723SSascha Wildner   Creates an event in a group.
475*1370a723SSascha Wildner 
476*1370a723SSascha Wildner   @param[in]   Type             The type of event to create and its mode and attributes.
477*1370a723SSascha Wildner   @param[in]   NotifyTpl        The task priority level of event notifications,if needed.
478*1370a723SSascha Wildner   @param[in]   NotifyFunction   The pointer to the event's notification function, if any.
479*1370a723SSascha Wildner   @param[in]   NotifyContext    The pointer to the notification function's context; corresponds to parameter
480*1370a723SSascha Wildner                                 Context in the notification function.
481*1370a723SSascha Wildner   @param[in]   EventGroup       The pointer to the unique identifier of the group to which this event belongs.
482*1370a723SSascha Wildner                                 If this is NULL, then the function behaves as if the parameters were passed
483*1370a723SSascha Wildner                                 to CreateEvent.
484*1370a723SSascha Wildner   @param[out]  Event            The pointer to the newly created event if the call succeeds; undefined
485*1370a723SSascha Wildner                                 otherwise.
486*1370a723SSascha Wildner 
487*1370a723SSascha Wildner   @retval EFI_SUCCESS           The event structure was created.
488*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
489*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  The event could not be allocated.
490*1370a723SSascha Wildner 
491*1370a723SSascha Wildner **/
492*1370a723SSascha Wildner typedef
493*1370a723SSascha Wildner EFI_STATUS
494*1370a723SSascha Wildner (EFIAPI *EFI_CREATE_EVENT_EX)(
495*1370a723SSascha Wildner   IN       UINT32                 Type,
496*1370a723SSascha Wildner   IN       EFI_TPL                NotifyTpl,
497*1370a723SSascha Wildner   IN       EFI_EVENT_NOTIFY       NotifyFunction OPTIONAL,
498*1370a723SSascha Wildner   IN CONST VOID                   *NotifyContext OPTIONAL,
499*1370a723SSascha Wildner   IN CONST EFI_GUID               *EventGroup    OPTIONAL,
500*1370a723SSascha Wildner   OUT      EFI_EVENT              *Event
501*1370a723SSascha Wildner   );
502*1370a723SSascha Wildner 
503*1370a723SSascha Wildner ///
504*1370a723SSascha Wildner /// Timer delay types
505*1370a723SSascha Wildner ///
506*1370a723SSascha Wildner typedef enum {
507*1370a723SSascha Wildner   ///
508*1370a723SSascha Wildner   /// An event's timer settings is to be cancelled and not trigger time is to be set/
509*1370a723SSascha Wildner   ///
510*1370a723SSascha Wildner   TimerCancel,
511*1370a723SSascha Wildner   ///
512*1370a723SSascha Wildner   /// An event is to be signaled periodically at a specified interval from the current time.
513*1370a723SSascha Wildner   ///
514*1370a723SSascha Wildner   TimerPeriodic,
515*1370a723SSascha Wildner   ///
516*1370a723SSascha Wildner   /// An event is to be signaled once at a specified interval from the current time.
517*1370a723SSascha Wildner   ///
518*1370a723SSascha Wildner   TimerRelative
519*1370a723SSascha Wildner } EFI_TIMER_DELAY;
520*1370a723SSascha Wildner 
521*1370a723SSascha Wildner /**
522*1370a723SSascha Wildner   Sets the type of timer and the trigger time for a timer event.
523*1370a723SSascha Wildner 
524*1370a723SSascha Wildner   @param[in]  Event             The timer event that is to be signaled at the specified time.
525*1370a723SSascha Wildner   @param[in]  Type              The type of time that is specified in TriggerTime.
526*1370a723SSascha Wildner   @param[in]  TriggerTime       The number of 100ns units until the timer expires.
527*1370a723SSascha Wildner                                 A TriggerTime of 0 is legal.
528*1370a723SSascha Wildner                                 If Type is TimerRelative and TriggerTime is 0, then the timer
529*1370a723SSascha Wildner                                 event will be signaled on the next timer tick.
530*1370a723SSascha Wildner                                 If Type is TimerPeriodic and TriggerTime is 0, then the timer
531*1370a723SSascha Wildner                                 event will be signaled on every timer tick.
532*1370a723SSascha Wildner 
533*1370a723SSascha Wildner   @retval EFI_SUCCESS           The event has been set to be signaled at the requested time.
534*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Event or Type is not valid.
535*1370a723SSascha Wildner 
536*1370a723SSascha Wildner **/
537*1370a723SSascha Wildner typedef
538*1370a723SSascha Wildner EFI_STATUS
539*1370a723SSascha Wildner (EFIAPI *EFI_SET_TIMER)(
540*1370a723SSascha Wildner   IN  EFI_EVENT                Event,
541*1370a723SSascha Wildner   IN  EFI_TIMER_DELAY          Type,
542*1370a723SSascha Wildner   IN  UINT64                   TriggerTime
543*1370a723SSascha Wildner   );
544*1370a723SSascha Wildner 
545*1370a723SSascha Wildner /**
546*1370a723SSascha Wildner   Signals an event.
547*1370a723SSascha Wildner 
548*1370a723SSascha Wildner   @param[in]  Event             The event to signal.
549*1370a723SSascha Wildner 
550*1370a723SSascha Wildner   @retval EFI_SUCCESS           The event has been signaled.
551*1370a723SSascha Wildner 
552*1370a723SSascha Wildner **/
553*1370a723SSascha Wildner typedef
554*1370a723SSascha Wildner EFI_STATUS
555*1370a723SSascha Wildner (EFIAPI *EFI_SIGNAL_EVENT)(
556*1370a723SSascha Wildner   IN  EFI_EVENT                Event
557*1370a723SSascha Wildner   );
558*1370a723SSascha Wildner 
559*1370a723SSascha Wildner /**
560*1370a723SSascha Wildner   Stops execution until an event is signaled.
561*1370a723SSascha Wildner 
562*1370a723SSascha Wildner   @param[in]   NumberOfEvents   The number of events in the Event array.
563*1370a723SSascha Wildner   @param[in]   Event            An array of EFI_EVENT.
564*1370a723SSascha Wildner   @param[out]  Index            The pointer to the index of the event which satisfied the wait condition.
565*1370a723SSascha Wildner 
566*1370a723SSascha Wildner   @retval EFI_SUCCESS           The event indicated by Index was signaled.
567*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER 1) NumberOfEvents is 0.
568*1370a723SSascha Wildner                                 2) The event indicated by Index is of type
569*1370a723SSascha Wildner                                    EVT_NOTIFY_SIGNAL.
570*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       The current TPL is not TPL_APPLICATION.
571*1370a723SSascha Wildner 
572*1370a723SSascha Wildner **/
573*1370a723SSascha Wildner typedef
574*1370a723SSascha Wildner EFI_STATUS
575*1370a723SSascha Wildner (EFIAPI *EFI_WAIT_FOR_EVENT)(
576*1370a723SSascha Wildner   IN  UINTN                    NumberOfEvents,
577*1370a723SSascha Wildner   IN  EFI_EVENT                *Event,
578*1370a723SSascha Wildner   OUT UINTN                    *Index
579*1370a723SSascha Wildner   );
580*1370a723SSascha Wildner 
581*1370a723SSascha Wildner /**
582*1370a723SSascha Wildner   Closes an event.
583*1370a723SSascha Wildner 
584*1370a723SSascha Wildner   @param[in]  Event             The event to close.
585*1370a723SSascha Wildner 
586*1370a723SSascha Wildner   @retval EFI_SUCCESS           The event has been closed.
587*1370a723SSascha Wildner 
588*1370a723SSascha Wildner **/
589*1370a723SSascha Wildner typedef
590*1370a723SSascha Wildner EFI_STATUS
591*1370a723SSascha Wildner (EFIAPI *EFI_CLOSE_EVENT)(
592*1370a723SSascha Wildner   IN EFI_EVENT                Event
593*1370a723SSascha Wildner   );
594*1370a723SSascha Wildner 
595*1370a723SSascha Wildner /**
596*1370a723SSascha Wildner   Checks whether an event is in the signaled state.
597*1370a723SSascha Wildner 
598*1370a723SSascha Wildner   @param[in]  Event             The event to check.
599*1370a723SSascha Wildner 
600*1370a723SSascha Wildner   @retval EFI_SUCCESS           The event is in the signaled state.
601*1370a723SSascha Wildner   @retval EFI_NOT_READY         The event is not in the signaled state.
602*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Event is of type EVT_NOTIFY_SIGNAL.
603*1370a723SSascha Wildner 
604*1370a723SSascha Wildner **/
605*1370a723SSascha Wildner typedef
606*1370a723SSascha Wildner EFI_STATUS
607*1370a723SSascha Wildner (EFIAPI *EFI_CHECK_EVENT)(
608*1370a723SSascha Wildner   IN EFI_EVENT                Event
609*1370a723SSascha Wildner   );
610*1370a723SSascha Wildner 
611*1370a723SSascha Wildner //
612*1370a723SSascha Wildner // Task priority level
613*1370a723SSascha Wildner //
614*1370a723SSascha Wildner #define TPL_APPLICATION  4
615*1370a723SSascha Wildner #define TPL_CALLBACK     8
616*1370a723SSascha Wildner #define TPL_NOTIFY       16
617*1370a723SSascha Wildner #define TPL_HIGH_LEVEL   31
618*1370a723SSascha Wildner 
619*1370a723SSascha Wildner /**
620*1370a723SSascha Wildner   Raises a task's priority level and returns its previous level.
621*1370a723SSascha Wildner 
622*1370a723SSascha Wildner   @param[in]  NewTpl          The new task priority level.
623*1370a723SSascha Wildner 
624*1370a723SSascha Wildner   @return Previous task priority level
625*1370a723SSascha Wildner 
626*1370a723SSascha Wildner **/
627*1370a723SSascha Wildner typedef
628*1370a723SSascha Wildner EFI_TPL
629*1370a723SSascha Wildner (EFIAPI *EFI_RAISE_TPL)(
630*1370a723SSascha Wildner   IN EFI_TPL      NewTpl
631*1370a723SSascha Wildner   );
632*1370a723SSascha Wildner 
633*1370a723SSascha Wildner /**
634*1370a723SSascha Wildner   Restores a task's priority level to its previous value.
635*1370a723SSascha Wildner 
636*1370a723SSascha Wildner   @param[in]  OldTpl          The previous task priority level to restore.
637*1370a723SSascha Wildner 
638*1370a723SSascha Wildner **/
639*1370a723SSascha Wildner typedef
640*1370a723SSascha Wildner VOID
641*1370a723SSascha Wildner (EFIAPI *EFI_RESTORE_TPL)(
642*1370a723SSascha Wildner   IN EFI_TPL      OldTpl
643*1370a723SSascha Wildner   );
644*1370a723SSascha Wildner 
645*1370a723SSascha Wildner /**
646*1370a723SSascha Wildner   Returns the value of a variable.
647*1370a723SSascha Wildner 
648*1370a723SSascha Wildner   @param[in]       VariableName  A Null-terminated string that is the name of the vendor's
649*1370a723SSascha Wildner                                  variable.
650*1370a723SSascha Wildner   @param[in]       VendorGuid    A unique identifier for the vendor.
651*1370a723SSascha Wildner   @param[out]      Attributes    If not NULL, a pointer to the memory location to return the
652*1370a723SSascha Wildner                                  attributes bitmask for the variable.
653*1370a723SSascha Wildner   @param[in, out]  DataSize      On input, the size in bytes of the return Data buffer.
654*1370a723SSascha Wildner                                  On output the size of data returned in Data.
655*1370a723SSascha Wildner   @param[out]      Data          The buffer to return the contents of the variable. May be NULL
656*1370a723SSascha Wildner                                  with a zero DataSize in order to determine the size buffer needed.
657*1370a723SSascha Wildner 
658*1370a723SSascha Wildner   @retval EFI_SUCCESS            The function completed successfully.
659*1370a723SSascha Wildner   @retval EFI_NOT_FOUND          The variable was not found.
660*1370a723SSascha Wildner   @retval EFI_BUFFER_TOO_SMALL   The DataSize is too small for the result.
661*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  VariableName is NULL.
662*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  VendorGuid is NULL.
663*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  DataSize is NULL.
664*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  The DataSize is not too small and Data is NULL.
665*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
666*1370a723SSascha Wildner   @retval EFI_SECURITY_VIOLATION The variable could not be retrieved due to an authentication failure.
667*1370a723SSascha Wildner 
668*1370a723SSascha Wildner **/
669*1370a723SSascha Wildner typedef
670*1370a723SSascha Wildner EFI_STATUS
671*1370a723SSascha Wildner (EFIAPI *EFI_GET_VARIABLE)(
672*1370a723SSascha Wildner   IN     CHAR16                      *VariableName,
673*1370a723SSascha Wildner   IN     EFI_GUID                    *VendorGuid,
674*1370a723SSascha Wildner   OUT    UINT32                      *Attributes     OPTIONAL,
675*1370a723SSascha Wildner   IN OUT UINTN                       *DataSize,
676*1370a723SSascha Wildner   OUT    VOID                        *Data           OPTIONAL
677*1370a723SSascha Wildner   );
678*1370a723SSascha Wildner 
679*1370a723SSascha Wildner /**
680*1370a723SSascha Wildner   Enumerates the current variable names.
681*1370a723SSascha Wildner 
682*1370a723SSascha Wildner   @param[in, out]  VariableNameSize The size of the VariableName buffer. The size must be large
683*1370a723SSascha Wildner                                     enough to fit input string supplied in VariableName buffer.
684*1370a723SSascha Wildner   @param[in, out]  VariableName     On input, supplies the last VariableName that was returned
685*1370a723SSascha Wildner                                     by GetNextVariableName(). On output, returns the Nullterminated
686*1370a723SSascha Wildner                                     string of the current variable.
687*1370a723SSascha Wildner   @param[in, out]  VendorGuid       On input, supplies the last VendorGuid that was returned by
688*1370a723SSascha Wildner                                     GetNextVariableName(). On output, returns the
689*1370a723SSascha Wildner                                     VendorGuid of the current variable.
690*1370a723SSascha Wildner 
691*1370a723SSascha Wildner   @retval EFI_SUCCESS           The function completed successfully.
692*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         The next variable was not found.
693*1370a723SSascha Wildner   @retval EFI_BUFFER_TOO_SMALL  The VariableNameSize is too small for the result.
694*1370a723SSascha Wildner                                 VariableNameSize has been updated with the size needed to complete the request.
695*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER VariableNameSize is NULL.
696*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER VariableName is NULL.
697*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER VendorGuid is NULL.
698*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER The input values of VariableName and VendorGuid are not a name and
699*1370a723SSascha Wildner                                 GUID of an existing variable.
700*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Null-terminator is not found in the first VariableNameSize bytes of
701*1370a723SSascha Wildner                                 the input VariableName buffer.
702*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The variable could not be retrieved due to a hardware error.
703*1370a723SSascha Wildner 
704*1370a723SSascha Wildner **/
705*1370a723SSascha Wildner typedef
706*1370a723SSascha Wildner EFI_STATUS
707*1370a723SSascha Wildner (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME)(
708*1370a723SSascha Wildner   IN OUT UINTN                    *VariableNameSize,
709*1370a723SSascha Wildner   IN OUT CHAR16                   *VariableName,
710*1370a723SSascha Wildner   IN OUT EFI_GUID                 *VendorGuid
711*1370a723SSascha Wildner   );
712*1370a723SSascha Wildner 
713*1370a723SSascha Wildner /**
714*1370a723SSascha Wildner   Sets the value of a variable.
715*1370a723SSascha Wildner 
716*1370a723SSascha Wildner   @param[in]  VariableName       A Null-terminated string that is the name of the vendor's variable.
717*1370a723SSascha Wildner                                  Each VariableName is unique for each VendorGuid. VariableName must
718*1370a723SSascha Wildner                                  contain 1 or more characters. If VariableName is an empty string,
719*1370a723SSascha Wildner                                  then EFI_INVALID_PARAMETER is returned.
720*1370a723SSascha Wildner   @param[in]  VendorGuid         A unique identifier for the vendor.
721*1370a723SSascha Wildner   @param[in]  Attributes         Attributes bitmask to set for the variable.
722*1370a723SSascha Wildner   @param[in]  DataSize           The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE or
723*1370a723SSascha Wildner                                  EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero
724*1370a723SSascha Wildner                                  causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is
725*1370a723SSascha Wildner                                  set, then a SetVariable() call with a DataSize of zero will not cause any change to
726*1370a723SSascha Wildner                                  the variable value (the timestamp associated with the variable may be updated however
727*1370a723SSascha Wildner                                  even if no new data value is provided,see the description of the
728*1370a723SSascha Wildner                                  EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not
729*1370a723SSascha Wildner                                  be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated).
730*1370a723SSascha Wildner   @param[in]  Data               The contents for the variable.
731*1370a723SSascha Wildner 
732*1370a723SSascha Wildner   @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as
733*1370a723SSascha Wildner                                  defined by the Attributes.
734*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits, name, and GUID was supplied, or the
735*1370a723SSascha Wildner                                  DataSize exceeds the maximum allowed.
736*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  VariableName is an empty string.
737*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
738*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
739*1370a723SSascha Wildner   @retval EFI_WRITE_PROTECTED    The variable in question is read-only.
740*1370a723SSascha Wildner   @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
741*1370a723SSascha Wildner   @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set,
742*1370a723SSascha Wildner                                  but the AuthInfo does NOT pass the validation check carried out by the firmware.
743*1370a723SSascha Wildner 
744*1370a723SSascha Wildner   @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.
745*1370a723SSascha Wildner 
746*1370a723SSascha Wildner **/
747*1370a723SSascha Wildner typedef
748*1370a723SSascha Wildner EFI_STATUS
749*1370a723SSascha Wildner (EFIAPI *EFI_SET_VARIABLE)(
750*1370a723SSascha Wildner   IN  CHAR16                       *VariableName,
751*1370a723SSascha Wildner   IN  EFI_GUID                     *VendorGuid,
752*1370a723SSascha Wildner   IN  UINT32                       Attributes,
753*1370a723SSascha Wildner   IN  UINTN                        DataSize,
754*1370a723SSascha Wildner   IN  VOID                         *Data
755*1370a723SSascha Wildner   );
756*1370a723SSascha Wildner 
757*1370a723SSascha Wildner ///
758*1370a723SSascha Wildner /// This provides the capabilities of the
759*1370a723SSascha Wildner /// real time clock device as exposed through the EFI interfaces.
760*1370a723SSascha Wildner ///
761*1370a723SSascha Wildner typedef struct {
762*1370a723SSascha Wildner   ///
763*1370a723SSascha Wildner   /// Provides the reporting resolution of the real-time clock device in
764*1370a723SSascha Wildner   /// counts per second. For a normal PC-AT CMOS RTC device, this
765*1370a723SSascha Wildner   /// value would be 1 Hz, or 1, to indicate that the device only reports
766*1370a723SSascha Wildner   /// the time to the resolution of 1 second.
767*1370a723SSascha Wildner   ///
768*1370a723SSascha Wildner   UINT32     Resolution;
769*1370a723SSascha Wildner   ///
770*1370a723SSascha Wildner   /// Provides the timekeeping accuracy of the real-time clock in an
771*1370a723SSascha Wildner   /// error rate of 1E-6 parts per million. For a clock with an accuracy
772*1370a723SSascha Wildner   /// of 50 parts per million, the value in this field would be
773*1370a723SSascha Wildner   /// 50,000,000.
774*1370a723SSascha Wildner   ///
775*1370a723SSascha Wildner   UINT32     Accuracy;
776*1370a723SSascha Wildner   ///
777*1370a723SSascha Wildner   /// A TRUE indicates that a time set operation clears the device's
778*1370a723SSascha Wildner   /// time below the Resolution reporting level. A FALSE
779*1370a723SSascha Wildner   /// indicates that the state below the Resolution level of the
780*1370a723SSascha Wildner   /// device is not cleared when the time is set. Normal PC-AT CMOS
781*1370a723SSascha Wildner   /// RTC devices set this value to FALSE.
782*1370a723SSascha Wildner   ///
783*1370a723SSascha Wildner   BOOLEAN    SetsToZero;
784*1370a723SSascha Wildner } EFI_TIME_CAPABILITIES;
785*1370a723SSascha Wildner 
786*1370a723SSascha Wildner /**
787*1370a723SSascha Wildner   Returns the current time and date information, and the time-keeping capabilities
788*1370a723SSascha Wildner   of the hardware platform.
789*1370a723SSascha Wildner 
790*1370a723SSascha Wildner   @param[out]  Time             A pointer to storage to receive a snapshot of the current time.
791*1370a723SSascha Wildner   @param[out]  Capabilities     An optional pointer to a buffer to receive the real time clock
792*1370a723SSascha Wildner                                 device's capabilities.
793*1370a723SSascha Wildner 
794*1370a723SSascha Wildner   @retval EFI_SUCCESS           The operation completed successfully.
795*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Time is NULL.
796*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The time could not be retrieved due to hardware error.
797*1370a723SSascha Wildner 
798*1370a723SSascha Wildner **/
799*1370a723SSascha Wildner typedef
800*1370a723SSascha Wildner EFI_STATUS
801*1370a723SSascha Wildner (EFIAPI *EFI_GET_TIME)(
802*1370a723SSascha Wildner   OUT  EFI_TIME                    *Time,
803*1370a723SSascha Wildner   OUT  EFI_TIME_CAPABILITIES       *Capabilities OPTIONAL
804*1370a723SSascha Wildner   );
805*1370a723SSascha Wildner 
806*1370a723SSascha Wildner /**
807*1370a723SSascha Wildner   Sets the current local time and date information.
808*1370a723SSascha Wildner 
809*1370a723SSascha Wildner   @param[in]  Time              A pointer to the current time.
810*1370a723SSascha Wildner 
811*1370a723SSascha Wildner   @retval EFI_SUCCESS           The operation completed successfully.
812*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER A time field is out of range.
813*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The time could not be set due due to hardware error.
814*1370a723SSascha Wildner 
815*1370a723SSascha Wildner **/
816*1370a723SSascha Wildner typedef
817*1370a723SSascha Wildner EFI_STATUS
818*1370a723SSascha Wildner (EFIAPI *EFI_SET_TIME)(
819*1370a723SSascha Wildner   IN  EFI_TIME                     *Time
820*1370a723SSascha Wildner   );
821*1370a723SSascha Wildner 
822*1370a723SSascha Wildner /**
823*1370a723SSascha Wildner   Returns the current wakeup alarm clock setting.
824*1370a723SSascha Wildner 
825*1370a723SSascha Wildner   @param[out]  Enabled          Indicates if the alarm is currently enabled or disabled.
826*1370a723SSascha Wildner   @param[out]  Pending          Indicates if the alarm signal is pending and requires acknowledgement.
827*1370a723SSascha Wildner   @param[out]  Time             The current alarm setting.
828*1370a723SSascha Wildner 
829*1370a723SSascha Wildner   @retval EFI_SUCCESS           The alarm settings were returned.
830*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Enabled is NULL.
831*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Pending is NULL.
832*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Time is NULL.
833*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The wakeup time could not be retrieved due to a hardware error.
834*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       A wakeup timer is not supported on this platform.
835*1370a723SSascha Wildner 
836*1370a723SSascha Wildner **/
837*1370a723SSascha Wildner typedef
838*1370a723SSascha Wildner EFI_STATUS
839*1370a723SSascha Wildner (EFIAPI *EFI_GET_WAKEUP_TIME)(
840*1370a723SSascha Wildner   OUT BOOLEAN                     *Enabled,
841*1370a723SSascha Wildner   OUT BOOLEAN                     *Pending,
842*1370a723SSascha Wildner   OUT EFI_TIME                    *Time
843*1370a723SSascha Wildner   );
844*1370a723SSascha Wildner 
845*1370a723SSascha Wildner /**
846*1370a723SSascha Wildner   Sets the system wakeup alarm clock time.
847*1370a723SSascha Wildner 
848*1370a723SSascha Wildner   @param[in]  Enable            Enable or disable the wakeup alarm.
849*1370a723SSascha Wildner   @param[in]  Time              If Enable is TRUE, the time to set the wakeup alarm for.
850*1370a723SSascha Wildner                                 If Enable is FALSE, then this parameter is optional, and may be NULL.
851*1370a723SSascha Wildner 
852*1370a723SSascha Wildner   @retval EFI_SUCCESS           If Enable is TRUE, then the wakeup alarm was enabled. If
853*1370a723SSascha Wildner                                 Enable is FALSE, then the wakeup alarm was disabled.
854*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER A time field is out of range.
855*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The wakeup time could not be set due to a hardware error.
856*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       A wakeup timer is not supported on this platform.
857*1370a723SSascha Wildner 
858*1370a723SSascha Wildner **/
859*1370a723SSascha Wildner typedef
860*1370a723SSascha Wildner EFI_STATUS
861*1370a723SSascha Wildner (EFIAPI *EFI_SET_WAKEUP_TIME)(
862*1370a723SSascha Wildner   IN  BOOLEAN                      Enable,
863*1370a723SSascha Wildner   IN  EFI_TIME                     *Time   OPTIONAL
864*1370a723SSascha Wildner   );
865*1370a723SSascha Wildner 
866*1370a723SSascha Wildner /**
867*1370a723SSascha Wildner   Loads an EFI image into memory.
868*1370a723SSascha Wildner 
869*1370a723SSascha Wildner   @param[in]   BootPolicy        If TRUE, indicates that the request originates from the boot
870*1370a723SSascha Wildner                                  manager, and that the boot manager is attempting to load
871*1370a723SSascha Wildner                                  FilePath as a boot selection. Ignored if SourceBuffer is
872*1370a723SSascha Wildner                                  not NULL.
873*1370a723SSascha Wildner   @param[in]   ParentImageHandle The caller's image handle.
874*1370a723SSascha Wildner   @param[in]   DevicePath        The DeviceHandle specific file path from which the image is
875*1370a723SSascha Wildner                                  loaded.
876*1370a723SSascha Wildner   @param[in]   SourceBuffer      If not NULL, a pointer to the memory location containing a copy
877*1370a723SSascha Wildner                                  of the image to be loaded.
878*1370a723SSascha Wildner   @param[in]   SourceSize        The size in bytes of SourceBuffer. Ignored if SourceBuffer is NULL.
879*1370a723SSascha Wildner   @param[out]  ImageHandle       The pointer to the returned image handle that is created when the
880*1370a723SSascha Wildner                                  image is successfully loaded.
881*1370a723SSascha Wildner 
882*1370a723SSascha Wildner   @retval EFI_SUCCESS            Image was loaded into memory correctly.
883*1370a723SSascha Wildner   @retval EFI_NOT_FOUND          Both SourceBuffer and DevicePath are NULL.
884*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  One or more parametes are invalid.
885*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED        The image type is not supported.
886*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES   Image was not loaded due to insufficient resources.
887*1370a723SSascha Wildner   @retval EFI_LOAD_ERROR         Image was not loaded because the image format was corrupt or not
888*1370a723SSascha Wildner                                  understood.
889*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR       Image was not loaded because the device returned a read error.
890*1370a723SSascha Wildner   @retval EFI_ACCESS_DENIED      Image was not loaded because the platform policy prohibits the
891*1370a723SSascha Wildner                                  image from being loaded. NULL is returned in *ImageHandle.
892*1370a723SSascha Wildner   @retval EFI_SECURITY_VIOLATION Image was loaded and an ImageHandle was created with a
893*1370a723SSascha Wildner                                  valid EFI_LOADED_IMAGE_PROTOCOL. However, the current
894*1370a723SSascha Wildner                                  platform policy specifies that the image should not be started.
895*1370a723SSascha Wildner **/
896*1370a723SSascha Wildner typedef
897*1370a723SSascha Wildner EFI_STATUS
898*1370a723SSascha Wildner (EFIAPI *EFI_IMAGE_LOAD)(
899*1370a723SSascha Wildner   IN  BOOLEAN                      BootPolicy,
900*1370a723SSascha Wildner   IN  EFI_HANDLE                   ParentImageHandle,
901*1370a723SSascha Wildner   IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath,
902*1370a723SSascha Wildner   IN  VOID                         *SourceBuffer OPTIONAL,
903*1370a723SSascha Wildner   IN  UINTN                        SourceSize,
904*1370a723SSascha Wildner   OUT EFI_HANDLE                   *ImageHandle
905*1370a723SSascha Wildner   );
906*1370a723SSascha Wildner 
907*1370a723SSascha Wildner /**
908*1370a723SSascha Wildner   Transfers control to a loaded image's entry point.
909*1370a723SSascha Wildner 
910*1370a723SSascha Wildner   @param[in]   ImageHandle       Handle of image to be started.
911*1370a723SSascha Wildner   @param[out]  ExitDataSize      The pointer to the size, in bytes, of ExitData.
912*1370a723SSascha Wildner   @param[out]  ExitData          The pointer to a pointer to a data buffer that includes a Null-terminated
913*1370a723SSascha Wildner                                  string, optionally followed by additional binary data.
914*1370a723SSascha Wildner 
915*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER  ImageHandle is either an invalid image handle or the image
916*1370a723SSascha Wildner                                  has already been initialized with StartImage.
917*1370a723SSascha Wildner   @retval EFI_SECURITY_VIOLATION The current platform policy specifies that the image should not be started.
918*1370a723SSascha Wildner   @return Exit code from image
919*1370a723SSascha Wildner 
920*1370a723SSascha Wildner **/
921*1370a723SSascha Wildner typedef
922*1370a723SSascha Wildner EFI_STATUS
923*1370a723SSascha Wildner (EFIAPI *EFI_IMAGE_START)(
924*1370a723SSascha Wildner   IN  EFI_HANDLE                  ImageHandle,
925*1370a723SSascha Wildner   OUT UINTN                       *ExitDataSize,
926*1370a723SSascha Wildner   OUT CHAR16                      **ExitData    OPTIONAL
927*1370a723SSascha Wildner   );
928*1370a723SSascha Wildner 
929*1370a723SSascha Wildner /**
930*1370a723SSascha Wildner   Terminates a loaded EFI image and returns control to boot services.
931*1370a723SSascha Wildner 
932*1370a723SSascha Wildner   @param[in]  ImageHandle       Handle that identifies the image. This parameter is passed to the
933*1370a723SSascha Wildner                                 image on entry.
934*1370a723SSascha Wildner   @param[in]  ExitStatus        The image's exit code.
935*1370a723SSascha Wildner   @param[in]  ExitDataSize      The size, in bytes, of ExitData. Ignored if ExitStatus is EFI_SUCCESS.
936*1370a723SSascha Wildner   @param[in]  ExitData          The pointer to a data buffer that includes a Null-terminated string,
937*1370a723SSascha Wildner                                 optionally followed by additional binary data. The string is a
938*1370a723SSascha Wildner                                 description that the caller may use to further indicate the reason
939*1370a723SSascha Wildner                                 for the image's exit. ExitData is only valid if ExitStatus
940*1370a723SSascha Wildner                                 is something other than EFI_SUCCESS. The ExitData buffer
941*1370a723SSascha Wildner                                 must be allocated by calling AllocatePool().
942*1370a723SSascha Wildner 
943*1370a723SSascha Wildner   @retval EFI_SUCCESS           The image specified by ImageHandle was unloaded.
944*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER The image specified by ImageHandle has been loaded and
945*1370a723SSascha Wildner                                 started with LoadImage() and StartImage(), but the
946*1370a723SSascha Wildner                                 image is not the currently executing image.
947*1370a723SSascha Wildner 
948*1370a723SSascha Wildner **/
949*1370a723SSascha Wildner typedef
950*1370a723SSascha Wildner EFI_STATUS
951*1370a723SSascha Wildner (EFIAPI *EFI_EXIT)(
952*1370a723SSascha Wildner   IN  EFI_HANDLE                   ImageHandle,
953*1370a723SSascha Wildner   IN  EFI_STATUS                   ExitStatus,
954*1370a723SSascha Wildner   IN  UINTN                        ExitDataSize,
955*1370a723SSascha Wildner   IN  CHAR16                       *ExitData     OPTIONAL
956*1370a723SSascha Wildner   );
957*1370a723SSascha Wildner 
958*1370a723SSascha Wildner /**
959*1370a723SSascha Wildner   Unloads an image.
960*1370a723SSascha Wildner 
961*1370a723SSascha Wildner   @param[in]  ImageHandle       Handle that identifies the image to be unloaded.
962*1370a723SSascha Wildner 
963*1370a723SSascha Wildner   @retval EFI_SUCCESS           The image has been unloaded.
964*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
965*1370a723SSascha Wildner 
966*1370a723SSascha Wildner **/
967*1370a723SSascha Wildner typedef
968*1370a723SSascha Wildner EFI_STATUS
969*1370a723SSascha Wildner (EFIAPI *EFI_IMAGE_UNLOAD)(
970*1370a723SSascha Wildner   IN  EFI_HANDLE                   ImageHandle
971*1370a723SSascha Wildner   );
972*1370a723SSascha Wildner 
973*1370a723SSascha Wildner /**
974*1370a723SSascha Wildner   Terminates all boot services.
975*1370a723SSascha Wildner 
976*1370a723SSascha Wildner   @param[in]  ImageHandle       Handle that identifies the exiting image.
977*1370a723SSascha Wildner   @param[in]  MapKey            Key to the latest memory map.
978*1370a723SSascha Wildner 
979*1370a723SSascha Wildner   @retval EFI_SUCCESS           Boot services have been terminated.
980*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER MapKey is incorrect.
981*1370a723SSascha Wildner 
982*1370a723SSascha Wildner **/
983*1370a723SSascha Wildner typedef
984*1370a723SSascha Wildner EFI_STATUS
985*1370a723SSascha Wildner (EFIAPI *EFI_EXIT_BOOT_SERVICES)(
986*1370a723SSascha Wildner   IN  EFI_HANDLE                   ImageHandle,
987*1370a723SSascha Wildner   IN  UINTN                        MapKey
988*1370a723SSascha Wildner   );
989*1370a723SSascha Wildner 
990*1370a723SSascha Wildner /**
991*1370a723SSascha Wildner   Induces a fine-grained stall.
992*1370a723SSascha Wildner 
993*1370a723SSascha Wildner   @param[in]  Microseconds      The number of microseconds to stall execution.
994*1370a723SSascha Wildner 
995*1370a723SSascha Wildner   @retval EFI_SUCCESS           Execution was stalled at least the requested number of
996*1370a723SSascha Wildner                                 Microseconds.
997*1370a723SSascha Wildner 
998*1370a723SSascha Wildner **/
999*1370a723SSascha Wildner typedef
1000*1370a723SSascha Wildner EFI_STATUS
1001*1370a723SSascha Wildner (EFIAPI *EFI_STALL)(
1002*1370a723SSascha Wildner   IN  UINTN                    Microseconds
1003*1370a723SSascha Wildner   );
1004*1370a723SSascha Wildner 
1005*1370a723SSascha Wildner /**
1006*1370a723SSascha Wildner   Sets the system's watchdog timer.
1007*1370a723SSascha Wildner 
1008*1370a723SSascha Wildner   @param[in]  Timeout           The number of seconds to set the watchdog timer to.
1009*1370a723SSascha Wildner   @param[in]  WatchdogCode      The numeric code to log on a watchdog timer timeout event.
1010*1370a723SSascha Wildner   @param[in]  DataSize          The size, in bytes, of WatchdogData.
1011*1370a723SSascha Wildner   @param[in]  WatchdogData      A data buffer that includes a Null-terminated string, optionally
1012*1370a723SSascha Wildner                                 followed by additional binary data.
1013*1370a723SSascha Wildner 
1014*1370a723SSascha Wildner   @retval EFI_SUCCESS           The timeout has been set.
1015*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER The supplied WatchdogCode is invalid.
1016*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       The system does not have a watchdog timer.
1017*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The watchdog timer could not be programmed due to a hardware
1018*1370a723SSascha Wildner                                 error.
1019*1370a723SSascha Wildner 
1020*1370a723SSascha Wildner **/
1021*1370a723SSascha Wildner typedef
1022*1370a723SSascha Wildner EFI_STATUS
1023*1370a723SSascha Wildner (EFIAPI *EFI_SET_WATCHDOG_TIMER)(
1024*1370a723SSascha Wildner   IN UINTN                    Timeout,
1025*1370a723SSascha Wildner   IN UINT64                   WatchdogCode,
1026*1370a723SSascha Wildner   IN UINTN                    DataSize,
1027*1370a723SSascha Wildner   IN CHAR16                   *WatchdogData OPTIONAL
1028*1370a723SSascha Wildner   );
1029*1370a723SSascha Wildner 
1030*1370a723SSascha Wildner /**
1031*1370a723SSascha Wildner   Resets the entire platform.
1032*1370a723SSascha Wildner 
1033*1370a723SSascha Wildner   @param[in]  ResetType         The type of reset to perform.
1034*1370a723SSascha Wildner   @param[in]  ResetStatus       The status code for the reset.
1035*1370a723SSascha Wildner   @param[in]  DataSize          The size, in bytes, of ResetData.
1036*1370a723SSascha Wildner   @param[in]  ResetData         For a ResetType of EfiResetCold, EfiResetWarm, or
1037*1370a723SSascha Wildner                                 EfiResetShutdown the data buffer starts with a Null-terminated
1038*1370a723SSascha Wildner                                 string, optionally followed by additional binary data.
1039*1370a723SSascha Wildner                                 The string is a description that the caller may use to further
1040*1370a723SSascha Wildner                                 indicate the reason for the system reset.
1041*1370a723SSascha Wildner                                 For a ResetType of EfiResetPlatformSpecific the data buffer
1042*1370a723SSascha Wildner                                 also starts with a Null-terminated string that is followed
1043*1370a723SSascha Wildner                                 by an EFI_GUID that describes the specific type of reset to perform.
1044*1370a723SSascha Wildner **/
1045*1370a723SSascha Wildner typedef
1046*1370a723SSascha Wildner VOID
1047*1370a723SSascha Wildner (EFIAPI *EFI_RESET_SYSTEM)(
1048*1370a723SSascha Wildner   IN EFI_RESET_TYPE           ResetType,
1049*1370a723SSascha Wildner   IN EFI_STATUS               ResetStatus,
1050*1370a723SSascha Wildner   IN UINTN                    DataSize,
1051*1370a723SSascha Wildner   IN VOID                     *ResetData OPTIONAL
1052*1370a723SSascha Wildner   );
1053*1370a723SSascha Wildner 
1054*1370a723SSascha Wildner /**
1055*1370a723SSascha Wildner   Returns a monotonically increasing count for the platform.
1056*1370a723SSascha Wildner 
1057*1370a723SSascha Wildner   @param[out]  Count            The pointer to returned value.
1058*1370a723SSascha Wildner 
1059*1370a723SSascha Wildner   @retval EFI_SUCCESS           The next monotonic count was returned.
1060*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Count is NULL.
1061*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The device is not functioning properly.
1062*1370a723SSascha Wildner 
1063*1370a723SSascha Wildner **/
1064*1370a723SSascha Wildner typedef
1065*1370a723SSascha Wildner EFI_STATUS
1066*1370a723SSascha Wildner (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT)(
1067*1370a723SSascha Wildner   OUT UINT64                  *Count
1068*1370a723SSascha Wildner   );
1069*1370a723SSascha Wildner 
1070*1370a723SSascha Wildner /**
1071*1370a723SSascha Wildner   Returns the next high 32 bits of the platform's monotonic counter.
1072*1370a723SSascha Wildner 
1073*1370a723SSascha Wildner   @param[out]  HighCount        The pointer to returned value.
1074*1370a723SSascha Wildner 
1075*1370a723SSascha Wildner   @retval EFI_SUCCESS           The next high monotonic count was returned.
1076*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER HighCount is NULL.
1077*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The device is not functioning properly.
1078*1370a723SSascha Wildner 
1079*1370a723SSascha Wildner **/
1080*1370a723SSascha Wildner typedef
1081*1370a723SSascha Wildner EFI_STATUS
1082*1370a723SSascha Wildner (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT)(
1083*1370a723SSascha Wildner   OUT UINT32                  *HighCount
1084*1370a723SSascha Wildner   );
1085*1370a723SSascha Wildner 
1086*1370a723SSascha Wildner /**
1087*1370a723SSascha Wildner   Computes and returns a 32-bit CRC for a data buffer.
1088*1370a723SSascha Wildner 
1089*1370a723SSascha Wildner   @param[in]   Data             A pointer to the buffer on which the 32-bit CRC is to be computed.
1090*1370a723SSascha Wildner   @param[in]   DataSize         The number of bytes in the buffer Data.
1091*1370a723SSascha Wildner   @param[out]  Crc32            The 32-bit CRC that was computed for the data buffer specified by Data
1092*1370a723SSascha Wildner                                 and DataSize.
1093*1370a723SSascha Wildner 
1094*1370a723SSascha Wildner   @retval EFI_SUCCESS           The 32-bit CRC was computed for the data buffer and returned in
1095*1370a723SSascha Wildner                                 Crc32.
1096*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Data is NULL.
1097*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Crc32 is NULL.
1098*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER DataSize is 0.
1099*1370a723SSascha Wildner 
1100*1370a723SSascha Wildner **/
1101*1370a723SSascha Wildner typedef
1102*1370a723SSascha Wildner EFI_STATUS
1103*1370a723SSascha Wildner (EFIAPI *EFI_CALCULATE_CRC32)(
1104*1370a723SSascha Wildner   IN  VOID                              *Data,
1105*1370a723SSascha Wildner   IN  UINTN                             DataSize,
1106*1370a723SSascha Wildner   OUT UINT32                            *Crc32
1107*1370a723SSascha Wildner   );
1108*1370a723SSascha Wildner 
1109*1370a723SSascha Wildner /**
1110*1370a723SSascha Wildner   Copies the contents of one buffer to another buffer.
1111*1370a723SSascha Wildner 
1112*1370a723SSascha Wildner   @param[in]  Destination       The pointer to the destination buffer of the memory copy.
1113*1370a723SSascha Wildner   @param[in]  Source            The pointer to the source buffer of the memory copy.
1114*1370a723SSascha Wildner   @param[in]  Length            Number of bytes to copy from Source to Destination.
1115*1370a723SSascha Wildner 
1116*1370a723SSascha Wildner **/
1117*1370a723SSascha Wildner typedef
1118*1370a723SSascha Wildner VOID
1119*1370a723SSascha Wildner (EFIAPI *EFI_COPY_MEM)(
1120*1370a723SSascha Wildner   IN VOID     *Destination,
1121*1370a723SSascha Wildner   IN VOID     *Source,
1122*1370a723SSascha Wildner   IN UINTN    Length
1123*1370a723SSascha Wildner   );
1124*1370a723SSascha Wildner 
1125*1370a723SSascha Wildner /**
1126*1370a723SSascha Wildner   The SetMem() function fills a buffer with a specified value.
1127*1370a723SSascha Wildner 
1128*1370a723SSascha Wildner   @param[in]  Buffer            The pointer to the buffer to fill.
1129*1370a723SSascha Wildner   @param[in]  Size              Number of bytes in Buffer to fill.
1130*1370a723SSascha Wildner   @param[in]  Value             Value to fill Buffer with.
1131*1370a723SSascha Wildner 
1132*1370a723SSascha Wildner **/
1133*1370a723SSascha Wildner typedef
1134*1370a723SSascha Wildner VOID
1135*1370a723SSascha Wildner (EFIAPI *EFI_SET_MEM)(
1136*1370a723SSascha Wildner   IN VOID     *Buffer,
1137*1370a723SSascha Wildner   IN UINTN    Size,
1138*1370a723SSascha Wildner   IN UINT8    Value
1139*1370a723SSascha Wildner   );
1140*1370a723SSascha Wildner 
1141*1370a723SSascha Wildner ///
1142*1370a723SSascha Wildner /// Enumeration of EFI Interface Types
1143*1370a723SSascha Wildner ///
1144*1370a723SSascha Wildner typedef enum {
1145*1370a723SSascha Wildner   ///
1146*1370a723SSascha Wildner   /// Indicates that the supplied protocol interface is supplied in native form.
1147*1370a723SSascha Wildner   ///
1148*1370a723SSascha Wildner   EFI_NATIVE_INTERFACE
1149*1370a723SSascha Wildner } EFI_INTERFACE_TYPE;
1150*1370a723SSascha Wildner 
1151*1370a723SSascha Wildner /**
1152*1370a723SSascha Wildner   Installs a protocol interface on a device handle. If the handle does not exist, it is created and added
1153*1370a723SSascha Wildner   to the list of handles in the system. InstallMultipleProtocolInterfaces() performs
1154*1370a723SSascha Wildner   more error checking than InstallProtocolInterface(), so it is recommended that
1155*1370a723SSascha Wildner   InstallMultipleProtocolInterfaces() be used in place of
1156*1370a723SSascha Wildner   InstallProtocolInterface()
1157*1370a723SSascha Wildner 
1158*1370a723SSascha Wildner   @param[in, out]  Handle         A pointer to the EFI_HANDLE on which the interface is to be installed.
1159*1370a723SSascha Wildner   @param[in]       Protocol       The numeric ID of the protocol interface.
1160*1370a723SSascha Wildner   @param[in]       InterfaceType  Indicates whether Interface is supplied in native form.
1161*1370a723SSascha Wildner   @param[in]       Interface      A pointer to the protocol interface.
1162*1370a723SSascha Wildner 
1163*1370a723SSascha Wildner   @retval EFI_SUCCESS           The protocol interface was installed.
1164*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  Space for a new handle could not be allocated.
1165*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Handle is NULL.
1166*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is NULL.
1167*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER InterfaceType is not EFI_NATIVE_INTERFACE.
1168*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is already installed on the handle specified by Handle.
1169*1370a723SSascha Wildner 
1170*1370a723SSascha Wildner **/
1171*1370a723SSascha Wildner typedef
1172*1370a723SSascha Wildner EFI_STATUS
1173*1370a723SSascha Wildner (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE)(
1174*1370a723SSascha Wildner   IN OUT EFI_HANDLE               *Handle,
1175*1370a723SSascha Wildner   IN     EFI_GUID                 *Protocol,
1176*1370a723SSascha Wildner   IN     EFI_INTERFACE_TYPE       InterfaceType,
1177*1370a723SSascha Wildner   IN     VOID                     *Interface
1178*1370a723SSascha Wildner   );
1179*1370a723SSascha Wildner 
1180*1370a723SSascha Wildner /**
1181*1370a723SSascha Wildner   Installs one or more protocol interfaces into the boot services environment.
1182*1370a723SSascha Wildner 
1183*1370a723SSascha Wildner   @param[in, out]  Handle       The pointer to a handle to install the new protocol interfaces on,
1184*1370a723SSascha Wildner                                 or a pointer to NULL if a new handle is to be allocated.
1185*1370a723SSascha Wildner   @param  ...                   A variable argument list containing pairs of protocol GUIDs and protocol
1186*1370a723SSascha Wildner                                 interfaces.
1187*1370a723SSascha Wildner 
1188*1370a723SSascha Wildner   @retval EFI_SUCCESS           All the protocol interface was installed.
1189*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.
1190*1370a723SSascha Wildner   @retval EFI_ALREADY_STARTED   A Device Path Protocol instance was passed in that is already present in
1191*1370a723SSascha Wildner                                 the handle database.
1192*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Handle is NULL.
1193*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is already installed on the handle specified by Handle.
1194*1370a723SSascha Wildner 
1195*1370a723SSascha Wildner **/
1196*1370a723SSascha Wildner typedef
1197*1370a723SSascha Wildner EFI_STATUS
1198*1370a723SSascha Wildner (EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES)(
1199*1370a723SSascha Wildner   IN OUT EFI_HANDLE           *Handle,
1200*1370a723SSascha Wildner   ...
1201*1370a723SSascha Wildner   );
1202*1370a723SSascha Wildner 
1203*1370a723SSascha Wildner /**
1204*1370a723SSascha Wildner   Reinstalls a protocol interface on a device handle.
1205*1370a723SSascha Wildner 
1206*1370a723SSascha Wildner   @param[in]  Handle            Handle on which the interface is to be reinstalled.
1207*1370a723SSascha Wildner   @param[in]  Protocol          The numeric ID of the interface.
1208*1370a723SSascha Wildner   @param[in]  OldInterface      A pointer to the old interface. NULL can be used if a structure is not
1209*1370a723SSascha Wildner                                 associated with Protocol.
1210*1370a723SSascha Wildner   @param[in]  NewInterface      A pointer to the new interface.
1211*1370a723SSascha Wildner 
1212*1370a723SSascha Wildner   @retval EFI_SUCCESS           The protocol interface was reinstalled.
1213*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         The OldInterface on the handle was not found.
1214*1370a723SSascha Wildner   @retval EFI_ACCESS_DENIED     The protocol interface could not be reinstalled,
1215*1370a723SSascha Wildner                                 because OldInterface is still being used by a
1216*1370a723SSascha Wildner                                 driver that will not release it.
1217*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Handle is NULL.
1218*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is NULL.
1219*1370a723SSascha Wildner 
1220*1370a723SSascha Wildner **/
1221*1370a723SSascha Wildner typedef
1222*1370a723SSascha Wildner EFI_STATUS
1223*1370a723SSascha Wildner (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE)(
1224*1370a723SSascha Wildner   IN EFI_HANDLE               Handle,
1225*1370a723SSascha Wildner   IN EFI_GUID                 *Protocol,
1226*1370a723SSascha Wildner   IN VOID                     *OldInterface,
1227*1370a723SSascha Wildner   IN VOID                     *NewInterface
1228*1370a723SSascha Wildner   );
1229*1370a723SSascha Wildner 
1230*1370a723SSascha Wildner /**
1231*1370a723SSascha Wildner   Removes a protocol interface from a device handle. It is recommended that
1232*1370a723SSascha Wildner   UninstallMultipleProtocolInterfaces() be used in place of
1233*1370a723SSascha Wildner   UninstallProtocolInterface().
1234*1370a723SSascha Wildner 
1235*1370a723SSascha Wildner   @param[in]  Handle            The handle on which the interface was installed.
1236*1370a723SSascha Wildner   @param[in]  Protocol          The numeric ID of the interface.
1237*1370a723SSascha Wildner   @param[in]  Interface         A pointer to the interface.
1238*1370a723SSascha Wildner 
1239*1370a723SSascha Wildner   @retval EFI_SUCCESS           The interface was removed.
1240*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         The interface was not found.
1241*1370a723SSascha Wildner   @retval EFI_ACCESS_DENIED     The interface was not removed because the interface
1242*1370a723SSascha Wildner                                 is still being used by a driver.
1243*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Handle is NULL.
1244*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is NULL.
1245*1370a723SSascha Wildner 
1246*1370a723SSascha Wildner **/
1247*1370a723SSascha Wildner typedef
1248*1370a723SSascha Wildner EFI_STATUS
1249*1370a723SSascha Wildner (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE)(
1250*1370a723SSascha Wildner   IN EFI_HANDLE               Handle,
1251*1370a723SSascha Wildner   IN EFI_GUID                 *Protocol,
1252*1370a723SSascha Wildner   IN VOID                     *Interface
1253*1370a723SSascha Wildner   );
1254*1370a723SSascha Wildner 
1255*1370a723SSascha Wildner /**
1256*1370a723SSascha Wildner   Removes one or more protocol interfaces into the boot services environment.
1257*1370a723SSascha Wildner 
1258*1370a723SSascha Wildner   @param[in]  Handle            The handle to remove the protocol interfaces from.
1259*1370a723SSascha Wildner   @param  ...                   A variable argument list containing pairs of protocol GUIDs and
1260*1370a723SSascha Wildner                                 protocol interfaces.
1261*1370a723SSascha Wildner 
1262*1370a723SSascha Wildner   @retval EFI_SUCCESS           All the protocol interfaces were removed.
1263*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER One of the protocol interfaces was not previously installed on Handle.
1264*1370a723SSascha Wildner 
1265*1370a723SSascha Wildner **/
1266*1370a723SSascha Wildner typedef
1267*1370a723SSascha Wildner EFI_STATUS
1268*1370a723SSascha Wildner (EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES)(
1269*1370a723SSascha Wildner   IN EFI_HANDLE           Handle,
1270*1370a723SSascha Wildner   ...
1271*1370a723SSascha Wildner   );
1272*1370a723SSascha Wildner 
1273*1370a723SSascha Wildner /**
1274*1370a723SSascha Wildner   Queries a handle to determine if it supports a specified protocol.
1275*1370a723SSascha Wildner 
1276*1370a723SSascha Wildner   @param[in]   Handle           The handle being queried.
1277*1370a723SSascha Wildner   @param[in]   Protocol         The published unique identifier of the protocol.
1278*1370a723SSascha Wildner   @param[out]  Interface        Supplies the address where a pointer to the corresponding Protocol
1279*1370a723SSascha Wildner                                 Interface is returned.
1280*1370a723SSascha Wildner 
1281*1370a723SSascha Wildner   @retval EFI_SUCCESS           The interface information for the specified protocol was returned.
1282*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       The device does not support the specified protocol.
1283*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Handle is NULL.
1284*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is NULL.
1285*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Interface is NULL.
1286*1370a723SSascha Wildner 
1287*1370a723SSascha Wildner **/
1288*1370a723SSascha Wildner typedef
1289*1370a723SSascha Wildner EFI_STATUS
1290*1370a723SSascha Wildner (EFIAPI *EFI_HANDLE_PROTOCOL)(
1291*1370a723SSascha Wildner   IN  EFI_HANDLE               Handle,
1292*1370a723SSascha Wildner   IN  EFI_GUID                 *Protocol,
1293*1370a723SSascha Wildner   OUT VOID                     **Interface
1294*1370a723SSascha Wildner   );
1295*1370a723SSascha Wildner 
1296*1370a723SSascha Wildner #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL   0x00000001
1297*1370a723SSascha Wildner #define EFI_OPEN_PROTOCOL_GET_PROTOCOL         0x00000002
1298*1370a723SSascha Wildner #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL        0x00000004
1299*1370a723SSascha Wildner #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER  0x00000008
1300*1370a723SSascha Wildner #define EFI_OPEN_PROTOCOL_BY_DRIVER            0x00000010
1301*1370a723SSascha Wildner #define EFI_OPEN_PROTOCOL_EXCLUSIVE            0x00000020
1302*1370a723SSascha Wildner 
1303*1370a723SSascha Wildner /**
1304*1370a723SSascha Wildner   Queries a handle to determine if it supports a specified protocol. If the protocol is supported by the
1305*1370a723SSascha Wildner   handle, it opens the protocol on behalf of the calling agent.
1306*1370a723SSascha Wildner 
1307*1370a723SSascha Wildner   @param[in]   Handle           The handle for the protocol interface that is being opened.
1308*1370a723SSascha Wildner   @param[in]   Protocol         The published unique identifier of the protocol.
1309*1370a723SSascha Wildner   @param[out]  Interface        Supplies the address where a pointer to the corresponding Protocol
1310*1370a723SSascha Wildner                                 Interface is returned.
1311*1370a723SSascha Wildner   @param[in]   AgentHandle      The handle of the agent that is opening the protocol interface
1312*1370a723SSascha Wildner                                 specified by Protocol and Interface.
1313*1370a723SSascha Wildner   @param[in]   ControllerHandle If the agent that is opening a protocol is a driver that follows the
1314*1370a723SSascha Wildner                                 UEFI Driver Model, then this parameter is the controller handle
1315*1370a723SSascha Wildner                                 that requires the protocol interface. If the agent does not follow
1316*1370a723SSascha Wildner                                 the UEFI Driver Model, then this parameter is optional and may
1317*1370a723SSascha Wildner                                 be NULL.
1318*1370a723SSascha Wildner   @param[in]   Attributes       The open mode of the protocol interface specified by Handle
1319*1370a723SSascha Wildner                                 and Protocol.
1320*1370a723SSascha Wildner 
1321*1370a723SSascha Wildner   @retval EFI_SUCCESS           An item was added to the open list for the protocol interface, and the
1322*1370a723SSascha Wildner                                 protocol interface was returned in Interface.
1323*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       Handle does not support Protocol.
1324*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
1325*1370a723SSascha Wildner   @retval EFI_ACCESS_DENIED     Required attributes can't be supported in current environment.
1326*1370a723SSascha Wildner   @retval EFI_ALREADY_STARTED   Item on the open list already has requierd attributes whose agent
1327*1370a723SSascha Wildner                                 handle is the same as AgentHandle.
1328*1370a723SSascha Wildner 
1329*1370a723SSascha Wildner **/
1330*1370a723SSascha Wildner typedef
1331*1370a723SSascha Wildner EFI_STATUS
1332*1370a723SSascha Wildner (EFIAPI *EFI_OPEN_PROTOCOL)(
1333*1370a723SSascha Wildner   IN  EFI_HANDLE                Handle,
1334*1370a723SSascha Wildner   IN  EFI_GUID                  *Protocol,
1335*1370a723SSascha Wildner   OUT VOID                      **Interface  OPTIONAL,
1336*1370a723SSascha Wildner   IN  EFI_HANDLE                AgentHandle,
1337*1370a723SSascha Wildner   IN  EFI_HANDLE                ControllerHandle,
1338*1370a723SSascha Wildner   IN  UINT32                    Attributes
1339*1370a723SSascha Wildner   );
1340*1370a723SSascha Wildner 
1341*1370a723SSascha Wildner /**
1342*1370a723SSascha Wildner   Closes a protocol on a handle that was opened using OpenProtocol().
1343*1370a723SSascha Wildner 
1344*1370a723SSascha Wildner   @param[in]  Handle            The handle for the protocol interface that was previously opened
1345*1370a723SSascha Wildner                                 with OpenProtocol(), and is now being closed.
1346*1370a723SSascha Wildner   @param[in]  Protocol          The published unique identifier of the protocol.
1347*1370a723SSascha Wildner   @param[in]  AgentHandle       The handle of the agent that is closing the protocol interface.
1348*1370a723SSascha Wildner   @param[in]  ControllerHandle  If the agent that opened a protocol is a driver that follows the
1349*1370a723SSascha Wildner                                 UEFI Driver Model, then this parameter is the controller handle
1350*1370a723SSascha Wildner                                 that required the protocol interface.
1351*1370a723SSascha Wildner 
1352*1370a723SSascha Wildner   @retval EFI_SUCCESS           The protocol instance was closed.
1353*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER 1) Handle is NULL.
1354*1370a723SSascha Wildner                                 2) AgentHandle is NULL.
1355*1370a723SSascha Wildner                                 3) ControllerHandle is not NULL and ControllerHandle is not a valid EFI_HANDLE.
1356*1370a723SSascha Wildner                                 4) Protocol is NULL.
1357*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         1) Handle does not support the protocol specified by Protocol.
1358*1370a723SSascha Wildner                                 2) The protocol interface specified by Handle and Protocol is not
1359*1370a723SSascha Wildner                                    currently open by AgentHandle and ControllerHandle.
1360*1370a723SSascha Wildner 
1361*1370a723SSascha Wildner **/
1362*1370a723SSascha Wildner typedef
1363*1370a723SSascha Wildner EFI_STATUS
1364*1370a723SSascha Wildner (EFIAPI *EFI_CLOSE_PROTOCOL)(
1365*1370a723SSascha Wildner   IN EFI_HANDLE               Handle,
1366*1370a723SSascha Wildner   IN EFI_GUID                 *Protocol,
1367*1370a723SSascha Wildner   IN EFI_HANDLE               AgentHandle,
1368*1370a723SSascha Wildner   IN EFI_HANDLE               ControllerHandle
1369*1370a723SSascha Wildner   );
1370*1370a723SSascha Wildner 
1371*1370a723SSascha Wildner ///
1372*1370a723SSascha Wildner /// EFI Oprn Protocol Information Entry
1373*1370a723SSascha Wildner ///
1374*1370a723SSascha Wildner typedef struct {
1375*1370a723SSascha Wildner   EFI_HANDLE    AgentHandle;
1376*1370a723SSascha Wildner   EFI_HANDLE    ControllerHandle;
1377*1370a723SSascha Wildner   UINT32        Attributes;
1378*1370a723SSascha Wildner   UINT32        OpenCount;
1379*1370a723SSascha Wildner } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
1380*1370a723SSascha Wildner 
1381*1370a723SSascha Wildner /**
1382*1370a723SSascha Wildner   Retrieves the list of agents that currently have a protocol interface opened.
1383*1370a723SSascha Wildner 
1384*1370a723SSascha Wildner   @param[in]   Handle           The handle for the protocol interface that is being queried.
1385*1370a723SSascha Wildner   @param[in]   Protocol         The published unique identifier of the protocol.
1386*1370a723SSascha Wildner   @param[out]  EntryBuffer      A pointer to a buffer of open protocol information in the form of
1387*1370a723SSascha Wildner                                 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY structures.
1388*1370a723SSascha Wildner   @param[out]  EntryCount       A pointer to the number of entries in EntryBuffer.
1389*1370a723SSascha Wildner 
1390*1370a723SSascha Wildner   @retval EFI_SUCCESS           The open protocol information was returned in EntryBuffer, and the
1391*1370a723SSascha Wildner                                 number of entries was returned EntryCount.
1392*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to allocate EntryBuffer.
1393*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         Handle does not support the protocol specified by Protocol.
1394*1370a723SSascha Wildner 
1395*1370a723SSascha Wildner **/
1396*1370a723SSascha Wildner typedef
1397*1370a723SSascha Wildner EFI_STATUS
1398*1370a723SSascha Wildner (EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION)(
1399*1370a723SSascha Wildner   IN  EFI_HANDLE                          Handle,
1400*1370a723SSascha Wildner   IN  EFI_GUID                            *Protocol,
1401*1370a723SSascha Wildner   OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
1402*1370a723SSascha Wildner   OUT UINTN                               *EntryCount
1403*1370a723SSascha Wildner   );
1404*1370a723SSascha Wildner 
1405*1370a723SSascha Wildner /**
1406*1370a723SSascha Wildner   Retrieves the list of protocol interface GUIDs that are installed on a handle in a buffer allocated
1407*1370a723SSascha Wildner   from pool.
1408*1370a723SSascha Wildner 
1409*1370a723SSascha Wildner   @param[in]   Handle              The handle from which to retrieve the list of protocol interface
1410*1370a723SSascha Wildner                                    GUIDs.
1411*1370a723SSascha Wildner   @param[out]  ProtocolBuffer      A pointer to the list of protocol interface GUID pointers that are
1412*1370a723SSascha Wildner                                    installed on Handle.
1413*1370a723SSascha Wildner   @param[out]  ProtocolBufferCount A pointer to the number of GUID pointers present in
1414*1370a723SSascha Wildner                                    ProtocolBuffer.
1415*1370a723SSascha Wildner 
1416*1370a723SSascha Wildner   @retval EFI_SUCCESS           The list of protocol interface GUIDs installed on Handle was returned in
1417*1370a723SSascha Wildner                                 ProtocolBuffer. The number of protocol interface GUIDs was
1418*1370a723SSascha Wildner                                 returned in ProtocolBufferCount.
1419*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  There is not enough pool memory to store the results.
1420*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Handle is NULL.
1421*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Handle is not a valid EFI_HANDLE.
1422*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER ProtocolBuffer is NULL.
1423*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER ProtocolBufferCount is NULL.
1424*1370a723SSascha Wildner 
1425*1370a723SSascha Wildner **/
1426*1370a723SSascha Wildner typedef
1427*1370a723SSascha Wildner EFI_STATUS
1428*1370a723SSascha Wildner (EFIAPI *EFI_PROTOCOLS_PER_HANDLE)(
1429*1370a723SSascha Wildner   IN  EFI_HANDLE      Handle,
1430*1370a723SSascha Wildner   OUT EFI_GUID        ***ProtocolBuffer,
1431*1370a723SSascha Wildner   OUT UINTN           *ProtocolBufferCount
1432*1370a723SSascha Wildner   );
1433*1370a723SSascha Wildner 
1434*1370a723SSascha Wildner /**
1435*1370a723SSascha Wildner   Creates an event that is to be signaled whenever an interface is installed for a specified protocol.
1436*1370a723SSascha Wildner 
1437*1370a723SSascha Wildner   @param[in]   Protocol         The numeric ID of the protocol for which the event is to be registered.
1438*1370a723SSascha Wildner   @param[in]   Event            Event that is to be signaled whenever a protocol interface is registered
1439*1370a723SSascha Wildner                                 for Protocol.
1440*1370a723SSascha Wildner   @param[out]  Registration     A pointer to a memory location to receive the registration value.
1441*1370a723SSascha Wildner 
1442*1370a723SSascha Wildner   @retval EFI_SUCCESS           The notification event has been registered.
1443*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  Space for the notification event could not be allocated.
1444*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is NULL.
1445*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Event is NULL.
1446*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Registration is NULL.
1447*1370a723SSascha Wildner 
1448*1370a723SSascha Wildner **/
1449*1370a723SSascha Wildner typedef
1450*1370a723SSascha Wildner EFI_STATUS
1451*1370a723SSascha Wildner (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY)(
1452*1370a723SSascha Wildner   IN  EFI_GUID                 *Protocol,
1453*1370a723SSascha Wildner   IN  EFI_EVENT                Event,
1454*1370a723SSascha Wildner   OUT VOID                     **Registration
1455*1370a723SSascha Wildner   );
1456*1370a723SSascha Wildner 
1457*1370a723SSascha Wildner ///
1458*1370a723SSascha Wildner /// Enumeration of EFI Locate Search Types
1459*1370a723SSascha Wildner ///
1460*1370a723SSascha Wildner typedef enum {
1461*1370a723SSascha Wildner   ///
1462*1370a723SSascha Wildner   /// Retrieve all the handles in the handle database.
1463*1370a723SSascha Wildner   ///
1464*1370a723SSascha Wildner   AllHandles,
1465*1370a723SSascha Wildner   ///
1466*1370a723SSascha Wildner   /// Retrieve the next handle fron a RegisterProtocolNotify() event.
1467*1370a723SSascha Wildner   ///
1468*1370a723SSascha Wildner   ByRegisterNotify,
1469*1370a723SSascha Wildner   ///
1470*1370a723SSascha Wildner   /// Retrieve the set of handles from the handle database that support a
1471*1370a723SSascha Wildner   /// specified protocol.
1472*1370a723SSascha Wildner   ///
1473*1370a723SSascha Wildner   ByProtocol
1474*1370a723SSascha Wildner } EFI_LOCATE_SEARCH_TYPE;
1475*1370a723SSascha Wildner 
1476*1370a723SSascha Wildner /**
1477*1370a723SSascha Wildner   Returns an array of handles that support a specified protocol.
1478*1370a723SSascha Wildner 
1479*1370a723SSascha Wildner   @param[in]       SearchType   Specifies which handle(s) are to be returned.
1480*1370a723SSascha Wildner   @param[in]       Protocol     Specifies the protocol to search by.
1481*1370a723SSascha Wildner   @param[in]       SearchKey    Specifies the search key.
1482*1370a723SSascha Wildner   @param[in, out]  BufferSize   On input, the size in bytes of Buffer. On output, the size in bytes of
1483*1370a723SSascha Wildner                                 the array returned in Buffer (if the buffer was large enough) or the
1484*1370a723SSascha Wildner                                 size, in bytes, of the buffer needed to obtain the array (if the buffer was
1485*1370a723SSascha Wildner                                 not large enough).
1486*1370a723SSascha Wildner   @param[out]      Buffer       The buffer in which the array is returned.
1487*1370a723SSascha Wildner 
1488*1370a723SSascha Wildner   @retval EFI_SUCCESS           The array of handles was returned.
1489*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         No handles match the search.
1490*1370a723SSascha Wildner   @retval EFI_BUFFER_TOO_SMALL  The BufferSize is too small for the result.
1491*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER SearchType is not a member of EFI_LOCATE_SEARCH_TYPE.
1492*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER SearchType is ByRegisterNotify and SearchKey is NULL.
1493*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER SearchType is ByProtocol and Protocol is NULL.
1494*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER One or more matches are found and BufferSize is NULL.
1495*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER BufferSize is large enough for the result and Buffer is NULL.
1496*1370a723SSascha Wildner 
1497*1370a723SSascha Wildner **/
1498*1370a723SSascha Wildner typedef
1499*1370a723SSascha Wildner EFI_STATUS
1500*1370a723SSascha Wildner (EFIAPI *EFI_LOCATE_HANDLE)(
1501*1370a723SSascha Wildner   IN     EFI_LOCATE_SEARCH_TYPE   SearchType,
1502*1370a723SSascha Wildner   IN     EFI_GUID                 *Protocol     OPTIONAL,
1503*1370a723SSascha Wildner   IN     VOID                     *SearchKey    OPTIONAL,
1504*1370a723SSascha Wildner   IN OUT UINTN                    *BufferSize,
1505*1370a723SSascha Wildner   OUT    EFI_HANDLE               *Buffer
1506*1370a723SSascha Wildner   );
1507*1370a723SSascha Wildner 
1508*1370a723SSascha Wildner /**
1509*1370a723SSascha Wildner   Locates the handle to a device on the device path that supports the specified protocol.
1510*1370a723SSascha Wildner 
1511*1370a723SSascha Wildner   @param[in]       Protocol     Specifies the protocol to search for.
1512*1370a723SSascha Wildner   @param[in, out]  DevicePath   On input, a pointer to a pointer to the device path. On output, the device
1513*1370a723SSascha Wildner                                 path pointer is modified to point to the remaining part of the device
1514*1370a723SSascha Wildner                                 path.
1515*1370a723SSascha Wildner   @param[out]      Device       A pointer to the returned device handle.
1516*1370a723SSascha Wildner 
1517*1370a723SSascha Wildner   @retval EFI_SUCCESS           The resulting handle was returned.
1518*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         No handles match the search.
1519*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Protocol is NULL.
1520*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER DevicePath is NULL.
1521*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER A handle matched the search and Device is NULL.
1522*1370a723SSascha Wildner 
1523*1370a723SSascha Wildner **/
1524*1370a723SSascha Wildner typedef
1525*1370a723SSascha Wildner EFI_STATUS
1526*1370a723SSascha Wildner (EFIAPI *EFI_LOCATE_DEVICE_PATH)(
1527*1370a723SSascha Wildner   IN     EFI_GUID                         *Protocol,
1528*1370a723SSascha Wildner   IN OUT EFI_DEVICE_PATH_PROTOCOL         **DevicePath,
1529*1370a723SSascha Wildner   OUT    EFI_HANDLE                       *Device
1530*1370a723SSascha Wildner   );
1531*1370a723SSascha Wildner 
1532*1370a723SSascha Wildner /**
1533*1370a723SSascha Wildner   Adds, updates, or removes a configuration table entry from the EFI System Table.
1534*1370a723SSascha Wildner 
1535*1370a723SSascha Wildner   @param[in]  Guid              A pointer to the GUID for the entry to add, update, or remove.
1536*1370a723SSascha Wildner   @param[in]  Table             A pointer to the configuration table for the entry to add, update, or
1537*1370a723SSascha Wildner                                 remove. May be NULL.
1538*1370a723SSascha Wildner 
1539*1370a723SSascha Wildner   @retval EFI_SUCCESS           The (Guid, Table) pair was added, updated, or removed.
1540*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         An attempt was made to delete a nonexistent entry.
1541*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Guid is NULL.
1542*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  There is not enough memory available to complete the operation.
1543*1370a723SSascha Wildner 
1544*1370a723SSascha Wildner **/
1545*1370a723SSascha Wildner typedef
1546*1370a723SSascha Wildner EFI_STATUS
1547*1370a723SSascha Wildner (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE)(
1548*1370a723SSascha Wildner   IN EFI_GUID                 *Guid,
1549*1370a723SSascha Wildner   IN VOID                     *Table
1550*1370a723SSascha Wildner   );
1551*1370a723SSascha Wildner 
1552*1370a723SSascha Wildner /**
1553*1370a723SSascha Wildner   Returns an array of handles that support the requested protocol in a buffer allocated from pool.
1554*1370a723SSascha Wildner 
1555*1370a723SSascha Wildner   @param[in]       SearchType   Specifies which handle(s) are to be returned.
1556*1370a723SSascha Wildner   @param[in]       Protocol     Provides the protocol to search by.
1557*1370a723SSascha Wildner                                 This parameter is only valid for a SearchType of ByProtocol.
1558*1370a723SSascha Wildner   @param[in]       SearchKey    Supplies the search key depending on the SearchType.
1559*1370a723SSascha Wildner   @param[out]      NoHandles    The number of handles returned in Buffer.
1560*1370a723SSascha Wildner   @param[out]      Buffer       A pointer to the buffer to return the requested array of handles that
1561*1370a723SSascha Wildner                                 support Protocol.
1562*1370a723SSascha Wildner 
1563*1370a723SSascha Wildner   @retval EFI_SUCCESS           The array of handles was returned in Buffer, and the number of
1564*1370a723SSascha Wildner                                 handles in Buffer was returned in NoHandles.
1565*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         No handles match the search.
1566*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  There is not enough pool memory to store the matching results.
1567*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER NoHandles is NULL.
1568*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Buffer is NULL.
1569*1370a723SSascha Wildner 
1570*1370a723SSascha Wildner **/
1571*1370a723SSascha Wildner typedef
1572*1370a723SSascha Wildner EFI_STATUS
1573*1370a723SSascha Wildner (EFIAPI *EFI_LOCATE_HANDLE_BUFFER)(
1574*1370a723SSascha Wildner   IN     EFI_LOCATE_SEARCH_TYPE       SearchType,
1575*1370a723SSascha Wildner   IN     EFI_GUID                     *Protocol       OPTIONAL,
1576*1370a723SSascha Wildner   IN     VOID                         *SearchKey      OPTIONAL,
1577*1370a723SSascha Wildner   OUT    UINTN                        *NoHandles,
1578*1370a723SSascha Wildner   OUT    EFI_HANDLE                   **Buffer
1579*1370a723SSascha Wildner   );
1580*1370a723SSascha Wildner 
1581*1370a723SSascha Wildner /**
1582*1370a723SSascha Wildner   Returns the first protocol instance that matches the given protocol.
1583*1370a723SSascha Wildner 
1584*1370a723SSascha Wildner   @param[in]  Protocol          Provides the protocol to search for.
1585*1370a723SSascha Wildner   @param[in]  Registration      Optional registration key returned from
1586*1370a723SSascha Wildner                                 RegisterProtocolNotify().
1587*1370a723SSascha Wildner   @param[out]  Interface        On return, a pointer to the first interface that matches Protocol and
1588*1370a723SSascha Wildner                                 Registration.
1589*1370a723SSascha Wildner 
1590*1370a723SSascha Wildner   @retval EFI_SUCCESS           A protocol instance matching Protocol was found and returned in
1591*1370a723SSascha Wildner                                 Interface.
1592*1370a723SSascha Wildner   @retval EFI_NOT_FOUND         No protocol instances were found that match Protocol and
1593*1370a723SSascha Wildner                                 Registration.
1594*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER Interface is NULL.
1595*1370a723SSascha Wildner                                 Protocol is NULL.
1596*1370a723SSascha Wildner 
1597*1370a723SSascha Wildner **/
1598*1370a723SSascha Wildner typedef
1599*1370a723SSascha Wildner EFI_STATUS
1600*1370a723SSascha Wildner (EFIAPI *EFI_LOCATE_PROTOCOL)(
1601*1370a723SSascha Wildner   IN  EFI_GUID  *Protocol,
1602*1370a723SSascha Wildner   IN  VOID      *Registration  OPTIONAL,
1603*1370a723SSascha Wildner   OUT VOID      **Interface
1604*1370a723SSascha Wildner   );
1605*1370a723SSascha Wildner 
1606*1370a723SSascha Wildner ///
1607*1370a723SSascha Wildner /// EFI Capsule Block Descriptor
1608*1370a723SSascha Wildner ///
1609*1370a723SSascha Wildner typedef struct {
1610*1370a723SSascha Wildner   ///
1611*1370a723SSascha Wildner   /// Length in bytes of the data pointed to by DataBlock/ContinuationPointer.
1612*1370a723SSascha Wildner   ///
1613*1370a723SSascha Wildner   UINT64    Length;
1614*1370a723SSascha Wildner   union {
1615*1370a723SSascha Wildner     ///
1616*1370a723SSascha Wildner     /// Physical address of the data block. This member of the union is
1617*1370a723SSascha Wildner     /// used if Length is not equal to zero.
1618*1370a723SSascha Wildner     ///
1619*1370a723SSascha Wildner     EFI_PHYSICAL_ADDRESS    DataBlock;
1620*1370a723SSascha Wildner     ///
1621*1370a723SSascha Wildner     /// Physical address of another block of
1622*1370a723SSascha Wildner     /// EFI_CAPSULE_BLOCK_DESCRIPTOR structures. This
1623*1370a723SSascha Wildner     /// member of the union is used if Length is equal to zero. If
1624*1370a723SSascha Wildner     /// ContinuationPointer is zero this entry represents the end of the list.
1625*1370a723SSascha Wildner     ///
1626*1370a723SSascha Wildner     EFI_PHYSICAL_ADDRESS    ContinuationPointer;
1627*1370a723SSascha Wildner   } Union;
1628*1370a723SSascha Wildner } EFI_CAPSULE_BLOCK_DESCRIPTOR;
1629*1370a723SSascha Wildner 
1630*1370a723SSascha Wildner ///
1631*1370a723SSascha Wildner /// EFI Capsule Header.
1632*1370a723SSascha Wildner ///
1633*1370a723SSascha Wildner typedef struct {
1634*1370a723SSascha Wildner   ///
1635*1370a723SSascha Wildner   /// A GUID that defines the contents of a capsule.
1636*1370a723SSascha Wildner   ///
1637*1370a723SSascha Wildner   EFI_GUID    CapsuleGuid;
1638*1370a723SSascha Wildner   ///
1639*1370a723SSascha Wildner   /// The size of the capsule header. This may be larger than the size of
1640*1370a723SSascha Wildner   /// the EFI_CAPSULE_HEADER since CapsuleGuid may imply
1641*1370a723SSascha Wildner   /// extended header entries
1642*1370a723SSascha Wildner   ///
1643*1370a723SSascha Wildner   UINT32      HeaderSize;
1644*1370a723SSascha Wildner   ///
1645*1370a723SSascha Wildner   /// Bit-mapped list describing the capsule attributes. The Flag values
1646*1370a723SSascha Wildner   /// of 0x0000 - 0xFFFF are defined by CapsuleGuid. Flag values
1647*1370a723SSascha Wildner   /// of 0x10000 - 0xFFFFFFFF are defined by this specification
1648*1370a723SSascha Wildner   ///
1649*1370a723SSascha Wildner   UINT32      Flags;
1650*1370a723SSascha Wildner   ///
1651*1370a723SSascha Wildner   /// Size in bytes of the capsule.
1652*1370a723SSascha Wildner   ///
1653*1370a723SSascha Wildner   UINT32      CapsuleImageSize;
1654*1370a723SSascha Wildner } EFI_CAPSULE_HEADER;
1655*1370a723SSascha Wildner 
1656*1370a723SSascha Wildner ///
1657*1370a723SSascha Wildner /// The EFI System Table entry must point to an array of capsules
1658*1370a723SSascha Wildner /// that contain the same CapsuleGuid value. The array must be
1659*1370a723SSascha Wildner /// prefixed by a UINT32 that represents the size of the array of capsules.
1660*1370a723SSascha Wildner ///
1661*1370a723SSascha Wildner typedef struct {
1662*1370a723SSascha Wildner   ///
1663*1370a723SSascha Wildner   /// the size of the array of capsules.
1664*1370a723SSascha Wildner   ///
1665*1370a723SSascha Wildner   UINT32    CapsuleArrayNumber;
1666*1370a723SSascha Wildner   ///
1667*1370a723SSascha Wildner   /// Point to an array of capsules that contain the same CapsuleGuid value.
1668*1370a723SSascha Wildner   ///
1669*1370a723SSascha Wildner   VOID      *CapsulePtr[1];
1670*1370a723SSascha Wildner } EFI_CAPSULE_TABLE;
1671*1370a723SSascha Wildner 
1672*1370a723SSascha Wildner #define CAPSULE_FLAGS_PERSIST_ACROSS_RESET   0x00010000
1673*1370a723SSascha Wildner #define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE  0x00020000
1674*1370a723SSascha Wildner #define CAPSULE_FLAGS_INITIATE_RESET         0x00040000
1675*1370a723SSascha Wildner 
1676*1370a723SSascha Wildner /**
1677*1370a723SSascha Wildner   Passes capsules to the firmware with both virtual and physical mapping. Depending on the intended
1678*1370a723SSascha Wildner   consumption, the firmware may process the capsule immediately. If the payload should persist
1679*1370a723SSascha Wildner   across a system reset, the reset value returned from EFI_QueryCapsuleCapabilities must
1680*1370a723SSascha Wildner   be passed into ResetSystem() and will cause the capsule to be processed by the firmware as
1681*1370a723SSascha Wildner   part of the reset process.
1682*1370a723SSascha Wildner 
1683*1370a723SSascha Wildner   @param[in]  CapsuleHeaderArray Virtual pointer to an array of virtual pointers to the capsules
1684*1370a723SSascha Wildner                                  being passed into update capsule.
1685*1370a723SSascha Wildner   @param[in]  CapsuleCount       Number of pointers to EFI_CAPSULE_HEADER in
1686*1370a723SSascha Wildner                                  CaspuleHeaderArray.
1687*1370a723SSascha Wildner   @param[in]  ScatterGatherList  Physical pointer to a set of
1688*1370a723SSascha Wildner                                  EFI_CAPSULE_BLOCK_DESCRIPTOR that describes the
1689*1370a723SSascha Wildner                                  location in physical memory of a set of capsules.
1690*1370a723SSascha Wildner 
1691*1370a723SSascha Wildner   @retval EFI_SUCCESS           Valid capsule was passed. If
1692*1370a723SSascha Wildner                                 CAPSULE_FLAGS_PERSIT_ACROSS_RESET is not set, the
1693*1370a723SSascha Wildner                                 capsule has been successfully processed by the firmware.
1694*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER CapsuleSize is NULL, or an incompatible set of flags were
1695*1370a723SSascha Wildner                                 set in the capsule header.
1696*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER CapsuleCount is 0.
1697*1370a723SSascha Wildner   @retval EFI_DEVICE_ERROR      The capsule update was started, but failed due to a device error.
1698*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       The capsule type is not supported on this platform.
1699*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  When ExitBootServices() has been previously called this error indicates the capsule
1700*1370a723SSascha Wildner                                 is compatible with this platform but is not capable of being submitted or processed
1701*1370a723SSascha Wildner                                 in runtime. The caller may resubmit the capsule prior to ExitBootServices().
1702*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  When ExitBootServices() has not been previously called then this error indicates
1703*1370a723SSascha Wildner                                 the capsule is compatible with this platform but there are insufficient resources to process.
1704*1370a723SSascha Wildner 
1705*1370a723SSascha Wildner **/
1706*1370a723SSascha Wildner typedef
1707*1370a723SSascha Wildner EFI_STATUS
1708*1370a723SSascha Wildner (EFIAPI *EFI_UPDATE_CAPSULE)(
1709*1370a723SSascha Wildner   IN EFI_CAPSULE_HEADER     **CapsuleHeaderArray,
1710*1370a723SSascha Wildner   IN UINTN                  CapsuleCount,
1711*1370a723SSascha Wildner   IN EFI_PHYSICAL_ADDRESS   ScatterGatherList   OPTIONAL
1712*1370a723SSascha Wildner   );
1713*1370a723SSascha Wildner 
1714*1370a723SSascha Wildner /**
1715*1370a723SSascha Wildner   Returns if the capsule can be supported via UpdateCapsule().
1716*1370a723SSascha Wildner 
1717*1370a723SSascha Wildner   @param[in]   CapsuleHeaderArray  Virtual pointer to an array of virtual pointers to the capsules
1718*1370a723SSascha Wildner                                    being passed into update capsule.
1719*1370a723SSascha Wildner   @param[in]   CapsuleCount        Number of pointers to EFI_CAPSULE_HEADER in
1720*1370a723SSascha Wildner                                    CaspuleHeaderArray.
1721*1370a723SSascha Wildner   @param[out]  MaxiumCapsuleSize   On output the maximum size that UpdateCapsule() can
1722*1370a723SSascha Wildner                                    support as an argument to UpdateCapsule() via
1723*1370a723SSascha Wildner                                    CapsuleHeaderArray and ScatterGatherList.
1724*1370a723SSascha Wildner   @param[out]  ResetType           Returns the type of reset required for the capsule update.
1725*1370a723SSascha Wildner 
1726*1370a723SSascha Wildner   @retval EFI_SUCCESS           Valid answer returned.
1727*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED       The capsule type is not supported on this platform, and
1728*1370a723SSascha Wildner                                 MaximumCapsuleSize and ResetType are undefined.
1729*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER MaximumCapsuleSize is NULL.
1730*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  When ExitBootServices() has been previously called this error indicates the capsule
1731*1370a723SSascha Wildner                                 is compatible with this platform but is not capable of being submitted or processed
1732*1370a723SSascha Wildner                                 in runtime. The caller may resubmit the capsule prior to ExitBootServices().
1733*1370a723SSascha Wildner   @retval EFI_OUT_OF_RESOURCES  When ExitBootServices() has not been previously called then this error indicates
1734*1370a723SSascha Wildner                                 the capsule is compatible with this platform but there are insufficient resources to process.
1735*1370a723SSascha Wildner 
1736*1370a723SSascha Wildner **/
1737*1370a723SSascha Wildner typedef
1738*1370a723SSascha Wildner EFI_STATUS
1739*1370a723SSascha Wildner (EFIAPI *EFI_QUERY_CAPSULE_CAPABILITIES)(
1740*1370a723SSascha Wildner   IN  EFI_CAPSULE_HEADER     **CapsuleHeaderArray,
1741*1370a723SSascha Wildner   IN  UINTN                  CapsuleCount,
1742*1370a723SSascha Wildner   OUT UINT64                 *MaximumCapsuleSize,
1743*1370a723SSascha Wildner   OUT EFI_RESET_TYPE         *ResetType
1744*1370a723SSascha Wildner   );
1745*1370a723SSascha Wildner 
1746*1370a723SSascha Wildner /**
1747*1370a723SSascha Wildner   Returns information about the EFI variables.
1748*1370a723SSascha Wildner 
1749*1370a723SSascha Wildner   @param[in]   Attributes                   Attributes bitmask to specify the type of variables on
1750*1370a723SSascha Wildner                                             which to return information.
1751*1370a723SSascha Wildner   @param[out]  MaximumVariableStorageSize   On output the maximum size of the storage space
1752*1370a723SSascha Wildner                                             available for the EFI variables associated with the
1753*1370a723SSascha Wildner                                             attributes specified.
1754*1370a723SSascha Wildner   @param[out]  RemainingVariableStorageSize Returns the remaining size of the storage space
1755*1370a723SSascha Wildner                                             available for the EFI variables associated with the
1756*1370a723SSascha Wildner                                             attributes specified.
1757*1370a723SSascha Wildner   @param[out]  MaximumVariableSize          Returns the maximum size of the individual EFI
1758*1370a723SSascha Wildner                                             variables associated with the attributes specified.
1759*1370a723SSascha Wildner 
1760*1370a723SSascha Wildner   @retval EFI_SUCCESS                  Valid answer returned.
1761*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER        An invalid combination of attribute bits was supplied
1762*1370a723SSascha Wildner   @retval EFI_UNSUPPORTED              The attribute is not supported on this platform, and the
1763*1370a723SSascha Wildner                                        MaximumVariableStorageSize,
1764*1370a723SSascha Wildner                                        RemainingVariableStorageSize, MaximumVariableSize
1765*1370a723SSascha Wildner                                        are undefined.
1766*1370a723SSascha Wildner 
1767*1370a723SSascha Wildner **/
1768*1370a723SSascha Wildner typedef
1769*1370a723SSascha Wildner EFI_STATUS
1770*1370a723SSascha Wildner (EFIAPI *EFI_QUERY_VARIABLE_INFO)(
1771*1370a723SSascha Wildner   IN  UINT32            Attributes,
1772*1370a723SSascha Wildner   OUT UINT64            *MaximumVariableStorageSize,
1773*1370a723SSascha Wildner   OUT UINT64            *RemainingVariableStorageSize,
1774*1370a723SSascha Wildner   OUT UINT64            *MaximumVariableSize
1775*1370a723SSascha Wildner   );
1776*1370a723SSascha Wildner 
1777*1370a723SSascha Wildner //
1778*1370a723SSascha Wildner // Firmware should stop at a firmware user interface on next boot
1779*1370a723SSascha Wildner //
1780*1370a723SSascha Wildner #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI                    0x0000000000000001
1781*1370a723SSascha Wildner #define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION             0x0000000000000002
1782*1370a723SSascha Wildner #define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED  0x0000000000000004
1783*1370a723SSascha Wildner #define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED            0x0000000000000008
1784*1370a723SSascha Wildner #define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED     0x0000000000000010
1785*1370a723SSascha Wildner #define EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY          0x0000000000000040
1786*1370a723SSascha Wildner #define EFI_OS_INDICATIONS_JSON_CONFIG_DATA_REFRESH         0x0000000000000080
1787*1370a723SSascha Wildner 
1788*1370a723SSascha Wildner //
1789*1370a723SSascha Wildner // EFI Runtime Services Table
1790*1370a723SSascha Wildner //
1791*1370a723SSascha Wildner #define EFI_SYSTEM_TABLE_SIGNATURE      SIGNATURE_64 ('I','B','I',' ','S','Y','S','T')
1792*1370a723SSascha Wildner #define EFI_2_80_SYSTEM_TABLE_REVISION  ((2 << 16) | (80))
1793*1370a723SSascha Wildner #define EFI_2_70_SYSTEM_TABLE_REVISION  ((2 << 16) | (70))
1794*1370a723SSascha Wildner #define EFI_2_60_SYSTEM_TABLE_REVISION  ((2 << 16) | (60))
1795*1370a723SSascha Wildner #define EFI_2_50_SYSTEM_TABLE_REVISION  ((2 << 16) | (50))
1796*1370a723SSascha Wildner #define EFI_2_40_SYSTEM_TABLE_REVISION  ((2 << 16) | (40))
1797*1370a723SSascha Wildner #define EFI_2_31_SYSTEM_TABLE_REVISION  ((2 << 16) | (31))
1798*1370a723SSascha Wildner #define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
1799*1370a723SSascha Wildner #define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
1800*1370a723SSascha Wildner #define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
1801*1370a723SSascha Wildner #define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
1802*1370a723SSascha Wildner #define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
1803*1370a723SSascha Wildner #define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
1804*1370a723SSascha Wildner #define EFI_SYSTEM_TABLE_REVISION       EFI_2_70_SYSTEM_TABLE_REVISION
1805*1370a723SSascha Wildner #define EFI_SPECIFICATION_VERSION       EFI_SYSTEM_TABLE_REVISION
1806*1370a723SSascha Wildner 
1807*1370a723SSascha Wildner #define EFI_RUNTIME_SERVICES_SIGNATURE  SIGNATURE_64 ('R','U','N','T','S','E','R','V')
1808*1370a723SSascha Wildner #define EFI_RUNTIME_SERVICES_REVISION   EFI_SPECIFICATION_VERSION
1809*1370a723SSascha Wildner 
1810*1370a723SSascha Wildner ///
1811*1370a723SSascha Wildner /// EFI Runtime Services Table.
1812*1370a723SSascha Wildner ///
1813*1370a723SSascha Wildner typedef struct {
1814*1370a723SSascha Wildner   ///
1815*1370a723SSascha Wildner   /// The table header for the EFI Runtime Services Table.
1816*1370a723SSascha Wildner   ///
1817*1370a723SSascha Wildner   EFI_TABLE_HEADER                  Hdr;
1818*1370a723SSascha Wildner 
1819*1370a723SSascha Wildner   //
1820*1370a723SSascha Wildner   // Time Services
1821*1370a723SSascha Wildner   //
1822*1370a723SSascha Wildner   EFI_GET_TIME                      GetTime;
1823*1370a723SSascha Wildner   EFI_SET_TIME                      SetTime;
1824*1370a723SSascha Wildner   EFI_GET_WAKEUP_TIME               GetWakeupTime;
1825*1370a723SSascha Wildner   EFI_SET_WAKEUP_TIME               SetWakeupTime;
1826*1370a723SSascha Wildner 
1827*1370a723SSascha Wildner   //
1828*1370a723SSascha Wildner   // Virtual Memory Services
1829*1370a723SSascha Wildner   //
1830*1370a723SSascha Wildner   EFI_SET_VIRTUAL_ADDRESS_MAP       SetVirtualAddressMap;
1831*1370a723SSascha Wildner   EFI_CONVERT_POINTER               ConvertPointer;
1832*1370a723SSascha Wildner 
1833*1370a723SSascha Wildner   //
1834*1370a723SSascha Wildner   // Variable Services
1835*1370a723SSascha Wildner   //
1836*1370a723SSascha Wildner   EFI_GET_VARIABLE                  GetVariable;
1837*1370a723SSascha Wildner   EFI_GET_NEXT_VARIABLE_NAME        GetNextVariableName;
1838*1370a723SSascha Wildner   EFI_SET_VARIABLE                  SetVariable;
1839*1370a723SSascha Wildner 
1840*1370a723SSascha Wildner   //
1841*1370a723SSascha Wildner   // Miscellaneous Services
1842*1370a723SSascha Wildner   //
1843*1370a723SSascha Wildner   EFI_GET_NEXT_HIGH_MONO_COUNT      GetNextHighMonotonicCount;
1844*1370a723SSascha Wildner   EFI_RESET_SYSTEM                  ResetSystem;
1845*1370a723SSascha Wildner 
1846*1370a723SSascha Wildner   //
1847*1370a723SSascha Wildner   // UEFI 2.0 Capsule Services
1848*1370a723SSascha Wildner   //
1849*1370a723SSascha Wildner   EFI_UPDATE_CAPSULE                UpdateCapsule;
1850*1370a723SSascha Wildner   EFI_QUERY_CAPSULE_CAPABILITIES    QueryCapsuleCapabilities;
1851*1370a723SSascha Wildner 
1852*1370a723SSascha Wildner   //
1853*1370a723SSascha Wildner   // Miscellaneous UEFI 2.0 Service
1854*1370a723SSascha Wildner   //
1855*1370a723SSascha Wildner   EFI_QUERY_VARIABLE_INFO           QueryVariableInfo;
1856*1370a723SSascha Wildner } EFI_RUNTIME_SERVICES;
1857*1370a723SSascha Wildner 
1858*1370a723SSascha Wildner #define EFI_BOOT_SERVICES_SIGNATURE  SIGNATURE_64 ('B','O','O','T','S','E','R','V')
1859*1370a723SSascha Wildner #define EFI_BOOT_SERVICES_REVISION   EFI_SPECIFICATION_VERSION
1860*1370a723SSascha Wildner 
1861*1370a723SSascha Wildner ///
1862*1370a723SSascha Wildner /// EFI Boot Services Table.
1863*1370a723SSascha Wildner ///
1864*1370a723SSascha Wildner typedef struct {
1865*1370a723SSascha Wildner   ///
1866*1370a723SSascha Wildner   /// The table header for the EFI Boot Services Table.
1867*1370a723SSascha Wildner   ///
1868*1370a723SSascha Wildner   EFI_TABLE_HEADER                              Hdr;
1869*1370a723SSascha Wildner 
1870*1370a723SSascha Wildner   //
1871*1370a723SSascha Wildner   // Task Priority Services
1872*1370a723SSascha Wildner   //
1873*1370a723SSascha Wildner   EFI_RAISE_TPL                                 RaiseTPL;
1874*1370a723SSascha Wildner   EFI_RESTORE_TPL                               RestoreTPL;
1875*1370a723SSascha Wildner 
1876*1370a723SSascha Wildner   //
1877*1370a723SSascha Wildner   // Memory Services
1878*1370a723SSascha Wildner   //
1879*1370a723SSascha Wildner   EFI_ALLOCATE_PAGES                            AllocatePages;
1880*1370a723SSascha Wildner   EFI_FREE_PAGES                                FreePages;
1881*1370a723SSascha Wildner   EFI_GET_MEMORY_MAP                            GetMemoryMap;
1882*1370a723SSascha Wildner   EFI_ALLOCATE_POOL                             AllocatePool;
1883*1370a723SSascha Wildner   EFI_FREE_POOL                                 FreePool;
1884*1370a723SSascha Wildner 
1885*1370a723SSascha Wildner   //
1886*1370a723SSascha Wildner   // Event & Timer Services
1887*1370a723SSascha Wildner   //
1888*1370a723SSascha Wildner   EFI_CREATE_EVENT                              CreateEvent;
1889*1370a723SSascha Wildner   EFI_SET_TIMER                                 SetTimer;
1890*1370a723SSascha Wildner   EFI_WAIT_FOR_EVENT                            WaitForEvent;
1891*1370a723SSascha Wildner   EFI_SIGNAL_EVENT                              SignalEvent;
1892*1370a723SSascha Wildner   EFI_CLOSE_EVENT                               CloseEvent;
1893*1370a723SSascha Wildner   EFI_CHECK_EVENT                               CheckEvent;
1894*1370a723SSascha Wildner 
1895*1370a723SSascha Wildner   //
1896*1370a723SSascha Wildner   // Protocol Handler Services
1897*1370a723SSascha Wildner   //
1898*1370a723SSascha Wildner   EFI_INSTALL_PROTOCOL_INTERFACE                InstallProtocolInterface;
1899*1370a723SSascha Wildner   EFI_REINSTALL_PROTOCOL_INTERFACE              ReinstallProtocolInterface;
1900*1370a723SSascha Wildner   EFI_UNINSTALL_PROTOCOL_INTERFACE              UninstallProtocolInterface;
1901*1370a723SSascha Wildner   EFI_HANDLE_PROTOCOL                           HandleProtocol;
1902*1370a723SSascha Wildner   VOID                                          *Reserved;
1903*1370a723SSascha Wildner   EFI_REGISTER_PROTOCOL_NOTIFY                  RegisterProtocolNotify;
1904*1370a723SSascha Wildner   EFI_LOCATE_HANDLE                             LocateHandle;
1905*1370a723SSascha Wildner   EFI_LOCATE_DEVICE_PATH                        LocateDevicePath;
1906*1370a723SSascha Wildner   EFI_INSTALL_CONFIGURATION_TABLE               InstallConfigurationTable;
1907*1370a723SSascha Wildner 
1908*1370a723SSascha Wildner   //
1909*1370a723SSascha Wildner   // Image Services
1910*1370a723SSascha Wildner   //
1911*1370a723SSascha Wildner   EFI_IMAGE_LOAD                                LoadImage;
1912*1370a723SSascha Wildner   EFI_IMAGE_START                               StartImage;
1913*1370a723SSascha Wildner   EFI_EXIT                                      Exit;
1914*1370a723SSascha Wildner   EFI_IMAGE_UNLOAD                              UnloadImage;
1915*1370a723SSascha Wildner   EFI_EXIT_BOOT_SERVICES                        ExitBootServices;
1916*1370a723SSascha Wildner 
1917*1370a723SSascha Wildner   //
1918*1370a723SSascha Wildner   // Miscellaneous Services
1919*1370a723SSascha Wildner   //
1920*1370a723SSascha Wildner   EFI_GET_NEXT_MONOTONIC_COUNT                  GetNextMonotonicCount;
1921*1370a723SSascha Wildner   EFI_STALL                                     Stall;
1922*1370a723SSascha Wildner   EFI_SET_WATCHDOG_TIMER                        SetWatchdogTimer;
1923*1370a723SSascha Wildner 
1924*1370a723SSascha Wildner   //
1925*1370a723SSascha Wildner   // DriverSupport Services
1926*1370a723SSascha Wildner   //
1927*1370a723SSascha Wildner   EFI_CONNECT_CONTROLLER                        ConnectController;
1928*1370a723SSascha Wildner   EFI_DISCONNECT_CONTROLLER                     DisconnectController;
1929*1370a723SSascha Wildner 
1930*1370a723SSascha Wildner   //
1931*1370a723SSascha Wildner   // Open and Close Protocol Services
1932*1370a723SSascha Wildner   //
1933*1370a723SSascha Wildner   EFI_OPEN_PROTOCOL                             OpenProtocol;
1934*1370a723SSascha Wildner   EFI_CLOSE_PROTOCOL                            CloseProtocol;
1935*1370a723SSascha Wildner   EFI_OPEN_PROTOCOL_INFORMATION                 OpenProtocolInformation;
1936*1370a723SSascha Wildner 
1937*1370a723SSascha Wildner   //
1938*1370a723SSascha Wildner   // Library Services
1939*1370a723SSascha Wildner   //
1940*1370a723SSascha Wildner   EFI_PROTOCOLS_PER_HANDLE                      ProtocolsPerHandle;
1941*1370a723SSascha Wildner   EFI_LOCATE_HANDLE_BUFFER                      LocateHandleBuffer;
1942*1370a723SSascha Wildner   EFI_LOCATE_PROTOCOL                           LocateProtocol;
1943*1370a723SSascha Wildner   EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES      InstallMultipleProtocolInterfaces;
1944*1370a723SSascha Wildner   EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES    UninstallMultipleProtocolInterfaces;
1945*1370a723SSascha Wildner 
1946*1370a723SSascha Wildner   //
1947*1370a723SSascha Wildner   // 32-bit CRC Services
1948*1370a723SSascha Wildner   //
1949*1370a723SSascha Wildner   EFI_CALCULATE_CRC32                           CalculateCrc32;
1950*1370a723SSascha Wildner 
1951*1370a723SSascha Wildner   //
1952*1370a723SSascha Wildner   // Miscellaneous Services
1953*1370a723SSascha Wildner   //
1954*1370a723SSascha Wildner   EFI_COPY_MEM                                  CopyMem;
1955*1370a723SSascha Wildner   EFI_SET_MEM                                   SetMem;
1956*1370a723SSascha Wildner   EFI_CREATE_EVENT_EX                           CreateEventEx;
1957*1370a723SSascha Wildner } EFI_BOOT_SERVICES;
1958*1370a723SSascha Wildner 
1959*1370a723SSascha Wildner ///
1960*1370a723SSascha Wildner /// Contains a set of GUID/pointer pairs comprised of the ConfigurationTable field in the
1961*1370a723SSascha Wildner /// EFI System Table.
1962*1370a723SSascha Wildner ///
1963*1370a723SSascha Wildner typedef struct {
1964*1370a723SSascha Wildner   ///
1965*1370a723SSascha Wildner   /// The 128-bit GUID value that uniquely identifies the system configuration table.
1966*1370a723SSascha Wildner   ///
1967*1370a723SSascha Wildner   EFI_GUID    VendorGuid;
1968*1370a723SSascha Wildner   ///
1969*1370a723SSascha Wildner   /// A pointer to the table associated with VendorGuid.
1970*1370a723SSascha Wildner   ///
1971*1370a723SSascha Wildner   VOID        *VendorTable;
1972*1370a723SSascha Wildner } EFI_CONFIGURATION_TABLE;
1973*1370a723SSascha Wildner 
1974*1370a723SSascha Wildner ///
1975*1370a723SSascha Wildner /// EFI System Table
1976*1370a723SSascha Wildner ///
1977*1370a723SSascha Wildner typedef struct {
1978*1370a723SSascha Wildner   ///
1979*1370a723SSascha Wildner   /// The table header for the EFI System Table.
1980*1370a723SSascha Wildner   ///
1981*1370a723SSascha Wildner   EFI_TABLE_HEADER                   Hdr;
1982*1370a723SSascha Wildner   ///
1983*1370a723SSascha Wildner   /// A pointer to a null terminated string that identifies the vendor
1984*1370a723SSascha Wildner   /// that produces the system firmware for the platform.
1985*1370a723SSascha Wildner   ///
1986*1370a723SSascha Wildner   CHAR16                             *FirmwareVendor;
1987*1370a723SSascha Wildner   ///
1988*1370a723SSascha Wildner   /// A firmware vendor specific value that identifies the revision
1989*1370a723SSascha Wildner   /// of the system firmware for the platform.
1990*1370a723SSascha Wildner   ///
1991*1370a723SSascha Wildner   UINT32                             FirmwareRevision;
1992*1370a723SSascha Wildner   ///
1993*1370a723SSascha Wildner   /// The handle for the active console input device. This handle must support
1994*1370a723SSascha Wildner   /// EFI_SIMPLE_TEXT_INPUT_PROTOCOL and EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.
1995*1370a723SSascha Wildner   ///
1996*1370a723SSascha Wildner   EFI_HANDLE                         ConsoleInHandle;
1997*1370a723SSascha Wildner   ///
1998*1370a723SSascha Wildner   /// A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface that is
1999*1370a723SSascha Wildner   /// associated with ConsoleInHandle.
2000*1370a723SSascha Wildner   ///
2001*1370a723SSascha Wildner   EFI_SIMPLE_TEXT_INPUT_PROTOCOL     *ConIn;
2002*1370a723SSascha Wildner   ///
2003*1370a723SSascha Wildner   /// The handle for the active console output device.
2004*1370a723SSascha Wildner   ///
2005*1370a723SSascha Wildner   EFI_HANDLE                         ConsoleOutHandle;
2006*1370a723SSascha Wildner   ///
2007*1370a723SSascha Wildner   /// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
2008*1370a723SSascha Wildner   /// that is associated with ConsoleOutHandle.
2009*1370a723SSascha Wildner   ///
2010*1370a723SSascha Wildner   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *ConOut;
2011*1370a723SSascha Wildner   ///
2012*1370a723SSascha Wildner   /// The handle for the active standard error console device.
2013*1370a723SSascha Wildner   /// This handle must support the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.
2014*1370a723SSascha Wildner   ///
2015*1370a723SSascha Wildner   EFI_HANDLE                         StandardErrorHandle;
2016*1370a723SSascha Wildner   ///
2017*1370a723SSascha Wildner   /// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
2018*1370a723SSascha Wildner   /// that is associated with StandardErrorHandle.
2019*1370a723SSascha Wildner   ///
2020*1370a723SSascha Wildner   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *StdErr;
2021*1370a723SSascha Wildner   ///
2022*1370a723SSascha Wildner   /// A pointer to the EFI Runtime Services Table.
2023*1370a723SSascha Wildner   ///
2024*1370a723SSascha Wildner   EFI_RUNTIME_SERVICES               *RuntimeServices;
2025*1370a723SSascha Wildner   ///
2026*1370a723SSascha Wildner   /// A pointer to the EFI Boot Services Table.
2027*1370a723SSascha Wildner   ///
2028*1370a723SSascha Wildner   EFI_BOOT_SERVICES                  *BootServices;
2029*1370a723SSascha Wildner   ///
2030*1370a723SSascha Wildner   /// The number of system configuration tables in the buffer ConfigurationTable.
2031*1370a723SSascha Wildner   ///
2032*1370a723SSascha Wildner   UINTN                              NumberOfTableEntries;
2033*1370a723SSascha Wildner   ///
2034*1370a723SSascha Wildner   /// A pointer to the system configuration tables.
2035*1370a723SSascha Wildner   /// The number of entries in the table is NumberOfTableEntries.
2036*1370a723SSascha Wildner   ///
2037*1370a723SSascha Wildner   EFI_CONFIGURATION_TABLE            *ConfigurationTable;
2038*1370a723SSascha Wildner } EFI_SYSTEM_TABLE;
2039*1370a723SSascha Wildner 
2040*1370a723SSascha Wildner /**
2041*1370a723SSascha Wildner   This is the declaration of an EFI image entry point. This entry point is
2042*1370a723SSascha Wildner   the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
2043*1370a723SSascha Wildner   both device drivers and bus drivers.
2044*1370a723SSascha Wildner 
2045*1370a723SSascha Wildner   @param[in]  ImageHandle       The firmware allocated handle for the UEFI image.
2046*1370a723SSascha Wildner   @param[in]  SystemTable       A pointer to the EFI System Table.
2047*1370a723SSascha Wildner 
2048*1370a723SSascha Wildner   @retval EFI_SUCCESS           The operation completed successfully.
2049*1370a723SSascha Wildner   @retval Others                An unexpected error occurred.
2050*1370a723SSascha Wildner **/
2051*1370a723SSascha Wildner typedef
2052*1370a723SSascha Wildner EFI_STATUS
2053*1370a723SSascha Wildner (EFIAPI *EFI_IMAGE_ENTRY_POINT)(
2054*1370a723SSascha Wildner   IN  EFI_HANDLE                   ImageHandle,
2055*1370a723SSascha Wildner   IN  EFI_SYSTEM_TABLE             *SystemTable
2056*1370a723SSascha Wildner   );
2057*1370a723SSascha Wildner 
2058*1370a723SSascha Wildner //
2059*1370a723SSascha Wildner // EFI Load Option. This data structure describes format of UEFI boot option variables.
2060*1370a723SSascha Wildner //
2061*1370a723SSascha Wildner // NOTE: EFI Load Option is a byte packed buffer of variable length fields.
2062*1370a723SSascha Wildner // The first two fields have fixed length. They are declared as members of the
2063*1370a723SSascha Wildner // EFI_LOAD_OPTION structure. All the other fields are variable length fields.
2064*1370a723SSascha Wildner // They are listed in the comment block below for reference purposes.
2065*1370a723SSascha Wildner //
2066*1370a723SSascha Wildner #pragma pack(1)
2067*1370a723SSascha Wildner typedef struct _EFI_LOAD_OPTION {
2068*1370a723SSascha Wildner   ///
2069*1370a723SSascha Wildner   /// The attributes for this load option entry. All unused bits must be zero
2070*1370a723SSascha Wildner   /// and are reserved by the UEFI specification for future growth.
2071*1370a723SSascha Wildner   ///
2072*1370a723SSascha Wildner   UINT32    Attributes;
2073*1370a723SSascha Wildner   ///
2074*1370a723SSascha Wildner   /// Length in bytes of the FilePathList. OptionalData starts at offset
2075*1370a723SSascha Wildner   /// sizeof(UINT32) + sizeof(UINT16) + StrSize(Description) + FilePathListLength
2076*1370a723SSascha Wildner   /// of the EFI_LOAD_OPTION descriptor.
2077*1370a723SSascha Wildner   ///
2078*1370a723SSascha Wildner   UINT16    FilePathListLength;
2079*1370a723SSascha Wildner   ///
2080*1370a723SSascha Wildner   /// The user readable description for the load option.
2081*1370a723SSascha Wildner   /// This field ends with a Null character.
2082*1370a723SSascha Wildner   ///
2083*1370a723SSascha Wildner   // CHAR16                        Description[];
2084*1370a723SSascha Wildner   ///
2085*1370a723SSascha Wildner   /// A packed array of UEFI device paths. The first element of the array is a
2086*1370a723SSascha Wildner   /// device path that describes the device and location of the Image for this
2087*1370a723SSascha Wildner   /// load option. The FilePathList[0] is specific to the device type. Other
2088*1370a723SSascha Wildner   /// device paths may optionally exist in the FilePathList, but their usage is
2089*1370a723SSascha Wildner   /// OSV specific. Each element in the array is variable length, and ends at
2090*1370a723SSascha Wildner   /// the device path end structure. Because the size of Description is
2091*1370a723SSascha Wildner   /// arbitrary, this data structure is not guaranteed to be aligned on a
2092*1370a723SSascha Wildner   /// natural boundary. This data structure may have to be copied to an aligned
2093*1370a723SSascha Wildner   /// natural boundary before it is used.
2094*1370a723SSascha Wildner   ///
2095*1370a723SSascha Wildner   // EFI_DEVICE_PATH_PROTOCOL      FilePathList[];
2096*1370a723SSascha Wildner   ///
2097*1370a723SSascha Wildner   /// The remaining bytes in the load option descriptor are a binary data buffer
2098*1370a723SSascha Wildner   /// that is passed to the loaded image. If the field is zero bytes long, a
2099*1370a723SSascha Wildner   /// NULL pointer is passed to the loaded image. The number of bytes in
2100*1370a723SSascha Wildner   /// OptionalData can be computed by subtracting the starting offset of
2101*1370a723SSascha Wildner   /// OptionalData from total size in bytes of the EFI_LOAD_OPTION.
2102*1370a723SSascha Wildner   ///
2103*1370a723SSascha Wildner   // UINT8                         OptionalData[];
2104*1370a723SSascha Wildner } EFI_LOAD_OPTION;
2105*1370a723SSascha Wildner #pragma pack()
2106*1370a723SSascha Wildner 
2107*1370a723SSascha Wildner //
2108*1370a723SSascha Wildner // EFI Load Options Attributes
2109*1370a723SSascha Wildner //
2110*1370a723SSascha Wildner #define LOAD_OPTION_ACTIVE           0x00000001
2111*1370a723SSascha Wildner #define LOAD_OPTION_FORCE_RECONNECT  0x00000002
2112*1370a723SSascha Wildner #define LOAD_OPTION_HIDDEN           0x00000008
2113*1370a723SSascha Wildner #define LOAD_OPTION_CATEGORY         0x00001F00
2114*1370a723SSascha Wildner 
2115*1370a723SSascha Wildner #define LOAD_OPTION_CATEGORY_BOOT  0x00000000
2116*1370a723SSascha Wildner #define LOAD_OPTION_CATEGORY_APP   0x00000100
2117*1370a723SSascha Wildner 
2118*1370a723SSascha Wildner #define EFI_BOOT_OPTION_SUPPORT_KEY      0x00000001
2119*1370a723SSascha Wildner #define EFI_BOOT_OPTION_SUPPORT_APP      0x00000002
2120*1370a723SSascha Wildner #define EFI_BOOT_OPTION_SUPPORT_SYSPREP  0x00000010
2121*1370a723SSascha Wildner #define EFI_BOOT_OPTION_SUPPORT_COUNT    0x00000300
2122*1370a723SSascha Wildner 
2123*1370a723SSascha Wildner ///
2124*1370a723SSascha Wildner /// EFI Boot Key Data
2125*1370a723SSascha Wildner ///
2126*1370a723SSascha Wildner typedef union {
2127*1370a723SSascha Wildner   struct {
2128*1370a723SSascha Wildner     ///
2129*1370a723SSascha Wildner     /// Indicates the revision of the EFI_KEY_OPTION structure. This revision level should be 0.
2130*1370a723SSascha Wildner     ///
2131*1370a723SSascha Wildner     UINT32    Revision       : 8;
2132*1370a723SSascha Wildner     ///
2133*1370a723SSascha Wildner     /// Either the left or right Shift keys must be pressed (1) or must not be pressed (0).
2134*1370a723SSascha Wildner     ///
2135*1370a723SSascha Wildner     UINT32    ShiftPressed   : 1;
2136*1370a723SSascha Wildner     ///
2137*1370a723SSascha Wildner     /// Either the left or right Control keys must be pressed (1) or must not be pressed (0).
2138*1370a723SSascha Wildner     ///
2139*1370a723SSascha Wildner     UINT32    ControlPressed : 1;
2140*1370a723SSascha Wildner     ///
2141*1370a723SSascha Wildner     /// Either the left or right Alt keys must be pressed (1) or must not be pressed (0).
2142*1370a723SSascha Wildner     ///
2143*1370a723SSascha Wildner     UINT32    AltPressed     : 1;
2144*1370a723SSascha Wildner     ///
2145*1370a723SSascha Wildner     /// Either the left or right Logo keys must be pressed (1) or must not be pressed (0).
2146*1370a723SSascha Wildner     ///
2147*1370a723SSascha Wildner     UINT32    LogoPressed    : 1;
2148*1370a723SSascha Wildner     ///
2149*1370a723SSascha Wildner     /// The Menu key must be pressed (1) or must not be pressed (0).
2150*1370a723SSascha Wildner     ///
2151*1370a723SSascha Wildner     UINT32    MenuPressed    : 1;
2152*1370a723SSascha Wildner     ///
2153*1370a723SSascha Wildner     /// The SysReq key must be pressed (1) or must not be pressed (0).
2154*1370a723SSascha Wildner     ///
2155*1370a723SSascha Wildner     UINT32    SysReqPressed  : 1;
2156*1370a723SSascha Wildner     UINT32    Reserved       : 16;
2157*1370a723SSascha Wildner     ///
2158*1370a723SSascha Wildner     /// Specifies the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3. If
2159*1370a723SSascha Wildner     /// zero, then only the shift state is considered. If more than one, then the boot option will
2160*1370a723SSascha Wildner     /// only be launched if all of the specified keys are pressed with the same shift state.
2161*1370a723SSascha Wildner     ///
2162*1370a723SSascha Wildner     UINT32    InputKeyCount  : 2;
2163*1370a723SSascha Wildner   } Options;
2164*1370a723SSascha Wildner   UINT32    PackedValue;
2165*1370a723SSascha Wildner } EFI_BOOT_KEY_DATA;
2166*1370a723SSascha Wildner 
2167*1370a723SSascha Wildner ///
2168*1370a723SSascha Wildner /// EFI Key Option.
2169*1370a723SSascha Wildner ///
2170*1370a723SSascha Wildner #pragma pack(1)
2171*1370a723SSascha Wildner typedef struct {
2172*1370a723SSascha Wildner   ///
2173*1370a723SSascha Wildner   /// Specifies options about how the key will be processed.
2174*1370a723SSascha Wildner   ///
2175*1370a723SSascha Wildner   EFI_BOOT_KEY_DATA    KeyData;
2176*1370a723SSascha Wildner   ///
2177*1370a723SSascha Wildner   /// The CRC-32 which should match the CRC-32 of the entire EFI_LOAD_OPTION to
2178*1370a723SSascha Wildner   /// which BootOption refers. If the CRC-32s do not match this value, then this key
2179*1370a723SSascha Wildner   /// option is ignored.
2180*1370a723SSascha Wildner   ///
2181*1370a723SSascha Wildner   UINT32               BootOptionCrc;
2182*1370a723SSascha Wildner   ///
2183*1370a723SSascha Wildner   /// The Boot#### option which will be invoked if this key is pressed and the boot option
2184*1370a723SSascha Wildner   /// is active (LOAD_OPTION_ACTIVE is set).
2185*1370a723SSascha Wildner   ///
2186*1370a723SSascha Wildner   UINT16               BootOption;
2187*1370a723SSascha Wildner   ///
2188*1370a723SSascha Wildner   /// The key codes to compare against those returned by the
2189*1370a723SSascha Wildner   /// EFI_SIMPLE_TEXT_INPUT and EFI_SIMPLE_TEXT_INPUT_EX protocols.
2190*1370a723SSascha Wildner   /// The number of key codes (0-3) is specified by the EFI_KEY_CODE_COUNT field in KeyOptions.
2191*1370a723SSascha Wildner   ///
2192*1370a723SSascha Wildner   // EFI_INPUT_KEY      Keys[];
2193*1370a723SSascha Wildner } EFI_KEY_OPTION;
2194*1370a723SSascha Wildner #pragma pack()
2195*1370a723SSascha Wildner 
2196*1370a723SSascha Wildner //
2197*1370a723SSascha Wildner // EFI File location to boot from on removable media devices
2198*1370a723SSascha Wildner //
2199*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME_IA32         L"\\EFI\\BOOT\\BOOTIA32.EFI"
2200*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME_IA64         L"\\EFI\\BOOT\\BOOTIA64.EFI"
2201*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME_X64          L"\\EFI\\BOOT\\BOOTX64.EFI"
2202*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME_ARM          L"\\EFI\\BOOT\\BOOTARM.EFI"
2203*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64      L"\\EFI\\BOOT\\BOOTAA64.EFI"
2204*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME_RISCV64      L"\\EFI\\BOOT\\BOOTRISCV64.EFI"
2205*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME_LOONGARCH64  L"\\EFI\\BOOT\\BOOTLOONGARCH64.EFI"
2206*1370a723SSascha Wildner 
2207*1370a723SSascha Wildner #if !defined (EFI_REMOVABLE_MEDIA_FILE_NAME)
2208*1370a723SSascha Wildner   #if   defined (MDE_CPU_IA32)
2209*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME  EFI_REMOVABLE_MEDIA_FILE_NAME_IA32
2210*1370a723SSascha Wildner   #elif defined (MDE_CPU_X64)
2211*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME  EFI_REMOVABLE_MEDIA_FILE_NAME_X64
2212*1370a723SSascha Wildner   #elif defined (MDE_CPU_EBC)
2213*1370a723SSascha Wildner   #elif defined (MDE_CPU_ARM)
2214*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME  EFI_REMOVABLE_MEDIA_FILE_NAME_ARM
2215*1370a723SSascha Wildner   #elif defined (MDE_CPU_AARCH64)
2216*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME  EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64
2217*1370a723SSascha Wildner   #elif defined (MDE_CPU_RISCV64)
2218*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME  EFI_REMOVABLE_MEDIA_FILE_NAME_RISCV64
2219*1370a723SSascha Wildner   #elif defined (MDE_CPU_LOONGARCH64)
2220*1370a723SSascha Wildner #define EFI_REMOVABLE_MEDIA_FILE_NAME  EFI_REMOVABLE_MEDIA_FILE_NAME_LOONGARCH64
2221*1370a723SSascha Wildner   #else
2222*1370a723SSascha Wildner     #error Unknown Processor Type
2223*1370a723SSascha Wildner   #endif
2224*1370a723SSascha Wildner #endif
2225*1370a723SSascha Wildner 
2226*1370a723SSascha Wildner //
2227*1370a723SSascha Wildner // The directory within the active EFI System Partition defined for delivery of capsule to firmware
2228*1370a723SSascha Wildner //
2229*1370a723SSascha Wildner #define EFI_CAPSULE_FILE_DIRECTORY  L"\\EFI\\UpdateCapsule\\"
2230*1370a723SSascha Wildner 
2231*1370a723SSascha Wildner #include <Uefi/UefiPxe.h>
2232*1370a723SSascha Wildner #include <Uefi/UefiGpt.h>
2233*1370a723SSascha Wildner #include <Uefi/UefiInternalFormRepresentation.h>
2234*1370a723SSascha Wildner 
2235*1370a723SSascha Wildner #endif
2236