1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2f4f75ad5SArd Biesheuvel 
3f4f75ad5SArd Biesheuvel #ifndef _DRIVERS_FIRMWARE_EFI_EFISTUB_H
4f4f75ad5SArd Biesheuvel #define _DRIVERS_FIRMWARE_EFI_EFISTUB_H
5f4f75ad5SArd Biesheuvel 
62c7d1e30SArvind Sankar #include <linux/compiler.h>
70b767353SArvind Sankar #include <linux/efi.h>
80b767353SArvind Sankar #include <linux/kernel.h>
923d5b73fSArvind Sankar #include <linux/kern_levels.h>
100b767353SArvind Sankar #include <linux/types.h>
110b767353SArvind Sankar #include <asm/efi.h>
120b767353SArvind Sankar 
13f4f75ad5SArd Biesheuvel /* error code which can't be mistaken for valid address */
14f4f75ad5SArd Biesheuvel #define EFI_ERROR	(~0UL)
15f4f75ad5SArd Biesheuvel 
1607e83dbbSArd Biesheuvel /*
1707e83dbbSArd Biesheuvel  * __init annotations should not be used in the EFI stub, since the code is
1807e83dbbSArd Biesheuvel  * either included in the decompressor (x86, ARM) where they have no effect,
1907e83dbbSArd Biesheuvel  * or the whole stub is __init annotated at the section level (arm64), by
2007e83dbbSArd Biesheuvel  * renaming the sections, in which case the __init annotation will be
2107e83dbbSArd Biesheuvel  * redundant, and will result in section names like .init.init.text, and our
2207e83dbbSArd Biesheuvel  * linker script does not expect that.
2307e83dbbSArd Biesheuvel  */
2407e83dbbSArd Biesheuvel #undef __init
2507e83dbbSArd Biesheuvel 
26a6a14469SArd Biesheuvel /*
27a6a14469SArd Biesheuvel  * Allow the platform to override the allocation granularity: this allows
28a6a14469SArd Biesheuvel  * systems that have the capability to run with a larger page size to deal
29a6a14469SArd Biesheuvel  * with the allocations for initrd and fdt more efficiently.
30a6a14469SArd Biesheuvel  */
31a6a14469SArd Biesheuvel #ifndef EFI_ALLOC_ALIGN
32a6a14469SArd Biesheuvel #define EFI_ALLOC_ALIGN		EFI_PAGE_SIZE
33a6a14469SArd Biesheuvel #endif
34a6a14469SArd Biesheuvel 
35980771f6SArd Biesheuvel extern bool efi_nochunk;
36980771f6SArd Biesheuvel extern bool efi_nokaslr;
37980771f6SArd Biesheuvel extern bool efi_noinitrd;
3823d5b73fSArvind Sankar extern int efi_loglevel;
39980771f6SArd Biesheuvel extern bool efi_novamap;
40eeff7d63SArd Biesheuvel 
41ccc27ae7SArd Biesheuvel extern const efi_system_table_t *efi_system_table;
422fcdad2aSArd Biesheuvel 
436e99d321SArd Biesheuvel efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
446e99d321SArd Biesheuvel 				   efi_system_table_t *sys_table_arg);
456e99d321SArd Biesheuvel 
46de8c5520SArvind Sankar #ifndef ARCH_HAS_EFISTUB_WRAPPERS
47de8c5520SArvind Sankar 
4822090f84SArd Biesheuvel #define efi_is_native()		(true)
49de8c5520SArvind Sankar #define efi_bs_call(func, ...)	efi_system_table->boottime->func(__VA_ARGS__)
50de8c5520SArvind Sankar #define efi_rt_call(func, ...)	efi_system_table->runtime->func(__VA_ARGS__)
5122090f84SArd Biesheuvel #define efi_table_attr(inst, attr)	(inst->attr)
5222090f84SArd Biesheuvel #define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
53de8c5520SArvind Sankar 
5422090f84SArd Biesheuvel #endif
5522090f84SArd Biesheuvel 
5623d5b73fSArvind Sankar #define efi_info(fmt, ...) \
5723d5b73fSArvind Sankar 	efi_printk(KERN_INFO fmt, ##__VA_ARGS__)
5823d5b73fSArvind Sankar #define efi_err(fmt, ...) \
5923d5b73fSArvind Sankar 	efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
6023d5b73fSArvind Sankar #define efi_debug(fmt, ...) \
6123d5b73fSArvind Sankar 	efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
6260f38de7SArd Biesheuvel 
63ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */
64ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var
65ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \
66ac9aff8eSIngo Molnar 	fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var))
67ac9aff8eSIngo Molnar #endif
68ac9aff8eSIngo Molnar 
69ac9aff8eSIngo Molnar #ifndef fdt_setprop_var
70ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \
71ac9aff8eSIngo Molnar 	fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var))
72ac9aff8eSIngo Molnar #endif
73ac9aff8eSIngo Molnar 
74966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...)				\
75966291f6SArd Biesheuvel 	efi_rt_call(get_variable, (efi_char16_t *)(name),	\
76966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
77966291f6SArd Biesheuvel 
78966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...)				\
79966291f6SArd Biesheuvel 	efi_rt_call(set_variable, (efi_char16_t *)(name),	\
80966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
81966291f6SArd Biesheuvel 
828166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx)					\
838166ec09SArd Biesheuvel 	(efi_is_native() ? (array)[idx] 				\
848166ec09SArd Biesheuvel 		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
858166ec09SArd Biesheuvel 
868166ec09SArd Biesheuvel #define efi_get_handle_num(size)					\
878166ec09SArd Biesheuvel 	((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
888166ec09SArd Biesheuvel 
898166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i)			\
908166ec09SArd Biesheuvel 	for (i = 0;							\
918166ec09SArd Biesheuvel 	     i < efi_get_handle_num(size) &&				\
928166ec09SArd Biesheuvel 		((handle = efi_get_handle_at((array), i)) || true);	\
938166ec09SArd Biesheuvel 	     i++)
948166ec09SArd Biesheuvel 
95eed4e019SArvind Sankar static inline
96eed4e019SArvind Sankar void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)
97eed4e019SArvind Sankar {
98eed4e019SArvind Sankar 	*lo = lower_32_bits(data);
99eed4e019SArvind Sankar 	*hi = upper_32_bits(data);
100eed4e019SArvind Sankar }
101eed4e019SArvind Sankar 
1028166ec09SArd Biesheuvel /*
1038166ec09SArd Biesheuvel  * Allocation types for calls to boottime->allocate_pages.
1048166ec09SArd Biesheuvel  */
1058166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES		0
1068166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS	1
1078166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS		2
1088166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE		3
1098166ec09SArd Biesheuvel 
1108166ec09SArd Biesheuvel /*
1118166ec09SArd Biesheuvel  * The type of search to perform when calling boottime->locate_handle
1128166ec09SArd Biesheuvel  */
1138166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES			0
1148166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1158166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL			2
1168166ec09SArd Biesheuvel 
117fd626195SLenny Szubowicz /*
1189b47c527SArvind Sankar  * boottime->stall takes the time period in microseconds
1199b47c527SArvind Sankar  */
1209b47c527SArvind Sankar #define EFI_USEC_PER_SEC		1000000
1219b47c527SArvind Sankar 
1229b47c527SArvind Sankar /*
1239b47c527SArvind Sankar  * boottime->set_timer takes the time in 100ns units
1249b47c527SArvind Sankar  */
1259b47c527SArvind Sankar #define EFI_100NSEC_PER_USEC	((u64)10)
1269b47c527SArvind Sankar 
127d1343da3SIngo Molnar /*
128fd626195SLenny Szubowicz  * An efi_boot_memmap is used by efi_get_memory_map() to return the
129fd626195SLenny Szubowicz  * EFI memory map in a dynamically allocated buffer.
130fd626195SLenny Szubowicz  *
131fd626195SLenny Szubowicz  * The buffer allocated for the EFI memory map includes extra room for
132fd626195SLenny Szubowicz  * a minimum of EFI_MMAP_NR_SLACK_SLOTS additional EFI memory descriptors.
133fd626195SLenny Szubowicz  * This facilitates the reuse of the EFI memory map buffer when a second
134fd626195SLenny Szubowicz  * call to ExitBootServices() is needed because of intervening changes to
135fd626195SLenny Szubowicz  * the EFI memory map. Other related structures, e.g. x86 e820ext, need
136fd626195SLenny Szubowicz  * to factor in this headroom requirement as well.
137fd626195SLenny Szubowicz  */
138fd626195SLenny Szubowicz #define EFI_MMAP_NR_SLACK_SLOTS	8
139fd626195SLenny Szubowicz 
1408166ec09SArd Biesheuvel struct efi_boot_memmap {
1418166ec09SArd Biesheuvel 	efi_memory_desc_t	**map;
1428166ec09SArd Biesheuvel 	unsigned long		*map_size;
1438166ec09SArd Biesheuvel 	unsigned long		*desc_size;
1448166ec09SArd Biesheuvel 	u32			*desc_ver;
1458166ec09SArd Biesheuvel 	unsigned long		*key_ptr;
1468166ec09SArd Biesheuvel 	unsigned long		*buff_size;
1478166ec09SArd Biesheuvel };
1488166ec09SArd Biesheuvel 
149abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t;
150abd26868SArd Biesheuvel 
1519b47c527SArvind Sankar typedef void *efi_event_t;
1529b47c527SArvind Sankar /* Note that notifications won't work in mixed mode */
1539b47c527SArvind Sankar typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *);
1549b47c527SArvind Sankar 
1559b47c527SArvind Sankar #define EFI_EVT_TIMER		0x80000000U
1569b47c527SArvind Sankar #define EFI_EVT_RUNTIME		0x40000000U
1579b47c527SArvind Sankar #define EFI_EVT_NOTIFY_WAIT	0x00000100U
1589b47c527SArvind Sankar #define EFI_EVT_NOTIFY_SIGNAL	0x00000200U
1599b47c527SArvind Sankar 
1609b47c527SArvind Sankar /*
1619b47c527SArvind Sankar  * boottime->wait_for_event takes an array of events as input.
1629b47c527SArvind Sankar  * Provide a helper to set it up correctly for mixed mode.
1639b47c527SArvind Sankar  */
1649b47c527SArvind Sankar static inline
1659b47c527SArvind Sankar void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event)
1669b47c527SArvind Sankar {
1679b47c527SArvind Sankar 	if (efi_is_native())
1689b47c527SArvind Sankar 		events[idx] = event;
1699b47c527SArvind Sankar 	else
1709b47c527SArvind Sankar 		((u32 *)events)[idx] = (u32)(unsigned long)event;
1719b47c527SArvind Sankar }
1729b47c527SArvind Sankar 
1739b47c527SArvind Sankar #define EFI_TPL_APPLICATION	4
1749b47c527SArvind Sankar #define EFI_TPL_CALLBACK	8
1759b47c527SArvind Sankar #define EFI_TPL_NOTIFY		16
1769b47c527SArvind Sankar #define EFI_TPL_HIGH_LEVEL	31
1779b47c527SArvind Sankar 
1789b47c527SArvind Sankar typedef enum {
1799b47c527SArvind Sankar 	EfiTimerCancel,
1809b47c527SArvind Sankar 	EfiTimerPeriodic,
1819b47c527SArvind Sankar 	EfiTimerRelative
1829b47c527SArvind Sankar } EFI_TIMER_DELAY;
1839b47c527SArvind Sankar 
1848166ec09SArd Biesheuvel /*
1858166ec09SArd Biesheuvel  * EFI Boot Services table
1868166ec09SArd Biesheuvel  */
1878166ec09SArd Biesheuvel union efi_boot_services {
1888166ec09SArd Biesheuvel 	struct {
1898166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
1908166ec09SArd Biesheuvel 		void *raise_tpl;
1918166ec09SArd Biesheuvel 		void *restore_tpl;
1928166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
1938166ec09SArd Biesheuvel 							efi_physical_addr_t *);
1948166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
1958166ec09SArd Biesheuvel 						    unsigned long);
1968166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
1978166ec09SArd Biesheuvel 							unsigned long *,
1988166ec09SArd Biesheuvel 							unsigned long *, u32 *);
1998166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
2008166ec09SArd Biesheuvel 						       void **);
2018166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pool)(void *);
2029b47c527SArvind Sankar 		efi_status_t (__efiapi *create_event)(u32, unsigned long,
2039b47c527SArvind Sankar 						      efi_event_notify_t, void *,
2049b47c527SArvind Sankar 						      efi_event_t *);
2059b47c527SArvind Sankar 		efi_status_t (__efiapi *set_timer)(efi_event_t,
2069b47c527SArvind Sankar 						  EFI_TIMER_DELAY, u64);
2079b47c527SArvind Sankar 		efi_status_t (__efiapi *wait_for_event)(unsigned long,
2089b47c527SArvind Sankar 							efi_event_t *,
2099b47c527SArvind Sankar 							unsigned long *);
2108166ec09SArd Biesheuvel 		void *signal_event;
2119b47c527SArvind Sankar 		efi_status_t (__efiapi *close_event)(efi_event_t);
2128166ec09SArd Biesheuvel 		void *check_event;
2138166ec09SArd Biesheuvel 		void *install_protocol_interface;
2148166ec09SArd Biesheuvel 		void *reinstall_protocol_interface;
2158166ec09SArd Biesheuvel 		void *uninstall_protocol_interface;
2168166ec09SArd Biesheuvel 		efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
2178166ec09SArd Biesheuvel 							 efi_guid_t *, void **);
2188166ec09SArd Biesheuvel 		void *__reserved;
2198166ec09SArd Biesheuvel 		void *register_protocol_notify;
2208166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
2218166ec09SArd Biesheuvel 						       void *, unsigned long *,
2228166ec09SArd Biesheuvel 						       efi_handle_t *);
223abd26868SArd Biesheuvel 		efi_status_t (__efiapi *locate_device_path)(efi_guid_t *,
224abd26868SArd Biesheuvel 							    efi_device_path_protocol_t **,
225abd26868SArd Biesheuvel 							    efi_handle_t *);
2268166ec09SArd Biesheuvel 		efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
2278166ec09SArd Biesheuvel 								     void *);
2288166ec09SArd Biesheuvel 		void *load_image;
2298166ec09SArd Biesheuvel 		void *start_image;
2303b8f44fcSArd Biesheuvel 		efi_status_t __noreturn (__efiapi *exit)(efi_handle_t,
2313b8f44fcSArd Biesheuvel 							 efi_status_t,
2323b8f44fcSArd Biesheuvel 							 unsigned long,
2333b8f44fcSArd Biesheuvel 							 efi_char16_t *);
2348166ec09SArd Biesheuvel 		void *unload_image;
2358166ec09SArd Biesheuvel 		efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
2368166ec09SArd Biesheuvel 							    unsigned long);
2378166ec09SArd Biesheuvel 		void *get_next_monotonic_count;
2389b47c527SArvind Sankar 		efi_status_t (__efiapi *stall)(unsigned long);
2398166ec09SArd Biesheuvel 		void *set_watchdog_timer;
2408166ec09SArd Biesheuvel 		void *connect_controller;
2418166ec09SArd Biesheuvel 		efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
2428166ec09SArd Biesheuvel 							       efi_handle_t,
2438166ec09SArd Biesheuvel 							       efi_handle_t);
2448166ec09SArd Biesheuvel 		void *open_protocol;
2458166ec09SArd Biesheuvel 		void *close_protocol;
2468166ec09SArd Biesheuvel 		void *open_protocol_information;
2478166ec09SArd Biesheuvel 		void *protocols_per_handle;
2488166ec09SArd Biesheuvel 		void *locate_handle_buffer;
2498166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
2508166ec09SArd Biesheuvel 							 void **);
2518166ec09SArd Biesheuvel 		void *install_multiple_protocol_interfaces;
2528166ec09SArd Biesheuvel 		void *uninstall_multiple_protocol_interfaces;
2538166ec09SArd Biesheuvel 		void *calculate_crc32;
2548166ec09SArd Biesheuvel 		void *copy_mem;
2558166ec09SArd Biesheuvel 		void *set_mem;
2568166ec09SArd Biesheuvel 		void *create_event_ex;
2578166ec09SArd Biesheuvel 	};
2588166ec09SArd Biesheuvel 	struct {
2598166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
2608166ec09SArd Biesheuvel 		u32 raise_tpl;
2618166ec09SArd Biesheuvel 		u32 restore_tpl;
2628166ec09SArd Biesheuvel 		u32 allocate_pages;
2638166ec09SArd Biesheuvel 		u32 free_pages;
2648166ec09SArd Biesheuvel 		u32 get_memory_map;
2658166ec09SArd Biesheuvel 		u32 allocate_pool;
2668166ec09SArd Biesheuvel 		u32 free_pool;
2678166ec09SArd Biesheuvel 		u32 create_event;
2688166ec09SArd Biesheuvel 		u32 set_timer;
2698166ec09SArd Biesheuvel 		u32 wait_for_event;
2708166ec09SArd Biesheuvel 		u32 signal_event;
2718166ec09SArd Biesheuvel 		u32 close_event;
2728166ec09SArd Biesheuvel 		u32 check_event;
2738166ec09SArd Biesheuvel 		u32 install_protocol_interface;
2748166ec09SArd Biesheuvel 		u32 reinstall_protocol_interface;
2758166ec09SArd Biesheuvel 		u32 uninstall_protocol_interface;
2768166ec09SArd Biesheuvel 		u32 handle_protocol;
2778166ec09SArd Biesheuvel 		u32 __reserved;
2788166ec09SArd Biesheuvel 		u32 register_protocol_notify;
2798166ec09SArd Biesheuvel 		u32 locate_handle;
2808166ec09SArd Biesheuvel 		u32 locate_device_path;
2818166ec09SArd Biesheuvel 		u32 install_configuration_table;
2828166ec09SArd Biesheuvel 		u32 load_image;
2838166ec09SArd Biesheuvel 		u32 start_image;
2848166ec09SArd Biesheuvel 		u32 exit;
2858166ec09SArd Biesheuvel 		u32 unload_image;
2868166ec09SArd Biesheuvel 		u32 exit_boot_services;
2878166ec09SArd Biesheuvel 		u32 get_next_monotonic_count;
2888166ec09SArd Biesheuvel 		u32 stall;
2898166ec09SArd Biesheuvel 		u32 set_watchdog_timer;
2908166ec09SArd Biesheuvel 		u32 connect_controller;
2918166ec09SArd Biesheuvel 		u32 disconnect_controller;
2928166ec09SArd Biesheuvel 		u32 open_protocol;
2938166ec09SArd Biesheuvel 		u32 close_protocol;
2948166ec09SArd Biesheuvel 		u32 open_protocol_information;
2958166ec09SArd Biesheuvel 		u32 protocols_per_handle;
2968166ec09SArd Biesheuvel 		u32 locate_handle_buffer;
2978166ec09SArd Biesheuvel 		u32 locate_protocol;
2988166ec09SArd Biesheuvel 		u32 install_multiple_protocol_interfaces;
2998166ec09SArd Biesheuvel 		u32 uninstall_multiple_protocol_interfaces;
3008166ec09SArd Biesheuvel 		u32 calculate_crc32;
3018166ec09SArd Biesheuvel 		u32 copy_mem;
3028166ec09SArd Biesheuvel 		u32 set_mem;
3038166ec09SArd Biesheuvel 		u32 create_event_ex;
3048166ec09SArd Biesheuvel 	} mixed_mode;
3058166ec09SArd Biesheuvel };
3068166ec09SArd Biesheuvel 
307c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t;
308c2d0b470SArd Biesheuvel 
309c2d0b470SArd Biesheuvel union efi_uga_draw_protocol {
310c2d0b470SArd Biesheuvel 	struct {
311c2d0b470SArd Biesheuvel 		efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *,
312c2d0b470SArd Biesheuvel 						  u32*, u32*, u32*, u32*);
313c2d0b470SArd Biesheuvel 		void *set_mode;
314c2d0b470SArd Biesheuvel 		void *blt;
315c2d0b470SArd Biesheuvel 	};
316c2d0b470SArd Biesheuvel 	struct {
317c2d0b470SArd Biesheuvel 		u32 get_mode;
318c2d0b470SArd Biesheuvel 		u32 set_mode;
319c2d0b470SArd Biesheuvel 		u32 blt;
320c2d0b470SArd Biesheuvel 	} mixed_mode;
321c2d0b470SArd Biesheuvel };
322c2d0b470SArd Biesheuvel 
3239b47c527SArvind Sankar typedef struct {
3249b47c527SArvind Sankar 	u16 scan_code;
3259b47c527SArvind Sankar 	efi_char16_t unicode_char;
3269b47c527SArvind Sankar } efi_input_key_t;
3279b47c527SArvind Sankar 
3289b47c527SArvind Sankar union efi_simple_text_input_protocol {
3299b47c527SArvind Sankar 	struct {
3309b47c527SArvind Sankar 		void *reset;
3319b47c527SArvind Sankar 		efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *,
3329b47c527SArvind Sankar 							efi_input_key_t *);
3339b47c527SArvind Sankar 		efi_event_t wait_for_key;
3349b47c527SArvind Sankar 	};
3359b47c527SArvind Sankar 	struct {
3369b47c527SArvind Sankar 		u32 reset;
3379b47c527SArvind Sankar 		u32 read_keystroke;
3389b47c527SArvind Sankar 		u32 wait_for_key;
3399b47c527SArvind Sankar 	} mixed_mode;
3409b47c527SArvind Sankar };
3419b47c527SArvind Sankar 
34214c574f3SArvind Sankar efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key);
34314c574f3SArvind Sankar 
3448166ec09SArd Biesheuvel union efi_simple_text_output_protocol {
3458166ec09SArd Biesheuvel 	struct {
3468166ec09SArd Biesheuvel 		void *reset;
3478166ec09SArd Biesheuvel 		efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
3488166ec09SArd Biesheuvel 						       efi_char16_t *);
3498166ec09SArd Biesheuvel 		void *test_string;
3508166ec09SArd Biesheuvel 	};
3518166ec09SArd Biesheuvel 	struct {
3528166ec09SArd Biesheuvel 		u32 reset;
3538166ec09SArd Biesheuvel 		u32 output_string;
3548166ec09SArd Biesheuvel 		u32 test_string;
3558166ec09SArd Biesheuvel 	} mixed_mode;
3568166ec09SArd Biesheuvel };
3578166ec09SArd Biesheuvel 
3588166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
3598166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
3608166ec09SArd Biesheuvel #define PIXEL_BIT_MASK					2
3618166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY					3
3628166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
3638166ec09SArd Biesheuvel 
3648166ec09SArd Biesheuvel typedef struct {
3658166ec09SArd Biesheuvel 	u32 red_mask;
3668166ec09SArd Biesheuvel 	u32 green_mask;
3678166ec09SArd Biesheuvel 	u32 blue_mask;
3688166ec09SArd Biesheuvel 	u32 reserved_mask;
3698166ec09SArd Biesheuvel } efi_pixel_bitmask_t;
3708166ec09SArd Biesheuvel 
3718166ec09SArd Biesheuvel typedef struct {
3728166ec09SArd Biesheuvel 	u32 version;
3738166ec09SArd Biesheuvel 	u32 horizontal_resolution;
3748166ec09SArd Biesheuvel 	u32 vertical_resolution;
3758166ec09SArd Biesheuvel 	int pixel_format;
3768166ec09SArd Biesheuvel 	efi_pixel_bitmask_t pixel_information;
3778166ec09SArd Biesheuvel 	u32 pixels_per_scan_line;
3788166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t;
3798166ec09SArd Biesheuvel 
3808166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
3818166ec09SArd Biesheuvel 
3828166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode {
3838166ec09SArd Biesheuvel 	struct {
3848166ec09SArd Biesheuvel 		u32 max_mode;
3858166ec09SArd Biesheuvel 		u32 mode;
3868166ec09SArd Biesheuvel 		efi_graphics_output_mode_info_t *info;
3878166ec09SArd Biesheuvel 		unsigned long size_of_info;
3888166ec09SArd Biesheuvel 		efi_physical_addr_t frame_buffer_base;
3898166ec09SArd Biesheuvel 		unsigned long frame_buffer_size;
3908166ec09SArd Biesheuvel 	};
3918166ec09SArd Biesheuvel 	struct {
3928166ec09SArd Biesheuvel 		u32 max_mode;
3938166ec09SArd Biesheuvel 		u32 mode;
3948166ec09SArd Biesheuvel 		u32 info;
3958166ec09SArd Biesheuvel 		u32 size_of_info;
3968166ec09SArd Biesheuvel 		u64 frame_buffer_base;
3978166ec09SArd Biesheuvel 		u32 frame_buffer_size;
3988166ec09SArd Biesheuvel 	} mixed_mode;
3998166ec09SArd Biesheuvel };
4008166ec09SArd Biesheuvel 
4018166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
4028166ec09SArd Biesheuvel 
4038166ec09SArd Biesheuvel union efi_graphics_output_protocol {
4048166ec09SArd Biesheuvel 	struct {
405b4b89a02SArvind Sankar 		efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *,
406b4b89a02SArvind Sankar 						    u32, unsigned long *,
407b4b89a02SArvind Sankar 						    efi_graphics_output_mode_info_t **);
408b4b89a02SArvind Sankar 		efi_status_t (__efiapi *set_mode)  (efi_graphics_output_protocol_t *, u32);
4098166ec09SArd Biesheuvel 		void *blt;
4108166ec09SArd Biesheuvel 		efi_graphics_output_protocol_mode_t *mode;
4118166ec09SArd Biesheuvel 	};
4128166ec09SArd Biesheuvel 	struct {
4138166ec09SArd Biesheuvel 		u32 query_mode;
4148166ec09SArd Biesheuvel 		u32 set_mode;
4158166ec09SArd Biesheuvel 		u32 blt;
4168166ec09SArd Biesheuvel 		u32 mode;
4178166ec09SArd Biesheuvel 	} mixed_mode;
4188166ec09SArd Biesheuvel };
4198166ec09SArd Biesheuvel 
420f7b85b33SArd Biesheuvel typedef union {
421f7b85b33SArd Biesheuvel 	struct {
422a46a290aSArd Biesheuvel 		u32			revision;
423a46a290aSArd Biesheuvel 		efi_handle_t		parent_handle;
424a46a290aSArd Biesheuvel 		efi_system_table_t	*system_table;
425a46a290aSArd Biesheuvel 		efi_handle_t		device_handle;
426a46a290aSArd Biesheuvel 		void			*file_path;
427a46a290aSArd Biesheuvel 		void			*reserved;
428a46a290aSArd Biesheuvel 		u32			load_options_size;
429a46a290aSArd Biesheuvel 		void			*load_options;
430a46a290aSArd Biesheuvel 		void			*image_base;
431a46a290aSArd Biesheuvel 		__aligned_u64		image_size;
432a46a290aSArd Biesheuvel 		unsigned int		image_code_type;
433a46a290aSArd Biesheuvel 		unsigned int		image_data_type;
434a46a290aSArd Biesheuvel 		efi_status_t		(__efiapi *unload)(efi_handle_t image_handle);
435f7b85b33SArd Biesheuvel 	};
436f7b85b33SArd Biesheuvel 	struct {
437f7b85b33SArd Biesheuvel 		u32		revision;
438f7b85b33SArd Biesheuvel 		u32		parent_handle;
439f7b85b33SArd Biesheuvel 		u32		system_table;
440f7b85b33SArd Biesheuvel 		u32		device_handle;
441f7b85b33SArd Biesheuvel 		u32		file_path;
442f7b85b33SArd Biesheuvel 		u32		reserved;
443f7b85b33SArd Biesheuvel 		u32		load_options_size;
444f7b85b33SArd Biesheuvel 		u32		load_options;
445f7b85b33SArd Biesheuvel 		u32		image_base;
446f7b85b33SArd Biesheuvel 		__aligned_u64	image_size;
447f7b85b33SArd Biesheuvel 		u32		image_code_type;
448f7b85b33SArd Biesheuvel 		u32		image_data_type;
449f7b85b33SArd Biesheuvel 		u32		unload;
450f7b85b33SArd Biesheuvel 	} mixed_mode;
451a46a290aSArd Biesheuvel } efi_loaded_image_t;
452a46a290aSArd Biesheuvel 
453a46a290aSArd Biesheuvel typedef struct {
454a46a290aSArd Biesheuvel 	u64			size;
455a46a290aSArd Biesheuvel 	u64			file_size;
456a46a290aSArd Biesheuvel 	u64			phys_size;
457a46a290aSArd Biesheuvel 	efi_time_t		create_time;
458a46a290aSArd Biesheuvel 	efi_time_t		last_access_time;
459a46a290aSArd Biesheuvel 	efi_time_t		modification_time;
460a46a290aSArd Biesheuvel 	__aligned_u64		attribute;
4619302c1bbSArd Biesheuvel 	efi_char16_t		filename[];
462a46a290aSArd Biesheuvel } efi_file_info_t;
463a46a290aSArd Biesheuvel 
464a46a290aSArd Biesheuvel typedef struct efi_file_protocol efi_file_protocol_t;
465a46a290aSArd Biesheuvel 
466a46a290aSArd Biesheuvel struct efi_file_protocol {
467a46a290aSArd Biesheuvel 	u64		revision;
468a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *open)	(efi_file_protocol_t *,
469a46a290aSArd Biesheuvel 						 efi_file_protocol_t **,
470a46a290aSArd Biesheuvel 						 efi_char16_t *, u64, u64);
471a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *close)	(efi_file_protocol_t *);
472a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *delete)	(efi_file_protocol_t *);
473a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *read)	(efi_file_protocol_t *,
474a46a290aSArd Biesheuvel 						 unsigned long *, void *);
475a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *write)	(efi_file_protocol_t *,
476a46a290aSArd Biesheuvel 						 unsigned long, void *);
477a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_position)(efi_file_protocol_t *, u64 *);
478a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_position)(efi_file_protocol_t *, u64);
479a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_info)	(efi_file_protocol_t *,
480a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long *,
481a46a290aSArd Biesheuvel 						 void *);
482a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_info)	(efi_file_protocol_t *,
483a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long,
484a46a290aSArd Biesheuvel 						 void *);
485a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *flush)	(efi_file_protocol_t *);
486a46a290aSArd Biesheuvel };
487a46a290aSArd Biesheuvel 
488a46a290aSArd Biesheuvel typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t;
489a46a290aSArd Biesheuvel 
490a46a290aSArd Biesheuvel struct efi_simple_file_system_protocol {
491a46a290aSArd Biesheuvel 	u64	revision;
492a46a290aSArd Biesheuvel 	int	(__efiapi *open_volume)(efi_simple_file_system_protocol_t *,
493a46a290aSArd Biesheuvel 					efi_file_protocol_t **);
494a46a290aSArd Biesheuvel };
495a46a290aSArd Biesheuvel 
496a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ	0x0000000000000001
497a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE	0x0000000000000002
498a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE	0x8000000000000000
499a46a290aSArd Biesheuvel 
5008166ec09SArd Biesheuvel typedef enum {
5018166ec09SArd Biesheuvel 	EfiPciIoWidthUint8,
5028166ec09SArd Biesheuvel 	EfiPciIoWidthUint16,
5038166ec09SArd Biesheuvel 	EfiPciIoWidthUint32,
5048166ec09SArd Biesheuvel 	EfiPciIoWidthUint64,
5058166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint8,
5068166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint16,
5078166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint32,
5088166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint64,
5098166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint8,
5108166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint16,
5118166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint32,
5128166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint64,
5138166ec09SArd Biesheuvel 	EfiPciIoWidthMaximum
5148166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH;
5158166ec09SArd Biesheuvel 
5168166ec09SArd Biesheuvel typedef enum {
5178166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationGet,
5188166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSet,
5198166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationEnable,
5208166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationDisable,
5218166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSupported,
5228166ec09SArd Biesheuvel     EfiPciIoAttributeOperationMaximum
5238166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
5248166ec09SArd Biesheuvel 
5258166ec09SArd Biesheuvel typedef struct {
5268166ec09SArd Biesheuvel 	u32 read;
5278166ec09SArd Biesheuvel 	u32 write;
5288166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t;
5298166ec09SArd Biesheuvel 
5308166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
5318166ec09SArd Biesheuvel 
5328166ec09SArd Biesheuvel typedef
5338166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
5348166ec09SArd Biesheuvel 						   EFI_PCI_IO_PROTOCOL_WIDTH,
5358166ec09SArd Biesheuvel 						   u32 offset,
5368166ec09SArd Biesheuvel 						   unsigned long count,
5378166ec09SArd Biesheuvel 						   void *buffer);
5388166ec09SArd Biesheuvel 
5398166ec09SArd Biesheuvel typedef struct {
5408166ec09SArd Biesheuvel 	void *read;
5418166ec09SArd Biesheuvel 	void *write;
5428166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t;
5438166ec09SArd Biesheuvel 
5448166ec09SArd Biesheuvel typedef struct {
5458166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t read;
5468166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t write;
5478166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t;
5488166ec09SArd Biesheuvel 
5498166ec09SArd Biesheuvel union efi_pci_io_protocol {
5508166ec09SArd Biesheuvel 	struct {
5518166ec09SArd Biesheuvel 		void *poll_mem;
5528166ec09SArd Biesheuvel 		void *poll_io;
5538166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t mem;
5548166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t io;
5558166ec09SArd Biesheuvel 		efi_pci_io_protocol_config_access_t pci;
5568166ec09SArd Biesheuvel 		void *copy_mem;
5578166ec09SArd Biesheuvel 		void *map;
5588166ec09SArd Biesheuvel 		void *unmap;
5598166ec09SArd Biesheuvel 		void *allocate_buffer;
5608166ec09SArd Biesheuvel 		void *free_buffer;
5618166ec09SArd Biesheuvel 		void *flush;
5628166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
5638166ec09SArd Biesheuvel 						      unsigned long *segment_nr,
5648166ec09SArd Biesheuvel 						      unsigned long *bus_nr,
5658166ec09SArd Biesheuvel 						      unsigned long *device_nr,
5668166ec09SArd Biesheuvel 						      unsigned long *func_nr);
5678166ec09SArd Biesheuvel 		void *attributes;
5688166ec09SArd Biesheuvel 		void *get_bar_attributes;
5698166ec09SArd Biesheuvel 		void *set_bar_attributes;
5708166ec09SArd Biesheuvel 		uint64_t romsize;
5718166ec09SArd Biesheuvel 		void *romimage;
5728166ec09SArd Biesheuvel 	};
5738166ec09SArd Biesheuvel 	struct {
5748166ec09SArd Biesheuvel 		u32 poll_mem;
5758166ec09SArd Biesheuvel 		u32 poll_io;
5768166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t mem;
5778166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t io;
5788166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t pci;
5798166ec09SArd Biesheuvel 		u32 copy_mem;
5808166ec09SArd Biesheuvel 		u32 map;
5818166ec09SArd Biesheuvel 		u32 unmap;
5828166ec09SArd Biesheuvel 		u32 allocate_buffer;
5838166ec09SArd Biesheuvel 		u32 free_buffer;
5848166ec09SArd Biesheuvel 		u32 flush;
5858166ec09SArd Biesheuvel 		u32 get_location;
5868166ec09SArd Biesheuvel 		u32 attributes;
5878166ec09SArd Biesheuvel 		u32 get_bar_attributes;
5888166ec09SArd Biesheuvel 		u32 set_bar_attributes;
5898166ec09SArd Biesheuvel 		u64 romsize;
5908166ec09SArd Biesheuvel 		u32 romimage;
5918166ec09SArd Biesheuvel 	} mixed_mode;
5928166ec09SArd Biesheuvel };
5938166ec09SArd Biesheuvel 
5948166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
5958166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
5968166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
5978166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
5988166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
5998166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
6008166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
6018166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
6028166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
6038166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
6048166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
6058166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
6068166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
6078166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
6088166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
6098166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
6108166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
6118166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
6128166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
6138166ec09SArd Biesheuvel 
6148166ec09SArd Biesheuvel struct efi_dev_path;
6158166ec09SArd Biesheuvel 
6168166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t;
6178166ec09SArd Biesheuvel 
6188166ec09SArd Biesheuvel union apple_properties_protocol {
6198166ec09SArd Biesheuvel 	struct {
6208166ec09SArd Biesheuvel 		unsigned long version;
6218166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
6228166ec09SArd Biesheuvel 					     struct efi_dev_path *,
6238166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32 *);
6248166ec09SArd Biesheuvel 		efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
6258166ec09SArd Biesheuvel 					     struct efi_dev_path *,
6268166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32);
6278166ec09SArd Biesheuvel 		efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
6288166ec09SArd Biesheuvel 					     struct efi_dev_path *,
6298166ec09SArd Biesheuvel 					     efi_char16_t *);
6308166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
6318166ec09SArd Biesheuvel 						 void *buffer, u32 *);
6328166ec09SArd Biesheuvel 	};
6338166ec09SArd Biesheuvel 	struct {
6348166ec09SArd Biesheuvel 		u32 version;
6358166ec09SArd Biesheuvel 		u32 get;
6368166ec09SArd Biesheuvel 		u32 set;
6378166ec09SArd Biesheuvel 		u32 del;
6388166ec09SArd Biesheuvel 		u32 get_all;
6398166ec09SArd Biesheuvel 	} mixed_mode;
6408166ec09SArd Biesheuvel };
6418166ec09SArd Biesheuvel 
6428166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format;
6438166ec09SArd Biesheuvel 
6448166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
6458166ec09SArd Biesheuvel 
6468166ec09SArd Biesheuvel union efi_tcg2_protocol {
6478166ec09SArd Biesheuvel 	struct {
6488166ec09SArd Biesheuvel 		void *get_capability;
6498166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_event_log)(efi_handle_t,
6508166ec09SArd Biesheuvel 						       efi_tcg2_event_log_format,
6518166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
6528166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
6538166ec09SArd Biesheuvel 						       efi_bool_t *);
6548166ec09SArd Biesheuvel 		void *hash_log_extend_event;
6558166ec09SArd Biesheuvel 		void *submit_command;
6568166ec09SArd Biesheuvel 		void *get_active_pcr_banks;
6578166ec09SArd Biesheuvel 		void *set_active_pcr_banks;
6588166ec09SArd Biesheuvel 		void *get_result_of_set_active_pcr_banks;
6598166ec09SArd Biesheuvel 	};
6608166ec09SArd Biesheuvel 	struct {
6618166ec09SArd Biesheuvel 		u32 get_capability;
6628166ec09SArd Biesheuvel 		u32 get_event_log;
6638166ec09SArd Biesheuvel 		u32 hash_log_extend_event;
6648166ec09SArd Biesheuvel 		u32 submit_command;
6658166ec09SArd Biesheuvel 		u32 get_active_pcr_banks;
6668166ec09SArd Biesheuvel 		u32 set_active_pcr_banks;
6678166ec09SArd Biesheuvel 		u32 get_result_of_set_active_pcr_banks;
6688166ec09SArd Biesheuvel 	} mixed_mode;
6698166ec09SArd Biesheuvel };
6708166ec09SArd Biesheuvel 
6712931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t;
6722931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t;
6732931d526SArd Biesheuvel 
6742931d526SArd Biesheuvel union efi_load_file_protocol {
6752931d526SArd Biesheuvel 	struct {
6762931d526SArd Biesheuvel 		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,
6772931d526SArd Biesheuvel 						   efi_device_path_protocol_t *,
6782931d526SArd Biesheuvel 						   bool, unsigned long *, void *);
6792931d526SArd Biesheuvel 	};
6802931d526SArd Biesheuvel 	struct {
6812931d526SArd Biesheuvel 		u32 load_file;
6822931d526SArd Biesheuvel 	} mixed_mode;
6832931d526SArd Biesheuvel };
6842931d526SArd Biesheuvel 
6858166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void);
6868166ec09SArd Biesheuvel 
6878166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)(
6888166ec09SArd Biesheuvel 	struct efi_boot_memmap *map,
6898166ec09SArd Biesheuvel 	void *priv);
6908166ec09SArd Biesheuvel 
6918166ec09SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle,
6928166ec09SArd Biesheuvel 				    struct efi_boot_memmap *map,
6938166ec09SArd Biesheuvel 				    void *priv,
6948166ec09SArd Biesheuvel 				    efi_exit_boot_map_processing priv_func);
6958166ec09SArd Biesheuvel 
6968166ec09SArd Biesheuvel efi_status_t allocate_new_fdt_and_exit_boot(void *handle,
6978166ec09SArd Biesheuvel 					    unsigned long *new_fdt_addr,
6988166ec09SArd Biesheuvel 					    unsigned long max_addr,
6998166ec09SArd Biesheuvel 					    u64 initrd_addr, u64 initrd_size,
7008166ec09SArd Biesheuvel 					    char *cmdline_ptr,
7018166ec09SArd Biesheuvel 					    unsigned long fdt_addr,
7028166ec09SArd Biesheuvel 					    unsigned long fdt_size);
7038166ec09SArd Biesheuvel 
7048166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size);
7058166ec09SArd Biesheuvel 
7068166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
7078166ec09SArd Biesheuvel 		     unsigned long desc_size, efi_memory_desc_t *runtime_map,
7088166ec09SArd Biesheuvel 		     int *count);
7098166ec09SArd Biesheuvel 
7108166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);
7118166ec09SArd Biesheuvel 
7128166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align,
7138166ec09SArd Biesheuvel 			      unsigned long *addr, unsigned long random_seed);
7148166ec09SArd Biesheuvel 
7158166ec09SArd Biesheuvel efi_status_t check_platform_features(void);
7168166ec09SArd Biesheuvel 
7178166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid);
7188166ec09SArd Biesheuvel 
719cb8c90a0SArvind Sankar /* NOTE: These functions do not print a trailing newline after the string */
720cb8c90a0SArvind Sankar void efi_char16_puts(efi_char16_t *);
721cb8c90a0SArvind Sankar void efi_puts(const char *str);
7228166ec09SArd Biesheuvel 
7232c7d1e30SArvind Sankar __printf(1, 2) int efi_printk(char const *fmt, ...);
7248166ec09SArd Biesheuvel 
7258166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr);
7268166ec09SArd Biesheuvel 
72727cd5511SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
7288166ec09SArd Biesheuvel 
7298166ec09SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
7308166ec09SArd Biesheuvel 
7318166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
7328166ec09SArd Biesheuvel 				unsigned long max);
7338166ec09SArd Biesheuvel 
73443b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
73543b1df0eSArd Biesheuvel 					unsigned long max, unsigned long align);
73643b1df0eSArd Biesheuvel 
7378166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr,
7388166ec09SArd Biesheuvel 				 unsigned long image_size,
7398166ec09SArd Biesheuvel 				 unsigned long alloc_size,
7408166ec09SArd Biesheuvel 				 unsigned long preferred_addr,
7418166ec09SArd Biesheuvel 				 unsigned long alignment,
7428166ec09SArd Biesheuvel 				 unsigned long min_addr);
7438166ec09SArd Biesheuvel 
7448166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline);
7458166ec09SArd Biesheuvel 
746fffb6804SArvind Sankar void efi_parse_option_graphics(char *option);
747fffb6804SArvind Sankar 
7488166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
7498166ec09SArd Biesheuvel 			   unsigned long size);
7508166ec09SArd Biesheuvel 
751cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
752cf6b8366SArd Biesheuvel 				  const efi_char16_t *optstr,
753cf6b8366SArd Biesheuvel 				  int optstr_size,
754cf6b8366SArd Biesheuvel 				  unsigned long soft_limit,
755cf6b8366SArd Biesheuvel 				  unsigned long hard_limit,
7569302c1bbSArd Biesheuvel 				  unsigned long *load_addr,
7579302c1bbSArd Biesheuvel 				  unsigned long *load_size);
7589302c1bbSArd Biesheuvel 
759cf6b8366SArd Biesheuvel 
760cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
761cf6b8366SArd Biesheuvel 					unsigned long *load_addr,
762cf6b8366SArd Biesheuvel 					unsigned long *load_size)
763cf6b8366SArd Biesheuvel {
764cf6b8366SArd Biesheuvel 	return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
765cf6b8366SArd Biesheuvel 				    ULONG_MAX, ULONG_MAX, load_addr, load_size);
766cf6b8366SArd Biesheuvel }
767cf6b8366SArd Biesheuvel 
768f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image,
7699302c1bbSArd Biesheuvel 			     unsigned long *load_addr,
7709302c1bbSArd Biesheuvel 			     unsigned long *load_size,
77131f5e546SArd Biesheuvel 			     unsigned long soft_limit,
772f61900fdSArvind Sankar 			     unsigned long hard_limit);
773ec93fc37SArd Biesheuvel 
774f4f75ad5SArd Biesheuvel #endif
775