xref: /openbmc/linux/include/linux/efi.h (revision a604af075a3226adaff84b7026876f0c6dfe9f52)
11da177e4SLinus Torvalds #ifndef _LINUX_EFI_H
21da177e4SLinus Torvalds #define _LINUX_EFI_H
31da177e4SLinus Torvalds 
41da177e4SLinus Torvalds /*
51da177e4SLinus Torvalds  * Extensible Firmware Interface
61da177e4SLinus Torvalds  * Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  * Copyright (C) 1999 VA Linux Systems
91da177e4SLinus Torvalds  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
101da177e4SLinus Torvalds  * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
111da177e4SLinus Torvalds  *	David Mosberger-Tang <davidm@hpl.hp.com>
121da177e4SLinus Torvalds  *	Stephane Eranian <eranian@hpl.hp.com>
131da177e4SLinus Torvalds  */
141da177e4SLinus Torvalds #include <linux/init.h>
151da177e4SLinus Torvalds #include <linux/string.h>
161da177e4SLinus Torvalds #include <linux/time.h>
171da177e4SLinus Torvalds #include <linux/types.h>
181da177e4SLinus Torvalds #include <linux/proc_fs.h>
191da177e4SLinus Torvalds #include <linux/rtc.h>
201da177e4SLinus Torvalds #include <linux/ioport.h>
214a3575fdSHuang, Ying #include <linux/pfn.h>
225ee9c198SMatthew Garrett #include <linux/pstore.h>
238562c99cSMatt Fleming #include <linux/reboot.h>
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds #include <asm/page.h>
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds #define EFI_SUCCESS		0
281da177e4SLinus Torvalds #define EFI_LOAD_ERROR          ( 1 | (1UL << (BITS_PER_LONG-1)))
291da177e4SLinus Torvalds #define EFI_INVALID_PARAMETER	( 2 | (1UL << (BITS_PER_LONG-1)))
301da177e4SLinus Torvalds #define EFI_UNSUPPORTED		( 3 | (1UL << (BITS_PER_LONG-1)))
311da177e4SLinus Torvalds #define EFI_BAD_BUFFER_SIZE     ( 4 | (1UL << (BITS_PER_LONG-1)))
321da177e4SLinus Torvalds #define EFI_BUFFER_TOO_SMALL	( 5 | (1UL << (BITS_PER_LONG-1)))
335d9db883SMatthew Garrett #define EFI_NOT_READY		( 6 | (1UL << (BITS_PER_LONG-1)))
345d9db883SMatthew Garrett #define EFI_DEVICE_ERROR	( 7 | (1UL << (BITS_PER_LONG-1)))
355d9db883SMatthew Garrett #define EFI_WRITE_PROTECTED	( 8 | (1UL << (BITS_PER_LONG-1)))
365d9db883SMatthew Garrett #define EFI_OUT_OF_RESOURCES	( 9 | (1UL << (BITS_PER_LONG-1)))
371da177e4SLinus Torvalds #define EFI_NOT_FOUND		(14 | (1UL << (BITS_PER_LONG-1)))
385d9db883SMatthew Garrett #define EFI_SECURITY_VIOLATION	(26 | (1UL << (BITS_PER_LONG-1)))
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds typedef unsigned long efi_status_t;
411da177e4SLinus Torvalds typedef u8 efi_bool_t;
421da177e4SLinus Torvalds typedef u16 efi_char16_t;		/* UNICODE character */
43ed37ddffSRoy Franz typedef u64 efi_physical_addr_t;
44ed37ddffSRoy Franz typedef void *efi_handle_t;
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds typedef struct {
481da177e4SLinus Torvalds 	u8 b[16];
491da177e4SLinus Torvalds } efi_guid_t;
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
521da177e4SLinus Torvalds ((efi_guid_t) \
531da177e4SLinus Torvalds {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
541da177e4SLinus Torvalds   (b) & 0xff, ((b) >> 8) & 0xff, \
551da177e4SLinus Torvalds   (c) & 0xff, ((c) >> 8) & 0xff, \
561da177e4SLinus Torvalds   (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds /*
591da177e4SLinus Torvalds  * Generic EFI table header
601da177e4SLinus Torvalds  */
611da177e4SLinus Torvalds typedef	struct {
621da177e4SLinus Torvalds 	u64 signature;
631da177e4SLinus Torvalds 	u32 revision;
641da177e4SLinus Torvalds 	u32 headersize;
651da177e4SLinus Torvalds 	u32 crc32;
661da177e4SLinus Torvalds 	u32 reserved;
671da177e4SLinus Torvalds } efi_table_hdr_t;
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds /*
701da177e4SLinus Torvalds  * Memory map descriptor:
711da177e4SLinus Torvalds  */
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds /* Memory types: */
741da177e4SLinus Torvalds #define EFI_RESERVED_TYPE		 0
751da177e4SLinus Torvalds #define EFI_LOADER_CODE			 1
761da177e4SLinus Torvalds #define EFI_LOADER_DATA			 2
771da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_CODE		 3
781da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_DATA		 4
791da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_CODE	 5
801da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_DATA	 6
811da177e4SLinus Torvalds #define EFI_CONVENTIONAL_MEMORY		 7
821da177e4SLinus Torvalds #define EFI_UNUSABLE_MEMORY		 8
831da177e4SLinus Torvalds #define EFI_ACPI_RECLAIM_MEMORY		 9
841da177e4SLinus Torvalds #define EFI_ACPI_MEMORY_NVS		10
851da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO		11
861da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO_PORT_SPACE	12
871da177e4SLinus Torvalds #define EFI_PAL_CODE			13
88ad5fb870SDan Williams #define EFI_PERSISTENT_MEMORY		14
89ad5fb870SDan Williams #define EFI_MAX_MEMORY_TYPE		15
901da177e4SLinus Torvalds 
911da177e4SLinus Torvalds /* Attribute values: */
921da177e4SLinus Torvalds #define EFI_MEMORY_UC		((u64)0x0000000000000001ULL)	/* uncached */
931da177e4SLinus Torvalds #define EFI_MEMORY_WC		((u64)0x0000000000000002ULL)	/* write-coalescing */
941da177e4SLinus Torvalds #define EFI_MEMORY_WT		((u64)0x0000000000000004ULL)	/* write-through */
951da177e4SLinus Torvalds #define EFI_MEMORY_WB		((u64)0x0000000000000008ULL)	/* write-back */
969c97e0bdSLaszlo Ersek #define EFI_MEMORY_UCE		((u64)0x0000000000000010ULL)	/* uncached, exported */
971da177e4SLinus Torvalds #define EFI_MEMORY_WP		((u64)0x0000000000001000ULL)	/* write-protect */
981da177e4SLinus Torvalds #define EFI_MEMORY_RP		((u64)0x0000000000002000ULL)	/* read-protect */
991da177e4SLinus Torvalds #define EFI_MEMORY_XP		((u64)0x0000000000004000ULL)	/* execute-protect */
100c016ca08SRobert Elliott #define EFI_MEMORY_NV		((u64)0x0000000000008000ULL)	/* non-volatile */
101b05b9f5fSTony Luck #define EFI_MEMORY_MORE_RELIABLE \
102b05b9f5fSTony Luck 				((u64)0x0000000000010000ULL)	/* higher reliability */
10387db73aeSArd Biesheuvel #define EFI_MEMORY_RO		((u64)0x0000000000020000ULL)	/* read-only */
1041da177e4SLinus Torvalds #define EFI_MEMORY_RUNTIME	((u64)0x8000000000000000ULL)	/* range requires runtime mapping */
1051da177e4SLinus Torvalds #define EFI_MEMORY_DESCRIPTOR_VERSION	1
1061da177e4SLinus Torvalds 
1071da177e4SLinus Torvalds #define EFI_PAGE_SHIFT		12
108ed37ddffSRoy Franz #define EFI_PAGE_SIZE		(1UL << EFI_PAGE_SHIFT)
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds typedef struct {
1111da177e4SLinus Torvalds 	u32 type;
1121da177e4SLinus Torvalds 	u32 pad;
1131da177e4SLinus Torvalds 	u64 phys_addr;
1141da177e4SLinus Torvalds 	u64 virt_addr;
1151da177e4SLinus Torvalds 	u64 num_pages;
1161da177e4SLinus Torvalds 	u64 attribute;
1171da177e4SLinus Torvalds } efi_memory_desc_t;
1181da177e4SLinus Torvalds 
1193b370237SMatthew Garrett typedef struct {
1203b370237SMatthew Garrett 	efi_guid_t guid;
1213b370237SMatthew Garrett 	u32 headersize;
1223b370237SMatthew Garrett 	u32 flags;
1233b370237SMatthew Garrett 	u32 imagesize;
1243b370237SMatthew Garrett } efi_capsule_header_t;
1253b370237SMatthew Garrett 
126bb05e4baSMatt Fleming /*
127bb05e4baSMatt Fleming  * Allocation types for calls to boottime->allocate_pages.
128bb05e4baSMatt Fleming  */
129bb05e4baSMatt Fleming #define EFI_ALLOCATE_ANY_PAGES		0
130bb05e4baSMatt Fleming #define EFI_ALLOCATE_MAX_ADDRESS	1
131bb05e4baSMatt Fleming #define EFI_ALLOCATE_ADDRESS		2
132bb05e4baSMatt Fleming #define EFI_MAX_ALLOCATE_TYPE		3
133bb05e4baSMatt Fleming 
134e088a4adSMatthew Wilcox typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds /*
1371da177e4SLinus Torvalds  * Types and defines for Time Services
1381da177e4SLinus Torvalds  */
1391da177e4SLinus Torvalds #define EFI_TIME_ADJUST_DAYLIGHT 0x1
1401da177e4SLinus Torvalds #define EFI_TIME_IN_DAYLIGHT     0x2
1411da177e4SLinus Torvalds #define EFI_UNSPECIFIED_TIMEZONE 0x07ff
1421da177e4SLinus Torvalds 
1431da177e4SLinus Torvalds typedef struct {
1441da177e4SLinus Torvalds 	u16 year;
1451da177e4SLinus Torvalds 	u8 month;
1461da177e4SLinus Torvalds 	u8 day;
1471da177e4SLinus Torvalds 	u8 hour;
1481da177e4SLinus Torvalds 	u8 minute;
1491da177e4SLinus Torvalds 	u8 second;
1501da177e4SLinus Torvalds 	u8 pad1;
1511da177e4SLinus Torvalds 	u32 nanosecond;
1521da177e4SLinus Torvalds 	s16 timezone;
1531da177e4SLinus Torvalds 	u8 daylight;
1541da177e4SLinus Torvalds 	u8 pad2;
1551da177e4SLinus Torvalds } efi_time_t;
1561da177e4SLinus Torvalds 
1571da177e4SLinus Torvalds typedef struct {
1581da177e4SLinus Torvalds 	u32 resolution;
1591da177e4SLinus Torvalds 	u32 accuracy;
1601da177e4SLinus Torvalds 	u8 sets_to_zero;
1611da177e4SLinus Torvalds } efi_time_cap_t;
1621da177e4SLinus Torvalds 
163677703ceSMatt Fleming typedef struct {
164677703ceSMatt Fleming 	efi_table_hdr_t hdr;
165677703ceSMatt Fleming 	u32 raise_tpl;
166677703ceSMatt Fleming 	u32 restore_tpl;
167677703ceSMatt Fleming 	u32 allocate_pages;
168677703ceSMatt Fleming 	u32 free_pages;
169677703ceSMatt Fleming 	u32 get_memory_map;
170677703ceSMatt Fleming 	u32 allocate_pool;
171677703ceSMatt Fleming 	u32 free_pool;
172677703ceSMatt Fleming 	u32 create_event;
173677703ceSMatt Fleming 	u32 set_timer;
174677703ceSMatt Fleming 	u32 wait_for_event;
175677703ceSMatt Fleming 	u32 signal_event;
176677703ceSMatt Fleming 	u32 close_event;
177677703ceSMatt Fleming 	u32 check_event;
178677703ceSMatt Fleming 	u32 install_protocol_interface;
179677703ceSMatt Fleming 	u32 reinstall_protocol_interface;
180677703ceSMatt Fleming 	u32 uninstall_protocol_interface;
181677703ceSMatt Fleming 	u32 handle_protocol;
182677703ceSMatt Fleming 	u32 __reserved;
183677703ceSMatt Fleming 	u32 register_protocol_notify;
184677703ceSMatt Fleming 	u32 locate_handle;
185677703ceSMatt Fleming 	u32 locate_device_path;
186677703ceSMatt Fleming 	u32 install_configuration_table;
187677703ceSMatt Fleming 	u32 load_image;
188677703ceSMatt Fleming 	u32 start_image;
189677703ceSMatt Fleming 	u32 exit;
190677703ceSMatt Fleming 	u32 unload_image;
191677703ceSMatt Fleming 	u32 exit_boot_services;
192677703ceSMatt Fleming 	u32 get_next_monotonic_count;
193677703ceSMatt Fleming 	u32 stall;
194677703ceSMatt Fleming 	u32 set_watchdog_timer;
195677703ceSMatt Fleming 	u32 connect_controller;
196677703ceSMatt Fleming 	u32 disconnect_controller;
197677703ceSMatt Fleming 	u32 open_protocol;
198677703ceSMatt Fleming 	u32 close_protocol;
199677703ceSMatt Fleming 	u32 open_protocol_information;
200677703ceSMatt Fleming 	u32 protocols_per_handle;
201677703ceSMatt Fleming 	u32 locate_handle_buffer;
202677703ceSMatt Fleming 	u32 locate_protocol;
203677703ceSMatt Fleming 	u32 install_multiple_protocol_interfaces;
204677703ceSMatt Fleming 	u32 uninstall_multiple_protocol_interfaces;
205677703ceSMatt Fleming 	u32 calculate_crc32;
206677703ceSMatt Fleming 	u32 copy_mem;
207677703ceSMatt Fleming 	u32 set_mem;
208677703ceSMatt Fleming 	u32 create_event_ex;
209677703ceSMatt Fleming } __packed efi_boot_services_32_t;
210677703ceSMatt Fleming 
211677703ceSMatt Fleming typedef struct {
212677703ceSMatt Fleming 	efi_table_hdr_t hdr;
213677703ceSMatt Fleming 	u64 raise_tpl;
214677703ceSMatt Fleming 	u64 restore_tpl;
215677703ceSMatt Fleming 	u64 allocate_pages;
216677703ceSMatt Fleming 	u64 free_pages;
217677703ceSMatt Fleming 	u64 get_memory_map;
218677703ceSMatt Fleming 	u64 allocate_pool;
219677703ceSMatt Fleming 	u64 free_pool;
220677703ceSMatt Fleming 	u64 create_event;
221677703ceSMatt Fleming 	u64 set_timer;
222677703ceSMatt Fleming 	u64 wait_for_event;
223677703ceSMatt Fleming 	u64 signal_event;
224677703ceSMatt Fleming 	u64 close_event;
225677703ceSMatt Fleming 	u64 check_event;
226677703ceSMatt Fleming 	u64 install_protocol_interface;
227677703ceSMatt Fleming 	u64 reinstall_protocol_interface;
228677703ceSMatt Fleming 	u64 uninstall_protocol_interface;
229677703ceSMatt Fleming 	u64 handle_protocol;
230677703ceSMatt Fleming 	u64 __reserved;
231677703ceSMatt Fleming 	u64 register_protocol_notify;
232677703ceSMatt Fleming 	u64 locate_handle;
233677703ceSMatt Fleming 	u64 locate_device_path;
234677703ceSMatt Fleming 	u64 install_configuration_table;
235677703ceSMatt Fleming 	u64 load_image;
236677703ceSMatt Fleming 	u64 start_image;
237677703ceSMatt Fleming 	u64 exit;
238677703ceSMatt Fleming 	u64 unload_image;
239677703ceSMatt Fleming 	u64 exit_boot_services;
240677703ceSMatt Fleming 	u64 get_next_monotonic_count;
241677703ceSMatt Fleming 	u64 stall;
242677703ceSMatt Fleming 	u64 set_watchdog_timer;
243677703ceSMatt Fleming 	u64 connect_controller;
244677703ceSMatt Fleming 	u64 disconnect_controller;
245677703ceSMatt Fleming 	u64 open_protocol;
246677703ceSMatt Fleming 	u64 close_protocol;
247677703ceSMatt Fleming 	u64 open_protocol_information;
248677703ceSMatt Fleming 	u64 protocols_per_handle;
249677703ceSMatt Fleming 	u64 locate_handle_buffer;
250677703ceSMatt Fleming 	u64 locate_protocol;
251677703ceSMatt Fleming 	u64 install_multiple_protocol_interfaces;
252677703ceSMatt Fleming 	u64 uninstall_multiple_protocol_interfaces;
253677703ceSMatt Fleming 	u64 calculate_crc32;
254677703ceSMatt Fleming 	u64 copy_mem;
255677703ceSMatt Fleming 	u64 set_mem;
256677703ceSMatt Fleming 	u64 create_event_ex;
257677703ceSMatt Fleming } __packed efi_boot_services_64_t;
258677703ceSMatt Fleming 
2591da177e4SLinus Torvalds /*
260f30ca6baSMatt Fleming  * EFI Boot Services table
261f30ca6baSMatt Fleming  */
262f30ca6baSMatt Fleming typedef struct {
263f30ca6baSMatt Fleming 	efi_table_hdr_t hdr;
264f30ca6baSMatt Fleming 	void *raise_tpl;
265f30ca6baSMatt Fleming 	void *restore_tpl;
266ed37ddffSRoy Franz 	efi_status_t (*allocate_pages)(int, int, unsigned long,
267ed37ddffSRoy Franz 				       efi_physical_addr_t *);
268ed37ddffSRoy Franz 	efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long);
269ed37ddffSRoy Franz 	efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *,
270ed37ddffSRoy Franz 				       unsigned long *, u32 *);
271ed37ddffSRoy Franz 	efi_status_t (*allocate_pool)(int, unsigned long, void **);
272ed37ddffSRoy Franz 	efi_status_t (*free_pool)(void *);
273f30ca6baSMatt Fleming 	void *create_event;
274f30ca6baSMatt Fleming 	void *set_timer;
275f30ca6baSMatt Fleming 	void *wait_for_event;
276f30ca6baSMatt Fleming 	void *signal_event;
277f30ca6baSMatt Fleming 	void *close_event;
278f30ca6baSMatt Fleming 	void *check_event;
279f30ca6baSMatt Fleming 	void *install_protocol_interface;
280f30ca6baSMatt Fleming 	void *reinstall_protocol_interface;
281f30ca6baSMatt Fleming 	void *uninstall_protocol_interface;
282ed37ddffSRoy Franz 	efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **);
283f30ca6baSMatt Fleming 	void *__reserved;
284f30ca6baSMatt Fleming 	void *register_protocol_notify;
285f30ca6baSMatt Fleming 	void *locate_handle;
286f30ca6baSMatt Fleming 	void *locate_device_path;
287f30ca6baSMatt Fleming 	void *install_configuration_table;
288f30ca6baSMatt Fleming 	void *load_image;
289f30ca6baSMatt Fleming 	void *start_image;
290f30ca6baSMatt Fleming 	void *exit;
291f30ca6baSMatt Fleming 	void *unload_image;
292ed37ddffSRoy Franz 	efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long);
293f30ca6baSMatt Fleming 	void *get_next_monotonic_count;
294f30ca6baSMatt Fleming 	void *stall;
295f30ca6baSMatt Fleming 	void *set_watchdog_timer;
296f30ca6baSMatt Fleming 	void *connect_controller;
297f30ca6baSMatt Fleming 	void *disconnect_controller;
298f30ca6baSMatt Fleming 	void *open_protocol;
299f30ca6baSMatt Fleming 	void *close_protocol;
300f30ca6baSMatt Fleming 	void *open_protocol_information;
301f30ca6baSMatt Fleming 	void *protocols_per_handle;
302f30ca6baSMatt Fleming 	void *locate_handle_buffer;
303e4fbf476SArd Biesheuvel 	efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **);
304f30ca6baSMatt Fleming 	void *install_multiple_protocol_interfaces;
305f30ca6baSMatt Fleming 	void *uninstall_multiple_protocol_interfaces;
306f30ca6baSMatt Fleming 	void *calculate_crc32;
307f30ca6baSMatt Fleming 	void *copy_mem;
308f30ca6baSMatt Fleming 	void *set_mem;
309f30ca6baSMatt Fleming 	void *create_event_ex;
310f30ca6baSMatt Fleming } efi_boot_services_t;
311f30ca6baSMatt Fleming 
312dd5fc854SMatthew Garrett typedef enum {
313dd5fc854SMatthew Garrett 	EfiPciIoWidthUint8,
314dd5fc854SMatthew Garrett 	EfiPciIoWidthUint16,
315dd5fc854SMatthew Garrett 	EfiPciIoWidthUint32,
316dd5fc854SMatthew Garrett 	EfiPciIoWidthUint64,
317dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint8,
318dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint16,
319dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint32,
320dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint64,
321dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint8,
322dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint16,
323dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint32,
324dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint64,
325dd5fc854SMatthew Garrett 	EfiPciIoWidthMaximum
326dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_WIDTH;
327dd5fc854SMatthew Garrett 
328dd5fc854SMatthew Garrett typedef enum {
329dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationGet,
330dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationSet,
331dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationEnable,
332dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationDisable,
333dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationSupported,
334dd5fc854SMatthew Garrett     EfiPciIoAttributeOperationMaximum
335dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
336dd5fc854SMatthew Garrett 
337677703ceSMatt Fleming typedef struct {
338677703ceSMatt Fleming 	u32 read;
339677703ceSMatt Fleming 	u32 write;
340677703ceSMatt Fleming } efi_pci_io_protocol_access_32_t;
341677703ceSMatt Fleming 
342677703ceSMatt Fleming typedef struct {
343677703ceSMatt Fleming 	u64 read;
344677703ceSMatt Fleming 	u64 write;
345677703ceSMatt Fleming } efi_pci_io_protocol_access_64_t;
346dd5fc854SMatthew Garrett 
347dd5fc854SMatthew Garrett typedef struct {
348dd5fc854SMatthew Garrett 	void *read;
349dd5fc854SMatthew Garrett 	void *write;
350dd5fc854SMatthew Garrett } efi_pci_io_protocol_access_t;
351dd5fc854SMatthew Garrett 
352dd5fc854SMatthew Garrett typedef struct {
353677703ceSMatt Fleming 	u32 poll_mem;
354677703ceSMatt Fleming 	u32 poll_io;
355677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t mem;
356677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t io;
357677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t pci;
358677703ceSMatt Fleming 	u32 copy_mem;
359677703ceSMatt Fleming 	u32 map;
360677703ceSMatt Fleming 	u32 unmap;
361677703ceSMatt Fleming 	u32 allocate_buffer;
362677703ceSMatt Fleming 	u32 free_buffer;
363677703ceSMatt Fleming 	u32 flush;
364677703ceSMatt Fleming 	u32 get_location;
365677703ceSMatt Fleming 	u32 attributes;
366677703ceSMatt Fleming 	u32 get_bar_attributes;
367677703ceSMatt Fleming 	u32 set_bar_attributes;
368677703ceSMatt Fleming 	uint64_t romsize;
369677703ceSMatt Fleming 	void *romimage;
370677703ceSMatt Fleming } efi_pci_io_protocol_32;
371677703ceSMatt Fleming 
372677703ceSMatt Fleming typedef struct {
373677703ceSMatt Fleming 	u64 poll_mem;
374677703ceSMatt Fleming 	u64 poll_io;
375677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t mem;
376677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t io;
377677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t pci;
378677703ceSMatt Fleming 	u64 copy_mem;
379677703ceSMatt Fleming 	u64 map;
380677703ceSMatt Fleming 	u64 unmap;
381677703ceSMatt Fleming 	u64 allocate_buffer;
382677703ceSMatt Fleming 	u64 free_buffer;
383677703ceSMatt Fleming 	u64 flush;
384677703ceSMatt Fleming 	u64 get_location;
385677703ceSMatt Fleming 	u64 attributes;
386677703ceSMatt Fleming 	u64 get_bar_attributes;
387677703ceSMatt Fleming 	u64 set_bar_attributes;
388677703ceSMatt Fleming 	uint64_t romsize;
389677703ceSMatt Fleming 	void *romimage;
390677703ceSMatt Fleming } efi_pci_io_protocol_64;
391677703ceSMatt Fleming 
392677703ceSMatt Fleming typedef struct {
393dd5fc854SMatthew Garrett 	void *poll_mem;
394dd5fc854SMatthew Garrett 	void *poll_io;
395dd5fc854SMatthew Garrett 	efi_pci_io_protocol_access_t mem;
396dd5fc854SMatthew Garrett 	efi_pci_io_protocol_access_t io;
397dd5fc854SMatthew Garrett 	efi_pci_io_protocol_access_t pci;
398dd5fc854SMatthew Garrett 	void *copy_mem;
399dd5fc854SMatthew Garrett 	void *map;
400dd5fc854SMatthew Garrett 	void *unmap;
401dd5fc854SMatthew Garrett 	void *allocate_buffer;
402dd5fc854SMatthew Garrett 	void *free_buffer;
403dd5fc854SMatthew Garrett 	void *flush;
404dd5fc854SMatthew Garrett 	void *get_location;
405dd5fc854SMatthew Garrett 	void *attributes;
406dd5fc854SMatthew Garrett 	void *get_bar_attributes;
407dd5fc854SMatthew Garrett 	void *set_bar_attributes;
408dd5fc854SMatthew Garrett 	uint64_t romsize;
409dd5fc854SMatthew Garrett 	void *romimage;
410dd5fc854SMatthew Garrett } efi_pci_io_protocol;
411dd5fc854SMatthew Garrett 
412dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
413dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
414dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
415dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
416dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
417dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
418dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
419dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
420dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
421dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
422dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
423dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
424dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
425dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
426dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
427dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
428dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
429dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
430dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
431dd5fc854SMatthew Garrett 
432f30ca6baSMatt Fleming /*
4331da177e4SLinus Torvalds  * Types and defines for EFI ResetSystem
4341da177e4SLinus Torvalds  */
4351da177e4SLinus Torvalds #define EFI_RESET_COLD 0
4361da177e4SLinus Torvalds #define EFI_RESET_WARM 1
4371da177e4SLinus Torvalds #define EFI_RESET_SHUTDOWN 2
4381da177e4SLinus Torvalds 
4391da177e4SLinus Torvalds /*
4401da177e4SLinus Torvalds  * EFI Runtime Services table
4411da177e4SLinus Torvalds  */
4421da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
4431da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_REVISION  0x00010000
4441da177e4SLinus Torvalds 
4451da177e4SLinus Torvalds typedef struct {
4461da177e4SLinus Torvalds 	efi_table_hdr_t hdr;
447677703ceSMatt Fleming 	u32 get_time;
448677703ceSMatt Fleming 	u32 set_time;
449677703ceSMatt Fleming 	u32 get_wakeup_time;
450677703ceSMatt Fleming 	u32 set_wakeup_time;
451677703ceSMatt Fleming 	u32 set_virtual_address_map;
452677703ceSMatt Fleming 	u32 convert_pointer;
453677703ceSMatt Fleming 	u32 get_variable;
454677703ceSMatt Fleming 	u32 get_next_variable;
455677703ceSMatt Fleming 	u32 set_variable;
456677703ceSMatt Fleming 	u32 get_next_high_mono_count;
457677703ceSMatt Fleming 	u32 reset_system;
458677703ceSMatt Fleming 	u32 update_capsule;
459677703ceSMatt Fleming 	u32 query_capsule_caps;
460677703ceSMatt Fleming 	u32 query_variable_info;
461677703ceSMatt Fleming } efi_runtime_services_32_t;
462677703ceSMatt Fleming 
463677703ceSMatt Fleming typedef struct {
464677703ceSMatt Fleming 	efi_table_hdr_t hdr;
465677703ceSMatt Fleming 	u64 get_time;
466677703ceSMatt Fleming 	u64 set_time;
467677703ceSMatt Fleming 	u64 get_wakeup_time;
468677703ceSMatt Fleming 	u64 set_wakeup_time;
469677703ceSMatt Fleming 	u64 set_virtual_address_map;
470677703ceSMatt Fleming 	u64 convert_pointer;
471677703ceSMatt Fleming 	u64 get_variable;
472677703ceSMatt Fleming 	u64 get_next_variable;
473677703ceSMatt Fleming 	u64 set_variable;
474677703ceSMatt Fleming 	u64 get_next_high_mono_count;
475677703ceSMatt Fleming 	u64 reset_system;
476677703ceSMatt Fleming 	u64 update_capsule;
477677703ceSMatt Fleming 	u64 query_capsule_caps;
478677703ceSMatt Fleming 	u64 query_variable_info;
479677703ceSMatt Fleming } efi_runtime_services_64_t;
480677703ceSMatt Fleming 
481677703ceSMatt Fleming typedef struct {
482677703ceSMatt Fleming 	efi_table_hdr_t hdr;
48343ab0476SBorislav Petkov 	void *get_time;
48443ab0476SBorislav Petkov 	void *set_time;
48543ab0476SBorislav Petkov 	void *get_wakeup_time;
48643ab0476SBorislav Petkov 	void *set_wakeup_time;
48743ab0476SBorislav Petkov 	void *set_virtual_address_map;
48843ab0476SBorislav Petkov 	void *convert_pointer;
48943ab0476SBorislav Petkov 	void *get_variable;
49043ab0476SBorislav Petkov 	void *get_next_variable;
49143ab0476SBorislav Petkov 	void *set_variable;
49243ab0476SBorislav Petkov 	void *get_next_high_mono_count;
49343ab0476SBorislav Petkov 	void *reset_system;
49443ab0476SBorislav Petkov 	void *update_capsule;
49543ab0476SBorislav Petkov 	void *query_capsule_caps;
49643ab0476SBorislav Petkov 	void *query_variable_info;
4971da177e4SLinus Torvalds } efi_runtime_services_t;
4981da177e4SLinus Torvalds 
4991da177e4SLinus Torvalds typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
5001da177e4SLinus Torvalds typedef efi_status_t efi_set_time_t (efi_time_t *tm);
5011da177e4SLinus Torvalds typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
5021da177e4SLinus Torvalds 					    efi_time_t *tm);
5031da177e4SLinus Torvalds typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
5041da177e4SLinus Torvalds typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
5051da177e4SLinus Torvalds 					 unsigned long *data_size, void *data);
5061da177e4SLinus Torvalds typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
5071da177e4SLinus Torvalds 					      efi_guid_t *vendor);
5081da177e4SLinus Torvalds typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
509f7a2d73fSMatthew Garrett 					 u32 attr, unsigned long data_size,
5101da177e4SLinus Torvalds 					 void *data);
5111da177e4SLinus Torvalds typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
5121da177e4SLinus Torvalds typedef void efi_reset_system_t (int reset_type, efi_status_t status,
5131da177e4SLinus Torvalds 				 unsigned long data_size, efi_char16_t *data);
5141da177e4SLinus Torvalds typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
5151da177e4SLinus Torvalds 						unsigned long descriptor_size,
5161da177e4SLinus Torvalds 						u32 descriptor_version,
5171da177e4SLinus Torvalds 						efi_memory_desc_t *virtual_map);
5183b370237SMatthew Garrett typedef efi_status_t efi_query_variable_info_t(u32 attr,
5193b370237SMatthew Garrett 					       u64 *storage_space,
5203b370237SMatthew Garrett 					       u64 *remaining_space,
5213b370237SMatthew Garrett 					       u64 *max_variable_size);
5223b370237SMatthew Garrett typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
5233b370237SMatthew Garrett 					  unsigned long count,
5243b370237SMatthew Garrett 					  unsigned long sg_list);
5253b370237SMatthew Garrett typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
5263b370237SMatthew Garrett 					      unsigned long count,
5273b370237SMatthew Garrett 					      u64 *max_size,
5283b370237SMatthew Garrett 					      int *reset_type);
529ca0e30dcSArd Biesheuvel typedef efi_status_t efi_query_variable_store_t(u32 attributes,
530ca0e30dcSArd Biesheuvel 						unsigned long size,
531ca0e30dcSArd Biesheuvel 						bool nonblocking);
5321da177e4SLinus Torvalds 
533022ee6c5SArd Biesheuvel void efi_native_runtime_setup(void);
534022ee6c5SArd Biesheuvel 
5351da177e4SLinus Torvalds /*
5361da177e4SLinus Torvalds  *  EFI Configuration Table and GUID definitions
5371da177e4SLinus Torvalds  */
5381da177e4SLinus Torvalds #define NULL_GUID \
539662b1d89SPeter Jones 	EFI_GUID(0x00000000, 0x0000, 0x0000, \
540662b1d89SPeter Jones 		 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
5411da177e4SLinus Torvalds 
5421da177e4SLinus Torvalds #define MPS_TABLE_GUID    \
543662b1d89SPeter Jones 	EFI_GUID(0xeb9d2d2f, 0x2d88, 0x11d3, \
544662b1d89SPeter Jones 		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5451da177e4SLinus Torvalds 
5461da177e4SLinus Torvalds #define ACPI_TABLE_GUID    \
547662b1d89SPeter Jones 	EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, \
548662b1d89SPeter Jones 		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5491da177e4SLinus Torvalds 
5501da177e4SLinus Torvalds #define ACPI_20_TABLE_GUID    \
551662b1d89SPeter Jones 	EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \
552662b1d89SPeter Jones 		 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
5531da177e4SLinus Torvalds 
5541da177e4SLinus Torvalds #define SMBIOS_TABLE_GUID    \
555662b1d89SPeter Jones 	EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3, \
556662b1d89SPeter Jones 		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5571da177e4SLinus Torvalds 
558e1ccbbc9SArd Biesheuvel #define SMBIOS3_TABLE_GUID    \
559662b1d89SPeter Jones 	EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c, \
560662b1d89SPeter Jones 		 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94)
561e1ccbbc9SArd Biesheuvel 
5621da177e4SLinus Torvalds #define SAL_SYSTEM_TABLE_GUID    \
563662b1d89SPeter Jones 	EFI_GUID(0xeb9d2d32, 0x2d88, 0x11d3, \
564662b1d89SPeter Jones 		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5651da177e4SLinus Torvalds 
5661da177e4SLinus Torvalds #define HCDP_TABLE_GUID	\
567662b1d89SPeter Jones 	EFI_GUID(0xf951938d, 0x620b, 0x42ef, \
568662b1d89SPeter Jones 		 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98)
5691da177e4SLinus Torvalds 
5701da177e4SLinus Torvalds #define UGA_IO_PROTOCOL_GUID \
571662b1d89SPeter Jones 	EFI_GUID(0x61a4d49e, 0x6f68, 0x4f1b, \
572662b1d89SPeter Jones 		 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2)
5731da177e4SLinus Torvalds 
5741da177e4SLinus Torvalds #define EFI_GLOBAL_VARIABLE_GUID \
575662b1d89SPeter Jones 	EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, \
576662b1d89SPeter Jones 		 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
5771da177e4SLinus Torvalds 
578a50f70b1SRuss Anderson #define UV_SYSTEM_TABLE_GUID \
579662b1d89SPeter Jones 	EFI_GUID(0x3b13a7d4, 0x633e, 0x11dd, \
580662b1d89SPeter Jones 		 0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93)
581a50f70b1SRuss Anderson 
5825ee9c198SMatthew Garrett #define LINUX_EFI_CRASH_GUID \
583662b1d89SPeter Jones 	EFI_GUID(0xcfc8fc79, 0xbe2e, 0x4ddc, \
584662b1d89SPeter Jones 		 0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0)
5855ee9c198SMatthew Garrett 
5868e84f345SMatt Fleming #define LOADED_IMAGE_PROTOCOL_GUID \
587662b1d89SPeter Jones 	EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \
588662b1d89SPeter Jones 		 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
5898e84f345SMatt Fleming 
5900f7c5d47SMatt Fleming #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
591662b1d89SPeter Jones 	EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
592662b1d89SPeter Jones 		 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
5930f7c5d47SMatt Fleming 
5940f7c5d47SMatt Fleming #define EFI_UGA_PROTOCOL_GUID \
595662b1d89SPeter Jones 	EFI_GUID(0x982c298b, 0xf4fa, 0x41cb, \
596662b1d89SPeter Jones 		 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39)
5970f7c5d47SMatt Fleming 
5980f7c5d47SMatt Fleming #define EFI_PCI_IO_PROTOCOL_GUID \
599662b1d89SPeter Jones 	EFI_GUID(0x4cf5b200, 0x68b8, 0x4ca5, \
600662b1d89SPeter Jones 		 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a)
6010f7c5d47SMatt Fleming 
60255839d51SMatt Fleming #define EFI_FILE_INFO_ID \
603662b1d89SPeter Jones 	EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, \
604662b1d89SPeter Jones 		 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
60555839d51SMatt Fleming 
6060bb54905SPeter Jones #define EFI_SYSTEM_RESOURCE_TABLE_GUID \
607662b1d89SPeter Jones 	EFI_GUID(0xb122a263, 0x3661, 0x4f68, \
608662b1d89SPeter Jones 		 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
6090bb54905SPeter Jones 
61055839d51SMatt Fleming #define EFI_FILE_SYSTEM_GUID \
611662b1d89SPeter Jones 	EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
612662b1d89SPeter Jones 		 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
61355839d51SMatt Fleming 
614263b4a30SRoy Franz #define DEVICE_TREE_GUID \
615662b1d89SPeter Jones 	EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
616662b1d89SPeter Jones 		 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
617263b4a30SRoy Franz 
618bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_GUID \
619662b1d89SPeter Jones 	EFI_GUID(0x880aaca3, 0x4adc, 0x4a04, \
620662b1d89SPeter Jones 		 0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5)
621bf924863SArd Biesheuvel 
622e4fbf476SArd Biesheuvel #define EFI_RNG_PROTOCOL_GUID \
623e4fbf476SArd Biesheuvel 	EFI_GUID(0x3152bca5, 0xeade, 0x433d, \
624e4fbf476SArd Biesheuvel 		 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
625e4fbf476SArd Biesheuvel 
626*a604af07SArd Biesheuvel #define EFI_MEMORY_ATTRIBUTES_TABLE_GUID \
627*a604af07SArd Biesheuvel 	EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, \
628*a604af07SArd Biesheuvel 		 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
629*a604af07SArd Biesheuvel 
6301da177e4SLinus Torvalds typedef struct {
6311da177e4SLinus Torvalds 	efi_guid_t guid;
6321adbfa35SOlof Johansson 	u64 table;
6331adbfa35SOlof Johansson } efi_config_table_64_t;
6341adbfa35SOlof Johansson 
6351adbfa35SOlof Johansson typedef struct {
6361adbfa35SOlof Johansson 	efi_guid_t guid;
6371adbfa35SOlof Johansson 	u32 table;
6381adbfa35SOlof Johansson } efi_config_table_32_t;
6391adbfa35SOlof Johansson 
6401adbfa35SOlof Johansson typedef struct {
6411adbfa35SOlof Johansson 	efi_guid_t guid;
6421da177e4SLinus Torvalds 	unsigned long table;
6431da177e4SLinus Torvalds } efi_config_table_t;
6441da177e4SLinus Torvalds 
645272686bfSLeif Lindholm typedef struct {
646272686bfSLeif Lindholm 	efi_guid_t guid;
647272686bfSLeif Lindholm 	const char *name;
648272686bfSLeif Lindholm 	unsigned long *ptr;
649272686bfSLeif Lindholm } efi_config_table_type_t;
650272686bfSLeif Lindholm 
6511da177e4SLinus Torvalds #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
6521da177e4SLinus Torvalds 
6533b370237SMatthew Garrett #define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
6543b370237SMatthew Garrett #define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
6553b370237SMatthew Garrett #define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
6563b370237SMatthew Garrett #define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
6573b370237SMatthew Garrett #define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
6583b370237SMatthew Garrett #define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
6593b370237SMatthew Garrett 
6601da177e4SLinus Torvalds typedef struct {
6611da177e4SLinus Torvalds 	efi_table_hdr_t hdr;
6621adbfa35SOlof Johansson 	u64 fw_vendor;	/* physical addr of CHAR16 vendor string */
6631adbfa35SOlof Johansson 	u32 fw_revision;
6641adbfa35SOlof Johansson 	u32 __pad1;
6651adbfa35SOlof Johansson 	u64 con_in_handle;
6661adbfa35SOlof Johansson 	u64 con_in;
6671adbfa35SOlof Johansson 	u64 con_out_handle;
6681adbfa35SOlof Johansson 	u64 con_out;
6691adbfa35SOlof Johansson 	u64 stderr_handle;
6701adbfa35SOlof Johansson 	u64 stderr;
6711adbfa35SOlof Johansson 	u64 runtime;
6721adbfa35SOlof Johansson 	u64 boottime;
6731adbfa35SOlof Johansson 	u32 nr_tables;
6741adbfa35SOlof Johansson 	u32 __pad2;
6751adbfa35SOlof Johansson 	u64 tables;
6761adbfa35SOlof Johansson } efi_system_table_64_t;
6771adbfa35SOlof Johansson 
6781adbfa35SOlof Johansson typedef struct {
6791adbfa35SOlof Johansson 	efi_table_hdr_t hdr;
6801adbfa35SOlof Johansson 	u32 fw_vendor;	/* physical addr of CHAR16 vendor string */
6811adbfa35SOlof Johansson 	u32 fw_revision;
6821adbfa35SOlof Johansson 	u32 con_in_handle;
6831adbfa35SOlof Johansson 	u32 con_in;
6841adbfa35SOlof Johansson 	u32 con_out_handle;
6851adbfa35SOlof Johansson 	u32 con_out;
6861adbfa35SOlof Johansson 	u32 stderr_handle;
6871adbfa35SOlof Johansson 	u32 stderr;
6881adbfa35SOlof Johansson 	u32 runtime;
6891adbfa35SOlof Johansson 	u32 boottime;
6901adbfa35SOlof Johansson 	u32 nr_tables;
6911adbfa35SOlof Johansson 	u32 tables;
6921adbfa35SOlof Johansson } efi_system_table_32_t;
6931adbfa35SOlof Johansson 
6941adbfa35SOlof Johansson typedef struct {
6951adbfa35SOlof Johansson 	efi_table_hdr_t hdr;
6961da177e4SLinus Torvalds 	unsigned long fw_vendor;	/* physical addr of CHAR16 vendor string */
6971da177e4SLinus Torvalds 	u32 fw_revision;
6981da177e4SLinus Torvalds 	unsigned long con_in_handle;
6991da177e4SLinus Torvalds 	unsigned long con_in;
7001da177e4SLinus Torvalds 	unsigned long con_out_handle;
7011da177e4SLinus Torvalds 	unsigned long con_out;
7021da177e4SLinus Torvalds 	unsigned long stderr_handle;
7031da177e4SLinus Torvalds 	unsigned long stderr;
7041da177e4SLinus Torvalds 	efi_runtime_services_t *runtime;
705f30ca6baSMatt Fleming 	efi_boot_services_t *boottime;
7061da177e4SLinus Torvalds 	unsigned long nr_tables;
7071da177e4SLinus Torvalds 	unsigned long tables;
7081da177e4SLinus Torvalds } efi_system_table_t;
7091da177e4SLinus Torvalds 
7101da177e4SLinus Torvalds struct efi_memory_map {
71144511fb9SArd Biesheuvel 	phys_addr_t phys_map;
7127ae65fd3SMatt Tolentino 	void *map;
7137ae65fd3SMatt Tolentino 	void *map_end;
7141da177e4SLinus Torvalds 	int nr_map;
7151da177e4SLinus Torvalds 	unsigned long desc_version;
7167ae65fd3SMatt Tolentino 	unsigned long desc_size;
7171da177e4SLinus Torvalds };
7181da177e4SLinus Torvalds 
7190302f71cSMark Salter struct efi_fdt_params {
7200302f71cSMark Salter 	u64 system_table;
7210302f71cSMark Salter 	u64 mmap;
7220302f71cSMark Salter 	u32 mmap_size;
7230302f71cSMark Salter 	u32 desc_size;
7240302f71cSMark Salter 	u32 desc_ver;
7250302f71cSMark Salter };
7260302f71cSMark Salter 
7278e84f345SMatt Fleming typedef struct {
7288e84f345SMatt Fleming 	u32 revision;
729677703ceSMatt Fleming 	u32 parent_handle;
730677703ceSMatt Fleming 	u32 system_table;
731677703ceSMatt Fleming 	u32 device_handle;
732677703ceSMatt Fleming 	u32 file_path;
733677703ceSMatt Fleming 	u32 reserved;
734677703ceSMatt Fleming 	u32 load_options_size;
735677703ceSMatt Fleming 	u32 load_options;
736677703ceSMatt Fleming 	u32 image_base;
737677703ceSMatt Fleming 	__aligned_u64 image_size;
738677703ceSMatt Fleming 	unsigned int image_code_type;
739677703ceSMatt Fleming 	unsigned int image_data_type;
740677703ceSMatt Fleming 	unsigned long unload;
741677703ceSMatt Fleming } efi_loaded_image_32_t;
742677703ceSMatt Fleming 
743677703ceSMatt Fleming typedef struct {
744677703ceSMatt Fleming 	u32 revision;
745677703ceSMatt Fleming 	u64 parent_handle;
746677703ceSMatt Fleming 	u64 system_table;
747677703ceSMatt Fleming 	u64 device_handle;
748677703ceSMatt Fleming 	u64 file_path;
749677703ceSMatt Fleming 	u64 reserved;
750677703ceSMatt Fleming 	u32 load_options_size;
751677703ceSMatt Fleming 	u64 load_options;
752677703ceSMatt Fleming 	u64 image_base;
753677703ceSMatt Fleming 	__aligned_u64 image_size;
754677703ceSMatt Fleming 	unsigned int image_code_type;
755677703ceSMatt Fleming 	unsigned int image_data_type;
756677703ceSMatt Fleming 	unsigned long unload;
757677703ceSMatt Fleming } efi_loaded_image_64_t;
758677703ceSMatt Fleming 
759677703ceSMatt Fleming typedef struct {
760677703ceSMatt Fleming 	u32 revision;
7618e84f345SMatt Fleming 	void *parent_handle;
7628e84f345SMatt Fleming 	efi_system_table_t *system_table;
7638e84f345SMatt Fleming 	void *device_handle;
7648e84f345SMatt Fleming 	void *file_path;
7658e84f345SMatt Fleming 	void *reserved;
7668e84f345SMatt Fleming 	u32 load_options_size;
7678e84f345SMatt Fleming 	void *load_options;
7688e84f345SMatt Fleming 	void *image_base;
7698e84f345SMatt Fleming 	__aligned_u64 image_size;
7708e84f345SMatt Fleming 	unsigned int image_code_type;
7718e84f345SMatt Fleming 	unsigned int image_data_type;
7728e84f345SMatt Fleming 	unsigned long unload;
7738e84f345SMatt Fleming } efi_loaded_image_t;
7748e84f345SMatt Fleming 
77555839d51SMatt Fleming 
77655839d51SMatt Fleming typedef struct {
77755839d51SMatt Fleming 	u64 size;
77855839d51SMatt Fleming 	u64 file_size;
77955839d51SMatt Fleming 	u64 phys_size;
78055839d51SMatt Fleming 	efi_time_t create_time;
78155839d51SMatt Fleming 	efi_time_t last_access_time;
78255839d51SMatt Fleming 	efi_time_t modification_time;
78355839d51SMatt Fleming 	__aligned_u64 attribute;
78455839d51SMatt Fleming 	efi_char16_t filename[1];
78555839d51SMatt Fleming } efi_file_info_t;
78655839d51SMatt Fleming 
787677703ceSMatt Fleming typedef struct {
788677703ceSMatt Fleming 	u64 revision;
789677703ceSMatt Fleming 	u32 open;
790677703ceSMatt Fleming 	u32 close;
791677703ceSMatt Fleming 	u32 delete;
792677703ceSMatt Fleming 	u32 read;
793677703ceSMatt Fleming 	u32 write;
794677703ceSMatt Fleming 	u32 get_position;
795677703ceSMatt Fleming 	u32 set_position;
796677703ceSMatt Fleming 	u32 get_info;
797677703ceSMatt Fleming 	u32 set_info;
798677703ceSMatt Fleming 	u32 flush;
799677703ceSMatt Fleming } efi_file_handle_32_t;
800677703ceSMatt Fleming 
801677703ceSMatt Fleming typedef struct {
802677703ceSMatt Fleming 	u64 revision;
803677703ceSMatt Fleming 	u64 open;
804677703ceSMatt Fleming 	u64 close;
805677703ceSMatt Fleming 	u64 delete;
806677703ceSMatt Fleming 	u64 read;
807677703ceSMatt Fleming 	u64 write;
808677703ceSMatt Fleming 	u64 get_position;
809677703ceSMatt Fleming 	u64 set_position;
810677703ceSMatt Fleming 	u64 get_info;
811677703ceSMatt Fleming 	u64 set_info;
812677703ceSMatt Fleming 	u64 flush;
813677703ceSMatt Fleming } efi_file_handle_64_t;
814677703ceSMatt Fleming 
815ed37ddffSRoy Franz typedef struct _efi_file_handle {
81655839d51SMatt Fleming 	u64 revision;
817ed37ddffSRoy Franz 	efi_status_t (*open)(struct _efi_file_handle *,
818ed37ddffSRoy Franz 			     struct _efi_file_handle **,
819ed37ddffSRoy Franz 			     efi_char16_t *, u64, u64);
820ed37ddffSRoy Franz 	efi_status_t (*close)(struct _efi_file_handle *);
82155839d51SMatt Fleming 	void *delete;
822ed37ddffSRoy Franz 	efi_status_t (*read)(struct _efi_file_handle *, unsigned long *,
823ed37ddffSRoy Franz 			     void *);
82455839d51SMatt Fleming 	void *write;
82555839d51SMatt Fleming 	void *get_position;
82655839d51SMatt Fleming 	void *set_position;
827ed37ddffSRoy Franz 	efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *,
828ed37ddffSRoy Franz 			unsigned long *, void *);
82955839d51SMatt Fleming 	void *set_info;
83055839d51SMatt Fleming 	void *flush;
83155839d51SMatt Fleming } efi_file_handle_t;
83255839d51SMatt Fleming 
833ed37ddffSRoy Franz typedef struct _efi_file_io_interface {
834ed37ddffSRoy Franz 	u64 revision;
835ed37ddffSRoy Franz 	int (*open_volume)(struct _efi_file_io_interface *,
836ed37ddffSRoy Franz 			   efi_file_handle_t **);
837ed37ddffSRoy Franz } efi_file_io_interface_t;
838ed37ddffSRoy Franz 
83955839d51SMatt Fleming #define EFI_FILE_MODE_READ	0x0000000000000001
84055839d51SMatt Fleming #define EFI_FILE_MODE_WRITE	0x0000000000000002
84155839d51SMatt Fleming #define EFI_FILE_MODE_CREATE	0x8000000000000000
84255839d51SMatt Fleming 
843bf924863SArd Biesheuvel typedef struct {
844bf924863SArd Biesheuvel 	u32 version;
845bf924863SArd Biesheuvel 	u32 length;
846bf924863SArd Biesheuvel 	u64 memory_protection_attribute;
847bf924863SArd Biesheuvel } efi_properties_table_t;
848bf924863SArd Biesheuvel 
849bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_VERSION	0x00010000
850bf924863SArd Biesheuvel #define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA	0x1
851bf924863SArd Biesheuvel 
852b2c99e3cSBjorn Helgaas #define EFI_INVALID_TABLE_ADDR		(~0UL)
853b2c99e3cSBjorn Helgaas 
854*a604af07SArd Biesheuvel typedef struct {
855*a604af07SArd Biesheuvel 	u32 version;
856*a604af07SArd Biesheuvel 	u32 num_entries;
857*a604af07SArd Biesheuvel 	u32 desc_size;
858*a604af07SArd Biesheuvel 	u32 reserved;
859*a604af07SArd Biesheuvel 	efi_memory_desc_t entry[0];
860*a604af07SArd Biesheuvel } efi_memory_attributes_table_t;
861*a604af07SArd Biesheuvel 
8621da177e4SLinus Torvalds /*
8631da177e4SLinus Torvalds  * All runtime access to EFI goes through this structure:
8641da177e4SLinus Torvalds  */
8651da177e4SLinus Torvalds extern struct efi {
8661da177e4SLinus Torvalds 	efi_system_table_t *systab;	/* EFI system table */
8673b370237SMatthew Garrett 	unsigned int runtime_version;	/* Runtime services version */
868b2c99e3cSBjorn Helgaas 	unsigned long mps;		/* MPS table */
869b2c99e3cSBjorn Helgaas 	unsigned long acpi;		/* ACPI table  (IA64 ext 0.71) */
870b2c99e3cSBjorn Helgaas 	unsigned long acpi20;		/* ACPI table  (ACPI 2.0) */
871e1ccbbc9SArd Biesheuvel 	unsigned long smbios;		/* SMBIOS table (32 bit entry point) */
872e1ccbbc9SArd Biesheuvel 	unsigned long smbios3;		/* SMBIOS table (64 bit entry point) */
873b2c99e3cSBjorn Helgaas 	unsigned long sal_systab;	/* SAL system table */
874b2c99e3cSBjorn Helgaas 	unsigned long boot_info;	/* boot info table */
875b2c99e3cSBjorn Helgaas 	unsigned long hcdp;		/* HCDP table */
876b2c99e3cSBjorn Helgaas 	unsigned long uga;		/* UGA table */
877a50f70b1SRuss Anderson 	unsigned long uv_systab;	/* UV system table */
878a0998eb1SDave Young 	unsigned long fw_vendor;	/* fw_vendor */
879a0998eb1SDave Young 	unsigned long runtime;		/* runtime table */
880a0998eb1SDave Young 	unsigned long config_table;	/* config tables */
8810bb54905SPeter Jones 	unsigned long esrt;		/* ESRT table */
882bf924863SArd Biesheuvel 	unsigned long properties_table;	/* properties table */
883*a604af07SArd Biesheuvel 	unsigned long mem_attr_table;	/* memory attributes table */
8841da177e4SLinus Torvalds 	efi_get_time_t *get_time;
8851da177e4SLinus Torvalds 	efi_set_time_t *set_time;
8861da177e4SLinus Torvalds 	efi_get_wakeup_time_t *get_wakeup_time;
8871da177e4SLinus Torvalds 	efi_set_wakeup_time_t *set_wakeup_time;
8881da177e4SLinus Torvalds 	efi_get_variable_t *get_variable;
8891da177e4SLinus Torvalds 	efi_get_next_variable_t *get_next_variable;
8901da177e4SLinus Torvalds 	efi_set_variable_t *set_variable;
89170d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
8923b370237SMatthew Garrett 	efi_query_variable_info_t *query_variable_info;
893d3cac1f8SArd Biesheuvel 	efi_query_variable_info_t *query_variable_info_nonblocking;
8943b370237SMatthew Garrett 	efi_update_capsule_t *update_capsule;
8953b370237SMatthew Garrett 	efi_query_capsule_caps_t *query_capsule_caps;
8961da177e4SLinus Torvalds 	efi_get_next_high_mono_count_t *get_next_high_mono_count;
8971da177e4SLinus Torvalds 	efi_reset_system_t *reset_system;
8981da177e4SLinus Torvalds 	efi_set_virtual_address_map_t *set_virtual_address_map;
899884f4f66SMatt Fleming 	struct efi_memory_map memmap;
9003e909599SMatt Fleming 	unsigned long flags;
9011da177e4SLinus Torvalds } efi;
9021da177e4SLinus Torvalds 
9031da177e4SLinus Torvalds static inline int
9041da177e4SLinus Torvalds efi_guidcmp (efi_guid_t left, efi_guid_t right)
9051da177e4SLinus Torvalds {
9061da177e4SLinus Torvalds 	return memcmp(&left, &right, sizeof (efi_guid_t));
9071da177e4SLinus Torvalds }
9081da177e4SLinus Torvalds 
9091da177e4SLinus Torvalds static inline char *
91026e02272SBorislav Petkov efi_guid_to_str(efi_guid_t *guid, char *out)
9111da177e4SLinus Torvalds {
912925ede0bSJoe Perches 	sprintf(out, "%pUl", guid->b);
9131da177e4SLinus Torvalds         return out;
9141da177e4SLinus Torvalds }
9151da177e4SLinus Torvalds 
9161da177e4SLinus Torvalds extern void efi_init (void);
9171da177e4SLinus Torvalds extern void *efi_get_pal_addr (void);
9181da177e4SLinus Torvalds extern void efi_map_pal_code (void);
9191da177e4SLinus Torvalds extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
9201da177e4SLinus Torvalds extern void efi_gettimeofday (struct timespec *ts);
9211da177e4SLinus Torvalds extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
92278510792SJosh Triplett #ifdef CONFIG_X86
9232223af38SJosh Triplett extern void efi_late_init(void);
92478510792SJosh Triplett extern void efi_free_boot_services(void);
925ca0e30dcSArd Biesheuvel extern efi_status_t efi_query_variable_store(u32 attributes,
926ca0e30dcSArd Biesheuvel 					     unsigned long size,
927ca0e30dcSArd Biesheuvel 					     bool nonblocking);
928b05b9f5fSTony Luck extern void efi_find_mirror(void);
92978510792SJosh Triplett #else
9302223af38SJosh Triplett static inline void efi_late_init(void) {}
93178510792SJosh Triplett static inline void efi_free_boot_services(void) {}
932a6e4d5a0SMatt Fleming 
933ca0e30dcSArd Biesheuvel static inline efi_status_t efi_query_variable_store(u32 attributes,
934ca0e30dcSArd Biesheuvel 						    unsigned long size,
935ca0e30dcSArd Biesheuvel 						    bool nonblocking)
936a6e4d5a0SMatt Fleming {
937a6e4d5a0SMatt Fleming 	return EFI_SUCCESS;
938a6e4d5a0SMatt Fleming }
93978510792SJosh Triplett #endif
9407bc90e01SJosh Triplett extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
941272686bfSLeif Lindholm extern int efi_config_init(efi_config_table_type_t *arch_tables);
9423846c158SPeter Jones #ifdef CONFIG_EFI_ESRT
9430bb54905SPeter Jones extern void __init efi_esrt_init(void);
9443846c158SPeter Jones #else
9453846c158SPeter Jones static inline void efi_esrt_init(void) { }
9463846c158SPeter Jones #endif
9477bb68410SArd Biesheuvel extern int efi_config_parse_tables(void *config_tables, int count, int sz,
9487bb68410SArd Biesheuvel 				   efi_config_table_type_t *arch_tables);
9491da177e4SLinus Torvalds extern u64 efi_get_iobase (void);
9501da177e4SLinus Torvalds extern u32 efi_mem_type (unsigned long phys_addr);
9511da177e4SLinus Torvalds extern u64 efi_mem_attributes (unsigned long phys_addr);
95232e62c63SBjorn Helgaas extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
9531da177e4SLinus Torvalds extern int __init efi_uart_console_only (void);
9540bb54905SPeter Jones extern u64 efi_mem_desc_end(efi_memory_desc_t *md);
9550bb54905SPeter Jones extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
9561da177e4SLinus Torvalds extern void efi_initialize_iomem_resources(struct resource *code_resource,
95700bf4098SBernhard Walle 		struct resource *data_resource, struct resource *bss_resource);
9583565184eSDavid Vrabel extern void efi_get_time(struct timespec *now);
959916f676fSMatthew Garrett extern void efi_reserve_boot_services(void);
9607968c0e3SLeif Lindholm extern int efi_get_fdt_params(struct efi_fdt_params *params);
9610bb54905SPeter Jones extern struct kobject *efi_kobj;
9621da177e4SLinus Torvalds 
96344be28e9SMatt Fleming extern int efi_reboot_quirk_mode;
9640c5ed61aSMatt Fleming extern bool efi_poweroff_required(void);
9650c5ed61aSMatt Fleming 
9660f96a99dSTaku Izumi #ifdef CONFIG_EFI_FAKE_MEMMAP
9670f96a99dSTaku Izumi extern void __init efi_fake_memmap(void);
9680f96a99dSTaku Izumi #else
9690f96a99dSTaku Izumi static inline void efi_fake_memmap(void) { }
9700f96a99dSTaku Izumi #endif
9710f96a99dSTaku Izumi 
972e885cd80SMark Salter /* Iterate through an efi_memory_map */
97378ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md)				   \
974e885cd80SMark Salter 	for ((md) = (m)->map;						   \
975e885cd80SMark Salter 	     (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \
976e885cd80SMark Salter 	     (md) = (void *)(md) + (m)->desc_size)
977e885cd80SMark Salter 
97878ce248fSMatt Fleming /**
97978ce248fSMatt Fleming  * for_each_efi_memory_desc - iterate over descriptors in efi.memmap
98078ce248fSMatt Fleming  * @md: the efi_memory_desc_t * iterator
98178ce248fSMatt Fleming  *
98278ce248fSMatt Fleming  * Once the loop finishes @md must not be accessed.
98378ce248fSMatt Fleming  */
98478ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \
985884f4f66SMatt Fleming 	for_each_efi_memory_desc_in_map(&efi.memmap, md)
98678ce248fSMatt Fleming 
98798d2a6caSLaszlo Ersek /*
98898d2a6caSLaszlo Ersek  * Format an EFI memory descriptor's type and attributes to a user-provided
98998d2a6caSLaszlo Ersek  * character buffer, as per snprintf(), and return the buffer.
99098d2a6caSLaszlo Ersek  */
99198d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size,
99298d2a6caSLaszlo Ersek 				     const efi_memory_desc_t *md);
99398d2a6caSLaszlo Ersek 
9941da177e4SLinus Torvalds /**
9951da177e4SLinus Torvalds  * efi_range_is_wc - check the WC bit on an address range
9961da177e4SLinus Torvalds  * @start: starting kvirt address
9971da177e4SLinus Torvalds  * @len: length of range
9981da177e4SLinus Torvalds  *
9991da177e4SLinus Torvalds  * Consult the EFI memory map and make sure it's ok to set this range WC.
10001da177e4SLinus Torvalds  * Returns true or false.
10011da177e4SLinus Torvalds  */
10021da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len)
10031da177e4SLinus Torvalds {
1004986a80d5SJesper Juhl 	unsigned long i;
10051da177e4SLinus Torvalds 
10061da177e4SLinus Torvalds 	for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) {
10071da177e4SLinus Torvalds 		unsigned long paddr = __pa(start + i);
10081da177e4SLinus Torvalds 		if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC))
10091da177e4SLinus Torvalds 			return 0;
10101da177e4SLinus Torvalds 	}
10111da177e4SLinus Torvalds 	/* The range checked out */
10121da177e4SLinus Torvalds 	return 1;
10131da177e4SLinus Torvalds }
10141da177e4SLinus Torvalds 
10151da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP
10161da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *);
10171da177e4SLinus Torvalds #endif
10181da177e4SLinus Torvalds 
10191da177e4SLinus Torvalds /*
102083e68189SMatt Fleming  * We play games with efi_enabled so that the compiler will, if
102183e68189SMatt Fleming  * possible, remove EFI-related code altogether.
10221da177e4SLinus Torvalds  */
102383e68189SMatt Fleming #define EFI_BOOT		0	/* Were we booted from EFI? */
102483e68189SMatt Fleming #define EFI_CONFIG_TABLES	2	/* Can we use EFI config tables? */
102583e68189SMatt Fleming #define EFI_RUNTIME_SERVICES	3	/* Can we use runtime services? */
102683e68189SMatt Fleming #define EFI_MEMMAP		4	/* Can we use EFI memory map? */
102783e68189SMatt Fleming #define EFI_64BIT		5	/* Is the firmware 64-bit? */
10289f27bc54SDaniel Kiper #define EFI_PARAVIRT		6	/* Access is via a paravirt interface */
10299f27bc54SDaniel Kiper #define EFI_ARCH_1		7	/* First arch-specific bit */
1030fed6cefeSBorislav Petkov #define EFI_DBG			8	/* Print additional debug info at runtime */
1031a1041713SArd Biesheuvel #define EFI_NX_PE_DATA		9	/* Can runtime data regions be mapped non-executable? */
103283e68189SMatt Fleming 
10331da177e4SLinus Torvalds #ifdef CONFIG_EFI
10343e909599SMatt Fleming /*
10353e909599SMatt Fleming  * Test whether the above EFI_* bits are enabled.
10363e909599SMatt Fleming  */
10373e909599SMatt Fleming static inline bool efi_enabled(int feature)
103883e68189SMatt Fleming {
10393e909599SMatt Fleming 	return test_bit(feature, &efi.flags) != 0;
10403e909599SMatt Fleming }
10418562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
10423e909599SMatt Fleming #else
10433e909599SMatt Fleming static inline bool efi_enabled(int feature)
10443e909599SMatt Fleming {
10453e909599SMatt Fleming 	return false;
104683e68189SMatt Fleming }
10478562c99cSMatt Fleming static inline void
10488562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
10491da177e4SLinus Torvalds #endif
10501da177e4SLinus Torvalds 
10511da177e4SLinus Torvalds /*
10521da177e4SLinus Torvalds  * Variable Attributes
10531da177e4SLinus Torvalds  */
10541da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
10551da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
10561da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
105741b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
105841b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
105941b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
106041b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE	0x0000000000000040
10611da177e4SLinus Torvalds 
106241b3254cSMatthew Garrett #define EFI_VARIABLE_MASK 	(EFI_VARIABLE_NON_VOLATILE | \
106341b3254cSMatthew Garrett 				EFI_VARIABLE_BOOTSERVICE_ACCESS | \
106441b3254cSMatthew Garrett 				EFI_VARIABLE_RUNTIME_ACCESS | \
106541b3254cSMatthew Garrett 				EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
106641b3254cSMatthew Garrett 				EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
106741b3254cSMatthew Garrett 				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
106841b3254cSMatthew Garrett 				EFI_VARIABLE_APPEND_WRITE)
10691da177e4SLinus Torvalds /*
1070e14ab23dSMatt Fleming  * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
1071e14ab23dSMatt Fleming  * not including trailing NUL
1072e14ab23dSMatt Fleming  */
1073e14ab23dSMatt Fleming #define EFI_VARIABLE_GUID_LEN 36
1074e14ab23dSMatt Fleming 
1075e14ab23dSMatt Fleming /*
1076e2527a7cSMatt Fleming  * The type of search to perform when calling boottime->locate_handle
1077e2527a7cSMatt Fleming  */
1078e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES			0
1079e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1080e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL			2
1081e2527a7cSMatt Fleming 
1082e2527a7cSMatt Fleming /*
10831da177e4SLinus Torvalds  * EFI Device Path information
10841da177e4SLinus Torvalds  */
10851da177e4SLinus Torvalds #define EFI_DEV_HW			0x01
10861da177e4SLinus Torvalds #define  EFI_DEV_PCI				 1
10871da177e4SLinus Torvalds #define  EFI_DEV_PCCARD				 2
10881da177e4SLinus Torvalds #define  EFI_DEV_MEM_MAPPED			 3
10891da177e4SLinus Torvalds #define  EFI_DEV_VENDOR				 4
10901da177e4SLinus Torvalds #define  EFI_DEV_CONTROLLER			 5
10911da177e4SLinus Torvalds #define EFI_DEV_ACPI			0x02
10921da177e4SLinus Torvalds #define   EFI_DEV_BASIC_ACPI			 1
10931da177e4SLinus Torvalds #define   EFI_DEV_EXPANDED_ACPI			 2
10941da177e4SLinus Torvalds #define EFI_DEV_MSG			0x03
10951da177e4SLinus Torvalds #define   EFI_DEV_MSG_ATAPI			 1
10961da177e4SLinus Torvalds #define   EFI_DEV_MSG_SCSI			 2
10971da177e4SLinus Torvalds #define   EFI_DEV_MSG_FC			 3
10981da177e4SLinus Torvalds #define   EFI_DEV_MSG_1394			 4
10991da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB			 5
11001da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB_CLASS			15
11011da177e4SLinus Torvalds #define   EFI_DEV_MSG_I20			 6
11021da177e4SLinus Torvalds #define   EFI_DEV_MSG_MAC			11
11031da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV4			12
11041da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV6			13
11051da177e4SLinus Torvalds #define   EFI_DEV_MSG_INFINIBAND		 9
11061da177e4SLinus Torvalds #define   EFI_DEV_MSG_UART			14
11071da177e4SLinus Torvalds #define   EFI_DEV_MSG_VENDOR			10
11081da177e4SLinus Torvalds #define EFI_DEV_MEDIA			0x04
11091da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_HARD_DRIVE		 1
11101da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_CDROM			 2
11111da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_VENDOR			 3
11121da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_FILE			 4
11131da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_PROTOCOL		 5
11141da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT		0x05
11151da177e4SLinus Torvalds #define EFI_DEV_END_PATH		0x7F
11161da177e4SLinus Torvalds #define EFI_DEV_END_PATH2		0xFF
11171da177e4SLinus Torvalds #define   EFI_DEV_END_INSTANCE			0x01
11181da177e4SLinus Torvalds #define   EFI_DEV_END_ENTIRE			0xFF
11191da177e4SLinus Torvalds 
11201da177e4SLinus Torvalds struct efi_generic_dev_path {
11211da177e4SLinus Torvalds 	u8 type;
11221da177e4SLinus Torvalds 	u8 sub_type;
11231da177e4SLinus Torvalds 	u16 length;
11241da177e4SLinus Torvalds } __attribute ((packed));
11251da177e4SLinus Torvalds 
11264a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
11274a3575fdSHuang, Ying {
11284a3575fdSHuang, Ying 	*npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
11294a3575fdSHuang, Ying 	*addr &= PAGE_MASK;
11304a3575fdSHuang, Ying }
11314a3575fdSHuang, Ying 
113204851772SMatt Fleming /*
11334fc756bdSMike Waychison  * EFI Variable support.
11344fc756bdSMike Waychison  *
11354fc756bdSMike Waychison  * Different firmware drivers can expose their EFI-like variables using
11364fc756bdSMike Waychison  * the following.
11374fc756bdSMike Waychison  */
11384fc756bdSMike Waychison 
11394fc756bdSMike Waychison struct efivar_operations {
11404fc756bdSMike Waychison 	efi_get_variable_t *get_variable;
11414fc756bdSMike Waychison 	efi_get_next_variable_t *get_next_variable;
11424fc756bdSMike Waychison 	efi_set_variable_t *set_variable;
114370d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
1144a6e4d5a0SMatt Fleming 	efi_query_variable_store_t *query_variable_store;
11454fc756bdSMike Waychison };
11464fc756bdSMike Waychison 
11474fc756bdSMike Waychison struct efivars {
11484fc756bdSMike Waychison 	/*
11494fc756bdSMike Waychison 	 * ->lock protects two things:
115082f990a8SMatt Fleming 	 * 1) efivarfs_list and efivars_sysfs_list
115182f990a8SMatt Fleming 	 * 2) ->ops calls
11524fc756bdSMike Waychison 	 */
11534fc756bdSMike Waychison 	spinlock_t lock;
11544fc756bdSMike Waychison 	struct kset *kset;
1155605e70c7SLee, Chun-Yi 	struct kobject *kobject;
11564fc756bdSMike Waychison 	const struct efivar_operations *ops;
11574fc756bdSMike Waychison };
11584fc756bdSMike Waychison 
1159e14ab23dSMatt Fleming /*
1160e14ab23dSMatt Fleming  * The maximum size of VariableName + Data = 1024
1161e14ab23dSMatt Fleming  * Therefore, it's reasonable to save that much
1162e14ab23dSMatt Fleming  * space in each part of the structure,
1163e14ab23dSMatt Fleming  * and we use a page for reading/writing.
1164e14ab23dSMatt Fleming  */
1165e14ab23dSMatt Fleming 
1166a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN	1024
1167a5d92ad3SMatt Fleming 
1168e14ab23dSMatt Fleming struct efi_variable {
1169a5d92ad3SMatt Fleming 	efi_char16_t  VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)];
1170e14ab23dSMatt Fleming 	efi_guid_t    VendorGuid;
1171e14ab23dSMatt Fleming 	unsigned long DataSize;
1172e14ab23dSMatt Fleming 	__u8          Data[1024];
1173e14ab23dSMatt Fleming 	efi_status_t  Status;
1174e14ab23dSMatt Fleming 	__u32         Attributes;
1175e14ab23dSMatt Fleming } __attribute__((packed));
1176e14ab23dSMatt Fleming 
1177e14ab23dSMatt Fleming struct efivar_entry {
1178e14ab23dSMatt Fleming 	struct efi_variable var;
1179e14ab23dSMatt Fleming 	struct list_head list;
1180e14ab23dSMatt Fleming 	struct kobject kobj;
1181e0d59733SSeiji Aguchi 	bool scanning;
1182e0d59733SSeiji Aguchi 	bool deleting;
1183e14ab23dSMatt Fleming };
1184e14ab23dSMatt Fleming 
1185677703ceSMatt Fleming struct efi_simple_text_output_protocol_32 {
1186677703ceSMatt Fleming 	u32 reset;
1187677703ceSMatt Fleming 	u32 output_string;
1188677703ceSMatt Fleming 	u32 test_string;
1189677703ceSMatt Fleming };
1190677703ceSMatt Fleming 
1191677703ceSMatt Fleming struct efi_simple_text_output_protocol_64 {
1192677703ceSMatt Fleming 	u64 reset;
1193677703ceSMatt Fleming 	u64 output_string;
1194677703ceSMatt Fleming 	u64 test_string;
1195677703ceSMatt Fleming };
1196ed37ddffSRoy Franz 
1197ed37ddffSRoy Franz struct efi_simple_text_output_protocol {
1198ed37ddffSRoy Franz 	void *reset;
1199ed37ddffSRoy Franz 	efi_status_t (*output_string)(void *, void *);
1200ed37ddffSRoy Franz 	void *test_string;
1201ed37ddffSRoy Franz };
1202ed37ddffSRoy Franz 
120304851772SMatt Fleming extern struct list_head efivar_sysfs_list;
120404851772SMatt Fleming 
120504851772SMatt Fleming static inline void
120604851772SMatt Fleming efivar_unregister(struct efivar_entry *var)
120704851772SMatt Fleming {
120804851772SMatt Fleming 	kobject_put(&var->kobj);
120904851772SMatt Fleming }
121004851772SMatt Fleming 
1211e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars,
12124fc756bdSMike Waychison 		     const struct efivar_operations *ops,
1213e14ab23dSMatt Fleming 		     struct kobject *kobject);
1214e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars);
1215e14ab23dSMatt Fleming struct kobject *efivars_kobject(void);
1216e14ab23dSMatt Fleming 
1217e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
1218e14ab23dSMatt Fleming 		void *data, bool atomic, bool duplicates,
1219e14ab23dSMatt Fleming 		struct list_head *head);
1220e14ab23dSMatt Fleming 
1221e14ab23dSMatt Fleming void efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
1222e14ab23dSMatt Fleming void efivar_entry_remove(struct efivar_entry *entry);
1223e14ab23dSMatt Fleming 
1224e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry);
1225e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry);
1226e14ab23dSMatt Fleming 
1227e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
12288a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
12298a415b8cSMatt Fleming 		       unsigned long *size, void *data);
1230e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1231e14ab23dSMatt Fleming 		     unsigned long *size, void *data);
1232e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
1233e14ab23dSMatt Fleming 		     unsigned long size, void *data, struct list_head *head);
1234e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
1235e14ab23dSMatt Fleming 			      unsigned long *size, void *data, bool *set);
1236e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
1237e14ab23dSMatt Fleming 			  bool block, unsigned long size, void *data);
1238e14ab23dSMatt Fleming 
1239e14ab23dSMatt Fleming void efivar_entry_iter_begin(void);
1240e14ab23dSMatt Fleming void efivar_entry_iter_end(void);
1241e14ab23dSMatt Fleming 
1242e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1243e14ab23dSMatt Fleming 			struct list_head *head, void *data,
1244e14ab23dSMatt Fleming 			struct efivar_entry **prev);
1245e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1246e14ab23dSMatt Fleming 		      struct list_head *head, void *data);
1247e14ab23dSMatt Fleming 
1248e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
1249e14ab23dSMatt Fleming 				       struct list_head *head, bool remove);
1250e14ab23dSMatt Fleming 
12518282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
12528282f5d9SPeter Jones 		     unsigned long data_size);
1253ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
1254ed8b0de5SPeter Jones 				  size_t len);
1255e14ab23dSMatt Fleming 
1256a9499fa7STom Gundersen extern struct work_struct efivar_work;
125704851772SMatt Fleming void efivar_run_worker(void);
125804851772SMatt Fleming 
1259a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
1260e14ab23dSMatt Fleming int efivars_sysfs_init(void);
12614fc756bdSMike Waychison 
1262e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024
1263e0d59733SSeiji Aguchi 
12644fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */
12654fc756bdSMike Waychison 
1266926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP
1267926172d4SDave Young int efi_runtime_map_init(struct kobject *);
1268926172d4SDave Young void efi_runtime_map_setup(void *, int, u32);
12696a2c20e7SVivek Goyal int efi_get_runtime_map_size(void);
12706a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void);
12716a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz);
1272926172d4SDave Young #else
1273926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj)
1274926172d4SDave Young {
1275926172d4SDave Young 	return 0;
1276926172d4SDave Young }
1277926172d4SDave Young 
1278926172d4SDave Young static inline void
1279926172d4SDave Young efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size) {}
12806a2c20e7SVivek Goyal 
12816a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void)
12826a2c20e7SVivek Goyal {
12836a2c20e7SVivek Goyal 	return 0;
12846a2c20e7SVivek Goyal }
12856a2c20e7SVivek Goyal 
12866a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void)
12876a2c20e7SVivek Goyal {
12886a2c20e7SVivek Goyal 	return 0;
12896a2c20e7SVivek Goyal }
12906a2c20e7SVivek Goyal 
12916a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
12926a2c20e7SVivek Goyal {
12936a2c20e7SVivek Goyal 	return 0;
12946a2c20e7SVivek Goyal }
12956a2c20e7SVivek Goyal 
1296926172d4SDave Young #endif
1297926172d4SDave Young 
1298bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */
1299bd669475SArd Biesheuvel 
1300bd669475SArd Biesheuvel #define pr_efi(sys_table, msg)     efi_printk(sys_table, "EFI stub: "msg)
1301bd669475SArd Biesheuvel #define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg)
1302bd669475SArd Biesheuvel 
1303bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str);
1304bd669475SArd Biesheuvel 
1305bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
1306bd669475SArd Biesheuvel 	      unsigned long addr);
1307bd669475SArd Biesheuvel 
1308bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,
1309bd669475SArd Biesheuvel 			  efi_loaded_image_t *image, int *cmd_line_len);
1310bd669475SArd Biesheuvel 
1311bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
1312bd669475SArd Biesheuvel 				efi_memory_desc_t **map,
1313bd669475SArd Biesheuvel 				unsigned long *map_size,
1314bd669475SArd Biesheuvel 				unsigned long *desc_size,
1315bd669475SArd Biesheuvel 				u32 *desc_ver,
1316bd669475SArd Biesheuvel 				unsigned long *key_ptr);
1317bd669475SArd Biesheuvel 
1318bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
1319bd669475SArd Biesheuvel 			   unsigned long size, unsigned long align,
1320bd669475SArd Biesheuvel 			   unsigned long *addr);
1321bd669475SArd Biesheuvel 
1322bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
1323bd669475SArd Biesheuvel 			    unsigned long size, unsigned long align,
1324bd669475SArd Biesheuvel 			    unsigned long *addr, unsigned long max);
1325bd669475SArd Biesheuvel 
1326bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
1327bd669475SArd Biesheuvel 				 unsigned long *image_addr,
1328bd669475SArd Biesheuvel 				 unsigned long image_size,
1329bd669475SArd Biesheuvel 				 unsigned long alloc_size,
1330bd669475SArd Biesheuvel 				 unsigned long preferred_addr,
1331bd669475SArd Biesheuvel 				 unsigned long alignment);
1332bd669475SArd Biesheuvel 
1333bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
1334bd669475SArd Biesheuvel 				  efi_loaded_image_t *image,
1335bd669475SArd Biesheuvel 				  char *cmd_line, char *option_string,
1336bd669475SArd Biesheuvel 				  unsigned long max_addr,
1337bd669475SArd Biesheuvel 				  unsigned long *load_addr,
1338bd669475SArd Biesheuvel 				  unsigned long *load_size);
1339bd669475SArd Biesheuvel 
13405a17dae4SMatt Fleming efi_status_t efi_parse_options(char *cmdline);
13415a17dae4SMatt Fleming 
1342b2e0a54aSDave Young bool efi_runtime_disabled(void);
13431da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */
1344