efi: Add a flags parameter to efi_memory_map
[linux-block.git] / include / linux / efi.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2#ifndef _LINUX_EFI_H
3#define _LINUX_EFI_H
4
5/*
6 * Extensible Firmware Interface
7 * Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999
8 *
9 * Copyright (C) 1999 VA Linux Systems
10 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
11 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
12 * David Mosberger-Tang <davidm@hpl.hp.com>
13 * Stephane Eranian <eranian@hpl.hp.com>
14 */
15#include <linux/init.h>
16#include <linux/string.h>
17#include <linux/time.h>
18#include <linux/types.h>
19#include <linux/proc_fs.h>
20#include <linux/rtc.h>
21#include <linux/ioport.h>
4a3575fd 22#include <linux/pfn.h>
5ee9c198 23#include <linux/pstore.h>
60863c0d 24#include <linux/range.h>
8562c99c 25#include <linux/reboot.h>
ba7e34b1 26#include <linux/uuid.h>
2c23b73c 27#include <linux/screen_info.h>
1da177e4
LT
28
29#include <asm/page.h>
1da177e4
LT
30
31#define EFI_SUCCESS 0
32#define EFI_LOAD_ERROR ( 1 | (1UL << (BITS_PER_LONG-1)))
33#define EFI_INVALID_PARAMETER ( 2 | (1UL << (BITS_PER_LONG-1)))
34#define EFI_UNSUPPORTED ( 3 | (1UL << (BITS_PER_LONG-1)))
35#define EFI_BAD_BUFFER_SIZE ( 4 | (1UL << (BITS_PER_LONG-1)))
36#define EFI_BUFFER_TOO_SMALL ( 5 | (1UL << (BITS_PER_LONG-1)))
5d9db883
MG
37#define EFI_NOT_READY ( 6 | (1UL << (BITS_PER_LONG-1)))
38#define EFI_DEVICE_ERROR ( 7 | (1UL << (BITS_PER_LONG-1)))
39#define EFI_WRITE_PROTECTED ( 8 | (1UL << (BITS_PER_LONG-1)))
40#define EFI_OUT_OF_RESOURCES ( 9 | (1UL << (BITS_PER_LONG-1)))
1da177e4 41#define EFI_NOT_FOUND (14 | (1UL << (BITS_PER_LONG-1)))
dce48e35 42#define EFI_ABORTED (21 | (1UL << (BITS_PER_LONG-1)))
5d9db883 43#define EFI_SECURITY_VIOLATION (26 | (1UL << (BITS_PER_LONG-1)))
1da177e4
LT
44
45typedef unsigned long efi_status_t;
46typedef u8 efi_bool_t;
47typedef u16 efi_char16_t; /* UNICODE character */
ed37ddff
RF
48typedef u64 efi_physical_addr_t;
49typedef void *efi_handle_t;
1da177e4 50
89ed4865 51#if defined(CONFIG_X86_64)
8f24f8c2 52#define __efiapi __attribute__((ms_abi))
89ed4865
AB
53#elif defined(CONFIG_X86_32)
54#define __efiapi __attribute__((regparm(0)))
8f24f8c2
AB
55#else
56#define __efiapi
57#endif
58
2732ea0d 59#define efi_get_handle_at(array, idx) \
f958efe9 60 (efi_is_native() ? (array)[idx] \
2732ea0d
AB
61 : (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
62
63#define efi_get_handle_num(size) \
f958efe9 64 ((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
2732ea0d
AB
65
66#define for_each_efi_handle(handle, array, size, i) \
67 for (i = 0; \
68 i < efi_get_handle_num(size) && \
69 ((handle = efi_get_handle_at((array), i)) || true); \
70 i++)
71
494c704f
AB
72/*
73 * The UEFI spec and EDK2 reference implementation both define EFI_GUID as
74 * struct { u32 a; u16; b; u16 c; u8 d[8]; }; and so the implied alignment
75 * is 32 bits not 8 bits like our guid_t. In some cases (i.e., on 32-bit ARM),
76 * this means that firmware services invoked by the kernel may assume that
77 * efi_guid_t* arguments are 32-bit aligned, and use memory accessors that
78 * do not tolerate misalignment. So let's set the minimum alignment to 32 bits.
79 *
80 * Note that the UEFI spec as well as some comments in the EDK2 code base
81 * suggest that EFI_GUID should be 64-bit aligned, but this appears to be
82 * a mistake, given that no code seems to exist that actually enforces that
83 * or relies on it.
84 */
85typedef guid_t efi_guid_t __aligned(__alignof__(u32));
1da177e4
LT
86
87#define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
c0020756 88 GUID_INIT(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
1da177e4
LT
89
90/*
91 * Generic EFI table header
92 */
93typedef struct {
94 u64 signature;
95 u32 revision;
96 u32 headersize;
97 u32 crc32;
98 u32 reserved;
99} efi_table_hdr_t;
100
101/*
102 * Memory map descriptor:
103 */
104
105/* Memory types: */
106#define EFI_RESERVED_TYPE 0
107#define EFI_LOADER_CODE 1
108#define EFI_LOADER_DATA 2
109#define EFI_BOOT_SERVICES_CODE 3
110#define EFI_BOOT_SERVICES_DATA 4
111#define EFI_RUNTIME_SERVICES_CODE 5
112#define EFI_RUNTIME_SERVICES_DATA 6
113#define EFI_CONVENTIONAL_MEMORY 7
114#define EFI_UNUSABLE_MEMORY 8
115#define EFI_ACPI_RECLAIM_MEMORY 9
116#define EFI_ACPI_MEMORY_NVS 10
117#define EFI_MEMORY_MAPPED_IO 11
118#define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12
119#define EFI_PAL_CODE 13
ad5fb870
DW
120#define EFI_PERSISTENT_MEMORY 14
121#define EFI_MAX_MEMORY_TYPE 15
1da177e4
LT
122
123/* Attribute values: */
124#define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */
125#define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */
126#define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */
127#define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */
9c97e0bd 128#define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL) /* uncached, exported */
1da177e4
LT
129#define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */
130#define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */
131#define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */
c016ca08 132#define EFI_MEMORY_NV ((u64)0x0000000000008000ULL) /* non-volatile */
b05b9f5f
TL
133#define EFI_MEMORY_MORE_RELIABLE \
134 ((u64)0x0000000000010000ULL) /* higher reliability */
87db73ae 135#define EFI_MEMORY_RO ((u64)0x0000000000020000ULL) /* read-only */
fe3e5e65 136#define EFI_MEMORY_SP ((u64)0x0000000000040000ULL) /* soft reserved */
1da177e4
LT
137#define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */
138#define EFI_MEMORY_DESCRIPTOR_VERSION 1
139
140#define EFI_PAGE_SHIFT 12
ed37ddff 141#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT)
0100a3e6 142#define EFI_PAGES_MAX (U64_MAX >> EFI_PAGE_SHIFT)
1da177e4 143
1da177e4
LT
144typedef struct {
145 u32 type;
146 u32 pad;
147 u64 phys_addr;
148 u64 virt_addr;
149 u64 num_pages;
150 u64 attribute;
1da177e4
LT
151} efi_memory_desc_t;
152
3b370237
MG
153typedef struct {
154 efi_guid_t guid;
155 u32 headersize;
156 u32 flags;
157 u32 imagesize;
158} efi_capsule_header_t;
159
dadb57ab
JH
160struct efi_boot_memmap {
161 efi_memory_desc_t **map;
162 unsigned long *map_size;
163 unsigned long *desc_size;
164 u32 *desc_ver;
165 unsigned long *key_ptr;
166 unsigned long *buff_size;
167};
168
f0133f3c
MF
169/*
170 * EFI capsule flags
171 */
172#define EFI_CAPSULE_PERSIST_ACROSS_RESET 0x00010000
173#define EFI_CAPSULE_POPULATE_SYSTEM_TABLE 0x00020000
174#define EFI_CAPSULE_INITIATE_RESET 0x00040000
175
3fabd628
AB
176struct capsule_info {
177 efi_capsule_header_t header;
f24c4d47 178 efi_capsule_header_t *capsule;
3fabd628
AB
179 int reset_type;
180 long index;
181 size_t count;
182 size_t total_size;
f24c4d47
AB
183 struct page **pages;
184 phys_addr_t *phys;
3fabd628
AB
185 size_t page_bytes_remain;
186};
187
188int __efi_capsule_setup_info(struct capsule_info *cap_info);
189
bb05e4ba
MF
190/*
191 * Allocation types for calls to boottime->allocate_pages.
192 */
193#define EFI_ALLOCATE_ANY_PAGES 0
194#define EFI_ALLOCATE_MAX_ADDRESS 1
195#define EFI_ALLOCATE_ADDRESS 2
196#define EFI_MAX_ALLOCATE_TYPE 3
197
e088a4ad 198typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
1da177e4
LT
199
200/*
201 * Types and defines for Time Services
202 */
203#define EFI_TIME_ADJUST_DAYLIGHT 0x1
204#define EFI_TIME_IN_DAYLIGHT 0x2
205#define EFI_UNSPECIFIED_TIMEZONE 0x07ff
206
207typedef struct {
208 u16 year;
209 u8 month;
210 u8 day;
211 u8 hour;
212 u8 minute;
213 u8 second;
214 u8 pad1;
215 u32 nanosecond;
216 s16 timezone;
217 u8 daylight;
218 u8 pad2;
219} efi_time_t;
220
221typedef struct {
222 u32 resolution;
223 u32 accuracy;
224 u8 sets_to_zero;
225} efi_time_cap_t;
226
677703ce
MF
227typedef struct {
228 efi_table_hdr_t hdr;
229 u32 raise_tpl;
230 u32 restore_tpl;
231 u32 allocate_pages;
232 u32 free_pages;
233 u32 get_memory_map;
234 u32 allocate_pool;
235 u32 free_pool;
236 u32 create_event;
237 u32 set_timer;
238 u32 wait_for_event;
239 u32 signal_event;
240 u32 close_event;
241 u32 check_event;
242 u32 install_protocol_interface;
243 u32 reinstall_protocol_interface;
244 u32 uninstall_protocol_interface;
245 u32 handle_protocol;
246 u32 __reserved;
247 u32 register_protocol_notify;
248 u32 locate_handle;
249 u32 locate_device_path;
250 u32 install_configuration_table;
251 u32 load_image;
252 u32 start_image;
253 u32 exit;
254 u32 unload_image;
255 u32 exit_boot_services;
256 u32 get_next_monotonic_count;
257 u32 stall;
258 u32 set_watchdog_timer;
259 u32 connect_controller;
260 u32 disconnect_controller;
261 u32 open_protocol;
262 u32 close_protocol;
263 u32 open_protocol_information;
264 u32 protocols_per_handle;
265 u32 locate_handle_buffer;
266 u32 locate_protocol;
267 u32 install_multiple_protocol_interfaces;
268 u32 uninstall_multiple_protocol_interfaces;
269 u32 calculate_crc32;
270 u32 copy_mem;
271 u32 set_mem;
272 u32 create_event_ex;
273} __packed efi_boot_services_32_t;
274
f30ca6ba
MF
275/*
276 * EFI Boot Services table
277 */
1786e830
AB
278typedef union {
279 struct {
280 efi_table_hdr_t hdr;
281 void *raise_tpl;
282 void *restore_tpl;
8f24f8c2
AB
283 efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
284 efi_physical_addr_t *);
285 efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
286 unsigned long);
287 efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
288 unsigned long *,
289 unsigned long *, u32 *);
290 efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
291 void **);
292 efi_status_t (__efiapi *free_pool)(void *);
1786e830
AB
293 void *create_event;
294 void *set_timer;
295 void *wait_for_event;
296 void *signal_event;
297 void *close_event;
298 void *check_event;
299 void *install_protocol_interface;
300 void *reinstall_protocol_interface;
301 void *uninstall_protocol_interface;
8f24f8c2
AB
302 efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
303 efi_guid_t *, void **);
1786e830
AB
304 void *__reserved;
305 void *register_protocol_notify;
8f24f8c2
AB
306 efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
307 void *, unsigned long *,
308 efi_handle_t *);
1786e830 309 void *locate_device_path;
8f24f8c2
AB
310 efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
311 void *);
1786e830
AB
312 void *load_image;
313 void *start_image;
314 void *exit;
315 void *unload_image;
8f24f8c2
AB
316 efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
317 unsigned long);
1786e830
AB
318 void *get_next_monotonic_count;
319 void *stall;
320 void *set_watchdog_timer;
321 void *connect_controller;
4444f854
MG
322 efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
323 efi_handle_t,
324 efi_handle_t);
1786e830
AB
325 void *open_protocol;
326 void *close_protocol;
327 void *open_protocol_information;
328 void *protocols_per_handle;
329 void *locate_handle_buffer;
8f24f8c2
AB
330 efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
331 void **);
1786e830
AB
332 void *install_multiple_protocol_interfaces;
333 void *uninstall_multiple_protocol_interfaces;
334 void *calculate_crc32;
335 void *copy_mem;
336 void *set_mem;
337 void *create_event_ex;
338 };
339 efi_boot_services_32_t mixed_mode;
f30ca6ba
MF
340} efi_boot_services_t;
341
dd5fc854
MG
342typedef enum {
343 EfiPciIoWidthUint8,
344 EfiPciIoWidthUint16,
345 EfiPciIoWidthUint32,
346 EfiPciIoWidthUint64,
347 EfiPciIoWidthFifoUint8,
348 EfiPciIoWidthFifoUint16,
349 EfiPciIoWidthFifoUint32,
350 EfiPciIoWidthFifoUint64,
351 EfiPciIoWidthFillUint8,
352 EfiPciIoWidthFillUint16,
353 EfiPciIoWidthFillUint32,
354 EfiPciIoWidthFillUint64,
355 EfiPciIoWidthMaximum
356} EFI_PCI_IO_PROTOCOL_WIDTH;
357
358typedef enum {
359 EfiPciIoAttributeOperationGet,
360 EfiPciIoAttributeOperationSet,
361 EfiPciIoAttributeOperationEnable,
362 EfiPciIoAttributeOperationDisable,
363 EfiPciIoAttributeOperationSupported,
364 EfiPciIoAttributeOperationMaximum
365} EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
366
677703ce
MF
367typedef struct {
368 u32 read;
369 u32 write;
370} efi_pci_io_protocol_access_32_t;
371
1786e830
AB
372typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
373
374typedef
8f24f8c2
AB
375efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
376 EFI_PCI_IO_PROTOCOL_WIDTH,
377 u32 offset,
378 unsigned long count,
379 void *buffer);
1786e830 380
dd5fc854
MG
381typedef struct {
382 void *read;
383 void *write;
384} efi_pci_io_protocol_access_t;
385
1786e830
AB
386typedef struct {
387 efi_pci_io_protocol_cfg_t read;
388 efi_pci_io_protocol_cfg_t write;
389} efi_pci_io_protocol_config_access_t;
390
1786e830
AB
391union efi_pci_io_protocol {
392 struct {
393 void *poll_mem;
394 void *poll_io;
395 efi_pci_io_protocol_access_t mem;
396 efi_pci_io_protocol_access_t io;
397 efi_pci_io_protocol_config_access_t pci;
398 void *copy_mem;
399 void *map;
400 void *unmap;
401 void *allocate_buffer;
402 void *free_buffer;
403 void *flush;
8f24f8c2
AB
404 efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
405 unsigned long *segment_nr,
406 unsigned long *bus_nr,
407 unsigned long *device_nr,
408 unsigned long *func_nr);
1786e830
AB
409 void *attributes;
410 void *get_bar_attributes;
411 void *set_bar_attributes;
412 uint64_t romsize;
413 void *romimage;
414 };
415 struct {
416 u32 poll_mem;
417 u32 poll_io;
418 efi_pci_io_protocol_access_32_t mem;
419 efi_pci_io_protocol_access_32_t io;
420 efi_pci_io_protocol_access_32_t pci;
421 u32 copy_mem;
422 u32 map;
423 u32 unmap;
424 u32 allocate_buffer;
425 u32 free_buffer;
426 u32 flush;
427 u32 get_location;
428 u32 attributes;
429 u32 get_bar_attributes;
430 u32 set_bar_attributes;
431 u64 romsize;
432 u32 romimage;
433 } mixed_mode;
434};
dd5fc854
MG
435
436#define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
437#define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
438#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
439#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
440#define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
441#define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
442#define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
443#define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
444#define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
445#define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
446#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
447#define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
448#define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
449#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
450#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
451#define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
452#define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
453#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
454#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
455
1786e830
AB
456struct efi_dev_path;
457
458typedef union apple_properties_protocol apple_properties_protocol_t;
459
460union apple_properties_protocol {
461 struct {
462 unsigned long version;
8f24f8c2
AB
463 efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
464 struct efi_dev_path *,
465 efi_char16_t *, void *, u32 *);
466 efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
467 struct efi_dev_path *,
468 efi_char16_t *, void *, u32);
469 efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
470 struct efi_dev_path *,
471 efi_char16_t *);
472 efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
473 void *buffer, u32 *);
1786e830
AB
474 };
475 struct {
476 u32 version;
477 u32 get;
478 u32 set;
479 u32 del;
480 u32 get_all;
481 } mixed_mode;
482};
483
33b6d034
TW
484typedef u32 efi_tcg2_event_log_format;
485
1786e830
AB
486typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
487
488union efi_tcg2_protocol {
489 struct {
490 void *get_capability;
8f24f8c2
AB
491 efi_status_t (__efiapi *get_event_log)(efi_handle_t,
492 efi_tcg2_event_log_format,
493 efi_physical_addr_t *,
494 efi_physical_addr_t *,
495 efi_bool_t *);
1786e830
AB
496 void *hash_log_extend_event;
497 void *submit_command;
498 void *get_active_pcr_banks;
499 void *set_active_pcr_banks;
500 void *get_result_of_set_active_pcr_banks;
501 };
502 struct {
503 u32 get_capability;
504 u32 get_event_log;
505 u32 hash_log_extend_event;
506 u32 submit_command;
507 u32 get_active_pcr_banks;
508 u32 set_active_pcr_banks;
509 u32 get_result_of_set_active_pcr_banks;
510 } mixed_mode;
511};
33b6d034 512
1da177e4
LT
513/*
514 * Types and defines for EFI ResetSystem
515 */
516#define EFI_RESET_COLD 0
517#define EFI_RESET_WARM 1
518#define EFI_RESET_SHUTDOWN 2
519
520/*
521 * EFI Runtime Services table
522 */
523#define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
524#define EFI_RUNTIME_SERVICES_REVISION 0x00010000
525
677703ce
MF
526typedef struct {
527 efi_table_hdr_t hdr;
528 u32 get_time;
529 u32 set_time;
530 u32 get_wakeup_time;
531 u32 set_wakeup_time;
532 u32 set_virtual_address_map;
533 u32 convert_pointer;
534 u32 get_variable;
535 u32 get_next_variable;
536 u32 set_variable;
537 u32 get_next_high_mono_count;
538 u32 reset_system;
539 u32 update_capsule;
540 u32 query_capsule_caps;
541 u32 query_variable_info;
542} efi_runtime_services_32_t;
543
1da177e4
LT
544typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
545typedef efi_status_t efi_set_time_t (efi_time_t *tm);
546typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
547 efi_time_t *tm);
548typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
549typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
550 unsigned long *data_size, void *data);
551typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
552 efi_guid_t *vendor);
553typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
f7a2d73f 554 u32 attr, unsigned long data_size,
1da177e4
LT
555 void *data);
556typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
557typedef void efi_reset_system_t (int reset_type, efi_status_t status,
558 unsigned long data_size, efi_char16_t *data);
559typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
560 unsigned long descriptor_size,
561 u32 descriptor_version,
562 efi_memory_desc_t *virtual_map);
3b370237
MG
563typedef efi_status_t efi_query_variable_info_t(u32 attr,
564 u64 *storage_space,
565 u64 *remaining_space,
566 u64 *max_variable_size);
567typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
568 unsigned long count,
569 unsigned long sg_list);
570typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
571 unsigned long count,
572 u64 *max_size,
573 int *reset_type);
ca0e30dc
AB
574typedef efi_status_t efi_query_variable_store_t(u32 attributes,
575 unsigned long size,
576 bool nonblocking);
1da177e4 577
1786e830
AB
578typedef union {
579 struct {
8f24f8c2
AB
580 efi_table_hdr_t hdr;
581 efi_get_time_t __efiapi *get_time;
582 efi_set_time_t __efiapi *set_time;
583 efi_get_wakeup_time_t __efiapi *get_wakeup_time;
584 efi_set_wakeup_time_t __efiapi *set_wakeup_time;
585 efi_set_virtual_address_map_t __efiapi *set_virtual_address_map;
586 void *convert_pointer;
587 efi_get_variable_t __efiapi *get_variable;
588 efi_get_next_variable_t __efiapi *get_next_variable;
589 efi_set_variable_t __efiapi *set_variable;
590 efi_get_next_high_mono_count_t __efiapi *get_next_high_mono_count;
591 efi_reset_system_t __efiapi *reset_system;
592 efi_update_capsule_t __efiapi *update_capsule;
593 efi_query_capsule_caps_t __efiapi *query_capsule_caps;
594 efi_query_variable_info_t __efiapi *query_variable_info;
1786e830
AB
595 };
596 efi_runtime_services_32_t mixed_mode;
c4c39c70
AB
597} efi_runtime_services_t;
598
022ee6c5
AB
599void efi_native_runtime_setup(void);
600
1da177e4 601/*
54fd11fe
PJ
602 * EFI Configuration Table and GUID definitions
603 *
7fb2b43c
IM
604 * These are all defined in a single line to make them easier to
605 * grep for and to see them at a glance - while still having a
606 * similar structure to the definitions in the spec.
607 *
608 * Here's how they are structured:
54fd11fe
PJ
609 *
610 * GUID: 12345678-1234-1234-1234-123456789012
611 * Spec:
612 * #define EFI_SOME_PROTOCOL_GUID \
613 * {0x12345678,0x1234,0x1234,\
614 * {0x12,0x34,0x12,0x34,0x56,0x78,0x90,0x12}}
615 * Here:
7fb2b43c
IM
616 * #define SOME_PROTOCOL_GUID EFI_GUID(0x12345678, 0x1234, 0x1234, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12)
617 * ^ tabs ^extra space
618 *
619 * Note that the 'extra space' separates the values at the same place
620 * where the UEFI SPEC breaks the line.
1da177e4 621 */
7fb2b43c
IM
622#define NULL_GUID EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
623#define MPS_TABLE_GUID EFI_GUID(0xeb9d2d2f, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
624#define ACPI_TABLE_GUID EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
625#define ACPI_20_TABLE_GUID EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
626#define SMBIOS_TABLE_GUID EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
627#define SMBIOS3_TABLE_GUID EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c, 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94)
628#define SAL_SYSTEM_TABLE_GUID EFI_GUID(0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
629#define HCDP_TABLE_GUID EFI_GUID(0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98)
630#define UGA_IO_PROTOCOL_GUID EFI_GUID(0x61a4d49e, 0x6f68, 0x4f1b, 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2)
631#define EFI_GLOBAL_VARIABLE_GUID EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
632#define UV_SYSTEM_TABLE_GUID EFI_GUID(0x3b13a7d4, 0x633e, 0x11dd, 0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93)
633#define LINUX_EFI_CRASH_GUID EFI_GUID(0xcfc8fc79, 0xbe2e, 0x4ddc, 0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0)
634#define LOADED_IMAGE_PROTOCOL_GUID EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
635#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
636#define EFI_UGA_PROTOCOL_GUID EFI_GUID(0x982c298b, 0xf4fa, 0x41cb, 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39)
637#define EFI_PCI_IO_PROTOCOL_GUID EFI_GUID(0x4cf5b200, 0x68b8, 0x4ca5, 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a)
638#define EFI_FILE_INFO_ID EFI_GUID(0x09576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
639#define EFI_SYSTEM_RESOURCE_TABLE_GUID EFI_GUID(0xb122a263, 0x3661, 0x4f68, 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
640#define EFI_FILE_SYSTEM_GUID EFI_GUID(0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
641#define DEVICE_TREE_GUID EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
642#define EFI_PROPERTIES_TABLE_GUID EFI_GUID(0x880aaca3, 0x4adc, 0x4a04, 0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5)
643#define EFI_RNG_PROTOCOL_GUID EFI_GUID(0x3152bca5, 0xeade, 0x433d, 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
568bc4e8 644#define EFI_RNG_ALGORITHM_RAW EFI_GUID(0xe43176d7, 0xb6e8, 0x4827, 0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61)
7fb2b43c
IM
645#define EFI_MEMORY_ATTRIBUTES_TABLE_GUID EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
646#define EFI_CONSOLE_OUT_DEVICE_GUID EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
58c5475a 647#define APPLE_PROPERTIES_PROTOCOL_GUID EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb, 0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
33b6d034 648#define EFI_TCG2_PROTOCOL_GUID EFI_GUID(0x607f766c, 0x7455, 0x42be, 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
fc372064 649
e58910cd
JB
650#define EFI_IMAGE_SECURITY_DATABASE_GUID EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596, 0xa3, 0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f)
651#define EFI_SHIM_LOCK_GUID EFI_GUID(0x605dab50, 0xe046, 0x4300, 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23)
652
5c126ba2
DH
653#define EFI_CERT_SHA256_GUID EFI_GUID(0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28)
654#define EFI_CERT_X509_GUID EFI_GUID(0xa5c059a1, 0x94e4, 0x4aa7, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72)
655#define EFI_CERT_X509_SHA256_GUID EFI_GUID(0x3bd2a492, 0x96c0, 0x4079, 0xb4, 0x20, 0xfc, 0xf9, 0x8e, 0xf1, 0x03, 0xed)
656
801820be
AB
657/*
658 * This GUID is used to pass to the kernel proper the struct screen_info
659 * structure that was populated by the stub based on the GOP protocol instance
660 * associated with ConOut
661 */
7fb2b43c
IM
662#define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID EFI_GUID(0xe03fc20a, 0x85dc, 0x406e, 0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
663#define LINUX_EFI_LOADER_ENTRY_GUID EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf, 0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
63625988 664#define LINUX_EFI_RANDOM_SEED_TABLE_GUID EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2, 0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b)
33b6d034 665#define LINUX_EFI_TPM_EVENT_LOG_GUID EFI_GUID(0xb7799cb0, 0xeca2, 0x4943, 0x96, 0x67, 0x1f, 0xae, 0x07, 0xb7, 0x47, 0xfa)
c46f3405 666#define LINUX_EFI_TPM_FINAL_LOG_GUID EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25)
71e0940d 667#define LINUX_EFI_MEMRESERVE_TABLE_GUID EFI_GUID(0x888eb0c6, 0x8ede, 0x4ff5, 0xa8, 0xf0, 0x9a, 0xee, 0x5c, 0xb9, 0x77, 0xc2)
06f7d4a1 668
1c5fecb6
N
669/* OEM GUIDs */
670#define DELLEMC_EFI_RCI2_TABLE_GUID EFI_GUID(0x2d9f28a2, 0xa886, 0x456a, 0x97, 0xa8, 0xf1, 0x1e, 0xf2, 0x4f, 0xf4, 0x55)
671
1adbfa35
OJ
672typedef struct {
673 efi_guid_t guid;
674 u64 table;
675} efi_config_table_64_t;
676
677typedef struct {
678 efi_guid_t guid;
679 u32 table;
680} efi_config_table_32_t;
681
1786e830
AB
682typedef union {
683 struct {
684 efi_guid_t guid;
f958efe9 685 void *table;
1786e830
AB
686 };
687 efi_config_table_32_t mixed_mode;
1da177e4
LT
688} efi_config_table_t;
689
272686bf
LL
690typedef struct {
691 efi_guid_t guid;
692 const char *name;
693 unsigned long *ptr;
694} efi_config_table_type_t;
695
1da177e4 696#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
1da177e4 697
3b370237
MG
698#define EFI_2_30_SYSTEM_TABLE_REVISION ((2 << 16) | (30))
699#define EFI_2_20_SYSTEM_TABLE_REVISION ((2 << 16) | (20))
700#define EFI_2_10_SYSTEM_TABLE_REVISION ((2 << 16) | (10))
701#define EFI_2_00_SYSTEM_TABLE_REVISION ((2 << 16) | (00))
702#define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10))
703#define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02))
704
1adbfa35
OJ
705typedef struct {
706 efi_table_hdr_t hdr;
707 u64 fw_vendor; /* physical addr of CHAR16 vendor string */
708 u32 fw_revision;
709 u32 __pad1;
710 u64 con_in_handle;
711 u64 con_in;
712 u64 con_out_handle;
713 u64 con_out;
714 u64 stderr_handle;
715 u64 stderr;
716 u64 runtime;
717 u64 boottime;
718 u32 nr_tables;
719 u32 __pad2;
720 u64 tables;
721} efi_system_table_64_t;
722
723typedef struct {
724 efi_table_hdr_t hdr;
725 u32 fw_vendor; /* physical addr of CHAR16 vendor string */
726 u32 fw_revision;
727 u32 con_in_handle;
728 u32 con_in;
729 u32 con_out_handle;
730 u32 con_out;
731 u32 stderr_handle;
732 u32 stderr;
733 u32 runtime;
734 u32 boottime;
735 u32 nr_tables;
736 u32 tables;
737} efi_system_table_32_t;
738
960a8d01
AB
739typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t;
740
1786e830
AB
741typedef union {
742 struct {
743 efi_table_hdr_t hdr;
744 unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */
745 u32 fw_revision;
746 unsigned long con_in_handle;
747 unsigned long con_in;
748 unsigned long con_out_handle;
960a8d01 749 efi_simple_text_output_protocol_t *con_out;
1786e830
AB
750 unsigned long stderr_handle;
751 unsigned long stderr;
752 efi_runtime_services_t *runtime;
753 efi_boot_services_t *boottime;
754 unsigned long nr_tables;
755 unsigned long tables;
756 };
757 efi_system_table_32_t mixed_mode;
1da177e4
LT
758} efi_system_table_t;
759
9479c7ce
MF
760/*
761 * Architecture independent structure for describing a memory map for the
762 * benefit of efi_memmap_init_early(), saving us the need to pass four
763 * parameters.
764 */
765struct efi_memory_map_data {
766 phys_addr_t phys_map;
767 unsigned long size;
768 unsigned long desc_version;
769 unsigned long desc_size;
26c0e44a 770 unsigned long flags;
9479c7ce
MF
771};
772
1da177e4 773struct efi_memory_map {
44511fb9 774 phys_addr_t phys_map;
7ae65fd3
MT
775 void *map;
776 void *map_end;
1da177e4
LT
777 int nr_map;
778 unsigned long desc_version;
7ae65fd3 779 unsigned long desc_size;
26c0e44a
DW
780#define EFI_MEMMAP_LATE (1UL << 0)
781 unsigned long flags;
1da177e4
LT
782};
783
60863c0d
MF
784struct efi_mem_range {
785 struct range range;
786 u64 attribute;
1da177e4
LT
787};
788
0302f71c
MS
789struct efi_fdt_params {
790 u64 system_table;
791 u64 mmap;
792 u32 mmap_size;
793 u32 desc_size;
794 u32 desc_ver;
795};
796
14e900c7
AB
797typedef struct {
798 u32 revision;
799 efi_handle_t parent_handle;
800 efi_system_table_t *system_table;
801 efi_handle_t device_handle;
802 void *file_path;
803 void *reserved;
804 u32 load_options_size;
805 void *load_options;
806 void *image_base;
807 __aligned_u64 image_size;
808 unsigned int image_code_type;
809 unsigned int image_data_type;
810 efi_status_t ( __efiapi *unload)(efi_handle_t image_handle);
811} efi_loaded_image_t;
55839d51
MF
812
813typedef struct {
814 u64 size;
815 u64 file_size;
816 u64 phys_size;
817 efi_time_t create_time;
818 efi_time_t last_access_time;
819 efi_time_t modification_time;
820 __aligned_u64 attribute;
821 efi_char16_t filename[1];
822} efi_file_info_t;
823
14e900c7
AB
824typedef struct efi_file_handle efi_file_handle_t;
825
826struct efi_file_handle {
827 u64 revision;
828 efi_status_t (__efiapi *open)(efi_file_handle_t *,
829 efi_file_handle_t **,
830 efi_char16_t *, u64, u64);
831 efi_status_t (__efiapi *close)(efi_file_handle_t *);
832 void *delete;
833 efi_status_t (__efiapi *read)(efi_file_handle_t *,
834 unsigned long *, void *);
835 void *write;
836 void *get_position;
837 void *set_position;
838 efi_status_t (__efiapi *get_info)(efi_file_handle_t *,
839 efi_guid_t *, unsigned long *,
840 void *);
841 void *set_info;
842 void *flush;
1786e830 843};
55839d51 844
14e900c7 845typedef struct efi_file_io_interface efi_file_io_interface_t;
1786e830 846
14e900c7
AB
847struct efi_file_io_interface {
848 u64 revision;
849 int (__efiapi *open_volume)(efi_file_io_interface_t *,
850 efi_file_handle_t **);
e8bd5ddf 851};
ed37ddff 852
55839d51
MF
853#define EFI_FILE_MODE_READ 0x0000000000000001
854#define EFI_FILE_MODE_WRITE 0x0000000000000002
855#define EFI_FILE_MODE_CREATE 0x8000000000000000
856
bf924863
AB
857typedef struct {
858 u32 version;
859 u32 length;
860 u64 memory_protection_attribute;
861} efi_properties_table_t;
862
863#define EFI_PROPERTIES_TABLE_VERSION 0x00010000
864#define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA 0x1
865
b2c99e3c
BH
866#define EFI_INVALID_TABLE_ADDR (~0UL)
867
a604af07
AB
868typedef struct {
869 u32 version;
870 u32 num_entries;
871 u32 desc_size;
872 u32 reserved;
873 efi_memory_desc_t entry[0];
874} efi_memory_attributes_table_t;
875
5c126ba2
DH
876typedef struct {
877 efi_guid_t signature_owner;
878 u8 signature_data[];
879} efi_signature_data_t;
880
881typedef struct {
882 efi_guid_t signature_type;
883 u32 signature_list_size;
884 u32 signature_header_size;
885 u32 signature_size;
886 u8 signature_header[];
887 /* efi_signature_data_t signatures[][] */
888} efi_signature_list_t;
889
890typedef u8 efi_sha256_hash_t[32];
891
892typedef struct {
893 efi_sha256_hash_t to_be_signed_hash;
894 efi_time_t time_of_revocation;
895} efi_cert_x509_sha256_t;
896
1da177e4
LT
897/*
898 * All runtime access to EFI goes through this structure:
899 */
900extern struct efi {
901 efi_system_table_t *systab; /* EFI system table */
3b370237 902 unsigned int runtime_version; /* Runtime services version */
b2c99e3c
BH
903 unsigned long mps; /* MPS table */
904 unsigned long acpi; /* ACPI table (IA64 ext 0.71) */
905 unsigned long acpi20; /* ACPI table (ACPI 2.0) */
e1ccbbc9
AB
906 unsigned long smbios; /* SMBIOS table (32 bit entry point) */
907 unsigned long smbios3; /* SMBIOS table (64 bit entry point) */
b2c99e3c
BH
908 unsigned long boot_info; /* boot info table */
909 unsigned long hcdp; /* HCDP table */
910 unsigned long uga; /* UGA table */
a0998eb1
DY
911 unsigned long fw_vendor; /* fw_vendor */
912 unsigned long runtime; /* runtime table */
913 unsigned long config_table; /* config tables */
0bb54905 914 unsigned long esrt; /* ESRT table */
bf924863 915 unsigned long properties_table; /* properties table */
a604af07 916 unsigned long mem_attr_table; /* memory attributes table */
63625988 917 unsigned long rng_seed; /* UEFI firmware random seed */
33b6d034 918 unsigned long tpm_log; /* TPM2 Event Log table */
c46f3405 919 unsigned long tpm_final_log; /* TPM2 Final Events Log table */
71e0940d 920 unsigned long mem_reserve; /* Linux EFI memreserve table */
1da177e4
LT
921 efi_get_time_t *get_time;
922 efi_set_time_t *set_time;
923 efi_get_wakeup_time_t *get_wakeup_time;
924 efi_set_wakeup_time_t *set_wakeup_time;
925 efi_get_variable_t *get_variable;
926 efi_get_next_variable_t *get_next_variable;
927 efi_set_variable_t *set_variable;
70d2a3cf 928 efi_set_variable_t *set_variable_nonblocking;
3b370237 929 efi_query_variable_info_t *query_variable_info;
d3cac1f8 930 efi_query_variable_info_t *query_variable_info_nonblocking;
3b370237
MG
931 efi_update_capsule_t *update_capsule;
932 efi_query_capsule_caps_t *query_capsule_caps;
1da177e4
LT
933 efi_get_next_high_mono_count_t *get_next_high_mono_count;
934 efi_reset_system_t *reset_system;
884f4f66 935 struct efi_memory_map memmap;
3e909599 936 unsigned long flags;
1da177e4
LT
937} efi;
938
7e904a91
SP
939extern struct mm_struct efi_mm;
940
1da177e4
LT
941static inline int
942efi_guidcmp (efi_guid_t left, efi_guid_t right)
943{
944 return memcmp(&left, &right, sizeof (efi_guid_t));
945}
946
947static inline char *
26e02272 948efi_guid_to_str(efi_guid_t *guid, char *out)
1da177e4 949{
925ede0b 950 sprintf(out, "%pUl", guid->b);
1da177e4
LT
951 return out;
952}
953
954extern void efi_init (void);
955extern void *efi_get_pal_addr (void);
956extern void efi_map_pal_code (void);
1da177e4 957extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
70f4f935 958extern void efi_gettimeofday (struct timespec64 *ts);
1da177e4 959extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */
78510792 960#ifdef CONFIG_X86
ca0e30dc
AB
961extern efi_status_t efi_query_variable_store(u32 attributes,
962 unsigned long size,
963 bool nonblocking);
78510792 964#else
a6e4d5a0 965
ca0e30dc
AB
966static inline efi_status_t efi_query_variable_store(u32 attributes,
967 unsigned long size,
968 bool nonblocking)
a6e4d5a0
MF
969{
970 return EFI_SUCCESS;
971}
78510792 972#endif
7bc90e01 973extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
9479c7ce 974
20b1e22d 975extern phys_addr_t __init efi_memmap_alloc(unsigned int num_entries);
9479c7ce 976extern int __init efi_memmap_init_early(struct efi_memory_map_data *data);
dca0f971 977extern int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size);
9479c7ce 978extern void __init efi_memmap_unmap(void);
c45f4da3 979extern int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map);
60863c0d
MF
980extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
981 struct range *range);
982extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
983 void *buf, struct efi_mem_range *mem);
9479c7ce 984
272686bf 985extern int efi_config_init(efi_config_table_type_t *arch_tables);
3846c158 986#ifdef CONFIG_EFI_ESRT
0bb54905 987extern void __init efi_esrt_init(void);
3846c158
PJ
988#else
989static inline void efi_esrt_init(void) { }
990#endif
7bb68410
AB
991extern int efi_config_parse_tables(void *config_tables, int count, int sz,
992 efi_config_table_type_t *arch_tables);
1da177e4 993extern u64 efi_get_iobase (void);
f99afd08 994extern int efi_mem_type(unsigned long phys_addr);
1da177e4 995extern u64 efi_mem_attributes (unsigned long phys_addr);
32e62c63 996extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
1da177e4 997extern int __init efi_uart_console_only (void);
0bb54905
PJ
998extern u64 efi_mem_desc_end(efi_memory_desc_t *md);
999extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
816e7612 1000extern void efi_mem_reserve(phys_addr_t addr, u64 size);
a23d3bb0 1001extern int efi_mem_reserve_persistent(phys_addr_t addr, u64 size);
1da177e4 1002extern void efi_initialize_iomem_resources(struct resource *code_resource,
00bf4098 1003 struct resource *data_resource, struct resource *bss_resource);
7968c0e3 1004extern int efi_get_fdt_params(struct efi_fdt_params *params);
0bb54905 1005extern struct kobject *efi_kobj;
1da177e4 1006
44be28e9 1007extern int efi_reboot_quirk_mode;
0c5ed61a
MF
1008extern bool efi_poweroff_required(void);
1009
0f96a99d
TI
1010#ifdef CONFIG_EFI_FAKE_MEMMAP
1011extern void __init efi_fake_memmap(void);
1012#else
1013static inline void efi_fake_memmap(void) { }
1014#endif
1015
10f0d2f5
AB
1016/*
1017 * efi_memattr_perm_setter - arch specific callback function passed into
1018 * efi_memattr_apply_permissions() that updates the
1019 * mapping permissions described by the second
1020 * argument in the page tables referred to by the
1021 * first argument.
1022 */
1023typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *);
1024
1025extern int efi_memattr_init(void);
1026extern int efi_memattr_apply_permissions(struct mm_struct *mm,
1027 efi_memattr_perm_setter fn);
1028
02e43c2d
BH
1029/*
1030 * efi_early_memdesc_ptr - get the n-th EFI memmap descriptor
1031 * @map: the start of efi memmap
1032 * @desc_size: the size of space for each EFI memmap descriptor
1033 * @n: the index of efi memmap descriptor
1034 *
1035 * EFI boot service provides the GetMemoryMap() function to get a copy of the
1036 * current memory map which is an array of memory descriptors, each of
1037 * which describes a contiguous block of memory. It also gets the size of the
1038 * map, and the size of each descriptor, etc.
1039 *
1040 * Note that per section 6.2 of UEFI Spec 2.6 Errata A, the returned size of
1041 * each descriptor might not be equal to sizeof(efi_memory_memdesc_t),
1042 * since efi_memory_memdesc_t may be extended in the future. Thus the OS
1043 * MUST use the returned size of the descriptor to find the start of each
1044 * efi_memory_memdesc_t in the memory map array. This should only be used
1045 * during bootup since for_each_efi_memory_desc_xxx() is available after the
1046 * kernel initializes the EFI subsystem to set up struct efi_memory_map.
1047 */
1048#define efi_early_memdesc_ptr(map, desc_size, n) \
1049 (efi_memory_desc_t *)((void *)(map) + ((n) * (desc_size)))
1050
e885cd80 1051/* Iterate through an efi_memory_map */
78ce248f 1052#define for_each_efi_memory_desc_in_map(m, md) \
e885cd80 1053 for ((md) = (m)->map; \
d4c4fed0 1054 (md) && ((void *)(md) + (m)->desc_size) <= (m)->map_end; \
e885cd80
MS
1055 (md) = (void *)(md) + (m)->desc_size)
1056
78ce248f
MF
1057/**
1058 * for_each_efi_memory_desc - iterate over descriptors in efi.memmap
1059 * @md: the efi_memory_desc_t * iterator
1060 *
1061 * Once the loop finishes @md must not be accessed.
1062 */
1063#define for_each_efi_memory_desc(md) \
884f4f66 1064 for_each_efi_memory_desc_in_map(&efi.memmap, md)
78ce248f 1065
98d2a6ca
LE
1066/*
1067 * Format an EFI memory descriptor's type and attributes to a user-provided
1068 * character buffer, as per snprintf(), and return the buffer.
1069 */
1070char * __init efi_md_typeattr_format(char *buf, size_t size,
1071 const efi_memory_desc_t *md);
1072
0bc9ae39
DH
1073
1074typedef void (*efi_element_handler_t)(const char *source,
1075 const void *element_data,
1076 size_t element_size);
1077extern int __init parse_efi_signature_list(
1078 const char *source,
1079 const void *data, size_t size,
1080 efi_element_handler_t (*get_handler_for_guid)(const efi_guid_t *));
1081
1da177e4
LT
1082/**
1083 * efi_range_is_wc - check the WC bit on an address range
1084 * @start: starting kvirt address
1085 * @len: length of range
1086 *
1087 * Consult the EFI memory map and make sure it's ok to set this range WC.
1088 * Returns true or false.
1089 */
1090static inline int efi_range_is_wc(unsigned long start, unsigned long len)
1091{
986a80d5 1092 unsigned long i;
1da177e4
LT
1093
1094 for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) {
1095 unsigned long paddr = __pa(start + i);
1096 if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC))
1097 return 0;
1098 }
1099 /* The range checked out */
1100 return 1;
1101}
1102
1103#ifdef CONFIG_EFI_PCDP
1104extern int __init efi_setup_pcdp_console(char *);
1105#endif
1106
1107/*
83e68189
MF
1108 * We play games with efi_enabled so that the compiler will, if
1109 * possible, remove EFI-related code altogether.
1da177e4 1110 */
83e68189 1111#define EFI_BOOT 0 /* Were we booted from EFI? */
83e68189
MF
1112#define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */
1113#define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */
1114#define EFI_MEMMAP 4 /* Can we use EFI memory map? */
1115#define EFI_64BIT 5 /* Is the firmware 64-bit? */
9f27bc54
DK
1116#define EFI_PARAVIRT 6 /* Access is via a paravirt interface */
1117#define EFI_ARCH_1 7 /* First arch-specific bit */
fed6cefe 1118#define EFI_DBG 8 /* Print additional debug info at runtime */
a1041713 1119#define EFI_NX_PE_DATA 9 /* Can runtime data regions be mapped non-executable? */
a19ebf59 1120#define EFI_MEM_ATTR 10 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
b617c526 1121#define EFI_MEM_NO_SOFT_RESERVE 11 /* Is the kernel configured to ignore soft reservations? */
83e68189 1122
1da177e4 1123#ifdef CONFIG_EFI
3e909599
MF
1124/*
1125 * Test whether the above EFI_* bits are enabled.
1126 */
1127static inline bool efi_enabled(int feature)
1128{
1129 return test_bit(feature, &efi.flags) != 0;
1130}
8562c99c 1131extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
b617c526
DW
1132
1133bool __pure __efi_soft_reserve_enabled(void);
1134
1135static inline bool __pure efi_soft_reserve_enabled(void)
1136{
1137 return IS_ENABLED(CONFIG_EFI_SOFT_RESERVE)
1138 && __efi_soft_reserve_enabled();
1139}
1da177e4 1140#else
3e909599 1141static inline bool efi_enabled(int feature)
83e68189 1142{
3e909599 1143 return false;
83e68189 1144}
8562c99c
MF
1145static inline void
1146efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
87615a34
MF
1147
1148static inline bool
1149efi_capsule_pending(int *reset_type)
1150{
1151 return false;
1152}
b617c526
DW
1153
1154static inline bool efi_soft_reserve_enabled(void)
1155{
1156 return false;
1157}
1da177e4
LT
1158#endif
1159
806b0351
MF
1160extern int efi_status_to_err(efi_status_t status);
1161
1da177e4
LT
1162/*
1163 * Variable Attributes
1164 */
1165#define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001
1166#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
1167#define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004
41b3254c
MG
1168#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
1169#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
1170#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
1171#define EFI_VARIABLE_APPEND_WRITE 0x0000000000000040
1172
1173#define EFI_VARIABLE_MASK (EFI_VARIABLE_NON_VOLATILE | \
1174 EFI_VARIABLE_BOOTSERVICE_ACCESS | \
1175 EFI_VARIABLE_RUNTIME_ACCESS | \
1176 EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
1177 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
1178 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
1179 EFI_VARIABLE_APPEND_WRITE)
e14ab23d
MF
1180/*
1181 * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
1182 * not including trailing NUL
1183 */
ba7e34b1 1184#define EFI_VARIABLE_GUID_LEN UUID_STRING_LEN
e14ab23d 1185
e2527a7c
MF
1186/*
1187 * The type of search to perform when calling boottime->locate_handle
1188 */
1189#define EFI_LOCATE_ALL_HANDLES 0
1190#define EFI_LOCATE_BY_REGISTER_NOTIFY 1
1191#define EFI_LOCATE_BY_PROTOCOL 2
1192
1da177e4
LT
1193/*
1194 * EFI Device Path information
1195 */
1196#define EFI_DEV_HW 0x01
1197#define EFI_DEV_PCI 1
1198#define EFI_DEV_PCCARD 2
1199#define EFI_DEV_MEM_MAPPED 3
1200#define EFI_DEV_VENDOR 4
1201#define EFI_DEV_CONTROLLER 5
1202#define EFI_DEV_ACPI 0x02
1203#define EFI_DEV_BASIC_ACPI 1
1204#define EFI_DEV_EXPANDED_ACPI 2
1205#define EFI_DEV_MSG 0x03
1206#define EFI_DEV_MSG_ATAPI 1
1207#define EFI_DEV_MSG_SCSI 2
1208#define EFI_DEV_MSG_FC 3
1209#define EFI_DEV_MSG_1394 4
1210#define EFI_DEV_MSG_USB 5
1211#define EFI_DEV_MSG_USB_CLASS 15
1212#define EFI_DEV_MSG_I20 6
1213#define EFI_DEV_MSG_MAC 11
1214#define EFI_DEV_MSG_IPV4 12
1215#define EFI_DEV_MSG_IPV6 13
1216#define EFI_DEV_MSG_INFINIBAND 9
1217#define EFI_DEV_MSG_UART 14
1218#define EFI_DEV_MSG_VENDOR 10
1219#define EFI_DEV_MEDIA 0x04
1220#define EFI_DEV_MEDIA_HARD_DRIVE 1
1221#define EFI_DEV_MEDIA_CDROM 2
1222#define EFI_DEV_MEDIA_VENDOR 3
1223#define EFI_DEV_MEDIA_FILE 4
1224#define EFI_DEV_MEDIA_PROTOCOL 5
1225#define EFI_DEV_BIOS_BOOT 0x05
1226#define EFI_DEV_END_PATH 0x7F
1227#define EFI_DEV_END_PATH2 0xFF
1228#define EFI_DEV_END_INSTANCE 0x01
1229#define EFI_DEV_END_ENTIRE 0xFF
1230
1231struct efi_generic_dev_path {
1232 u8 type;
1233 u8 sub_type;
1234 u16 length;
1235} __attribute ((packed));
1236
46cd4b75
LW
1237struct efi_dev_path {
1238 u8 type; /* can be replaced with unnamed */
1239 u8 sub_type; /* struct efi_generic_dev_path; */
1240 u16 length; /* once we've moved to -std=c11 */
1241 union {
1242 struct {
1243 u32 hid;
1244 u32 uid;
1245 } acpi;
1246 struct {
1247 u8 fn;
1248 u8 dev;
1249 } pci;
1250 };
1251} __attribute ((packed));
1252
1253#if IS_ENABLED(CONFIG_EFI_DEV_PATH_PARSER)
1254struct device *efi_get_device_by_path(struct efi_dev_path **node, size_t *len);
1255#endif
1256
4a3575fd
HY
1257static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
1258{
1259 *npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
1260 *addr &= PAGE_MASK;
1261}
1262
4fc756bd
MW
1263/*
1264 * EFI Variable support.
1265 *
1266 * Different firmware drivers can expose their EFI-like variables using
1267 * the following.
1268 */
1269
1270struct efivar_operations {
1271 efi_get_variable_t *get_variable;
1272 efi_get_next_variable_t *get_next_variable;
1273 efi_set_variable_t *set_variable;
70d2a3cf 1274 efi_set_variable_t *set_variable_nonblocking;
a6e4d5a0 1275 efi_query_variable_store_t *query_variable_store;
4fc756bd
MW
1276};
1277
1278struct efivars {
4fc756bd 1279 struct kset *kset;
605e70c7 1280 struct kobject *kobject;
4fc756bd
MW
1281 const struct efivar_operations *ops;
1282};
1283
e14ab23d
MF
1284/*
1285 * The maximum size of VariableName + Data = 1024
1286 * Therefore, it's reasonable to save that much
1287 * space in each part of the structure,
1288 * and we use a page for reading/writing.
1289 */
1290
a5d92ad3
MF
1291#define EFI_VAR_NAME_LEN 1024
1292
e14ab23d 1293struct efi_variable {
a5d92ad3 1294 efi_char16_t VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)];
e14ab23d
MF
1295 efi_guid_t VendorGuid;
1296 unsigned long DataSize;
1297 __u8 Data[1024];
1298 efi_status_t Status;
1299 __u32 Attributes;
1300} __attribute__((packed));
1301
1302struct efivar_entry {
1303 struct efi_variable var;
1304 struct list_head list;
1305 struct kobject kobj;
e0d59733
SA
1306 bool scanning;
1307 bool deleting;
e14ab23d
MF
1308};
1309
1786e830
AB
1310union efi_simple_text_output_protocol {
1311 struct {
1312 void *reset;
8f24f8c2
AB
1313 efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
1314 efi_char16_t *);
1786e830
AB
1315 void *test_string;
1316 };
1317 struct {
1318 u32 reset;
1319 u32 output_string;
1320 u32 test_string;
1321 } mixed_mode;
ed37ddff
RF
1322};
1323
fc372064
AB
1324#define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0
1325#define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1
1326#define PIXEL_BIT_MASK 2
1327#define PIXEL_BLT_ONLY 3
1328#define PIXEL_FORMAT_MAX 4
1329
44c84b4a 1330typedef struct {
fc372064
AB
1331 u32 red_mask;
1332 u32 green_mask;
1333 u32 blue_mask;
1334 u32 reserved_mask;
44c84b4a 1335} efi_pixel_bitmask_t;
fc372064 1336
44c84b4a 1337typedef struct {
fc372064
AB
1338 u32 version;
1339 u32 horizontal_resolution;
1340 u32 vertical_resolution;
1341 int pixel_format;
44c84b4a 1342 efi_pixel_bitmask_t pixel_information;
fc372064 1343 u32 pixels_per_scan_line;
44c84b4a 1344} efi_graphics_output_mode_info_t;
fc372064 1345
1786e830
AB
1346typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
1347
1348union efi_graphics_output_protocol_mode {
1349 struct {
1350 u32 max_mode;
1351 u32 mode;
1352 efi_graphics_output_mode_info_t *info;
1353 unsigned long size_of_info;
1354 efi_physical_addr_t frame_buffer_base;
1355 unsigned long frame_buffer_size;
1356 };
1357 struct {
1358 u32 max_mode;
1359 u32 mode;
1360 u32 info;
1361 u32 size_of_info;
1362 u64 frame_buffer_base;
1363 u32 frame_buffer_size;
1364 } mixed_mode;
1365};
fc372064 1366
1786e830
AB
1367typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
1368
1369union efi_graphics_output_protocol {
1370 struct {
1371 void *query_mode;
1372 void *set_mode;
1373 void *blt;
1374 efi_graphics_output_protocol_mode_t *mode;
1375 };
1376 struct {
1377 u32 query_mode;
1378 u32 set_mode;
1379 u32 blt;
1380 u32 mode;
1381 } mixed_mode;
1382};
fc372064 1383
04851772
MF
1384extern struct list_head efivar_sysfs_list;
1385
1386static inline void
1387efivar_unregister(struct efivar_entry *var)
1388{
1389 kobject_put(&var->kobj);
1390}
1391
e14ab23d 1392int efivars_register(struct efivars *efivars,
4fc756bd 1393 const struct efivar_operations *ops,
e14ab23d
MF
1394 struct kobject *kobject);
1395int efivars_unregister(struct efivars *efivars);
1396struct kobject *efivars_kobject(void);
1397
1398int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
1cfd6316 1399 void *data, bool duplicates, struct list_head *head);
e14ab23d 1400
21b3ddd3
SC
1401int efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
1402int efivar_entry_remove(struct efivar_entry *entry);
e14ab23d
MF
1403
1404int __efivar_entry_delete(struct efivar_entry *entry);
1405int efivar_entry_delete(struct efivar_entry *entry);
1406
e14ab23d 1407int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
8a415b8c
MF
1408int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1409 unsigned long *size, void *data);
e14ab23d
MF
1410int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1411 unsigned long *size, void *data);
1412int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
1413 unsigned long size, void *data, struct list_head *head);
1414int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
1415 unsigned long *size, void *data, bool *set);
1416int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
1417 bool block, unsigned long size, void *data);
1418
21b3ddd3 1419int efivar_entry_iter_begin(void);
e14ab23d
MF
1420void efivar_entry_iter_end(void);
1421
1422int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1423 struct list_head *head, void *data,
1424 struct efivar_entry **prev);
1425int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1426 struct list_head *head, void *data);
1427
1428struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
1429 struct list_head *head, bool remove);
1430
8282f5d9
PJ
1431bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
1432 unsigned long data_size);
ed8b0de5
PJ
1433bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
1434 size_t len);
e14ab23d 1435
a9499fa7 1436extern struct work_struct efivar_work;
04851772
MF
1437void efivar_run_worker(void);
1438
a9499fa7 1439#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
e14ab23d 1440int efivars_sysfs_init(void);
4fc756bd 1441
e0d59733
SA
1442#define EFIVARS_DATA_SIZE_MAX 1024
1443
4fc756bd 1444#endif /* CONFIG_EFI_VARS */
f0133f3c
MF
1445extern bool efi_capsule_pending(int *reset_type);
1446
1447extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
1448 size_t size, int *reset);
1449
1450extern int efi_capsule_update(efi_capsule_header_t *capsule,
2a457fb3 1451 phys_addr_t *pages);
4fc756bd 1452
926172d4
DY
1453#ifdef CONFIG_EFI_RUNTIME_MAP
1454int efi_runtime_map_init(struct kobject *);
6a2c20e7
VG
1455int efi_get_runtime_map_size(void);
1456int efi_get_runtime_map_desc_size(void);
1457int efi_runtime_map_copy(void *buf, size_t bufsz);
926172d4
DY
1458#else
1459static inline int efi_runtime_map_init(struct kobject *kobj)
1460{
1461 return 0;
1462}
1463
6a2c20e7
VG
1464static inline int efi_get_runtime_map_size(void)
1465{
1466 return 0;
1467}
1468
1469static inline int efi_get_runtime_map_desc_size(void)
1470{
1471 return 0;
1472}
1473
1474static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
1475{
1476 return 0;
1477}
1478
926172d4
DY
1479#endif
1480
bd669475
AB
1481/* prototypes shared between arch specific and generic stub code */
1482
8173ec79 1483void efi_printk(char *str);
bd669475 1484
cd33a5c1 1485void efi_free(unsigned long size, unsigned long addr);
bd669475 1486
cd33a5c1 1487char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
bd669475 1488
cd33a5c1 1489efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
bd669475 1490
cd33a5c1 1491efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
220dd769
KS
1492 unsigned long *addr, unsigned long min);
1493
1494static inline
cd33a5c1 1495efi_status_t efi_low_alloc(unsigned long size, unsigned long align,
220dd769
KS
1496 unsigned long *addr)
1497{
1498 /*
1499 * Don't allocate at 0x0. It will confuse code that
1500 * checks pointers against NULL. Skip the first 8
1501 * bytes so we start at a nice even number.
1502 */
cd33a5c1 1503 return efi_low_alloc_above(size, align, addr, 0x8);
220dd769 1504}
bd669475 1505
cd33a5c1 1506efi_status_t efi_high_alloc(unsigned long size, unsigned long align,
bd669475
AB
1507 unsigned long *addr, unsigned long max);
1508
cd33a5c1 1509efi_status_t efi_relocate_kernel(unsigned long *image_addr,
bd669475
AB
1510 unsigned long image_size,
1511 unsigned long alloc_size,
1512 unsigned long preferred_addr,
220dd769
KS
1513 unsigned long alignment,
1514 unsigned long min_addr);
bd669475 1515
cd33a5c1 1516efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
bd669475
AB
1517 char *cmd_line, char *option_string,
1518 unsigned long max_addr,
1519 unsigned long *load_addr,
1520 unsigned long *load_size);
1521
60f38de7 1522efi_status_t efi_parse_options(char const *cmdline);
5a17dae4 1523
cd33a5c1 1524efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
2c23b73c
AB
1525 unsigned long size);
1526
0082517f
JHP
1527#ifdef CONFIG_EFI
1528extern bool efi_runtime_disabled(void);
1529#else
1530static inline bool efi_runtime_disabled(void) { return true; }
1531#endif
1532
80e75596 1533extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
13b210dd 1534extern unsigned long efi_call_virt_save_flags(void);
80e75596 1535
de8cb458
DH
1536enum efi_secureboot_mode {
1537 efi_secureboot_mode_unset,
1538 efi_secureboot_mode_unknown,
1539 efi_secureboot_mode_disabled,
1540 efi_secureboot_mode_enabled,
1541};
cd33a5c1 1542enum efi_secureboot_mode efi_get_secureboot(void);
de8cb458 1543
ccc829ba 1544#ifdef CONFIG_RESET_ATTACK_MITIGATION
cd33a5c1 1545void efi_enable_reset_attack_mitigation(void);
ccc829ba
MG
1546#else
1547static inline void
cd33a5c1 1548efi_enable_reset_attack_mitigation(void) { }
ccc829ba
MG
1549#endif
1550
cd33a5c1 1551efi_status_t efi_random_get_seed(void);
0d959814 1552
cd33a5c1 1553void efi_retrieve_tpm2_eventlog(void);
33b6d034 1554
80e75596
AT
1555/*
1556 * Arch code can implement the following three template macros, avoiding
1557 * reptition for the void/non-void return cases of {__,}efi_call_virt():
1558 *
1559 * * arch_efi_call_virt_setup()
1560 *
1561 * Sets up the environment for the call (e.g. switching page tables,
1562 * allowing kernel-mode use of floating point, if required).
1563 *
1564 * * arch_efi_call_virt()
1565 *
1566 * Performs the call. The last expression in the macro must be the call
1567 * itself, allowing the logic to be shared by the void and non-void
1568 * cases.
1569 *
1570 * * arch_efi_call_virt_teardown()
1571 *
1572 * Restores the usual kernel environment once the call has returned.
1573 */
1574
1575#define efi_call_virt_pointer(p, f, args...) \
1576({ \
1577 efi_status_t __s; \
1578 unsigned long __flags; \
1579 \
1580 arch_efi_call_virt_setup(); \
1581 \
13b210dd 1582 __flags = efi_call_virt_save_flags(); \
80e75596
AT
1583 __s = arch_efi_call_virt(p, f, args); \
1584 efi_call_virt_check_flags(__flags, __stringify(f)); \
1585 \
1586 arch_efi_call_virt_teardown(); \
1587 \
1588 __s; \
1589})
1590
1591#define __efi_call_virt_pointer(p, f, args...) \
1592({ \
1593 unsigned long __flags; \
1594 \
1595 arch_efi_call_virt_setup(); \
1596 \
13b210dd 1597 __flags = efi_call_virt_save_flags(); \
80e75596
AT
1598 arch_efi_call_virt(p, f, args); \
1599 efi_call_virt_check_flags(__flags, __stringify(f)); \
1600 \
1601 arch_efi_call_virt_teardown(); \
1602})
1603
fc07716b 1604typedef efi_status_t (*efi_exit_boot_map_processing)(
fc07716b
JH
1605 struct efi_boot_memmap *map,
1606 void *priv);
1607
cd33a5c1 1608efi_status_t efi_exit_boot_services(void *handle,
fc07716b
JH
1609 struct efi_boot_memmap *map,
1610 void *priv,
1611 efi_exit_boot_map_processing priv_func);
63625988 1612
c2ceb5fd
AB
1613#define EFI_RANDOM_SEED_SIZE 64U
1614
63625988
AB
1615struct linux_efi_random_seed {
1616 u32 size;
1617 u8 bits[];
1618};
1619
33b6d034
TW
1620struct linux_efi_tpm_eventlog {
1621 u32 size;
166a2809 1622 u32 final_events_preboot_size;
33b6d034
TW
1623 u8 version;
1624 u8 log[];
1625};
1626
1627extern int efi_tpm_eventlog_init(void);
1628
c46f3405
MG
1629struct efi_tcg2_final_events_table {
1630 u64 version;
1631 u64 nr_events;
1632 u8 events[];
1633};
1634extern int efi_tpm_final_log_size;
1635
1c5fecb6
N
1636extern unsigned long rci2_table_phys;
1637
3425d934
SP
1638/*
1639 * efi_runtime_service() function identifiers.
1640 * "NONE" is used by efi_recover_from_page_fault() to check if the page
1641 * fault happened while executing an efi runtime service.
1642 */
9dbbedaa 1643enum efi_rts_ids {
5c418dc7
AR
1644 EFI_NONE,
1645 EFI_GET_TIME,
1646 EFI_SET_TIME,
1647 EFI_GET_WAKEUP_TIME,
1648 EFI_SET_WAKEUP_TIME,
1649 EFI_GET_VARIABLE,
1650 EFI_GET_NEXT_VARIABLE,
1651 EFI_SET_VARIABLE,
1652 EFI_QUERY_VARIABLE_INFO,
1653 EFI_GET_NEXT_HIGH_MONO_COUNT,
1654 EFI_RESET_SYSTEM,
1655 EFI_UPDATE_CAPSULE,
1656 EFI_QUERY_CAPSULE_CAPS,
9dbbedaa
SP
1657};
1658
1659/*
1660 * efi_runtime_work: Details of EFI Runtime Service work
1661 * @arg<1-5>: EFI Runtime Service function arguments
1662 * @status: Status of executing EFI Runtime Service
1663 * @efi_rts_id: EFI Runtime Service function identifier
1664 * @efi_rts_comp: Struct used for handling completions
1665 */
1666struct efi_runtime_work {
1667 void *arg1;
1668 void *arg2;
1669 void *arg3;
1670 void *arg4;
1671 void *arg5;
1672 efi_status_t status;
1673 struct work_struct work;
1674 enum efi_rts_ids efi_rts_id;
1675 struct completion efi_rts_comp;
1676};
1677
1678extern struct efi_runtime_work efi_rts_work;
1679
3eb420e7
SP
1680/* Workqueue to queue EFI Runtime Services */
1681extern struct workqueue_struct *efi_rts_wq;
1682
71e0940d 1683struct linux_efi_memreserve {
5f0b0ecf
AB
1684 int size; // allocated size of the array
1685 atomic_t count; // number of entries used
1686 phys_addr_t next; // pa of next struct instance
1687 struct {
1688 phys_addr_t base;
1689 phys_addr_t size;
1690 } entry[0];
71e0940d
AB
1691};
1692
5f0b0ecf
AB
1693#define EFI_MEMRESERVE_SIZE(count) (sizeof(struct linux_efi_memreserve) + \
1694 (count) * sizeof(((struct linux_efi_memreserve *)0)->entry[0]))
1695
80424b02
AB
1696#define EFI_MEMRESERVE_COUNT(size) (((size) - sizeof(struct linux_efi_memreserve)) \
1697 / sizeof(((struct linux_efi_memreserve *)0)->entry[0]))
1698
4444f854
MG
1699void efi_pci_disable_bridge_busmaster(void);
1700
1da177e4 1701#endif /* _LINUX_EFI_H */