xref: /openbmc/linux/include/linux/efi.h (revision de8cb458625c164bb3f93c4e415e479afce8fa9d)
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)
1060100a3e6SPeter 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 
5121da177e4SLinus Torvalds typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
5131da177e4SLinus Torvalds typedef efi_status_t efi_set_time_t (efi_time_t *tm);
5141da177e4SLinus Torvalds typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
5151da177e4SLinus Torvalds 					    efi_time_t *tm);
5161da177e4SLinus Torvalds typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
5171da177e4SLinus Torvalds typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
5181da177e4SLinus Torvalds 					 unsigned long *data_size, void *data);
5191da177e4SLinus Torvalds typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
5201da177e4SLinus Torvalds 					      efi_guid_t *vendor);
5211da177e4SLinus Torvalds typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor,
522f7a2d73fSMatthew Garrett 					 u32 attr, unsigned long data_size,
5231da177e4SLinus Torvalds 					 void *data);
5241da177e4SLinus Torvalds typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
5251da177e4SLinus Torvalds typedef void efi_reset_system_t (int reset_type, efi_status_t status,
5261da177e4SLinus Torvalds 				 unsigned long data_size, efi_char16_t *data);
5271da177e4SLinus Torvalds typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
5281da177e4SLinus Torvalds 						unsigned long descriptor_size,
5291da177e4SLinus Torvalds 						u32 descriptor_version,
5301da177e4SLinus Torvalds 						efi_memory_desc_t *virtual_map);
5313b370237SMatthew Garrett typedef efi_status_t efi_query_variable_info_t(u32 attr,
5323b370237SMatthew Garrett 					       u64 *storage_space,
5333b370237SMatthew Garrett 					       u64 *remaining_space,
5343b370237SMatthew Garrett 					       u64 *max_variable_size);
5353b370237SMatthew Garrett typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
5363b370237SMatthew Garrett 					  unsigned long count,
5373b370237SMatthew Garrett 					  unsigned long sg_list);
5383b370237SMatthew Garrett typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
5393b370237SMatthew Garrett 					      unsigned long count,
5403b370237SMatthew Garrett 					      u64 *max_size,
5413b370237SMatthew Garrett 					      int *reset_type);
542ca0e30dcSArd Biesheuvel typedef efi_status_t efi_query_variable_store_t(u32 attributes,
543ca0e30dcSArd Biesheuvel 						unsigned long size,
544ca0e30dcSArd Biesheuvel 						bool nonblocking);
5451da177e4SLinus Torvalds 
546c4c39c70SArd Biesheuvel typedef struct {
547c4c39c70SArd Biesheuvel 	efi_table_hdr_t			hdr;
548c4c39c70SArd Biesheuvel 	efi_get_time_t			*get_time;
549c4c39c70SArd Biesheuvel 	efi_set_time_t			*set_time;
550c4c39c70SArd Biesheuvel 	efi_get_wakeup_time_t		*get_wakeup_time;
551c4c39c70SArd Biesheuvel 	efi_set_wakeup_time_t		*set_wakeup_time;
552c4c39c70SArd Biesheuvel 	efi_set_virtual_address_map_t	*set_virtual_address_map;
553c4c39c70SArd Biesheuvel 	void				*convert_pointer;
554c4c39c70SArd Biesheuvel 	efi_get_variable_t		*get_variable;
555c4c39c70SArd Biesheuvel 	efi_get_next_variable_t		*get_next_variable;
556c4c39c70SArd Biesheuvel 	efi_set_variable_t		*set_variable;
557c4c39c70SArd Biesheuvel 	efi_get_next_high_mono_count_t	*get_next_high_mono_count;
558c4c39c70SArd Biesheuvel 	efi_reset_system_t		*reset_system;
559c4c39c70SArd Biesheuvel 	efi_update_capsule_t		*update_capsule;
560c4c39c70SArd Biesheuvel 	efi_query_capsule_caps_t	*query_capsule_caps;
561c4c39c70SArd Biesheuvel 	efi_query_variable_info_t	*query_variable_info;
562c4c39c70SArd Biesheuvel } efi_runtime_services_t;
563c4c39c70SArd Biesheuvel 
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 
614e58910cdSJosh Boyer #define EFI_IMAGE_SECURITY_DATABASE_GUID	EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596,  0xa3, 0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f)
615e58910cdSJosh Boyer #define EFI_SHIM_LOCK_GUID			EFI_GUID(0x605dab50, 0xe046, 0x4300,  0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23)
616e58910cdSJosh Boyer 
617801820beSArd Biesheuvel /*
618801820beSArd Biesheuvel  * This GUID is used to pass to the kernel proper the struct screen_info
619801820beSArd Biesheuvel  * structure that was populated by the stub based on the GOP protocol instance
620801820beSArd Biesheuvel  * associated with ConOut
621801820beSArd Biesheuvel  */
6227fb2b43cSIngo Molnar #define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID	EFI_GUID(0xe03fc20a, 0x85dc, 0x406e,  0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
6237fb2b43cSIngo Molnar #define LINUX_EFI_LOADER_ENTRY_GUID		EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf,  0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
62463625988SArd Biesheuvel #define LINUX_EFI_RANDOM_SEED_TABLE_GUID	EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2,  0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b)
62506f7d4a1SCompostella, Jeremy 
6261da177e4SLinus Torvalds typedef struct {
6271da177e4SLinus Torvalds 	efi_guid_t guid;
6281adbfa35SOlof Johansson 	u64 table;
6291adbfa35SOlof Johansson } efi_config_table_64_t;
6301adbfa35SOlof Johansson 
6311adbfa35SOlof Johansson typedef struct {
6321adbfa35SOlof Johansson 	efi_guid_t guid;
6331adbfa35SOlof Johansson 	u32 table;
6341adbfa35SOlof Johansson } efi_config_table_32_t;
6351adbfa35SOlof Johansson 
6361adbfa35SOlof Johansson typedef struct {
6371adbfa35SOlof Johansson 	efi_guid_t guid;
6381da177e4SLinus Torvalds 	unsigned long table;
6391da177e4SLinus Torvalds } efi_config_table_t;
6401da177e4SLinus Torvalds 
641272686bfSLeif Lindholm typedef struct {
642272686bfSLeif Lindholm 	efi_guid_t guid;
643272686bfSLeif Lindholm 	const char *name;
644272686bfSLeif Lindholm 	unsigned long *ptr;
645272686bfSLeif Lindholm } efi_config_table_type_t;
646272686bfSLeif Lindholm 
6471da177e4SLinus Torvalds #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
6481da177e4SLinus Torvalds 
6493b370237SMatthew Garrett #define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
6503b370237SMatthew Garrett #define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
6513b370237SMatthew Garrett #define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
6523b370237SMatthew Garrett #define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
6533b370237SMatthew Garrett #define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
6543b370237SMatthew Garrett #define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
6553b370237SMatthew Garrett 
6561da177e4SLinus Torvalds typedef struct {
6571da177e4SLinus Torvalds 	efi_table_hdr_t hdr;
6581adbfa35SOlof Johansson 	u64 fw_vendor;	/* physical addr of CHAR16 vendor string */
6591adbfa35SOlof Johansson 	u32 fw_revision;
6601adbfa35SOlof Johansson 	u32 __pad1;
6611adbfa35SOlof Johansson 	u64 con_in_handle;
6621adbfa35SOlof Johansson 	u64 con_in;
6631adbfa35SOlof Johansson 	u64 con_out_handle;
6641adbfa35SOlof Johansson 	u64 con_out;
6651adbfa35SOlof Johansson 	u64 stderr_handle;
6661adbfa35SOlof Johansson 	u64 stderr;
6671adbfa35SOlof Johansson 	u64 runtime;
6681adbfa35SOlof Johansson 	u64 boottime;
6691adbfa35SOlof Johansson 	u32 nr_tables;
6701adbfa35SOlof Johansson 	u32 __pad2;
6711adbfa35SOlof Johansson 	u64 tables;
6721adbfa35SOlof Johansson } efi_system_table_64_t;
6731adbfa35SOlof Johansson 
6741adbfa35SOlof Johansson typedef struct {
6751adbfa35SOlof Johansson 	efi_table_hdr_t hdr;
6761adbfa35SOlof Johansson 	u32 fw_vendor;	/* physical addr of CHAR16 vendor string */
6771adbfa35SOlof Johansson 	u32 fw_revision;
6781adbfa35SOlof Johansson 	u32 con_in_handle;
6791adbfa35SOlof Johansson 	u32 con_in;
6801adbfa35SOlof Johansson 	u32 con_out_handle;
6811adbfa35SOlof Johansson 	u32 con_out;
6821adbfa35SOlof Johansson 	u32 stderr_handle;
6831adbfa35SOlof Johansson 	u32 stderr;
6841adbfa35SOlof Johansson 	u32 runtime;
6851adbfa35SOlof Johansson 	u32 boottime;
6861adbfa35SOlof Johansson 	u32 nr_tables;
6871adbfa35SOlof Johansson 	u32 tables;
6881adbfa35SOlof Johansson } efi_system_table_32_t;
6891adbfa35SOlof Johansson 
6901adbfa35SOlof Johansson typedef struct {
6911adbfa35SOlof Johansson 	efi_table_hdr_t hdr;
6921da177e4SLinus Torvalds 	unsigned long fw_vendor;	/* physical addr of CHAR16 vendor string */
6931da177e4SLinus Torvalds 	u32 fw_revision;
6941da177e4SLinus Torvalds 	unsigned long con_in_handle;
6951da177e4SLinus Torvalds 	unsigned long con_in;
6961da177e4SLinus Torvalds 	unsigned long con_out_handle;
6971da177e4SLinus Torvalds 	unsigned long con_out;
6981da177e4SLinus Torvalds 	unsigned long stderr_handle;
6991da177e4SLinus Torvalds 	unsigned long stderr;
7001da177e4SLinus Torvalds 	efi_runtime_services_t *runtime;
701f30ca6baSMatt Fleming 	efi_boot_services_t *boottime;
7021da177e4SLinus Torvalds 	unsigned long nr_tables;
7031da177e4SLinus Torvalds 	unsigned long tables;
7041da177e4SLinus Torvalds } efi_system_table_t;
7051da177e4SLinus Torvalds 
7069479c7ceSMatt Fleming /*
7079479c7ceSMatt Fleming  * Architecture independent structure for describing a memory map for the
7089479c7ceSMatt Fleming  * benefit of efi_memmap_init_early(), saving us the need to pass four
7099479c7ceSMatt Fleming  * parameters.
7109479c7ceSMatt Fleming  */
7119479c7ceSMatt Fleming struct efi_memory_map_data {
7129479c7ceSMatt Fleming 	phys_addr_t phys_map;
7139479c7ceSMatt Fleming 	unsigned long size;
7149479c7ceSMatt Fleming 	unsigned long desc_version;
7159479c7ceSMatt Fleming 	unsigned long desc_size;
7169479c7ceSMatt Fleming };
7179479c7ceSMatt Fleming 
7181da177e4SLinus Torvalds struct efi_memory_map {
71944511fb9SArd Biesheuvel 	phys_addr_t phys_map;
7207ae65fd3SMatt Tolentino 	void *map;
7217ae65fd3SMatt Tolentino 	void *map_end;
7221da177e4SLinus Torvalds 	int nr_map;
7231da177e4SLinus Torvalds 	unsigned long desc_version;
7247ae65fd3SMatt Tolentino 	unsigned long desc_size;
725dca0f971SMatt Fleming 	bool late;
7261da177e4SLinus Torvalds };
7271da177e4SLinus Torvalds 
72860863c0dSMatt Fleming struct efi_mem_range {
72960863c0dSMatt Fleming 	struct range range;
73060863c0dSMatt Fleming 	u64 attribute;
7311da177e4SLinus Torvalds };
7321da177e4SLinus Torvalds 
7330302f71cSMark Salter struct efi_fdt_params {
7340302f71cSMark Salter 	u64 system_table;
7350302f71cSMark Salter 	u64 mmap;
7360302f71cSMark Salter 	u32 mmap_size;
7370302f71cSMark Salter 	u32 desc_size;
7380302f71cSMark Salter 	u32 desc_ver;
7390302f71cSMark Salter };
7400302f71cSMark Salter 
7418e84f345SMatt Fleming typedef struct {
7428e84f345SMatt Fleming 	u32 revision;
743677703ceSMatt Fleming 	u32 parent_handle;
744677703ceSMatt Fleming 	u32 system_table;
745677703ceSMatt Fleming 	u32 device_handle;
746677703ceSMatt Fleming 	u32 file_path;
747677703ceSMatt Fleming 	u32 reserved;
748677703ceSMatt Fleming 	u32 load_options_size;
749677703ceSMatt Fleming 	u32 load_options;
750677703ceSMatt Fleming 	u32 image_base;
751677703ceSMatt Fleming 	__aligned_u64 image_size;
752677703ceSMatt Fleming 	unsigned int image_code_type;
753677703ceSMatt Fleming 	unsigned int image_data_type;
754677703ceSMatt Fleming 	unsigned long unload;
755677703ceSMatt Fleming } efi_loaded_image_32_t;
756677703ceSMatt Fleming 
757677703ceSMatt Fleming typedef struct {
758677703ceSMatt Fleming 	u32 revision;
759677703ceSMatt Fleming 	u64 parent_handle;
760677703ceSMatt Fleming 	u64 system_table;
761677703ceSMatt Fleming 	u64 device_handle;
762677703ceSMatt Fleming 	u64 file_path;
763677703ceSMatt Fleming 	u64 reserved;
764677703ceSMatt Fleming 	u32 load_options_size;
765677703ceSMatt Fleming 	u64 load_options;
766677703ceSMatt Fleming 	u64 image_base;
767677703ceSMatt Fleming 	__aligned_u64 image_size;
768677703ceSMatt Fleming 	unsigned int image_code_type;
769677703ceSMatt Fleming 	unsigned int image_data_type;
770677703ceSMatt Fleming 	unsigned long unload;
771677703ceSMatt Fleming } efi_loaded_image_64_t;
772677703ceSMatt Fleming 
773677703ceSMatt Fleming typedef struct {
774677703ceSMatt Fleming 	u32 revision;
7758e84f345SMatt Fleming 	void *parent_handle;
7768e84f345SMatt Fleming 	efi_system_table_t *system_table;
7778e84f345SMatt Fleming 	void *device_handle;
7788e84f345SMatt Fleming 	void *file_path;
7798e84f345SMatt Fleming 	void *reserved;
7808e84f345SMatt Fleming 	u32 load_options_size;
7818e84f345SMatt Fleming 	void *load_options;
7828e84f345SMatt Fleming 	void *image_base;
7838e84f345SMatt Fleming 	__aligned_u64 image_size;
7848e84f345SMatt Fleming 	unsigned int image_code_type;
7858e84f345SMatt Fleming 	unsigned int image_data_type;
7868e84f345SMatt Fleming 	unsigned long unload;
7878e84f345SMatt Fleming } efi_loaded_image_t;
7888e84f345SMatt Fleming 
78955839d51SMatt Fleming 
79055839d51SMatt Fleming typedef struct {
79155839d51SMatt Fleming 	u64 size;
79255839d51SMatt Fleming 	u64 file_size;
79355839d51SMatt Fleming 	u64 phys_size;
79455839d51SMatt Fleming 	efi_time_t create_time;
79555839d51SMatt Fleming 	efi_time_t last_access_time;
79655839d51SMatt Fleming 	efi_time_t modification_time;
79755839d51SMatt Fleming 	__aligned_u64 attribute;
79855839d51SMatt Fleming 	efi_char16_t filename[1];
79955839d51SMatt Fleming } efi_file_info_t;
80055839d51SMatt Fleming 
801677703ceSMatt Fleming typedef struct {
802677703ceSMatt Fleming 	u64 revision;
803677703ceSMatt Fleming 	u32 open;
804677703ceSMatt Fleming 	u32 close;
805677703ceSMatt Fleming 	u32 delete;
806677703ceSMatt Fleming 	u32 read;
807677703ceSMatt Fleming 	u32 write;
808677703ceSMatt Fleming 	u32 get_position;
809677703ceSMatt Fleming 	u32 set_position;
810677703ceSMatt Fleming 	u32 get_info;
811677703ceSMatt Fleming 	u32 set_info;
812677703ceSMatt Fleming 	u32 flush;
813677703ceSMatt Fleming } efi_file_handle_32_t;
814677703ceSMatt Fleming 
815677703ceSMatt Fleming typedef struct {
816677703ceSMatt Fleming 	u64 revision;
817677703ceSMatt Fleming 	u64 open;
818677703ceSMatt Fleming 	u64 close;
819677703ceSMatt Fleming 	u64 delete;
820677703ceSMatt Fleming 	u64 read;
821677703ceSMatt Fleming 	u64 write;
822677703ceSMatt Fleming 	u64 get_position;
823677703ceSMatt Fleming 	u64 set_position;
824677703ceSMatt Fleming 	u64 get_info;
825677703ceSMatt Fleming 	u64 set_info;
826677703ceSMatt Fleming 	u64 flush;
827677703ceSMatt Fleming } efi_file_handle_64_t;
828677703ceSMatt Fleming 
829ed37ddffSRoy Franz typedef struct _efi_file_handle {
83055839d51SMatt Fleming 	u64 revision;
831ed37ddffSRoy Franz 	efi_status_t (*open)(struct _efi_file_handle *,
832ed37ddffSRoy Franz 			     struct _efi_file_handle **,
833ed37ddffSRoy Franz 			     efi_char16_t *, u64, u64);
834ed37ddffSRoy Franz 	efi_status_t (*close)(struct _efi_file_handle *);
83555839d51SMatt Fleming 	void *delete;
836ed37ddffSRoy Franz 	efi_status_t (*read)(struct _efi_file_handle *, unsigned long *,
837ed37ddffSRoy Franz 			     void *);
83855839d51SMatt Fleming 	void *write;
83955839d51SMatt Fleming 	void *get_position;
84055839d51SMatt Fleming 	void *set_position;
841ed37ddffSRoy Franz 	efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *,
842ed37ddffSRoy Franz 			unsigned long *, void *);
84355839d51SMatt Fleming 	void *set_info;
84455839d51SMatt Fleming 	void *flush;
84555839d51SMatt Fleming } efi_file_handle_t;
84655839d51SMatt Fleming 
847ed37ddffSRoy Franz typedef struct _efi_file_io_interface {
848ed37ddffSRoy Franz 	u64 revision;
849ed37ddffSRoy Franz 	int (*open_volume)(struct _efi_file_io_interface *,
850ed37ddffSRoy Franz 			   efi_file_handle_t **);
851ed37ddffSRoy Franz } efi_file_io_interface_t;
852ed37ddffSRoy Franz 
85355839d51SMatt Fleming #define EFI_FILE_MODE_READ	0x0000000000000001
85455839d51SMatt Fleming #define EFI_FILE_MODE_WRITE	0x0000000000000002
85555839d51SMatt Fleming #define EFI_FILE_MODE_CREATE	0x8000000000000000
85655839d51SMatt Fleming 
857bf924863SArd Biesheuvel typedef struct {
858bf924863SArd Biesheuvel 	u32 version;
859bf924863SArd Biesheuvel 	u32 length;
860bf924863SArd Biesheuvel 	u64 memory_protection_attribute;
861bf924863SArd Biesheuvel } efi_properties_table_t;
862bf924863SArd Biesheuvel 
863bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_VERSION	0x00010000
864bf924863SArd Biesheuvel #define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA	0x1
865bf924863SArd Biesheuvel 
866b2c99e3cSBjorn Helgaas #define EFI_INVALID_TABLE_ADDR		(~0UL)
867b2c99e3cSBjorn Helgaas 
868a604af07SArd Biesheuvel typedef struct {
869a604af07SArd Biesheuvel 	u32 version;
870a604af07SArd Biesheuvel 	u32 num_entries;
871a604af07SArd Biesheuvel 	u32 desc_size;
872a604af07SArd Biesheuvel 	u32 reserved;
873a604af07SArd Biesheuvel 	efi_memory_desc_t entry[0];
874a604af07SArd Biesheuvel } efi_memory_attributes_table_t;
875a604af07SArd Biesheuvel 
8761da177e4SLinus Torvalds /*
8771da177e4SLinus Torvalds  * All runtime access to EFI goes through this structure:
8781da177e4SLinus Torvalds  */
8791da177e4SLinus Torvalds extern struct efi {
8801da177e4SLinus Torvalds 	efi_system_table_t *systab;	/* EFI system table */
8813b370237SMatthew Garrett 	unsigned int runtime_version;	/* Runtime services version */
882b2c99e3cSBjorn Helgaas 	unsigned long mps;		/* MPS table */
883b2c99e3cSBjorn Helgaas 	unsigned long acpi;		/* ACPI table  (IA64 ext 0.71) */
884b2c99e3cSBjorn Helgaas 	unsigned long acpi20;		/* ACPI table  (ACPI 2.0) */
885e1ccbbc9SArd Biesheuvel 	unsigned long smbios;		/* SMBIOS table (32 bit entry point) */
886e1ccbbc9SArd Biesheuvel 	unsigned long smbios3;		/* SMBIOS table (64 bit entry point) */
887b2c99e3cSBjorn Helgaas 	unsigned long sal_systab;	/* SAL system table */
888b2c99e3cSBjorn Helgaas 	unsigned long boot_info;	/* boot info table */
889b2c99e3cSBjorn Helgaas 	unsigned long hcdp;		/* HCDP table */
890b2c99e3cSBjorn Helgaas 	unsigned long uga;		/* UGA table */
891a50f70b1SRuss Anderson 	unsigned long uv_systab;	/* UV system table */
892a0998eb1SDave Young 	unsigned long fw_vendor;	/* fw_vendor */
893a0998eb1SDave Young 	unsigned long runtime;		/* runtime table */
894a0998eb1SDave Young 	unsigned long config_table;	/* config tables */
8950bb54905SPeter Jones 	unsigned long esrt;		/* ESRT table */
896bf924863SArd Biesheuvel 	unsigned long properties_table;	/* properties table */
897a604af07SArd Biesheuvel 	unsigned long mem_attr_table;	/* memory attributes table */
89863625988SArd Biesheuvel 	unsigned long rng_seed;		/* UEFI firmware random seed */
8991da177e4SLinus Torvalds 	efi_get_time_t *get_time;
9001da177e4SLinus Torvalds 	efi_set_time_t *set_time;
9011da177e4SLinus Torvalds 	efi_get_wakeup_time_t *get_wakeup_time;
9021da177e4SLinus Torvalds 	efi_set_wakeup_time_t *set_wakeup_time;
9031da177e4SLinus Torvalds 	efi_get_variable_t *get_variable;
9041da177e4SLinus Torvalds 	efi_get_next_variable_t *get_next_variable;
9051da177e4SLinus Torvalds 	efi_set_variable_t *set_variable;
90670d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
9073b370237SMatthew Garrett 	efi_query_variable_info_t *query_variable_info;
908d3cac1f8SArd Biesheuvel 	efi_query_variable_info_t *query_variable_info_nonblocking;
9093b370237SMatthew Garrett 	efi_update_capsule_t *update_capsule;
9103b370237SMatthew Garrett 	efi_query_capsule_caps_t *query_capsule_caps;
9111da177e4SLinus Torvalds 	efi_get_next_high_mono_count_t *get_next_high_mono_count;
9121da177e4SLinus Torvalds 	efi_reset_system_t *reset_system;
9131da177e4SLinus Torvalds 	efi_set_virtual_address_map_t *set_virtual_address_map;
914884f4f66SMatt Fleming 	struct efi_memory_map memmap;
9153e909599SMatt Fleming 	unsigned long flags;
9161da177e4SLinus Torvalds } efi;
9171da177e4SLinus Torvalds 
9181da177e4SLinus Torvalds static inline int
9191da177e4SLinus Torvalds efi_guidcmp (efi_guid_t left, efi_guid_t right)
9201da177e4SLinus Torvalds {
9211da177e4SLinus Torvalds 	return memcmp(&left, &right, sizeof (efi_guid_t));
9221da177e4SLinus Torvalds }
9231da177e4SLinus Torvalds 
9241da177e4SLinus Torvalds static inline char *
92526e02272SBorislav Petkov efi_guid_to_str(efi_guid_t *guid, char *out)
9261da177e4SLinus Torvalds {
927925ede0bSJoe Perches 	sprintf(out, "%pUl", guid->b);
9281da177e4SLinus Torvalds         return out;
9291da177e4SLinus Torvalds }
9301da177e4SLinus Torvalds 
9311da177e4SLinus Torvalds extern void efi_init (void);
9321da177e4SLinus Torvalds extern void *efi_get_pal_addr (void);
9331da177e4SLinus Torvalds extern void efi_map_pal_code (void);
9341da177e4SLinus Torvalds extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
93570f4f935SArnd Bergmann extern void efi_gettimeofday (struct timespec64 *ts);
9361da177e4SLinus Torvalds extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
93778510792SJosh Triplett #ifdef CONFIG_X86
9382223af38SJosh Triplett extern void efi_late_init(void);
93978510792SJosh Triplett extern void efi_free_boot_services(void);
940ca0e30dcSArd Biesheuvel extern efi_status_t efi_query_variable_store(u32 attributes,
941ca0e30dcSArd Biesheuvel 					     unsigned long size,
942ca0e30dcSArd Biesheuvel 					     bool nonblocking);
943b05b9f5fSTony Luck extern void efi_find_mirror(void);
94478510792SJosh Triplett #else
9452223af38SJosh Triplett static inline void efi_late_init(void) {}
94678510792SJosh Triplett static inline void efi_free_boot_services(void) {}
947a6e4d5a0SMatt Fleming 
948ca0e30dcSArd Biesheuvel static inline efi_status_t efi_query_variable_store(u32 attributes,
949ca0e30dcSArd Biesheuvel 						    unsigned long size,
950ca0e30dcSArd Biesheuvel 						    bool nonblocking)
951a6e4d5a0SMatt Fleming {
952a6e4d5a0SMatt Fleming 	return EFI_SUCCESS;
953a6e4d5a0SMatt Fleming }
95478510792SJosh Triplett #endif
9557bc90e01SJosh Triplett extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
9569479c7ceSMatt Fleming 
95720b1e22dSNicolai Stange extern phys_addr_t __init efi_memmap_alloc(unsigned int num_entries);
9589479c7ceSMatt Fleming extern int __init efi_memmap_init_early(struct efi_memory_map_data *data);
959dca0f971SMatt Fleming extern int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size);
9609479c7ceSMatt Fleming extern void __init efi_memmap_unmap(void);
961c45f4da3SMatt Fleming extern int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map);
96260863c0dSMatt Fleming extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
96360863c0dSMatt Fleming 					 struct range *range);
96460863c0dSMatt Fleming extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
96560863c0dSMatt Fleming 				     void *buf, struct efi_mem_range *mem);
9669479c7ceSMatt Fleming 
967272686bfSLeif Lindholm extern int efi_config_init(efi_config_table_type_t *arch_tables);
9683846c158SPeter Jones #ifdef CONFIG_EFI_ESRT
9690bb54905SPeter Jones extern void __init efi_esrt_init(void);
9703846c158SPeter Jones #else
9713846c158SPeter Jones static inline void efi_esrt_init(void) { }
9723846c158SPeter Jones #endif
9737bb68410SArd Biesheuvel extern int efi_config_parse_tables(void *config_tables, int count, int sz,
9747bb68410SArd Biesheuvel 				   efi_config_table_type_t *arch_tables);
9751da177e4SLinus Torvalds extern u64 efi_get_iobase (void);
9761da177e4SLinus Torvalds extern u32 efi_mem_type (unsigned long phys_addr);
9771da177e4SLinus Torvalds extern u64 efi_mem_attributes (unsigned long phys_addr);
97832e62c63SBjorn Helgaas extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
9791da177e4SLinus Torvalds extern int __init efi_uart_console_only (void);
9800bb54905SPeter Jones extern u64 efi_mem_desc_end(efi_memory_desc_t *md);
9810bb54905SPeter Jones extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
982816e7612SMatt Fleming extern void efi_mem_reserve(phys_addr_t addr, u64 size);
9831da177e4SLinus Torvalds extern void efi_initialize_iomem_resources(struct resource *code_resource,
98400bf4098SBernhard Walle 		struct resource *data_resource, struct resource *bss_resource);
985916f676fSMatthew Garrett extern void efi_reserve_boot_services(void);
9867968c0e3SLeif Lindholm extern int efi_get_fdt_params(struct efi_fdt_params *params);
9870bb54905SPeter Jones extern struct kobject *efi_kobj;
9881da177e4SLinus Torvalds 
98944be28e9SMatt Fleming extern int efi_reboot_quirk_mode;
9900c5ed61aSMatt Fleming extern bool efi_poweroff_required(void);
9910c5ed61aSMatt Fleming 
9920f96a99dSTaku Izumi #ifdef CONFIG_EFI_FAKE_MEMMAP
9930f96a99dSTaku Izumi extern void __init efi_fake_memmap(void);
9940f96a99dSTaku Izumi #else
9950f96a99dSTaku Izumi static inline void efi_fake_memmap(void) { }
9960f96a99dSTaku Izumi #endif
9970f96a99dSTaku Izumi 
99810f0d2f5SArd Biesheuvel /*
99910f0d2f5SArd Biesheuvel  * efi_memattr_perm_setter - arch specific callback function passed into
100010f0d2f5SArd Biesheuvel  *                           efi_memattr_apply_permissions() that updates the
100110f0d2f5SArd Biesheuvel  *                           mapping permissions described by the second
100210f0d2f5SArd Biesheuvel  *                           argument in the page tables referred to by the
100310f0d2f5SArd Biesheuvel  *                           first argument.
100410f0d2f5SArd Biesheuvel  */
100510f0d2f5SArd Biesheuvel typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *);
100610f0d2f5SArd Biesheuvel 
100710f0d2f5SArd Biesheuvel extern int efi_memattr_init(void);
100810f0d2f5SArd Biesheuvel extern int efi_memattr_apply_permissions(struct mm_struct *mm,
100910f0d2f5SArd Biesheuvel 					 efi_memattr_perm_setter fn);
101010f0d2f5SArd Biesheuvel 
1011e885cd80SMark Salter /* Iterate through an efi_memory_map */
101278ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md)				   \
1013e885cd80SMark Salter 	for ((md) = (m)->map;						   \
1014d4c4fed0SJan Beulich 	     (md) && ((void *)(md) + (m)->desc_size) <= (m)->map_end;	   \
1015e885cd80SMark Salter 	     (md) = (void *)(md) + (m)->desc_size)
1016e885cd80SMark Salter 
101778ce248fSMatt Fleming /**
101878ce248fSMatt Fleming  * for_each_efi_memory_desc - iterate over descriptors in efi.memmap
101978ce248fSMatt Fleming  * @md: the efi_memory_desc_t * iterator
102078ce248fSMatt Fleming  *
102178ce248fSMatt Fleming  * Once the loop finishes @md must not be accessed.
102278ce248fSMatt Fleming  */
102378ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \
1024884f4f66SMatt Fleming 	for_each_efi_memory_desc_in_map(&efi.memmap, md)
102578ce248fSMatt Fleming 
102698d2a6caSLaszlo Ersek /*
102798d2a6caSLaszlo Ersek  * Format an EFI memory descriptor's type and attributes to a user-provided
102898d2a6caSLaszlo Ersek  * character buffer, as per snprintf(), and return the buffer.
102998d2a6caSLaszlo Ersek  */
103098d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size,
103198d2a6caSLaszlo Ersek 				     const efi_memory_desc_t *md);
103298d2a6caSLaszlo Ersek 
10331da177e4SLinus Torvalds /**
10341da177e4SLinus Torvalds  * efi_range_is_wc - check the WC bit on an address range
10351da177e4SLinus Torvalds  * @start: starting kvirt address
10361da177e4SLinus Torvalds  * @len: length of range
10371da177e4SLinus Torvalds  *
10381da177e4SLinus Torvalds  * Consult the EFI memory map and make sure it's ok to set this range WC.
10391da177e4SLinus Torvalds  * Returns true or false.
10401da177e4SLinus Torvalds  */
10411da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len)
10421da177e4SLinus Torvalds {
1043986a80d5SJesper Juhl 	unsigned long i;
10441da177e4SLinus Torvalds 
10451da177e4SLinus Torvalds 	for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) {
10461da177e4SLinus Torvalds 		unsigned long paddr = __pa(start + i);
10471da177e4SLinus Torvalds 		if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC))
10481da177e4SLinus Torvalds 			return 0;
10491da177e4SLinus Torvalds 	}
10501da177e4SLinus Torvalds 	/* The range checked out */
10511da177e4SLinus Torvalds 	return 1;
10521da177e4SLinus Torvalds }
10531da177e4SLinus Torvalds 
10541da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP
10551da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *);
10561da177e4SLinus Torvalds #endif
10571da177e4SLinus Torvalds 
10581da177e4SLinus Torvalds /*
105983e68189SMatt Fleming  * We play games with efi_enabled so that the compiler will, if
106083e68189SMatt Fleming  * possible, remove EFI-related code altogether.
10611da177e4SLinus Torvalds  */
106283e68189SMatt Fleming #define EFI_BOOT		0	/* Were we booted from EFI? */
106383e68189SMatt Fleming #define EFI_CONFIG_TABLES	2	/* Can we use EFI config tables? */
106483e68189SMatt Fleming #define EFI_RUNTIME_SERVICES	3	/* Can we use runtime services? */
106583e68189SMatt Fleming #define EFI_MEMMAP		4	/* Can we use EFI memory map? */
106683e68189SMatt Fleming #define EFI_64BIT		5	/* Is the firmware 64-bit? */
10679f27bc54SDaniel Kiper #define EFI_PARAVIRT		6	/* Access is via a paravirt interface */
10689f27bc54SDaniel Kiper #define EFI_ARCH_1		7	/* First arch-specific bit */
1069fed6cefeSBorislav Petkov #define EFI_DBG			8	/* Print additional debug info at runtime */
1070a1041713SArd Biesheuvel #define EFI_NX_PE_DATA		9	/* Can runtime data regions be mapped non-executable? */
1071a19ebf59SSai Praneeth #define EFI_MEM_ATTR		10	/* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
107283e68189SMatt Fleming 
10731da177e4SLinus Torvalds #ifdef CONFIG_EFI
10743e909599SMatt Fleming /*
10753e909599SMatt Fleming  * Test whether the above EFI_* bits are enabled.
10763e909599SMatt Fleming  */
10773e909599SMatt Fleming static inline bool efi_enabled(int feature)
107883e68189SMatt Fleming {
10793e909599SMatt Fleming 	return test_bit(feature, &efi.flags) != 0;
10803e909599SMatt Fleming }
10818562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
10823e909599SMatt Fleming #else
10833e909599SMatt Fleming static inline bool efi_enabled(int feature)
10843e909599SMatt Fleming {
10853e909599SMatt Fleming 	return false;
108683e68189SMatt Fleming }
10878562c99cSMatt Fleming static inline void
10888562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
108987615a34SMatt Fleming 
109087615a34SMatt Fleming static inline bool
109187615a34SMatt Fleming efi_capsule_pending(int *reset_type)
109287615a34SMatt Fleming {
109387615a34SMatt Fleming 	return false;
109487615a34SMatt Fleming }
10951da177e4SLinus Torvalds #endif
10961da177e4SLinus Torvalds 
1097806b0351SMatt Fleming extern int efi_status_to_err(efi_status_t status);
1098806b0351SMatt Fleming 
10991da177e4SLinus Torvalds /*
11001da177e4SLinus Torvalds  * Variable Attributes
11011da177e4SLinus Torvalds  */
11021da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
11031da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
11041da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
110541b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
110641b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
110741b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
110841b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE	0x0000000000000040
11091da177e4SLinus Torvalds 
111041b3254cSMatthew Garrett #define EFI_VARIABLE_MASK 	(EFI_VARIABLE_NON_VOLATILE | \
111141b3254cSMatthew Garrett 				EFI_VARIABLE_BOOTSERVICE_ACCESS | \
111241b3254cSMatthew Garrett 				EFI_VARIABLE_RUNTIME_ACCESS | \
111341b3254cSMatthew Garrett 				EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
111441b3254cSMatthew Garrett 				EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
111541b3254cSMatthew Garrett 				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
111641b3254cSMatthew Garrett 				EFI_VARIABLE_APPEND_WRITE)
11171da177e4SLinus Torvalds /*
1118e14ab23dSMatt Fleming  * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
1119e14ab23dSMatt Fleming  * not including trailing NUL
1120e14ab23dSMatt Fleming  */
1121ba7e34b1SAndy Shevchenko #define EFI_VARIABLE_GUID_LEN	UUID_STRING_LEN
1122e14ab23dSMatt Fleming 
1123e14ab23dSMatt Fleming /*
1124e2527a7cSMatt Fleming  * The type of search to perform when calling boottime->locate_handle
1125e2527a7cSMatt Fleming  */
1126e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES			0
1127e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1128e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL			2
1129e2527a7cSMatt Fleming 
1130e2527a7cSMatt Fleming /*
11311da177e4SLinus Torvalds  * EFI Device Path information
11321da177e4SLinus Torvalds  */
11331da177e4SLinus Torvalds #define EFI_DEV_HW			0x01
11341da177e4SLinus Torvalds #define  EFI_DEV_PCI				 1
11351da177e4SLinus Torvalds #define  EFI_DEV_PCCARD				 2
11361da177e4SLinus Torvalds #define  EFI_DEV_MEM_MAPPED			 3
11371da177e4SLinus Torvalds #define  EFI_DEV_VENDOR				 4
11381da177e4SLinus Torvalds #define  EFI_DEV_CONTROLLER			 5
11391da177e4SLinus Torvalds #define EFI_DEV_ACPI			0x02
11401da177e4SLinus Torvalds #define   EFI_DEV_BASIC_ACPI			 1
11411da177e4SLinus Torvalds #define   EFI_DEV_EXPANDED_ACPI			 2
11421da177e4SLinus Torvalds #define EFI_DEV_MSG			0x03
11431da177e4SLinus Torvalds #define   EFI_DEV_MSG_ATAPI			 1
11441da177e4SLinus Torvalds #define   EFI_DEV_MSG_SCSI			 2
11451da177e4SLinus Torvalds #define   EFI_DEV_MSG_FC			 3
11461da177e4SLinus Torvalds #define   EFI_DEV_MSG_1394			 4
11471da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB			 5
11481da177e4SLinus Torvalds #define   EFI_DEV_MSG_USB_CLASS			15
11491da177e4SLinus Torvalds #define   EFI_DEV_MSG_I20			 6
11501da177e4SLinus Torvalds #define   EFI_DEV_MSG_MAC			11
11511da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV4			12
11521da177e4SLinus Torvalds #define   EFI_DEV_MSG_IPV6			13
11531da177e4SLinus Torvalds #define   EFI_DEV_MSG_INFINIBAND		 9
11541da177e4SLinus Torvalds #define   EFI_DEV_MSG_UART			14
11551da177e4SLinus Torvalds #define   EFI_DEV_MSG_VENDOR			10
11561da177e4SLinus Torvalds #define EFI_DEV_MEDIA			0x04
11571da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_HARD_DRIVE		 1
11581da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_CDROM			 2
11591da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_VENDOR			 3
11601da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_FILE			 4
11611da177e4SLinus Torvalds #define   EFI_DEV_MEDIA_PROTOCOL		 5
11621da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT		0x05
11631da177e4SLinus Torvalds #define EFI_DEV_END_PATH		0x7F
11641da177e4SLinus Torvalds #define EFI_DEV_END_PATH2		0xFF
11651da177e4SLinus Torvalds #define   EFI_DEV_END_INSTANCE			0x01
11661da177e4SLinus Torvalds #define   EFI_DEV_END_ENTIRE			0xFF
11671da177e4SLinus Torvalds 
11681da177e4SLinus Torvalds struct efi_generic_dev_path {
11691da177e4SLinus Torvalds 	u8 type;
11701da177e4SLinus Torvalds 	u8 sub_type;
11711da177e4SLinus Torvalds 	u16 length;
11721da177e4SLinus Torvalds } __attribute ((packed));
11731da177e4SLinus Torvalds 
117446cd4b75SLukas Wunner struct efi_dev_path {
117546cd4b75SLukas Wunner 	u8 type;	/* can be replaced with unnamed */
117646cd4b75SLukas Wunner 	u8 sub_type;	/* struct efi_generic_dev_path; */
117746cd4b75SLukas Wunner 	u16 length;	/* once we've moved to -std=c11 */
117846cd4b75SLukas Wunner 	union {
117946cd4b75SLukas Wunner 		struct {
118046cd4b75SLukas Wunner 			u32 hid;
118146cd4b75SLukas Wunner 			u32 uid;
118246cd4b75SLukas Wunner 		} acpi;
118346cd4b75SLukas Wunner 		struct {
118446cd4b75SLukas Wunner 			u8 fn;
118546cd4b75SLukas Wunner 			u8 dev;
118646cd4b75SLukas Wunner 		} pci;
118746cd4b75SLukas Wunner 	};
118846cd4b75SLukas Wunner } __attribute ((packed));
118946cd4b75SLukas Wunner 
119046cd4b75SLukas Wunner #if IS_ENABLED(CONFIG_EFI_DEV_PATH_PARSER)
119146cd4b75SLukas Wunner struct device *efi_get_device_by_path(struct efi_dev_path **node, size_t *len);
119246cd4b75SLukas Wunner #endif
119346cd4b75SLukas Wunner 
11944a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
11954a3575fdSHuang, Ying {
11964a3575fdSHuang, Ying 	*npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
11974a3575fdSHuang, Ying 	*addr &= PAGE_MASK;
11984a3575fdSHuang, Ying }
11994a3575fdSHuang, Ying 
120004851772SMatt Fleming /*
12014fc756bdSMike Waychison  * EFI Variable support.
12024fc756bdSMike Waychison  *
12034fc756bdSMike Waychison  * Different firmware drivers can expose their EFI-like variables using
12044fc756bdSMike Waychison  * the following.
12054fc756bdSMike Waychison  */
12064fc756bdSMike Waychison 
12074fc756bdSMike Waychison struct efivar_operations {
12084fc756bdSMike Waychison 	efi_get_variable_t *get_variable;
12094fc756bdSMike Waychison 	efi_get_next_variable_t *get_next_variable;
12104fc756bdSMike Waychison 	efi_set_variable_t *set_variable;
121170d2a3cfSArd Biesheuvel 	efi_set_variable_t *set_variable_nonblocking;
1212a6e4d5a0SMatt Fleming 	efi_query_variable_store_t *query_variable_store;
12134fc756bdSMike Waychison };
12144fc756bdSMike Waychison 
12154fc756bdSMike Waychison struct efivars {
12164fc756bdSMike Waychison 	struct kset *kset;
1217605e70c7SLee, Chun-Yi 	struct kobject *kobject;
12184fc756bdSMike Waychison 	const struct efivar_operations *ops;
12194fc756bdSMike Waychison };
12204fc756bdSMike Waychison 
1221e14ab23dSMatt Fleming /*
1222e14ab23dSMatt Fleming  * The maximum size of VariableName + Data = 1024
1223e14ab23dSMatt Fleming  * Therefore, it's reasonable to save that much
1224e14ab23dSMatt Fleming  * space in each part of the structure,
1225e14ab23dSMatt Fleming  * and we use a page for reading/writing.
1226e14ab23dSMatt Fleming  */
1227e14ab23dSMatt Fleming 
1228a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN	1024
1229a5d92ad3SMatt Fleming 
1230e14ab23dSMatt Fleming struct efi_variable {
1231a5d92ad3SMatt Fleming 	efi_char16_t  VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)];
1232e14ab23dSMatt Fleming 	efi_guid_t    VendorGuid;
1233e14ab23dSMatt Fleming 	unsigned long DataSize;
1234e14ab23dSMatt Fleming 	__u8          Data[1024];
1235e14ab23dSMatt Fleming 	efi_status_t  Status;
1236e14ab23dSMatt Fleming 	__u32         Attributes;
1237e14ab23dSMatt Fleming } __attribute__((packed));
1238e14ab23dSMatt Fleming 
1239e14ab23dSMatt Fleming struct efivar_entry {
1240e14ab23dSMatt Fleming 	struct efi_variable var;
1241e14ab23dSMatt Fleming 	struct list_head list;
1242e14ab23dSMatt Fleming 	struct kobject kobj;
1243e0d59733SSeiji Aguchi 	bool scanning;
1244e0d59733SSeiji Aguchi 	bool deleting;
1245e14ab23dSMatt Fleming };
1246e14ab23dSMatt Fleming 
1247db4545d9SLukas Wunner typedef struct {
1248677703ceSMatt Fleming 	u32 reset;
1249677703ceSMatt Fleming 	u32 output_string;
1250677703ceSMatt Fleming 	u32 test_string;
1251db4545d9SLukas Wunner } efi_simple_text_output_protocol_32_t;
1252677703ceSMatt Fleming 
1253db4545d9SLukas Wunner typedef struct {
1254677703ceSMatt Fleming 	u64 reset;
1255677703ceSMatt Fleming 	u64 output_string;
1256677703ceSMatt Fleming 	u64 test_string;
1257db4545d9SLukas Wunner } efi_simple_text_output_protocol_64_t;
1258ed37ddffSRoy Franz 
1259ed37ddffSRoy Franz struct efi_simple_text_output_protocol {
1260ed37ddffSRoy Franz 	void *reset;
1261ed37ddffSRoy Franz 	efi_status_t (*output_string)(void *, void *);
1262ed37ddffSRoy Franz 	void *test_string;
1263ed37ddffSRoy Franz };
1264ed37ddffSRoy Franz 
1265fc372064SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
1266fc372064SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
1267fc372064SArd Biesheuvel #define PIXEL_BIT_MASK					2
1268fc372064SArd Biesheuvel #define PIXEL_BLT_ONLY					3
1269fc372064SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
1270fc372064SArd Biesheuvel 
1271fc372064SArd Biesheuvel struct efi_pixel_bitmask {
1272fc372064SArd Biesheuvel 	u32 red_mask;
1273fc372064SArd Biesheuvel 	u32 green_mask;
1274fc372064SArd Biesheuvel 	u32 blue_mask;
1275fc372064SArd Biesheuvel 	u32 reserved_mask;
1276fc372064SArd Biesheuvel };
1277fc372064SArd Biesheuvel 
1278fc372064SArd Biesheuvel struct efi_graphics_output_mode_info {
1279fc372064SArd Biesheuvel 	u32 version;
1280fc372064SArd Biesheuvel 	u32 horizontal_resolution;
1281fc372064SArd Biesheuvel 	u32 vertical_resolution;
1282fc372064SArd Biesheuvel 	int pixel_format;
1283fc372064SArd Biesheuvel 	struct efi_pixel_bitmask pixel_information;
1284fc372064SArd Biesheuvel 	u32 pixels_per_scan_line;
1285fc372064SArd Biesheuvel } __packed;
1286fc372064SArd Biesheuvel 
1287fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode_32 {
1288fc372064SArd Biesheuvel 	u32 max_mode;
1289fc372064SArd Biesheuvel 	u32 mode;
1290fc372064SArd Biesheuvel 	u32 info;
1291fc372064SArd Biesheuvel 	u32 size_of_info;
1292fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1293fc372064SArd Biesheuvel 	u32 frame_buffer_size;
1294fc372064SArd Biesheuvel } __packed;
1295fc372064SArd Biesheuvel 
1296fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode_64 {
1297fc372064SArd Biesheuvel 	u32 max_mode;
1298fc372064SArd Biesheuvel 	u32 mode;
1299fc372064SArd Biesheuvel 	u64 info;
1300fc372064SArd Biesheuvel 	u64 size_of_info;
1301fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1302fc372064SArd Biesheuvel 	u64 frame_buffer_size;
1303fc372064SArd Biesheuvel } __packed;
1304fc372064SArd Biesheuvel 
1305fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode {
1306fc372064SArd Biesheuvel 	u32 max_mode;
1307fc372064SArd Biesheuvel 	u32 mode;
1308fc372064SArd Biesheuvel 	unsigned long info;
1309fc372064SArd Biesheuvel 	unsigned long size_of_info;
1310fc372064SArd Biesheuvel 	u64 frame_buffer_base;
1311fc372064SArd Biesheuvel 	unsigned long frame_buffer_size;
1312fc372064SArd Biesheuvel } __packed;
1313fc372064SArd Biesheuvel 
1314fc372064SArd Biesheuvel struct efi_graphics_output_protocol_32 {
1315fc372064SArd Biesheuvel 	u32 query_mode;
1316fc372064SArd Biesheuvel 	u32 set_mode;
1317fc372064SArd Biesheuvel 	u32 blt;
1318fc372064SArd Biesheuvel 	u32 mode;
1319fc372064SArd Biesheuvel };
1320fc372064SArd Biesheuvel 
1321fc372064SArd Biesheuvel struct efi_graphics_output_protocol_64 {
1322fc372064SArd Biesheuvel 	u64 query_mode;
1323fc372064SArd Biesheuvel 	u64 set_mode;
1324fc372064SArd Biesheuvel 	u64 blt;
1325fc372064SArd Biesheuvel 	u64 mode;
1326fc372064SArd Biesheuvel };
1327fc372064SArd Biesheuvel 
1328fc372064SArd Biesheuvel struct efi_graphics_output_protocol {
1329fc372064SArd Biesheuvel 	unsigned long query_mode;
1330fc372064SArd Biesheuvel 	unsigned long set_mode;
1331fc372064SArd Biesheuvel 	unsigned long blt;
1332fc372064SArd Biesheuvel 	struct efi_graphics_output_protocol_mode *mode;
1333fc372064SArd Biesheuvel };
1334fc372064SArd Biesheuvel 
1335fc372064SArd Biesheuvel typedef efi_status_t (*efi_graphics_output_protocol_query_mode)(
1336fc372064SArd Biesheuvel 	struct efi_graphics_output_protocol *, u32, unsigned long *,
1337fc372064SArd Biesheuvel 	struct efi_graphics_output_mode_info **);
1338fc372064SArd Biesheuvel 
133904851772SMatt Fleming extern struct list_head efivar_sysfs_list;
134004851772SMatt Fleming 
134104851772SMatt Fleming static inline void
134204851772SMatt Fleming efivar_unregister(struct efivar_entry *var)
134304851772SMatt Fleming {
134404851772SMatt Fleming 	kobject_put(&var->kobj);
134504851772SMatt Fleming }
134604851772SMatt Fleming 
1347e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars,
13484fc756bdSMike Waychison 		     const struct efivar_operations *ops,
1349e14ab23dSMatt Fleming 		     struct kobject *kobject);
1350e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars);
1351e14ab23dSMatt Fleming struct kobject *efivars_kobject(void);
1352e14ab23dSMatt Fleming 
1353e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
13541cfd6316SJulia Lawall 		void *data, bool duplicates, struct list_head *head);
1355e14ab23dSMatt Fleming 
135621b3ddd3SSylvain Chouleur int efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
135721b3ddd3SSylvain Chouleur int efivar_entry_remove(struct efivar_entry *entry);
1358e14ab23dSMatt Fleming 
1359e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry);
1360e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry);
1361e14ab23dSMatt Fleming 
1362e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
13638a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
13648a415b8cSMatt Fleming 		       unsigned long *size, void *data);
1365e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1366e14ab23dSMatt Fleming 		     unsigned long *size, void *data);
1367e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
1368e14ab23dSMatt Fleming 		     unsigned long size, void *data, struct list_head *head);
1369e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
1370e14ab23dSMatt Fleming 			      unsigned long *size, void *data, bool *set);
1371e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
1372e14ab23dSMatt Fleming 			  bool block, unsigned long size, void *data);
1373e14ab23dSMatt Fleming 
137421b3ddd3SSylvain Chouleur int efivar_entry_iter_begin(void);
1375e14ab23dSMatt Fleming void efivar_entry_iter_end(void);
1376e14ab23dSMatt Fleming 
1377e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1378e14ab23dSMatt Fleming 			struct list_head *head, void *data,
1379e14ab23dSMatt Fleming 			struct efivar_entry **prev);
1380e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1381e14ab23dSMatt Fleming 		      struct list_head *head, void *data);
1382e14ab23dSMatt Fleming 
1383e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
1384e14ab23dSMatt Fleming 				       struct list_head *head, bool remove);
1385e14ab23dSMatt Fleming 
13868282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
13878282f5d9SPeter Jones 		     unsigned long data_size);
1388ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
1389ed8b0de5SPeter Jones 				  size_t len);
1390e14ab23dSMatt Fleming 
1391a9499fa7STom Gundersen extern struct work_struct efivar_work;
139204851772SMatt Fleming void efivar_run_worker(void);
139304851772SMatt Fleming 
1394a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
1395e14ab23dSMatt Fleming int efivars_sysfs_init(void);
13964fc756bdSMike Waychison 
1397e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024
1398e0d59733SSeiji Aguchi 
13994fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */
1400f0133f3cSMatt Fleming extern bool efi_capsule_pending(int *reset_type);
1401f0133f3cSMatt Fleming 
1402f0133f3cSMatt Fleming extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
1403f0133f3cSMatt Fleming 				 size_t size, int *reset);
1404f0133f3cSMatt Fleming 
1405f0133f3cSMatt Fleming extern int efi_capsule_update(efi_capsule_header_t *capsule,
1406f0133f3cSMatt Fleming 			      struct page **pages);
14074fc756bdSMike Waychison 
1408926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP
1409926172d4SDave Young int efi_runtime_map_init(struct kobject *);
14106a2c20e7SVivek Goyal int efi_get_runtime_map_size(void);
14116a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void);
14126a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz);
1413926172d4SDave Young #else
1414926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj)
1415926172d4SDave Young {
1416926172d4SDave Young 	return 0;
1417926172d4SDave Young }
1418926172d4SDave Young 
14196a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void)
14206a2c20e7SVivek Goyal {
14216a2c20e7SVivek Goyal 	return 0;
14226a2c20e7SVivek Goyal }
14236a2c20e7SVivek Goyal 
14246a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void)
14256a2c20e7SVivek Goyal {
14266a2c20e7SVivek Goyal 	return 0;
14276a2c20e7SVivek Goyal }
14286a2c20e7SVivek Goyal 
14296a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
14306a2c20e7SVivek Goyal {
14316a2c20e7SVivek Goyal 	return 0;
14326a2c20e7SVivek Goyal }
14336a2c20e7SVivek Goyal 
1434926172d4SDave Young #endif
1435926172d4SDave Young 
1436bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */
1437bd669475SArd Biesheuvel 
1438bd669475SArd Biesheuvel #define pr_efi(sys_table, msg)     efi_printk(sys_table, "EFI stub: "msg)
1439bd669475SArd Biesheuvel #define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg)
1440bd669475SArd Biesheuvel 
1441bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str);
1442bd669475SArd Biesheuvel 
1443bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
1444bd669475SArd Biesheuvel 	      unsigned long addr);
1445bd669475SArd Biesheuvel 
1446bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,
1447bd669475SArd Biesheuvel 			  efi_loaded_image_t *image, int *cmd_line_len);
1448bd669475SArd Biesheuvel 
1449bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
1450dadb57abSJeffrey Hugo 				struct efi_boot_memmap *map);
1451bd669475SArd Biesheuvel 
1452bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
1453bd669475SArd Biesheuvel 			   unsigned long size, unsigned long align,
1454bd669475SArd Biesheuvel 			   unsigned long *addr);
1455bd669475SArd Biesheuvel 
1456bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
1457bd669475SArd Biesheuvel 			    unsigned long size, unsigned long align,
1458bd669475SArd Biesheuvel 			    unsigned long *addr, unsigned long max);
1459bd669475SArd Biesheuvel 
1460bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
1461bd669475SArd Biesheuvel 				 unsigned long *image_addr,
1462bd669475SArd Biesheuvel 				 unsigned long image_size,
1463bd669475SArd Biesheuvel 				 unsigned long alloc_size,
1464bd669475SArd Biesheuvel 				 unsigned long preferred_addr,
1465bd669475SArd Biesheuvel 				 unsigned long alignment);
1466bd669475SArd Biesheuvel 
1467bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
1468bd669475SArd Biesheuvel 				  efi_loaded_image_t *image,
1469bd669475SArd Biesheuvel 				  char *cmd_line, char *option_string,
1470bd669475SArd Biesheuvel 				  unsigned long max_addr,
1471bd669475SArd Biesheuvel 				  unsigned long *load_addr,
1472bd669475SArd Biesheuvel 				  unsigned long *load_size);
1473bd669475SArd Biesheuvel 
14745a17dae4SMatt Fleming efi_status_t efi_parse_options(char *cmdline);
14755a17dae4SMatt Fleming 
14762c23b73cSArd Biesheuvel efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg,
14772c23b73cSArd Biesheuvel 			   struct screen_info *si, efi_guid_t *proto,
14782c23b73cSArd Biesheuvel 			   unsigned long size);
14792c23b73cSArd Biesheuvel 
1480b2e0a54aSDave Young bool efi_runtime_disabled(void);
148180e75596SAlex Thorlton extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
148280e75596SAlex Thorlton 
1483*de8cb458SDavid Howells enum efi_secureboot_mode {
1484*de8cb458SDavid Howells 	efi_secureboot_mode_unset,
1485*de8cb458SDavid Howells 	efi_secureboot_mode_unknown,
1486*de8cb458SDavid Howells 	efi_secureboot_mode_disabled,
1487*de8cb458SDavid Howells 	efi_secureboot_mode_enabled,
1488*de8cb458SDavid Howells };
1489*de8cb458SDavid Howells enum efi_secureboot_mode efi_get_secureboot(efi_system_table_t *sys_table);
1490*de8cb458SDavid Howells 
149180e75596SAlex Thorlton /*
149280e75596SAlex Thorlton  * Arch code can implement the following three template macros, avoiding
149380e75596SAlex Thorlton  * reptition for the void/non-void return cases of {__,}efi_call_virt():
149480e75596SAlex Thorlton  *
149580e75596SAlex Thorlton  *  * arch_efi_call_virt_setup()
149680e75596SAlex Thorlton  *
149780e75596SAlex Thorlton  *    Sets up the environment for the call (e.g. switching page tables,
149880e75596SAlex Thorlton  *    allowing kernel-mode use of floating point, if required).
149980e75596SAlex Thorlton  *
150080e75596SAlex Thorlton  *  * arch_efi_call_virt()
150180e75596SAlex Thorlton  *
150280e75596SAlex Thorlton  *    Performs the call. The last expression in the macro must be the call
150380e75596SAlex Thorlton  *    itself, allowing the logic to be shared by the void and non-void
150480e75596SAlex Thorlton  *    cases.
150580e75596SAlex Thorlton  *
150680e75596SAlex Thorlton  *  * arch_efi_call_virt_teardown()
150780e75596SAlex Thorlton  *
150880e75596SAlex Thorlton  *    Restores the usual kernel environment once the call has returned.
150980e75596SAlex Thorlton  */
151080e75596SAlex Thorlton 
151180e75596SAlex Thorlton #define efi_call_virt_pointer(p, f, args...)				\
151280e75596SAlex Thorlton ({									\
151380e75596SAlex Thorlton 	efi_status_t __s;						\
151480e75596SAlex Thorlton 	unsigned long __flags;						\
151580e75596SAlex Thorlton 									\
151680e75596SAlex Thorlton 	arch_efi_call_virt_setup();					\
151780e75596SAlex Thorlton 									\
151880e75596SAlex Thorlton 	local_save_flags(__flags);					\
151980e75596SAlex Thorlton 	__s = arch_efi_call_virt(p, f, args);				\
152080e75596SAlex Thorlton 	efi_call_virt_check_flags(__flags, __stringify(f));		\
152180e75596SAlex Thorlton 									\
152280e75596SAlex Thorlton 	arch_efi_call_virt_teardown();					\
152380e75596SAlex Thorlton 									\
152480e75596SAlex Thorlton 	__s;								\
152580e75596SAlex Thorlton })
152680e75596SAlex Thorlton 
152780e75596SAlex Thorlton #define __efi_call_virt_pointer(p, f, args...)				\
152880e75596SAlex Thorlton ({									\
152980e75596SAlex Thorlton 	unsigned long __flags;						\
153080e75596SAlex Thorlton 									\
153180e75596SAlex Thorlton 	arch_efi_call_virt_setup();					\
153280e75596SAlex Thorlton 									\
153380e75596SAlex Thorlton 	local_save_flags(__flags);					\
153480e75596SAlex Thorlton 	arch_efi_call_virt(p, f, args);					\
153580e75596SAlex Thorlton 	efi_call_virt_check_flags(__flags, __stringify(f));		\
153680e75596SAlex Thorlton 									\
153780e75596SAlex Thorlton 	arch_efi_call_virt_teardown();					\
153880e75596SAlex Thorlton })
153980e75596SAlex Thorlton 
1540fc07716bSJeffrey Hugo typedef efi_status_t (*efi_exit_boot_map_processing)(
1541fc07716bSJeffrey Hugo 	efi_system_table_t *sys_table_arg,
1542fc07716bSJeffrey Hugo 	struct efi_boot_memmap *map,
1543fc07716bSJeffrey Hugo 	void *priv);
1544fc07716bSJeffrey Hugo 
1545fc07716bSJeffrey Hugo efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table,
1546fc07716bSJeffrey Hugo 				    void *handle,
1547fc07716bSJeffrey Hugo 				    struct efi_boot_memmap *map,
1548fc07716bSJeffrey Hugo 				    void *priv,
1549fc07716bSJeffrey Hugo 				    efi_exit_boot_map_processing priv_func);
155063625988SArd Biesheuvel 
155163625988SArd Biesheuvel struct linux_efi_random_seed {
155263625988SArd Biesheuvel 	u32	size;
155363625988SArd Biesheuvel 	u8	bits[];
155463625988SArd Biesheuvel };
155563625988SArd Biesheuvel 
15561da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */
1557