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 
1307e83dbbSArd Biesheuvel /*
1407e83dbbSArd Biesheuvel  * __init annotations should not be used in the EFI stub, since the code is
1507e83dbbSArd Biesheuvel  * either included in the decompressor (x86, ARM) where they have no effect,
1607e83dbbSArd Biesheuvel  * or the whole stub is __init annotated at the section level (arm64), by
1707e83dbbSArd Biesheuvel  * renaming the sections, in which case the __init annotation will be
1807e83dbbSArd Biesheuvel  * redundant, and will result in section names like .init.init.text, and our
1907e83dbbSArd Biesheuvel  * linker script does not expect that.
2007e83dbbSArd Biesheuvel  */
2107e83dbbSArd Biesheuvel #undef __init
2207e83dbbSArd Biesheuvel 
23a6a14469SArd Biesheuvel /*
24a6a14469SArd Biesheuvel  * Allow the platform to override the allocation granularity: this allows
25a6a14469SArd Biesheuvel  * systems that have the capability to run with a larger page size to deal
26a6a14469SArd Biesheuvel  * with the allocations for initrd and fdt more efficiently.
27a6a14469SArd Biesheuvel  */
28a6a14469SArd Biesheuvel #ifndef EFI_ALLOC_ALIGN
29a6a14469SArd Biesheuvel #define EFI_ALLOC_ALIGN		EFI_PAGE_SIZE
30a6a14469SArd Biesheuvel #endif
31a6a14469SArd Biesheuvel 
32980771f6SArd Biesheuvel extern bool efi_nochunk;
33980771f6SArd Biesheuvel extern bool efi_nokaslr;
34980771f6SArd Biesheuvel extern bool efi_noinitrd;
3523d5b73fSArvind Sankar extern int efi_loglevel;
36980771f6SArd Biesheuvel extern bool efi_novamap;
37eeff7d63SArd Biesheuvel 
38ccc27ae7SArd Biesheuvel extern const efi_system_table_t *efi_system_table;
392fcdad2aSArd Biesheuvel 
406e99d321SArd Biesheuvel efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
416e99d321SArd Biesheuvel 				   efi_system_table_t *sys_table_arg);
426e99d321SArd Biesheuvel 
43de8c5520SArvind Sankar #ifndef ARCH_HAS_EFISTUB_WRAPPERS
44de8c5520SArvind Sankar 
4522090f84SArd Biesheuvel #define efi_is_native()		(true)
46de8c5520SArvind Sankar #define efi_bs_call(func, ...)	efi_system_table->boottime->func(__VA_ARGS__)
47de8c5520SArvind Sankar #define efi_rt_call(func, ...)	efi_system_table->runtime->func(__VA_ARGS__)
4822090f84SArd Biesheuvel #define efi_table_attr(inst, attr)	(inst->attr)
4922090f84SArd Biesheuvel #define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
50de8c5520SArvind Sankar 
5122090f84SArd Biesheuvel #endif
5222090f84SArd Biesheuvel 
5323d5b73fSArvind Sankar #define efi_info(fmt, ...) \
5423d5b73fSArvind Sankar 	efi_printk(KERN_INFO fmt, ##__VA_ARGS__)
55c1df5e0cSArvind Sankar #define efi_warn(fmt, ...) \
56c1df5e0cSArvind Sankar 	efi_printk(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
5723d5b73fSArvind Sankar #define efi_err(fmt, ...) \
5823d5b73fSArvind Sankar 	efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
5923d5b73fSArvind Sankar #define efi_debug(fmt, ...) \
6023d5b73fSArvind Sankar 	efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
6160f38de7SArd Biesheuvel 
62c1df5e0cSArvind Sankar #define efi_printk_once(fmt, ...) 		\
63c1df5e0cSArvind Sankar ({						\
64c1df5e0cSArvind Sankar 	static bool __print_once;		\
65c1df5e0cSArvind Sankar 	bool __ret_print_once = !__print_once;	\
66c1df5e0cSArvind Sankar 						\
67c1df5e0cSArvind Sankar 	if (!__print_once) {			\
68c1df5e0cSArvind Sankar 		__print_once = true;		\
69c1df5e0cSArvind Sankar 		efi_printk(fmt, ##__VA_ARGS__);	\
70c1df5e0cSArvind Sankar 	}					\
71c1df5e0cSArvind Sankar 	__ret_print_once;			\
72c1df5e0cSArvind Sankar })
73c1df5e0cSArvind Sankar 
74c1df5e0cSArvind Sankar #define efi_info_once(fmt, ...) \
75c1df5e0cSArvind Sankar 	efi_printk_once(KERN_INFO fmt, ##__VA_ARGS__)
76c1df5e0cSArvind Sankar #define efi_warn_once(fmt, ...) \
77c1df5e0cSArvind Sankar 	efi_printk_once(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
78c1df5e0cSArvind Sankar #define efi_err_once(fmt, ...) \
79c1df5e0cSArvind Sankar 	efi_printk_once(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
80c1df5e0cSArvind Sankar #define efi_debug_once(fmt, ...) \
81c1df5e0cSArvind Sankar 	efi_printk_once(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
82c1df5e0cSArvind Sankar 
83ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */
84ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var
85ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \
86ac9aff8eSIngo Molnar 	fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var))
87ac9aff8eSIngo Molnar #endif
88ac9aff8eSIngo Molnar 
89ac9aff8eSIngo Molnar #ifndef fdt_setprop_var
90ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \
91ac9aff8eSIngo Molnar 	fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var))
92ac9aff8eSIngo Molnar #endif
93ac9aff8eSIngo Molnar 
94966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...)				\
95966291f6SArd Biesheuvel 	efi_rt_call(get_variable, (efi_char16_t *)(name),	\
96966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
97966291f6SArd Biesheuvel 
98966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...)				\
99966291f6SArd Biesheuvel 	efi_rt_call(set_variable, (efi_char16_t *)(name),	\
100966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
101966291f6SArd Biesheuvel 
1028166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx)					\
1038166ec09SArd Biesheuvel 	(efi_is_native() ? (array)[idx] 				\
1048166ec09SArd Biesheuvel 		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
1058166ec09SArd Biesheuvel 
1068166ec09SArd Biesheuvel #define efi_get_handle_num(size)					\
1078166ec09SArd Biesheuvel 	((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
1088166ec09SArd Biesheuvel 
1098166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i)			\
1108166ec09SArd Biesheuvel 	for (i = 0;							\
1118166ec09SArd Biesheuvel 	     i < efi_get_handle_num(size) &&				\
1128166ec09SArd Biesheuvel 		((handle = efi_get_handle_at((array), i)) || true);	\
1138166ec09SArd Biesheuvel 	     i++)
1148166ec09SArd Biesheuvel 
115eed4e019SArvind Sankar static inline
116eed4e019SArvind Sankar void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)
117eed4e019SArvind Sankar {
118eed4e019SArvind Sankar 	*lo = lower_32_bits(data);
119eed4e019SArvind Sankar 	*hi = upper_32_bits(data);
120eed4e019SArvind Sankar }
121eed4e019SArvind Sankar 
1228166ec09SArd Biesheuvel /*
1238166ec09SArd Biesheuvel  * Allocation types for calls to boottime->allocate_pages.
1248166ec09SArd Biesheuvel  */
1258166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES		0
1268166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS	1
1278166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS		2
1288166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE		3
1298166ec09SArd Biesheuvel 
1308166ec09SArd Biesheuvel /*
1318166ec09SArd Biesheuvel  * The type of search to perform when calling boottime->locate_handle
1328166ec09SArd Biesheuvel  */
1338166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES			0
1348166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1358166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL			2
1368166ec09SArd Biesheuvel 
137fd626195SLenny Szubowicz /*
1389b47c527SArvind Sankar  * boottime->stall takes the time period in microseconds
1399b47c527SArvind Sankar  */
1409b47c527SArvind Sankar #define EFI_USEC_PER_SEC		1000000
1419b47c527SArvind Sankar 
1429b47c527SArvind Sankar /*
1439b47c527SArvind Sankar  * boottime->set_timer takes the time in 100ns units
1449b47c527SArvind Sankar  */
1459b47c527SArvind Sankar #define EFI_100NSEC_PER_USEC	((u64)10)
1469b47c527SArvind Sankar 
147d1343da3SIngo Molnar /*
148fd626195SLenny Szubowicz  * An efi_boot_memmap is used by efi_get_memory_map() to return the
149fd626195SLenny Szubowicz  * EFI memory map in a dynamically allocated buffer.
150fd626195SLenny Szubowicz  *
151fd626195SLenny Szubowicz  * The buffer allocated for the EFI memory map includes extra room for
152fd626195SLenny Szubowicz  * a minimum of EFI_MMAP_NR_SLACK_SLOTS additional EFI memory descriptors.
153fd626195SLenny Szubowicz  * This facilitates the reuse of the EFI memory map buffer when a second
154fd626195SLenny Szubowicz  * call to ExitBootServices() is needed because of intervening changes to
155fd626195SLenny Szubowicz  * the EFI memory map. Other related structures, e.g. x86 e820ext, need
156fd626195SLenny Szubowicz  * to factor in this headroom requirement as well.
157fd626195SLenny Szubowicz  */
158fd626195SLenny Szubowicz #define EFI_MMAP_NR_SLACK_SLOTS	8
159fd626195SLenny Szubowicz 
1608166ec09SArd Biesheuvel struct efi_boot_memmap {
1618166ec09SArd Biesheuvel 	efi_memory_desc_t	**map;
1628166ec09SArd Biesheuvel 	unsigned long		*map_size;
1638166ec09SArd Biesheuvel 	unsigned long		*desc_size;
1648166ec09SArd Biesheuvel 	u32			*desc_ver;
1658166ec09SArd Biesheuvel 	unsigned long		*key_ptr;
1668166ec09SArd Biesheuvel 	unsigned long		*buff_size;
1678166ec09SArd Biesheuvel };
1688166ec09SArd Biesheuvel 
169abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t;
170abd26868SArd Biesheuvel 
1719b47c527SArvind Sankar typedef void *efi_event_t;
1729b47c527SArvind Sankar /* Note that notifications won't work in mixed mode */
1739b47c527SArvind Sankar typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *);
1749b47c527SArvind Sankar 
1759b47c527SArvind Sankar #define EFI_EVT_TIMER		0x80000000U
1769b47c527SArvind Sankar #define EFI_EVT_RUNTIME		0x40000000U
1779b47c527SArvind Sankar #define EFI_EVT_NOTIFY_WAIT	0x00000100U
1789b47c527SArvind Sankar #define EFI_EVT_NOTIFY_SIGNAL	0x00000200U
1799b47c527SArvind Sankar 
1808c0a839cSHeinrich Schuchardt /**
1818c0a839cSHeinrich Schuchardt  * efi_set_event_at() - add event to events array
1828c0a839cSHeinrich Schuchardt  *
1838c0a839cSHeinrich Schuchardt  * @events:	array of UEFI events
1848c0a839cSHeinrich Schuchardt  * @ids:	index where to put the event in the array
1858c0a839cSHeinrich Schuchardt  * @event:	event to add to the aray
1868c0a839cSHeinrich Schuchardt  *
1878c0a839cSHeinrich Schuchardt  * boottime->wait_for_event() takes an array of events as input.
1889b47c527SArvind Sankar  * Provide a helper to set it up correctly for mixed mode.
1899b47c527SArvind Sankar  */
1909b47c527SArvind Sankar static inline
1919b47c527SArvind Sankar void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event)
1929b47c527SArvind Sankar {
1939b47c527SArvind Sankar 	if (efi_is_native())
1949b47c527SArvind Sankar 		events[idx] = event;
1959b47c527SArvind Sankar 	else
1969b47c527SArvind Sankar 		((u32 *)events)[idx] = (u32)(unsigned long)event;
1979b47c527SArvind Sankar }
1989b47c527SArvind Sankar 
1999b47c527SArvind Sankar #define EFI_TPL_APPLICATION	4
2009b47c527SArvind Sankar #define EFI_TPL_CALLBACK	8
2019b47c527SArvind Sankar #define EFI_TPL_NOTIFY		16
2029b47c527SArvind Sankar #define EFI_TPL_HIGH_LEVEL	31
2039b47c527SArvind Sankar 
2049b47c527SArvind Sankar typedef enum {
2059b47c527SArvind Sankar 	EfiTimerCancel,
2069b47c527SArvind Sankar 	EfiTimerPeriodic,
2079b47c527SArvind Sankar 	EfiTimerRelative
2089b47c527SArvind Sankar } EFI_TIMER_DELAY;
2099b47c527SArvind Sankar 
2108166ec09SArd Biesheuvel /*
2118166ec09SArd Biesheuvel  * EFI Boot Services table
2128166ec09SArd Biesheuvel  */
2138166ec09SArd Biesheuvel union efi_boot_services {
2148166ec09SArd Biesheuvel 	struct {
2158166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
2168166ec09SArd Biesheuvel 		void *raise_tpl;
2178166ec09SArd Biesheuvel 		void *restore_tpl;
2188166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
2198166ec09SArd Biesheuvel 							efi_physical_addr_t *);
2208166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
2218166ec09SArd Biesheuvel 						    unsigned long);
2228166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
2238166ec09SArd Biesheuvel 							unsigned long *,
2248166ec09SArd Biesheuvel 							unsigned long *, u32 *);
2258166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
2268166ec09SArd Biesheuvel 						       void **);
2278166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pool)(void *);
2289b47c527SArvind Sankar 		efi_status_t (__efiapi *create_event)(u32, unsigned long,
2299b47c527SArvind Sankar 						      efi_event_notify_t, void *,
2309b47c527SArvind Sankar 						      efi_event_t *);
2319b47c527SArvind Sankar 		efi_status_t (__efiapi *set_timer)(efi_event_t,
2329b47c527SArvind Sankar 						  EFI_TIMER_DELAY, u64);
2339b47c527SArvind Sankar 		efi_status_t (__efiapi *wait_for_event)(unsigned long,
2349b47c527SArvind Sankar 							efi_event_t *,
2359b47c527SArvind Sankar 							unsigned long *);
2368166ec09SArd Biesheuvel 		void *signal_event;
2379b47c527SArvind Sankar 		efi_status_t (__efiapi *close_event)(efi_event_t);
2388166ec09SArd Biesheuvel 		void *check_event;
2398166ec09SArd Biesheuvel 		void *install_protocol_interface;
2408166ec09SArd Biesheuvel 		void *reinstall_protocol_interface;
2418166ec09SArd Biesheuvel 		void *uninstall_protocol_interface;
2428166ec09SArd Biesheuvel 		efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
2438166ec09SArd Biesheuvel 							 efi_guid_t *, void **);
2448166ec09SArd Biesheuvel 		void *__reserved;
2458166ec09SArd Biesheuvel 		void *register_protocol_notify;
2468166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
2478166ec09SArd Biesheuvel 						       void *, unsigned long *,
2488166ec09SArd Biesheuvel 						       efi_handle_t *);
249abd26868SArd Biesheuvel 		efi_status_t (__efiapi *locate_device_path)(efi_guid_t *,
250abd26868SArd Biesheuvel 							    efi_device_path_protocol_t **,
251abd26868SArd Biesheuvel 							    efi_handle_t *);
2528166ec09SArd Biesheuvel 		efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
2538166ec09SArd Biesheuvel 								     void *);
2548166ec09SArd Biesheuvel 		void *load_image;
2558166ec09SArd Biesheuvel 		void *start_image;
2563b8f44fcSArd Biesheuvel 		efi_status_t __noreturn (__efiapi *exit)(efi_handle_t,
2573b8f44fcSArd Biesheuvel 							 efi_status_t,
2583b8f44fcSArd Biesheuvel 							 unsigned long,
2593b8f44fcSArd Biesheuvel 							 efi_char16_t *);
2608166ec09SArd Biesheuvel 		void *unload_image;
2618166ec09SArd Biesheuvel 		efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
2628166ec09SArd Biesheuvel 							    unsigned long);
2638166ec09SArd Biesheuvel 		void *get_next_monotonic_count;
2649b47c527SArvind Sankar 		efi_status_t (__efiapi *stall)(unsigned long);
2658166ec09SArd Biesheuvel 		void *set_watchdog_timer;
2668166ec09SArd Biesheuvel 		void *connect_controller;
2678166ec09SArd Biesheuvel 		efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
2688166ec09SArd Biesheuvel 							       efi_handle_t,
2698166ec09SArd Biesheuvel 							       efi_handle_t);
2708166ec09SArd Biesheuvel 		void *open_protocol;
2718166ec09SArd Biesheuvel 		void *close_protocol;
2728166ec09SArd Biesheuvel 		void *open_protocol_information;
2738166ec09SArd Biesheuvel 		void *protocols_per_handle;
2748166ec09SArd Biesheuvel 		void *locate_handle_buffer;
2758166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
2768166ec09SArd Biesheuvel 							 void **);
2778166ec09SArd Biesheuvel 		void *install_multiple_protocol_interfaces;
2788166ec09SArd Biesheuvel 		void *uninstall_multiple_protocol_interfaces;
2798166ec09SArd Biesheuvel 		void *calculate_crc32;
2808166ec09SArd Biesheuvel 		void *copy_mem;
2818166ec09SArd Biesheuvel 		void *set_mem;
2828166ec09SArd Biesheuvel 		void *create_event_ex;
2838166ec09SArd Biesheuvel 	};
2848166ec09SArd Biesheuvel 	struct {
2858166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
2868166ec09SArd Biesheuvel 		u32 raise_tpl;
2878166ec09SArd Biesheuvel 		u32 restore_tpl;
2888166ec09SArd Biesheuvel 		u32 allocate_pages;
2898166ec09SArd Biesheuvel 		u32 free_pages;
2908166ec09SArd Biesheuvel 		u32 get_memory_map;
2918166ec09SArd Biesheuvel 		u32 allocate_pool;
2928166ec09SArd Biesheuvel 		u32 free_pool;
2938166ec09SArd Biesheuvel 		u32 create_event;
2948166ec09SArd Biesheuvel 		u32 set_timer;
2958166ec09SArd Biesheuvel 		u32 wait_for_event;
2968166ec09SArd Biesheuvel 		u32 signal_event;
2978166ec09SArd Biesheuvel 		u32 close_event;
2988166ec09SArd Biesheuvel 		u32 check_event;
2998166ec09SArd Biesheuvel 		u32 install_protocol_interface;
3008166ec09SArd Biesheuvel 		u32 reinstall_protocol_interface;
3018166ec09SArd Biesheuvel 		u32 uninstall_protocol_interface;
3028166ec09SArd Biesheuvel 		u32 handle_protocol;
3038166ec09SArd Biesheuvel 		u32 __reserved;
3048166ec09SArd Biesheuvel 		u32 register_protocol_notify;
3058166ec09SArd Biesheuvel 		u32 locate_handle;
3068166ec09SArd Biesheuvel 		u32 locate_device_path;
3078166ec09SArd Biesheuvel 		u32 install_configuration_table;
3088166ec09SArd Biesheuvel 		u32 load_image;
3098166ec09SArd Biesheuvel 		u32 start_image;
3108166ec09SArd Biesheuvel 		u32 exit;
3118166ec09SArd Biesheuvel 		u32 unload_image;
3128166ec09SArd Biesheuvel 		u32 exit_boot_services;
3138166ec09SArd Biesheuvel 		u32 get_next_monotonic_count;
3148166ec09SArd Biesheuvel 		u32 stall;
3158166ec09SArd Biesheuvel 		u32 set_watchdog_timer;
3168166ec09SArd Biesheuvel 		u32 connect_controller;
3178166ec09SArd Biesheuvel 		u32 disconnect_controller;
3188166ec09SArd Biesheuvel 		u32 open_protocol;
3198166ec09SArd Biesheuvel 		u32 close_protocol;
3208166ec09SArd Biesheuvel 		u32 open_protocol_information;
3218166ec09SArd Biesheuvel 		u32 protocols_per_handle;
3228166ec09SArd Biesheuvel 		u32 locate_handle_buffer;
3238166ec09SArd Biesheuvel 		u32 locate_protocol;
3248166ec09SArd Biesheuvel 		u32 install_multiple_protocol_interfaces;
3258166ec09SArd Biesheuvel 		u32 uninstall_multiple_protocol_interfaces;
3268166ec09SArd Biesheuvel 		u32 calculate_crc32;
3278166ec09SArd Biesheuvel 		u32 copy_mem;
3288166ec09SArd Biesheuvel 		u32 set_mem;
3298166ec09SArd Biesheuvel 		u32 create_event_ex;
3308166ec09SArd Biesheuvel 	} mixed_mode;
3318166ec09SArd Biesheuvel };
3328166ec09SArd Biesheuvel 
333c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t;
334c2d0b470SArd Biesheuvel 
335c2d0b470SArd Biesheuvel union efi_uga_draw_protocol {
336c2d0b470SArd Biesheuvel 	struct {
337c2d0b470SArd Biesheuvel 		efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *,
338c2d0b470SArd Biesheuvel 						  u32*, u32*, u32*, u32*);
339c2d0b470SArd Biesheuvel 		void *set_mode;
340c2d0b470SArd Biesheuvel 		void *blt;
341c2d0b470SArd Biesheuvel 	};
342c2d0b470SArd Biesheuvel 	struct {
343c2d0b470SArd Biesheuvel 		u32 get_mode;
344c2d0b470SArd Biesheuvel 		u32 set_mode;
345c2d0b470SArd Biesheuvel 		u32 blt;
346c2d0b470SArd Biesheuvel 	} mixed_mode;
347c2d0b470SArd Biesheuvel };
348c2d0b470SArd Biesheuvel 
3499b47c527SArvind Sankar typedef struct {
3509b47c527SArvind Sankar 	u16 scan_code;
3519b47c527SArvind Sankar 	efi_char16_t unicode_char;
3529b47c527SArvind Sankar } efi_input_key_t;
3539b47c527SArvind Sankar 
3549b47c527SArvind Sankar union efi_simple_text_input_protocol {
3559b47c527SArvind Sankar 	struct {
3569b47c527SArvind Sankar 		void *reset;
3579b47c527SArvind Sankar 		efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *,
3589b47c527SArvind Sankar 							efi_input_key_t *);
3599b47c527SArvind Sankar 		efi_event_t wait_for_key;
3609b47c527SArvind Sankar 	};
3619b47c527SArvind Sankar 	struct {
3629b47c527SArvind Sankar 		u32 reset;
3639b47c527SArvind Sankar 		u32 read_keystroke;
3649b47c527SArvind Sankar 		u32 wait_for_key;
3659b47c527SArvind Sankar 	} mixed_mode;
3669b47c527SArvind Sankar };
3679b47c527SArvind Sankar 
36814c574f3SArvind Sankar efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key);
36914c574f3SArvind Sankar 
3708166ec09SArd Biesheuvel union efi_simple_text_output_protocol {
3718166ec09SArd Biesheuvel 	struct {
3728166ec09SArd Biesheuvel 		void *reset;
3738166ec09SArd Biesheuvel 		efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
3748166ec09SArd Biesheuvel 						       efi_char16_t *);
3758166ec09SArd Biesheuvel 		void *test_string;
3768166ec09SArd Biesheuvel 	};
3778166ec09SArd Biesheuvel 	struct {
3788166ec09SArd Biesheuvel 		u32 reset;
3798166ec09SArd Biesheuvel 		u32 output_string;
3808166ec09SArd Biesheuvel 		u32 test_string;
3818166ec09SArd Biesheuvel 	} mixed_mode;
3828166ec09SArd Biesheuvel };
3838166ec09SArd Biesheuvel 
3848166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
3858166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
3868166ec09SArd Biesheuvel #define PIXEL_BIT_MASK					2
3878166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY					3
3888166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
3898166ec09SArd Biesheuvel 
3908166ec09SArd Biesheuvel typedef struct {
3918166ec09SArd Biesheuvel 	u32 red_mask;
3928166ec09SArd Biesheuvel 	u32 green_mask;
3938166ec09SArd Biesheuvel 	u32 blue_mask;
3948166ec09SArd Biesheuvel 	u32 reserved_mask;
3958166ec09SArd Biesheuvel } efi_pixel_bitmask_t;
3968166ec09SArd Biesheuvel 
3978166ec09SArd Biesheuvel typedef struct {
3988166ec09SArd Biesheuvel 	u32 version;
3998166ec09SArd Biesheuvel 	u32 horizontal_resolution;
4008166ec09SArd Biesheuvel 	u32 vertical_resolution;
4018166ec09SArd Biesheuvel 	int pixel_format;
4028166ec09SArd Biesheuvel 	efi_pixel_bitmask_t pixel_information;
4038166ec09SArd Biesheuvel 	u32 pixels_per_scan_line;
4048166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t;
4058166ec09SArd Biesheuvel 
4068166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
4078166ec09SArd Biesheuvel 
4088166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode {
4098166ec09SArd Biesheuvel 	struct {
4108166ec09SArd Biesheuvel 		u32 max_mode;
4118166ec09SArd Biesheuvel 		u32 mode;
4128166ec09SArd Biesheuvel 		efi_graphics_output_mode_info_t *info;
4138166ec09SArd Biesheuvel 		unsigned long size_of_info;
4148166ec09SArd Biesheuvel 		efi_physical_addr_t frame_buffer_base;
4158166ec09SArd Biesheuvel 		unsigned long frame_buffer_size;
4168166ec09SArd Biesheuvel 	};
4178166ec09SArd Biesheuvel 	struct {
4188166ec09SArd Biesheuvel 		u32 max_mode;
4198166ec09SArd Biesheuvel 		u32 mode;
4208166ec09SArd Biesheuvel 		u32 info;
4218166ec09SArd Biesheuvel 		u32 size_of_info;
4228166ec09SArd Biesheuvel 		u64 frame_buffer_base;
4238166ec09SArd Biesheuvel 		u32 frame_buffer_size;
4248166ec09SArd Biesheuvel 	} mixed_mode;
4258166ec09SArd Biesheuvel };
4268166ec09SArd Biesheuvel 
4278166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
4288166ec09SArd Biesheuvel 
4298166ec09SArd Biesheuvel union efi_graphics_output_protocol {
4308166ec09SArd Biesheuvel 	struct {
431b4b89a02SArvind Sankar 		efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *,
432b4b89a02SArvind Sankar 						    u32, unsigned long *,
433b4b89a02SArvind Sankar 						    efi_graphics_output_mode_info_t **);
434b4b89a02SArvind Sankar 		efi_status_t (__efiapi *set_mode)  (efi_graphics_output_protocol_t *, u32);
4358166ec09SArd Biesheuvel 		void *blt;
4368166ec09SArd Biesheuvel 		efi_graphics_output_protocol_mode_t *mode;
4378166ec09SArd Biesheuvel 	};
4388166ec09SArd Biesheuvel 	struct {
4398166ec09SArd Biesheuvel 		u32 query_mode;
4408166ec09SArd Biesheuvel 		u32 set_mode;
4418166ec09SArd Biesheuvel 		u32 blt;
4428166ec09SArd Biesheuvel 		u32 mode;
4438166ec09SArd Biesheuvel 	} mixed_mode;
4448166ec09SArd Biesheuvel };
4458166ec09SArd Biesheuvel 
446f7b85b33SArd Biesheuvel typedef union {
447f7b85b33SArd Biesheuvel 	struct {
448a46a290aSArd Biesheuvel 		u32			revision;
449a46a290aSArd Biesheuvel 		efi_handle_t		parent_handle;
450a46a290aSArd Biesheuvel 		efi_system_table_t	*system_table;
451a46a290aSArd Biesheuvel 		efi_handle_t		device_handle;
452a46a290aSArd Biesheuvel 		void			*file_path;
453a46a290aSArd Biesheuvel 		void			*reserved;
454a46a290aSArd Biesheuvel 		u32			load_options_size;
455a46a290aSArd Biesheuvel 		void			*load_options;
456a46a290aSArd Biesheuvel 		void			*image_base;
457a46a290aSArd Biesheuvel 		__aligned_u64		image_size;
458a46a290aSArd Biesheuvel 		unsigned int		image_code_type;
459a46a290aSArd Biesheuvel 		unsigned int		image_data_type;
460a46a290aSArd Biesheuvel 		efi_status_t		(__efiapi *unload)(efi_handle_t image_handle);
461f7b85b33SArd Biesheuvel 	};
462f7b85b33SArd Biesheuvel 	struct {
463f7b85b33SArd Biesheuvel 		u32		revision;
464f7b85b33SArd Biesheuvel 		u32		parent_handle;
465f7b85b33SArd Biesheuvel 		u32		system_table;
466f7b85b33SArd Biesheuvel 		u32		device_handle;
467f7b85b33SArd Biesheuvel 		u32		file_path;
468f7b85b33SArd Biesheuvel 		u32		reserved;
469f7b85b33SArd Biesheuvel 		u32		load_options_size;
470f7b85b33SArd Biesheuvel 		u32		load_options;
471f7b85b33SArd Biesheuvel 		u32		image_base;
472f7b85b33SArd Biesheuvel 		__aligned_u64	image_size;
473f7b85b33SArd Biesheuvel 		u32		image_code_type;
474f7b85b33SArd Biesheuvel 		u32		image_data_type;
475f7b85b33SArd Biesheuvel 		u32		unload;
476f7b85b33SArd Biesheuvel 	} mixed_mode;
477a46a290aSArd Biesheuvel } efi_loaded_image_t;
478a46a290aSArd Biesheuvel 
479a46a290aSArd Biesheuvel typedef struct {
480a46a290aSArd Biesheuvel 	u64			size;
481a46a290aSArd Biesheuvel 	u64			file_size;
482a46a290aSArd Biesheuvel 	u64			phys_size;
483a46a290aSArd Biesheuvel 	efi_time_t		create_time;
484a46a290aSArd Biesheuvel 	efi_time_t		last_access_time;
485a46a290aSArd Biesheuvel 	efi_time_t		modification_time;
486a46a290aSArd Biesheuvel 	__aligned_u64		attribute;
4879302c1bbSArd Biesheuvel 	efi_char16_t		filename[];
488a46a290aSArd Biesheuvel } efi_file_info_t;
489a46a290aSArd Biesheuvel 
490a46a290aSArd Biesheuvel typedef struct efi_file_protocol efi_file_protocol_t;
491a46a290aSArd Biesheuvel 
492a46a290aSArd Biesheuvel struct efi_file_protocol {
493a46a290aSArd Biesheuvel 	u64		revision;
494a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *open)	(efi_file_protocol_t *,
495a46a290aSArd Biesheuvel 						 efi_file_protocol_t **,
496a46a290aSArd Biesheuvel 						 efi_char16_t *, u64, u64);
497a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *close)	(efi_file_protocol_t *);
498a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *delete)	(efi_file_protocol_t *);
499a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *read)	(efi_file_protocol_t *,
500a46a290aSArd Biesheuvel 						 unsigned long *, void *);
501a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *write)	(efi_file_protocol_t *,
502a46a290aSArd Biesheuvel 						 unsigned long, void *);
503a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_position)(efi_file_protocol_t *, u64 *);
504a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_position)(efi_file_protocol_t *, u64);
505a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_info)	(efi_file_protocol_t *,
506a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long *,
507a46a290aSArd Biesheuvel 						 void *);
508a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_info)	(efi_file_protocol_t *,
509a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long,
510a46a290aSArd Biesheuvel 						 void *);
511a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *flush)	(efi_file_protocol_t *);
512a46a290aSArd Biesheuvel };
513a46a290aSArd Biesheuvel 
514a46a290aSArd Biesheuvel typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t;
515a46a290aSArd Biesheuvel 
516a46a290aSArd Biesheuvel struct efi_simple_file_system_protocol {
517a46a290aSArd Biesheuvel 	u64	revision;
518a46a290aSArd Biesheuvel 	int	(__efiapi *open_volume)(efi_simple_file_system_protocol_t *,
519a46a290aSArd Biesheuvel 					efi_file_protocol_t **);
520a46a290aSArd Biesheuvel };
521a46a290aSArd Biesheuvel 
522a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ	0x0000000000000001
523a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE	0x0000000000000002
524a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE	0x8000000000000000
525a46a290aSArd Biesheuvel 
5268166ec09SArd Biesheuvel typedef enum {
5278166ec09SArd Biesheuvel 	EfiPciIoWidthUint8,
5288166ec09SArd Biesheuvel 	EfiPciIoWidthUint16,
5298166ec09SArd Biesheuvel 	EfiPciIoWidthUint32,
5308166ec09SArd Biesheuvel 	EfiPciIoWidthUint64,
5318166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint8,
5328166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint16,
5338166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint32,
5348166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint64,
5358166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint8,
5368166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint16,
5378166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint32,
5388166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint64,
5398166ec09SArd Biesheuvel 	EfiPciIoWidthMaximum
5408166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH;
5418166ec09SArd Biesheuvel 
5428166ec09SArd Biesheuvel typedef enum {
5438166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationGet,
5448166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSet,
5458166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationEnable,
5468166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationDisable,
5478166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSupported,
5488166ec09SArd Biesheuvel     EfiPciIoAttributeOperationMaximum
5498166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
5508166ec09SArd Biesheuvel 
5518166ec09SArd Biesheuvel typedef struct {
5528166ec09SArd Biesheuvel 	u32 read;
5538166ec09SArd Biesheuvel 	u32 write;
5548166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t;
5558166ec09SArd Biesheuvel 
5568166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
5578166ec09SArd Biesheuvel 
5588166ec09SArd Biesheuvel typedef
5598166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
5608166ec09SArd Biesheuvel 						   EFI_PCI_IO_PROTOCOL_WIDTH,
5618166ec09SArd Biesheuvel 						   u32 offset,
5628166ec09SArd Biesheuvel 						   unsigned long count,
5638166ec09SArd Biesheuvel 						   void *buffer);
5648166ec09SArd Biesheuvel 
5658166ec09SArd Biesheuvel typedef struct {
5668166ec09SArd Biesheuvel 	void *read;
5678166ec09SArd Biesheuvel 	void *write;
5688166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t;
5698166ec09SArd Biesheuvel 
5708166ec09SArd Biesheuvel typedef struct {
5718166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t read;
5728166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t write;
5738166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t;
5748166ec09SArd Biesheuvel 
5758166ec09SArd Biesheuvel union efi_pci_io_protocol {
5768166ec09SArd Biesheuvel 	struct {
5778166ec09SArd Biesheuvel 		void *poll_mem;
5788166ec09SArd Biesheuvel 		void *poll_io;
5798166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t mem;
5808166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t io;
5818166ec09SArd Biesheuvel 		efi_pci_io_protocol_config_access_t pci;
5828166ec09SArd Biesheuvel 		void *copy_mem;
5838166ec09SArd Biesheuvel 		void *map;
5848166ec09SArd Biesheuvel 		void *unmap;
5858166ec09SArd Biesheuvel 		void *allocate_buffer;
5868166ec09SArd Biesheuvel 		void *free_buffer;
5878166ec09SArd Biesheuvel 		void *flush;
5888166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
5898166ec09SArd Biesheuvel 						      unsigned long *segment_nr,
5908166ec09SArd Biesheuvel 						      unsigned long *bus_nr,
5918166ec09SArd Biesheuvel 						      unsigned long *device_nr,
5928166ec09SArd Biesheuvel 						      unsigned long *func_nr);
5938166ec09SArd Biesheuvel 		void *attributes;
5948166ec09SArd Biesheuvel 		void *get_bar_attributes;
5958166ec09SArd Biesheuvel 		void *set_bar_attributes;
5968166ec09SArd Biesheuvel 		uint64_t romsize;
5978166ec09SArd Biesheuvel 		void *romimage;
5988166ec09SArd Biesheuvel 	};
5998166ec09SArd Biesheuvel 	struct {
6008166ec09SArd Biesheuvel 		u32 poll_mem;
6018166ec09SArd Biesheuvel 		u32 poll_io;
6028166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t mem;
6038166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t io;
6048166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t pci;
6058166ec09SArd Biesheuvel 		u32 copy_mem;
6068166ec09SArd Biesheuvel 		u32 map;
6078166ec09SArd Biesheuvel 		u32 unmap;
6088166ec09SArd Biesheuvel 		u32 allocate_buffer;
6098166ec09SArd Biesheuvel 		u32 free_buffer;
6108166ec09SArd Biesheuvel 		u32 flush;
6118166ec09SArd Biesheuvel 		u32 get_location;
6128166ec09SArd Biesheuvel 		u32 attributes;
6138166ec09SArd Biesheuvel 		u32 get_bar_attributes;
6148166ec09SArd Biesheuvel 		u32 set_bar_attributes;
6158166ec09SArd Biesheuvel 		u64 romsize;
6168166ec09SArd Biesheuvel 		u32 romimage;
6178166ec09SArd Biesheuvel 	} mixed_mode;
6188166ec09SArd Biesheuvel };
6198166ec09SArd Biesheuvel 
6208166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
6218166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
6228166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
6238166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
6248166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
6258166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
6268166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
6278166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
6288166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
6298166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
6308166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
6318166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
6328166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
6338166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
6348166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
6358166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
6368166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
6378166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
6388166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
6398166ec09SArd Biesheuvel 
6408166ec09SArd Biesheuvel struct efi_dev_path;
6418166ec09SArd Biesheuvel 
6428166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t;
6438166ec09SArd Biesheuvel 
6448166ec09SArd Biesheuvel union apple_properties_protocol {
6458166ec09SArd Biesheuvel 	struct {
6468166ec09SArd Biesheuvel 		unsigned long version;
6478166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
6488166ec09SArd Biesheuvel 					     struct efi_dev_path *,
6498166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32 *);
6508166ec09SArd Biesheuvel 		efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
6518166ec09SArd Biesheuvel 					     struct efi_dev_path *,
6528166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32);
6538166ec09SArd Biesheuvel 		efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
6548166ec09SArd Biesheuvel 					     struct efi_dev_path *,
6558166ec09SArd Biesheuvel 					     efi_char16_t *);
6568166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
6578166ec09SArd Biesheuvel 						 void *buffer, u32 *);
6588166ec09SArd Biesheuvel 	};
6598166ec09SArd Biesheuvel 	struct {
6608166ec09SArd Biesheuvel 		u32 version;
6618166ec09SArd Biesheuvel 		u32 get;
6628166ec09SArd Biesheuvel 		u32 set;
6638166ec09SArd Biesheuvel 		u32 del;
6648166ec09SArd Biesheuvel 		u32 get_all;
6658166ec09SArd Biesheuvel 	} mixed_mode;
6668166ec09SArd Biesheuvel };
6678166ec09SArd Biesheuvel 
6688166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format;
6698166ec09SArd Biesheuvel 
6708166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
6718166ec09SArd Biesheuvel 
6728166ec09SArd Biesheuvel union efi_tcg2_protocol {
6738166ec09SArd Biesheuvel 	struct {
6748166ec09SArd Biesheuvel 		void *get_capability;
675*cdec91c0SArd Biesheuvel 		efi_status_t (__efiapi *get_event_log)(efi_tcg2_protocol_t *,
6768166ec09SArd Biesheuvel 						       efi_tcg2_event_log_format,
6778166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
6788166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
6798166ec09SArd Biesheuvel 						       efi_bool_t *);
6808166ec09SArd Biesheuvel 		void *hash_log_extend_event;
6818166ec09SArd Biesheuvel 		void *submit_command;
6828166ec09SArd Biesheuvel 		void *get_active_pcr_banks;
6838166ec09SArd Biesheuvel 		void *set_active_pcr_banks;
6848166ec09SArd Biesheuvel 		void *get_result_of_set_active_pcr_banks;
6858166ec09SArd Biesheuvel 	};
6868166ec09SArd Biesheuvel 	struct {
6878166ec09SArd Biesheuvel 		u32 get_capability;
6888166ec09SArd Biesheuvel 		u32 get_event_log;
6898166ec09SArd Biesheuvel 		u32 hash_log_extend_event;
6908166ec09SArd Biesheuvel 		u32 submit_command;
6918166ec09SArd Biesheuvel 		u32 get_active_pcr_banks;
6928166ec09SArd Biesheuvel 		u32 set_active_pcr_banks;
6938166ec09SArd Biesheuvel 		u32 get_result_of_set_active_pcr_banks;
6948166ec09SArd Biesheuvel 	} mixed_mode;
6958166ec09SArd Biesheuvel };
6968166ec09SArd Biesheuvel 
6972931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t;
6982931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t;
6992931d526SArd Biesheuvel 
7002931d526SArd Biesheuvel union efi_load_file_protocol {
7012931d526SArd Biesheuvel 	struct {
7022931d526SArd Biesheuvel 		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,
7032931d526SArd Biesheuvel 						   efi_device_path_protocol_t *,
7042931d526SArd Biesheuvel 						   bool, unsigned long *, void *);
7052931d526SArd Biesheuvel 	};
7062931d526SArd Biesheuvel 	struct {
7072931d526SArd Biesheuvel 		u32 load_file;
7082931d526SArd Biesheuvel 	} mixed_mode;
7092931d526SArd Biesheuvel };
7102931d526SArd Biesheuvel 
7114a568ce2SArvind Sankar typedef struct {
7124a568ce2SArvind Sankar 	u32 attributes;
7134a568ce2SArvind Sankar 	u16 file_path_list_length;
7144a568ce2SArvind Sankar 	u8 variable_data[];
7154a568ce2SArvind Sankar 	// efi_char16_t description[];
7164a568ce2SArvind Sankar 	// efi_device_path_protocol_t file_path_list[];
7174a568ce2SArvind Sankar 	// u8 optional_data[];
7184a568ce2SArvind Sankar } __packed efi_load_option_t;
7194a568ce2SArvind Sankar 
7204a568ce2SArvind Sankar #define EFI_LOAD_OPTION_ACTIVE		0x0001U
7214a568ce2SArvind Sankar #define EFI_LOAD_OPTION_FORCE_RECONNECT	0x0002U
7224a568ce2SArvind Sankar #define EFI_LOAD_OPTION_HIDDEN		0x0008U
7234a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY	0x1f00U
7244a568ce2SArvind Sankar #define   EFI_LOAD_OPTION_CATEGORY_BOOT	0x0000U
7254a568ce2SArvind Sankar #define   EFI_LOAD_OPTION_CATEGORY_APP	0x0100U
7264a568ce2SArvind Sankar 
7274a568ce2SArvind Sankar #define EFI_LOAD_OPTION_BOOT_MASK \
7284a568ce2SArvind Sankar 	(EFI_LOAD_OPTION_ACTIVE|EFI_LOAD_OPTION_HIDDEN|EFI_LOAD_OPTION_CATEGORY)
7294a568ce2SArvind Sankar #define EFI_LOAD_OPTION_MASK (EFI_LOAD_OPTION_FORCE_RECONNECT|EFI_LOAD_OPTION_BOOT_MASK)
7304a568ce2SArvind Sankar 
7314a568ce2SArvind Sankar typedef struct {
7324a568ce2SArvind Sankar 	u32 attributes;
7334a568ce2SArvind Sankar 	u16 file_path_list_length;
7344a568ce2SArvind Sankar 	const efi_char16_t *description;
7354a568ce2SArvind Sankar 	const efi_device_path_protocol_t *file_path_list;
7364a568ce2SArvind Sankar 	size_t optional_data_size;
7374a568ce2SArvind Sankar 	const void *optional_data;
7384a568ce2SArvind Sankar } efi_load_option_unpacked_t;
7394a568ce2SArvind Sankar 
7408166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void);
7418166ec09SArd Biesheuvel 
7428166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)(
7438166ec09SArd Biesheuvel 	struct efi_boot_memmap *map,
7448166ec09SArd Biesheuvel 	void *priv);
7458166ec09SArd Biesheuvel 
7468166ec09SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle,
7478166ec09SArd Biesheuvel 				    struct efi_boot_memmap *map,
7488166ec09SArd Biesheuvel 				    void *priv,
7498166ec09SArd Biesheuvel 				    efi_exit_boot_map_processing priv_func);
7508166ec09SArd Biesheuvel 
7518166ec09SArd Biesheuvel efi_status_t allocate_new_fdt_and_exit_boot(void *handle,
7528166ec09SArd Biesheuvel 					    unsigned long *new_fdt_addr,
7538166ec09SArd Biesheuvel 					    u64 initrd_addr, u64 initrd_size,
7548166ec09SArd Biesheuvel 					    char *cmdline_ptr,
7558166ec09SArd Biesheuvel 					    unsigned long fdt_addr,
7568166ec09SArd Biesheuvel 					    unsigned long fdt_size);
7578166ec09SArd Biesheuvel 
7588166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size);
7598166ec09SArd Biesheuvel 
7608166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
7618166ec09SArd Biesheuvel 		     unsigned long desc_size, efi_memory_desc_t *runtime_map,
7628166ec09SArd Biesheuvel 		     int *count);
7638166ec09SArd Biesheuvel 
7648166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);
7658166ec09SArd Biesheuvel 
7668166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align,
7678166ec09SArd Biesheuvel 			      unsigned long *addr, unsigned long random_seed);
7688166ec09SArd Biesheuvel 
7698166ec09SArd Biesheuvel efi_status_t check_platform_features(void);
7708166ec09SArd Biesheuvel 
7718166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid);
7728166ec09SArd Biesheuvel 
773cb8c90a0SArvind Sankar /* NOTE: These functions do not print a trailing newline after the string */
774cb8c90a0SArvind Sankar void efi_char16_puts(efi_char16_t *);
775cb8c90a0SArvind Sankar void efi_puts(const char *str);
7768166ec09SArd Biesheuvel 
7772c7d1e30SArvind Sankar __printf(1, 2) int efi_printk(char const *fmt, ...);
7788166ec09SArd Biesheuvel 
7798166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr);
7808166ec09SArd Biesheuvel 
7814a568ce2SArvind Sankar void efi_apply_loadoptions_quirk(const void **load_options, int *load_options_size);
7824a568ce2SArvind Sankar 
78327cd5511SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
7848166ec09SArd Biesheuvel 
7858166ec09SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
7868166ec09SArd Biesheuvel 
7878166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
7888166ec09SArd Biesheuvel 				unsigned long max);
7898166ec09SArd Biesheuvel 
79043b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
79143b1df0eSArd Biesheuvel 					unsigned long max, unsigned long align);
79243b1df0eSArd Biesheuvel 
7931a895dbfSArd Biesheuvel efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
7941a895dbfSArd Biesheuvel 				 unsigned long *addr, unsigned long min);
7951a895dbfSArd Biesheuvel 
7968166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr,
7978166ec09SArd Biesheuvel 				 unsigned long image_size,
7988166ec09SArd Biesheuvel 				 unsigned long alloc_size,
7998166ec09SArd Biesheuvel 				 unsigned long preferred_addr,
8008166ec09SArd Biesheuvel 				 unsigned long alignment,
8018166ec09SArd Biesheuvel 				 unsigned long min_addr);
8028166ec09SArd Biesheuvel 
8038166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline);
8048166ec09SArd Biesheuvel 
805fffb6804SArvind Sankar void efi_parse_option_graphics(char *option);
806fffb6804SArvind Sankar 
8078166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
8088166ec09SArd Biesheuvel 			   unsigned long size);
8098166ec09SArd Biesheuvel 
810cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
811cf6b8366SArd Biesheuvel 				  const efi_char16_t *optstr,
812cf6b8366SArd Biesheuvel 				  int optstr_size,
813cf6b8366SArd Biesheuvel 				  unsigned long soft_limit,
814cf6b8366SArd Biesheuvel 				  unsigned long hard_limit,
8159302c1bbSArd Biesheuvel 				  unsigned long *load_addr,
8169302c1bbSArd Biesheuvel 				  unsigned long *load_size);
8179302c1bbSArd Biesheuvel 
818cf6b8366SArd Biesheuvel 
819cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
820cf6b8366SArd Biesheuvel 					unsigned long *load_addr,
821cf6b8366SArd Biesheuvel 					unsigned long *load_size)
822cf6b8366SArd Biesheuvel {
823cf6b8366SArd Biesheuvel 	return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
824cf6b8366SArd Biesheuvel 				    ULONG_MAX, ULONG_MAX, load_addr, load_size);
825cf6b8366SArd Biesheuvel }
826cf6b8366SArd Biesheuvel 
827f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image,
8289302c1bbSArd Biesheuvel 			     unsigned long *load_addr,
8299302c1bbSArd Biesheuvel 			     unsigned long *load_size,
83031f5e546SArd Biesheuvel 			     unsigned long soft_limit,
831f61900fdSArvind Sankar 			     unsigned long hard_limit);
8323230d95cSAtish Patra /*
8333230d95cSAtish Patra  * This function handles the architcture specific differences between arm and
8343230d95cSAtish Patra  * arm64 regarding where the kernel image must be loaded and any memory that
8353230d95cSAtish Patra  * must be reserved. On failure it is required to free all
8363230d95cSAtish Patra  * all allocations it has made.
8373230d95cSAtish Patra  */
8383230d95cSAtish Patra efi_status_t handle_kernel_image(unsigned long *image_addr,
8393230d95cSAtish Patra 				 unsigned long *image_size,
8403230d95cSAtish Patra 				 unsigned long *reserve_addr,
8413230d95cSAtish Patra 				 unsigned long *reserve_size,
8423230d95cSAtish Patra 				 efi_loaded_image_t *image);
8433230d95cSAtish Patra 
8443230d95cSAtish Patra asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint,
8453230d95cSAtish Patra 					    unsigned long fdt_addr,
8463230d95cSAtish Patra 					    unsigned long fdt_size);
847ec93fc37SArd Biesheuvel 
8482a55280aSArd Biesheuvel void efi_handle_post_ebs_state(void);
8492a55280aSArd Biesheuvel 
850e1ac4b24SChester Lin enum efi_secureboot_mode efi_get_secureboot(void);
851e1ac4b24SChester Lin 
852f4f75ad5SArd Biesheuvel #endif
853