xref: /openbmc/linux/include/linux/efi.h (revision 1786e83011644e18732ed006413339d5323766e9)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _LINUX_EFI_H
31da177e4SLinus Torvalds #define _LINUX_EFI_H
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds  * Extensible Firmware Interface
71da177e4SLinus Torvalds  * Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  * Copyright (C) 1999 VA Linux Systems
101da177e4SLinus Torvalds  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
111da177e4SLinus Torvalds  * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
121da177e4SLinus Torvalds  *	David Mosberger-Tang <davidm@hpl.hp.com>
131da177e4SLinus Torvalds  *	Stephane Eranian <eranian@hpl.hp.com>
141da177e4SLinus Torvalds  */
151da177e4SLinus Torvalds #include <linux/init.h>
161da177e4SLinus Torvalds #include <linux/string.h>
171da177e4SLinus Torvalds #include <linux/time.h>
181da177e4SLinus Torvalds #include <linux/types.h>
191da177e4SLinus Torvalds #include <linux/proc_fs.h>
201da177e4SLinus Torvalds #include <linux/rtc.h>
211da177e4SLinus Torvalds #include <linux/ioport.h>
224a3575fdSHuang, Ying #include <linux/pfn.h>
235ee9c198SMatthew Garrett #include <linux/pstore.h>
2460863c0dSMatt Fleming #include <linux/range.h>
258562c99cSMatt Fleming #include <linux/reboot.h>
26ba7e34b1SAndy Shevchenko #include <linux/uuid.h>
272c23b73cSArd Biesheuvel #include <linux/screen_info.h>
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds #include <asm/page.h>
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds #define EFI_SUCCESS		0
321da177e4SLinus Torvalds #define EFI_LOAD_ERROR          ( 1 | (1UL << (BITS_PER_LONG-1)))
331da177e4SLinus Torvalds #define EFI_INVALID_PARAMETER	( 2 | (1UL << (BITS_PER_LONG-1)))
341da177e4SLinus Torvalds #define EFI_UNSUPPORTED		( 3 | (1UL << (BITS_PER_LONG-1)))
351da177e4SLinus Torvalds #define EFI_BAD_BUFFER_SIZE     ( 4 | (1UL << (BITS_PER_LONG-1)))
361da177e4SLinus Torvalds #define EFI_BUFFER_TOO_SMALL	( 5 | (1UL << (BITS_PER_LONG-1)))
375d9db883SMatthew Garrett #define EFI_NOT_READY		( 6 | (1UL << (BITS_PER_LONG-1)))
385d9db883SMatthew Garrett #define EFI_DEVICE_ERROR	( 7 | (1UL << (BITS_PER_LONG-1)))
395d9db883SMatthew Garrett #define EFI_WRITE_PROTECTED	( 8 | (1UL << (BITS_PER_LONG-1)))
405d9db883SMatthew Garrett #define EFI_OUT_OF_RESOURCES	( 9 | (1UL << (BITS_PER_LONG-1)))
411da177e4SLinus Torvalds #define EFI_NOT_FOUND		(14 | (1UL << (BITS_PER_LONG-1)))
42dce48e35SArd Biesheuvel #define EFI_ABORTED		(21 | (1UL << (BITS_PER_LONG-1)))
435d9db883SMatthew Garrett #define EFI_SECURITY_VIOLATION	(26 | (1UL << (BITS_PER_LONG-1)))
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds typedef unsigned long efi_status_t;
461da177e4SLinus Torvalds typedef u8 efi_bool_t;
471da177e4SLinus Torvalds typedef u16 efi_char16_t;		/* UNICODE character */
48ed37ddffSRoy Franz typedef u64 efi_physical_addr_t;
49ed37ddffSRoy Franz typedef void *efi_handle_t;
501da177e4SLinus Torvalds 
512732ea0dSArd Biesheuvel #define efi_get_handle_at(array, idx)					\
522732ea0dSArd Biesheuvel 	(efi_is_64bit() ? (efi_handle_t)(unsigned long)((u64 *)(array))[idx] \
532732ea0dSArd Biesheuvel 		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
542732ea0dSArd Biesheuvel 
552732ea0dSArd Biesheuvel #define efi_get_handle_num(size)					\
562732ea0dSArd Biesheuvel 	((size) / (efi_is_64bit() ? sizeof(u64) : sizeof(u32)))
572732ea0dSArd Biesheuvel 
582732ea0dSArd Biesheuvel #define for_each_efi_handle(handle, array, size, i)			\
592732ea0dSArd Biesheuvel 	for (i = 0;							\
602732ea0dSArd Biesheuvel 	     i < efi_get_handle_num(size) &&				\
612732ea0dSArd Biesheuvel 		((handle = efi_get_handle_at((array), i)) || true);	\
622732ea0dSArd Biesheuvel 	     i++)
632732ea0dSArd Biesheuvel 
64494c704fSArd Biesheuvel /*
65494c704fSArd Biesheuvel  * The UEFI spec and EDK2 reference implementation both define EFI_GUID as
66494c704fSArd Biesheuvel  * struct { u32 a; u16; b; u16 c; u8 d[8]; }; and so the implied alignment
67494c704fSArd Biesheuvel  * is 32 bits not 8 bits like our guid_t. In some cases (i.e., on 32-bit ARM),
68494c704fSArd Biesheuvel  * this means that firmware services invoked by the kernel may assume that
69494c704fSArd Biesheuvel  * efi_guid_t* arguments are 32-bit aligned, and use memory accessors that
70494c704fSArd Biesheuvel  * do not tolerate misalignment. So let's set the minimum alignment to 32 bits.
71494c704fSArd Biesheuvel  *
72494c704fSArd Biesheuvel  * Note that the UEFI spec as well as some comments in the EDK2 code base
73494c704fSArd Biesheuvel  * suggest that EFI_GUID should be 64-bit aligned, but this appears to be
74494c704fSArd Biesheuvel  * a mistake, given that no code seems to exist that actually enforces that
75494c704fSArd Biesheuvel  * or relies on it.
76494c704fSArd Biesheuvel  */
77494c704fSArd Biesheuvel typedef guid_t efi_guid_t __aligned(__alignof__(u32));
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
80c0020756SAndy Shevchenko 	GUID_INIT(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds /*
831da177e4SLinus Torvalds  * Generic EFI table header
841da177e4SLinus Torvalds  */
851da177e4SLinus Torvalds typedef	struct {
861da177e4SLinus Torvalds 	u64 signature;
871da177e4SLinus Torvalds 	u32 revision;
881da177e4SLinus Torvalds 	u32 headersize;
891da177e4SLinus Torvalds 	u32 crc32;
901da177e4SLinus Torvalds 	u32 reserved;
911da177e4SLinus Torvalds } efi_table_hdr_t;
921da177e4SLinus Torvalds 
931da177e4SLinus Torvalds /*
941da177e4SLinus Torvalds  * Memory map descriptor:
951da177e4SLinus Torvalds  */
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds /* Memory types: */
981da177e4SLinus Torvalds #define EFI_RESERVED_TYPE		 0
991da177e4SLinus Torvalds #define EFI_LOADER_CODE			 1
1001da177e4SLinus Torvalds #define EFI_LOADER_DATA			 2
1011da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_CODE		 3
1021da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_DATA		 4
1031da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_CODE	 5
1041da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_DATA	 6
1051da177e4SLinus Torvalds #define EFI_CONVENTIONAL_MEMORY		 7
1061da177e4SLinus Torvalds #define EFI_UNUSABLE_MEMORY		 8
1071da177e4SLinus Torvalds #define EFI_ACPI_RECLAIM_MEMORY		 9
1081da177e4SLinus Torvalds #define EFI_ACPI_MEMORY_NVS		10
1091da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO		11
1101da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO_PORT_SPACE	12
1111da177e4SLinus Torvalds #define EFI_PAL_CODE			13
112ad5fb870SDan Williams #define EFI_PERSISTENT_MEMORY		14
113ad5fb870SDan Williams #define EFI_MAX_MEMORY_TYPE		15
1141da177e4SLinus Torvalds 
1151da177e4SLinus Torvalds /* Attribute values: */
1161da177e4SLinus Torvalds #define EFI_MEMORY_UC		((u64)0x0000000000000001ULL)	/* uncached */
1171da177e4SLinus Torvalds #define EFI_MEMORY_WC		((u64)0x0000000000000002ULL)	/* write-coalescing */
1181da177e4SLinus Torvalds #define EFI_MEMORY_WT		((u64)0x0000000000000004ULL)	/* write-through */
1191da177e4SLinus Torvalds #define EFI_MEMORY_WB		((u64)0x0000000000000008ULL)	/* write-back */
1209c97e0bdSLaszlo Ersek #define EFI_MEMORY_UCE		((u64)0x0000000000000010ULL)	/* uncached, exported */
1211da177e4SLinus Torvalds #define EFI_MEMORY_WP		((u64)0x0000000000001000ULL)	/* write-protect */
1221da177e4SLinus Torvalds #define EFI_MEMORY_RP		((u64)0x0000000000002000ULL)	/* read-protect */
1231da177e4SLinus Torvalds #define EFI_MEMORY_XP		((u64)0x0000000000004000ULL)	/* execute-protect */
124c016ca08SRobert Elliott #define EFI_MEMORY_NV		((u64)0x0000000000008000ULL)	/* non-volatile */
125b05b9f5fSTony Luck #define EFI_MEMORY_MORE_RELIABLE \
126b05b9f5fSTony Luck 				((u64)0x0000000000010000ULL)	/* higher reliability */
12787db73aeSArd Biesheuvel #define EFI_MEMORY_RO		((u64)0x0000000000020000ULL)	/* read-only */
128fe3e5e65SDan Williams #define EFI_MEMORY_SP		((u64)0x0000000000040000ULL)	/* soft reserved */
1291da177e4SLinus Torvalds #define EFI_MEMORY_RUNTIME	((u64)0x8000000000000000ULL)	/* range requires runtime mapping */
1301da177e4SLinus Torvalds #define EFI_MEMORY_DESCRIPTOR_VERSION	1
1311da177e4SLinus Torvalds 
1321da177e4SLinus Torvalds #define EFI_PAGE_SHIFT		12
133ed37ddffSRoy Franz #define EFI_PAGE_SIZE		(1UL << EFI_PAGE_SHIFT)
1340100a3e6SPeter Jones #define EFI_PAGES_MAX		(U64_MAX >> EFI_PAGE_SHIFT)
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds typedef struct {
1371da177e4SLinus Torvalds 	u32 type;
1381da177e4SLinus Torvalds 	u32 pad;
1391da177e4SLinus Torvalds 	u64 phys_addr;
1401da177e4SLinus Torvalds 	u64 virt_addr;
1411da177e4SLinus Torvalds 	u64 num_pages;
1421da177e4SLinus Torvalds 	u64 attribute;
1431da177e4SLinus Torvalds } efi_memory_desc_t;
1441da177e4SLinus Torvalds 
1453b370237SMatthew Garrett typedef struct {
1463b370237SMatthew Garrett 	efi_guid_t guid;
1473b370237SMatthew Garrett 	u32 headersize;
1483b370237SMatthew Garrett 	u32 flags;
1493b370237SMatthew Garrett 	u32 imagesize;
1503b370237SMatthew Garrett } efi_capsule_header_t;
1513b370237SMatthew Garrett 
152dadb57abSJeffrey Hugo struct efi_boot_memmap {
153dadb57abSJeffrey Hugo 	efi_memory_desc_t	**map;
154dadb57abSJeffrey Hugo 	unsigned long		*map_size;
155dadb57abSJeffrey Hugo 	unsigned long		*desc_size;
156dadb57abSJeffrey Hugo 	u32			*desc_ver;
157dadb57abSJeffrey Hugo 	unsigned long		*key_ptr;
158dadb57abSJeffrey Hugo 	unsigned long		*buff_size;
159dadb57abSJeffrey Hugo };
160dadb57abSJeffrey Hugo 
161bb05e4baSMatt Fleming /*
162f0133f3cSMatt Fleming  * EFI capsule flags
163f0133f3cSMatt Fleming  */
164f0133f3cSMatt Fleming #define EFI_CAPSULE_PERSIST_ACROSS_RESET	0x00010000
165f0133f3cSMatt Fleming #define EFI_CAPSULE_POPULATE_SYSTEM_TABLE	0x00020000
166f0133f3cSMatt Fleming #define EFI_CAPSULE_INITIATE_RESET		0x00040000
167f0133f3cSMatt Fleming 
1683fabd628SArd Biesheuvel struct capsule_info {
1693fabd628SArd Biesheuvel 	efi_capsule_header_t	header;
170f24c4d47SArd Biesheuvel 	efi_capsule_header_t	*capsule;
1713fabd628SArd Biesheuvel 	int			reset_type;
1723fabd628SArd Biesheuvel 	long			index;
1733fabd628SArd Biesheuvel 	size_t			count;
1743fabd628SArd Biesheuvel 	size_t			total_size;
175f24c4d47SArd Biesheuvel 	struct page		**pages;
176f24c4d47SArd Biesheuvel 	phys_addr_t		*phys;
1773fabd628SArd Biesheuvel 	size_t			page_bytes_remain;
1783fabd628SArd Biesheuvel };
1793fabd628SArd Biesheuvel 
1803fabd628SArd Biesheuvel int __efi_capsule_setup_info(struct capsule_info *cap_info);
1813fabd628SArd Biesheuvel 
182f0133f3cSMatt Fleming /*
183bb05e4baSMatt Fleming  * Allocation types for calls to boottime->allocate_pages.
184bb05e4baSMatt Fleming  */
185bb05e4baSMatt Fleming #define EFI_ALLOCATE_ANY_PAGES		0
186bb05e4baSMatt Fleming #define EFI_ALLOCATE_MAX_ADDRESS	1
187bb05e4baSMatt Fleming #define EFI_ALLOCATE_ADDRESS		2
188bb05e4baSMatt Fleming #define EFI_MAX_ALLOCATE_TYPE		3
189bb05e4baSMatt Fleming 
190e088a4adSMatthew Wilcox typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
1911da177e4SLinus Torvalds 
1921da177e4SLinus Torvalds /*
1931da177e4SLinus Torvalds  * Types and defines for Time Services
1941da177e4SLinus Torvalds  */
1951da177e4SLinus Torvalds #define EFI_TIME_ADJUST_DAYLIGHT 0x1
1961da177e4SLinus Torvalds #define EFI_TIME_IN_DAYLIGHT     0x2
1971da177e4SLinus Torvalds #define EFI_UNSPECIFIED_TIMEZONE 0x07ff
1981da177e4SLinus Torvalds 
1991da177e4SLinus Torvalds typedef struct {
2001da177e4SLinus Torvalds 	u16 year;
2011da177e4SLinus Torvalds 	u8 month;
2021da177e4SLinus Torvalds 	u8 day;
2031da177e4SLinus Torvalds 	u8 hour;
2041da177e4SLinus Torvalds 	u8 minute;
2051da177e4SLinus Torvalds 	u8 second;
2061da177e4SLinus Torvalds 	u8 pad1;
2071da177e4SLinus Torvalds 	u32 nanosecond;
2081da177e4SLinus Torvalds 	s16 timezone;
2091da177e4SLinus Torvalds 	u8 daylight;
2101da177e4SLinus Torvalds 	u8 pad2;
2111da177e4SLinus Torvalds } efi_time_t;
2121da177e4SLinus Torvalds 
2131da177e4SLinus Torvalds typedef struct {
2141da177e4SLinus Torvalds 	u32 resolution;
2151da177e4SLinus Torvalds 	u32 accuracy;
2161da177e4SLinus Torvalds 	u8 sets_to_zero;
2171da177e4SLinus Torvalds } efi_time_cap_t;
2181da177e4SLinus Torvalds 
219677703ceSMatt Fleming typedef struct {
220677703ceSMatt Fleming 	efi_table_hdr_t hdr;
221677703ceSMatt Fleming 	u32 raise_tpl;
222677703ceSMatt Fleming 	u32 restore_tpl;
223677703ceSMatt Fleming 	u32 allocate_pages;
224677703ceSMatt Fleming 	u32 free_pages;
225677703ceSMatt Fleming 	u32 get_memory_map;
226677703ceSMatt Fleming 	u32 allocate_pool;
227677703ceSMatt Fleming 	u32 free_pool;
228677703ceSMatt Fleming 	u32 create_event;
229677703ceSMatt Fleming 	u32 set_timer;
230677703ceSMatt Fleming 	u32 wait_for_event;
231677703ceSMatt Fleming 	u32 signal_event;
232677703ceSMatt Fleming 	u32 close_event;
233677703ceSMatt Fleming 	u32 check_event;
234677703ceSMatt Fleming 	u32 install_protocol_interface;
235677703ceSMatt Fleming 	u32 reinstall_protocol_interface;
236677703ceSMatt Fleming 	u32 uninstall_protocol_interface;
237677703ceSMatt Fleming 	u32 handle_protocol;
238677703ceSMatt Fleming 	u32 __reserved;
239677703ceSMatt Fleming 	u32 register_protocol_notify;
240677703ceSMatt Fleming 	u32 locate_handle;
241677703ceSMatt Fleming 	u32 locate_device_path;
242677703ceSMatt Fleming 	u32 install_configuration_table;
243677703ceSMatt Fleming 	u32 load_image;
244677703ceSMatt Fleming 	u32 start_image;
245677703ceSMatt Fleming 	u32 exit;
246677703ceSMatt Fleming 	u32 unload_image;
247677703ceSMatt Fleming 	u32 exit_boot_services;
248677703ceSMatt Fleming 	u32 get_next_monotonic_count;
249677703ceSMatt Fleming 	u32 stall;
250677703ceSMatt Fleming 	u32 set_watchdog_timer;
251677703ceSMatt Fleming 	u32 connect_controller;
252677703ceSMatt Fleming 	u32 disconnect_controller;
253677703ceSMatt Fleming 	u32 open_protocol;
254677703ceSMatt Fleming 	u32 close_protocol;
255677703ceSMatt Fleming 	u32 open_protocol_information;
256677703ceSMatt Fleming 	u32 protocols_per_handle;
257677703ceSMatt Fleming 	u32 locate_handle_buffer;
258677703ceSMatt Fleming 	u32 locate_protocol;
259677703ceSMatt Fleming 	u32 install_multiple_protocol_interfaces;
260677703ceSMatt Fleming 	u32 uninstall_multiple_protocol_interfaces;
261677703ceSMatt Fleming 	u32 calculate_crc32;
262677703ceSMatt Fleming 	u32 copy_mem;
263677703ceSMatt Fleming 	u32 set_mem;
264677703ceSMatt Fleming 	u32 create_event_ex;
265677703ceSMatt Fleming } __packed efi_boot_services_32_t;
266677703ceSMatt Fleming 
267677703ceSMatt Fleming typedef struct {
268677703ceSMatt Fleming 	efi_table_hdr_t hdr;
269677703ceSMatt Fleming 	u64 raise_tpl;
270677703ceSMatt Fleming 	u64 restore_tpl;
271677703ceSMatt Fleming 	u64 allocate_pages;
272677703ceSMatt Fleming 	u64 free_pages;
273677703ceSMatt Fleming 	u64 get_memory_map;
274677703ceSMatt Fleming 	u64 allocate_pool;
275677703ceSMatt Fleming 	u64 free_pool;
276677703ceSMatt Fleming 	u64 create_event;
277677703ceSMatt Fleming 	u64 set_timer;
278677703ceSMatt Fleming 	u64 wait_for_event;
279677703ceSMatt Fleming 	u64 signal_event;
280677703ceSMatt Fleming 	u64 close_event;
281677703ceSMatt Fleming 	u64 check_event;
282677703ceSMatt Fleming 	u64 install_protocol_interface;
283677703ceSMatt Fleming 	u64 reinstall_protocol_interface;
284677703ceSMatt Fleming 	u64 uninstall_protocol_interface;
285677703ceSMatt Fleming 	u64 handle_protocol;
286677703ceSMatt Fleming 	u64 __reserved;
287677703ceSMatt Fleming 	u64 register_protocol_notify;
288677703ceSMatt Fleming 	u64 locate_handle;
289677703ceSMatt Fleming 	u64 locate_device_path;
290677703ceSMatt Fleming 	u64 install_configuration_table;
291677703ceSMatt Fleming 	u64 load_image;
292677703ceSMatt Fleming 	u64 start_image;
293677703ceSMatt Fleming 	u64 exit;
294677703ceSMatt Fleming 	u64 unload_image;
295677703ceSMatt Fleming 	u64 exit_boot_services;
296677703ceSMatt Fleming 	u64 get_next_monotonic_count;
297677703ceSMatt Fleming 	u64 stall;
298677703ceSMatt Fleming 	u64 set_watchdog_timer;
299677703ceSMatt Fleming 	u64 connect_controller;
300677703ceSMatt Fleming 	u64 disconnect_controller;
301677703ceSMatt Fleming 	u64 open_protocol;
302677703ceSMatt Fleming 	u64 close_protocol;
303677703ceSMatt Fleming 	u64 open_protocol_information;
304677703ceSMatt Fleming 	u64 protocols_per_handle;
305677703ceSMatt Fleming 	u64 locate_handle_buffer;
306677703ceSMatt Fleming 	u64 locate_protocol;
307677703ceSMatt Fleming 	u64 install_multiple_protocol_interfaces;
308677703ceSMatt Fleming 	u64 uninstall_multiple_protocol_interfaces;
309677703ceSMatt Fleming 	u64 calculate_crc32;
310677703ceSMatt Fleming 	u64 copy_mem;
311677703ceSMatt Fleming 	u64 set_mem;
312677703ceSMatt Fleming 	u64 create_event_ex;
313677703ceSMatt Fleming } __packed efi_boot_services_64_t;
314677703ceSMatt Fleming 
3151da177e4SLinus Torvalds /*
316f30ca6baSMatt Fleming  * EFI Boot Services table
317f30ca6baSMatt Fleming  */
318*1786e830SArd Biesheuvel typedef union {
319*1786e830SArd Biesheuvel 	struct {
320f30ca6baSMatt Fleming 		efi_table_hdr_t hdr;
321f30ca6baSMatt Fleming 		void *raise_tpl;
322f30ca6baSMatt Fleming 		void *restore_tpl;
323ed37ddffSRoy Franz 		efi_status_t (*allocate_pages)(int, int, unsigned long,
324ed37ddffSRoy Franz 					       efi_physical_addr_t *);
325ed37ddffSRoy Franz 		efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long);
326ed37ddffSRoy Franz 		efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *,
327ed37ddffSRoy Franz 					       unsigned long *, u32 *);
328ed37ddffSRoy Franz 		efi_status_t (*allocate_pool)(int, unsigned long, void **);
329ed37ddffSRoy Franz 		efi_status_t (*free_pool)(void *);
330f30ca6baSMatt Fleming 		void *create_event;
331f30ca6baSMatt Fleming 		void *set_timer;
332f30ca6baSMatt Fleming 		void *wait_for_event;
333f30ca6baSMatt Fleming 		void *signal_event;
334f30ca6baSMatt Fleming 		void *close_event;
335f30ca6baSMatt Fleming 		void *check_event;
336f30ca6baSMatt Fleming 		void *install_protocol_interface;
337f30ca6baSMatt Fleming 		void *reinstall_protocol_interface;
338f30ca6baSMatt Fleming 		void *uninstall_protocol_interface;
339ed37ddffSRoy Franz 		efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **);
340f30ca6baSMatt Fleming 		void *__reserved;
341f30ca6baSMatt Fleming 		void *register_protocol_notify;
342fc372064SArd Biesheuvel 		efi_status_t (*locate_handle)(int, efi_guid_t *, void *,
343fc372064SArd Biesheuvel 					      unsigned long *, efi_handle_t *);
344f30ca6baSMatt Fleming 		void *locate_device_path;
345801820beSArd Biesheuvel 		efi_status_t (*install_configuration_table)(efi_guid_t *, void *);
346f30ca6baSMatt Fleming 		void *load_image;
347f30ca6baSMatt Fleming 		void *start_image;
348f30ca6baSMatt Fleming 		void *exit;
349f30ca6baSMatt Fleming 		void *unload_image;
350ed37ddffSRoy Franz 		efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long);
351f30ca6baSMatt Fleming 		void *get_next_monotonic_count;
352f30ca6baSMatt Fleming 		void *stall;
353f30ca6baSMatt Fleming 		void *set_watchdog_timer;
354f30ca6baSMatt Fleming 		void *connect_controller;
355f30ca6baSMatt Fleming 		void *disconnect_controller;
356f30ca6baSMatt Fleming 		void *open_protocol;
357f30ca6baSMatt Fleming 		void *close_protocol;
358f30ca6baSMatt Fleming 		void *open_protocol_information;
359f30ca6baSMatt Fleming 		void *protocols_per_handle;
360f30ca6baSMatt Fleming 		void *locate_handle_buffer;
361e4fbf476SArd Biesheuvel 		efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **);
362f30ca6baSMatt Fleming 		void *install_multiple_protocol_interfaces;
363f30ca6baSMatt Fleming 		void *uninstall_multiple_protocol_interfaces;
364f30ca6baSMatt Fleming 		void *calculate_crc32;
365f30ca6baSMatt Fleming 		void *copy_mem;
366f30ca6baSMatt Fleming 		void *set_mem;
367f30ca6baSMatt Fleming 		void *create_event_ex;
368*1786e830SArd Biesheuvel 	};
369*1786e830SArd Biesheuvel 	efi_boot_services_32_t mixed_mode;
370f30ca6baSMatt Fleming } efi_boot_services_t;
371f30ca6baSMatt Fleming 
372dd5fc854SMatthew Garrett typedef enum {
373dd5fc854SMatthew Garrett 	EfiPciIoWidthUint8,
374dd5fc854SMatthew Garrett 	EfiPciIoWidthUint16,
375dd5fc854SMatthew Garrett 	EfiPciIoWidthUint32,
376dd5fc854SMatthew Garrett 	EfiPciIoWidthUint64,
377dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint8,
378dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint16,
379dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint32,
380dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint64,
381dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint8,
382dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint16,
383dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint32,
384dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint64,
385dd5fc854SMatthew Garrett 	EfiPciIoWidthMaximum
386dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_WIDTH;
387dd5fc854SMatthew Garrett 
388dd5fc854SMatthew Garrett typedef enum {
389dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationGet,
390dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationSet,
391dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationEnable,
392dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationDisable,
393dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationSupported,
394dd5fc854SMatthew Garrett     EfiPciIoAttributeOperationMaximum
395dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
396dd5fc854SMatthew Garrett 
397677703ceSMatt Fleming typedef struct {
398677703ceSMatt Fleming 	u32 read;
399677703ceSMatt Fleming 	u32 write;
400677703ceSMatt Fleming } efi_pci_io_protocol_access_32_t;
401677703ceSMatt Fleming 
402677703ceSMatt Fleming typedef struct {
403677703ceSMatt Fleming 	u64 read;
404677703ceSMatt Fleming 	u64 write;
405677703ceSMatt Fleming } efi_pci_io_protocol_access_64_t;
406dd5fc854SMatthew Garrett 
407*1786e830SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
408*1786e830SArd Biesheuvel 
409*1786e830SArd Biesheuvel typedef
410*1786e830SArd Biesheuvel efi_status_t (*efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
411*1786e830SArd Biesheuvel 					  EFI_PCI_IO_PROTOCOL_WIDTH,
412*1786e830SArd Biesheuvel 					  u32 offset, unsigned long count,
413*1786e830SArd Biesheuvel 					  void *buffer);
414*1786e830SArd Biesheuvel 
415dd5fc854SMatthew Garrett typedef struct {
416dd5fc854SMatthew Garrett 	void *read;
417dd5fc854SMatthew Garrett 	void *write;
418dd5fc854SMatthew Garrett } efi_pci_io_protocol_access_t;
419dd5fc854SMatthew Garrett 
420dd5fc854SMatthew Garrett typedef struct {
421*1786e830SArd Biesheuvel 	efi_pci_io_protocol_cfg_t read;
422*1786e830SArd Biesheuvel 	efi_pci_io_protocol_cfg_t write;
423*1786e830SArd Biesheuvel } efi_pci_io_protocol_config_access_t;
424*1786e830SArd Biesheuvel 
425*1786e830SArd Biesheuvel typedef struct {
426677703ceSMatt Fleming 	u32 poll_mem;
427677703ceSMatt Fleming 	u32 poll_io;
428677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t mem;
429677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t io;
430677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t pci;
431677703ceSMatt Fleming 	u32 copy_mem;
432677703ceSMatt Fleming 	u32 map;
433677703ceSMatt Fleming 	u32 unmap;
434677703ceSMatt Fleming 	u32 allocate_buffer;
435677703ceSMatt Fleming 	u32 free_buffer;
436677703ceSMatt Fleming 	u32 flush;
437677703ceSMatt Fleming 	u32 get_location;
438677703ceSMatt Fleming 	u32 attributes;
439677703ceSMatt Fleming 	u32 get_bar_attributes;
440677703ceSMatt Fleming 	u32 set_bar_attributes;
4410b3225abSArd Biesheuvel 	u64 romsize;
4420b3225abSArd Biesheuvel 	u32 romimage;
443cb0ba793SArd Biesheuvel } efi_pci_io_protocol_32_t;
444677703ceSMatt Fleming 
445677703ceSMatt Fleming typedef struct {
446677703ceSMatt Fleming 	u64 poll_mem;
447677703ceSMatt Fleming 	u64 poll_io;
448677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t mem;
449677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t io;
450677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t pci;
451677703ceSMatt Fleming 	u64 copy_mem;
452677703ceSMatt Fleming 	u64 map;
453677703ceSMatt Fleming 	u64 unmap;
454677703ceSMatt Fleming 	u64 allocate_buffer;
455677703ceSMatt Fleming 	u64 free_buffer;
456677703ceSMatt Fleming 	u64 flush;
457677703ceSMatt Fleming 	u64 get_location;
458677703ceSMatt Fleming 	u64 attributes;
459677703ceSMatt Fleming 	u64 get_bar_attributes;
460677703ceSMatt Fleming 	u64 set_bar_attributes;
4610b3225abSArd Biesheuvel 	u64 romsize;
4620b3225abSArd Biesheuvel 	u64 romimage;
463cb0ba793SArd Biesheuvel } efi_pci_io_protocol_64_t;
464677703ceSMatt Fleming 
465*1786e830SArd Biesheuvel union efi_pci_io_protocol {
466*1786e830SArd Biesheuvel 	struct {
467dd5fc854SMatthew Garrett 		void *poll_mem;
468dd5fc854SMatthew Garrett 		void *poll_io;
469dd5fc854SMatthew Garrett 		efi_pci_io_protocol_access_t mem;
470dd5fc854SMatthew Garrett 		efi_pci_io_protocol_access_t io;
471*1786e830SArd Biesheuvel 		efi_pci_io_protocol_config_access_t pci;
472dd5fc854SMatthew Garrett 		void *copy_mem;
473dd5fc854SMatthew Garrett 		void *map;
474dd5fc854SMatthew Garrett 		void *unmap;
475dd5fc854SMatthew Garrett 		void *allocate_buffer;
476dd5fc854SMatthew Garrett 		void *free_buffer;
477dd5fc854SMatthew Garrett 		void *flush;
478dd5fc854SMatthew Garrett 		void *get_location;
479dd5fc854SMatthew Garrett 		void *attributes;
480dd5fc854SMatthew Garrett 		void *get_bar_attributes;
481dd5fc854SMatthew Garrett 		void *set_bar_attributes;
482dd5fc854SMatthew Garrett 		uint64_t romsize;
483dd5fc854SMatthew Garrett 		void *romimage;
484*1786e830SArd Biesheuvel 	};
485*1786e830SArd Biesheuvel 	struct {
486*1786e830SArd Biesheuvel 		u32 poll_mem;
487*1786e830SArd Biesheuvel 		u32 poll_io;
488*1786e830SArd Biesheuvel 		efi_pci_io_protocol_access_32_t mem;
489*1786e830SArd Biesheuvel 		efi_pci_io_protocol_access_32_t io;
490*1786e830SArd Biesheuvel 		efi_pci_io_protocol_access_32_t pci;
491*1786e830SArd Biesheuvel 		u32 copy_mem;
492*1786e830SArd Biesheuvel 		u32 map;
493*1786e830SArd Biesheuvel 		u32 unmap;
494*1786e830SArd Biesheuvel 		u32 allocate_buffer;
495*1786e830SArd Biesheuvel 		u32 free_buffer;
496*1786e830SArd Biesheuvel 		u32 flush;
497*1786e830SArd Biesheuvel 		u32 get_location;
498*1786e830SArd Biesheuvel 		u32 attributes;
499*1786e830SArd Biesheuvel 		u32 get_bar_attributes;
500*1786e830SArd Biesheuvel 		u32 set_bar_attributes;
501*1786e830SArd Biesheuvel 		u64 romsize;
502*1786e830SArd Biesheuvel 		u32 romimage;
503*1786e830SArd Biesheuvel 	} mixed_mode;
504*1786e830SArd Biesheuvel };
505dd5fc854SMatthew Garrett 
506dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
507dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
508dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
509dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
510dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
511dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
512dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
513dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
514dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
515dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
516dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
517dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
518dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
519dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
520dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
521dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
522dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
523dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
524dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
525dd5fc854SMatthew Garrett 
52658c5475aSLukas Wunner typedef struct {
52758c5475aSLukas Wunner 	u32 version;
52858c5475aSLukas Wunner 	u32 get;
52958c5475aSLukas Wunner 	u32 set;
53058c5475aSLukas Wunner 	u32 del;
53158c5475aSLukas Wunner 	u32 get_all;
53258c5475aSLukas Wunner } apple_properties_protocol_32_t;
53358c5475aSLukas Wunner 
53458c5475aSLukas Wunner typedef struct {
53558c5475aSLukas Wunner 	u64 version;
53658c5475aSLukas Wunner 	u64 get;
53758c5475aSLukas Wunner 	u64 set;
53858c5475aSLukas Wunner 	u64 del;
53958c5475aSLukas Wunner 	u64 get_all;
54058c5475aSLukas Wunner } apple_properties_protocol_64_t;
54158c5475aSLukas Wunner 
542*1786e830SArd Biesheuvel struct efi_dev_path;
543*1786e830SArd Biesheuvel 
544*1786e830SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t;
545*1786e830SArd Biesheuvel 
546*1786e830SArd Biesheuvel union apple_properties_protocol {
547*1786e830SArd Biesheuvel 	struct {
548*1786e830SArd Biesheuvel 		unsigned long version;
549*1786e830SArd Biesheuvel 		efi_status_t (*get)(apple_properties_protocol_t *,
550*1786e830SArd Biesheuvel 				    struct efi_dev_path *, efi_char16_t *,
551*1786e830SArd Biesheuvel 				    void *, u32 *);
552*1786e830SArd Biesheuvel 		efi_status_t (*set)(apple_properties_protocol_t *,
553*1786e830SArd Biesheuvel 				    struct efi_dev_path *, efi_char16_t *,
554*1786e830SArd Biesheuvel 				    void *, u32);
555*1786e830SArd Biesheuvel 		efi_status_t (*del)(apple_properties_protocol_t *,
556*1786e830SArd Biesheuvel 				    struct efi_dev_path *, efi_char16_t *);
557*1786e830SArd Biesheuvel 		efi_status_t (*get_all)(apple_properties_protocol_t *,
558*1786e830SArd Biesheuvel 					void *buffer, u32 *);
559*1786e830SArd Biesheuvel 	};
560*1786e830SArd Biesheuvel 	struct {
561*1786e830SArd Biesheuvel 		u32 version;
562*1786e830SArd Biesheuvel 		u32 get;
563*1786e830SArd Biesheuvel 		u32 set;
564*1786e830SArd Biesheuvel 		u32 del;
565*1786e830SArd Biesheuvel 		u32 get_all;
566*1786e830SArd Biesheuvel 	} mixed_mode;
567*1786e830SArd Biesheuvel };
568*1786e830SArd Biesheuvel 
56933b6d034SThiebaud Weksteen typedef struct {
57033b6d034SThiebaud Weksteen 	u32 get_capability;
57133b6d034SThiebaud Weksteen 	u32 get_event_log;
57233b6d034SThiebaud Weksteen 	u32 hash_log_extend_event;
57333b6d034SThiebaud Weksteen 	u32 submit_command;
57433b6d034SThiebaud Weksteen 	u32 get_active_pcr_banks;
57533b6d034SThiebaud Weksteen 	u32 set_active_pcr_banks;
57633b6d034SThiebaud Weksteen 	u32 get_result_of_set_active_pcr_banks;
57733b6d034SThiebaud Weksteen } efi_tcg2_protocol_32_t;
57833b6d034SThiebaud Weksteen 
57933b6d034SThiebaud Weksteen typedef struct {
58033b6d034SThiebaud Weksteen 	u64 get_capability;
58133b6d034SThiebaud Weksteen 	u64 get_event_log;
58233b6d034SThiebaud Weksteen 	u64 hash_log_extend_event;
58333b6d034SThiebaud Weksteen 	u64 submit_command;
58433b6d034SThiebaud Weksteen 	u64 get_active_pcr_banks;
58533b6d034SThiebaud Weksteen 	u64 set_active_pcr_banks;
58633b6d034SThiebaud Weksteen 	u64 get_result_of_set_active_pcr_banks;
58733b6d034SThiebaud Weksteen } efi_tcg2_protocol_64_t;
58833b6d034SThiebaud Weksteen 
58933b6d034SThiebaud Weksteen typedef u32 efi_tcg2_event_log_format;
59033b6d034SThiebaud Weksteen 
591*1786e830SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
592*1786e830SArd Biesheuvel 
593*1786e830SArd Biesheuvel union efi_tcg2_protocol {
594*1786e830SArd Biesheuvel 	struct {
59533b6d034SThiebaud Weksteen 		void *get_capability;
596*1786e830SArd Biesheuvel 		efi_status_t (*get_event_log)(efi_handle_t,
597*1786e830SArd Biesheuvel 					      efi_tcg2_event_log_format,
598*1786e830SArd Biesheuvel 					      efi_physical_addr_t *,
599*1786e830SArd Biesheuvel 					      efi_physical_addr_t *,
600*1786e830SArd Biesheuvel 					      efi_bool_t *);
60133b6d034SThiebaud Weksteen 		void *hash_log_extend_event;
60233b6d034SThiebaud Weksteen 		void *submit_command;
60333b6d034SThiebaud Weksteen 		void *get_active_pcr_banks;
60433b6d034SThiebaud Weksteen 		void *set_active_pcr_banks;
60533b6d034SThiebaud Weksteen 		void *get_result_of_set_active_pcr_banks;
606*1786e830SArd Biesheuvel 	};
607*1786e830SArd Biesheuvel 	struct {
608*1786e830SArd Biesheuvel 		u32 get_capability;
609*1786e830SArd Biesheuvel 		u32 get_event_log;
610*1786e830SArd Biesheuvel 		u32 hash_log_extend_event;
611*1786e830SArd Biesheuvel 		u32 submit_command;
612*1786e830SArd Biesheuvel 		u32 get_active_pcr_banks;
613*1786e830SArd Biesheuvel 		u32 set_active_pcr_banks;
614*1786e830SArd Biesheuvel 		u32 get_result_of_set_active_pcr_banks;
615*1786e830SArd Biesheuvel 	} mixed_mode;
616*1786e830SArd Biesheuvel };
61733b6d034SThiebaud Weksteen 
618f30ca6baSMatt Fleming /*
6191da177e4SLinus Torvalds  * Types and defines for EFI ResetSystem
6201da177e4SLinus Torvalds  */
6211da177e4SLinus Torvalds #define EFI_RESET_COLD 0
6221da177e4SLinus Torvalds #define EFI_RESET_WARM 1
6231da177e4SLinus Torvalds #define EFI_RESET_SHUTDOWN 2
6241da177e4SLinus Torvalds 
6251da177e4SLinus Torvalds /*
6261da177e4SLinus Torvalds  * EFI Runtime Services table
6271da177e4SLinus Torvalds  */
6281da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
6291da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_REVISION  0x00010000
6301da177e4SLinus Torvalds 
6311da177e4SLinus Torvalds typedef struct {
6321da177e4SLinus Torvalds 	efi_table_hdr_t hdr;
633677703ceSMatt Fleming 	u32 get_time;
634677703ceSMatt Fleming 	u32 set_time;
635677703ceSMatt Fleming 	u32 get_wakeup_time;
636677703ceSMatt Fleming 	u32 set_wakeup_time;
637677703ceSMatt Fleming 	u32 set_virtual_address_map;
638677703ceSMatt Fleming 	u32 convert_pointer;
639677703ceSMatt Fleming 	u32 get_variable;
640677703ceSMatt Fleming 	u32 get_next_variable;
641677703ceSMatt Fleming 	u32 set_variable;
642677703ceSMatt Fleming 	u32 get_next_high_mono_count;
643677703ceSMatt Fleming 	u32 reset_system;
644677703ceSMatt Fleming 	u32 update_capsule;
645677703ceSMatt Fleming 	u32 query_capsule_caps;
646677703ceSMatt Fleming 	u32 query_variable_info;
647677703ceSMatt Fleming } efi_runtime_services_32_t;
648677703ceSMatt Fleming 
649677703ceSMatt Fleming typedef struct {
650677703ceSMatt Fleming 	efi_table_hdr_t hdr;
651677703ceSMatt Fleming 	u64 get_time;
652677703ceSMatt Fleming 	u64 set_time;
653677703ceSMatt Fleming 	u64 get_wakeup_time;
654677703ceSMatt Fleming 	u64 set_wakeup_time;
655677703ceSMatt Fleming 	u64 set_virtual_address_map;
656677703ceSMatt Fleming 	u64 convert_pointer;
657677703ceSMatt Fleming 	u64 get_variable;
658677703ceSMatt Fleming 	u64 get_next_variable;
659677703ceSMatt Fleming 	u64 set_variable;
660677703ceSMatt Fleming 	u64 get_next_high_mono_count;
661677703ceSMatt Fleming 	u64 reset_system;
662677703ceSMatt Fleming 	u64 update_capsule;
663677703ceSMatt Fleming 	u64 query_capsule_caps;
664677703ceSMatt Fleming 	u64 query_variable_info;
665677703ceSMatt Fleming } efi_runtime_services_64_t;
666677703ceSMatt Fleming 
6671da177e4SLinus Torvalds typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
6681da177e4SLinus Torvalds typedef efi_status_t efi_set_time_t (efi_time_t *tm);
6691da177e4SLinus Torvalds typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
6701da177e4SLinus Torvalds 					    efi_time_t *tm);
6711da177e4SLinus Torvalds typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
6721da177e4SLinus Torvalds typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
6731da177e4SLinus Torvalds 					 unsigned long *data_size, void *data);
6741da177e4SLinus Torvalds typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
6751da177e4SLinus Torvalds 					      efi_guid_t *vendor);
6761da177e4SLinus Torvalds typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
677f7a2d73fSMatthew Garrett 					 u32 attr, unsigned long data_size,
6781da177e4SLinus Torvalds 					 void *data);
6791da177e4SLinus Torvalds typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
6801da177e4SLinus Torvalds typedef void efi_reset_system_t (int reset_type, efi_status_t status,
6811da177e4SLinus Torvalds 				 unsigned long data_size, efi_char16_t *data);
6821da177e4SLinus Torvalds typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
6831da177e4SLinus Torvalds 						unsigned long descriptor_size,
6841da177e4SLinus Torvalds 						u32 descriptor_version,
6851da177e4SLinus Torvalds 						efi_memory_desc_t *virtual_map);
6863b370237SMatthew Garrett typedef efi_status_t efi_query_variable_info_t(u32 attr,
6873b370237SMatthew Garrett 					       u64 *storage_space,
6883b370237SMatthew Garrett 					       u64 *remaining_space,
6893b370237SMatthew Garrett 					       u64 *max_variable_size);
6903b370237SMatthew Garrett typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
6913b370237SMatthew Garrett 					  unsigned long count,
6923b370237SMatthew Garrett 					  unsigned long sg_list);
6933b370237SMatthew Garrett typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
6943b370237SMatthew Garrett 					      unsigned long count,
6953b370237SMatthew Garrett 					      u64 *max_size,
6963b370237SMatthew Garrett 					      int *reset_type);
697ca0e30dcSArd Biesheuvel typedef efi_status_t efi_query_variable_store_t(u32 attributes,
698ca0e30dcSArd Biesheuvel 						unsigned long size,
699ca0e30dcSArd Biesheuvel 						bool nonblocking);
7001da177e4SLinus Torvalds 
701*1786e830SArd Biesheuvel typedef union {
702*1786e830SArd Biesheuvel 	struct {
703c4c39c70SArd Biesheuvel 		efi_table_hdr_t			hdr;
704c4c39c70SArd Biesheuvel 		efi_get_time_t			*get_time;
705c4c39c70SArd Biesheuvel 		efi_set_time_t			*set_time;
706c4c39c70SArd Biesheuvel 		efi_get_wakeup_time_t		*get_wakeup_time;
707c4c39c70SArd Biesheuvel 		efi_set_wakeup_time_t		*set_wakeup_time;
708c4c39c70SArd Biesheuvel 		efi_set_virtual_address_map_t	*set_virtual_address_map;
709c4c39c70SArd Biesheuvel 		void				*convert_pointer;
710c4c39c70SArd Biesheuvel 		efi_get_variable_t		*get_variable;
711c4c39c70SArd Biesheuvel 		efi_get_next_variable_t		*get_next_variable;
712c4c39c70SArd Biesheuvel 		efi_set_variable_t		*set_variable;
713c4c39c70SArd Biesheuvel 		efi_get_next_high_mono_count_t	*get_next_high_mono_count;
714c4c39c70SArd Biesheuvel 		efi_reset_system_t		*reset_system;
715c4c39c70SArd Biesheuvel 		efi_update_capsule_t		*update_capsule;
716c4c39c70SArd Biesheuvel 		efi_query_capsule_caps_t	*query_capsule_caps;
717c4c39c70SArd Biesheuvel 		efi_query_variable_info_t	*query_variable_info;
718*1786e830SArd Biesheuvel 	};
719*1786e830SArd Biesheuvel 	efi_runtime_services_32_t mixed_mode;
720c4c39c70SArd Biesheuvel } efi_runtime_services_t;
721c4c39c70SArd Biesheuvel 
722022ee6c5SArd Biesheuvel void efi_native_runtime_setup(void);
723022ee6c5SArd Biesheuvel 
7241da177e4SLinus Torvalds /*
7251da177e4SLinus Torvalds  * EFI Configuration Table and GUID definitions
72654fd11feSPeter Jones  *
7277fb2b43cSIngo Molnar  * These are all defined in a single line to make them easier to
7287fb2b43cSIngo Molnar  * grep for and to see them at a glance - while still having a
7297fb2b43cSIngo Molnar  * similar structure to the definitions in the spec.
7307fb2b43cSIngo Molnar  *
7317fb2b43cSIngo Molnar  * Here's how they are structured:
73254fd11feSPeter Jones  *
73354fd11feSPeter Jones  * GUID: 12345678-1234-1234-1234-123456789012
73454fd11feSPeter Jones  * Spec:
73554fd11feSPeter Jones  *      #define EFI_SOME_PROTOCOL_GUID \
73654fd11feSPeter Jones  *        {0x12345678,0x1234,0x1234,\
73754fd11feSPeter Jones  *          {0x12,0x34,0x12,0x34,0x56,0x78,0x90,0x12}}
73854fd11feSPeter Jones  * Here:
7397fb2b43cSIngo Molnar  *	#define SOME_PROTOCOL_GUID		EFI_GUID(0x12345678, 0x1234, 0x1234,  0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12)
7407fb2b43cSIngo Molnar  *					^ tabs					    ^extra space
7417fb2b43cSIngo Molnar  *
7427fb2b43cSIngo Molnar  * Note that the 'extra space' separates the values at the same place
7437fb2b43cSIngo Molnar  * where the UEFI SPEC breaks the line.
7441da177e4SLinus Torvalds  */
7457fb2b43cSIngo Molnar #define NULL_GUID				EFI_GUID(0x00000000, 0x0000, 0x0000,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
7467fb2b43cSIngo Molnar #define MPS_TABLE_GUID				EFI_GUID(0xeb9d2d2f, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
7477fb2b43cSIngo Molnar #define ACPI_TABLE_GUID				EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
7487fb2b43cSIngo Molnar #define ACPI_20_TABLE_GUID			EFI_GUID(0x8868e871, 0xe4f1, 0x11d3,  0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
7497fb2b43cSIngo Molnar #define SMBIOS_TABLE_GUID			EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
7507fb2b43cSIngo Molnar #define SMBIOS3_TABLE_GUID			EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c,  0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94)
7517fb2b43cSIngo Molnar #define SAL_SYSTEM_TABLE_GUID			EFI_GUID(0xeb9d2d32, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
7527fb2b43cSIngo Molnar #define HCDP_TABLE_GUID				EFI_GUID(0xf951938d, 0x620b, 0x42ef,  0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98)
7537fb2b43cSIngo Molnar #define UGA_IO_PROTOCOL_GUID			EFI_GUID(0x61a4d49e, 0x6f68, 0x4f1b,  0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2)
7547fb2b43cSIngo Molnar #define EFI_GLOBAL_VARIABLE_GUID		EFI_GUID(0x8be4df61, 0x93ca, 0x11d2,  0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
7557fb2b43cSIngo Molnar #define UV_SYSTEM_TABLE_GUID			EFI_GUID(0x3b13a7d4, 0x633e, 0x11dd,  0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93)
7567fb2b43cSIngo Molnar #define LINUX_EFI_CRASH_GUID			EFI_GUID(0xcfc8fc79, 0xbe2e, 0x4ddc,  0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0)
7577fb2b43cSIngo Molnar #define LOADED_IMAGE_PROTOCOL_GUID		EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
7587fb2b43cSIngo Molnar #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID	EFI_GUID(0x9042a9de, 0x23dc, 0x4a38,  0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
7597fb2b43cSIngo Molnar #define EFI_UGA_PROTOCOL_GUID			EFI_GUID(0x982c298b, 0xf4fa, 0x41cb,  0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39)
7607fb2b43cSIngo Molnar #define EFI_PCI_IO_PROTOCOL_GUID		EFI_GUID(0x4cf5b200, 0x68b8, 0x4ca5,  0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a)
7617fb2b43cSIngo Molnar #define EFI_FILE_INFO_ID			EFI_GUID(0x09576e92, 0x6d3f, 0x11d2,  0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
7627fb2b43cSIngo Molnar #define EFI_SYSTEM_RESOURCE_TABLE_GUID		EFI_GUID(0xb122a263, 0x3661, 0x4f68,  0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
7637fb2b43cSIngo Molnar #define EFI_FILE_SYSTEM_GUID			EFI_GUID(0x964e5b22, 0x6459, 0x11d2,  0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
7647fb2b43cSIngo Molnar #define DEVICE_TREE_GUID			EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5,  0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
7657fb2b43cSIngo Molnar #define EFI_PROPERTIES_TABLE_GUID		EFI_GUID(0x880aaca3, 0x4adc, 0x4a04,  0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5)
7667fb2b43cSIngo Molnar #define EFI_RNG_PROTOCOL_GUID			EFI_GUID(0x3152bca5, 0xeade, 0x433d,  0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
767568bc4e8SArd Biesheuvel #define EFI_RNG_ALGORITHM_RAW			EFI_GUID(0xe43176d7, 0xb6e8, 0x4827,  0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61)
7687fb2b43cSIngo Molnar #define EFI_MEMORY_ATTRIBUTES_TABLE_GUID	EFI_GUID(0xdcfa911d, 0x26eb, 0x469f,  0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
7697fb2b43cSIngo Molnar #define EFI_CONSOLE_OUT_DEVICE_GUID		EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
77058c5475aSLukas Wunner #define APPLE_PROPERTIES_PROTOCOL_GUID		EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb,  0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
77133b6d034SThiebaud Weksteen #define EFI_TCG2_PROTOCOL_GUID			EFI_GUID(0x607f766c, 0x7455, 0x42be,  0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
772fc372064SArd Biesheuvel 
773e58910cdSJosh Boyer #define EFI_IMAGE_SECURITY_DATABASE_GUID	EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596,  0xa3, 0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f)
774e58910cdSJosh Boyer #define EFI_SHIM_LOCK_GUID			EFI_GUID(0x605dab50, 0xe046, 0x4300,  0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23)
775e58910cdSJosh Boyer 
7765c126ba2SDave Howells #define EFI_CERT_SHA256_GUID			EFI_GUID(0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28)
7775c126ba2SDave Howells #define EFI_CERT_X509_GUID			EFI_GUID(0xa5c059a1, 0x94e4, 0x4aa7, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72)
7785c126ba2SDave Howells #define EFI_CERT_X509_SHA256_GUID		EFI_GUID(0x3bd2a492, 0x96c0, 0x4079, 0xb4, 0x20, 0xfc, 0xf9, 0x8e, 0xf1, 0x03, 0xed)
7795c126ba2SDave Howells 
780801820beSArd Biesheuvel /*
781801820beSArd Biesheuvel  * This GUID is used to pass to the kernel proper the struct screen_info
782801820beSArd Biesheuvel  * structure that was populated by the stub based on the GOP protocol instance
783801820beSArd Biesheuvel  * associated with ConOut
784801820beSArd Biesheuvel  */
7857fb2b43cSIngo Molnar #define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID	EFI_GUID(0xe03fc20a, 0x85dc, 0x406e,  0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
7867fb2b43cSIngo Molnar #define LINUX_EFI_LOADER_ENTRY_GUID		EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf,  0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
78763625988SArd Biesheuvel #define LINUX_EFI_RANDOM_SEED_TABLE_GUID	EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2,  0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b)
78833b6d034SThiebaud Weksteen #define LINUX_EFI_TPM_EVENT_LOG_GUID		EFI_GUID(0xb7799cb0, 0xeca2, 0x4943,  0x96, 0x67, 0x1f, 0xae, 0x07, 0xb7, 0x47, 0xfa)
789c46f3405SMatthew Garrett #define LINUX_EFI_TPM_FINAL_LOG_GUID		EFI_GUID(0x1e2ed096, 0x30e2, 0x4254,  0xbd, 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25)
79071e0940dSArd Biesheuvel #define LINUX_EFI_MEMRESERVE_TABLE_GUID		EFI_GUID(0x888eb0c6, 0x8ede, 0x4ff5,  0xa8, 0xf0, 0x9a, 0xee, 0x5c, 0xb9, 0x77, 0xc2)
79106f7d4a1SCompostella, Jeremy 
7921c5fecb6SNarendra K /* OEM GUIDs */
7931c5fecb6SNarendra K #define DELLEMC_EFI_RCI2_TABLE_GUID		EFI_GUID(0x2d9f28a2, 0xa886, 0x456a,  0x97, 0xa8, 0xf1, 0x1e, 0xf2, 0x4f, 0xf4, 0x55)
7941c5fecb6SNarendra K 
7951da177e4SLinus Torvalds typedef struct {
7961da177e4SLinus Torvalds 	efi_guid_t guid;
7971adbfa35SOlof Johansson 	u64 table;
7981adbfa35SOlof Johansson } efi_config_table_64_t;
7991adbfa35SOlof Johansson 
8001adbfa35SOlof Johansson typedef struct {
8011adbfa35SOlof Johansson 	efi_guid_t guid;
8021adbfa35SOlof Johansson 	u32 table;
8031adbfa35SOlof Johansson } efi_config_table_32_t;
8041adbfa35SOlof Johansson 
805*1786e830SArd Biesheuvel typedef union {
806*1786e830SArd Biesheuvel 	struct {
8071adbfa35SOlof Johansson 		efi_guid_t guid;
8081da177e4SLinus Torvalds 		unsigned long table;
809*1786e830SArd Biesheuvel 	};
810*1786e830SArd Biesheuvel 	efi_config_table_32_t mixed_mode;
8111da177e4SLinus Torvalds } efi_config_table_t;
8121da177e4SLinus Torvalds 
813272686bfSLeif Lindholm typedef struct {
814272686bfSLeif Lindholm 	efi_guid_t guid;
815272686bfSLeif Lindholm 	const char *name;
816272686bfSLeif Lindholm 	unsigned long *ptr;
817272686bfSLeif Lindholm } efi_config_table_type_t;
818272686bfSLeif Lindholm 
8191da177e4SLinus Torvalds #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
8201da177e4SLinus Torvalds 
8213b370237SMatthew Garrett #define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
8223b370237SMatthew Garrett #define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
8233b370237SMatthew Garrett #define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
8243b370237SMatthew Garrett #define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
8253b370237SMatthew Garrett #define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
8263b370237SMatthew Garrett #define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
8273b370237SMatthew Garrett 
8281da177e4SLinus Torvalds typedef struct {
8291da177e4SLinus Torvalds 	efi_table_hdr_t hdr;
8301adbfa35SOlof Johansson 	u64 fw_vendor;	/* physical addr of CHAR16 vendor string */
8311adbfa35SOlof Johansson 	u32 fw_revision;
8321adbfa35SOlof Johansson 	u32 __pad1;
8331adbfa35SOlof Johansson 	u64 con_in_handle;
8341adbfa35SOlof Johansson 	u64 con_in;
8351adbfa35SOlof Johansson 	u64 con_out_handle;
8361adbfa35SOlof Johansson 	u64 con_out;
8371adbfa35SOlof Johansson 	u64 stderr_handle;
8381adbfa35SOlof Johansson 	u64 stderr;
8391adbfa35SOlof Johansson 	u64 runtime;
8401adbfa35SOlof Johansson 	u64 boottime;
8411adbfa35SOlof Johansson 	u32 nr_tables;
8421adbfa35SOlof Johansson 	u32 __pad2;
8431adbfa35SOlof Johansson 	u64 tables;
8441adbfa35SOlof Johansson } efi_system_table_64_t;
8451adbfa35SOlof Johansson 
8461adbfa35SOlof Johansson typedef struct {
8471adbfa35SOlof Johansson 	efi_table_hdr_t hdr;
8481adbfa35SOlof Johansson 	u32 fw_vendor;	/* physical addr of CHAR16 vendor string */
8491adbfa35SOlof Johansson 	u32 fw_revision;
8501adbfa35SOlof Johansson 	u32 con_in_handle;
8511adbfa35SOlof Johansson 	u32 con_in;
8521adbfa35SOlof Johansson 	u32 con_out_handle;
8531adbfa35SOlof Johansson 	u32 con_out;
8541adbfa35SOlof Johansson 	u32 stderr_handle;
8551adbfa35SOlof Johansson 	u32 stderr;
8561adbfa35SOlof Johansson 	u32 runtime;
8571adbfa35SOlof Johansson 	u32 boottime;
8581adbfa35SOlof Johansson 	u32 nr_tables;
8591adbfa35SOlof Johansson 	u32 tables;
8601adbfa35SOlof Johansson } efi_system_table_32_t;
8611adbfa35SOlof Johansson 
862*1786e830SArd Biesheuvel typedef union {
863*1786e830SArd Biesheuvel 	struct {
8641adbfa35SOlof Johansson 		efi_table_hdr_t hdr;
8651da177e4SLinus Torvalds 		unsigned long fw_vendor;	/* physical addr of CHAR16 vendor string */
8661da177e4SLinus Torvalds 		u32 fw_revision;
8671da177e4SLinus Torvalds 		unsigned long con_in_handle;
8681da177e4SLinus Torvalds 		unsigned long con_in;
8691da177e4SLinus Torvalds 		unsigned long con_out_handle;
8701da177e4SLinus Torvalds 		unsigned long con_out;
8711da177e4SLinus Torvalds 		unsigned long stderr_handle;
8721da177e4SLinus Torvalds 		unsigned long stderr;
8731da177e4SLinus Torvalds 		efi_runtime_services_t *runtime;
874f30ca6baSMatt Fleming 		efi_boot_services_t *boottime;
8751da177e4SLinus Torvalds 		unsigned long nr_tables;
8761da177e4SLinus Torvalds 		unsigned long tables;
877*1786e830SArd Biesheuvel 	};
878*1786e830SArd Biesheuvel 	efi_system_table_32_t mixed_mode;
8791da177e4SLinus Torvalds } efi_system_table_t;
8801da177e4SLinus Torvalds 
8819479c7ceSMatt Fleming /*
8829479c7ceSMatt Fleming  * Architecture independent structure for describing a memory map for the
8839479c7ceSMatt Fleming  * benefit of efi_memmap_init_early(), saving us the need to pass four
8849479c7ceSMatt Fleming  * parameters.
8859479c7ceSMatt Fleming  */
8869479c7ceSMatt Fleming struct efi_memory_map_data {
8879479c7ceSMatt Fleming 	phys_addr_t phys_map;
8889479c7ceSMatt Fleming 	unsigned long size;
8899479c7ceSMatt Fleming 	unsigned long desc_version;
8909479c7ceSMatt Fleming 	unsigned long desc_size;
8919479c7ceSMatt Fleming };
8929479c7ceSMatt Fleming 
8931da177e4SLinus Torvalds struct efi_memory_map {
89444511fb9SArd Biesheuvel 	phys_addr_t phys_map;
8957ae65fd3SMatt Tolentino 	void *map;
8967ae65fd3SMatt Tolentino 	void *map_end;
8971da177e4SLinus Torvalds 	int nr_map;
8981da177e4SLinus Torvalds 	unsigned long desc_version;
8997ae65fd3SMatt Tolentino 	unsigned long desc_size;
900dca0f971SMatt Fleming 	bool late;
9011da177e4SLinus Torvalds };
9021da177e4SLinus Torvalds 
90360863c0dSMatt Fleming struct efi_mem_range {
90460863c0dSMatt Fleming 	struct range range;
90560863c0dSMatt Fleming 	u64 attribute;
9061da177e4SLinus Torvalds };
9071da177e4SLinus Torvalds 
9080302f71cSMark Salter struct efi_fdt_params {
9090302f71cSMark Salter 	u64 system_table;
9100302f71cSMark Salter 	u64 mmap;
9110302f71cSMark Salter 	u32 mmap_size;
9120302f71cSMark Salter 	u32 desc_size;
9130302f71cSMark Salter 	u32 desc_ver;
9140302f71cSMark Salter };
9150302f71cSMark Salter 
9168e84f345SMatt Fleming typedef struct {
9178e84f345SMatt Fleming 	u32 revision;
918677703ceSMatt Fleming 	u32 parent_handle;
919677703ceSMatt Fleming 	u32 system_table;
920677703ceSMatt Fleming 	u32 device_handle;
921677703ceSMatt Fleming 	u32 file_path;
922677703ceSMatt Fleming 	u32 reserved;
923677703ceSMatt Fleming 	u32 load_options_size;
924677703ceSMatt Fleming 	u32 load_options;
925677703ceSMatt Fleming 	u32 image_base;
926677703ceSMatt Fleming 	__aligned_u64 image_size;
927677703ceSMatt Fleming 	unsigned int image_code_type;
928677703ceSMatt Fleming 	unsigned int image_data_type;
9299fa76ca7SArvind Sankar 	u32 unload;
930677703ceSMatt Fleming } efi_loaded_image_32_t;
931677703ceSMatt Fleming 
932677703ceSMatt Fleming typedef struct {
933677703ceSMatt Fleming 	u32 revision;
934677703ceSMatt Fleming 	u64 parent_handle;
935677703ceSMatt Fleming 	u64 system_table;
936677703ceSMatt Fleming 	u64 device_handle;
937677703ceSMatt Fleming 	u64 file_path;
938677703ceSMatt Fleming 	u64 reserved;
939677703ceSMatt Fleming 	u32 load_options_size;
940677703ceSMatt Fleming 	u64 load_options;
941677703ceSMatt Fleming 	u64 image_base;
942677703ceSMatt Fleming 	__aligned_u64 image_size;
943677703ceSMatt Fleming 	unsigned int image_code_type;
944677703ceSMatt Fleming 	unsigned int image_data_type;
9459fa76ca7SArvind Sankar 	u64 unload;
946677703ceSMatt Fleming } efi_loaded_image_64_t;
947677703ceSMatt Fleming 
948*1786e830SArd Biesheuvel typedef union efi_loaded_image efi_loaded_image_t;
949*1786e830SArd Biesheuvel 
950*1786e830SArd Biesheuvel union efi_loaded_image {
951*1786e830SArd Biesheuvel 	struct {
952677703ceSMatt Fleming 		u32 revision;
9539fa76ca7SArvind Sankar 		efi_handle_t parent_handle;
9548e84f345SMatt Fleming 		efi_system_table_t *system_table;
9559fa76ca7SArvind Sankar 		efi_handle_t device_handle;
9568e84f345SMatt Fleming 		void *file_path;
9578e84f345SMatt Fleming 		void *reserved;
9588e84f345SMatt Fleming 		u32 load_options_size;
9598e84f345SMatt Fleming 		void *load_options;
9608e84f345SMatt Fleming 		void *image_base;
9618e84f345SMatt Fleming 		__aligned_u64 image_size;
9628e84f345SMatt Fleming 		unsigned int image_code_type;
9638e84f345SMatt Fleming 		unsigned int image_data_type;
9649fa76ca7SArvind Sankar 		efi_status_t (*unload)(efi_handle_t image_handle);
965*1786e830SArd Biesheuvel 	};
966*1786e830SArd Biesheuvel 	struct {
967*1786e830SArd Biesheuvel 		u32 revision;
968*1786e830SArd Biesheuvel 		u32 parent_handle;
969*1786e830SArd Biesheuvel 		u32 system_table;
970*1786e830SArd Biesheuvel 		u32 device_handle;
971*1786e830SArd Biesheuvel 		u32 file_path;
972*1786e830SArd Biesheuvel 		u32 reserved;
973*1786e830SArd Biesheuvel 		u32 load_options_size;
974*1786e830SArd Biesheuvel 		u32 load_options;
975*1786e830SArd Biesheuvel 		u32 image_base;
976*1786e830SArd Biesheuvel 		__aligned_u64 image_size;
977*1786e830SArd Biesheuvel 		unsigned int image_code_type;
978*1786e830SArd Biesheuvel 		unsigned int image_data_type;
979*1786e830SArd Biesheuvel 		u32 unload;
980*1786e830SArd Biesheuvel 	} mixed_mode;
981*1786e830SArd Biesheuvel };
98255839d51SMatt Fleming 
98355839d51SMatt Fleming typedef struct {
98455839d51SMatt Fleming 	u64 size;
98555839d51SMatt Fleming 	u64 file_size;
98655839d51SMatt Fleming 	u64 phys_size;
98755839d51SMatt Fleming 	efi_time_t create_time;
98855839d51SMatt Fleming 	efi_time_t last_access_time;
98955839d51SMatt Fleming 	efi_time_t modification_time;
99055839d51SMatt Fleming 	__aligned_u64 attribute;
99155839d51SMatt Fleming 	efi_char16_t filename[1];
99255839d51SMatt Fleming } efi_file_info_t;
99355839d51SMatt Fleming 
994677703ceSMatt Fleming typedef struct {
995677703ceSMatt Fleming 	u64 revision;
996677703ceSMatt Fleming 	u32 open;
997677703ceSMatt Fleming 	u32 close;
998677703ceSMatt Fleming 	u32 delete;
999677703ceSMatt Fleming 	u32 read;
1000677703ceSMatt Fleming 	u32 write;
1001677703ceSMatt Fleming 	u32 get_position;
1002677703ceSMatt Fleming 	u32 set_position;
1003677703ceSMatt Fleming 	u32 get_info;
1004677703ceSMatt Fleming 	u32 set_info;
1005677703ceSMatt Fleming 	u32 flush;
1006677703ceSMatt Fleming } efi_file_handle_32_t;
1007677703ceSMatt Fleming 
1008677703ceSMatt Fleming typedef struct {
1009677703ceSMatt Fleming 	u64 revision;
1010677703ceSMatt Fleming 	u64 open;
1011677703ceSMatt Fleming 	u64 close;
1012677703ceSMatt Fleming 	u64 delete;
1013677703ceSMatt Fleming 	u64 read;
1014677703ceSMatt Fleming 	u64 write;
1015677703ceSMatt Fleming 	u64 get_position;
1016677703ceSMatt Fleming 	u64 set_position;
1017677703ceSMatt Fleming 	u64 get_info;
1018677703ceSMatt Fleming 	u64 set_info;
1019677703ceSMatt Fleming 	u64 flush;
1020677703ceSMatt Fleming } efi_file_handle_64_t;
1021677703ceSMatt Fleming 
1022*1786e830SArd Biesheuvel typedef union efi_file_handle efi_file_handle_t;
1023*1786e830SArd Biesheuvel 
1024*1786e830SArd Biesheuvel union efi_file_handle {
1025*1786e830SArd Biesheuvel 	struct {
102655839d51SMatt Fleming 		u64 revision;
1027*1786e830SArd Biesheuvel 		efi_status_t (*open)(efi_file_handle_t *,
1028*1786e830SArd Biesheuvel 				     efi_file_handle_t **,
1029ed37ddffSRoy Franz 				     efi_char16_t *, u64, u64);
1030*1786e830SArd Biesheuvel 		efi_status_t (*close)(efi_file_handle_t *);
103155839d51SMatt Fleming 		void *delete;
1032*1786e830SArd Biesheuvel 		efi_status_t (*read)(efi_file_handle_t *, unsigned long *,
1033ed37ddffSRoy Franz 				     void *);
103455839d51SMatt Fleming 		void *write;
103555839d51SMatt Fleming 		void *get_position;
103655839d51SMatt Fleming 		void *set_position;
1037*1786e830SArd Biesheuvel 		efi_status_t (*get_info)(efi_file_handle_t *, efi_guid_t *,
1038ed37ddffSRoy Franz 				unsigned long *, void *);
103955839d51SMatt Fleming 		void *set_info;
104055839d51SMatt Fleming 		void *flush;
1041*1786e830SArd Biesheuvel 	};
1042*1786e830SArd Biesheuvel 	struct {
1043*1786e830SArd Biesheuvel 		u64 revision;
1044*1786e830SArd Biesheuvel 		u32 open;
1045*1786e830SArd Biesheuvel 		u32 close;
1046*1786e830SArd Biesheuvel 		u32 delete;
1047*1786e830SArd Biesheuvel 		u32 read;
1048*1786e830SArd Biesheuvel 		u32 write;
1049*1786e830SArd Biesheuvel 		u32 get_position;
1050*1786e830SArd Biesheuvel 		u32 set_position;
1051*1786e830SArd Biesheuvel 		u32 get_info;
1052*1786e830SArd Biesheuvel 		u32 set_info;
1053*1786e830SArd Biesheuvel 		u32 flush;
1054*1786e830SArd Biesheuvel 	} mixed_mode;
1055*1786e830SArd Biesheuvel };
105655839d51SMatt Fleming 
1057c4db9c1eSLukas Wunner typedef struct {
1058c4db9c1eSLukas Wunner 	u64 revision;
1059c4db9c1eSLukas Wunner 	u32 open_volume;
1060c4db9c1eSLukas Wunner } efi_file_io_interface_32_t;
1061c4db9c1eSLukas Wunner 
1062c4db9c1eSLukas Wunner typedef struct {
1063c4db9c1eSLukas Wunner 	u64 revision;
1064c4db9c1eSLukas Wunner 	u64 open_volume;
1065c4db9c1eSLukas Wunner } efi_file_io_interface_64_t;
1066c4db9c1eSLukas Wunner 
1067*1786e830SArd Biesheuvel typedef union efi_file_io_interface efi_file_io_interface_t;
1068*1786e830SArd Biesheuvel 
1069*1786e830SArd Biesheuvel union efi_file_io_interface {
1070*1786e830SArd Biesheuvel 	struct {
1071ed37ddffSRoy Franz 		u64 revision;
1072*1786e830SArd Biesheuvel 		int (*open_volume)(efi_file_io_interface_t *,
1073ed37ddffSRoy Franz 				   efi_file_handle_t **);
1074*1786e830SArd Biesheuvel 	};
1075*1786e830SArd Biesheuvel 	struct {
1076*1786e830SArd Biesheuvel 		u64 revision;
1077*1786e830SArd Biesheuvel 		u32 open_volume;
1078*1786e830SArd Biesheuvel 	} mixed_mode;
1079*1786e830SArd Biesheuvel } ;
1080ed37ddffSRoy Franz 
108155839d51SMatt Fleming #define EFI_FILE_MODE_READ	0x0000000000000001
108255839d51SMatt Fleming #define EFI_FILE_MODE_WRITE	0x0000000000000002
108355839d51SMatt Fleming #define EFI_FILE_MODE_CREATE	0x8000000000000000
108455839d51SMatt Fleming 
1085bf924863SArd Biesheuvel typedef struct {
1086bf924863SArd Biesheuvel 	u32 version;
1087bf924863SArd Biesheuvel 	u32 length;
1088bf924863SArd Biesheuvel 	u64 memory_protection_attribute;
1089bf924863SArd Biesheuvel } efi_properties_table_t;
1090bf924863SArd Biesheuvel 
1091bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_VERSION	0x00010000
1092bf924863SArd Biesheuvel #define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA	0x1
1093bf924863SArd Biesheuvel 
1094b2c99e3cSBjorn Helgaas #define EFI_INVALID_TABLE_ADDR		(~0UL)
1095b2c99e3cSBjorn Helgaas 
1096a604af07SArd Biesheuvel typedef struct {
1097a604af07SArd Biesheuvel 	u32 version;
1098a604af07SArd Biesheuvel 	u32 num_entries;
1099a604af07SArd Biesheuvel 	u32 desc_size;
1100a604af07SArd Biesheuvel 	u32 reserved;
1101a604af07SArd Biesheuvel 	efi_memory_desc_t entry[0];
1102a604af07SArd Biesheuvel } efi_memory_attributes_table_t;
1103a604af07SArd Biesheuvel 
11045c126ba2SDave Howells typedef struct {
11055c126ba2SDave Howells 	efi_guid_t signature_owner;
11065c126ba2SDave Howells 	u8 signature_data[];
11075c126ba2SDave Howells } efi_signature_data_t;
11085c126ba2SDave Howells 
11095c126ba2SDave Howells typedef struct {
11105c126ba2SDave Howells 	efi_guid_t signature_type;
11115c126ba2SDave Howells 	u32 signature_list_size;
11125c126ba2SDave Howells 	u32 signature_header_size;
11135c126ba2SDave Howells 	u32 signature_size;
11145c126ba2SDave Howells 	u8 signature_header[];
11155c126ba2SDave Howells 	/* efi_signature_data_t signatures[][] */
11165c126ba2SDave Howells } efi_signature_list_t;
11175c126ba2SDave Howells 
11185c126ba2SDave Howells typedef u8 efi_sha256_hash_t[32];
11195c126ba2SDave Howells 
11205c126ba2SDave Howells typedef struct {
11215c126ba2SDave Howells 	efi_sha256_hash_t to_be_signed_hash;
11225c126ba2SDave Howells 	efi_time_t time_of_revocation;
11235c126ba2SDave Howells } efi_cert_x509_sha256_t;
11245c126ba2SDave Howells 
11251da177e4SLinus Torvalds /*
11261da177e4SLinus Torvalds  * All runtime access to EFI goes through this structure:
11271da177e4SLinus Torvalds  */
11281da177e4SLinus Torvalds extern struct efi {
11291da177e4SLinus Torvalds 	efi_system_table_t *systab;	/* EFI system table */
11303b370237SMatthew Garrett 	unsigned int runtime_version;	/* Runtime services version */
1131b2c99e3cSBjorn Helgaas 	unsigned long mps;		/* MPS table */
1132b2c99e3cSBjorn Helgaas 	unsigned long acpi;		/* ACPI table  (IA64 ext 0.71) */
1133b2c99e3cSBjorn Helgaas 	unsigned long acpi20;		/* ACPI table  (ACPI 2.0) */
1134e1ccbbc9SArd Biesheuvel 	unsigned long smbios;		/* SMBIOS table (32 bit entry point) */
1135e1ccbbc9SArd Biesheuvel 	unsigned long smbios3;		/* SMBIOS table (64 bit entry point) */
1136b2c99e3cSBjorn Helgaas 	unsigned long boot_info;	/* boot info table */
1137b2c99e3cSBjorn Helgaas 	unsigned long hcdp;		/* HCDP table */
1138b2c99e3cSBjorn Helgaas 	unsigned long uga;		/* UGA table */
1139a0998eb1SDave Young 	unsigned long fw_vendor;	/* fw_vendor */
1140a0998eb1SDave Young 	unsigned long runtime;		/* runtime table */
1141a0998eb1SDave Young 	unsigned long config_table;	/* config tables */
11420bb54905SPeter Jones 	unsigned long esrt;		/* ESRT table */
1143bf924863SArd Biesheuvel 	unsigned long properties_table;	/* properties table */
1144a604af07SArd Biesheuvel 	unsigned long mem_attr_table;	/* memory attributes table */
114563625988SArd Biesheuvel 	unsigned long rng_seed;		/* UEFI firmware random seed */
114633b6d034SThiebaud Weksteen 	unsigned long tpm_log;		/* TPM2 Event Log table */
1147c46f3405SMatthew Garrett 	unsigned long tpm_final_log;	/* TPM2 Final Events Log table */
114871e0940dSArd Biesheuvel 	unsigned long mem_reserve;	/* Linux EFI memreserve table */
11491da177e4SLinus Torvalds 	efi_get_time_t *get_time;
11501da177e4SLinus Torvalds 	efi_set_time_t *set_time;
11511da177e4SLinus Torvalds 	efi_get_wakeup_time_t *get_wakeup_time;
11521da177e4SLinus Torvalds 	efi_set_wakeup_time_t *set_wakeup_time;
11531da177e4SLinus Torvalds 	efi_get_variable_t *get_variable;
11541da177e4SLinus Torvalds 	efi_get_next_variable_t *get_next_variable;
11551da177e4SLinus Torvalds 	efi_set_variable_t *set_variable;
115670d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
11573b370237SMatthew Garrett 	efi_query_variable_info_t *query_variable_info;
1158d3cac1f8SArd Biesheuvel 	efi_query_variable_info_t *query_variable_info_nonblocking;
11593b370237SMatthew Garrett 	efi_update_capsule_t *update_capsule;
11603b370237SMatthew Garrett 	efi_query_capsule_caps_t *query_capsule_caps;
11611da177e4SLinus Torvalds 	efi_get_next_high_mono_count_t *get_next_high_mono_count;
11621da177e4SLinus Torvalds 	efi_reset_system_t *reset_system;
11631da177e4SLinus Torvalds 	efi_set_virtual_address_map_t *set_virtual_address_map;
1164884f4f66SMatt Fleming 	struct efi_memory_map memmap;
11653e909599SMatt Fleming 	unsigned long flags;
11661da177e4SLinus Torvalds } efi;
11671da177e4SLinus Torvalds 
11687e904a91SSai Praneeth extern struct mm_struct efi_mm;
11697e904a91SSai Praneeth 
11701da177e4SLinus Torvalds static inline int
11711da177e4SLinus Torvalds efi_guidcmp (efi_guid_t left, efi_guid_t right)
11721da177e4SLinus Torvalds {
11731da177e4SLinus Torvalds 	return memcmp(&left, &right, sizeof (efi_guid_t));
11741da177e4SLinus Torvalds }
11751da177e4SLinus Torvalds 
11761da177e4SLinus Torvalds static inline char *
117726e02272SBorislav Petkov efi_guid_to_str(efi_guid_t *guid, char *out)
11781da177e4SLinus Torvalds {
1179925ede0bSJoe Perches 	sprintf(out, "%pUl", guid->b);
11801da177e4SLinus Torvalds         return out;
11811da177e4SLinus Torvalds }
11821da177e4SLinus Torvalds 
11831da177e4SLinus Torvalds extern void efi_init (void);
11841da177e4SLinus Torvalds extern void *efi_get_pal_addr (void);
11851da177e4SLinus Torvalds extern void efi_map_pal_code (void);
11861da177e4SLinus Torvalds extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
118770f4f935SArnd Bergmann extern void efi_gettimeofday (struct timespec64 *ts);
11881da177e4SLinus Torvalds extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
118978510792SJosh Triplett #ifdef CONFIG_X86
1190ca0e30dcSArd Biesheuvel extern efi_status_t efi_query_variable_store(u32 attributes,
1191ca0e30dcSArd Biesheuvel 					     unsigned long size,
1192ca0e30dcSArd Biesheuvel 					     bool nonblocking);
119378510792SJosh Triplett #else
1194a6e4d5a0SMatt Fleming 
1195ca0e30dcSArd Biesheuvel static inline efi_status_t efi_query_variable_store(u32 attributes,
1196ca0e30dcSArd Biesheuvel 						    unsigned long size,
1197ca0e30dcSArd Biesheuvel 						    bool nonblocking)
1198a6e4d5a0SMatt Fleming {
1199a6e4d5a0SMatt Fleming 	return EFI_SUCCESS;
1200a6e4d5a0SMatt Fleming }
120178510792SJosh Triplett #endif
12027bc90e01SJosh Triplett extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
12039479c7ceSMatt Fleming 
120420b1e22dSNicolai Stange extern phys_addr_t __init efi_memmap_alloc(unsigned int num_entries);
12059479c7ceSMatt Fleming extern int __init efi_memmap_init_early(struct efi_memory_map_data *data);
1206dca0f971SMatt Fleming extern int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size);
12079479c7ceSMatt Fleming extern void __init efi_memmap_unmap(void);
1208c45f4da3SMatt Fleming extern int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map);
120960863c0dSMatt Fleming extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
121060863c0dSMatt Fleming 					 struct range *range);
121160863c0dSMatt Fleming extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
121260863c0dSMatt Fleming 				     void *buf, struct efi_mem_range *mem);
12139479c7ceSMatt Fleming 
1214272686bfSLeif Lindholm extern int efi_config_init(efi_config_table_type_t *arch_tables);
12153846c158SPeter Jones #ifdef CONFIG_EFI_ESRT
12160bb54905SPeter Jones extern void __init efi_esrt_init(void);
12173846c158SPeter Jones #else
12183846c158SPeter Jones static inline void efi_esrt_init(void) { }
12193846c158SPeter Jones #endif
12207bb68410SArd Biesheuvel extern int efi_config_parse_tables(void *config_tables, int count, int sz,
12217bb68410SArd Biesheuvel 				   efi_config_table_type_t *arch_tables);
12221da177e4SLinus Torvalds extern u64 efi_get_iobase (void);
1223f99afd08STom Lendacky extern int efi_mem_type(unsigned long phys_addr);
12241da177e4SLinus Torvalds extern u64 efi_mem_attributes (unsigned long phys_addr);
122532e62c63SBjorn Helgaas extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
12261da177e4SLinus Torvalds extern int __init efi_uart_console_only (void);
12270bb54905SPeter Jones extern u64 efi_mem_desc_end(efi_memory_desc_t *md);
12280bb54905SPeter Jones extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
1229816e7612SMatt Fleming extern void efi_mem_reserve(phys_addr_t addr, u64 size);
1230a23d3bb0SArd Biesheuvel extern int efi_mem_reserve_persistent(phys_addr_t addr, u64 size);
12311da177e4SLinus Torvalds extern void efi_initialize_iomem_resources(struct resource *code_resource,
123200bf4098SBernhard Walle 		struct resource *data_resource, struct resource *bss_resource);
12337968c0e3SLeif Lindholm extern int efi_get_fdt_params(struct efi_fdt_params *params);
12340bb54905SPeter Jones extern struct kobject *efi_kobj;
12351da177e4SLinus Torvalds 
123644be28e9SMatt Fleming extern int efi_reboot_quirk_mode;
12370c5ed61aSMatt Fleming extern bool efi_poweroff_required(void);
12380c5ed61aSMatt Fleming 
12390f96a99dSTaku Izumi #ifdef CONFIG_EFI_FAKE_MEMMAP
12400f96a99dSTaku Izumi extern void __init efi_fake_memmap(void);
12410f96a99dSTaku Izumi #else
12420f96a99dSTaku Izumi static inline void efi_fake_memmap(void) { }
12430f96a99dSTaku Izumi #endif
12440f96a99dSTaku Izumi 
124510f0d2f5SArd Biesheuvel /*
124610f0d2f5SArd Biesheuvel  * efi_memattr_perm_setter - arch specific callback function passed into
124710f0d2f5SArd Biesheuvel  *                           efi_memattr_apply_permissions() that updates the
124810f0d2f5SArd Biesheuvel  *                           mapping permissions described by the second
124910f0d2f5SArd Biesheuvel  *                           argument in the page tables referred to by the
125010f0d2f5SArd Biesheuvel  *                           first argument.
125110f0d2f5SArd Biesheuvel  */
125210f0d2f5SArd Biesheuvel typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *);
125310f0d2f5SArd Biesheuvel 
125410f0d2f5SArd Biesheuvel extern int efi_memattr_init(void);
125510f0d2f5SArd Biesheuvel extern int efi_memattr_apply_permissions(struct mm_struct *mm,
125610f0d2f5SArd Biesheuvel 					 efi_memattr_perm_setter fn);
125710f0d2f5SArd Biesheuvel 
125802e43c2dSBaoquan He /*
125902e43c2dSBaoquan He  * efi_early_memdesc_ptr - get the n-th EFI memmap descriptor
126002e43c2dSBaoquan He  * @map: the start of efi memmap
126102e43c2dSBaoquan He  * @desc_size: the size of space for each EFI memmap descriptor
126202e43c2dSBaoquan He  * @n: the index of efi memmap descriptor
126302e43c2dSBaoquan He  *
126402e43c2dSBaoquan He  * EFI boot service provides the GetMemoryMap() function to get a copy of the
126502e43c2dSBaoquan He  * current memory map which is an array of memory descriptors, each of
126602e43c2dSBaoquan He  * which describes a contiguous block of memory. It also gets the size of the
126702e43c2dSBaoquan He  * map, and the size of each descriptor, etc.
126802e43c2dSBaoquan He  *
126902e43c2dSBaoquan He  * Note that per section 6.2 of UEFI Spec 2.6 Errata A, the returned size of
127002e43c2dSBaoquan He  * each descriptor might not be equal to sizeof(efi_memory_memdesc_t),
127102e43c2dSBaoquan He  * since efi_memory_memdesc_t may be extended in the future. Thus the OS
127202e43c2dSBaoquan He  * MUST use the returned size of the descriptor to find the start of each
127302e43c2dSBaoquan He  * efi_memory_memdesc_t in the memory map array. This should only be used
127402e43c2dSBaoquan He  * during bootup since for_each_efi_memory_desc_xxx() is available after the
127502e43c2dSBaoquan He  * kernel initializes the EFI subsystem to set up struct efi_memory_map.
127602e43c2dSBaoquan He  */
127702e43c2dSBaoquan He #define efi_early_memdesc_ptr(map, desc_size, n)			\
127802e43c2dSBaoquan He 	(efi_memory_desc_t *)((void *)(map) + ((n) * (desc_size)))
127902e43c2dSBaoquan He 
1280e885cd80SMark Salter /* Iterate through an efi_memory_map */
128178ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md)				   \
1282e885cd80SMark Salter 	for ((md) = (m)->map;						   \
1283d4c4fed0SJan Beulich 	     (md) && ((void *)(md) + (m)->desc_size) <= (m)->map_end;	   \
1284e885cd80SMark Salter 	     (md) = (void *)(md) + (m)->desc_size)
1285e885cd80SMark Salter 
128678ce248fSMatt Fleming /**
128778ce248fSMatt Fleming  * for_each_efi_memory_desc - iterate over descriptors in efi.memmap
128878ce248fSMatt Fleming  * @md: the efi_memory_desc_t * iterator
128978ce248fSMatt Fleming  *
129078ce248fSMatt Fleming  * Once the loop finishes @md must not be accessed.
129178ce248fSMatt Fleming  */
129278ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \
1293884f4f66SMatt Fleming 	for_each_efi_memory_desc_in_map(&efi.memmap, md)
129478ce248fSMatt Fleming 
129598d2a6caSLaszlo Ersek /*
129698d2a6caSLaszlo Ersek  * Format an EFI memory descriptor's type and attributes to a user-provided
129798d2a6caSLaszlo Ersek  * character buffer, as per snprintf(), and return the buffer.
129898d2a6caSLaszlo Ersek  */
129998d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size,
130098d2a6caSLaszlo Ersek 				     const efi_memory_desc_t *md);
130198d2a6caSLaszlo Ersek 
13020bc9ae39SDave Howells 
13030bc9ae39SDave Howells typedef void (*efi_element_handler_t)(const char *source,
13040bc9ae39SDave Howells 				      const void *element_data,
13050bc9ae39SDave Howells 				      size_t element_size);
13060bc9ae39SDave Howells extern int __init parse_efi_signature_list(
13070bc9ae39SDave Howells 	const char *source,
13080bc9ae39SDave Howells 	const void *data, size_t size,
13090bc9ae39SDave Howells 	efi_element_handler_t (*get_handler_for_guid)(const efi_guid_t *));
13100bc9ae39SDave Howells 
13111da177e4SLinus Torvalds /**
13121da177e4SLinus Torvalds  * efi_range_is_wc - check the WC bit on an address range
13131da177e4SLinus Torvalds  * @start: starting kvirt address
13141da177e4SLinus Torvalds  * @len: length of range
13151da177e4SLinus Torvalds  *
13161da177e4SLinus Torvalds  * Consult the EFI memory map and make sure it's ok to set this range WC.
13171da177e4SLinus Torvalds  * Returns true or false.
13181da177e4SLinus Torvalds  */
13191da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len)
13201da177e4SLinus Torvalds {
1321986a80d5SJesper Juhl 	unsigned long i;
13221da177e4SLinus Torvalds 
13231da177e4SLinus Torvalds 	for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) {
13241da177e4SLinus Torvalds 		unsigned long paddr = __pa(start + i);
13251da177e4SLinus Torvalds 		if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC))
13261da177e4SLinus Torvalds 			return 0;
13271da177e4SLinus Torvalds 	}
13281da177e4SLinus Torvalds 	/* The range checked out */
13291da177e4SLinus Torvalds 	return 1;
13301da177e4SLinus Torvalds }
13311da177e4SLinus Torvalds 
13321da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP
13331da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *);
13341da177e4SLinus Torvalds #endif
13351da177e4SLinus Torvalds 
13361da177e4SLinus Torvalds /*
133783e68189SMatt Fleming  * We play games with efi_enabled so that the compiler will, if
133883e68189SMatt Fleming  * possible, remove EFI-related code altogether.
13391da177e4SLinus Torvalds  */
134083e68189SMatt Fleming #define EFI_BOOT		0	/* Were we booted from EFI? */
134183e68189SMatt Fleming #define EFI_CONFIG_TABLES	2	/* Can we use EFI config tables? */
134283e68189SMatt Fleming #define EFI_RUNTIME_SERVICES	3	/* Can we use runtime services? */
134383e68189SMatt Fleming #define EFI_MEMMAP		4	/* Can we use EFI memory map? */
134483e68189SMatt Fleming #define EFI_64BIT		5	/* Is the firmware 64-bit? */
13459f27bc54SDaniel Kiper #define EFI_PARAVIRT		6	/* Access is via a paravirt interface */
13469f27bc54SDaniel Kiper #define EFI_ARCH_1		7	/* First arch-specific bit */
1347fed6cefeSBorislav Petkov #define EFI_DBG			8	/* Print additional debug info at runtime */
1348a1041713SArd Biesheuvel #define EFI_NX_PE_DATA		9	/* Can runtime data regions be mapped non-executable? */
1349a19ebf59SSai Praneeth #define EFI_MEM_ATTR		10	/* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
1350b617c526SDan Williams #define EFI_MEM_NO_SOFT_RESERVE	11	/* Is the kernel configured to ignore soft reservations? */
135183e68189SMatt Fleming 
13521da177e4SLinus Torvalds #ifdef CONFIG_EFI
13533e909599SMatt Fleming /*
13543e909599SMatt Fleming  * Test whether the above EFI_* bits are enabled.
13553e909599SMatt Fleming  */
13563e909599SMatt Fleming static inline bool efi_enabled(int feature)
135783e68189SMatt Fleming {
13583e909599SMatt Fleming 	return test_bit(feature, &efi.flags) != 0;
13593e909599SMatt Fleming }
13608562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
1361b617c526SDan Williams 
1362b617c526SDan Williams bool __pure __efi_soft_reserve_enabled(void);
1363b617c526SDan Williams 
1364b617c526SDan Williams static inline bool __pure efi_soft_reserve_enabled(void)
1365b617c526SDan Williams {
1366b617c526SDan Williams 	return IS_ENABLED(CONFIG_EFI_SOFT_RESERVE)
1367b617c526SDan Williams 		&& __efi_soft_reserve_enabled();
1368b617c526SDan Williams }
13693e909599SMatt Fleming #else
13703e909599SMatt Fleming static inline bool efi_enabled(int feature)
13713e909599SMatt Fleming {
13723e909599SMatt Fleming 	return false;
137383e68189SMatt Fleming }
13748562c99cSMatt Fleming static inline void
13758562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
137687615a34SMatt Fleming 
137787615a34SMatt Fleming static inline bool
137887615a34SMatt Fleming efi_capsule_pending(int *reset_type)
137987615a34SMatt Fleming {
138087615a34SMatt Fleming 	return false;
138187615a34SMatt Fleming }
1382b617c526SDan Williams 
1383b617c526SDan Williams static inline bool efi_soft_reserve_enabled(void)
1384b617c526SDan Williams {
1385b617c526SDan Williams 	return false;
1386b617c526SDan Williams }
13871da177e4SLinus Torvalds #endif
13881da177e4SLinus Torvalds 
1389806b0351SMatt Fleming extern int efi_status_to_err(efi_status_t status);
1390806b0351SMatt Fleming 
13911da177e4SLinus Torvalds /*
13921da177e4SLinus Torvalds  * Variable Attributes
13931da177e4SLinus Torvalds  */
13941da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
13951da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
13961da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
139741b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
139841b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
139941b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
140041b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE	0x0000000000000040
14011da177e4SLinus Torvalds 
140241b3254cSMatthew Garrett #define EFI_VARIABLE_MASK 	(EFI_VARIABLE_NON_VOLATILE | \
140341b3254cSMatthew Garrett 				EFI_VARIABLE_BOOTSERVICE_ACCESS | \
140441b3254cSMatthew Garrett 				EFI_VARIABLE_RUNTIME_ACCESS | \
140541b3254cSMatthew Garrett 				EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
140641b3254cSMatthew Garrett 				EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
140741b3254cSMatthew Garrett 				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
140841b3254cSMatthew Garrett 				EFI_VARIABLE_APPEND_WRITE)
14091da177e4SLinus Torvalds /*
1410e14ab23dSMatt Fleming  * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
1411e14ab23dSMatt Fleming  * not including trailing NUL
1412e14ab23dSMatt Fleming  */
1413ba7e34b1SAndy Shevchenko #define EFI_VARIABLE_GUID_LEN	UUID_STRING_LEN
1414e14ab23dSMatt Fleming 
1415e14ab23dSMatt Fleming /*
1416e2527a7cSMatt Fleming  * The type of search to perform when calling boottime->locate_handle
1417e2527a7cSMatt Fleming  */
1418e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES			0
1419e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1420e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL			2
1421e2527a7cSMatt Fleming 
1422e2527a7cSMatt Fleming /*
14231da177e4SLinus Torvalds  * EFI Device Path information
14241da177e4SLinus Torvalds  */
14251da177e4SLinus Torvalds #define EFI_DEV_HW			0x01
14261da177e4SLinus Torvalds #define  EFI_DEV_PCI				 1
14271da177e4SLinus Torvalds #define  EFI_DEV_PCCARD				 2
14281da177e4SLinus Torvalds #define  EFI_DEV_MEM_MAPPED			 3
14291da177e4SLinus Torvalds #define  EFI_DEV_VENDOR				 4
14301da177e4SLinus Torvalds #define  EFI_DEV_CONTROLLER			 5
14311da177e4SLinus Torvalds #define EFI_DEV_ACPI			0x02
14321da177e4SLinus Torvalds #define   EFI_DEV_BASIC_ACPI			 1
14331da177e4SLinus Torvalds #define   EFI_DEV_EXPANDED_ACPI			 2
14341da177e4SLinus Torvalds #define EFI_DEV_MSG			0x03
14351da177e4SLinus Torvalds #define   EFI_DEV_MSG_ATAPI			 1
14361da177e4SLinus Torvalds #define   EFI_DEV_MSG_SCSI			 2
14371da177e4SLinus Torvalds #define   EFI_DEV_MSG_FC			 3
14381da177e4SLinus Torvalds #define   EFI_DEV_MSG_1394			 4
14391da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB			 5
14401da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB_CLASS			15
14411da177e4SLinus Torvalds #define   EFI_DEV_MSG_I20			 6
14421da177e4SLinus Torvalds #define   EFI_DEV_MSG_MAC			11
14431da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV4			12
14441da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV6			13
14451da177e4SLinus Torvalds #define   EFI_DEV_MSG_INFINIBAND		 9
14461da177e4SLinus Torvalds #define   EFI_DEV_MSG_UART			14
14471da177e4SLinus Torvalds #define   EFI_DEV_MSG_VENDOR			10
14481da177e4SLinus Torvalds #define EFI_DEV_MEDIA			0x04
14491da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_HARD_DRIVE		 1
14501da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_CDROM			 2
14511da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_VENDOR			 3
14521da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_FILE			 4
14531da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_PROTOCOL		 5
14541da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT		0x05
14551da177e4SLinus Torvalds #define EFI_DEV_END_PATH		0x7F
14561da177e4SLinus Torvalds #define EFI_DEV_END_PATH2		0xFF
14571da177e4SLinus Torvalds #define   EFI_DEV_END_INSTANCE			0x01
14581da177e4SLinus Torvalds #define   EFI_DEV_END_ENTIRE			0xFF
14591da177e4SLinus Torvalds 
14601da177e4SLinus Torvalds struct efi_generic_dev_path {
14611da177e4SLinus Torvalds 	u8 type;
14621da177e4SLinus Torvalds 	u8 sub_type;
14631da177e4SLinus Torvalds 	u16 length;
14641da177e4SLinus Torvalds } __attribute ((packed));
14651da177e4SLinus Torvalds 
146646cd4b75SLukas Wunner struct efi_dev_path {
146746cd4b75SLukas Wunner 	u8 type;	/* can be replaced with unnamed */
146846cd4b75SLukas Wunner 	u8 sub_type;	/* struct efi_generic_dev_path; */
146946cd4b75SLukas Wunner 	u16 length;	/* once we've moved to -std=c11 */
147046cd4b75SLukas Wunner 	union {
147146cd4b75SLukas Wunner 		struct {
147246cd4b75SLukas Wunner 			u32 hid;
147346cd4b75SLukas Wunner 			u32 uid;
147446cd4b75SLukas Wunner 		} acpi;
147546cd4b75SLukas Wunner 		struct {
147646cd4b75SLukas Wunner 			u8 fn;
147746cd4b75SLukas Wunner 			u8 dev;
147846cd4b75SLukas Wunner 		} pci;
147946cd4b75SLukas Wunner 	};
148046cd4b75SLukas Wunner } __attribute ((packed));
148146cd4b75SLukas Wunner 
148246cd4b75SLukas Wunner #if IS_ENABLED(CONFIG_EFI_DEV_PATH_PARSER)
148346cd4b75SLukas Wunner struct device *efi_get_device_by_path(struct efi_dev_path **node, size_t *len);
148446cd4b75SLukas Wunner #endif
148546cd4b75SLukas Wunner 
14864a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
14874a3575fdSHuang, Ying {
14884a3575fdSHuang, Ying 	*npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
14894a3575fdSHuang, Ying 	*addr &= PAGE_MASK;
14904a3575fdSHuang, Ying }
14914a3575fdSHuang, Ying 
149204851772SMatt Fleming /*
14934fc756bdSMike Waychison  * EFI Variable support.
14944fc756bdSMike Waychison  *
14954fc756bdSMike Waychison  * Different firmware drivers can expose their EFI-like variables using
14964fc756bdSMike Waychison  * the following.
14974fc756bdSMike Waychison  */
14984fc756bdSMike Waychison 
14994fc756bdSMike Waychison struct efivar_operations {
15004fc756bdSMike Waychison 	efi_get_variable_t *get_variable;
15014fc756bdSMike Waychison 	efi_get_next_variable_t *get_next_variable;
15024fc756bdSMike Waychison 	efi_set_variable_t *set_variable;
150370d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
1504a6e4d5a0SMatt Fleming 	efi_query_variable_store_t *query_variable_store;
15054fc756bdSMike Waychison };
15064fc756bdSMike Waychison 
15074fc756bdSMike Waychison struct efivars {
15084fc756bdSMike Waychison 	struct kset *kset;
1509605e70c7SLee, Chun-Yi 	struct kobject *kobject;
15104fc756bdSMike Waychison 	const struct efivar_operations *ops;
15114fc756bdSMike Waychison };
15124fc756bdSMike Waychison 
1513e14ab23dSMatt Fleming /*
1514e14ab23dSMatt Fleming  * The maximum size of VariableName + Data = 1024
1515e14ab23dSMatt Fleming  * Therefore, it's reasonable to save that much
1516e14ab23dSMatt Fleming  * space in each part of the structure,
1517e14ab23dSMatt Fleming  * and we use a page for reading/writing.
1518e14ab23dSMatt Fleming  */
1519e14ab23dSMatt Fleming 
1520a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN	1024
1521a5d92ad3SMatt Fleming 
1522e14ab23dSMatt Fleming struct efi_variable {
1523a5d92ad3SMatt Fleming 	efi_char16_t  VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)];
1524e14ab23dSMatt Fleming 	efi_guid_t    VendorGuid;
1525e14ab23dSMatt Fleming 	unsigned long DataSize;
1526e14ab23dSMatt Fleming 	__u8          Data[1024];
1527e14ab23dSMatt Fleming 	efi_status_t  Status;
1528e14ab23dSMatt Fleming 	__u32         Attributes;
1529e14ab23dSMatt Fleming } __attribute__((packed));
1530e14ab23dSMatt Fleming 
1531e14ab23dSMatt Fleming struct efivar_entry {
1532e14ab23dSMatt Fleming 	struct efi_variable var;
1533e14ab23dSMatt Fleming 	struct list_head list;
1534e14ab23dSMatt Fleming 	struct kobject kobj;
1535e0d59733SSeiji Aguchi 	bool scanning;
1536e0d59733SSeiji Aguchi 	bool deleting;
1537e14ab23dSMatt Fleming };
1538e14ab23dSMatt Fleming 
1539db4545d9SLukas Wunner typedef struct {
1540677703ceSMatt Fleming 	u32 reset;
1541677703ceSMatt Fleming 	u32 output_string;
1542677703ceSMatt Fleming 	u32 test_string;
1543db4545d9SLukas Wunner } efi_simple_text_output_protocol_32_t;
1544677703ceSMatt Fleming 
1545db4545d9SLukas Wunner typedef struct {
1546677703ceSMatt Fleming 	u64 reset;
1547677703ceSMatt Fleming 	u64 output_string;
1548677703ceSMatt Fleming 	u64 test_string;
1549db4545d9SLukas Wunner } efi_simple_text_output_protocol_64_t;
1550ed37ddffSRoy Franz 
1551*1786e830SArd Biesheuvel typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t;
1552*1786e830SArd Biesheuvel 
1553*1786e830SArd Biesheuvel union efi_simple_text_output_protocol {
1554*1786e830SArd Biesheuvel 	struct {
1555ed37ddffSRoy Franz 		void *reset;
1556*1786e830SArd Biesheuvel 		efi_status_t (*output_string)(efi_simple_text_output_protocol_t *,
1557*1786e830SArd Biesheuvel 					      efi_char16_t *);
1558ed37ddffSRoy Franz 		void *test_string;
1559ed37ddffSRoy Franz 	};
1560*1786e830SArd Biesheuvel 	struct {
1561*1786e830SArd Biesheuvel 		u32 reset;
1562*1786e830SArd Biesheuvel 		u32 output_string;
1563*1786e830SArd Biesheuvel 		u32 test_string;
1564*1786e830SArd Biesheuvel 	} mixed_mode;
1565*1786e830SArd Biesheuvel };
1566ed37ddffSRoy Franz 
1567fc372064SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
1568fc372064SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
1569fc372064SArd Biesheuvel #define PIXEL_BIT_MASK					2
1570fc372064SArd Biesheuvel #define PIXEL_BLT_ONLY					3
1571fc372064SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
1572fc372064SArd Biesheuvel 
157344c84b4aSArvind Sankar typedef struct {
1574fc372064SArd Biesheuvel 	u32 red_mask;
1575fc372064SArd Biesheuvel 	u32 green_mask;
1576fc372064SArd Biesheuvel 	u32 blue_mask;
1577fc372064SArd Biesheuvel 	u32 reserved_mask;
157844c84b4aSArvind Sankar } efi_pixel_bitmask_t;
1579fc372064SArd Biesheuvel 
158044c84b4aSArvind Sankar typedef struct {
1581fc372064SArd Biesheuvel 	u32 version;
1582fc372064SArd Biesheuvel 	u32 horizontal_resolution;
1583fc372064SArd Biesheuvel 	u32 vertical_resolution;
1584fc372064SArd Biesheuvel 	int pixel_format;
158544c84b4aSArvind Sankar 	efi_pixel_bitmask_t pixel_information;
1586fc372064SArd Biesheuvel 	u32 pixels_per_scan_line;
158744c84b4aSArvind Sankar } efi_graphics_output_mode_info_t;
1588fc372064SArd Biesheuvel 
158944c84b4aSArvind Sankar typedef struct {
1590fc372064SArd Biesheuvel 	u32 max_mode;
1591fc372064SArd Biesheuvel 	u32 mode;
1592fc372064SArd Biesheuvel 	u32 info;
1593fc372064SArd Biesheuvel 	u32 size_of_info;
1594fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1595fc372064SArd Biesheuvel 	u32 frame_buffer_size;
159644c84b4aSArvind Sankar } efi_graphics_output_protocol_mode_32_t;
1597fc372064SArd Biesheuvel 
159844c84b4aSArvind Sankar typedef struct {
1599fc372064SArd Biesheuvel 	u32 max_mode;
1600fc372064SArd Biesheuvel 	u32 mode;
1601fc372064SArd Biesheuvel 	u64 info;
1602fc372064SArd Biesheuvel 	u64 size_of_info;
1603fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1604fc372064SArd Biesheuvel 	u64 frame_buffer_size;
160544c84b4aSArvind Sankar } efi_graphics_output_protocol_mode_64_t;
1606fc372064SArd Biesheuvel 
1607*1786e830SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
1608*1786e830SArd Biesheuvel 
1609*1786e830SArd Biesheuvel union efi_graphics_output_protocol_mode {
1610*1786e830SArd Biesheuvel 	struct {
1611fc372064SArd Biesheuvel 		u32 max_mode;
1612fc372064SArd Biesheuvel 		u32 mode;
161344c84b4aSArvind Sankar 		efi_graphics_output_mode_info_t *info;
1614fc372064SArd Biesheuvel 		unsigned long size_of_info;
161544c84b4aSArvind Sankar 		efi_physical_addr_t frame_buffer_base;
1616fc372064SArd Biesheuvel 		unsigned long frame_buffer_size;
1617*1786e830SArd Biesheuvel 	};
1618*1786e830SArd Biesheuvel 	struct {
1619*1786e830SArd Biesheuvel 		u32 max_mode;
1620*1786e830SArd Biesheuvel 		u32 mode;
1621*1786e830SArd Biesheuvel 		u32 info;
1622*1786e830SArd Biesheuvel 		u32 size_of_info;
1623*1786e830SArd Biesheuvel 		u64 frame_buffer_base;
1624*1786e830SArd Biesheuvel 		u32 frame_buffer_size;
1625*1786e830SArd Biesheuvel 	} mixed_mode;
1626*1786e830SArd Biesheuvel };
1627fc372064SArd Biesheuvel 
162844c84b4aSArvind Sankar typedef struct {
1629fc372064SArd Biesheuvel 	u32 query_mode;
1630fc372064SArd Biesheuvel 	u32 set_mode;
1631fc372064SArd Biesheuvel 	u32 blt;
1632fc372064SArd Biesheuvel 	u32 mode;
163344c84b4aSArvind Sankar } efi_graphics_output_protocol_32_t;
1634fc372064SArd Biesheuvel 
163544c84b4aSArvind Sankar typedef struct {
1636fc372064SArd Biesheuvel 	u64 query_mode;
1637fc372064SArd Biesheuvel 	u64 set_mode;
1638fc372064SArd Biesheuvel 	u64 blt;
1639fc372064SArd Biesheuvel 	u64 mode;
164044c84b4aSArvind Sankar } efi_graphics_output_protocol_64_t;
1641fc372064SArd Biesheuvel 
1642*1786e830SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
1643*1786e830SArd Biesheuvel 
1644*1786e830SArd Biesheuvel union efi_graphics_output_protocol {
1645*1786e830SArd Biesheuvel 	struct {
164644c84b4aSArvind Sankar 		void *query_mode;
164744c84b4aSArvind Sankar 		void *set_mode;
164844c84b4aSArvind Sankar 		void *blt;
164944c84b4aSArvind Sankar 		efi_graphics_output_protocol_mode_t *mode;
1650*1786e830SArd Biesheuvel 	};
1651*1786e830SArd Biesheuvel 	struct {
1652*1786e830SArd Biesheuvel 		u32 query_mode;
1653*1786e830SArd Biesheuvel 		u32 set_mode;
1654*1786e830SArd Biesheuvel 		u32 blt;
1655*1786e830SArd Biesheuvel 		u32 mode;
1656*1786e830SArd Biesheuvel 	} mixed_mode;
1657*1786e830SArd Biesheuvel };
1658fc372064SArd Biesheuvel 
165904851772SMatt Fleming extern struct list_head efivar_sysfs_list;
166004851772SMatt Fleming 
166104851772SMatt Fleming static inline void
166204851772SMatt Fleming efivar_unregister(struct efivar_entry *var)
166304851772SMatt Fleming {
166404851772SMatt Fleming 	kobject_put(&var->kobj);
166504851772SMatt Fleming }
166604851772SMatt Fleming 
1667e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars,
16684fc756bdSMike Waychison 		     const struct efivar_operations *ops,
1669e14ab23dSMatt Fleming 		     struct kobject *kobject);
1670e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars);
1671e14ab23dSMatt Fleming struct kobject *efivars_kobject(void);
1672e14ab23dSMatt Fleming 
1673e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
16741cfd6316SJulia Lawall 		void *data, bool duplicates, struct list_head *head);
1675e14ab23dSMatt Fleming 
167621b3ddd3SSylvain Chouleur int efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
167721b3ddd3SSylvain Chouleur int efivar_entry_remove(struct efivar_entry *entry);
1678e14ab23dSMatt Fleming 
1679e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry);
1680e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry);
1681e14ab23dSMatt Fleming 
1682e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
16838a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
16848a415b8cSMatt Fleming 		       unsigned long *size, void *data);
1685e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1686e14ab23dSMatt Fleming 		     unsigned long *size, void *data);
1687e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
1688e14ab23dSMatt Fleming 		     unsigned long size, void *data, struct list_head *head);
1689e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
1690e14ab23dSMatt Fleming 			      unsigned long *size, void *data, bool *set);
1691e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
1692e14ab23dSMatt Fleming 			  bool block, unsigned long size, void *data);
1693e14ab23dSMatt Fleming 
169421b3ddd3SSylvain Chouleur int efivar_entry_iter_begin(void);
1695e14ab23dSMatt Fleming void efivar_entry_iter_end(void);
1696e14ab23dSMatt Fleming 
1697e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1698e14ab23dSMatt Fleming 			struct list_head *head, void *data,
1699e14ab23dSMatt Fleming 			struct efivar_entry **prev);
1700e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1701e14ab23dSMatt Fleming 		      struct list_head *head, void *data);
1702e14ab23dSMatt Fleming 
1703e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
1704e14ab23dSMatt Fleming 				       struct list_head *head, bool remove);
1705e14ab23dSMatt Fleming 
17068282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
17078282f5d9SPeter Jones 		     unsigned long data_size);
1708ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
1709ed8b0de5SPeter Jones 				  size_t len);
1710e14ab23dSMatt Fleming 
1711a9499fa7STom Gundersen extern struct work_struct efivar_work;
171204851772SMatt Fleming void efivar_run_worker(void);
171304851772SMatt Fleming 
1714a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
1715e14ab23dSMatt Fleming int efivars_sysfs_init(void);
17164fc756bdSMike Waychison 
1717e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024
1718e0d59733SSeiji Aguchi 
17194fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */
1720f0133f3cSMatt Fleming extern bool efi_capsule_pending(int *reset_type);
1721f0133f3cSMatt Fleming 
1722f0133f3cSMatt Fleming extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
1723f0133f3cSMatt Fleming 				 size_t size, int *reset);
1724f0133f3cSMatt Fleming 
1725f0133f3cSMatt Fleming extern int efi_capsule_update(efi_capsule_header_t *capsule,
17262a457fb3SArd Biesheuvel 			      phys_addr_t *pages);
17274fc756bdSMike Waychison 
1728926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP
1729926172d4SDave Young int efi_runtime_map_init(struct kobject *);
17306a2c20e7SVivek Goyal int efi_get_runtime_map_size(void);
17316a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void);
17326a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz);
1733926172d4SDave Young #else
1734926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj)
1735926172d4SDave Young {
1736926172d4SDave Young 	return 0;
1737926172d4SDave Young }
1738926172d4SDave Young 
17396a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void)
17406a2c20e7SVivek Goyal {
17416a2c20e7SVivek Goyal 	return 0;
17426a2c20e7SVivek Goyal }
17436a2c20e7SVivek Goyal 
17446a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void)
17456a2c20e7SVivek Goyal {
17466a2c20e7SVivek Goyal 	return 0;
17476a2c20e7SVivek Goyal }
17486a2c20e7SVivek Goyal 
17496a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
17506a2c20e7SVivek Goyal {
17516a2c20e7SVivek Goyal 	return 0;
17526a2c20e7SVivek Goyal }
17536a2c20e7SVivek Goyal 
1754926172d4SDave Young #endif
1755926172d4SDave Young 
1756bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */
1757bd669475SArd Biesheuvel 
1758bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str);
1759bd669475SArd Biesheuvel 
1760bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
1761bd669475SArd Biesheuvel 	      unsigned long addr);
1762bd669475SArd Biesheuvel 
1763bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,
1764bd669475SArd Biesheuvel 			  efi_loaded_image_t *image, int *cmd_line_len);
1765bd669475SArd Biesheuvel 
1766bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
1767dadb57abSJeffrey Hugo 				struct efi_boot_memmap *map);
1768bd669475SArd Biesheuvel 
1769220dd769SKairui Song efi_status_t efi_low_alloc_above(efi_system_table_t *sys_table_arg,
1770220dd769SKairui Song 				 unsigned long size, unsigned long align,
1771220dd769SKairui Song 				 unsigned long *addr, unsigned long min);
1772220dd769SKairui Song 
1773220dd769SKairui Song static inline
1774bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
1775bd669475SArd Biesheuvel 			   unsigned long size, unsigned long align,
1776220dd769SKairui Song 			   unsigned long *addr)
1777220dd769SKairui Song {
1778220dd769SKairui Song 	/*
1779220dd769SKairui Song 	 * Don't allocate at 0x0. It will confuse code that
1780220dd769SKairui Song 	 * checks pointers against NULL. Skip the first 8
1781220dd769SKairui Song 	 * bytes so we start at a nice even number.
1782220dd769SKairui Song 	 */
1783220dd769SKairui Song 	return efi_low_alloc_above(sys_table_arg, size, align, addr, 0x8);
1784220dd769SKairui Song }
1785bd669475SArd Biesheuvel 
1786bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
1787bd669475SArd Biesheuvel 			    unsigned long size, unsigned long align,
1788bd669475SArd Biesheuvel 			    unsigned long *addr, unsigned long max);
1789bd669475SArd Biesheuvel 
1790bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
1791bd669475SArd Biesheuvel 				 unsigned long *image_addr,
1792bd669475SArd Biesheuvel 				 unsigned long image_size,
1793bd669475SArd Biesheuvel 				 unsigned long alloc_size,
1794bd669475SArd Biesheuvel 				 unsigned long preferred_addr,
1795220dd769SKairui Song 				 unsigned long alignment,
1796220dd769SKairui Song 				 unsigned long min_addr);
1797bd669475SArd Biesheuvel 
1798bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
1799bd669475SArd Biesheuvel 				  efi_loaded_image_t *image,
1800bd669475SArd Biesheuvel 				  char *cmd_line, char *option_string,
1801bd669475SArd Biesheuvel 				  unsigned long max_addr,
1802bd669475SArd Biesheuvel 				  unsigned long *load_addr,
1803bd669475SArd Biesheuvel 				  unsigned long *load_size);
1804bd669475SArd Biesheuvel 
180560f38de7SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline);
18065a17dae4SMatt Fleming 
18072c23b73cSArd Biesheuvel efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg,
18082c23b73cSArd Biesheuvel 			   struct screen_info *si, efi_guid_t *proto,
18092c23b73cSArd Biesheuvel 			   unsigned long size);
18102c23b73cSArd Biesheuvel 
18110082517fSJian-Hong Pan #ifdef CONFIG_EFI
18120082517fSJian-Hong Pan extern bool efi_runtime_disabled(void);
18130082517fSJian-Hong Pan #else
18140082517fSJian-Hong Pan static inline bool efi_runtime_disabled(void) { return true; }
18150082517fSJian-Hong Pan #endif
18160082517fSJian-Hong Pan 
181780e75596SAlex Thorlton extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
181813b210ddSJulien Thierry extern unsigned long efi_call_virt_save_flags(void);
181980e75596SAlex Thorlton 
1820de8cb458SDavid Howells enum efi_secureboot_mode {
1821de8cb458SDavid Howells 	efi_secureboot_mode_unset,
1822de8cb458SDavid Howells 	efi_secureboot_mode_unknown,
1823de8cb458SDavid Howells 	efi_secureboot_mode_disabled,
1824de8cb458SDavid Howells 	efi_secureboot_mode_enabled,
1825de8cb458SDavid Howells };
1826de8cb458SDavid Howells enum efi_secureboot_mode efi_get_secureboot(efi_system_table_t *sys_table);
1827de8cb458SDavid Howells 
1828ccc829baSMatthew Garrett #ifdef CONFIG_RESET_ATTACK_MITIGATION
1829ccc829baSMatthew Garrett void efi_enable_reset_attack_mitigation(efi_system_table_t *sys_table_arg);
1830ccc829baSMatthew Garrett #else
1831ccc829baSMatthew Garrett static inline void
1832ccc829baSMatthew Garrett efi_enable_reset_attack_mitigation(efi_system_table_t *sys_table_arg) { }
1833ccc829baSMatthew Garrett #endif
1834ccc829baSMatthew Garrett 
18350d959814SDominik Brodowski efi_status_t efi_random_get_seed(efi_system_table_t *sys_table_arg);
18360d959814SDominik Brodowski 
183733b6d034SThiebaud Weksteen void efi_retrieve_tpm2_eventlog(efi_system_table_t *sys_table);
183833b6d034SThiebaud Weksteen 
183980e75596SAlex Thorlton /*
184080e75596SAlex Thorlton  * Arch code can implement the following three template macros, avoiding
184180e75596SAlex Thorlton  * reptition for the void/non-void return cases of {__,}efi_call_virt():
184280e75596SAlex Thorlton  *
184380e75596SAlex Thorlton  *  * arch_efi_call_virt_setup()
184480e75596SAlex Thorlton  *
184580e75596SAlex Thorlton  *    Sets up the environment for the call (e.g. switching page tables,
184680e75596SAlex Thorlton  *    allowing kernel-mode use of floating point, if required).
184780e75596SAlex Thorlton  *
184880e75596SAlex Thorlton  *  * arch_efi_call_virt()
184980e75596SAlex Thorlton  *
185080e75596SAlex Thorlton  *    Performs the call. The last expression in the macro must be the call
185180e75596SAlex Thorlton  *    itself, allowing the logic to be shared by the void and non-void
185280e75596SAlex Thorlton  *    cases.
185380e75596SAlex Thorlton  *
185480e75596SAlex Thorlton  *  * arch_efi_call_virt_teardown()
185580e75596SAlex Thorlton  *
185680e75596SAlex Thorlton  *    Restores the usual kernel environment once the call has returned.
185780e75596SAlex Thorlton  */
185880e75596SAlex Thorlton 
185980e75596SAlex Thorlton #define efi_call_virt_pointer(p, f, args...)				\
186080e75596SAlex Thorlton ({									\
186180e75596SAlex Thorlton 	efi_status_t __s;						\
186280e75596SAlex Thorlton 	unsigned long __flags;						\
186380e75596SAlex Thorlton 									\
186480e75596SAlex Thorlton 	arch_efi_call_virt_setup();					\
186580e75596SAlex Thorlton 									\
186613b210ddSJulien Thierry 	__flags = efi_call_virt_save_flags();				\
186780e75596SAlex Thorlton 	__s = arch_efi_call_virt(p, f, args);				\
186880e75596SAlex Thorlton 	efi_call_virt_check_flags(__flags, __stringify(f));		\
186980e75596SAlex Thorlton 									\
187080e75596SAlex Thorlton 	arch_efi_call_virt_teardown();					\
187180e75596SAlex Thorlton 									\
187280e75596SAlex Thorlton 	__s;								\
187380e75596SAlex Thorlton })
187480e75596SAlex Thorlton 
187580e75596SAlex Thorlton #define __efi_call_virt_pointer(p, f, args...)				\
187680e75596SAlex Thorlton ({									\
187780e75596SAlex Thorlton 	unsigned long __flags;						\
187880e75596SAlex Thorlton 									\
187980e75596SAlex Thorlton 	arch_efi_call_virt_setup();					\
188080e75596SAlex Thorlton 									\
188113b210ddSJulien Thierry 	__flags = efi_call_virt_save_flags();				\
188280e75596SAlex Thorlton 	arch_efi_call_virt(p, f, args);					\
188380e75596SAlex Thorlton 	efi_call_virt_check_flags(__flags, __stringify(f));		\
188480e75596SAlex Thorlton 									\
188580e75596SAlex Thorlton 	arch_efi_call_virt_teardown();					\
188680e75596SAlex Thorlton })
188780e75596SAlex Thorlton 
1888fc07716bSJeffrey Hugo typedef efi_status_t (*efi_exit_boot_map_processing)(
1889fc07716bSJeffrey Hugo 	efi_system_table_t *sys_table_arg,
1890fc07716bSJeffrey Hugo 	struct efi_boot_memmap *map,
1891fc07716bSJeffrey Hugo 	void *priv);
1892fc07716bSJeffrey Hugo 
1893fc07716bSJeffrey Hugo efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table,
1894fc07716bSJeffrey Hugo 				    void *handle,
1895fc07716bSJeffrey Hugo 				    struct efi_boot_memmap *map,
1896fc07716bSJeffrey Hugo 				    void *priv,
1897fc07716bSJeffrey Hugo 				    efi_exit_boot_map_processing priv_func);
189863625988SArd Biesheuvel 
1899c2ceb5fdSArd Biesheuvel #define EFI_RANDOM_SEED_SIZE		64U
1900c2ceb5fdSArd Biesheuvel 
190163625988SArd Biesheuvel struct linux_efi_random_seed {
190263625988SArd Biesheuvel 	u32	size;
190363625988SArd Biesheuvel 	u8	bits[];
190463625988SArd Biesheuvel };
190563625988SArd Biesheuvel 
190633b6d034SThiebaud Weksteen struct linux_efi_tpm_eventlog {
190733b6d034SThiebaud Weksteen 	u32	size;
1908166a2809SMatthew Garrett 	u32	final_events_preboot_size;
190933b6d034SThiebaud Weksteen 	u8	version;
191033b6d034SThiebaud Weksteen 	u8	log[];
191133b6d034SThiebaud Weksteen };
191233b6d034SThiebaud Weksteen 
191333b6d034SThiebaud Weksteen extern int efi_tpm_eventlog_init(void);
191433b6d034SThiebaud Weksteen 
1915c46f3405SMatthew Garrett struct efi_tcg2_final_events_table {
1916c46f3405SMatthew Garrett 	u64 version;
1917c46f3405SMatthew Garrett 	u64 nr_events;
1918c46f3405SMatthew Garrett 	u8 events[];
1919c46f3405SMatthew Garrett };
1920c46f3405SMatthew Garrett extern int efi_tpm_final_log_size;
1921c46f3405SMatthew Garrett 
19221c5fecb6SNarendra K extern unsigned long rci2_table_phys;
19231c5fecb6SNarendra K 
19243425d934SSai Praneeth /*
19253425d934SSai Praneeth  * efi_runtime_service() function identifiers.
19263425d934SSai Praneeth  * "NONE" is used by efi_recover_from_page_fault() to check if the page
19273425d934SSai Praneeth  * fault happened while executing an efi runtime service.
19283425d934SSai Praneeth  */
19299dbbedaaSSai Praneeth enum efi_rts_ids {
19305c418dc7SAnders Roxell 	EFI_NONE,
19315c418dc7SAnders Roxell 	EFI_GET_TIME,
19325c418dc7SAnders Roxell 	EFI_SET_TIME,
19335c418dc7SAnders Roxell 	EFI_GET_WAKEUP_TIME,
19345c418dc7SAnders Roxell 	EFI_SET_WAKEUP_TIME,
19355c418dc7SAnders Roxell 	EFI_GET_VARIABLE,
19365c418dc7SAnders Roxell 	EFI_GET_NEXT_VARIABLE,
19375c418dc7SAnders Roxell 	EFI_SET_VARIABLE,
19385c418dc7SAnders Roxell 	EFI_QUERY_VARIABLE_INFO,
19395c418dc7SAnders Roxell 	EFI_GET_NEXT_HIGH_MONO_COUNT,
19405c418dc7SAnders Roxell 	EFI_RESET_SYSTEM,
19415c418dc7SAnders Roxell 	EFI_UPDATE_CAPSULE,
19425c418dc7SAnders Roxell 	EFI_QUERY_CAPSULE_CAPS,
19439dbbedaaSSai Praneeth };
19449dbbedaaSSai Praneeth 
19459dbbedaaSSai Praneeth /*
19469dbbedaaSSai Praneeth  * efi_runtime_work:	Details of EFI Runtime Service work
19479dbbedaaSSai Praneeth  * @arg<1-5>:		EFI Runtime Service function arguments
19489dbbedaaSSai Praneeth  * @status:		Status of executing EFI Runtime Service
19499dbbedaaSSai Praneeth  * @efi_rts_id:		EFI Runtime Service function identifier
19509dbbedaaSSai Praneeth  * @efi_rts_comp:	Struct used for handling completions
19519dbbedaaSSai Praneeth  */
19529dbbedaaSSai Praneeth struct efi_runtime_work {
19539dbbedaaSSai Praneeth 	void *arg1;
19549dbbedaaSSai Praneeth 	void *arg2;
19559dbbedaaSSai Praneeth 	void *arg3;
19569dbbedaaSSai Praneeth 	void *arg4;
19579dbbedaaSSai Praneeth 	void *arg5;
19589dbbedaaSSai Praneeth 	efi_status_t status;
19599dbbedaaSSai Praneeth 	struct work_struct work;
19609dbbedaaSSai Praneeth 	enum efi_rts_ids efi_rts_id;
19619dbbedaaSSai Praneeth 	struct completion efi_rts_comp;
19629dbbedaaSSai Praneeth };
19639dbbedaaSSai Praneeth 
19649dbbedaaSSai Praneeth extern struct efi_runtime_work efi_rts_work;
19659dbbedaaSSai Praneeth 
19663eb420e7SSai Praneeth /* Workqueue to queue EFI Runtime Services */
19673eb420e7SSai Praneeth extern struct workqueue_struct *efi_rts_wq;
19683eb420e7SSai Praneeth 
196971e0940dSArd Biesheuvel struct linux_efi_memreserve {
19705f0b0ecfSArd Biesheuvel 	int		size;			// allocated size of the array
19715f0b0ecfSArd Biesheuvel 	atomic_t	count;			// number of entries used
19725f0b0ecfSArd Biesheuvel 	phys_addr_t	next;			// pa of next struct instance
19735f0b0ecfSArd Biesheuvel 	struct {
197471e0940dSArd Biesheuvel 		phys_addr_t	base;
197571e0940dSArd Biesheuvel 		phys_addr_t	size;
19765f0b0ecfSArd Biesheuvel 	} entry[0];
197771e0940dSArd Biesheuvel };
197871e0940dSArd Biesheuvel 
19795f0b0ecfSArd Biesheuvel #define EFI_MEMRESERVE_SIZE(count) (sizeof(struct linux_efi_memreserve) + \
19805f0b0ecfSArd Biesheuvel 	(count) * sizeof(((struct linux_efi_memreserve *)0)->entry[0]))
19815f0b0ecfSArd Biesheuvel 
198280424b02SArd Biesheuvel #define EFI_MEMRESERVE_COUNT(size) (((size) - sizeof(struct linux_efi_memreserve)) \
198380424b02SArd Biesheuvel 	/ sizeof(((struct linux_efi_memreserve *)0)->entry[0]))
198480424b02SArd Biesheuvel 
19851da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */
1986