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;
3423d5b73fSArvind Sankar extern int efi_loglevel;
35980771f6SArd Biesheuvel extern bool efi_novamap;
36eeff7d63SArd Biesheuvel 
37ccc27ae7SArd Biesheuvel extern const efi_system_table_t *efi_system_table;
382fcdad2aSArd Biesheuvel 
393ba75c13SBaskov Evgeniy typedef union efi_dxe_services_table efi_dxe_services_table_t;
403ba75c13SBaskov Evgeniy extern const efi_dxe_services_table_t *efi_dxe_table;
413ba75c13SBaskov Evgeniy 
426e99d321SArd Biesheuvel efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
436e99d321SArd Biesheuvel 				   efi_system_table_t *sys_table_arg);
446e99d321SArd Biesheuvel 
45de8c5520SArvind Sankar #ifndef ARCH_HAS_EFISTUB_WRAPPERS
46de8c5520SArvind Sankar 
4722090f84SArd Biesheuvel #define efi_is_native()			(true)
48a61962d8SArd Biesheuvel #define efi_table_attr(inst, attr)	(inst)->attr
49a61962d8SArd Biesheuvel #define efi_fn_call(inst, func, ...)	(inst)->func(__VA_ARGS__)
50de8c5520SArvind Sankar 
5122090f84SArd Biesheuvel #endif
5222090f84SArd Biesheuvel 
53a61962d8SArd Biesheuvel #define efi_call_proto(inst, func, ...) ({			\
54a61962d8SArd Biesheuvel 	__typeof__(inst) __inst = (inst);			\
55a61962d8SArd Biesheuvel 	efi_fn_call(__inst, func, __inst, ##__VA_ARGS__);	\
56a61962d8SArd Biesheuvel })
57a61962d8SArd Biesheuvel #define efi_bs_call(func, ...) \
58a61962d8SArd Biesheuvel 	efi_fn_call(efi_table_attr(efi_system_table, boottime), func, ##__VA_ARGS__)
59a61962d8SArd Biesheuvel #define efi_rt_call(func, ...) \
60a61962d8SArd Biesheuvel 	efi_fn_call(efi_table_attr(efi_system_table, runtime), func, ##__VA_ARGS__)
61a61962d8SArd Biesheuvel #define efi_dxe_call(func, ...) \
62a61962d8SArd Biesheuvel 	efi_fn_call(efi_dxe_table, func, ##__VA_ARGS__)
63a61962d8SArd Biesheuvel 
6423d5b73fSArvind Sankar #define efi_info(fmt, ...) \
6523d5b73fSArvind Sankar 	efi_printk(KERN_INFO fmt, ##__VA_ARGS__)
66c1df5e0cSArvind Sankar #define efi_warn(fmt, ...) \
67c1df5e0cSArvind Sankar 	efi_printk(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
6823d5b73fSArvind Sankar #define efi_err(fmt, ...) \
6923d5b73fSArvind Sankar 	efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
7023d5b73fSArvind Sankar #define efi_debug(fmt, ...) \
7123d5b73fSArvind Sankar 	efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
7260f38de7SArd Biesheuvel 
73c1df5e0cSArvind Sankar #define efi_printk_once(fmt, ...) 		\
74c1df5e0cSArvind Sankar ({						\
75c1df5e0cSArvind Sankar 	static bool __print_once;		\
76c1df5e0cSArvind Sankar 	bool __ret_print_once = !__print_once;	\
77c1df5e0cSArvind Sankar 						\
78c1df5e0cSArvind Sankar 	if (!__print_once) {			\
79c1df5e0cSArvind Sankar 		__print_once = true;		\
80c1df5e0cSArvind Sankar 		efi_printk(fmt, ##__VA_ARGS__);	\
81c1df5e0cSArvind Sankar 	}					\
82c1df5e0cSArvind Sankar 	__ret_print_once;			\
83c1df5e0cSArvind Sankar })
84c1df5e0cSArvind Sankar 
85c1df5e0cSArvind Sankar #define efi_info_once(fmt, ...) \
86c1df5e0cSArvind Sankar 	efi_printk_once(KERN_INFO fmt, ##__VA_ARGS__)
87c1df5e0cSArvind Sankar #define efi_warn_once(fmt, ...) \
88c1df5e0cSArvind Sankar 	efi_printk_once(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
89c1df5e0cSArvind Sankar #define efi_err_once(fmt, ...) \
90c1df5e0cSArvind Sankar 	efi_printk_once(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
91c1df5e0cSArvind Sankar #define efi_debug_once(fmt, ...) \
92c1df5e0cSArvind Sankar 	efi_printk_once(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
93c1df5e0cSArvind Sankar 
94ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */
95ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var
96ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \
97ac9aff8eSIngo Molnar 	fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var))
98ac9aff8eSIngo Molnar #endif
99ac9aff8eSIngo Molnar 
100ac9aff8eSIngo Molnar #ifndef fdt_setprop_var
101ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \
102ac9aff8eSIngo Molnar 	fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var))
103ac9aff8eSIngo Molnar #endif
104ac9aff8eSIngo Molnar 
105966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...)				\
106966291f6SArd Biesheuvel 	efi_rt_call(get_variable, (efi_char16_t *)(name),	\
107966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
108966291f6SArd Biesheuvel 
109966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...)				\
110966291f6SArd Biesheuvel 	efi_rt_call(set_variable, (efi_char16_t *)(name),	\
111966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
112966291f6SArd Biesheuvel 
1138166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx)					\
1148166ec09SArd Biesheuvel 	(efi_is_native() ? (array)[idx] 				\
1158166ec09SArd Biesheuvel 		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
1168166ec09SArd Biesheuvel 
1178166ec09SArd Biesheuvel #define efi_get_handle_num(size)					\
1188166ec09SArd Biesheuvel 	((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
1198166ec09SArd Biesheuvel 
1208166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i)			\
1218166ec09SArd Biesheuvel 	for (i = 0;							\
1228166ec09SArd Biesheuvel 	     i < efi_get_handle_num(size) &&				\
1238166ec09SArd Biesheuvel 		((handle = efi_get_handle_at((array), i)) || true);	\
1248166ec09SArd Biesheuvel 	     i++)
1258166ec09SArd Biesheuvel 
126eed4e019SArvind Sankar static inline
127eed4e019SArvind Sankar void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)
128eed4e019SArvind Sankar {
129eed4e019SArvind Sankar 	*lo = lower_32_bits(data);
130eed4e019SArvind Sankar 	*hi = upper_32_bits(data);
131eed4e019SArvind Sankar }
132eed4e019SArvind Sankar 
1338166ec09SArd Biesheuvel /*
1348166ec09SArd Biesheuvel  * Allocation types for calls to boottime->allocate_pages.
1358166ec09SArd Biesheuvel  */
1368166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES		0
1378166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS	1
1388166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS		2
1398166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE		3
1408166ec09SArd Biesheuvel 
1418166ec09SArd Biesheuvel /*
1428166ec09SArd Biesheuvel  * The type of search to perform when calling boottime->locate_handle
1438166ec09SArd Biesheuvel  */
1448166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES			0
1458166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1468166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL			2
1478166ec09SArd Biesheuvel 
148fd626195SLenny Szubowicz /*
1499b47c527SArvind Sankar  * boottime->stall takes the time period in microseconds
1509b47c527SArvind Sankar  */
1519b47c527SArvind Sankar #define EFI_USEC_PER_SEC		1000000
1529b47c527SArvind Sankar 
1539b47c527SArvind Sankar /*
1549b47c527SArvind Sankar  * boottime->set_timer takes the time in 100ns units
1559b47c527SArvind Sankar  */
1569b47c527SArvind Sankar #define EFI_100NSEC_PER_USEC	((u64)10)
1579b47c527SArvind Sankar 
158d1343da3SIngo Molnar /*
159fd626195SLenny Szubowicz  * An efi_boot_memmap is used by efi_get_memory_map() to return the
160fd626195SLenny Szubowicz  * EFI memory map in a dynamically allocated buffer.
161fd626195SLenny Szubowicz  *
162fd626195SLenny Szubowicz  * The buffer allocated for the EFI memory map includes extra room for
163fd626195SLenny Szubowicz  * a minimum of EFI_MMAP_NR_SLACK_SLOTS additional EFI memory descriptors.
164fd626195SLenny Szubowicz  * This facilitates the reuse of the EFI memory map buffer when a second
165fd626195SLenny Szubowicz  * call to ExitBootServices() is needed because of intervening changes to
166fd626195SLenny Szubowicz  * the EFI memory map. Other related structures, e.g. x86 e820ext, need
167fd626195SLenny Szubowicz  * to factor in this headroom requirement as well.
168fd626195SLenny Szubowicz  */
169fd626195SLenny Szubowicz #define EFI_MMAP_NR_SLACK_SLOTS	8
170fd626195SLenny Szubowicz 
171abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t;
172abd26868SArd Biesheuvel 
173c7007d9fSArd Biesheuvel union efi_device_path_to_text_protocol {
174c7007d9fSArd Biesheuvel 	struct {
175c7007d9fSArd Biesheuvel 		efi_char16_t *(__efiapi *convert_device_node_to_text)(
176c7007d9fSArd Biesheuvel 					const efi_device_path_protocol_t *,
177c7007d9fSArd Biesheuvel 					bool, bool);
178c7007d9fSArd Biesheuvel 		efi_char16_t *(__efiapi *convert_device_path_to_text)(
179c7007d9fSArd Biesheuvel 					const efi_device_path_protocol_t *,
180c7007d9fSArd Biesheuvel 					bool, bool);
181c7007d9fSArd Biesheuvel 	};
182c7007d9fSArd Biesheuvel 	struct {
183c7007d9fSArd Biesheuvel 		u32 convert_device_node_to_text;
184c7007d9fSArd Biesheuvel 		u32 convert_device_path_to_text;
185c7007d9fSArd Biesheuvel 	} mixed_mode;
186c7007d9fSArd Biesheuvel };
187c7007d9fSArd Biesheuvel 
188c7007d9fSArd Biesheuvel typedef union efi_device_path_to_text_protocol efi_device_path_to_text_protocol_t;
189c7007d9fSArd Biesheuvel 
19070912985SArd Biesheuvel union efi_device_path_from_text_protocol {
19170912985SArd Biesheuvel 	struct {
19270912985SArd Biesheuvel 		efi_device_path_protocol_t *
19370912985SArd Biesheuvel 			(__efiapi *convert_text_to_device_node)(const efi_char16_t *);
19470912985SArd Biesheuvel 		efi_device_path_protocol_t *
19570912985SArd Biesheuvel 			(__efiapi *convert_text_to_device_path)(const efi_char16_t *);
19670912985SArd Biesheuvel 	};
19770912985SArd Biesheuvel 	struct {
19870912985SArd Biesheuvel 		u32 convert_text_to_device_node;
19970912985SArd Biesheuvel 		u32 convert_text_to_device_path;
20070912985SArd Biesheuvel 	} mixed_mode;
20170912985SArd Biesheuvel };
20270912985SArd Biesheuvel 
20370912985SArd Biesheuvel typedef union efi_device_path_from_text_protocol efi_device_path_from_text_protocol_t;
20470912985SArd Biesheuvel 
2059b47c527SArvind Sankar typedef void *efi_event_t;
2069b47c527SArvind Sankar /* Note that notifications won't work in mixed mode */
2079b47c527SArvind Sankar typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *);
2089b47c527SArvind Sankar 
2099b47c527SArvind Sankar #define EFI_EVT_TIMER		0x80000000U
2109b47c527SArvind Sankar #define EFI_EVT_RUNTIME		0x40000000U
2119b47c527SArvind Sankar #define EFI_EVT_NOTIFY_WAIT	0x00000100U
2129b47c527SArvind Sankar #define EFI_EVT_NOTIFY_SIGNAL	0x00000200U
2139b47c527SArvind Sankar 
2148c0a839cSHeinrich Schuchardt /**
2158c0a839cSHeinrich Schuchardt  * efi_set_event_at() - add event to events array
2168c0a839cSHeinrich Schuchardt  *
2178c0a839cSHeinrich Schuchardt  * @events:	array of UEFI events
2188c0a839cSHeinrich Schuchardt  * @ids:	index where to put the event in the array
2198c0a839cSHeinrich Schuchardt  * @event:	event to add to the aray
2208c0a839cSHeinrich Schuchardt  *
2218c0a839cSHeinrich Schuchardt  * boottime->wait_for_event() takes an array of events as input.
2229b47c527SArvind Sankar  * Provide a helper to set it up correctly for mixed mode.
2239b47c527SArvind Sankar  */
2249b47c527SArvind Sankar static inline
2259b47c527SArvind Sankar void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event)
2269b47c527SArvind Sankar {
2279b47c527SArvind Sankar 	if (efi_is_native())
2289b47c527SArvind Sankar 		events[idx] = event;
2299b47c527SArvind Sankar 	else
2309b47c527SArvind Sankar 		((u32 *)events)[idx] = (u32)(unsigned long)event;
2319b47c527SArvind Sankar }
2329b47c527SArvind Sankar 
2339b47c527SArvind Sankar #define EFI_TPL_APPLICATION	4
2349b47c527SArvind Sankar #define EFI_TPL_CALLBACK	8
2359b47c527SArvind Sankar #define EFI_TPL_NOTIFY		16
2369b47c527SArvind Sankar #define EFI_TPL_HIGH_LEVEL	31
2379b47c527SArvind Sankar 
2389b47c527SArvind Sankar typedef enum {
2399b47c527SArvind Sankar 	EfiTimerCancel,
2409b47c527SArvind Sankar 	EfiTimerPeriodic,
2419b47c527SArvind Sankar 	EfiTimerRelative
2429b47c527SArvind Sankar } EFI_TIMER_DELAY;
2439b47c527SArvind Sankar 
2448166ec09SArd Biesheuvel /*
2458166ec09SArd Biesheuvel  * EFI Boot Services table
2468166ec09SArd Biesheuvel  */
2478166ec09SArd Biesheuvel union efi_boot_services {
2488166ec09SArd Biesheuvel 	struct {
2498166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
2508166ec09SArd Biesheuvel 		void *raise_tpl;
2518166ec09SArd Biesheuvel 		void *restore_tpl;
2528166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
2538166ec09SArd Biesheuvel 							efi_physical_addr_t *);
2548166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
2558166ec09SArd Biesheuvel 						    unsigned long);
2568166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
2578166ec09SArd Biesheuvel 							unsigned long *,
2588166ec09SArd Biesheuvel 							unsigned long *, u32 *);
2598166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
2608166ec09SArd Biesheuvel 						       void **);
2618166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pool)(void *);
2629b47c527SArvind Sankar 		efi_status_t (__efiapi *create_event)(u32, unsigned long,
2639b47c527SArvind Sankar 						      efi_event_notify_t, void *,
2649b47c527SArvind Sankar 						      efi_event_t *);
2659b47c527SArvind Sankar 		efi_status_t (__efiapi *set_timer)(efi_event_t,
2669b47c527SArvind Sankar 						  EFI_TIMER_DELAY, u64);
2679b47c527SArvind Sankar 		efi_status_t (__efiapi *wait_for_event)(unsigned long,
2689b47c527SArvind Sankar 							efi_event_t *,
2699b47c527SArvind Sankar 							unsigned long *);
2708166ec09SArd Biesheuvel 		void *signal_event;
2719b47c527SArvind Sankar 		efi_status_t (__efiapi *close_event)(efi_event_t);
2728166ec09SArd Biesheuvel 		void *check_event;
2738166ec09SArd Biesheuvel 		void *install_protocol_interface;
2748166ec09SArd Biesheuvel 		void *reinstall_protocol_interface;
2758166ec09SArd Biesheuvel 		void *uninstall_protocol_interface;
2768166ec09SArd Biesheuvel 		efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
2778166ec09SArd Biesheuvel 							 efi_guid_t *, void **);
2788166ec09SArd Biesheuvel 		void *__reserved;
2798166ec09SArd Biesheuvel 		void *register_protocol_notify;
2808166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
2818166ec09SArd Biesheuvel 						       void *, unsigned long *,
2828166ec09SArd Biesheuvel 						       efi_handle_t *);
283abd26868SArd Biesheuvel 		efi_status_t (__efiapi *locate_device_path)(efi_guid_t *,
284abd26868SArd Biesheuvel 							    efi_device_path_protocol_t **,
285abd26868SArd Biesheuvel 							    efi_handle_t *);
2868166ec09SArd Biesheuvel 		efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
2878166ec09SArd Biesheuvel 								     void *);
288c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *load_image)(bool, efi_handle_t,
289c7007d9fSArd Biesheuvel 						    efi_device_path_protocol_t *,
290c7007d9fSArd Biesheuvel 						    void *, unsigned long,
291c7007d9fSArd Biesheuvel 						    efi_handle_t *);
292c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *start_image)(efi_handle_t, unsigned long *,
293c7007d9fSArd Biesheuvel 						     efi_char16_t **);
2943b8f44fcSArd Biesheuvel 		efi_status_t __noreturn (__efiapi *exit)(efi_handle_t,
2953b8f44fcSArd Biesheuvel 							 efi_status_t,
2963b8f44fcSArd Biesheuvel 							 unsigned long,
2973b8f44fcSArd Biesheuvel 							 efi_char16_t *);
298c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *unload_image)(efi_handle_t);
2998166ec09SArd Biesheuvel 		efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
3008166ec09SArd Biesheuvel 							    unsigned long);
3018166ec09SArd Biesheuvel 		void *get_next_monotonic_count;
3029b47c527SArvind Sankar 		efi_status_t (__efiapi *stall)(unsigned long);
3038166ec09SArd Biesheuvel 		void *set_watchdog_timer;
3048166ec09SArd Biesheuvel 		void *connect_controller;
3058166ec09SArd Biesheuvel 		efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
3068166ec09SArd Biesheuvel 							       efi_handle_t,
3078166ec09SArd Biesheuvel 							       efi_handle_t);
3088166ec09SArd Biesheuvel 		void *open_protocol;
3098166ec09SArd Biesheuvel 		void *close_protocol;
3108166ec09SArd Biesheuvel 		void *open_protocol_information;
3118166ec09SArd Biesheuvel 		void *protocols_per_handle;
3128166ec09SArd Biesheuvel 		void *locate_handle_buffer;
3138166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
3148166ec09SArd Biesheuvel 							 void **);
315c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *install_multiple_protocol_interfaces)(efi_handle_t *, ...);
316c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *uninstall_multiple_protocol_interfaces)(efi_handle_t, ...);
3178166ec09SArd Biesheuvel 		void *calculate_crc32;
318c82ceb44SArd Biesheuvel 		void (__efiapi *copy_mem)(void *, const void *, unsigned long);
319c82ceb44SArd Biesheuvel 		void (__efiapi *set_mem)(void *, unsigned long, unsigned char);
3208166ec09SArd Biesheuvel 		void *create_event_ex;
3218166ec09SArd Biesheuvel 	};
3228166ec09SArd Biesheuvel 	struct {
3238166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
3248166ec09SArd Biesheuvel 		u32 raise_tpl;
3258166ec09SArd Biesheuvel 		u32 restore_tpl;
3268166ec09SArd Biesheuvel 		u32 allocate_pages;
3278166ec09SArd Biesheuvel 		u32 free_pages;
3288166ec09SArd Biesheuvel 		u32 get_memory_map;
3298166ec09SArd Biesheuvel 		u32 allocate_pool;
3308166ec09SArd Biesheuvel 		u32 free_pool;
3318166ec09SArd Biesheuvel 		u32 create_event;
3328166ec09SArd Biesheuvel 		u32 set_timer;
3338166ec09SArd Biesheuvel 		u32 wait_for_event;
3348166ec09SArd Biesheuvel 		u32 signal_event;
3358166ec09SArd Biesheuvel 		u32 close_event;
3368166ec09SArd Biesheuvel 		u32 check_event;
3378166ec09SArd Biesheuvel 		u32 install_protocol_interface;
3388166ec09SArd Biesheuvel 		u32 reinstall_protocol_interface;
3398166ec09SArd Biesheuvel 		u32 uninstall_protocol_interface;
3408166ec09SArd Biesheuvel 		u32 handle_protocol;
3418166ec09SArd Biesheuvel 		u32 __reserved;
3428166ec09SArd Biesheuvel 		u32 register_protocol_notify;
3438166ec09SArd Biesheuvel 		u32 locate_handle;
3448166ec09SArd Biesheuvel 		u32 locate_device_path;
3458166ec09SArd Biesheuvel 		u32 install_configuration_table;
3468166ec09SArd Biesheuvel 		u32 load_image;
3478166ec09SArd Biesheuvel 		u32 start_image;
3488166ec09SArd Biesheuvel 		u32 exit;
3498166ec09SArd Biesheuvel 		u32 unload_image;
3508166ec09SArd Biesheuvel 		u32 exit_boot_services;
3518166ec09SArd Biesheuvel 		u32 get_next_monotonic_count;
3528166ec09SArd Biesheuvel 		u32 stall;
3538166ec09SArd Biesheuvel 		u32 set_watchdog_timer;
3548166ec09SArd Biesheuvel 		u32 connect_controller;
3558166ec09SArd Biesheuvel 		u32 disconnect_controller;
3568166ec09SArd Biesheuvel 		u32 open_protocol;
3578166ec09SArd Biesheuvel 		u32 close_protocol;
3588166ec09SArd Biesheuvel 		u32 open_protocol_information;
3598166ec09SArd Biesheuvel 		u32 protocols_per_handle;
3608166ec09SArd Biesheuvel 		u32 locate_handle_buffer;
3618166ec09SArd Biesheuvel 		u32 locate_protocol;
3628166ec09SArd Biesheuvel 		u32 install_multiple_protocol_interfaces;
3638166ec09SArd Biesheuvel 		u32 uninstall_multiple_protocol_interfaces;
3648166ec09SArd Biesheuvel 		u32 calculate_crc32;
3658166ec09SArd Biesheuvel 		u32 copy_mem;
3668166ec09SArd Biesheuvel 		u32 set_mem;
3678166ec09SArd Biesheuvel 		u32 create_event_ex;
3688166ec09SArd Biesheuvel 	} mixed_mode;
3698166ec09SArd Biesheuvel };
3708166ec09SArd Biesheuvel 
3713ba75c13SBaskov Evgeniy typedef enum {
3723ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeNonExistent,
3733ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeReserved,
3743ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeSystemMemory,
3753ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeMemoryMappedIo,
3763ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypePersistent,
3773ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeMoreReliable,
3783ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeMaximum
3793ba75c13SBaskov Evgeniy } efi_gcd_memory_type_t;
3803ba75c13SBaskov Evgeniy 
3813ba75c13SBaskov Evgeniy typedef struct {
3823ba75c13SBaskov Evgeniy 	efi_physical_addr_t base_address;
3833ba75c13SBaskov Evgeniy 	u64 length;
3843ba75c13SBaskov Evgeniy 	u64 capabilities;
3853ba75c13SBaskov Evgeniy 	u64 attributes;
3863ba75c13SBaskov Evgeniy 	efi_gcd_memory_type_t gcd_memory_type;
3873ba75c13SBaskov Evgeniy 	void *image_handle;
3883ba75c13SBaskov Evgeniy 	void *device_handle;
3893ba75c13SBaskov Evgeniy } efi_gcd_memory_space_desc_t;
3903ba75c13SBaskov Evgeniy 
3913ba75c13SBaskov Evgeniy /*
3923ba75c13SBaskov Evgeniy  * EFI DXE Services table
3933ba75c13SBaskov Evgeniy  */
3943ba75c13SBaskov Evgeniy union efi_dxe_services_table {
3953ba75c13SBaskov Evgeniy 	struct {
3963ba75c13SBaskov Evgeniy 		efi_table_hdr_t hdr;
3973ba75c13SBaskov Evgeniy 		void *add_memory_space;
3983ba75c13SBaskov Evgeniy 		void *allocate_memory_space;
3993ba75c13SBaskov Evgeniy 		void *free_memory_space;
4003ba75c13SBaskov Evgeniy 		void *remove_memory_space;
4013ba75c13SBaskov Evgeniy 		efi_status_t (__efiapi *get_memory_space_descriptor)(efi_physical_addr_t,
4023ba75c13SBaskov Evgeniy 								     efi_gcd_memory_space_desc_t *);
4033ba75c13SBaskov Evgeniy 		efi_status_t (__efiapi *set_memory_space_attributes)(efi_physical_addr_t,
4043ba75c13SBaskov Evgeniy 								     u64, u64);
4053ba75c13SBaskov Evgeniy 		void *get_memory_space_map;
4063ba75c13SBaskov Evgeniy 		void *add_io_space;
4073ba75c13SBaskov Evgeniy 		void *allocate_io_space;
4083ba75c13SBaskov Evgeniy 		void *free_io_space;
4093ba75c13SBaskov Evgeniy 		void *remove_io_space;
4103ba75c13SBaskov Evgeniy 		void *get_io_space_descriptor;
4113ba75c13SBaskov Evgeniy 		void *get_io_space_map;
4123ba75c13SBaskov Evgeniy 		void *dispatch;
4133ba75c13SBaskov Evgeniy 		void *schedule;
4143ba75c13SBaskov Evgeniy 		void *trust;
4153ba75c13SBaskov Evgeniy 		void *process_firmware_volume;
4163ba75c13SBaskov Evgeniy 		void *set_memory_space_capabilities;
4173ba75c13SBaskov Evgeniy 	};
4183ba75c13SBaskov Evgeniy 	struct {
4193ba75c13SBaskov Evgeniy 		efi_table_hdr_t hdr;
4203ba75c13SBaskov Evgeniy 		u32 add_memory_space;
4213ba75c13SBaskov Evgeniy 		u32 allocate_memory_space;
4223ba75c13SBaskov Evgeniy 		u32 free_memory_space;
4233ba75c13SBaskov Evgeniy 		u32 remove_memory_space;
4243ba75c13SBaskov Evgeniy 		u32 get_memory_space_descriptor;
4253ba75c13SBaskov Evgeniy 		u32 set_memory_space_attributes;
4263ba75c13SBaskov Evgeniy 		u32 get_memory_space_map;
4273ba75c13SBaskov Evgeniy 		u32 add_io_space;
4283ba75c13SBaskov Evgeniy 		u32 allocate_io_space;
4293ba75c13SBaskov Evgeniy 		u32 free_io_space;
4303ba75c13SBaskov Evgeniy 		u32 remove_io_space;
4313ba75c13SBaskov Evgeniy 		u32 get_io_space_descriptor;
4323ba75c13SBaskov Evgeniy 		u32 get_io_space_map;
4333ba75c13SBaskov Evgeniy 		u32 dispatch;
4343ba75c13SBaskov Evgeniy 		u32 schedule;
4353ba75c13SBaskov Evgeniy 		u32 trust;
4363ba75c13SBaskov Evgeniy 		u32 process_firmware_volume;
4373ba75c13SBaskov Evgeniy 		u32 set_memory_space_capabilities;
4383ba75c13SBaskov Evgeniy 	} mixed_mode;
4393ba75c13SBaskov Evgeniy };
4403ba75c13SBaskov Evgeniy 
441c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t;
442c2d0b470SArd Biesheuvel 
443c2d0b470SArd Biesheuvel union efi_uga_draw_protocol {
444c2d0b470SArd Biesheuvel 	struct {
445c2d0b470SArd Biesheuvel 		efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *,
446c2d0b470SArd Biesheuvel 						  u32*, u32*, u32*, u32*);
447c2d0b470SArd Biesheuvel 		void *set_mode;
448c2d0b470SArd Biesheuvel 		void *blt;
449c2d0b470SArd Biesheuvel 	};
450c2d0b470SArd Biesheuvel 	struct {
451c2d0b470SArd Biesheuvel 		u32 get_mode;
452c2d0b470SArd Biesheuvel 		u32 set_mode;
453c2d0b470SArd Biesheuvel 		u32 blt;
454c2d0b470SArd Biesheuvel 	} mixed_mode;
455c2d0b470SArd Biesheuvel };
456c2d0b470SArd Biesheuvel 
4579b47c527SArvind Sankar typedef struct {
4589b47c527SArvind Sankar 	u16 scan_code;
4599b47c527SArvind Sankar 	efi_char16_t unicode_char;
4609b47c527SArvind Sankar } efi_input_key_t;
4619b47c527SArvind Sankar 
4629b47c527SArvind Sankar union efi_simple_text_input_protocol {
4639b47c527SArvind Sankar 	struct {
4649b47c527SArvind Sankar 		void *reset;
4659b47c527SArvind Sankar 		efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *,
4669b47c527SArvind Sankar 							efi_input_key_t *);
4679b47c527SArvind Sankar 		efi_event_t wait_for_key;
4689b47c527SArvind Sankar 	};
4699b47c527SArvind Sankar 	struct {
4709b47c527SArvind Sankar 		u32 reset;
4719b47c527SArvind Sankar 		u32 read_keystroke;
4729b47c527SArvind Sankar 		u32 wait_for_key;
4739b47c527SArvind Sankar 	} mixed_mode;
4749b47c527SArvind Sankar };
4759b47c527SArvind Sankar 
47614c574f3SArvind Sankar efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key);
47714c574f3SArvind Sankar 
4788166ec09SArd Biesheuvel union efi_simple_text_output_protocol {
4798166ec09SArd Biesheuvel 	struct {
4808166ec09SArd Biesheuvel 		void *reset;
4818166ec09SArd Biesheuvel 		efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
4828166ec09SArd Biesheuvel 						       efi_char16_t *);
4838166ec09SArd Biesheuvel 		void *test_string;
4848166ec09SArd Biesheuvel 	};
4858166ec09SArd Biesheuvel 	struct {
4868166ec09SArd Biesheuvel 		u32 reset;
4878166ec09SArd Biesheuvel 		u32 output_string;
4888166ec09SArd Biesheuvel 		u32 test_string;
4898166ec09SArd Biesheuvel 	} mixed_mode;
4908166ec09SArd Biesheuvel };
4918166ec09SArd Biesheuvel 
4928166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
4938166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
4948166ec09SArd Biesheuvel #define PIXEL_BIT_MASK					2
4958166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY					3
4968166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
4978166ec09SArd Biesheuvel 
4988166ec09SArd Biesheuvel typedef struct {
4998166ec09SArd Biesheuvel 	u32 red_mask;
5008166ec09SArd Biesheuvel 	u32 green_mask;
5018166ec09SArd Biesheuvel 	u32 blue_mask;
5028166ec09SArd Biesheuvel 	u32 reserved_mask;
5038166ec09SArd Biesheuvel } efi_pixel_bitmask_t;
5048166ec09SArd Biesheuvel 
5058166ec09SArd Biesheuvel typedef struct {
5068166ec09SArd Biesheuvel 	u32 version;
5078166ec09SArd Biesheuvel 	u32 horizontal_resolution;
5088166ec09SArd Biesheuvel 	u32 vertical_resolution;
5098166ec09SArd Biesheuvel 	int pixel_format;
5108166ec09SArd Biesheuvel 	efi_pixel_bitmask_t pixel_information;
5118166ec09SArd Biesheuvel 	u32 pixels_per_scan_line;
5128166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t;
5138166ec09SArd Biesheuvel 
5148166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
5158166ec09SArd Biesheuvel 
5168166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode {
5178166ec09SArd Biesheuvel 	struct {
5188166ec09SArd Biesheuvel 		u32 max_mode;
5198166ec09SArd Biesheuvel 		u32 mode;
5208166ec09SArd Biesheuvel 		efi_graphics_output_mode_info_t *info;
5218166ec09SArd Biesheuvel 		unsigned long size_of_info;
5228166ec09SArd Biesheuvel 		efi_physical_addr_t frame_buffer_base;
5238166ec09SArd Biesheuvel 		unsigned long frame_buffer_size;
5248166ec09SArd Biesheuvel 	};
5258166ec09SArd Biesheuvel 	struct {
5268166ec09SArd Biesheuvel 		u32 max_mode;
5278166ec09SArd Biesheuvel 		u32 mode;
5288166ec09SArd Biesheuvel 		u32 info;
5298166ec09SArd Biesheuvel 		u32 size_of_info;
5308166ec09SArd Biesheuvel 		u64 frame_buffer_base;
5318166ec09SArd Biesheuvel 		u32 frame_buffer_size;
5328166ec09SArd Biesheuvel 	} mixed_mode;
5338166ec09SArd Biesheuvel };
5348166ec09SArd Biesheuvel 
5358166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
5368166ec09SArd Biesheuvel 
5378166ec09SArd Biesheuvel union efi_graphics_output_protocol {
5388166ec09SArd Biesheuvel 	struct {
539b4b89a02SArvind Sankar 		efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *,
540b4b89a02SArvind Sankar 						    u32, unsigned long *,
541b4b89a02SArvind Sankar 						    efi_graphics_output_mode_info_t **);
542b4b89a02SArvind Sankar 		efi_status_t (__efiapi *set_mode)  (efi_graphics_output_protocol_t *, u32);
5438166ec09SArd Biesheuvel 		void *blt;
5448166ec09SArd Biesheuvel 		efi_graphics_output_protocol_mode_t *mode;
5458166ec09SArd Biesheuvel 	};
5468166ec09SArd Biesheuvel 	struct {
5478166ec09SArd Biesheuvel 		u32 query_mode;
5488166ec09SArd Biesheuvel 		u32 set_mode;
5498166ec09SArd Biesheuvel 		u32 blt;
5508166ec09SArd Biesheuvel 		u32 mode;
5518166ec09SArd Biesheuvel 	} mixed_mode;
5528166ec09SArd Biesheuvel };
5538166ec09SArd Biesheuvel 
554f7b85b33SArd Biesheuvel typedef union {
555f7b85b33SArd Biesheuvel 	struct {
556a46a290aSArd Biesheuvel 		u32			revision;
557a46a290aSArd Biesheuvel 		efi_handle_t		parent_handle;
558a46a290aSArd Biesheuvel 		efi_system_table_t	*system_table;
559a46a290aSArd Biesheuvel 		efi_handle_t		device_handle;
560a46a290aSArd Biesheuvel 		void			*file_path;
561a46a290aSArd Biesheuvel 		void			*reserved;
562a46a290aSArd Biesheuvel 		u32			load_options_size;
563a46a290aSArd Biesheuvel 		void			*load_options;
564a46a290aSArd Biesheuvel 		void			*image_base;
565a46a290aSArd Biesheuvel 		__aligned_u64		image_size;
566a46a290aSArd Biesheuvel 		unsigned int		image_code_type;
567a46a290aSArd Biesheuvel 		unsigned int		image_data_type;
568a46a290aSArd Biesheuvel 		efi_status_t		(__efiapi *unload)(efi_handle_t image_handle);
569f7b85b33SArd Biesheuvel 	};
570f7b85b33SArd Biesheuvel 	struct {
571f7b85b33SArd Biesheuvel 		u32		revision;
572f7b85b33SArd Biesheuvel 		u32		parent_handle;
573f7b85b33SArd Biesheuvel 		u32		system_table;
574f7b85b33SArd Biesheuvel 		u32		device_handle;
575f7b85b33SArd Biesheuvel 		u32		file_path;
576f7b85b33SArd Biesheuvel 		u32		reserved;
577f7b85b33SArd Biesheuvel 		u32		load_options_size;
578f7b85b33SArd Biesheuvel 		u32		load_options;
579f7b85b33SArd Biesheuvel 		u32		image_base;
580f7b85b33SArd Biesheuvel 		__aligned_u64	image_size;
581f7b85b33SArd Biesheuvel 		u32		image_code_type;
582f7b85b33SArd Biesheuvel 		u32		image_data_type;
583f7b85b33SArd Biesheuvel 		u32		unload;
584f7b85b33SArd Biesheuvel 	} mixed_mode;
585a46a290aSArd Biesheuvel } efi_loaded_image_t;
586a46a290aSArd Biesheuvel 
587a46a290aSArd Biesheuvel typedef struct {
588a46a290aSArd Biesheuvel 	u64			size;
589a46a290aSArd Biesheuvel 	u64			file_size;
590a46a290aSArd Biesheuvel 	u64			phys_size;
591a46a290aSArd Biesheuvel 	efi_time_t		create_time;
592a46a290aSArd Biesheuvel 	efi_time_t		last_access_time;
593a46a290aSArd Biesheuvel 	efi_time_t		modification_time;
594a46a290aSArd Biesheuvel 	__aligned_u64		attribute;
5959302c1bbSArd Biesheuvel 	efi_char16_t		filename[];
596a46a290aSArd Biesheuvel } efi_file_info_t;
597a46a290aSArd Biesheuvel 
598*f8a31244SArd Biesheuvel typedef union efi_file_protocol efi_file_protocol_t;
599a46a290aSArd Biesheuvel 
600*f8a31244SArd Biesheuvel union efi_file_protocol {
601*f8a31244SArd Biesheuvel 	struct {
602a46a290aSArd Biesheuvel 		u64		revision;
603a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *open)	(efi_file_protocol_t *,
604a46a290aSArd Biesheuvel 							 efi_file_protocol_t **,
605*f8a31244SArd Biesheuvel 							 efi_char16_t *, u64,
606*f8a31244SArd Biesheuvel 							 u64);
607a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *close)	(efi_file_protocol_t *);
608a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *delete)	(efi_file_protocol_t *);
609a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *read)	(efi_file_protocol_t *,
610*f8a31244SArd Biesheuvel 							 unsigned long *,
611*f8a31244SArd Biesheuvel 							 void *);
612a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *write)	(efi_file_protocol_t *,
613a46a290aSArd Biesheuvel 							 unsigned long, void *);
614*f8a31244SArd Biesheuvel 		efi_status_t	(__efiapi *get_position)(efi_file_protocol_t *,
615*f8a31244SArd Biesheuvel 							 u64 *);
616*f8a31244SArd Biesheuvel 		efi_status_t	(__efiapi *set_position)(efi_file_protocol_t *,
617*f8a31244SArd Biesheuvel 							 u64);
618a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *get_info)	(efi_file_protocol_t *,
619*f8a31244SArd Biesheuvel 							 efi_guid_t *,
620*f8a31244SArd Biesheuvel 							 unsigned long *,
621a46a290aSArd Biesheuvel 							 void *);
622a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *set_info)	(efi_file_protocol_t *,
623*f8a31244SArd Biesheuvel 							 efi_guid_t *,
624*f8a31244SArd Biesheuvel 							 unsigned long,
625a46a290aSArd Biesheuvel 							 void *);
626a46a290aSArd Biesheuvel 		efi_status_t	(__efiapi *flush)	(efi_file_protocol_t *);
627a46a290aSArd Biesheuvel 	};
628*f8a31244SArd Biesheuvel 	struct {
629a46a290aSArd Biesheuvel 		u64 revision;
630*f8a31244SArd Biesheuvel 		u32 open;
631*f8a31244SArd Biesheuvel 		u32 close;
632*f8a31244SArd Biesheuvel 		u32 delete;
633*f8a31244SArd Biesheuvel 		u32 read;
634*f8a31244SArd Biesheuvel 		u32 write;
635*f8a31244SArd Biesheuvel 		u32 get_position;
636*f8a31244SArd Biesheuvel 		u32 set_position;
637*f8a31244SArd Biesheuvel 		u32 get_info;
638*f8a31244SArd Biesheuvel 		u32 set_info;
639*f8a31244SArd Biesheuvel 		u32 flush;
640*f8a31244SArd Biesheuvel 	} mixed_mode;
641*f8a31244SArd Biesheuvel };
642*f8a31244SArd Biesheuvel 
643*f8a31244SArd Biesheuvel typedef union efi_simple_file_system_protocol efi_simple_file_system_protocol_t;
644*f8a31244SArd Biesheuvel 
645*f8a31244SArd Biesheuvel union efi_simple_file_system_protocol {
646*f8a31244SArd Biesheuvel 	struct {
647*f8a31244SArd Biesheuvel 		u64		revision;
648*f8a31244SArd Biesheuvel 		efi_status_t	(__efiapi *open_volume)(efi_simple_file_system_protocol_t *,
649a46a290aSArd Biesheuvel 							efi_file_protocol_t **);
650a46a290aSArd Biesheuvel 	};
651*f8a31244SArd Biesheuvel 	struct {
652*f8a31244SArd Biesheuvel 		u64 revision;
653*f8a31244SArd Biesheuvel 		u32 open_volume;
654*f8a31244SArd Biesheuvel 	} mixed_mode;
655*f8a31244SArd Biesheuvel };
656a46a290aSArd Biesheuvel 
657a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ	0x0000000000000001
658a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE	0x0000000000000002
659a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE	0x8000000000000000
660a46a290aSArd Biesheuvel 
6618166ec09SArd Biesheuvel typedef enum {
6628166ec09SArd Biesheuvel 	EfiPciIoWidthUint8,
6638166ec09SArd Biesheuvel 	EfiPciIoWidthUint16,
6648166ec09SArd Biesheuvel 	EfiPciIoWidthUint32,
6658166ec09SArd Biesheuvel 	EfiPciIoWidthUint64,
6668166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint8,
6678166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint16,
6688166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint32,
6698166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint64,
6708166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint8,
6718166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint16,
6728166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint32,
6738166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint64,
6748166ec09SArd Biesheuvel 	EfiPciIoWidthMaximum
6758166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH;
6768166ec09SArd Biesheuvel 
6778166ec09SArd Biesheuvel typedef enum {
6788166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationGet,
6798166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSet,
6808166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationEnable,
6818166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationDisable,
6828166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSupported,
6838166ec09SArd Biesheuvel     EfiPciIoAttributeOperationMaximum
6848166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
6858166ec09SArd Biesheuvel 
6868166ec09SArd Biesheuvel typedef struct {
6878166ec09SArd Biesheuvel 	u32 read;
6888166ec09SArd Biesheuvel 	u32 write;
6898166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t;
6908166ec09SArd Biesheuvel 
6918166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
6928166ec09SArd Biesheuvel 
6938166ec09SArd Biesheuvel typedef
6948166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
6958166ec09SArd Biesheuvel 						   EFI_PCI_IO_PROTOCOL_WIDTH,
6968166ec09SArd Biesheuvel 						   u32 offset,
6978166ec09SArd Biesheuvel 						   unsigned long count,
6988166ec09SArd Biesheuvel 						   void *buffer);
6998166ec09SArd Biesheuvel 
7008166ec09SArd Biesheuvel typedef struct {
7018166ec09SArd Biesheuvel 	void *read;
7028166ec09SArd Biesheuvel 	void *write;
7038166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t;
7048166ec09SArd Biesheuvel 
7058166ec09SArd Biesheuvel typedef struct {
7068166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t read;
7078166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t write;
7088166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t;
7098166ec09SArd Biesheuvel 
7108166ec09SArd Biesheuvel union efi_pci_io_protocol {
7118166ec09SArd Biesheuvel 	struct {
7128166ec09SArd Biesheuvel 		void *poll_mem;
7138166ec09SArd Biesheuvel 		void *poll_io;
7148166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t mem;
7158166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t io;
7168166ec09SArd Biesheuvel 		efi_pci_io_protocol_config_access_t pci;
7178166ec09SArd Biesheuvel 		void *copy_mem;
7188166ec09SArd Biesheuvel 		void *map;
7198166ec09SArd Biesheuvel 		void *unmap;
7208166ec09SArd Biesheuvel 		void *allocate_buffer;
7218166ec09SArd Biesheuvel 		void *free_buffer;
7228166ec09SArd Biesheuvel 		void *flush;
7238166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
7248166ec09SArd Biesheuvel 						      unsigned long *segment_nr,
7258166ec09SArd Biesheuvel 						      unsigned long *bus_nr,
7268166ec09SArd Biesheuvel 						      unsigned long *device_nr,
7278166ec09SArd Biesheuvel 						      unsigned long *func_nr);
7288166ec09SArd Biesheuvel 		void *attributes;
7298166ec09SArd Biesheuvel 		void *get_bar_attributes;
7308166ec09SArd Biesheuvel 		void *set_bar_attributes;
7318166ec09SArd Biesheuvel 		uint64_t romsize;
7328166ec09SArd Biesheuvel 		void *romimage;
7338166ec09SArd Biesheuvel 	};
7348166ec09SArd Biesheuvel 	struct {
7358166ec09SArd Biesheuvel 		u32 poll_mem;
7368166ec09SArd Biesheuvel 		u32 poll_io;
7378166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t mem;
7388166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t io;
7398166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t pci;
7408166ec09SArd Biesheuvel 		u32 copy_mem;
7418166ec09SArd Biesheuvel 		u32 map;
7428166ec09SArd Biesheuvel 		u32 unmap;
7438166ec09SArd Biesheuvel 		u32 allocate_buffer;
7448166ec09SArd Biesheuvel 		u32 free_buffer;
7458166ec09SArd Biesheuvel 		u32 flush;
7468166ec09SArd Biesheuvel 		u32 get_location;
7478166ec09SArd Biesheuvel 		u32 attributes;
7488166ec09SArd Biesheuvel 		u32 get_bar_attributes;
7498166ec09SArd Biesheuvel 		u32 set_bar_attributes;
7508166ec09SArd Biesheuvel 		u64 romsize;
7518166ec09SArd Biesheuvel 		u32 romimage;
7528166ec09SArd Biesheuvel 	} mixed_mode;
7538166ec09SArd Biesheuvel };
7548166ec09SArd Biesheuvel 
7558166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
7568166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
7578166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
7588166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
7598166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
7608166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
7618166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
7628166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
7638166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
7648166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
7658166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
7668166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
7678166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
7688166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
7698166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
7708166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
7718166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
7728166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
7738166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
7748166ec09SArd Biesheuvel 
7758166ec09SArd Biesheuvel struct efi_dev_path;
7768166ec09SArd Biesheuvel 
7778166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t;
7788166ec09SArd Biesheuvel 
7798166ec09SArd Biesheuvel union apple_properties_protocol {
7808166ec09SArd Biesheuvel 	struct {
7818166ec09SArd Biesheuvel 		unsigned long version;
7828166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
7838166ec09SArd Biesheuvel 					     struct efi_dev_path *,
7848166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32 *);
7858166ec09SArd Biesheuvel 		efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
7868166ec09SArd Biesheuvel 					     struct efi_dev_path *,
7878166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32);
7888166ec09SArd Biesheuvel 		efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
7898166ec09SArd Biesheuvel 					     struct efi_dev_path *,
7908166ec09SArd Biesheuvel 					     efi_char16_t *);
7918166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
7928166ec09SArd Biesheuvel 						 void *buffer, u32 *);
7938166ec09SArd Biesheuvel 	};
7948166ec09SArd Biesheuvel 	struct {
7958166ec09SArd Biesheuvel 		u32 version;
7968166ec09SArd Biesheuvel 		u32 get;
7978166ec09SArd Biesheuvel 		u32 set;
7988166ec09SArd Biesheuvel 		u32 del;
7998166ec09SArd Biesheuvel 		u32 get_all;
8008166ec09SArd Biesheuvel 	} mixed_mode;
8018166ec09SArd Biesheuvel };
8028166ec09SArd Biesheuvel 
8038166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format;
8048166ec09SArd Biesheuvel 
8054da87c51SArd Biesheuvel #define INITRD_EVENT_TAG_ID 0x8F3B22ECU
80671c7adc9SIlias Apalodimas #define LOAD_OPTIONS_EVENT_TAG_ID 0x8F3B22EDU
8074da87c51SArd Biesheuvel #define EV_EVENT_TAG 0x00000006U
8084da87c51SArd Biesheuvel #define EFI_TCG2_EVENT_HEADER_VERSION	0x1
8094da87c51SArd Biesheuvel 
8104da87c51SArd Biesheuvel struct efi_tcg2_event {
8114da87c51SArd Biesheuvel 	u32		event_size;
8124da87c51SArd Biesheuvel 	struct {
8134da87c51SArd Biesheuvel 		u32	header_size;
8144da87c51SArd Biesheuvel 		u16	header_version;
8154da87c51SArd Biesheuvel 		u32	pcr_index;
8164da87c51SArd Biesheuvel 		u32	event_type;
8174da87c51SArd Biesheuvel 	} __packed event_header;
8184da87c51SArd Biesheuvel 	/* u8[] event follows here */
8194da87c51SArd Biesheuvel } __packed;
8204da87c51SArd Biesheuvel 
8214da87c51SArd Biesheuvel struct efi_tcg2_tagged_event {
8224da87c51SArd Biesheuvel 	u32 tagged_event_id;
8234da87c51SArd Biesheuvel 	u32 tagged_event_data_size;
8244da87c51SArd Biesheuvel 	/* u8  tagged event data follows here */
8254da87c51SArd Biesheuvel } __packed;
8264da87c51SArd Biesheuvel 
8274da87c51SArd Biesheuvel typedef struct efi_tcg2_event efi_tcg2_event_t;
8284da87c51SArd Biesheuvel typedef struct efi_tcg2_tagged_event efi_tcg2_tagged_event_t;
8298166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
8308166ec09SArd Biesheuvel 
8318166ec09SArd Biesheuvel union efi_tcg2_protocol {
8328166ec09SArd Biesheuvel 	struct {
8338166ec09SArd Biesheuvel 		void *get_capability;
834cdec91c0SArd Biesheuvel 		efi_status_t (__efiapi *get_event_log)(efi_tcg2_protocol_t *,
8358166ec09SArd Biesheuvel 						       efi_tcg2_event_log_format,
8368166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
8378166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
8388166ec09SArd Biesheuvel 						       efi_bool_t *);
8394da87c51SArd Biesheuvel 		efi_status_t (__efiapi *hash_log_extend_event)(efi_tcg2_protocol_t *,
8404da87c51SArd Biesheuvel 							       u64,
8414da87c51SArd Biesheuvel 							       efi_physical_addr_t,
8424da87c51SArd Biesheuvel 							       u64,
8434da87c51SArd Biesheuvel 							       const efi_tcg2_event_t *);
8448166ec09SArd Biesheuvel 		void *submit_command;
8458166ec09SArd Biesheuvel 		void *get_active_pcr_banks;
8468166ec09SArd Biesheuvel 		void *set_active_pcr_banks;
8478166ec09SArd Biesheuvel 		void *get_result_of_set_active_pcr_banks;
8488166ec09SArd Biesheuvel 	};
8498166ec09SArd Biesheuvel 	struct {
8508166ec09SArd Biesheuvel 		u32 get_capability;
8518166ec09SArd Biesheuvel 		u32 get_event_log;
8528166ec09SArd Biesheuvel 		u32 hash_log_extend_event;
8538166ec09SArd Biesheuvel 		u32 submit_command;
8548166ec09SArd Biesheuvel 		u32 get_active_pcr_banks;
8558166ec09SArd Biesheuvel 		u32 set_active_pcr_banks;
8568166ec09SArd Biesheuvel 		u32 get_result_of_set_active_pcr_banks;
8578166ec09SArd Biesheuvel 	} mixed_mode;
8588166ec09SArd Biesheuvel };
8598166ec09SArd Biesheuvel 
8603f68e695SSunil V L struct riscv_efi_boot_protocol {
8613f68e695SSunil V L 	u64 revision;
8623f68e695SSunil V L 
8633f68e695SSunil V L 	efi_status_t (__efiapi *get_boot_hartid)(struct riscv_efi_boot_protocol *,
8643f68e695SSunil V L 						 unsigned long *boot_hartid);
8653f68e695SSunil V L };
8663f68e695SSunil V L 
8672931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t;
8682931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t;
8692931d526SArd Biesheuvel 
8702931d526SArd Biesheuvel union efi_load_file_protocol {
8712931d526SArd Biesheuvel 	struct {
8722931d526SArd Biesheuvel 		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,
8732931d526SArd Biesheuvel 						   efi_device_path_protocol_t *,
8742931d526SArd Biesheuvel 						   bool, unsigned long *, void *);
8752931d526SArd Biesheuvel 	};
8762931d526SArd Biesheuvel 	struct {
8772931d526SArd Biesheuvel 		u32 load_file;
8782931d526SArd Biesheuvel 	} mixed_mode;
8792931d526SArd Biesheuvel };
8802931d526SArd Biesheuvel 
8814a568ce2SArvind Sankar typedef struct {
8824a568ce2SArvind Sankar 	u32 attributes;
8834a568ce2SArvind Sankar 	u16 file_path_list_length;
8844a568ce2SArvind Sankar 	u8 variable_data[];
8854a568ce2SArvind Sankar 	// efi_char16_t description[];
8864a568ce2SArvind Sankar 	// efi_device_path_protocol_t file_path_list[];
8874a568ce2SArvind Sankar 	// u8 optional_data[];
8884a568ce2SArvind Sankar } __packed efi_load_option_t;
8894a568ce2SArvind Sankar 
8904a568ce2SArvind Sankar #define EFI_LOAD_OPTION_ACTIVE		0x0001U
8914a568ce2SArvind Sankar #define EFI_LOAD_OPTION_FORCE_RECONNECT	0x0002U
8924a568ce2SArvind Sankar #define EFI_LOAD_OPTION_HIDDEN		0x0008U
8934a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY	0x1f00U
8944a568ce2SArvind Sankar #define   EFI_LOAD_OPTION_CATEGORY_BOOT	0x0000U
8954a568ce2SArvind Sankar #define   EFI_LOAD_OPTION_CATEGORY_APP	0x0100U
8964a568ce2SArvind Sankar 
8974a568ce2SArvind Sankar #define EFI_LOAD_OPTION_BOOT_MASK \
8984a568ce2SArvind Sankar 	(EFI_LOAD_OPTION_ACTIVE|EFI_LOAD_OPTION_HIDDEN|EFI_LOAD_OPTION_CATEGORY)
8994a568ce2SArvind Sankar #define EFI_LOAD_OPTION_MASK (EFI_LOAD_OPTION_FORCE_RECONNECT|EFI_LOAD_OPTION_BOOT_MASK)
9004a568ce2SArvind Sankar 
9014a568ce2SArvind Sankar typedef struct {
9024a568ce2SArvind Sankar 	u32 attributes;
9034a568ce2SArvind Sankar 	u16 file_path_list_length;
9044a568ce2SArvind Sankar 	const efi_char16_t *description;
9054a568ce2SArvind Sankar 	const efi_device_path_protocol_t *file_path_list;
906a241d94bSArd Biesheuvel 	u32 optional_data_size;
9074a568ce2SArvind Sankar 	const void *optional_data;
9084a568ce2SArvind Sankar } efi_load_option_unpacked_t;
9094a568ce2SArvind Sankar 
9108166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void);
9118166ec09SArd Biesheuvel 
9128166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)(
9138166ec09SArd Biesheuvel 	struct efi_boot_memmap *map,
9148166ec09SArd Biesheuvel 	void *priv);
9158166ec09SArd Biesheuvel 
916eab31265SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle, void *priv,
9178166ec09SArd Biesheuvel 				    efi_exit_boot_map_processing priv_func);
9188166ec09SArd Biesheuvel 
9194fc8e738SArd Biesheuvel efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image,
9204fc8e738SArd Biesheuvel 			     unsigned long kernel_addr, char *cmdline_ptr);
9218166ec09SArd Biesheuvel 
9228166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size);
9238166ec09SArd Biesheuvel 
924f80d2604SArd Biesheuvel efi_status_t efi_alloc_virtmap(efi_memory_desc_t **virtmap,
925f80d2604SArd Biesheuvel 			       unsigned long *desc_size, u32 *desc_ver);
9268166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
9278166ec09SArd Biesheuvel 		     unsigned long desc_size, efi_memory_desc_t *runtime_map,
9288166ec09SArd Biesheuvel 		     int *count);
9298166ec09SArd Biesheuvel 
9308166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);
9318166ec09SArd Biesheuvel 
9328166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align,
9339cf42bcaSArd Biesheuvel 			      unsigned long *addr, unsigned long random_seed,
9349cf42bcaSArd Biesheuvel 			      int memory_type);
9358166ec09SArd Biesheuvel 
9368166ec09SArd Biesheuvel efi_status_t check_platform_features(void);
9378166ec09SArd Biesheuvel 
9388166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid);
9398166ec09SArd Biesheuvel 
940cb8c90a0SArvind Sankar /* NOTE: These functions do not print a trailing newline after the string */
941cb8c90a0SArvind Sankar void efi_char16_puts(efi_char16_t *);
942cb8c90a0SArvind Sankar void efi_puts(const char *str);
9438166ec09SArd Biesheuvel 
9442c7d1e30SArvind Sankar __printf(1, 2) int efi_printk(char const *fmt, ...);
9458166ec09SArd Biesheuvel 
9468166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr);
9478166ec09SArd Biesheuvel 
948a241d94bSArd Biesheuvel void efi_apply_loadoptions_quirk(const void **load_options, u32 *load_options_size);
9494a568ce2SArvind Sankar 
95027cd5511SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
9518166ec09SArd Biesheuvel 
952171539f5SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap **map,
953171539f5SArd Biesheuvel 				bool install_cfg_tbl);
9548166ec09SArd Biesheuvel 
9558166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
9568166ec09SArd Biesheuvel 				unsigned long max);
9578166ec09SArd Biesheuvel 
95843b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
9599cf42bcaSArd Biesheuvel 					unsigned long max, unsigned long align,
9609cf42bcaSArd Biesheuvel 					int memory_type);
96143b1df0eSArd Biesheuvel 
9621a895dbfSArd Biesheuvel efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
9631a895dbfSArd Biesheuvel 				 unsigned long *addr, unsigned long min);
9641a895dbfSArd Biesheuvel 
9658166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr,
9668166ec09SArd Biesheuvel 				 unsigned long image_size,
9678166ec09SArd Biesheuvel 				 unsigned long alloc_size,
9688166ec09SArd Biesheuvel 				 unsigned long preferred_addr,
9698166ec09SArd Biesheuvel 				 unsigned long alignment,
9708166ec09SArd Biesheuvel 				 unsigned long min_addr);
9718166ec09SArd Biesheuvel 
9728166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline);
9738166ec09SArd Biesheuvel 
974fffb6804SArvind Sankar void efi_parse_option_graphics(char *option);
975fffb6804SArvind Sankar 
9768166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
9778166ec09SArd Biesheuvel 			   unsigned long size);
9788166ec09SArd Biesheuvel 
979cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
980cf6b8366SArd Biesheuvel 				  const efi_char16_t *optstr,
981cf6b8366SArd Biesheuvel 				  int optstr_size,
982cf6b8366SArd Biesheuvel 				  unsigned long soft_limit,
983cf6b8366SArd Biesheuvel 				  unsigned long hard_limit,
9849302c1bbSArd Biesheuvel 				  unsigned long *load_addr,
9859302c1bbSArd Biesheuvel 				  unsigned long *load_size);
9869302c1bbSArd Biesheuvel 
987cf6b8366SArd Biesheuvel 
988cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
989cf6b8366SArd Biesheuvel 					unsigned long *load_addr,
990cf6b8366SArd Biesheuvel 					unsigned long *load_size)
991cf6b8366SArd Biesheuvel {
992cf6b8366SArd Biesheuvel 	return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
993cf6b8366SArd Biesheuvel 				    ULONG_MAX, ULONG_MAX, load_addr, load_size);
994cf6b8366SArd Biesheuvel }
995cf6b8366SArd Biesheuvel 
996f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image,
99731f5e546SArd Biesheuvel 			     unsigned long soft_limit,
998f4dc7fffSArd Biesheuvel 			     unsigned long hard_limit,
999f4dc7fffSArd Biesheuvel 			     const struct linux_efi_initrd **out);
10003230d95cSAtish Patra /*
10013230d95cSAtish Patra  * This function handles the architcture specific differences between arm and
10023230d95cSAtish Patra  * arm64 regarding where the kernel image must be loaded and any memory that
10033230d95cSAtish Patra  * must be reserved. On failure it is required to free all
10043230d95cSAtish Patra  * all allocations it has made.
10053230d95cSAtish Patra  */
10063230d95cSAtish Patra efi_status_t handle_kernel_image(unsigned long *image_addr,
10073230d95cSAtish Patra 				 unsigned long *image_size,
10083230d95cSAtish Patra 				 unsigned long *reserve_addr,
10093230d95cSAtish Patra 				 unsigned long *reserve_size,
1010416a9f84SArd Biesheuvel 				 efi_loaded_image_t *image,
1011416a9f84SArd Biesheuvel 				 efi_handle_t image_handle);
10123230d95cSAtish Patra 
101342c8ea3dSArd Biesheuvel /* shared entrypoint between the normal stub and the zboot stub */
101442c8ea3dSArd Biesheuvel efi_status_t efi_stub_common(efi_handle_t handle,
101542c8ea3dSArd Biesheuvel 			     efi_loaded_image_t *image,
101642c8ea3dSArd Biesheuvel 			     unsigned long image_addr,
101742c8ea3dSArd Biesheuvel 			     char *cmdline_ptr);
101842c8ea3dSArd Biesheuvel 
101942c8ea3dSArd Biesheuvel efi_status_t efi_handle_cmdline(efi_loaded_image_t *image, char **cmdline_ptr);
102042c8ea3dSArd Biesheuvel 
10213230d95cSAtish Patra asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint,
10223230d95cSAtish Patra 					    unsigned long fdt_addr,
10233230d95cSAtish Patra 					    unsigned long fdt_size);
1024ec93fc37SArd Biesheuvel 
10252a55280aSArd Biesheuvel void efi_handle_post_ebs_state(void);
10262a55280aSArd Biesheuvel 
1027e1ac4b24SChester Lin enum efi_secureboot_mode efi_get_secureboot(void);
1028e1ac4b24SChester Lin 
10293820749dSArd Biesheuvel #ifdef CONFIG_RESET_ATTACK_MITIGATION
10303820749dSArd Biesheuvel void efi_enable_reset_attack_mitigation(void);
10313820749dSArd Biesheuvel #else
10323820749dSArd Biesheuvel static inline void
10333820749dSArd Biesheuvel efi_enable_reset_attack_mitigation(void) { }
10343820749dSArd Biesheuvel #endif
10353820749dSArd Biesheuvel 
10363820749dSArd Biesheuvel void efi_retrieve_tpm2_eventlog(void);
10373820749dSArd Biesheuvel 
1038732ea9dbSArd Biesheuvel struct screen_info *alloc_screen_info(void);
1039732ea9dbSArd Biesheuvel void free_screen_info(struct screen_info *si);
1040732ea9dbSArd Biesheuvel 
1041d9ffe524SArd Biesheuvel void efi_cache_sync_image(unsigned long image_base,
1042d9ffe524SArd Biesheuvel 			  unsigned long alloc_size,
1043d9ffe524SArd Biesheuvel 			  unsigned long code_size);
1044d9ffe524SArd Biesheuvel 
1045550b33cfSArd Biesheuvel struct efi_smbios_record {
1046550b33cfSArd Biesheuvel 	u8	type;
1047550b33cfSArd Biesheuvel 	u8	length;
1048550b33cfSArd Biesheuvel 	u16	handle;
1049550b33cfSArd Biesheuvel };
1050550b33cfSArd Biesheuvel 
1051550b33cfSArd Biesheuvel struct efi_smbios_type1_record {
1052550b33cfSArd Biesheuvel 	struct efi_smbios_record	header;
1053550b33cfSArd Biesheuvel 
1054550b33cfSArd Biesheuvel 	u8				manufacturer;
1055550b33cfSArd Biesheuvel 	u8				product_name;
1056550b33cfSArd Biesheuvel 	u8				version;
1057550b33cfSArd Biesheuvel 	u8				serial_number;
1058550b33cfSArd Biesheuvel 	efi_guid_t			uuid;
1059550b33cfSArd Biesheuvel 	u8				wakeup_type;
1060550b33cfSArd Biesheuvel 	u8				sku_number;
1061550b33cfSArd Biesheuvel 	u8				family;
1062550b33cfSArd Biesheuvel };
1063550b33cfSArd Biesheuvel 
1064550b33cfSArd Biesheuvel #define efi_get_smbios_string(__type, __name) ({			\
1065550b33cfSArd Biesheuvel 	int size = sizeof(struct efi_smbios_type ## __type ## _record);	\
1066550b33cfSArd Biesheuvel 	int off = offsetof(struct efi_smbios_type ## __type ## _record,	\
1067550b33cfSArd Biesheuvel 			   __name);					\
1068550b33cfSArd Biesheuvel 	__efi_get_smbios_string(__type, off, size);			\
1069550b33cfSArd Biesheuvel })
1070550b33cfSArd Biesheuvel 
1071550b33cfSArd Biesheuvel const u8 *__efi_get_smbios_string(u8 type, int offset, int recsize);
1072550b33cfSArd Biesheuvel 
1073f4f75ad5SArd Biesheuvel #endif
1074