1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef _EFI_H
17#define _EFI_H
18
19#include <linux/linkage.h>
20#include <linux/string.h>
21#include <linux/types.h>
22
23
24#define efi_intn_t ssize_t
25
26#define efi_uintn_t size_t
27
28
29
30
31
32
33
34
35
36#ifdef __x86_64__
37#define EFIAPI __attribute__((ms_abi))
38#define efi_va_list __builtin_ms_va_list
39#define efi_va_start __builtin_ms_va_start
40#define efi_va_arg __builtin_va_arg
41#define efi_va_end __builtin_ms_va_end
42#else
43#define EFIAPI asmlinkage
44#define efi_va_list va_list
45#define efi_va_start va_start
46#define efi_va_arg va_arg
47#define efi_va_end va_end
48#endif
49
50#define EFI32_LOADER_SIGNATURE "EL32"
51#define EFI64_LOADER_SIGNATURE "EL64"
52
53struct efi_device_path;
54
55typedef struct {
56 u8 b[16];
57} efi_guid_t __attribute__((aligned(8)));
58
59#define EFI_BITS_PER_LONG (sizeof(long) * 8)
60
61
62#define EFI_ERROR_MASK (1UL << (EFI_BITS_PER_LONG - 1))
63
64#define EFI_SUCCESS 0
65#define EFI_LOAD_ERROR (EFI_ERROR_MASK | 1)
66#define EFI_INVALID_PARAMETER (EFI_ERROR_MASK | 2)
67#define EFI_UNSUPPORTED (EFI_ERROR_MASK | 3)
68#define EFI_BAD_BUFFER_SIZE (EFI_ERROR_MASK | 4)
69#define EFI_BUFFER_TOO_SMALL (EFI_ERROR_MASK | 5)
70#define EFI_NOT_READY (EFI_ERROR_MASK | 6)
71#define EFI_DEVICE_ERROR (EFI_ERROR_MASK | 7)
72#define EFI_WRITE_PROTECTED (EFI_ERROR_MASK | 8)
73#define EFI_OUT_OF_RESOURCES (EFI_ERROR_MASK | 9)
74#define EFI_VOLUME_CORRUPTED (EFI_ERROR_MASK | 10)
75#define EFI_VOLUME_FULL (EFI_ERROR_MASK | 11)
76#define EFI_NO_MEDIA (EFI_ERROR_MASK | 12)
77#define EFI_MEDIA_CHANGED (EFI_ERROR_MASK | 13)
78#define EFI_NOT_FOUND (EFI_ERROR_MASK | 14)
79#define EFI_ACCESS_DENIED (EFI_ERROR_MASK | 15)
80#define EFI_NO_RESPONSE (EFI_ERROR_MASK | 16)
81#define EFI_NO_MAPPING (EFI_ERROR_MASK | 17)
82#define EFI_TIMEOUT (EFI_ERROR_MASK | 18)
83#define EFI_NOT_STARTED (EFI_ERROR_MASK | 19)
84#define EFI_ALREADY_STARTED (EFI_ERROR_MASK | 20)
85#define EFI_ABORTED (EFI_ERROR_MASK | 21)
86#define EFI_ICMP_ERROR (EFI_ERROR_MASK | 22)
87#define EFI_TFTP_ERROR (EFI_ERROR_MASK | 23)
88#define EFI_PROTOCOL_ERROR (EFI_ERROR_MASK | 24)
89#define EFI_INCOMPATIBLE_VERSION (EFI_ERROR_MASK | 25)
90#define EFI_SECURITY_VIOLATION (EFI_ERROR_MASK | 26)
91#define EFI_CRC_ERROR (EFI_ERROR_MASK | 27)
92#define EFI_END_OF_MEDIA (EFI_ERROR_MASK | 28)
93#define EFI_END_OF_FILE (EFI_ERROR_MASK | 31)
94#define EFI_INVALID_LANGUAGE (EFI_ERROR_MASK | 32)
95#define EFI_COMPROMISED_DATA (EFI_ERROR_MASK | 33)
96#define EFI_IP_ADDRESS_CONFLICT (EFI_ERROR_MASK | 34)
97#define EFI_HTTP_ERROR (EFI_ERROR_MASK | 35)
98
99#define EFI_WARN_UNKNOWN_GLYPH 1
100#define EFI_WARN_DELETE_FAILURE 2
101#define EFI_WARN_WRITE_FAILURE 3
102#define EFI_WARN_BUFFER_TOO_SMALL 4
103#define EFI_WARN_STALE_DATA 5
104#define EFI_WARN_FILE_SYSTEM 6
105#define EFI_WARN_RESET_REQUIRED 7
106
107typedef unsigned long efi_status_t;
108typedef u64 efi_physical_addr_t;
109typedef u64 efi_virtual_addr_t;
110typedef struct efi_object *efi_handle_t;
111
112#define EFI_GUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \
113 {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, \
114 ((a) >> 24) & 0xff, \
115 (b) & 0xff, ((b) >> 8) & 0xff, \
116 (c) & 0xff, ((c) >> 8) & 0xff, \
117 (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) } }
118
119
120struct efi_table_hdr {
121 u64 signature;
122 u32 revision;
123 u32 headersize;
124 u32 crc32;
125 u32 reserved;
126};
127
128
129enum efi_mem_type {
130 EFI_RESERVED_MEMORY_TYPE,
131
132
133
134
135 EFI_LOADER_CODE,
136
137
138
139
140
141 EFI_LOADER_DATA,
142
143 EFI_BOOT_SERVICES_CODE,
144
145
146
147
148
149 EFI_BOOT_SERVICES_DATA,
150
151 EFI_RUNTIME_SERVICES_CODE,
152
153
154
155
156
157 EFI_RUNTIME_SERVICES_DATA,
158
159 EFI_CONVENTIONAL_MEMORY,
160
161 EFI_UNUSABLE_MEMORY,
162
163 EFI_ACPI_RECLAIM_MEMORY,
164
165 EFI_ACPI_MEMORY_NVS,
166
167
168
169
170
171 EFI_MMAP_IO,
172
173
174
175
176 EFI_MMAP_IO_PORT,
177
178
179
180
181 EFI_PAL_CODE,
182
183
184
185 EFI_PERSISTENT_MEMORY_TYPE,
186
187
188
189 EFI_UNACCEPTED_MEMORY_TYPE,
190
191 EFI_MAX_MEMORY_TYPE,
192};
193
194
195#define EFI_MEMORY_UC ((u64)0x0000000000000001ULL)
196#define EFI_MEMORY_WC ((u64)0x0000000000000002ULL)
197#define EFI_MEMORY_WT ((u64)0x0000000000000004ULL)
198#define EFI_MEMORY_WB ((u64)0x0000000000000008ULL)
199#define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL)
200#define EFI_MEMORY_WP ((u64)0x0000000000001000ULL)
201#define EFI_MEMORY_RP ((u64)0x0000000000002000ULL)
202#define EFI_MEMORY_XP ((u64)0x0000000000004000ULL)
203#define EFI_MEMORY_NV ((u64)0x0000000000008000ULL)
204#define EFI_MEMORY_MORE_RELIABLE \
205 ((u64)0x0000000000010000ULL)
206#define EFI_MEMORY_RO ((u64)0x0000000000020000ULL)
207#define EFI_MEMORY_SP ((u64)0x0000000000040000ULL)
208#define EFI_MEMORY_CPU_CRYPTO ((u64)0x0000000000080000ULL)
209#define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL)
210#define EFI_MEM_DESC_VERSION 1
211
212#define EFI_PAGE_SHIFT 12
213#define EFI_PAGE_SIZE (1ULL << EFI_PAGE_SHIFT)
214#define EFI_PAGE_MASK (EFI_PAGE_SIZE - 1)
215
216struct efi_mem_desc {
217 u32 type;
218 u32 reserved;
219 efi_physical_addr_t physical_start;
220 efi_virtual_addr_t virtual_start;
221 u64 num_pages;
222 u64 attribute;
223};
224
225#define EFI_MEMORY_DESCRIPTOR_VERSION 1
226
227
228#define EFI_ALLOCATE_ANY_PAGES 0
229#define EFI_ALLOCATE_MAX_ADDRESS 1
230#define EFI_ALLOCATE_ADDRESS 2
231#define EFI_MAX_ALLOCATE_TYPE 3
232
233
234#define EFI_TIME_ADJUST_DAYLIGHT 0x1
235#define EFI_TIME_IN_DAYLIGHT 0x2
236#define EFI_UNSPECIFIED_TIMEZONE 0x07ff
237
238struct efi_time {
239 u16 year;
240 u8 month;
241 u8 day;
242 u8 hour;
243 u8 minute;
244 u8 second;
245 u8 pad1;
246 u32 nanosecond;
247 s16 timezone;
248 u8 daylight;
249 u8 pad2;
250};
251
252struct efi_time_cap {
253 u32 resolution;
254 u32 accuracy;
255 u8 sets_to_zero;
256};
257
258enum efi_locate_search_type {
259 ALL_HANDLES,
260 BY_REGISTER_NOTIFY,
261 BY_PROTOCOL
262};
263
264struct efi_open_protocol_info_entry {
265 efi_handle_t agent_handle;
266 efi_handle_t controller_handle;
267 u32 attributes;
268 u32 open_count;
269};
270
271enum efi_entry_t {
272 EFIET_END,
273 EFIET_MEMORY_MAP,
274 EFIET_GOP_MODE,
275 EFIET_SYS_TABLE,
276
277
278 EFIET_MEMORY_COUNT,
279};
280
281#define EFI_TABLE_VERSION 1
282
283
284
285
286
287
288
289
290
291struct efi_info_hdr {
292 u32 version;
293 u32 hdr_size;
294 u32 total_size;
295 u32 spare[5];
296};
297
298
299
300
301
302
303
304
305
306
307
308struct efi_entry_hdr {
309 u32 type;
310 u32 size;
311 u64 addr;
312 u32 link;
313 u32 spare1;
314 u64 spare2;
315};
316
317
318
319
320
321
322
323
324
325struct efi_entry_memmap {
326 u32 version;
327 u32 desc_size;
328 u64 spare;
329 struct efi_mem_desc desc[];
330};
331
332
333
334
335
336
337
338
339
340struct efi_entry_gopmode {
341 efi_physical_addr_t fb_base;
342
343
344
345
346
347
348
349 u64 fb_size;
350 u64 info_size;
351
352
353
354
355
356 struct {
357 u32 version;
358 u32 width;
359 u32 height;
360 u32 pixel_format;
361 u32 pixel_bitmask[4];
362 u32 pixels_per_scanline;
363 } info[];
364};
365
366
367
368
369
370
371struct efi_entry_systable {
372 efi_physical_addr_t sys_table;
373};
374
375static inline struct efi_mem_desc *efi_get_next_mem_desc(
376 struct efi_entry_memmap *map, struct efi_mem_desc *desc)
377{
378 return (struct efi_mem_desc *)((ulong)desc + map->desc_size);
379}
380
381struct efi_priv {
382 efi_handle_t parent_image;
383 struct efi_device_path *device_path;
384 struct efi_system_table *sys_table;
385 struct efi_boot_services *boot;
386 struct efi_runtime_services *run;
387 bool use_pool_for_malloc;
388 unsigned long ram_base;
389 unsigned int image_data_type;
390 struct efi_info_hdr *info;
391 unsigned int info_size;
392 void *next_hdr;
393};
394
395
396extern char image_base[];
397
398
399extern char _binary_u_boot_bin_start[], _binary_u_boot_bin_end[];
400
401
402
403
404#define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001
405#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
406#define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004
407#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
408#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
409#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
410#define EFI_VARIABLE_APPEND_WRITE 0x0000000000000040
411
412#define EFI_VARIABLE_MASK (EFI_VARIABLE_NON_VOLATILE | \
413 EFI_VARIABLE_BOOTSERVICE_ACCESS | \
414 EFI_VARIABLE_RUNTIME_ACCESS | \
415 EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
416 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
417 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
418 EFI_VARIABLE_APPEND_WRITE)
419
420
421
422
423
424
425
426struct efi_system_table *efi_get_sys_table(void);
427
428
429
430
431
432
433
434
435unsigned long efi_get_ram_base(void);
436
437
438
439
440
441
442
443
444
445int efi_init(struct efi_priv *priv, const char *banner, efi_handle_t image,
446 struct efi_system_table *sys_table);
447
448
449
450
451
452
453
454
455
456void *efi_malloc(struct efi_priv *priv, int size, efi_status_t *retp);
457
458
459
460
461
462
463
464void efi_free(struct efi_priv *priv, void *ptr);
465
466
467
468
469
470
471
472void efi_puts(struct efi_priv *priv, const char *str);
473
474
475
476
477
478
479
480void efi_putc(struct efi_priv *priv, const char ch);
481
482
483
484
485
486
487
488
489
490
491int efi_info_get(enum efi_entry_t type, void **datap, int *sizep);
492
493#endif
494