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 
6f4f75ad5SArd Biesheuvel /* error code which can't be mistaken for valid address */
7f4f75ad5SArd Biesheuvel #define EFI_ERROR	(~0UL)
8f4f75ad5SArd Biesheuvel 
907e83dbbSArd Biesheuvel /*
1007e83dbbSArd Biesheuvel  * __init annotations should not be used in the EFI stub, since the code is
1107e83dbbSArd Biesheuvel  * either included in the decompressor (x86, ARM) where they have no effect,
1207e83dbbSArd Biesheuvel  * or the whole stub is __init annotated at the section level (arm64), by
1307e83dbbSArd Biesheuvel  * renaming the sections, in which case the __init annotation will be
1407e83dbbSArd Biesheuvel  * redundant, and will result in section names like .init.init.text, and our
1507e83dbbSArd Biesheuvel  * linker script does not expect that.
1607e83dbbSArd Biesheuvel  */
1707e83dbbSArd Biesheuvel #undef __init
1807e83dbbSArd Biesheuvel 
19a6a14469SArd Biesheuvel /*
20a6a14469SArd Biesheuvel  * Allow the platform to override the allocation granularity: this allows
21a6a14469SArd Biesheuvel  * systems that have the capability to run with a larger page size to deal
22a6a14469SArd Biesheuvel  * with the allocations for initrd and fdt more efficiently.
23a6a14469SArd Biesheuvel  */
24a6a14469SArd Biesheuvel #ifndef EFI_ALLOC_ALIGN
25a6a14469SArd Biesheuvel #define EFI_ALLOC_ALIGN		EFI_PAGE_SIZE
26a6a14469SArd Biesheuvel #endif
27a6a14469SArd Biesheuvel 
28980771f6SArd Biesheuvel extern bool efi_nochunk;
29980771f6SArd Biesheuvel extern bool efi_nokaslr;
30980771f6SArd Biesheuvel extern bool efi_noinitrd;
31980771f6SArd Biesheuvel extern bool efi_quiet;
32980771f6SArd Biesheuvel extern bool efi_novamap;
33eeff7d63SArd Biesheuvel 
34ccc27ae7SArd Biesheuvel extern const efi_system_table_t *efi_system_table;
352fcdad2aSArd Biesheuvel 
3622090f84SArd Biesheuvel #ifndef efi_bs_call
37ccc27ae7SArd Biesheuvel #define efi_bs_call(func, ...)	efi_system_table->boottime->func(__VA_ARGS__)
3822090f84SArd Biesheuvel #endif
3922090f84SArd Biesheuvel #ifndef efi_rt_call
40ccc27ae7SArd Biesheuvel #define efi_rt_call(func, ...)	efi_system_table->runtime->func(__VA_ARGS__)
4122090f84SArd Biesheuvel #endif
4222090f84SArd Biesheuvel #ifndef efi_is_native
4322090f84SArd Biesheuvel #define efi_is_native()		(true)
4422090f84SArd Biesheuvel #endif
4522090f84SArd Biesheuvel #ifndef efi_table_attr
4622090f84SArd Biesheuvel #define efi_table_attr(inst, attr)	(inst->attr)
4722090f84SArd Biesheuvel #endif
4822090f84SArd Biesheuvel #ifndef efi_call_proto
4922090f84SArd Biesheuvel #define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
5022090f84SArd Biesheuvel #endif
5122090f84SArd Biesheuvel 
52793473c2SArvind Sankar #define efi_info(msg)		do {			\
53980771f6SArd Biesheuvel 	if (!efi_quiet) efi_printk("EFI stub: "msg);	\
54eeff7d63SArd Biesheuvel } while (0)
55eeff7d63SArd Biesheuvel 
56793473c2SArvind Sankar #define efi_err(msg) efi_printk("EFI stub: ERROR: "msg)
5760f38de7SArd Biesheuvel 
58ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */
59ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var
60ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \
61ac9aff8eSIngo Molnar 	fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var))
62ac9aff8eSIngo Molnar #endif
63ac9aff8eSIngo Molnar 
64ac9aff8eSIngo Molnar #ifndef fdt_setprop_var
65ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \
66ac9aff8eSIngo Molnar 	fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var))
67ac9aff8eSIngo Molnar #endif
68ac9aff8eSIngo Molnar 
69966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...)				\
70966291f6SArd Biesheuvel 	efi_rt_call(get_variable, (efi_char16_t *)(name),	\
71966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
72966291f6SArd Biesheuvel 
73966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...)				\
74966291f6SArd Biesheuvel 	efi_rt_call(set_variable, (efi_char16_t *)(name),	\
75966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
76966291f6SArd Biesheuvel 
778166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx)					\
788166ec09SArd Biesheuvel 	(efi_is_native() ? (array)[idx] 				\
798166ec09SArd Biesheuvel 		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
808166ec09SArd Biesheuvel 
818166ec09SArd Biesheuvel #define efi_get_handle_num(size)					\
828166ec09SArd Biesheuvel 	((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
838166ec09SArd Biesheuvel 
848166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i)			\
858166ec09SArd Biesheuvel 	for (i = 0;							\
868166ec09SArd Biesheuvel 	     i < efi_get_handle_num(size) &&				\
878166ec09SArd Biesheuvel 		((handle = efi_get_handle_at((array), i)) || true);	\
888166ec09SArd Biesheuvel 	     i++)
898166ec09SArd Biesheuvel 
90eed4e019SArvind Sankar static inline
91eed4e019SArvind Sankar void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)
92eed4e019SArvind Sankar {
93eed4e019SArvind Sankar 	*lo = lower_32_bits(data);
94eed4e019SArvind Sankar 	*hi = upper_32_bits(data);
95eed4e019SArvind Sankar }
96eed4e019SArvind Sankar 
978166ec09SArd Biesheuvel /*
988166ec09SArd Biesheuvel  * Allocation types for calls to boottime->allocate_pages.
998166ec09SArd Biesheuvel  */
1008166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES		0
1018166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS	1
1028166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS		2
1038166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE		3
1048166ec09SArd Biesheuvel 
1058166ec09SArd Biesheuvel /*
1068166ec09SArd Biesheuvel  * The type of search to perform when calling boottime->locate_handle
1078166ec09SArd Biesheuvel  */
1088166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES			0
1098166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1108166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL			2
1118166ec09SArd Biesheuvel 
1128166ec09SArd Biesheuvel struct efi_boot_memmap {
1138166ec09SArd Biesheuvel 	efi_memory_desc_t	**map;
1148166ec09SArd Biesheuvel 	unsigned long		*map_size;
1158166ec09SArd Biesheuvel 	unsigned long		*desc_size;
1168166ec09SArd Biesheuvel 	u32			*desc_ver;
1178166ec09SArd Biesheuvel 	unsigned long		*key_ptr;
1188166ec09SArd Biesheuvel 	unsigned long		*buff_size;
1198166ec09SArd Biesheuvel };
1208166ec09SArd Biesheuvel 
121abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t;
122abd26868SArd Biesheuvel 
1238166ec09SArd Biesheuvel /*
1248166ec09SArd Biesheuvel  * EFI Boot Services table
1258166ec09SArd Biesheuvel  */
1268166ec09SArd Biesheuvel union efi_boot_services {
1278166ec09SArd Biesheuvel 	struct {
1288166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
1298166ec09SArd Biesheuvel 		void *raise_tpl;
1308166ec09SArd Biesheuvel 		void *restore_tpl;
1318166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
1328166ec09SArd Biesheuvel 							efi_physical_addr_t *);
1338166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
1348166ec09SArd Biesheuvel 						    unsigned long);
1358166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
1368166ec09SArd Biesheuvel 							unsigned long *,
1378166ec09SArd Biesheuvel 							unsigned long *, u32 *);
1388166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
1398166ec09SArd Biesheuvel 						       void **);
1408166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pool)(void *);
1418166ec09SArd Biesheuvel 		void *create_event;
1428166ec09SArd Biesheuvel 		void *set_timer;
1438166ec09SArd Biesheuvel 		void *wait_for_event;
1448166ec09SArd Biesheuvel 		void *signal_event;
1458166ec09SArd Biesheuvel 		void *close_event;
1468166ec09SArd Biesheuvel 		void *check_event;
1478166ec09SArd Biesheuvel 		void *install_protocol_interface;
1488166ec09SArd Biesheuvel 		void *reinstall_protocol_interface;
1498166ec09SArd Biesheuvel 		void *uninstall_protocol_interface;
1508166ec09SArd Biesheuvel 		efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
1518166ec09SArd Biesheuvel 							 efi_guid_t *, void **);
1528166ec09SArd Biesheuvel 		void *__reserved;
1538166ec09SArd Biesheuvel 		void *register_protocol_notify;
1548166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
1558166ec09SArd Biesheuvel 						       void *, unsigned long *,
1568166ec09SArd Biesheuvel 						       efi_handle_t *);
157abd26868SArd Biesheuvel 		efi_status_t (__efiapi *locate_device_path)(efi_guid_t *,
158abd26868SArd Biesheuvel 							    efi_device_path_protocol_t **,
159abd26868SArd Biesheuvel 							    efi_handle_t *);
1608166ec09SArd Biesheuvel 		efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
1618166ec09SArd Biesheuvel 								     void *);
1628166ec09SArd Biesheuvel 		void *load_image;
1638166ec09SArd Biesheuvel 		void *start_image;
1643b8f44fcSArd Biesheuvel 		efi_status_t __noreturn (__efiapi *exit)(efi_handle_t,
1653b8f44fcSArd Biesheuvel 							 efi_status_t,
1663b8f44fcSArd Biesheuvel 							 unsigned long,
1673b8f44fcSArd Biesheuvel 							 efi_char16_t *);
1688166ec09SArd Biesheuvel 		void *unload_image;
1698166ec09SArd Biesheuvel 		efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
1708166ec09SArd Biesheuvel 							    unsigned long);
1718166ec09SArd Biesheuvel 		void *get_next_monotonic_count;
1728166ec09SArd Biesheuvel 		void *stall;
1738166ec09SArd Biesheuvel 		void *set_watchdog_timer;
1748166ec09SArd Biesheuvel 		void *connect_controller;
1758166ec09SArd Biesheuvel 		efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
1768166ec09SArd Biesheuvel 							       efi_handle_t,
1778166ec09SArd Biesheuvel 							       efi_handle_t);
1788166ec09SArd Biesheuvel 		void *open_protocol;
1798166ec09SArd Biesheuvel 		void *close_protocol;
1808166ec09SArd Biesheuvel 		void *open_protocol_information;
1818166ec09SArd Biesheuvel 		void *protocols_per_handle;
1828166ec09SArd Biesheuvel 		void *locate_handle_buffer;
1838166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
1848166ec09SArd Biesheuvel 							 void **);
1858166ec09SArd Biesheuvel 		void *install_multiple_protocol_interfaces;
1868166ec09SArd Biesheuvel 		void *uninstall_multiple_protocol_interfaces;
1878166ec09SArd Biesheuvel 		void *calculate_crc32;
1888166ec09SArd Biesheuvel 		void *copy_mem;
1898166ec09SArd Biesheuvel 		void *set_mem;
1908166ec09SArd Biesheuvel 		void *create_event_ex;
1918166ec09SArd Biesheuvel 	};
1928166ec09SArd Biesheuvel 	struct {
1938166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
1948166ec09SArd Biesheuvel 		u32 raise_tpl;
1958166ec09SArd Biesheuvel 		u32 restore_tpl;
1968166ec09SArd Biesheuvel 		u32 allocate_pages;
1978166ec09SArd Biesheuvel 		u32 free_pages;
1988166ec09SArd Biesheuvel 		u32 get_memory_map;
1998166ec09SArd Biesheuvel 		u32 allocate_pool;
2008166ec09SArd Biesheuvel 		u32 free_pool;
2018166ec09SArd Biesheuvel 		u32 create_event;
2028166ec09SArd Biesheuvel 		u32 set_timer;
2038166ec09SArd Biesheuvel 		u32 wait_for_event;
2048166ec09SArd Biesheuvel 		u32 signal_event;
2058166ec09SArd Biesheuvel 		u32 close_event;
2068166ec09SArd Biesheuvel 		u32 check_event;
2078166ec09SArd Biesheuvel 		u32 install_protocol_interface;
2088166ec09SArd Biesheuvel 		u32 reinstall_protocol_interface;
2098166ec09SArd Biesheuvel 		u32 uninstall_protocol_interface;
2108166ec09SArd Biesheuvel 		u32 handle_protocol;
2118166ec09SArd Biesheuvel 		u32 __reserved;
2128166ec09SArd Biesheuvel 		u32 register_protocol_notify;
2138166ec09SArd Biesheuvel 		u32 locate_handle;
2148166ec09SArd Biesheuvel 		u32 locate_device_path;
2158166ec09SArd Biesheuvel 		u32 install_configuration_table;
2168166ec09SArd Biesheuvel 		u32 load_image;
2178166ec09SArd Biesheuvel 		u32 start_image;
2188166ec09SArd Biesheuvel 		u32 exit;
2198166ec09SArd Biesheuvel 		u32 unload_image;
2208166ec09SArd Biesheuvel 		u32 exit_boot_services;
2218166ec09SArd Biesheuvel 		u32 get_next_monotonic_count;
2228166ec09SArd Biesheuvel 		u32 stall;
2238166ec09SArd Biesheuvel 		u32 set_watchdog_timer;
2248166ec09SArd Biesheuvel 		u32 connect_controller;
2258166ec09SArd Biesheuvel 		u32 disconnect_controller;
2268166ec09SArd Biesheuvel 		u32 open_protocol;
2278166ec09SArd Biesheuvel 		u32 close_protocol;
2288166ec09SArd Biesheuvel 		u32 open_protocol_information;
2298166ec09SArd Biesheuvel 		u32 protocols_per_handle;
2308166ec09SArd Biesheuvel 		u32 locate_handle_buffer;
2318166ec09SArd Biesheuvel 		u32 locate_protocol;
2328166ec09SArd Biesheuvel 		u32 install_multiple_protocol_interfaces;
2338166ec09SArd Biesheuvel 		u32 uninstall_multiple_protocol_interfaces;
2348166ec09SArd Biesheuvel 		u32 calculate_crc32;
2358166ec09SArd Biesheuvel 		u32 copy_mem;
2368166ec09SArd Biesheuvel 		u32 set_mem;
2378166ec09SArd Biesheuvel 		u32 create_event_ex;
2388166ec09SArd Biesheuvel 	} mixed_mode;
2398166ec09SArd Biesheuvel };
2408166ec09SArd Biesheuvel 
241c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t;
242c2d0b470SArd Biesheuvel 
243c2d0b470SArd Biesheuvel union efi_uga_draw_protocol {
244c2d0b470SArd Biesheuvel 	struct {
245c2d0b470SArd Biesheuvel 		efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *,
246c2d0b470SArd Biesheuvel 						  u32*, u32*, u32*, u32*);
247c2d0b470SArd Biesheuvel 		void *set_mode;
248c2d0b470SArd Biesheuvel 		void *blt;
249c2d0b470SArd Biesheuvel 	};
250c2d0b470SArd Biesheuvel 	struct {
251c2d0b470SArd Biesheuvel 		u32 get_mode;
252c2d0b470SArd Biesheuvel 		u32 set_mode;
253c2d0b470SArd Biesheuvel 		u32 blt;
254c2d0b470SArd Biesheuvel 	} mixed_mode;
255c2d0b470SArd Biesheuvel };
256c2d0b470SArd Biesheuvel 
2578166ec09SArd Biesheuvel union efi_simple_text_output_protocol {
2588166ec09SArd Biesheuvel 	struct {
2598166ec09SArd Biesheuvel 		void *reset;
2608166ec09SArd Biesheuvel 		efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
2618166ec09SArd Biesheuvel 						       efi_char16_t *);
2628166ec09SArd Biesheuvel 		void *test_string;
2638166ec09SArd Biesheuvel 	};
2648166ec09SArd Biesheuvel 	struct {
2658166ec09SArd Biesheuvel 		u32 reset;
2668166ec09SArd Biesheuvel 		u32 output_string;
2678166ec09SArd Biesheuvel 		u32 test_string;
2688166ec09SArd Biesheuvel 	} mixed_mode;
2698166ec09SArd Biesheuvel };
2708166ec09SArd Biesheuvel 
2718166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
2728166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
2738166ec09SArd Biesheuvel #define PIXEL_BIT_MASK					2
2748166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY					3
2758166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
2768166ec09SArd Biesheuvel 
2778166ec09SArd Biesheuvel typedef struct {
2788166ec09SArd Biesheuvel 	u32 red_mask;
2798166ec09SArd Biesheuvel 	u32 green_mask;
2808166ec09SArd Biesheuvel 	u32 blue_mask;
2818166ec09SArd Biesheuvel 	u32 reserved_mask;
2828166ec09SArd Biesheuvel } efi_pixel_bitmask_t;
2838166ec09SArd Biesheuvel 
2848166ec09SArd Biesheuvel typedef struct {
2858166ec09SArd Biesheuvel 	u32 version;
2868166ec09SArd Biesheuvel 	u32 horizontal_resolution;
2878166ec09SArd Biesheuvel 	u32 vertical_resolution;
2888166ec09SArd Biesheuvel 	int pixel_format;
2898166ec09SArd Biesheuvel 	efi_pixel_bitmask_t pixel_information;
2908166ec09SArd Biesheuvel 	u32 pixels_per_scan_line;
2918166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t;
2928166ec09SArd Biesheuvel 
2938166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
2948166ec09SArd Biesheuvel 
2958166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode {
2968166ec09SArd Biesheuvel 	struct {
2978166ec09SArd Biesheuvel 		u32 max_mode;
2988166ec09SArd Biesheuvel 		u32 mode;
2998166ec09SArd Biesheuvel 		efi_graphics_output_mode_info_t *info;
3008166ec09SArd Biesheuvel 		unsigned long size_of_info;
3018166ec09SArd Biesheuvel 		efi_physical_addr_t frame_buffer_base;
3028166ec09SArd Biesheuvel 		unsigned long frame_buffer_size;
3038166ec09SArd Biesheuvel 	};
3048166ec09SArd Biesheuvel 	struct {
3058166ec09SArd Biesheuvel 		u32 max_mode;
3068166ec09SArd Biesheuvel 		u32 mode;
3078166ec09SArd Biesheuvel 		u32 info;
3088166ec09SArd Biesheuvel 		u32 size_of_info;
3098166ec09SArd Biesheuvel 		u64 frame_buffer_base;
3108166ec09SArd Biesheuvel 		u32 frame_buffer_size;
3118166ec09SArd Biesheuvel 	} mixed_mode;
3128166ec09SArd Biesheuvel };
3138166ec09SArd Biesheuvel 
3148166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
3158166ec09SArd Biesheuvel 
3168166ec09SArd Biesheuvel union efi_graphics_output_protocol {
3178166ec09SArd Biesheuvel 	struct {
318b4b89a02SArvind Sankar 		efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *,
319b4b89a02SArvind Sankar 						    u32, unsigned long *,
320b4b89a02SArvind Sankar 						    efi_graphics_output_mode_info_t **);
321b4b89a02SArvind Sankar 		efi_status_t (__efiapi *set_mode)  (efi_graphics_output_protocol_t *, u32);
3228166ec09SArd Biesheuvel 		void *blt;
3238166ec09SArd Biesheuvel 		efi_graphics_output_protocol_mode_t *mode;
3248166ec09SArd Biesheuvel 	};
3258166ec09SArd Biesheuvel 	struct {
3268166ec09SArd Biesheuvel 		u32 query_mode;
3278166ec09SArd Biesheuvel 		u32 set_mode;
3288166ec09SArd Biesheuvel 		u32 blt;
3298166ec09SArd Biesheuvel 		u32 mode;
3308166ec09SArd Biesheuvel 	} mixed_mode;
3318166ec09SArd Biesheuvel };
3328166ec09SArd Biesheuvel 
333f7b85b33SArd Biesheuvel typedef union {
334f7b85b33SArd Biesheuvel 	struct {
335a46a290aSArd Biesheuvel 		u32			revision;
336a46a290aSArd Biesheuvel 		efi_handle_t		parent_handle;
337a46a290aSArd Biesheuvel 		efi_system_table_t	*system_table;
338a46a290aSArd Biesheuvel 		efi_handle_t		device_handle;
339a46a290aSArd Biesheuvel 		void			*file_path;
340a46a290aSArd Biesheuvel 		void			*reserved;
341a46a290aSArd Biesheuvel 		u32			load_options_size;
342a46a290aSArd Biesheuvel 		void			*load_options;
343a46a290aSArd Biesheuvel 		void			*image_base;
344a46a290aSArd Biesheuvel 		__aligned_u64		image_size;
345a46a290aSArd Biesheuvel 		unsigned int		image_code_type;
346a46a290aSArd Biesheuvel 		unsigned int		image_data_type;
347a46a290aSArd Biesheuvel 		efi_status_t		(__efiapi *unload)(efi_handle_t image_handle);
348f7b85b33SArd Biesheuvel 	};
349f7b85b33SArd Biesheuvel 	struct {
350f7b85b33SArd Biesheuvel 		u32		revision;
351f7b85b33SArd Biesheuvel 		u32		parent_handle;
352f7b85b33SArd Biesheuvel 		u32		system_table;
353f7b85b33SArd Biesheuvel 		u32		device_handle;
354f7b85b33SArd Biesheuvel 		u32		file_path;
355f7b85b33SArd Biesheuvel 		u32		reserved;
356f7b85b33SArd Biesheuvel 		u32		load_options_size;
357f7b85b33SArd Biesheuvel 		u32		load_options;
358f7b85b33SArd Biesheuvel 		u32		image_base;
359f7b85b33SArd Biesheuvel 		__aligned_u64	image_size;
360f7b85b33SArd Biesheuvel 		u32		image_code_type;
361f7b85b33SArd Biesheuvel 		u32		image_data_type;
362f7b85b33SArd Biesheuvel 		u32		unload;
363f7b85b33SArd Biesheuvel 	} mixed_mode;
364a46a290aSArd Biesheuvel } efi_loaded_image_t;
365a46a290aSArd Biesheuvel 
366a46a290aSArd Biesheuvel typedef struct {
367a46a290aSArd Biesheuvel 	u64			size;
368a46a290aSArd Biesheuvel 	u64			file_size;
369a46a290aSArd Biesheuvel 	u64			phys_size;
370a46a290aSArd Biesheuvel 	efi_time_t		create_time;
371a46a290aSArd Biesheuvel 	efi_time_t		last_access_time;
372a46a290aSArd Biesheuvel 	efi_time_t		modification_time;
373a46a290aSArd Biesheuvel 	__aligned_u64		attribute;
3749302c1bbSArd Biesheuvel 	efi_char16_t		filename[];
375a46a290aSArd Biesheuvel } efi_file_info_t;
376a46a290aSArd Biesheuvel 
377a46a290aSArd Biesheuvel typedef struct efi_file_protocol efi_file_protocol_t;
378a46a290aSArd Biesheuvel 
379a46a290aSArd Biesheuvel struct efi_file_protocol {
380a46a290aSArd Biesheuvel 	u64		revision;
381a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *open)	(efi_file_protocol_t *,
382a46a290aSArd Biesheuvel 						 efi_file_protocol_t **,
383a46a290aSArd Biesheuvel 						 efi_char16_t *, u64, u64);
384a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *close)	(efi_file_protocol_t *);
385a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *delete)	(efi_file_protocol_t *);
386a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *read)	(efi_file_protocol_t *,
387a46a290aSArd Biesheuvel 						 unsigned long *, void *);
388a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *write)	(efi_file_protocol_t *,
389a46a290aSArd Biesheuvel 						 unsigned long, void *);
390a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_position)(efi_file_protocol_t *, u64 *);
391a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_position)(efi_file_protocol_t *, u64);
392a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_info)	(efi_file_protocol_t *,
393a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long *,
394a46a290aSArd Biesheuvel 						 void *);
395a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_info)	(efi_file_protocol_t *,
396a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long,
397a46a290aSArd Biesheuvel 						 void *);
398a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *flush)	(efi_file_protocol_t *);
399a46a290aSArd Biesheuvel };
400a46a290aSArd Biesheuvel 
401a46a290aSArd Biesheuvel typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t;
402a46a290aSArd Biesheuvel 
403a46a290aSArd Biesheuvel struct efi_simple_file_system_protocol {
404a46a290aSArd Biesheuvel 	u64	revision;
405a46a290aSArd Biesheuvel 	int	(__efiapi *open_volume)(efi_simple_file_system_protocol_t *,
406a46a290aSArd Biesheuvel 					efi_file_protocol_t **);
407a46a290aSArd Biesheuvel };
408a46a290aSArd Biesheuvel 
409a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ	0x0000000000000001
410a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE	0x0000000000000002
411a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE	0x8000000000000000
412a46a290aSArd Biesheuvel 
4138166ec09SArd Biesheuvel typedef enum {
4148166ec09SArd Biesheuvel 	EfiPciIoWidthUint8,
4158166ec09SArd Biesheuvel 	EfiPciIoWidthUint16,
4168166ec09SArd Biesheuvel 	EfiPciIoWidthUint32,
4178166ec09SArd Biesheuvel 	EfiPciIoWidthUint64,
4188166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint8,
4198166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint16,
4208166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint32,
4218166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint64,
4228166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint8,
4238166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint16,
4248166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint32,
4258166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint64,
4268166ec09SArd Biesheuvel 	EfiPciIoWidthMaximum
4278166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH;
4288166ec09SArd Biesheuvel 
4298166ec09SArd Biesheuvel typedef enum {
4308166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationGet,
4318166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSet,
4328166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationEnable,
4338166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationDisable,
4348166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSupported,
4358166ec09SArd Biesheuvel     EfiPciIoAttributeOperationMaximum
4368166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
4378166ec09SArd Biesheuvel 
4388166ec09SArd Biesheuvel typedef struct {
4398166ec09SArd Biesheuvel 	u32 read;
4408166ec09SArd Biesheuvel 	u32 write;
4418166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t;
4428166ec09SArd Biesheuvel 
4438166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
4448166ec09SArd Biesheuvel 
4458166ec09SArd Biesheuvel typedef
4468166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
4478166ec09SArd Biesheuvel 						   EFI_PCI_IO_PROTOCOL_WIDTH,
4488166ec09SArd Biesheuvel 						   u32 offset,
4498166ec09SArd Biesheuvel 						   unsigned long count,
4508166ec09SArd Biesheuvel 						   void *buffer);
4518166ec09SArd Biesheuvel 
4528166ec09SArd Biesheuvel typedef struct {
4538166ec09SArd Biesheuvel 	void *read;
4548166ec09SArd Biesheuvel 	void *write;
4558166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t;
4568166ec09SArd Biesheuvel 
4578166ec09SArd Biesheuvel typedef struct {
4588166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t read;
4598166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t write;
4608166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t;
4618166ec09SArd Biesheuvel 
4628166ec09SArd Biesheuvel union efi_pci_io_protocol {
4638166ec09SArd Biesheuvel 	struct {
4648166ec09SArd Biesheuvel 		void *poll_mem;
4658166ec09SArd Biesheuvel 		void *poll_io;
4668166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t mem;
4678166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t io;
4688166ec09SArd Biesheuvel 		efi_pci_io_protocol_config_access_t pci;
4698166ec09SArd Biesheuvel 		void *copy_mem;
4708166ec09SArd Biesheuvel 		void *map;
4718166ec09SArd Biesheuvel 		void *unmap;
4728166ec09SArd Biesheuvel 		void *allocate_buffer;
4738166ec09SArd Biesheuvel 		void *free_buffer;
4748166ec09SArd Biesheuvel 		void *flush;
4758166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
4768166ec09SArd Biesheuvel 						      unsigned long *segment_nr,
4778166ec09SArd Biesheuvel 						      unsigned long *bus_nr,
4788166ec09SArd Biesheuvel 						      unsigned long *device_nr,
4798166ec09SArd Biesheuvel 						      unsigned long *func_nr);
4808166ec09SArd Biesheuvel 		void *attributes;
4818166ec09SArd Biesheuvel 		void *get_bar_attributes;
4828166ec09SArd Biesheuvel 		void *set_bar_attributes;
4838166ec09SArd Biesheuvel 		uint64_t romsize;
4848166ec09SArd Biesheuvel 		void *romimage;
4858166ec09SArd Biesheuvel 	};
4868166ec09SArd Biesheuvel 	struct {
4878166ec09SArd Biesheuvel 		u32 poll_mem;
4888166ec09SArd Biesheuvel 		u32 poll_io;
4898166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t mem;
4908166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t io;
4918166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t pci;
4928166ec09SArd Biesheuvel 		u32 copy_mem;
4938166ec09SArd Biesheuvel 		u32 map;
4948166ec09SArd Biesheuvel 		u32 unmap;
4958166ec09SArd Biesheuvel 		u32 allocate_buffer;
4968166ec09SArd Biesheuvel 		u32 free_buffer;
4978166ec09SArd Biesheuvel 		u32 flush;
4988166ec09SArd Biesheuvel 		u32 get_location;
4998166ec09SArd Biesheuvel 		u32 attributes;
5008166ec09SArd Biesheuvel 		u32 get_bar_attributes;
5018166ec09SArd Biesheuvel 		u32 set_bar_attributes;
5028166ec09SArd Biesheuvel 		u64 romsize;
5038166ec09SArd Biesheuvel 		u32 romimage;
5048166ec09SArd Biesheuvel 	} mixed_mode;
5058166ec09SArd Biesheuvel };
5068166ec09SArd Biesheuvel 
5078166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
5088166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
5098166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
5108166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
5118166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
5128166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
5138166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
5148166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
5158166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
5168166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
5178166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
5188166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
5198166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
5208166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
5218166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
5228166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
5238166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
5248166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
5258166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
5268166ec09SArd Biesheuvel 
5278166ec09SArd Biesheuvel struct efi_dev_path;
5288166ec09SArd Biesheuvel 
5298166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t;
5308166ec09SArd Biesheuvel 
5318166ec09SArd Biesheuvel union apple_properties_protocol {
5328166ec09SArd Biesheuvel 	struct {
5338166ec09SArd Biesheuvel 		unsigned long version;
5348166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
5358166ec09SArd Biesheuvel 					     struct efi_dev_path *,
5368166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32 *);
5378166ec09SArd Biesheuvel 		efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
5388166ec09SArd Biesheuvel 					     struct efi_dev_path *,
5398166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32);
5408166ec09SArd Biesheuvel 		efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
5418166ec09SArd Biesheuvel 					     struct efi_dev_path *,
5428166ec09SArd Biesheuvel 					     efi_char16_t *);
5438166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
5448166ec09SArd Biesheuvel 						 void *buffer, u32 *);
5458166ec09SArd Biesheuvel 	};
5468166ec09SArd Biesheuvel 	struct {
5478166ec09SArd Biesheuvel 		u32 version;
5488166ec09SArd Biesheuvel 		u32 get;
5498166ec09SArd Biesheuvel 		u32 set;
5508166ec09SArd Biesheuvel 		u32 del;
5518166ec09SArd Biesheuvel 		u32 get_all;
5528166ec09SArd Biesheuvel 	} mixed_mode;
5538166ec09SArd Biesheuvel };
5548166ec09SArd Biesheuvel 
5558166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format;
5568166ec09SArd Biesheuvel 
5578166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
5588166ec09SArd Biesheuvel 
5598166ec09SArd Biesheuvel union efi_tcg2_protocol {
5608166ec09SArd Biesheuvel 	struct {
5618166ec09SArd Biesheuvel 		void *get_capability;
5628166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_event_log)(efi_handle_t,
5638166ec09SArd Biesheuvel 						       efi_tcg2_event_log_format,
5648166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
5658166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
5668166ec09SArd Biesheuvel 						       efi_bool_t *);
5678166ec09SArd Biesheuvel 		void *hash_log_extend_event;
5688166ec09SArd Biesheuvel 		void *submit_command;
5698166ec09SArd Biesheuvel 		void *get_active_pcr_banks;
5708166ec09SArd Biesheuvel 		void *set_active_pcr_banks;
5718166ec09SArd Biesheuvel 		void *get_result_of_set_active_pcr_banks;
5728166ec09SArd Biesheuvel 	};
5738166ec09SArd Biesheuvel 	struct {
5748166ec09SArd Biesheuvel 		u32 get_capability;
5758166ec09SArd Biesheuvel 		u32 get_event_log;
5768166ec09SArd Biesheuvel 		u32 hash_log_extend_event;
5778166ec09SArd Biesheuvel 		u32 submit_command;
5788166ec09SArd Biesheuvel 		u32 get_active_pcr_banks;
5798166ec09SArd Biesheuvel 		u32 set_active_pcr_banks;
5808166ec09SArd Biesheuvel 		u32 get_result_of_set_active_pcr_banks;
5818166ec09SArd Biesheuvel 	} mixed_mode;
5828166ec09SArd Biesheuvel };
5838166ec09SArd Biesheuvel 
5842931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t;
5852931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t;
5862931d526SArd Biesheuvel 
5872931d526SArd Biesheuvel union efi_load_file_protocol {
5882931d526SArd Biesheuvel 	struct {
5892931d526SArd Biesheuvel 		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,
5902931d526SArd Biesheuvel 						   efi_device_path_protocol_t *,
5912931d526SArd Biesheuvel 						   bool, unsigned long *, void *);
5922931d526SArd Biesheuvel 	};
5932931d526SArd Biesheuvel 	struct {
5942931d526SArd Biesheuvel 		u32 load_file;
5952931d526SArd Biesheuvel 	} mixed_mode;
5962931d526SArd Biesheuvel };
5972931d526SArd Biesheuvel 
5988166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void);
5998166ec09SArd Biesheuvel 
6008166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)(
6018166ec09SArd Biesheuvel 	struct efi_boot_memmap *map,
6028166ec09SArd Biesheuvel 	void *priv);
6038166ec09SArd Biesheuvel 
6048166ec09SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle,
6058166ec09SArd Biesheuvel 				    struct efi_boot_memmap *map,
6068166ec09SArd Biesheuvel 				    void *priv,
6078166ec09SArd Biesheuvel 				    efi_exit_boot_map_processing priv_func);
6088166ec09SArd Biesheuvel 
6098166ec09SArd Biesheuvel void efi_char16_printk(efi_char16_t *);
6108166ec09SArd Biesheuvel 
6118166ec09SArd Biesheuvel efi_status_t allocate_new_fdt_and_exit_boot(void *handle,
6128166ec09SArd Biesheuvel 					    unsigned long *new_fdt_addr,
6138166ec09SArd Biesheuvel 					    unsigned long max_addr,
6148166ec09SArd Biesheuvel 					    u64 initrd_addr, u64 initrd_size,
6158166ec09SArd Biesheuvel 					    char *cmdline_ptr,
6168166ec09SArd Biesheuvel 					    unsigned long fdt_addr,
6178166ec09SArd Biesheuvel 					    unsigned long fdt_size);
6188166ec09SArd Biesheuvel 
6198166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size);
6208166ec09SArd Biesheuvel 
6218166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
6228166ec09SArd Biesheuvel 		     unsigned long desc_size, efi_memory_desc_t *runtime_map,
6238166ec09SArd Biesheuvel 		     int *count);
6248166ec09SArd Biesheuvel 
6258166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);
6268166ec09SArd Biesheuvel 
6278166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align,
6288166ec09SArd Biesheuvel 			      unsigned long *addr, unsigned long random_seed);
6298166ec09SArd Biesheuvel 
6308166ec09SArd Biesheuvel efi_status_t check_platform_features(void);
6318166ec09SArd Biesheuvel 
6328166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid);
6338166ec09SArd Biesheuvel 
6348166ec09SArd Biesheuvel void efi_printk(char *str);
6358166ec09SArd Biesheuvel 
6368166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr);
6378166ec09SArd Biesheuvel 
6381e45bf73SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len,
6391e45bf73SArd Biesheuvel 			  unsigned long max_addr);
6408166ec09SArd Biesheuvel 
6418166ec09SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
6428166ec09SArd Biesheuvel 
6438166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
6448166ec09SArd Biesheuvel 				unsigned long max);
6458166ec09SArd Biesheuvel 
64643b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
64743b1df0eSArd Biesheuvel 					unsigned long max, unsigned long align);
64843b1df0eSArd Biesheuvel 
6498166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr,
6508166ec09SArd Biesheuvel 				 unsigned long image_size,
6518166ec09SArd Biesheuvel 				 unsigned long alloc_size,
6528166ec09SArd Biesheuvel 				 unsigned long preferred_addr,
6538166ec09SArd Biesheuvel 				 unsigned long alignment,
6548166ec09SArd Biesheuvel 				 unsigned long min_addr);
6558166ec09SArd Biesheuvel 
6568166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline);
6578166ec09SArd Biesheuvel 
658fffb6804SArvind Sankar void efi_parse_option_graphics(char *option);
659fffb6804SArvind Sankar 
6608166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
6618166ec09SArd Biesheuvel 			   unsigned long size);
6628166ec09SArd Biesheuvel 
663cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
664cf6b8366SArd Biesheuvel 				  const efi_char16_t *optstr,
665cf6b8366SArd Biesheuvel 				  int optstr_size,
666cf6b8366SArd Biesheuvel 				  unsigned long soft_limit,
667cf6b8366SArd Biesheuvel 				  unsigned long hard_limit,
6689302c1bbSArd Biesheuvel 				  unsigned long *load_addr,
6699302c1bbSArd Biesheuvel 				  unsigned long *load_size);
6709302c1bbSArd Biesheuvel 
671cf6b8366SArd Biesheuvel 
672cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
673cf6b8366SArd Biesheuvel 					unsigned long *load_addr,
674cf6b8366SArd Biesheuvel 					unsigned long *load_size)
675cf6b8366SArd Biesheuvel {
676cf6b8366SArd Biesheuvel 	return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
677cf6b8366SArd Biesheuvel 				    ULONG_MAX, ULONG_MAX, load_addr, load_size);
678cf6b8366SArd Biesheuvel }
679cf6b8366SArd Biesheuvel 
680f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image,
6819302c1bbSArd Biesheuvel 			     unsigned long *load_addr,
6829302c1bbSArd Biesheuvel 			     unsigned long *load_size,
68331f5e546SArd Biesheuvel 			     unsigned long soft_limit,
684f61900fdSArvind Sankar 			     unsigned long hard_limit);
685ec93fc37SArd Biesheuvel 
686f4f75ad5SArd Biesheuvel #endif
687