xref: /openbmc/linux/include/linux/efi.h (revision 0100a3e67a9cef64d72cd3a1da86f3ddbee50363)
11da177e4SLinus Torvalds #ifndef _LINUX_EFI_H
21da177e4SLinus Torvalds #define _LINUX_EFI_H
31da177e4SLinus Torvalds 
41da177e4SLinus Torvalds /*
51da177e4SLinus Torvalds  * Extensible Firmware Interface
61da177e4SLinus Torvalds  * Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  * Copyright (C) 1999 VA Linux Systems
91da177e4SLinus Torvalds  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
101da177e4SLinus Torvalds  * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
111da177e4SLinus Torvalds  *	David Mosberger-Tang <davidm@hpl.hp.com>
121da177e4SLinus Torvalds  *	Stephane Eranian <eranian@hpl.hp.com>
131da177e4SLinus Torvalds  */
141da177e4SLinus Torvalds #include <linux/init.h>
151da177e4SLinus Torvalds #include <linux/string.h>
161da177e4SLinus Torvalds #include <linux/time.h>
171da177e4SLinus Torvalds #include <linux/types.h>
181da177e4SLinus Torvalds #include <linux/proc_fs.h>
191da177e4SLinus Torvalds #include <linux/rtc.h>
201da177e4SLinus Torvalds #include <linux/ioport.h>
214a3575fdSHuang, Ying #include <linux/pfn.h>
225ee9c198SMatthew Garrett #include <linux/pstore.h>
2360863c0dSMatt Fleming #include <linux/range.h>
248562c99cSMatt Fleming #include <linux/reboot.h>
25ba7e34b1SAndy Shevchenko #include <linux/uuid.h>
262c23b73cSArd Biesheuvel #include <linux/screen_info.h>
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds #include <asm/page.h>
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds #define EFI_SUCCESS		0
311da177e4SLinus Torvalds #define EFI_LOAD_ERROR          ( 1 | (1UL << (BITS_PER_LONG-1)))
321da177e4SLinus Torvalds #define EFI_INVALID_PARAMETER	( 2 | (1UL << (BITS_PER_LONG-1)))
331da177e4SLinus Torvalds #define EFI_UNSUPPORTED		( 3 | (1UL << (BITS_PER_LONG-1)))
341da177e4SLinus Torvalds #define EFI_BAD_BUFFER_SIZE     ( 4 | (1UL << (BITS_PER_LONG-1)))
351da177e4SLinus Torvalds #define EFI_BUFFER_TOO_SMALL	( 5 | (1UL << (BITS_PER_LONG-1)))
365d9db883SMatthew Garrett #define EFI_NOT_READY		( 6 | (1UL << (BITS_PER_LONG-1)))
375d9db883SMatthew Garrett #define EFI_DEVICE_ERROR	( 7 | (1UL << (BITS_PER_LONG-1)))
385d9db883SMatthew Garrett #define EFI_WRITE_PROTECTED	( 8 | (1UL << (BITS_PER_LONG-1)))
395d9db883SMatthew Garrett #define EFI_OUT_OF_RESOURCES	( 9 | (1UL << (BITS_PER_LONG-1)))
401da177e4SLinus Torvalds #define EFI_NOT_FOUND		(14 | (1UL << (BITS_PER_LONG-1)))
41dce48e35SArd Biesheuvel #define EFI_ABORTED		(21 | (1UL << (BITS_PER_LONG-1)))
425d9db883SMatthew Garrett #define EFI_SECURITY_VIOLATION	(26 | (1UL << (BITS_PER_LONG-1)))
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds typedef unsigned long efi_status_t;
451da177e4SLinus Torvalds typedef u8 efi_bool_t;
461da177e4SLinus Torvalds typedef u16 efi_char16_t;		/* UNICODE character */
47ed37ddffSRoy Franz typedef u64 efi_physical_addr_t;
48ed37ddffSRoy Franz typedef void *efi_handle_t;
491da177e4SLinus Torvalds 
50ba7e34b1SAndy Shevchenko typedef uuid_le efi_guid_t;
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
53ba7e34b1SAndy Shevchenko 	UUID_LE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds /*
561da177e4SLinus Torvalds  * Generic EFI table header
571da177e4SLinus Torvalds  */
581da177e4SLinus Torvalds typedef	struct {
591da177e4SLinus Torvalds 	u64 signature;
601da177e4SLinus Torvalds 	u32 revision;
611da177e4SLinus Torvalds 	u32 headersize;
621da177e4SLinus Torvalds 	u32 crc32;
631da177e4SLinus Torvalds 	u32 reserved;
641da177e4SLinus Torvalds } efi_table_hdr_t;
651da177e4SLinus Torvalds 
661da177e4SLinus Torvalds /*
671da177e4SLinus Torvalds  * Memory map descriptor:
681da177e4SLinus Torvalds  */
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds /* Memory types: */
711da177e4SLinus Torvalds #define EFI_RESERVED_TYPE		 0
721da177e4SLinus Torvalds #define EFI_LOADER_CODE			 1
731da177e4SLinus Torvalds #define EFI_LOADER_DATA			 2
741da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_CODE		 3
751da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_DATA		 4
761da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_CODE	 5
771da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_DATA	 6
781da177e4SLinus Torvalds #define EFI_CONVENTIONAL_MEMORY		 7
791da177e4SLinus Torvalds #define EFI_UNUSABLE_MEMORY		 8
801da177e4SLinus Torvalds #define EFI_ACPI_RECLAIM_MEMORY		 9
811da177e4SLinus Torvalds #define EFI_ACPI_MEMORY_NVS		10
821da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO		11
831da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO_PORT_SPACE	12
841da177e4SLinus Torvalds #define EFI_PAL_CODE			13
85ad5fb870SDan Williams #define EFI_PERSISTENT_MEMORY		14
86ad5fb870SDan Williams #define EFI_MAX_MEMORY_TYPE		15
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds /* Attribute values: */
891da177e4SLinus Torvalds #define EFI_MEMORY_UC		((u64)0x0000000000000001ULL)	/* uncached */
901da177e4SLinus Torvalds #define EFI_MEMORY_WC		((u64)0x0000000000000002ULL)	/* write-coalescing */
911da177e4SLinus Torvalds #define EFI_MEMORY_WT		((u64)0x0000000000000004ULL)	/* write-through */
921da177e4SLinus Torvalds #define EFI_MEMORY_WB		((u64)0x0000000000000008ULL)	/* write-back */
939c97e0bdSLaszlo Ersek #define EFI_MEMORY_UCE		((u64)0x0000000000000010ULL)	/* uncached, exported */
941da177e4SLinus Torvalds #define EFI_MEMORY_WP		((u64)0x0000000000001000ULL)	/* write-protect */
951da177e4SLinus Torvalds #define EFI_MEMORY_RP		((u64)0x0000000000002000ULL)	/* read-protect */
961da177e4SLinus Torvalds #define EFI_MEMORY_XP		((u64)0x0000000000004000ULL)	/* execute-protect */
97c016ca08SRobert Elliott #define EFI_MEMORY_NV		((u64)0x0000000000008000ULL)	/* non-volatile */
98b05b9f5fSTony Luck #define EFI_MEMORY_MORE_RELIABLE \
99b05b9f5fSTony Luck 				((u64)0x0000000000010000ULL)	/* higher reliability */
10087db73aeSArd Biesheuvel #define EFI_MEMORY_RO		((u64)0x0000000000020000ULL)	/* read-only */
1011da177e4SLinus Torvalds #define EFI_MEMORY_RUNTIME	((u64)0x8000000000000000ULL)	/* range requires runtime mapping */
1021da177e4SLinus Torvalds #define EFI_MEMORY_DESCRIPTOR_VERSION	1
1031da177e4SLinus Torvalds 
1041da177e4SLinus Torvalds #define EFI_PAGE_SHIFT		12
105ed37ddffSRoy Franz #define EFI_PAGE_SIZE		(1UL << EFI_PAGE_SHIFT)
106*0100a3e6SPeter Jones #define EFI_PAGES_MAX		(U64_MAX >> EFI_PAGE_SHIFT)
1071da177e4SLinus Torvalds 
1081da177e4SLinus Torvalds typedef struct {
1091da177e4SLinus Torvalds 	u32 type;
1101da177e4SLinus Torvalds 	u32 pad;
1111da177e4SLinus Torvalds 	u64 phys_addr;
1121da177e4SLinus Torvalds 	u64 virt_addr;
1131da177e4SLinus Torvalds 	u64 num_pages;
1141da177e4SLinus Torvalds 	u64 attribute;
1151da177e4SLinus Torvalds } efi_memory_desc_t;
1161da177e4SLinus Torvalds 
1173b370237SMatthew Garrett typedef struct {
1183b370237SMatthew Garrett 	efi_guid_t guid;
1193b370237SMatthew Garrett 	u32 headersize;
1203b370237SMatthew Garrett 	u32 flags;
1213b370237SMatthew Garrett 	u32 imagesize;
1223b370237SMatthew Garrett } efi_capsule_header_t;
1233b370237SMatthew Garrett 
124dadb57abSJeffrey Hugo struct efi_boot_memmap {
125dadb57abSJeffrey Hugo 	efi_memory_desc_t	**map;
126dadb57abSJeffrey Hugo 	unsigned long		*map_size;
127dadb57abSJeffrey Hugo 	unsigned long		*desc_size;
128dadb57abSJeffrey Hugo 	u32			*desc_ver;
129dadb57abSJeffrey Hugo 	unsigned long		*key_ptr;
130dadb57abSJeffrey Hugo 	unsigned long		*buff_size;
131dadb57abSJeffrey Hugo };
132dadb57abSJeffrey Hugo 
133bb05e4baSMatt Fleming /*
134f0133f3cSMatt Fleming  * EFI capsule flags
135f0133f3cSMatt Fleming  */
136f0133f3cSMatt Fleming #define EFI_CAPSULE_PERSIST_ACROSS_RESET	0x00010000
137f0133f3cSMatt Fleming #define EFI_CAPSULE_POPULATE_SYSTEM_TABLE	0x00020000
138f0133f3cSMatt Fleming #define EFI_CAPSULE_INITIATE_RESET		0x00040000
139f0133f3cSMatt Fleming 
140f0133f3cSMatt Fleming /*
141bb05e4baSMatt Fleming  * Allocation types for calls to boottime->allocate_pages.
142bb05e4baSMatt Fleming  */
143bb05e4baSMatt Fleming #define EFI_ALLOCATE_ANY_PAGES		0
144bb05e4baSMatt Fleming #define EFI_ALLOCATE_MAX_ADDRESS	1
145bb05e4baSMatt Fleming #define EFI_ALLOCATE_ADDRESS		2
146bb05e4baSMatt Fleming #define EFI_MAX_ALLOCATE_TYPE		3
147bb05e4baSMatt Fleming 
148e088a4adSMatthew Wilcox typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
1491da177e4SLinus Torvalds 
1501da177e4SLinus Torvalds /*
1511da177e4SLinus Torvalds  * Types and defines for Time Services
1521da177e4SLinus Torvalds  */
1531da177e4SLinus Torvalds #define EFI_TIME_ADJUST_DAYLIGHT 0x1
1541da177e4SLinus Torvalds #define EFI_TIME_IN_DAYLIGHT     0x2
1551da177e4SLinus Torvalds #define EFI_UNSPECIFIED_TIMEZONE 0x07ff
1561da177e4SLinus Torvalds 
1571da177e4SLinus Torvalds typedef struct {
1581da177e4SLinus Torvalds 	u16 year;
1591da177e4SLinus Torvalds 	u8 month;
1601da177e4SLinus Torvalds 	u8 day;
1611da177e4SLinus Torvalds 	u8 hour;
1621da177e4SLinus Torvalds 	u8 minute;
1631da177e4SLinus Torvalds 	u8 second;
1641da177e4SLinus Torvalds 	u8 pad1;
1651da177e4SLinus Torvalds 	u32 nanosecond;
1661da177e4SLinus Torvalds 	s16 timezone;
1671da177e4SLinus Torvalds 	u8 daylight;
1681da177e4SLinus Torvalds 	u8 pad2;
1691da177e4SLinus Torvalds } efi_time_t;
1701da177e4SLinus Torvalds 
1711da177e4SLinus Torvalds typedef struct {
1721da177e4SLinus Torvalds 	u32 resolution;
1731da177e4SLinus Torvalds 	u32 accuracy;
1741da177e4SLinus Torvalds 	u8 sets_to_zero;
1751da177e4SLinus Torvalds } efi_time_cap_t;
1761da177e4SLinus Torvalds 
177677703ceSMatt Fleming typedef struct {
178677703ceSMatt Fleming 	efi_table_hdr_t hdr;
179677703ceSMatt Fleming 	u32 raise_tpl;
180677703ceSMatt Fleming 	u32 restore_tpl;
181677703ceSMatt Fleming 	u32 allocate_pages;
182677703ceSMatt Fleming 	u32 free_pages;
183677703ceSMatt Fleming 	u32 get_memory_map;
184677703ceSMatt Fleming 	u32 allocate_pool;
185677703ceSMatt Fleming 	u32 free_pool;
186677703ceSMatt Fleming 	u32 create_event;
187677703ceSMatt Fleming 	u32 set_timer;
188677703ceSMatt Fleming 	u32 wait_for_event;
189677703ceSMatt Fleming 	u32 signal_event;
190677703ceSMatt Fleming 	u32 close_event;
191677703ceSMatt Fleming 	u32 check_event;
192677703ceSMatt Fleming 	u32 install_protocol_interface;
193677703ceSMatt Fleming 	u32 reinstall_protocol_interface;
194677703ceSMatt Fleming 	u32 uninstall_protocol_interface;
195677703ceSMatt Fleming 	u32 handle_protocol;
196677703ceSMatt Fleming 	u32 __reserved;
197677703ceSMatt Fleming 	u32 register_protocol_notify;
198677703ceSMatt Fleming 	u32 locate_handle;
199677703ceSMatt Fleming 	u32 locate_device_path;
200677703ceSMatt Fleming 	u32 install_configuration_table;
201677703ceSMatt Fleming 	u32 load_image;
202677703ceSMatt Fleming 	u32 start_image;
203677703ceSMatt Fleming 	u32 exit;
204677703ceSMatt Fleming 	u32 unload_image;
205677703ceSMatt Fleming 	u32 exit_boot_services;
206677703ceSMatt Fleming 	u32 get_next_monotonic_count;
207677703ceSMatt Fleming 	u32 stall;
208677703ceSMatt Fleming 	u32 set_watchdog_timer;
209677703ceSMatt Fleming 	u32 connect_controller;
210677703ceSMatt Fleming 	u32 disconnect_controller;
211677703ceSMatt Fleming 	u32 open_protocol;
212677703ceSMatt Fleming 	u32 close_protocol;
213677703ceSMatt Fleming 	u32 open_protocol_information;
214677703ceSMatt Fleming 	u32 protocols_per_handle;
215677703ceSMatt Fleming 	u32 locate_handle_buffer;
216677703ceSMatt Fleming 	u32 locate_protocol;
217677703ceSMatt Fleming 	u32 install_multiple_protocol_interfaces;
218677703ceSMatt Fleming 	u32 uninstall_multiple_protocol_interfaces;
219677703ceSMatt Fleming 	u32 calculate_crc32;
220677703ceSMatt Fleming 	u32 copy_mem;
221677703ceSMatt Fleming 	u32 set_mem;
222677703ceSMatt Fleming 	u32 create_event_ex;
223677703ceSMatt Fleming } __packed efi_boot_services_32_t;
224677703ceSMatt Fleming 
225677703ceSMatt Fleming typedef struct {
226677703ceSMatt Fleming 	efi_table_hdr_t hdr;
227677703ceSMatt Fleming 	u64 raise_tpl;
228677703ceSMatt Fleming 	u64 restore_tpl;
229677703ceSMatt Fleming 	u64 allocate_pages;
230677703ceSMatt Fleming 	u64 free_pages;
231677703ceSMatt Fleming 	u64 get_memory_map;
232677703ceSMatt Fleming 	u64 allocate_pool;
233677703ceSMatt Fleming 	u64 free_pool;
234677703ceSMatt Fleming 	u64 create_event;
235677703ceSMatt Fleming 	u64 set_timer;
236677703ceSMatt Fleming 	u64 wait_for_event;
237677703ceSMatt Fleming 	u64 signal_event;
238677703ceSMatt Fleming 	u64 close_event;
239677703ceSMatt Fleming 	u64 check_event;
240677703ceSMatt Fleming 	u64 install_protocol_interface;
241677703ceSMatt Fleming 	u64 reinstall_protocol_interface;
242677703ceSMatt Fleming 	u64 uninstall_protocol_interface;
243677703ceSMatt Fleming 	u64 handle_protocol;
244677703ceSMatt Fleming 	u64 __reserved;
245677703ceSMatt Fleming 	u64 register_protocol_notify;
246677703ceSMatt Fleming 	u64 locate_handle;
247677703ceSMatt Fleming 	u64 locate_device_path;
248677703ceSMatt Fleming 	u64 install_configuration_table;
249677703ceSMatt Fleming 	u64 load_image;
250677703ceSMatt Fleming 	u64 start_image;
251677703ceSMatt Fleming 	u64 exit;
252677703ceSMatt Fleming 	u64 unload_image;
253677703ceSMatt Fleming 	u64 exit_boot_services;
254677703ceSMatt Fleming 	u64 get_next_monotonic_count;
255677703ceSMatt Fleming 	u64 stall;
256677703ceSMatt Fleming 	u64 set_watchdog_timer;
257677703ceSMatt Fleming 	u64 connect_controller;
258677703ceSMatt Fleming 	u64 disconnect_controller;
259677703ceSMatt Fleming 	u64 open_protocol;
260677703ceSMatt Fleming 	u64 close_protocol;
261677703ceSMatt Fleming 	u64 open_protocol_information;
262677703ceSMatt Fleming 	u64 protocols_per_handle;
263677703ceSMatt Fleming 	u64 locate_handle_buffer;
264677703ceSMatt Fleming 	u64 locate_protocol;
265677703ceSMatt Fleming 	u64 install_multiple_protocol_interfaces;
266677703ceSMatt Fleming 	u64 uninstall_multiple_protocol_interfaces;
267677703ceSMatt Fleming 	u64 calculate_crc32;
268677703ceSMatt Fleming 	u64 copy_mem;
269677703ceSMatt Fleming 	u64 set_mem;
270677703ceSMatt Fleming 	u64 create_event_ex;
271677703ceSMatt Fleming } __packed efi_boot_services_64_t;
272677703ceSMatt Fleming 
2731da177e4SLinus Torvalds /*
274f30ca6baSMatt Fleming  * EFI Boot Services table
275f30ca6baSMatt Fleming  */
276f30ca6baSMatt Fleming typedef struct {
277f30ca6baSMatt Fleming 	efi_table_hdr_t hdr;
278f30ca6baSMatt Fleming 	void *raise_tpl;
279f30ca6baSMatt Fleming 	void *restore_tpl;
280ed37ddffSRoy Franz 	efi_status_t (*allocate_pages)(int, int, unsigned long,
281ed37ddffSRoy Franz 				       efi_physical_addr_t *);
282ed37ddffSRoy Franz 	efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long);
283ed37ddffSRoy Franz 	efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *,
284ed37ddffSRoy Franz 				       unsigned long *, u32 *);
285ed37ddffSRoy Franz 	efi_status_t (*allocate_pool)(int, unsigned long, void **);
286ed37ddffSRoy Franz 	efi_status_t (*free_pool)(void *);
287f30ca6baSMatt Fleming 	void *create_event;
288f30ca6baSMatt Fleming 	void *set_timer;
289f30ca6baSMatt Fleming 	void *wait_for_event;
290f30ca6baSMatt Fleming 	void *signal_event;
291f30ca6baSMatt Fleming 	void *close_event;
292f30ca6baSMatt Fleming 	void *check_event;
293f30ca6baSMatt Fleming 	void *install_protocol_interface;
294f30ca6baSMatt Fleming 	void *reinstall_protocol_interface;
295f30ca6baSMatt Fleming 	void *uninstall_protocol_interface;
296ed37ddffSRoy Franz 	efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **);
297f30ca6baSMatt Fleming 	void *__reserved;
298f30ca6baSMatt Fleming 	void *register_protocol_notify;
299fc372064SArd Biesheuvel 	efi_status_t (*locate_handle)(int, efi_guid_t *, void *,
300fc372064SArd Biesheuvel 				      unsigned long *, efi_handle_t *);
301f30ca6baSMatt Fleming 	void *locate_device_path;
302801820beSArd Biesheuvel 	efi_status_t (*install_configuration_table)(efi_guid_t *, void *);
303f30ca6baSMatt Fleming 	void *load_image;
304f30ca6baSMatt Fleming 	void *start_image;
305f30ca6baSMatt Fleming 	void *exit;
306f30ca6baSMatt Fleming 	void *unload_image;
307ed37ddffSRoy Franz 	efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long);
308f30ca6baSMatt Fleming 	void *get_next_monotonic_count;
309f30ca6baSMatt Fleming 	void *stall;
310f30ca6baSMatt Fleming 	void *set_watchdog_timer;
311f30ca6baSMatt Fleming 	void *connect_controller;
312f30ca6baSMatt Fleming 	void *disconnect_controller;
313f30ca6baSMatt Fleming 	void *open_protocol;
314f30ca6baSMatt Fleming 	void *close_protocol;
315f30ca6baSMatt Fleming 	void *open_protocol_information;
316f30ca6baSMatt Fleming 	void *protocols_per_handle;
317f30ca6baSMatt Fleming 	void *locate_handle_buffer;
318e4fbf476SArd Biesheuvel 	efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **);
319f30ca6baSMatt Fleming 	void *install_multiple_protocol_interfaces;
320f30ca6baSMatt Fleming 	void *uninstall_multiple_protocol_interfaces;
321f30ca6baSMatt Fleming 	void *calculate_crc32;
322f30ca6baSMatt Fleming 	void *copy_mem;
323f30ca6baSMatt Fleming 	void *set_mem;
324f30ca6baSMatt Fleming 	void *create_event_ex;
325f30ca6baSMatt Fleming } efi_boot_services_t;
326f30ca6baSMatt Fleming 
327dd5fc854SMatthew Garrett typedef enum {
328dd5fc854SMatthew Garrett 	EfiPciIoWidthUint8,
329dd5fc854SMatthew Garrett 	EfiPciIoWidthUint16,
330dd5fc854SMatthew Garrett 	EfiPciIoWidthUint32,
331dd5fc854SMatthew Garrett 	EfiPciIoWidthUint64,
332dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint8,
333dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint16,
334dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint32,
335dd5fc854SMatthew Garrett 	EfiPciIoWidthFifoUint64,
336dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint8,
337dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint16,
338dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint32,
339dd5fc854SMatthew Garrett 	EfiPciIoWidthFillUint64,
340dd5fc854SMatthew Garrett 	EfiPciIoWidthMaximum
341dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_WIDTH;
342dd5fc854SMatthew Garrett 
343dd5fc854SMatthew Garrett typedef enum {
344dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationGet,
345dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationSet,
346dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationEnable,
347dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationDisable,
348dd5fc854SMatthew Garrett 	EfiPciIoAttributeOperationSupported,
349dd5fc854SMatthew Garrett     EfiPciIoAttributeOperationMaximum
350dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
351dd5fc854SMatthew Garrett 
352677703ceSMatt Fleming typedef struct {
353677703ceSMatt Fleming 	u32 read;
354677703ceSMatt Fleming 	u32 write;
355677703ceSMatt Fleming } efi_pci_io_protocol_access_32_t;
356677703ceSMatt Fleming 
357677703ceSMatt Fleming typedef struct {
358677703ceSMatt Fleming 	u64 read;
359677703ceSMatt Fleming 	u64 write;
360677703ceSMatt Fleming } efi_pci_io_protocol_access_64_t;
361dd5fc854SMatthew Garrett 
362dd5fc854SMatthew Garrett typedef struct {
363dd5fc854SMatthew Garrett 	void *read;
364dd5fc854SMatthew Garrett 	void *write;
365dd5fc854SMatthew Garrett } efi_pci_io_protocol_access_t;
366dd5fc854SMatthew Garrett 
367dd5fc854SMatthew Garrett typedef struct {
368677703ceSMatt Fleming 	u32 poll_mem;
369677703ceSMatt Fleming 	u32 poll_io;
370677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t mem;
371677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t io;
372677703ceSMatt Fleming 	efi_pci_io_protocol_access_32_t pci;
373677703ceSMatt Fleming 	u32 copy_mem;
374677703ceSMatt Fleming 	u32 map;
375677703ceSMatt Fleming 	u32 unmap;
376677703ceSMatt Fleming 	u32 allocate_buffer;
377677703ceSMatt Fleming 	u32 free_buffer;
378677703ceSMatt Fleming 	u32 flush;
379677703ceSMatt Fleming 	u32 get_location;
380677703ceSMatt Fleming 	u32 attributes;
381677703ceSMatt Fleming 	u32 get_bar_attributes;
382677703ceSMatt Fleming 	u32 set_bar_attributes;
383677703ceSMatt Fleming 	uint64_t romsize;
384677703ceSMatt Fleming 	void *romimage;
385677703ceSMatt Fleming } efi_pci_io_protocol_32;
386677703ceSMatt Fleming 
387677703ceSMatt Fleming typedef struct {
388677703ceSMatt Fleming 	u64 poll_mem;
389677703ceSMatt Fleming 	u64 poll_io;
390677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t mem;
391677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t io;
392677703ceSMatt Fleming 	efi_pci_io_protocol_access_64_t pci;
393677703ceSMatt Fleming 	u64 copy_mem;
394677703ceSMatt Fleming 	u64 map;
395677703ceSMatt Fleming 	u64 unmap;
396677703ceSMatt Fleming 	u64 allocate_buffer;
397677703ceSMatt Fleming 	u64 free_buffer;
398677703ceSMatt Fleming 	u64 flush;
399677703ceSMatt Fleming 	u64 get_location;
400677703ceSMatt Fleming 	u64 attributes;
401677703ceSMatt Fleming 	u64 get_bar_attributes;
402677703ceSMatt Fleming 	u64 set_bar_attributes;
403677703ceSMatt Fleming 	uint64_t romsize;
404677703ceSMatt Fleming 	void *romimage;
405677703ceSMatt Fleming } efi_pci_io_protocol_64;
406677703ceSMatt Fleming 
407677703ceSMatt Fleming typedef struct {
408dd5fc854SMatthew Garrett 	void *poll_mem;
409dd5fc854SMatthew Garrett 	void *poll_io;
410dd5fc854SMatthew Garrett 	efi_pci_io_protocol_access_t mem;
411dd5fc854SMatthew Garrett 	efi_pci_io_protocol_access_t io;
412dd5fc854SMatthew Garrett 	efi_pci_io_protocol_access_t pci;
413dd5fc854SMatthew Garrett 	void *copy_mem;
414dd5fc854SMatthew Garrett 	void *map;
415dd5fc854SMatthew Garrett 	void *unmap;
416dd5fc854SMatthew Garrett 	void *allocate_buffer;
417dd5fc854SMatthew Garrett 	void *free_buffer;
418dd5fc854SMatthew Garrett 	void *flush;
419dd5fc854SMatthew Garrett 	void *get_location;
420dd5fc854SMatthew Garrett 	void *attributes;
421dd5fc854SMatthew Garrett 	void *get_bar_attributes;
422dd5fc854SMatthew Garrett 	void *set_bar_attributes;
423dd5fc854SMatthew Garrett 	uint64_t romsize;
424dd5fc854SMatthew Garrett 	void *romimage;
425dd5fc854SMatthew Garrett } efi_pci_io_protocol;
426dd5fc854SMatthew Garrett 
427dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
428dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
429dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
430dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
431dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
432dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
433dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
434dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
435dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
436dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
437dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
438dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
439dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
440dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
441dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
442dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
443dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
444dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
445dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
446dd5fc854SMatthew Garrett 
44758c5475aSLukas Wunner typedef struct {
44858c5475aSLukas Wunner 	u32 version;
44958c5475aSLukas Wunner 	u32 get;
45058c5475aSLukas Wunner 	u32 set;
45158c5475aSLukas Wunner 	u32 del;
45258c5475aSLukas Wunner 	u32 get_all;
45358c5475aSLukas Wunner } apple_properties_protocol_32_t;
45458c5475aSLukas Wunner 
45558c5475aSLukas Wunner typedef struct {
45658c5475aSLukas Wunner 	u64 version;
45758c5475aSLukas Wunner 	u64 get;
45858c5475aSLukas Wunner 	u64 set;
45958c5475aSLukas Wunner 	u64 del;
46058c5475aSLukas Wunner 	u64 get_all;
46158c5475aSLukas Wunner } apple_properties_protocol_64_t;
46258c5475aSLukas Wunner 
463f30ca6baSMatt Fleming /*
4641da177e4SLinus Torvalds  * Types and defines for EFI ResetSystem
4651da177e4SLinus Torvalds  */
4661da177e4SLinus Torvalds #define EFI_RESET_COLD 0
4671da177e4SLinus Torvalds #define EFI_RESET_WARM 1
4681da177e4SLinus Torvalds #define EFI_RESET_SHUTDOWN 2
4691da177e4SLinus Torvalds 
4701da177e4SLinus Torvalds /*
4711da177e4SLinus Torvalds  * EFI Runtime Services table
4721da177e4SLinus Torvalds  */
4731da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
4741da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_REVISION  0x00010000
4751da177e4SLinus Torvalds 
4761da177e4SLinus Torvalds typedef struct {
4771da177e4SLinus Torvalds 	efi_table_hdr_t hdr;
478677703ceSMatt Fleming 	u32 get_time;
479677703ceSMatt Fleming 	u32 set_time;
480677703ceSMatt Fleming 	u32 get_wakeup_time;
481677703ceSMatt Fleming 	u32 set_wakeup_time;
482677703ceSMatt Fleming 	u32 set_virtual_address_map;
483677703ceSMatt Fleming 	u32 convert_pointer;
484677703ceSMatt Fleming 	u32 get_variable;
485677703ceSMatt Fleming 	u32 get_next_variable;
486677703ceSMatt Fleming 	u32 set_variable;
487677703ceSMatt Fleming 	u32 get_next_high_mono_count;
488677703ceSMatt Fleming 	u32 reset_system;
489677703ceSMatt Fleming 	u32 update_capsule;
490677703ceSMatt Fleming 	u32 query_capsule_caps;
491677703ceSMatt Fleming 	u32 query_variable_info;
492677703ceSMatt Fleming } efi_runtime_services_32_t;
493677703ceSMatt Fleming 
494677703ceSMatt Fleming typedef struct {
495677703ceSMatt Fleming 	efi_table_hdr_t hdr;
496677703ceSMatt Fleming 	u64 get_time;
497677703ceSMatt Fleming 	u64 set_time;
498677703ceSMatt Fleming 	u64 get_wakeup_time;
499677703ceSMatt Fleming 	u64 set_wakeup_time;
500677703ceSMatt Fleming 	u64 set_virtual_address_map;
501677703ceSMatt Fleming 	u64 convert_pointer;
502677703ceSMatt Fleming 	u64 get_variable;
503677703ceSMatt Fleming 	u64 get_next_variable;
504677703ceSMatt Fleming 	u64 set_variable;
505677703ceSMatt Fleming 	u64 get_next_high_mono_count;
506677703ceSMatt Fleming 	u64 reset_system;
507677703ceSMatt Fleming 	u64 update_capsule;
508677703ceSMatt Fleming 	u64 query_capsule_caps;
509677703ceSMatt Fleming 	u64 query_variable_info;
510677703ceSMatt Fleming } efi_runtime_services_64_t;
511677703ceSMatt Fleming 
512677703ceSMatt Fleming typedef struct {
513677703ceSMatt Fleming 	efi_table_hdr_t hdr;
51443ab0476SBorislav Petkov 	void *get_time;
51543ab0476SBorislav Petkov 	void *set_time;
51643ab0476SBorislav Petkov 	void *get_wakeup_time;
51743ab0476SBorislav Petkov 	void *set_wakeup_time;
51843ab0476SBorislav Petkov 	void *set_virtual_address_map;
51943ab0476SBorislav Petkov 	void *convert_pointer;
52043ab0476SBorislav Petkov 	void *get_variable;
52143ab0476SBorislav Petkov 	void *get_next_variable;
52243ab0476SBorislav Petkov 	void *set_variable;
52343ab0476SBorislav Petkov 	void *get_next_high_mono_count;
52443ab0476SBorislav Petkov 	void *reset_system;
52543ab0476SBorislav Petkov 	void *update_capsule;
52643ab0476SBorislav Petkov 	void *query_capsule_caps;
52743ab0476SBorislav Petkov 	void *query_variable_info;
5281da177e4SLinus Torvalds } efi_runtime_services_t;
5291da177e4SLinus Torvalds 
5301da177e4SLinus Torvalds typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
5311da177e4SLinus Torvalds typedef efi_status_t efi_set_time_t (efi_time_t *tm);
5321da177e4SLinus Torvalds typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
5331da177e4SLinus Torvalds 					    efi_time_t *tm);
5341da177e4SLinus Torvalds typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
5351da177e4SLinus Torvalds typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
5361da177e4SLinus Torvalds 					 unsigned long *data_size, void *data);
5371da177e4SLinus Torvalds typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
5381da177e4SLinus Torvalds 					      efi_guid_t *vendor);
5391da177e4SLinus Torvalds typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
540f7a2d73fSMatthew Garrett 					 u32 attr, unsigned long data_size,
5411da177e4SLinus Torvalds 					 void *data);
5421da177e4SLinus Torvalds typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
5431da177e4SLinus Torvalds typedef void efi_reset_system_t (int reset_type, efi_status_t status,
5441da177e4SLinus Torvalds 				 unsigned long data_size, efi_char16_t *data);
5451da177e4SLinus Torvalds typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
5461da177e4SLinus Torvalds 						unsigned long descriptor_size,
5471da177e4SLinus Torvalds 						u32 descriptor_version,
5481da177e4SLinus Torvalds 						efi_memory_desc_t *virtual_map);
5493b370237SMatthew Garrett typedef efi_status_t efi_query_variable_info_t(u32 attr,
5503b370237SMatthew Garrett 					       u64 *storage_space,
5513b370237SMatthew Garrett 					       u64 *remaining_space,
5523b370237SMatthew Garrett 					       u64 *max_variable_size);
5533b370237SMatthew Garrett typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
5543b370237SMatthew Garrett 					  unsigned long count,
5553b370237SMatthew Garrett 					  unsigned long sg_list);
5563b370237SMatthew Garrett typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
5573b370237SMatthew Garrett 					      unsigned long count,
5583b370237SMatthew Garrett 					      u64 *max_size,
5593b370237SMatthew Garrett 					      int *reset_type);
560ca0e30dcSArd Biesheuvel typedef efi_status_t efi_query_variable_store_t(u32 attributes,
561ca0e30dcSArd Biesheuvel 						unsigned long size,
562ca0e30dcSArd Biesheuvel 						bool nonblocking);
5631da177e4SLinus Torvalds 
564022ee6c5SArd Biesheuvel void efi_native_runtime_setup(void);
565022ee6c5SArd Biesheuvel 
5661da177e4SLinus Torvalds /*
5671da177e4SLinus Torvalds  * EFI Configuration Table and GUID definitions
56854fd11feSPeter Jones  *
5697fb2b43cSIngo Molnar  * These are all defined in a single line to make them easier to
5707fb2b43cSIngo Molnar  * grep for and to see them at a glance - while still having a
5717fb2b43cSIngo Molnar  * similar structure to the definitions in the spec.
5727fb2b43cSIngo Molnar  *
5737fb2b43cSIngo Molnar  * Here's how they are structured:
57454fd11feSPeter Jones  *
57554fd11feSPeter Jones  * GUID: 12345678-1234-1234-1234-123456789012
57654fd11feSPeter Jones  * Spec:
57754fd11feSPeter Jones  *      #define EFI_SOME_PROTOCOL_GUID \
57854fd11feSPeter Jones  *        {0x12345678,0x1234,0x1234,\
57954fd11feSPeter Jones  *          {0x12,0x34,0x12,0x34,0x56,0x78,0x90,0x12}}
58054fd11feSPeter Jones  * Here:
5817fb2b43cSIngo Molnar  *	#define SOME_PROTOCOL_GUID		EFI_GUID(0x12345678, 0x1234, 0x1234,  0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12)
5827fb2b43cSIngo Molnar  *					^ tabs					    ^extra space
5837fb2b43cSIngo Molnar  *
5847fb2b43cSIngo Molnar  * Note that the 'extra space' separates the values at the same place
5857fb2b43cSIngo Molnar  * where the UEFI SPEC breaks the line.
5861da177e4SLinus Torvalds  */
5877fb2b43cSIngo Molnar #define NULL_GUID				EFI_GUID(0x00000000, 0x0000, 0x0000,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
5887fb2b43cSIngo Molnar #define MPS_TABLE_GUID				EFI_GUID(0xeb9d2d2f, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5897fb2b43cSIngo Molnar #define ACPI_TABLE_GUID				EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5907fb2b43cSIngo Molnar #define ACPI_20_TABLE_GUID			EFI_GUID(0x8868e871, 0xe4f1, 0x11d3,  0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
5917fb2b43cSIngo Molnar #define SMBIOS_TABLE_GUID			EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5927fb2b43cSIngo Molnar #define SMBIOS3_TABLE_GUID			EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c,  0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94)
5937fb2b43cSIngo Molnar #define SAL_SYSTEM_TABLE_GUID			EFI_GUID(0xeb9d2d32, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
5947fb2b43cSIngo Molnar #define HCDP_TABLE_GUID				EFI_GUID(0xf951938d, 0x620b, 0x42ef,  0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98)
5957fb2b43cSIngo Molnar #define UGA_IO_PROTOCOL_GUID			EFI_GUID(0x61a4d49e, 0x6f68, 0x4f1b,  0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2)
5967fb2b43cSIngo Molnar #define EFI_GLOBAL_VARIABLE_GUID		EFI_GUID(0x8be4df61, 0x93ca, 0x11d2,  0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
5977fb2b43cSIngo Molnar #define UV_SYSTEM_TABLE_GUID			EFI_GUID(0x3b13a7d4, 0x633e, 0x11dd,  0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93)
5987fb2b43cSIngo Molnar #define LINUX_EFI_CRASH_GUID			EFI_GUID(0xcfc8fc79, 0xbe2e, 0x4ddc,  0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0)
5997fb2b43cSIngo Molnar #define LOADED_IMAGE_PROTOCOL_GUID		EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
6007fb2b43cSIngo Molnar #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID	EFI_GUID(0x9042a9de, 0x23dc, 0x4a38,  0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
6017fb2b43cSIngo Molnar #define EFI_UGA_PROTOCOL_GUID			EFI_GUID(0x982c298b, 0xf4fa, 0x41cb,  0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39)
6027fb2b43cSIngo Molnar #define EFI_PCI_IO_PROTOCOL_GUID		EFI_GUID(0x4cf5b200, 0x68b8, 0x4ca5,  0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a)
6037fb2b43cSIngo Molnar #define EFI_FILE_INFO_ID			EFI_GUID(0x09576e92, 0x6d3f, 0x11d2,  0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
6047fb2b43cSIngo Molnar #define EFI_SYSTEM_RESOURCE_TABLE_GUID		EFI_GUID(0xb122a263, 0x3661, 0x4f68,  0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
6057fb2b43cSIngo Molnar #define EFI_FILE_SYSTEM_GUID			EFI_GUID(0x964e5b22, 0x6459, 0x11d2,  0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
6067fb2b43cSIngo Molnar #define DEVICE_TREE_GUID			EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5,  0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
6077fb2b43cSIngo Molnar #define EFI_PROPERTIES_TABLE_GUID		EFI_GUID(0x880aaca3, 0x4adc, 0x4a04,  0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5)
6087fb2b43cSIngo Molnar #define EFI_RNG_PROTOCOL_GUID			EFI_GUID(0x3152bca5, 0xeade, 0x433d,  0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
609568bc4e8SArd Biesheuvel #define EFI_RNG_ALGORITHM_RAW			EFI_GUID(0xe43176d7, 0xb6e8, 0x4827,  0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61)
6107fb2b43cSIngo Molnar #define EFI_MEMORY_ATTRIBUTES_TABLE_GUID	EFI_GUID(0xdcfa911d, 0x26eb, 0x469f,  0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
6117fb2b43cSIngo Molnar #define EFI_CONSOLE_OUT_DEVICE_GUID		EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
61258c5475aSLukas Wunner #define APPLE_PROPERTIES_PROTOCOL_GUID		EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb,  0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
613fc372064SArd Biesheuvel 
614801820beSArd Biesheuvel /*
615801820beSArd Biesheuvel  * This GUID is used to pass to the kernel proper the struct screen_info
616801820beSArd Biesheuvel  * structure that was populated by the stub based on the GOP protocol instance
617801820beSArd Biesheuvel  * associated with ConOut
618801820beSArd Biesheuvel  */
6197fb2b43cSIngo Molnar #define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID	EFI_GUID(0xe03fc20a, 0x85dc, 0x406e,  0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
6207fb2b43cSIngo Molnar #define LINUX_EFI_LOADER_ENTRY_GUID		EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf,  0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
62163625988SArd Biesheuvel #define LINUX_EFI_RANDOM_SEED_TABLE_GUID	EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2,  0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b)
62206f7d4a1SCompostella, Jeremy 
6231da177e4SLinus Torvalds typedef struct {
6241da177e4SLinus Torvalds 	efi_guid_t guid;
6251adbfa35SOlof Johansson 	u64 table;
6261adbfa35SOlof Johansson } efi_config_table_64_t;
6271adbfa35SOlof Johansson 
6281adbfa35SOlof Johansson typedef struct {
6291adbfa35SOlof Johansson 	efi_guid_t guid;
6301adbfa35SOlof Johansson 	u32 table;
6311adbfa35SOlof Johansson } efi_config_table_32_t;
6321adbfa35SOlof Johansson 
6331adbfa35SOlof Johansson typedef struct {
6341adbfa35SOlof Johansson 	efi_guid_t guid;
6351da177e4SLinus Torvalds 	unsigned long table;
6361da177e4SLinus Torvalds } efi_config_table_t;
6371da177e4SLinus Torvalds 
638272686bfSLeif Lindholm typedef struct {
639272686bfSLeif Lindholm 	efi_guid_t guid;
640272686bfSLeif Lindholm 	const char *name;
641272686bfSLeif Lindholm 	unsigned long *ptr;
642272686bfSLeif Lindholm } efi_config_table_type_t;
643272686bfSLeif Lindholm 
6441da177e4SLinus Torvalds #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
6451da177e4SLinus Torvalds 
6463b370237SMatthew Garrett #define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
6473b370237SMatthew Garrett #define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
6483b370237SMatthew Garrett #define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
6493b370237SMatthew Garrett #define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
6503b370237SMatthew Garrett #define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
6513b370237SMatthew Garrett #define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
6523b370237SMatthew Garrett 
6531da177e4SLinus Torvalds typedef struct {
6541da177e4SLinus Torvalds 	efi_table_hdr_t hdr;
6551adbfa35SOlof Johansson 	u64 fw_vendor;	/* physical addr of CHAR16 vendor string */
6561adbfa35SOlof Johansson 	u32 fw_revision;
6571adbfa35SOlof Johansson 	u32 __pad1;
6581adbfa35SOlof Johansson 	u64 con_in_handle;
6591adbfa35SOlof Johansson 	u64 con_in;
6601adbfa35SOlof Johansson 	u64 con_out_handle;
6611adbfa35SOlof Johansson 	u64 con_out;
6621adbfa35SOlof Johansson 	u64 stderr_handle;
6631adbfa35SOlof Johansson 	u64 stderr;
6641adbfa35SOlof Johansson 	u64 runtime;
6651adbfa35SOlof Johansson 	u64 boottime;
6661adbfa35SOlof Johansson 	u32 nr_tables;
6671adbfa35SOlof Johansson 	u32 __pad2;
6681adbfa35SOlof Johansson 	u64 tables;
6691adbfa35SOlof Johansson } efi_system_table_64_t;
6701adbfa35SOlof Johansson 
6711adbfa35SOlof Johansson typedef struct {
6721adbfa35SOlof Johansson 	efi_table_hdr_t hdr;
6731adbfa35SOlof Johansson 	u32 fw_vendor;	/* physical addr of CHAR16 vendor string */
6741adbfa35SOlof Johansson 	u32 fw_revision;
6751adbfa35SOlof Johansson 	u32 con_in_handle;
6761adbfa35SOlof Johansson 	u32 con_in;
6771adbfa35SOlof Johansson 	u32 con_out_handle;
6781adbfa35SOlof Johansson 	u32 con_out;
6791adbfa35SOlof Johansson 	u32 stderr_handle;
6801adbfa35SOlof Johansson 	u32 stderr;
6811adbfa35SOlof Johansson 	u32 runtime;
6821adbfa35SOlof Johansson 	u32 boottime;
6831adbfa35SOlof Johansson 	u32 nr_tables;
6841adbfa35SOlof Johansson 	u32 tables;
6851adbfa35SOlof Johansson } efi_system_table_32_t;
6861adbfa35SOlof Johansson 
6871adbfa35SOlof Johansson typedef struct {
6881adbfa35SOlof Johansson 	efi_table_hdr_t hdr;
6891da177e4SLinus Torvalds 	unsigned long fw_vendor;	/* physical addr of CHAR16 vendor string */
6901da177e4SLinus Torvalds 	u32 fw_revision;
6911da177e4SLinus Torvalds 	unsigned long con_in_handle;
6921da177e4SLinus Torvalds 	unsigned long con_in;
6931da177e4SLinus Torvalds 	unsigned long con_out_handle;
6941da177e4SLinus Torvalds 	unsigned long con_out;
6951da177e4SLinus Torvalds 	unsigned long stderr_handle;
6961da177e4SLinus Torvalds 	unsigned long stderr;
6971da177e4SLinus Torvalds 	efi_runtime_services_t *runtime;
698f30ca6baSMatt Fleming 	efi_boot_services_t *boottime;
6991da177e4SLinus Torvalds 	unsigned long nr_tables;
7001da177e4SLinus Torvalds 	unsigned long tables;
7011da177e4SLinus Torvalds } efi_system_table_t;
7021da177e4SLinus Torvalds 
7039479c7ceSMatt Fleming /*
7049479c7ceSMatt Fleming  * Architecture independent structure for describing a memory map for the
7059479c7ceSMatt Fleming  * benefit of efi_memmap_init_early(), saving us the need to pass four
7069479c7ceSMatt Fleming  * parameters.
7079479c7ceSMatt Fleming  */
7089479c7ceSMatt Fleming struct efi_memory_map_data {
7099479c7ceSMatt Fleming 	phys_addr_t phys_map;
7109479c7ceSMatt Fleming 	unsigned long size;
7119479c7ceSMatt Fleming 	unsigned long desc_version;
7129479c7ceSMatt Fleming 	unsigned long desc_size;
7139479c7ceSMatt Fleming };
7149479c7ceSMatt Fleming 
7151da177e4SLinus Torvalds struct efi_memory_map {
71644511fb9SArd Biesheuvel 	phys_addr_t phys_map;
7177ae65fd3SMatt Tolentino 	void *map;
7187ae65fd3SMatt Tolentino 	void *map_end;
7191da177e4SLinus Torvalds 	int nr_map;
7201da177e4SLinus Torvalds 	unsigned long desc_version;
7217ae65fd3SMatt Tolentino 	unsigned long desc_size;
722dca0f971SMatt Fleming 	bool late;
7231da177e4SLinus Torvalds };
7241da177e4SLinus Torvalds 
72560863c0dSMatt Fleming struct efi_mem_range {
72660863c0dSMatt Fleming 	struct range range;
72760863c0dSMatt Fleming 	u64 attribute;
7281da177e4SLinus Torvalds };
7291da177e4SLinus Torvalds 
7300302f71cSMark Salter struct efi_fdt_params {
7310302f71cSMark Salter 	u64 system_table;
7320302f71cSMark Salter 	u64 mmap;
7330302f71cSMark Salter 	u32 mmap_size;
7340302f71cSMark Salter 	u32 desc_size;
7350302f71cSMark Salter 	u32 desc_ver;
7360302f71cSMark Salter };
7370302f71cSMark Salter 
7388e84f345SMatt Fleming typedef struct {
7398e84f345SMatt Fleming 	u32 revision;
740677703ceSMatt Fleming 	u32 parent_handle;
741677703ceSMatt Fleming 	u32 system_table;
742677703ceSMatt Fleming 	u32 device_handle;
743677703ceSMatt Fleming 	u32 file_path;
744677703ceSMatt Fleming 	u32 reserved;
745677703ceSMatt Fleming 	u32 load_options_size;
746677703ceSMatt Fleming 	u32 load_options;
747677703ceSMatt Fleming 	u32 image_base;
748677703ceSMatt Fleming 	__aligned_u64 image_size;
749677703ceSMatt Fleming 	unsigned int image_code_type;
750677703ceSMatt Fleming 	unsigned int image_data_type;
751677703ceSMatt Fleming 	unsigned long unload;
752677703ceSMatt Fleming } efi_loaded_image_32_t;
753677703ceSMatt Fleming 
754677703ceSMatt Fleming typedef struct {
755677703ceSMatt Fleming 	u32 revision;
756677703ceSMatt Fleming 	u64 parent_handle;
757677703ceSMatt Fleming 	u64 system_table;
758677703ceSMatt Fleming 	u64 device_handle;
759677703ceSMatt Fleming 	u64 file_path;
760677703ceSMatt Fleming 	u64 reserved;
761677703ceSMatt Fleming 	u32 load_options_size;
762677703ceSMatt Fleming 	u64 load_options;
763677703ceSMatt Fleming 	u64 image_base;
764677703ceSMatt Fleming 	__aligned_u64 image_size;
765677703ceSMatt Fleming 	unsigned int image_code_type;
766677703ceSMatt Fleming 	unsigned int image_data_type;
767677703ceSMatt Fleming 	unsigned long unload;
768677703ceSMatt Fleming } efi_loaded_image_64_t;
769677703ceSMatt Fleming 
770677703ceSMatt Fleming typedef struct {
771677703ceSMatt Fleming 	u32 revision;
7728e84f345SMatt Fleming 	void *parent_handle;
7738e84f345SMatt Fleming 	efi_system_table_t *system_table;
7748e84f345SMatt Fleming 	void *device_handle;
7758e84f345SMatt Fleming 	void *file_path;
7768e84f345SMatt Fleming 	void *reserved;
7778e84f345SMatt Fleming 	u32 load_options_size;
7788e84f345SMatt Fleming 	void *load_options;
7798e84f345SMatt Fleming 	void *image_base;
7808e84f345SMatt Fleming 	__aligned_u64 image_size;
7818e84f345SMatt Fleming 	unsigned int image_code_type;
7828e84f345SMatt Fleming 	unsigned int image_data_type;
7838e84f345SMatt Fleming 	unsigned long unload;
7848e84f345SMatt Fleming } efi_loaded_image_t;
7858e84f345SMatt Fleming 
78655839d51SMatt Fleming 
78755839d51SMatt Fleming typedef struct {
78855839d51SMatt Fleming 	u64 size;
78955839d51SMatt Fleming 	u64 file_size;
79055839d51SMatt Fleming 	u64 phys_size;
79155839d51SMatt Fleming 	efi_time_t create_time;
79255839d51SMatt Fleming 	efi_time_t last_access_time;
79355839d51SMatt Fleming 	efi_time_t modification_time;
79455839d51SMatt Fleming 	__aligned_u64 attribute;
79555839d51SMatt Fleming 	efi_char16_t filename[1];
79655839d51SMatt Fleming } efi_file_info_t;
79755839d51SMatt Fleming 
798677703ceSMatt Fleming typedef struct {
799677703ceSMatt Fleming 	u64 revision;
800677703ceSMatt Fleming 	u32 open;
801677703ceSMatt Fleming 	u32 close;
802677703ceSMatt Fleming 	u32 delete;
803677703ceSMatt Fleming 	u32 read;
804677703ceSMatt Fleming 	u32 write;
805677703ceSMatt Fleming 	u32 get_position;
806677703ceSMatt Fleming 	u32 set_position;
807677703ceSMatt Fleming 	u32 get_info;
808677703ceSMatt Fleming 	u32 set_info;
809677703ceSMatt Fleming 	u32 flush;
810677703ceSMatt Fleming } efi_file_handle_32_t;
811677703ceSMatt Fleming 
812677703ceSMatt Fleming typedef struct {
813677703ceSMatt Fleming 	u64 revision;
814677703ceSMatt Fleming 	u64 open;
815677703ceSMatt Fleming 	u64 close;
816677703ceSMatt Fleming 	u64 delete;
817677703ceSMatt Fleming 	u64 read;
818677703ceSMatt Fleming 	u64 write;
819677703ceSMatt Fleming 	u64 get_position;
820677703ceSMatt Fleming 	u64 set_position;
821677703ceSMatt Fleming 	u64 get_info;
822677703ceSMatt Fleming 	u64 set_info;
823677703ceSMatt Fleming 	u64 flush;
824677703ceSMatt Fleming } efi_file_handle_64_t;
825677703ceSMatt Fleming 
826ed37ddffSRoy Franz typedef struct _efi_file_handle {
82755839d51SMatt Fleming 	u64 revision;
828ed37ddffSRoy Franz 	efi_status_t (*open)(struct _efi_file_handle *,
829ed37ddffSRoy Franz 			     struct _efi_file_handle **,
830ed37ddffSRoy Franz 			     efi_char16_t *, u64, u64);
831ed37ddffSRoy Franz 	efi_status_t (*close)(struct _efi_file_handle *);
83255839d51SMatt Fleming 	void *delete;
833ed37ddffSRoy Franz 	efi_status_t (*read)(struct _efi_file_handle *, unsigned long *,
834ed37ddffSRoy Franz 			     void *);
83555839d51SMatt Fleming 	void *write;
83655839d51SMatt Fleming 	void *get_position;
83755839d51SMatt Fleming 	void *set_position;
838ed37ddffSRoy Franz 	efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *,
839ed37ddffSRoy Franz 			unsigned long *, void *);
84055839d51SMatt Fleming 	void *set_info;
84155839d51SMatt Fleming 	void *flush;
84255839d51SMatt Fleming } efi_file_handle_t;
84355839d51SMatt Fleming 
844ed37ddffSRoy Franz typedef struct _efi_file_io_interface {
845ed37ddffSRoy Franz 	u64 revision;
846ed37ddffSRoy Franz 	int (*open_volume)(struct _efi_file_io_interface *,
847ed37ddffSRoy Franz 			   efi_file_handle_t **);
848ed37ddffSRoy Franz } efi_file_io_interface_t;
849ed37ddffSRoy Franz 
85055839d51SMatt Fleming #define EFI_FILE_MODE_READ	0x0000000000000001
85155839d51SMatt Fleming #define EFI_FILE_MODE_WRITE	0x0000000000000002
85255839d51SMatt Fleming #define EFI_FILE_MODE_CREATE	0x8000000000000000
85355839d51SMatt Fleming 
854bf924863SArd Biesheuvel typedef struct {
855bf924863SArd Biesheuvel 	u32 version;
856bf924863SArd Biesheuvel 	u32 length;
857bf924863SArd Biesheuvel 	u64 memory_protection_attribute;
858bf924863SArd Biesheuvel } efi_properties_table_t;
859bf924863SArd Biesheuvel 
860bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_VERSION	0x00010000
861bf924863SArd Biesheuvel #define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA	0x1
862bf924863SArd Biesheuvel 
863b2c99e3cSBjorn Helgaas #define EFI_INVALID_TABLE_ADDR		(~0UL)
864b2c99e3cSBjorn Helgaas 
865a604af07SArd Biesheuvel typedef struct {
866a604af07SArd Biesheuvel 	u32 version;
867a604af07SArd Biesheuvel 	u32 num_entries;
868a604af07SArd Biesheuvel 	u32 desc_size;
869a604af07SArd Biesheuvel 	u32 reserved;
870a604af07SArd Biesheuvel 	efi_memory_desc_t entry[0];
871a604af07SArd Biesheuvel } efi_memory_attributes_table_t;
872a604af07SArd Biesheuvel 
8731da177e4SLinus Torvalds /*
8741da177e4SLinus Torvalds  * All runtime access to EFI goes through this structure:
8751da177e4SLinus Torvalds  */
8761da177e4SLinus Torvalds extern struct efi {
8771da177e4SLinus Torvalds 	efi_system_table_t *systab;	/* EFI system table */
8783b370237SMatthew Garrett 	unsigned int runtime_version;	/* Runtime services version */
879b2c99e3cSBjorn Helgaas 	unsigned long mps;		/* MPS table */
880b2c99e3cSBjorn Helgaas 	unsigned long acpi;		/* ACPI table  (IA64 ext 0.71) */
881b2c99e3cSBjorn Helgaas 	unsigned long acpi20;		/* ACPI table  (ACPI 2.0) */
882e1ccbbc9SArd Biesheuvel 	unsigned long smbios;		/* SMBIOS table (32 bit entry point) */
883e1ccbbc9SArd Biesheuvel 	unsigned long smbios3;		/* SMBIOS table (64 bit entry point) */
884b2c99e3cSBjorn Helgaas 	unsigned long sal_systab;	/* SAL system table */
885b2c99e3cSBjorn Helgaas 	unsigned long boot_info;	/* boot info table */
886b2c99e3cSBjorn Helgaas 	unsigned long hcdp;		/* HCDP table */
887b2c99e3cSBjorn Helgaas 	unsigned long uga;		/* UGA table */
888a50f70b1SRuss Anderson 	unsigned long uv_systab;	/* UV system table */
889a0998eb1SDave Young 	unsigned long fw_vendor;	/* fw_vendor */
890a0998eb1SDave Young 	unsigned long runtime;		/* runtime table */
891a0998eb1SDave Young 	unsigned long config_table;	/* config tables */
8920bb54905SPeter Jones 	unsigned long esrt;		/* ESRT table */
893bf924863SArd Biesheuvel 	unsigned long properties_table;	/* properties table */
894a604af07SArd Biesheuvel 	unsigned long mem_attr_table;	/* memory attributes table */
89563625988SArd Biesheuvel 	unsigned long rng_seed;		/* UEFI firmware random seed */
8961da177e4SLinus Torvalds 	efi_get_time_t *get_time;
8971da177e4SLinus Torvalds 	efi_set_time_t *set_time;
8981da177e4SLinus Torvalds 	efi_get_wakeup_time_t *get_wakeup_time;
8991da177e4SLinus Torvalds 	efi_set_wakeup_time_t *set_wakeup_time;
9001da177e4SLinus Torvalds 	efi_get_variable_t *get_variable;
9011da177e4SLinus Torvalds 	efi_get_next_variable_t *get_next_variable;
9021da177e4SLinus Torvalds 	efi_set_variable_t *set_variable;
90370d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
9043b370237SMatthew Garrett 	efi_query_variable_info_t *query_variable_info;
905d3cac1f8SArd Biesheuvel 	efi_query_variable_info_t *query_variable_info_nonblocking;
9063b370237SMatthew Garrett 	efi_update_capsule_t *update_capsule;
9073b370237SMatthew Garrett 	efi_query_capsule_caps_t *query_capsule_caps;
9081da177e4SLinus Torvalds 	efi_get_next_high_mono_count_t *get_next_high_mono_count;
9091da177e4SLinus Torvalds 	efi_reset_system_t *reset_system;
9101da177e4SLinus Torvalds 	efi_set_virtual_address_map_t *set_virtual_address_map;
911884f4f66SMatt Fleming 	struct efi_memory_map memmap;
9123e909599SMatt Fleming 	unsigned long flags;
9131da177e4SLinus Torvalds } efi;
9141da177e4SLinus Torvalds 
9151da177e4SLinus Torvalds static inline int
9161da177e4SLinus Torvalds efi_guidcmp (efi_guid_t left, efi_guid_t right)
9171da177e4SLinus Torvalds {
9181da177e4SLinus Torvalds 	return memcmp(&left, &right, sizeof (efi_guid_t));
9191da177e4SLinus Torvalds }
9201da177e4SLinus Torvalds 
9211da177e4SLinus Torvalds static inline char *
92226e02272SBorislav Petkov efi_guid_to_str(efi_guid_t *guid, char *out)
9231da177e4SLinus Torvalds {
924925ede0bSJoe Perches 	sprintf(out, "%pUl", guid->b);
9251da177e4SLinus Torvalds         return out;
9261da177e4SLinus Torvalds }
9271da177e4SLinus Torvalds 
9281da177e4SLinus Torvalds extern void efi_init (void);
9291da177e4SLinus Torvalds extern void *efi_get_pal_addr (void);
9301da177e4SLinus Torvalds extern void efi_map_pal_code (void);
9311da177e4SLinus Torvalds extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
93270f4f935SArnd Bergmann extern void efi_gettimeofday (struct timespec64 *ts);
9331da177e4SLinus Torvalds extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
93478510792SJosh Triplett #ifdef CONFIG_X86
9352223af38SJosh Triplett extern void efi_late_init(void);
93678510792SJosh Triplett extern void efi_free_boot_services(void);
937ca0e30dcSArd Biesheuvel extern efi_status_t efi_query_variable_store(u32 attributes,
938ca0e30dcSArd Biesheuvel 					     unsigned long size,
939ca0e30dcSArd Biesheuvel 					     bool nonblocking);
940b05b9f5fSTony Luck extern void efi_find_mirror(void);
94178510792SJosh Triplett #else
9422223af38SJosh Triplett static inline void efi_late_init(void) {}
94378510792SJosh Triplett static inline void efi_free_boot_services(void) {}
944a6e4d5a0SMatt Fleming 
945ca0e30dcSArd Biesheuvel static inline efi_status_t efi_query_variable_store(u32 attributes,
946ca0e30dcSArd Biesheuvel 						    unsigned long size,
947ca0e30dcSArd Biesheuvel 						    bool nonblocking)
948a6e4d5a0SMatt Fleming {
949a6e4d5a0SMatt Fleming 	return EFI_SUCCESS;
950a6e4d5a0SMatt Fleming }
95178510792SJosh Triplett #endif
9527bc90e01SJosh Triplett extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
9539479c7ceSMatt Fleming 
95420b1e22dSNicolai Stange extern phys_addr_t __init efi_memmap_alloc(unsigned int num_entries);
9559479c7ceSMatt Fleming extern int __init efi_memmap_init_early(struct efi_memory_map_data *data);
956dca0f971SMatt Fleming extern int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size);
9579479c7ceSMatt Fleming extern void __init efi_memmap_unmap(void);
958c45f4da3SMatt Fleming extern int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map);
95960863c0dSMatt Fleming extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
96060863c0dSMatt Fleming 					 struct range *range);
96160863c0dSMatt Fleming extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
96260863c0dSMatt Fleming 				     void *buf, struct efi_mem_range *mem);
9639479c7ceSMatt Fleming 
964272686bfSLeif Lindholm extern int efi_config_init(efi_config_table_type_t *arch_tables);
9653846c158SPeter Jones #ifdef CONFIG_EFI_ESRT
9660bb54905SPeter Jones extern void __init efi_esrt_init(void);
9673846c158SPeter Jones #else
9683846c158SPeter Jones static inline void efi_esrt_init(void) { }
9693846c158SPeter Jones #endif
9707bb68410SArd Biesheuvel extern int efi_config_parse_tables(void *config_tables, int count, int sz,
9717bb68410SArd Biesheuvel 				   efi_config_table_type_t *arch_tables);
9721da177e4SLinus Torvalds extern u64 efi_get_iobase (void);
9731da177e4SLinus Torvalds extern u32 efi_mem_type (unsigned long phys_addr);
9741da177e4SLinus Torvalds extern u64 efi_mem_attributes (unsigned long phys_addr);
97532e62c63SBjorn Helgaas extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
9761da177e4SLinus Torvalds extern int __init efi_uart_console_only (void);
9770bb54905SPeter Jones extern u64 efi_mem_desc_end(efi_memory_desc_t *md);
9780bb54905SPeter Jones extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
979816e7612SMatt Fleming extern void efi_mem_reserve(phys_addr_t addr, u64 size);
9801da177e4SLinus Torvalds extern void efi_initialize_iomem_resources(struct resource *code_resource,
98100bf4098SBernhard Walle 		struct resource *data_resource, struct resource *bss_resource);
982916f676fSMatthew Garrett extern void efi_reserve_boot_services(void);
9837968c0e3SLeif Lindholm extern int efi_get_fdt_params(struct efi_fdt_params *params);
9840bb54905SPeter Jones extern struct kobject *efi_kobj;
9851da177e4SLinus Torvalds 
98644be28e9SMatt Fleming extern int efi_reboot_quirk_mode;
9870c5ed61aSMatt Fleming extern bool efi_poweroff_required(void);
9880c5ed61aSMatt Fleming 
9890f96a99dSTaku Izumi #ifdef CONFIG_EFI_FAKE_MEMMAP
9900f96a99dSTaku Izumi extern void __init efi_fake_memmap(void);
9910f96a99dSTaku Izumi #else
9920f96a99dSTaku Izumi static inline void efi_fake_memmap(void) { }
9930f96a99dSTaku Izumi #endif
9940f96a99dSTaku Izumi 
99510f0d2f5SArd Biesheuvel /*
99610f0d2f5SArd Biesheuvel  * efi_memattr_perm_setter - arch specific callback function passed into
99710f0d2f5SArd Biesheuvel  *                           efi_memattr_apply_permissions() that updates the
99810f0d2f5SArd Biesheuvel  *                           mapping permissions described by the second
99910f0d2f5SArd Biesheuvel  *                           argument in the page tables referred to by the
100010f0d2f5SArd Biesheuvel  *                           first argument.
100110f0d2f5SArd Biesheuvel  */
100210f0d2f5SArd Biesheuvel typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *);
100310f0d2f5SArd Biesheuvel 
100410f0d2f5SArd Biesheuvel extern int efi_memattr_init(void);
100510f0d2f5SArd Biesheuvel extern int efi_memattr_apply_permissions(struct mm_struct *mm,
100610f0d2f5SArd Biesheuvel 					 efi_memattr_perm_setter fn);
100710f0d2f5SArd Biesheuvel 
1008e885cd80SMark Salter /* Iterate through an efi_memory_map */
100978ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md)				   \
1010e885cd80SMark Salter 	for ((md) = (m)->map;						   \
1011d4c4fed0SJan Beulich 	     (md) && ((void *)(md) + (m)->desc_size) <= (m)->map_end;	   \
1012e885cd80SMark Salter 	     (md) = (void *)(md) + (m)->desc_size)
1013e885cd80SMark Salter 
101478ce248fSMatt Fleming /**
101578ce248fSMatt Fleming  * for_each_efi_memory_desc - iterate over descriptors in efi.memmap
101678ce248fSMatt Fleming  * @md: the efi_memory_desc_t * iterator
101778ce248fSMatt Fleming  *
101878ce248fSMatt Fleming  * Once the loop finishes @md must not be accessed.
101978ce248fSMatt Fleming  */
102078ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \
1021884f4f66SMatt Fleming 	for_each_efi_memory_desc_in_map(&efi.memmap, md)
102278ce248fSMatt Fleming 
102398d2a6caSLaszlo Ersek /*
102498d2a6caSLaszlo Ersek  * Format an EFI memory descriptor's type and attributes to a user-provided
102598d2a6caSLaszlo Ersek  * character buffer, as per snprintf(), and return the buffer.
102698d2a6caSLaszlo Ersek  */
102798d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size,
102898d2a6caSLaszlo Ersek 				     const efi_memory_desc_t *md);
102998d2a6caSLaszlo Ersek 
10301da177e4SLinus Torvalds /**
10311da177e4SLinus Torvalds  * efi_range_is_wc - check the WC bit on an address range
10321da177e4SLinus Torvalds  * @start: starting kvirt address
10331da177e4SLinus Torvalds  * @len: length of range
10341da177e4SLinus Torvalds  *
10351da177e4SLinus Torvalds  * Consult the EFI memory map and make sure it's ok to set this range WC.
10361da177e4SLinus Torvalds  * Returns true or false.
10371da177e4SLinus Torvalds  */
10381da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len)
10391da177e4SLinus Torvalds {
1040986a80d5SJesper Juhl 	unsigned long i;
10411da177e4SLinus Torvalds 
10421da177e4SLinus Torvalds 	for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) {
10431da177e4SLinus Torvalds 		unsigned long paddr = __pa(start + i);
10441da177e4SLinus Torvalds 		if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC))
10451da177e4SLinus Torvalds 			return 0;
10461da177e4SLinus Torvalds 	}
10471da177e4SLinus Torvalds 	/* The range checked out */
10481da177e4SLinus Torvalds 	return 1;
10491da177e4SLinus Torvalds }
10501da177e4SLinus Torvalds 
10511da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP
10521da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *);
10531da177e4SLinus Torvalds #endif
10541da177e4SLinus Torvalds 
10551da177e4SLinus Torvalds /*
105683e68189SMatt Fleming  * We play games with efi_enabled so that the compiler will, if
105783e68189SMatt Fleming  * possible, remove EFI-related code altogether.
10581da177e4SLinus Torvalds  */
105983e68189SMatt Fleming #define EFI_BOOT		0	/* Were we booted from EFI? */
106083e68189SMatt Fleming #define EFI_CONFIG_TABLES	2	/* Can we use EFI config tables? */
106183e68189SMatt Fleming #define EFI_RUNTIME_SERVICES	3	/* Can we use runtime services? */
106283e68189SMatt Fleming #define EFI_MEMMAP		4	/* Can we use EFI memory map? */
106383e68189SMatt Fleming #define EFI_64BIT		5	/* Is the firmware 64-bit? */
10649f27bc54SDaniel Kiper #define EFI_PARAVIRT		6	/* Access is via a paravirt interface */
10659f27bc54SDaniel Kiper #define EFI_ARCH_1		7	/* First arch-specific bit */
1066fed6cefeSBorislav Petkov #define EFI_DBG			8	/* Print additional debug info at runtime */
1067a1041713SArd Biesheuvel #define EFI_NX_PE_DATA		9	/* Can runtime data regions be mapped non-executable? */
106883e68189SMatt Fleming 
10691da177e4SLinus Torvalds #ifdef CONFIG_EFI
10703e909599SMatt Fleming /*
10713e909599SMatt Fleming  * Test whether the above EFI_* bits are enabled.
10723e909599SMatt Fleming  */
10733e909599SMatt Fleming static inline bool efi_enabled(int feature)
107483e68189SMatt Fleming {
10753e909599SMatt Fleming 	return test_bit(feature, &efi.flags) != 0;
10763e909599SMatt Fleming }
10778562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
10783e909599SMatt Fleming #else
10793e909599SMatt Fleming static inline bool efi_enabled(int feature)
10803e909599SMatt Fleming {
10813e909599SMatt Fleming 	return false;
108283e68189SMatt Fleming }
10838562c99cSMatt Fleming static inline void
10848562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
108587615a34SMatt Fleming 
108687615a34SMatt Fleming static inline bool
108787615a34SMatt Fleming efi_capsule_pending(int *reset_type)
108887615a34SMatt Fleming {
108987615a34SMatt Fleming 	return false;
109087615a34SMatt Fleming }
10911da177e4SLinus Torvalds #endif
10921da177e4SLinus Torvalds 
1093806b0351SMatt Fleming extern int efi_status_to_err(efi_status_t status);
1094806b0351SMatt Fleming 
10951da177e4SLinus Torvalds /*
10961da177e4SLinus Torvalds  * Variable Attributes
10971da177e4SLinus Torvalds  */
10981da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
10991da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
11001da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
110141b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
110241b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
110341b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
110441b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE	0x0000000000000040
11051da177e4SLinus Torvalds 
110641b3254cSMatthew Garrett #define EFI_VARIABLE_MASK 	(EFI_VARIABLE_NON_VOLATILE | \
110741b3254cSMatthew Garrett 				EFI_VARIABLE_BOOTSERVICE_ACCESS | \
110841b3254cSMatthew Garrett 				EFI_VARIABLE_RUNTIME_ACCESS | \
110941b3254cSMatthew Garrett 				EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
111041b3254cSMatthew Garrett 				EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
111141b3254cSMatthew Garrett 				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
111241b3254cSMatthew Garrett 				EFI_VARIABLE_APPEND_WRITE)
11131da177e4SLinus Torvalds /*
1114e14ab23dSMatt Fleming  * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
1115e14ab23dSMatt Fleming  * not including trailing NUL
1116e14ab23dSMatt Fleming  */
1117ba7e34b1SAndy Shevchenko #define EFI_VARIABLE_GUID_LEN	UUID_STRING_LEN
1118e14ab23dSMatt Fleming 
1119e14ab23dSMatt Fleming /*
1120e2527a7cSMatt Fleming  * The type of search to perform when calling boottime->locate_handle
1121e2527a7cSMatt Fleming  */
1122e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES			0
1123e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1124e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL			2
1125e2527a7cSMatt Fleming 
1126e2527a7cSMatt Fleming /*
11271da177e4SLinus Torvalds  * EFI Device Path information
11281da177e4SLinus Torvalds  */
11291da177e4SLinus Torvalds #define EFI_DEV_HW			0x01
11301da177e4SLinus Torvalds #define  EFI_DEV_PCI				 1
11311da177e4SLinus Torvalds #define  EFI_DEV_PCCARD				 2
11321da177e4SLinus Torvalds #define  EFI_DEV_MEM_MAPPED			 3
11331da177e4SLinus Torvalds #define  EFI_DEV_VENDOR				 4
11341da177e4SLinus Torvalds #define  EFI_DEV_CONTROLLER			 5
11351da177e4SLinus Torvalds #define EFI_DEV_ACPI			0x02
11361da177e4SLinus Torvalds #define   EFI_DEV_BASIC_ACPI			 1
11371da177e4SLinus Torvalds #define   EFI_DEV_EXPANDED_ACPI			 2
11381da177e4SLinus Torvalds #define EFI_DEV_MSG			0x03
11391da177e4SLinus Torvalds #define   EFI_DEV_MSG_ATAPI			 1
11401da177e4SLinus Torvalds #define   EFI_DEV_MSG_SCSI			 2
11411da177e4SLinus Torvalds #define   EFI_DEV_MSG_FC			 3
11421da177e4SLinus Torvalds #define   EFI_DEV_MSG_1394			 4
11431da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB			 5
11441da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB_CLASS			15
11451da177e4SLinus Torvalds #define   EFI_DEV_MSG_I20			 6
11461da177e4SLinus Torvalds #define   EFI_DEV_MSG_MAC			11
11471da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV4			12
11481da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV6			13
11491da177e4SLinus Torvalds #define   EFI_DEV_MSG_INFINIBAND		 9
11501da177e4SLinus Torvalds #define   EFI_DEV_MSG_UART			14
11511da177e4SLinus Torvalds #define   EFI_DEV_MSG_VENDOR			10
11521da177e4SLinus Torvalds #define EFI_DEV_MEDIA			0x04
11531da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_HARD_DRIVE		 1
11541da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_CDROM			 2
11551da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_VENDOR			 3
11561da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_FILE			 4
11571da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_PROTOCOL		 5
11581da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT		0x05
11591da177e4SLinus Torvalds #define EFI_DEV_END_PATH		0x7F
11601da177e4SLinus Torvalds #define EFI_DEV_END_PATH2		0xFF
11611da177e4SLinus Torvalds #define   EFI_DEV_END_INSTANCE			0x01
11621da177e4SLinus Torvalds #define   EFI_DEV_END_ENTIRE			0xFF
11631da177e4SLinus Torvalds 
11641da177e4SLinus Torvalds struct efi_generic_dev_path {
11651da177e4SLinus Torvalds 	u8 type;
11661da177e4SLinus Torvalds 	u8 sub_type;
11671da177e4SLinus Torvalds 	u16 length;
11681da177e4SLinus Torvalds } __attribute ((packed));
11691da177e4SLinus Torvalds 
117046cd4b75SLukas Wunner struct efi_dev_path {
117146cd4b75SLukas Wunner 	u8 type;	/* can be replaced with unnamed */
117246cd4b75SLukas Wunner 	u8 sub_type;	/* struct efi_generic_dev_path; */
117346cd4b75SLukas Wunner 	u16 length;	/* once we've moved to -std=c11 */
117446cd4b75SLukas Wunner 	union {
117546cd4b75SLukas Wunner 		struct {
117646cd4b75SLukas Wunner 			u32 hid;
117746cd4b75SLukas Wunner 			u32 uid;
117846cd4b75SLukas Wunner 		} acpi;
117946cd4b75SLukas Wunner 		struct {
118046cd4b75SLukas Wunner 			u8 fn;
118146cd4b75SLukas Wunner 			u8 dev;
118246cd4b75SLukas Wunner 		} pci;
118346cd4b75SLukas Wunner 	};
118446cd4b75SLukas Wunner } __attribute ((packed));
118546cd4b75SLukas Wunner 
118646cd4b75SLukas Wunner #if IS_ENABLED(CONFIG_EFI_DEV_PATH_PARSER)
118746cd4b75SLukas Wunner struct device *efi_get_device_by_path(struct efi_dev_path **node, size_t *len);
118846cd4b75SLukas Wunner #endif
118946cd4b75SLukas Wunner 
11904a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
11914a3575fdSHuang, Ying {
11924a3575fdSHuang, Ying 	*npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
11934a3575fdSHuang, Ying 	*addr &= PAGE_MASK;
11944a3575fdSHuang, Ying }
11954a3575fdSHuang, Ying 
119604851772SMatt Fleming /*
11974fc756bdSMike Waychison  * EFI Variable support.
11984fc756bdSMike Waychison  *
11994fc756bdSMike Waychison  * Different firmware drivers can expose their EFI-like variables using
12004fc756bdSMike Waychison  * the following.
12014fc756bdSMike Waychison  */
12024fc756bdSMike Waychison 
12034fc756bdSMike Waychison struct efivar_operations {
12044fc756bdSMike Waychison 	efi_get_variable_t *get_variable;
12054fc756bdSMike Waychison 	efi_get_next_variable_t *get_next_variable;
12064fc756bdSMike Waychison 	efi_set_variable_t *set_variable;
120770d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
1208a6e4d5a0SMatt Fleming 	efi_query_variable_store_t *query_variable_store;
12094fc756bdSMike Waychison };
12104fc756bdSMike Waychison 
12114fc756bdSMike Waychison struct efivars {
12124fc756bdSMike Waychison 	struct kset *kset;
1213605e70c7SLee, Chun-Yi 	struct kobject *kobject;
12144fc756bdSMike Waychison 	const struct efivar_operations *ops;
12154fc756bdSMike Waychison };
12164fc756bdSMike Waychison 
1217e14ab23dSMatt Fleming /*
1218e14ab23dSMatt Fleming  * The maximum size of VariableName + Data = 1024
1219e14ab23dSMatt Fleming  * Therefore, it's reasonable to save that much
1220e14ab23dSMatt Fleming  * space in each part of the structure,
1221e14ab23dSMatt Fleming  * and we use a page for reading/writing.
1222e14ab23dSMatt Fleming  */
1223e14ab23dSMatt Fleming 
1224a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN	1024
1225a5d92ad3SMatt Fleming 
1226e14ab23dSMatt Fleming struct efi_variable {
1227a5d92ad3SMatt Fleming 	efi_char16_t  VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)];
1228e14ab23dSMatt Fleming 	efi_guid_t    VendorGuid;
1229e14ab23dSMatt Fleming 	unsigned long DataSize;
1230e14ab23dSMatt Fleming 	__u8          Data[1024];
1231e14ab23dSMatt Fleming 	efi_status_t  Status;
1232e14ab23dSMatt Fleming 	__u32         Attributes;
1233e14ab23dSMatt Fleming } __attribute__((packed));
1234e14ab23dSMatt Fleming 
1235e14ab23dSMatt Fleming struct efivar_entry {
1236e14ab23dSMatt Fleming 	struct efi_variable var;
1237e14ab23dSMatt Fleming 	struct list_head list;
1238e14ab23dSMatt Fleming 	struct kobject kobj;
1239e0d59733SSeiji Aguchi 	bool scanning;
1240e0d59733SSeiji Aguchi 	bool deleting;
1241e14ab23dSMatt Fleming };
1242e14ab23dSMatt Fleming 
1243677703ceSMatt Fleming struct efi_simple_text_output_protocol_32 {
1244677703ceSMatt Fleming 	u32 reset;
1245677703ceSMatt Fleming 	u32 output_string;
1246677703ceSMatt Fleming 	u32 test_string;
1247677703ceSMatt Fleming };
1248677703ceSMatt Fleming 
1249677703ceSMatt Fleming struct efi_simple_text_output_protocol_64 {
1250677703ceSMatt Fleming 	u64 reset;
1251677703ceSMatt Fleming 	u64 output_string;
1252677703ceSMatt Fleming 	u64 test_string;
1253677703ceSMatt Fleming };
1254ed37ddffSRoy Franz 
1255ed37ddffSRoy Franz struct efi_simple_text_output_protocol {
1256ed37ddffSRoy Franz 	void *reset;
1257ed37ddffSRoy Franz 	efi_status_t (*output_string)(void *, void *);
1258ed37ddffSRoy Franz 	void *test_string;
1259ed37ddffSRoy Franz };
1260ed37ddffSRoy Franz 
1261fc372064SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
1262fc372064SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
1263fc372064SArd Biesheuvel #define PIXEL_BIT_MASK					2
1264fc372064SArd Biesheuvel #define PIXEL_BLT_ONLY					3
1265fc372064SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
1266fc372064SArd Biesheuvel 
1267fc372064SArd Biesheuvel struct efi_pixel_bitmask {
1268fc372064SArd Biesheuvel 	u32 red_mask;
1269fc372064SArd Biesheuvel 	u32 green_mask;
1270fc372064SArd Biesheuvel 	u32 blue_mask;
1271fc372064SArd Biesheuvel 	u32 reserved_mask;
1272fc372064SArd Biesheuvel };
1273fc372064SArd Biesheuvel 
1274fc372064SArd Biesheuvel struct efi_graphics_output_mode_info {
1275fc372064SArd Biesheuvel 	u32 version;
1276fc372064SArd Biesheuvel 	u32 horizontal_resolution;
1277fc372064SArd Biesheuvel 	u32 vertical_resolution;
1278fc372064SArd Biesheuvel 	int pixel_format;
1279fc372064SArd Biesheuvel 	struct efi_pixel_bitmask pixel_information;
1280fc372064SArd Biesheuvel 	u32 pixels_per_scan_line;
1281fc372064SArd Biesheuvel } __packed;
1282fc372064SArd Biesheuvel 
1283fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode_32 {
1284fc372064SArd Biesheuvel 	u32 max_mode;
1285fc372064SArd Biesheuvel 	u32 mode;
1286fc372064SArd Biesheuvel 	u32 info;
1287fc372064SArd Biesheuvel 	u32 size_of_info;
1288fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1289fc372064SArd Biesheuvel 	u32 frame_buffer_size;
1290fc372064SArd Biesheuvel } __packed;
1291fc372064SArd Biesheuvel 
1292fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode_64 {
1293fc372064SArd Biesheuvel 	u32 max_mode;
1294fc372064SArd Biesheuvel 	u32 mode;
1295fc372064SArd Biesheuvel 	u64 info;
1296fc372064SArd Biesheuvel 	u64 size_of_info;
1297fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1298fc372064SArd Biesheuvel 	u64 frame_buffer_size;
1299fc372064SArd Biesheuvel } __packed;
1300fc372064SArd Biesheuvel 
1301fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode {
1302fc372064SArd Biesheuvel 	u32 max_mode;
1303fc372064SArd Biesheuvel 	u32 mode;
1304fc372064SArd Biesheuvel 	unsigned long info;
1305fc372064SArd Biesheuvel 	unsigned long size_of_info;
1306fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1307fc372064SArd Biesheuvel 	unsigned long frame_buffer_size;
1308fc372064SArd Biesheuvel } __packed;
1309fc372064SArd Biesheuvel 
1310fc372064SArd Biesheuvel struct efi_graphics_output_protocol_32 {
1311fc372064SArd Biesheuvel 	u32 query_mode;
1312fc372064SArd Biesheuvel 	u32 set_mode;
1313fc372064SArd Biesheuvel 	u32 blt;
1314fc372064SArd Biesheuvel 	u32 mode;
1315fc372064SArd Biesheuvel };
1316fc372064SArd Biesheuvel 
1317fc372064SArd Biesheuvel struct efi_graphics_output_protocol_64 {
1318fc372064SArd Biesheuvel 	u64 query_mode;
1319fc372064SArd Biesheuvel 	u64 set_mode;
1320fc372064SArd Biesheuvel 	u64 blt;
1321fc372064SArd Biesheuvel 	u64 mode;
1322fc372064SArd Biesheuvel };
1323fc372064SArd Biesheuvel 
1324fc372064SArd Biesheuvel struct efi_graphics_output_protocol {
1325fc372064SArd Biesheuvel 	unsigned long query_mode;
1326fc372064SArd Biesheuvel 	unsigned long set_mode;
1327fc372064SArd Biesheuvel 	unsigned long blt;
1328fc372064SArd Biesheuvel 	struct efi_graphics_output_protocol_mode *mode;
1329fc372064SArd Biesheuvel };
1330fc372064SArd Biesheuvel 
1331fc372064SArd Biesheuvel typedef efi_status_t (*efi_graphics_output_protocol_query_mode)(
1332fc372064SArd Biesheuvel 	struct efi_graphics_output_protocol *, u32, unsigned long *,
1333fc372064SArd Biesheuvel 	struct efi_graphics_output_mode_info **);
1334fc372064SArd Biesheuvel 
133504851772SMatt Fleming extern struct list_head efivar_sysfs_list;
133604851772SMatt Fleming 
133704851772SMatt Fleming static inline void
133804851772SMatt Fleming efivar_unregister(struct efivar_entry *var)
133904851772SMatt Fleming {
134004851772SMatt Fleming 	kobject_put(&var->kobj);
134104851772SMatt Fleming }
134204851772SMatt Fleming 
1343e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars,
13444fc756bdSMike Waychison 		     const struct efivar_operations *ops,
1345e14ab23dSMatt Fleming 		     struct kobject *kobject);
1346e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars);
1347e14ab23dSMatt Fleming struct kobject *efivars_kobject(void);
1348e14ab23dSMatt Fleming 
1349e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
13501cfd6316SJulia Lawall 		void *data, bool duplicates, struct list_head *head);
1351e14ab23dSMatt Fleming 
135221b3ddd3SSylvain Chouleur int efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
135321b3ddd3SSylvain Chouleur int efivar_entry_remove(struct efivar_entry *entry);
1354e14ab23dSMatt Fleming 
1355e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry);
1356e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry);
1357e14ab23dSMatt Fleming 
1358e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
13598a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
13608a415b8cSMatt Fleming 		       unsigned long *size, void *data);
1361e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1362e14ab23dSMatt Fleming 		     unsigned long *size, void *data);
1363e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
1364e14ab23dSMatt Fleming 		     unsigned long size, void *data, struct list_head *head);
1365e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
1366e14ab23dSMatt Fleming 			      unsigned long *size, void *data, bool *set);
1367e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
1368e14ab23dSMatt Fleming 			  bool block, unsigned long size, void *data);
1369e14ab23dSMatt Fleming 
137021b3ddd3SSylvain Chouleur int efivar_entry_iter_begin(void);
1371e14ab23dSMatt Fleming void efivar_entry_iter_end(void);
1372e14ab23dSMatt Fleming 
1373e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1374e14ab23dSMatt Fleming 			struct list_head *head, void *data,
1375e14ab23dSMatt Fleming 			struct efivar_entry **prev);
1376e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1377e14ab23dSMatt Fleming 		      struct list_head *head, void *data);
1378e14ab23dSMatt Fleming 
1379e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
1380e14ab23dSMatt Fleming 				       struct list_head *head, bool remove);
1381e14ab23dSMatt Fleming 
13828282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
13838282f5d9SPeter Jones 		     unsigned long data_size);
1384ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
1385ed8b0de5SPeter Jones 				  size_t len);
1386e14ab23dSMatt Fleming 
1387a9499fa7STom Gundersen extern struct work_struct efivar_work;
138804851772SMatt Fleming void efivar_run_worker(void);
138904851772SMatt Fleming 
1390a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
1391e14ab23dSMatt Fleming int efivars_sysfs_init(void);
13924fc756bdSMike Waychison 
1393e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024
1394e0d59733SSeiji Aguchi 
13954fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */
1396f0133f3cSMatt Fleming extern bool efi_capsule_pending(int *reset_type);
1397f0133f3cSMatt Fleming 
1398f0133f3cSMatt Fleming extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
1399f0133f3cSMatt Fleming 				 size_t size, int *reset);
1400f0133f3cSMatt Fleming 
1401f0133f3cSMatt Fleming extern int efi_capsule_update(efi_capsule_header_t *capsule,
1402f0133f3cSMatt Fleming 			      struct page **pages);
14034fc756bdSMike Waychison 
1404926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP
1405926172d4SDave Young int efi_runtime_map_init(struct kobject *);
14066a2c20e7SVivek Goyal int efi_get_runtime_map_size(void);
14076a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void);
14086a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz);
1409926172d4SDave Young #else
1410926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj)
1411926172d4SDave Young {
1412926172d4SDave Young 	return 0;
1413926172d4SDave Young }
1414926172d4SDave Young 
14156a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void)
14166a2c20e7SVivek Goyal {
14176a2c20e7SVivek Goyal 	return 0;
14186a2c20e7SVivek Goyal }
14196a2c20e7SVivek Goyal 
14206a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void)
14216a2c20e7SVivek Goyal {
14226a2c20e7SVivek Goyal 	return 0;
14236a2c20e7SVivek Goyal }
14246a2c20e7SVivek Goyal 
14256a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
14266a2c20e7SVivek Goyal {
14276a2c20e7SVivek Goyal 	return 0;
14286a2c20e7SVivek Goyal }
14296a2c20e7SVivek Goyal 
1430926172d4SDave Young #endif
1431926172d4SDave Young 
1432bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */
1433bd669475SArd Biesheuvel 
1434bd669475SArd Biesheuvel #define pr_efi(sys_table, msg)     efi_printk(sys_table, "EFI stub: "msg)
1435bd669475SArd Biesheuvel #define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg)
1436bd669475SArd Biesheuvel 
1437bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str);
1438bd669475SArd Biesheuvel 
1439bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
1440bd669475SArd Biesheuvel 	      unsigned long addr);
1441bd669475SArd Biesheuvel 
1442bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,
1443bd669475SArd Biesheuvel 			  efi_loaded_image_t *image, int *cmd_line_len);
1444bd669475SArd Biesheuvel 
1445bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
1446dadb57abSJeffrey Hugo 				struct efi_boot_memmap *map);
1447bd669475SArd Biesheuvel 
1448bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
1449bd669475SArd Biesheuvel 			   unsigned long size, unsigned long align,
1450bd669475SArd Biesheuvel 			   unsigned long *addr);
1451bd669475SArd Biesheuvel 
1452bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
1453bd669475SArd Biesheuvel 			    unsigned long size, unsigned long align,
1454bd669475SArd Biesheuvel 			    unsigned long *addr, unsigned long max);
1455bd669475SArd Biesheuvel 
1456bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
1457bd669475SArd Biesheuvel 				 unsigned long *image_addr,
1458bd669475SArd Biesheuvel 				 unsigned long image_size,
1459bd669475SArd Biesheuvel 				 unsigned long alloc_size,
1460bd669475SArd Biesheuvel 				 unsigned long preferred_addr,
1461bd669475SArd Biesheuvel 				 unsigned long alignment);
1462bd669475SArd Biesheuvel 
1463bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
1464bd669475SArd Biesheuvel 				  efi_loaded_image_t *image,
1465bd669475SArd Biesheuvel 				  char *cmd_line, char *option_string,
1466bd669475SArd Biesheuvel 				  unsigned long max_addr,
1467bd669475SArd Biesheuvel 				  unsigned long *load_addr,
1468bd669475SArd Biesheuvel 				  unsigned long *load_size);
1469bd669475SArd Biesheuvel 
14705a17dae4SMatt Fleming efi_status_t efi_parse_options(char *cmdline);
14715a17dae4SMatt Fleming 
14722c23b73cSArd Biesheuvel efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg,
14732c23b73cSArd Biesheuvel 			   struct screen_info *si, efi_guid_t *proto,
14742c23b73cSArd Biesheuvel 			   unsigned long size);
14752c23b73cSArd Biesheuvel 
1476b2e0a54aSDave Young bool efi_runtime_disabled(void);
147780e75596SAlex Thorlton extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
147880e75596SAlex Thorlton 
147980e75596SAlex Thorlton /*
148080e75596SAlex Thorlton  * Arch code can implement the following three template macros, avoiding
148180e75596SAlex Thorlton  * reptition for the void/non-void return cases of {__,}efi_call_virt():
148280e75596SAlex Thorlton  *
148380e75596SAlex Thorlton  *  * arch_efi_call_virt_setup()
148480e75596SAlex Thorlton  *
148580e75596SAlex Thorlton  *    Sets up the environment for the call (e.g. switching page tables,
148680e75596SAlex Thorlton  *    allowing kernel-mode use of floating point, if required).
148780e75596SAlex Thorlton  *
148880e75596SAlex Thorlton  *  * arch_efi_call_virt()
148980e75596SAlex Thorlton  *
149080e75596SAlex Thorlton  *    Performs the call. The last expression in the macro must be the call
149180e75596SAlex Thorlton  *    itself, allowing the logic to be shared by the void and non-void
149280e75596SAlex Thorlton  *    cases.
149380e75596SAlex Thorlton  *
149480e75596SAlex Thorlton  *  * arch_efi_call_virt_teardown()
149580e75596SAlex Thorlton  *
149680e75596SAlex Thorlton  *    Restores the usual kernel environment once the call has returned.
149780e75596SAlex Thorlton  */
149880e75596SAlex Thorlton 
149980e75596SAlex Thorlton #define efi_call_virt_pointer(p, f, args...)				\
150080e75596SAlex Thorlton ({									\
150180e75596SAlex Thorlton 	efi_status_t __s;						\
150280e75596SAlex Thorlton 	unsigned long __flags;						\
150380e75596SAlex Thorlton 									\
150480e75596SAlex Thorlton 	arch_efi_call_virt_setup();					\
150580e75596SAlex Thorlton 									\
150680e75596SAlex Thorlton 	local_save_flags(__flags);					\
150780e75596SAlex Thorlton 	__s = arch_efi_call_virt(p, f, args);				\
150880e75596SAlex Thorlton 	efi_call_virt_check_flags(__flags, __stringify(f));		\
150980e75596SAlex Thorlton 									\
151080e75596SAlex Thorlton 	arch_efi_call_virt_teardown();					\
151180e75596SAlex Thorlton 									\
151280e75596SAlex Thorlton 	__s;								\
151380e75596SAlex Thorlton })
151480e75596SAlex Thorlton 
151580e75596SAlex Thorlton #define __efi_call_virt_pointer(p, f, args...)				\
151680e75596SAlex Thorlton ({									\
151780e75596SAlex Thorlton 	unsigned long __flags;						\
151880e75596SAlex Thorlton 									\
151980e75596SAlex Thorlton 	arch_efi_call_virt_setup();					\
152080e75596SAlex Thorlton 									\
152180e75596SAlex Thorlton 	local_save_flags(__flags);					\
152280e75596SAlex Thorlton 	arch_efi_call_virt(p, f, args);					\
152380e75596SAlex Thorlton 	efi_call_virt_check_flags(__flags, __stringify(f));		\
152480e75596SAlex Thorlton 									\
152580e75596SAlex Thorlton 	arch_efi_call_virt_teardown();					\
152680e75596SAlex Thorlton })
152780e75596SAlex Thorlton 
1528fc07716bSJeffrey Hugo typedef efi_status_t (*efi_exit_boot_map_processing)(
1529fc07716bSJeffrey Hugo 	efi_system_table_t *sys_table_arg,
1530fc07716bSJeffrey Hugo 	struct efi_boot_memmap *map,
1531fc07716bSJeffrey Hugo 	void *priv);
1532fc07716bSJeffrey Hugo 
1533fc07716bSJeffrey Hugo efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table,
1534fc07716bSJeffrey Hugo 				    void *handle,
1535fc07716bSJeffrey Hugo 				    struct efi_boot_memmap *map,
1536fc07716bSJeffrey Hugo 				    void *priv,
1537fc07716bSJeffrey Hugo 				    efi_exit_boot_map_processing priv_func);
153863625988SArd Biesheuvel 
153963625988SArd Biesheuvel struct linux_efi_random_seed {
154063625988SArd Biesheuvel 	u32	size;
154163625988SArd Biesheuvel 	u8	bits[];
154263625988SArd Biesheuvel };
154363625988SArd Biesheuvel 
15441da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */
1545