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 
287d4e323dSArd Biesheuvel #ifdef CONFIG_ARM
297d4e323dSArd Biesheuvel #define __efistub_global	__section(.data)
307d4e323dSArd Biesheuvel #else
317d4e323dSArd Biesheuvel #define __efistub_global
327d4e323dSArd Biesheuvel #endif
337d4e323dSArd Biesheuvel 
345193a33dSArd Biesheuvel extern bool __pure nochunk(void);
357d4e323dSArd Biesheuvel extern bool __pure nokaslr(void);
367d4e323dSArd Biesheuvel extern bool __pure is_quiet(void);
377d4e323dSArd Biesheuvel extern bool __pure novamap(void);
38eeff7d63SArd Biesheuvel 
392fcdad2aSArd Biesheuvel extern __pure efi_system_table_t  *efi_system_table(void);
402fcdad2aSArd Biesheuvel 
418173ec79SArd Biesheuvel #define pr_efi(msg)		do {			\
428173ec79SArd Biesheuvel 	if (!is_quiet()) efi_printk("EFI stub: "msg);	\
43eeff7d63SArd Biesheuvel } while (0)
44eeff7d63SArd Biesheuvel 
458173ec79SArd Biesheuvel #define pr_efi_err(msg) efi_printk("EFI stub: ERROR: "msg)
4660f38de7SArd Biesheuvel 
47ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */
48ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var
49ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \
50ac9aff8eSIngo Molnar 	fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var))
51ac9aff8eSIngo Molnar #endif
52ac9aff8eSIngo Molnar 
53ac9aff8eSIngo Molnar #ifndef fdt_setprop_var
54ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \
55ac9aff8eSIngo Molnar 	fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var))
56ac9aff8eSIngo Molnar #endif
57ac9aff8eSIngo Molnar 
58966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...)				\
59966291f6SArd Biesheuvel 	efi_rt_call(get_variable, (efi_char16_t *)(name),	\
60966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
61966291f6SArd Biesheuvel 
62966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...)				\
63966291f6SArd Biesheuvel 	efi_rt_call(set_variable, (efi_char16_t *)(name),	\
64966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
65966291f6SArd Biesheuvel 
668166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx)					\
678166ec09SArd Biesheuvel 	(efi_is_native() ? (array)[idx] 				\
688166ec09SArd Biesheuvel 		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
698166ec09SArd Biesheuvel 
708166ec09SArd Biesheuvel #define efi_get_handle_num(size)					\
718166ec09SArd Biesheuvel 	((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
728166ec09SArd Biesheuvel 
738166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i)			\
748166ec09SArd Biesheuvel 	for (i = 0;							\
758166ec09SArd Biesheuvel 	     i < efi_get_handle_num(size) &&				\
768166ec09SArd Biesheuvel 		((handle = efi_get_handle_at((array), i)) || true);	\
778166ec09SArd Biesheuvel 	     i++)
788166ec09SArd Biesheuvel 
798166ec09SArd Biesheuvel /*
808166ec09SArd Biesheuvel  * Allocation types for calls to boottime->allocate_pages.
818166ec09SArd Biesheuvel  */
828166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES		0
838166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS	1
848166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS		2
858166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE		3
868166ec09SArd Biesheuvel 
878166ec09SArd Biesheuvel /*
888166ec09SArd Biesheuvel  * The type of search to perform when calling boottime->locate_handle
898166ec09SArd Biesheuvel  */
908166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES			0
918166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
928166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL			2
938166ec09SArd Biesheuvel 
948166ec09SArd Biesheuvel struct efi_boot_memmap {
958166ec09SArd Biesheuvel 	efi_memory_desc_t	**map;
968166ec09SArd Biesheuvel 	unsigned long		*map_size;
978166ec09SArd Biesheuvel 	unsigned long		*desc_size;
988166ec09SArd Biesheuvel 	u32			*desc_ver;
998166ec09SArd Biesheuvel 	unsigned long		*key_ptr;
1008166ec09SArd Biesheuvel 	unsigned long		*buff_size;
1018166ec09SArd Biesheuvel };
1028166ec09SArd Biesheuvel 
103abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t;
104abd26868SArd Biesheuvel 
1058166ec09SArd Biesheuvel /*
1068166ec09SArd Biesheuvel  * EFI Boot Services table
1078166ec09SArd Biesheuvel  */
1088166ec09SArd Biesheuvel union efi_boot_services {
1098166ec09SArd Biesheuvel 	struct {
1108166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
1118166ec09SArd Biesheuvel 		void *raise_tpl;
1128166ec09SArd Biesheuvel 		void *restore_tpl;
1138166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
1148166ec09SArd Biesheuvel 							efi_physical_addr_t *);
1158166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
1168166ec09SArd Biesheuvel 						    unsigned long);
1178166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
1188166ec09SArd Biesheuvel 							unsigned long *,
1198166ec09SArd Biesheuvel 							unsigned long *, u32 *);
1208166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
1218166ec09SArd Biesheuvel 						       void **);
1228166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pool)(void *);
1238166ec09SArd Biesheuvel 		void *create_event;
1248166ec09SArd Biesheuvel 		void *set_timer;
1258166ec09SArd Biesheuvel 		void *wait_for_event;
1268166ec09SArd Biesheuvel 		void *signal_event;
1278166ec09SArd Biesheuvel 		void *close_event;
1288166ec09SArd Biesheuvel 		void *check_event;
1298166ec09SArd Biesheuvel 		void *install_protocol_interface;
1308166ec09SArd Biesheuvel 		void *reinstall_protocol_interface;
1318166ec09SArd Biesheuvel 		void *uninstall_protocol_interface;
1328166ec09SArd Biesheuvel 		efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
1338166ec09SArd Biesheuvel 							 efi_guid_t *, void **);
1348166ec09SArd Biesheuvel 		void *__reserved;
1358166ec09SArd Biesheuvel 		void *register_protocol_notify;
1368166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
1378166ec09SArd Biesheuvel 						       void *, unsigned long *,
1388166ec09SArd Biesheuvel 						       efi_handle_t *);
139abd26868SArd Biesheuvel 		efi_status_t (__efiapi *locate_device_path)(efi_guid_t *,
140abd26868SArd Biesheuvel 							    efi_device_path_protocol_t **,
141abd26868SArd Biesheuvel 							    efi_handle_t *);
1428166ec09SArd Biesheuvel 		efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
1438166ec09SArd Biesheuvel 								     void *);
1448166ec09SArd Biesheuvel 		void *load_image;
1458166ec09SArd Biesheuvel 		void *start_image;
1468166ec09SArd Biesheuvel 		void *exit;
1478166ec09SArd Biesheuvel 		void *unload_image;
1488166ec09SArd Biesheuvel 		efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
1498166ec09SArd Biesheuvel 							    unsigned long);
1508166ec09SArd Biesheuvel 		void *get_next_monotonic_count;
1518166ec09SArd Biesheuvel 		void *stall;
1528166ec09SArd Biesheuvel 		void *set_watchdog_timer;
1538166ec09SArd Biesheuvel 		void *connect_controller;
1548166ec09SArd Biesheuvel 		efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
1558166ec09SArd Biesheuvel 							       efi_handle_t,
1568166ec09SArd Biesheuvel 							       efi_handle_t);
1578166ec09SArd Biesheuvel 		void *open_protocol;
1588166ec09SArd Biesheuvel 		void *close_protocol;
1598166ec09SArd Biesheuvel 		void *open_protocol_information;
1608166ec09SArd Biesheuvel 		void *protocols_per_handle;
1618166ec09SArd Biesheuvel 		void *locate_handle_buffer;
1628166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
1638166ec09SArd Biesheuvel 							 void **);
1648166ec09SArd Biesheuvel 		void *install_multiple_protocol_interfaces;
1658166ec09SArd Biesheuvel 		void *uninstall_multiple_protocol_interfaces;
1668166ec09SArd Biesheuvel 		void *calculate_crc32;
1678166ec09SArd Biesheuvel 		void *copy_mem;
1688166ec09SArd Biesheuvel 		void *set_mem;
1698166ec09SArd Biesheuvel 		void *create_event_ex;
1708166ec09SArd Biesheuvel 	};
1718166ec09SArd Biesheuvel 	struct {
1728166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
1738166ec09SArd Biesheuvel 		u32 raise_tpl;
1748166ec09SArd Biesheuvel 		u32 restore_tpl;
1758166ec09SArd Biesheuvel 		u32 allocate_pages;
1768166ec09SArd Biesheuvel 		u32 free_pages;
1778166ec09SArd Biesheuvel 		u32 get_memory_map;
1788166ec09SArd Biesheuvel 		u32 allocate_pool;
1798166ec09SArd Biesheuvel 		u32 free_pool;
1808166ec09SArd Biesheuvel 		u32 create_event;
1818166ec09SArd Biesheuvel 		u32 set_timer;
1828166ec09SArd Biesheuvel 		u32 wait_for_event;
1838166ec09SArd Biesheuvel 		u32 signal_event;
1848166ec09SArd Biesheuvel 		u32 close_event;
1858166ec09SArd Biesheuvel 		u32 check_event;
1868166ec09SArd Biesheuvel 		u32 install_protocol_interface;
1878166ec09SArd Biesheuvel 		u32 reinstall_protocol_interface;
1888166ec09SArd Biesheuvel 		u32 uninstall_protocol_interface;
1898166ec09SArd Biesheuvel 		u32 handle_protocol;
1908166ec09SArd Biesheuvel 		u32 __reserved;
1918166ec09SArd Biesheuvel 		u32 register_protocol_notify;
1928166ec09SArd Biesheuvel 		u32 locate_handle;
1938166ec09SArd Biesheuvel 		u32 locate_device_path;
1948166ec09SArd Biesheuvel 		u32 install_configuration_table;
1958166ec09SArd Biesheuvel 		u32 load_image;
1968166ec09SArd Biesheuvel 		u32 start_image;
1978166ec09SArd Biesheuvel 		u32 exit;
1988166ec09SArd Biesheuvel 		u32 unload_image;
1998166ec09SArd Biesheuvel 		u32 exit_boot_services;
2008166ec09SArd Biesheuvel 		u32 get_next_monotonic_count;
2018166ec09SArd Biesheuvel 		u32 stall;
2028166ec09SArd Biesheuvel 		u32 set_watchdog_timer;
2038166ec09SArd Biesheuvel 		u32 connect_controller;
2048166ec09SArd Biesheuvel 		u32 disconnect_controller;
2058166ec09SArd Biesheuvel 		u32 open_protocol;
2068166ec09SArd Biesheuvel 		u32 close_protocol;
2078166ec09SArd Biesheuvel 		u32 open_protocol_information;
2088166ec09SArd Biesheuvel 		u32 protocols_per_handle;
2098166ec09SArd Biesheuvel 		u32 locate_handle_buffer;
2108166ec09SArd Biesheuvel 		u32 locate_protocol;
2118166ec09SArd Biesheuvel 		u32 install_multiple_protocol_interfaces;
2128166ec09SArd Biesheuvel 		u32 uninstall_multiple_protocol_interfaces;
2138166ec09SArd Biesheuvel 		u32 calculate_crc32;
2148166ec09SArd Biesheuvel 		u32 copy_mem;
2158166ec09SArd Biesheuvel 		u32 set_mem;
2168166ec09SArd Biesheuvel 		u32 create_event_ex;
2178166ec09SArd Biesheuvel 	} mixed_mode;
2188166ec09SArd Biesheuvel };
2198166ec09SArd Biesheuvel 
220c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t;
221c2d0b470SArd Biesheuvel 
222c2d0b470SArd Biesheuvel union efi_uga_draw_protocol {
223c2d0b470SArd Biesheuvel 	struct {
224c2d0b470SArd Biesheuvel 		efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *,
225c2d0b470SArd Biesheuvel 						  u32*, u32*, u32*, u32*);
226c2d0b470SArd Biesheuvel 		void *set_mode;
227c2d0b470SArd Biesheuvel 		void *blt;
228c2d0b470SArd Biesheuvel 	};
229c2d0b470SArd Biesheuvel 	struct {
230c2d0b470SArd Biesheuvel 		u32 get_mode;
231c2d0b470SArd Biesheuvel 		u32 set_mode;
232c2d0b470SArd Biesheuvel 		u32 blt;
233c2d0b470SArd Biesheuvel 	} mixed_mode;
234c2d0b470SArd Biesheuvel };
235c2d0b470SArd Biesheuvel 
2368166ec09SArd Biesheuvel union efi_simple_text_output_protocol {
2378166ec09SArd Biesheuvel 	struct {
2388166ec09SArd Biesheuvel 		void *reset;
2398166ec09SArd Biesheuvel 		efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
2408166ec09SArd Biesheuvel 						       efi_char16_t *);
2418166ec09SArd Biesheuvel 		void *test_string;
2428166ec09SArd Biesheuvel 	};
2438166ec09SArd Biesheuvel 	struct {
2448166ec09SArd Biesheuvel 		u32 reset;
2458166ec09SArd Biesheuvel 		u32 output_string;
2468166ec09SArd Biesheuvel 		u32 test_string;
2478166ec09SArd Biesheuvel 	} mixed_mode;
2488166ec09SArd Biesheuvel };
2498166ec09SArd Biesheuvel 
2508166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
2518166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
2528166ec09SArd Biesheuvel #define PIXEL_BIT_MASK					2
2538166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY					3
2548166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
2558166ec09SArd Biesheuvel 
2568166ec09SArd Biesheuvel typedef struct {
2578166ec09SArd Biesheuvel 	u32 red_mask;
2588166ec09SArd Biesheuvel 	u32 green_mask;
2598166ec09SArd Biesheuvel 	u32 blue_mask;
2608166ec09SArd Biesheuvel 	u32 reserved_mask;
2618166ec09SArd Biesheuvel } efi_pixel_bitmask_t;
2628166ec09SArd Biesheuvel 
2638166ec09SArd Biesheuvel typedef struct {
2648166ec09SArd Biesheuvel 	u32 version;
2658166ec09SArd Biesheuvel 	u32 horizontal_resolution;
2668166ec09SArd Biesheuvel 	u32 vertical_resolution;
2678166ec09SArd Biesheuvel 	int pixel_format;
2688166ec09SArd Biesheuvel 	efi_pixel_bitmask_t pixel_information;
2698166ec09SArd Biesheuvel 	u32 pixels_per_scan_line;
2708166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t;
2718166ec09SArd Biesheuvel 
2728166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
2738166ec09SArd Biesheuvel 
2748166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode {
2758166ec09SArd Biesheuvel 	struct {
2768166ec09SArd Biesheuvel 		u32 max_mode;
2778166ec09SArd Biesheuvel 		u32 mode;
2788166ec09SArd Biesheuvel 		efi_graphics_output_mode_info_t *info;
2798166ec09SArd Biesheuvel 		unsigned long size_of_info;
2808166ec09SArd Biesheuvel 		efi_physical_addr_t frame_buffer_base;
2818166ec09SArd Biesheuvel 		unsigned long frame_buffer_size;
2828166ec09SArd Biesheuvel 	};
2838166ec09SArd Biesheuvel 	struct {
2848166ec09SArd Biesheuvel 		u32 max_mode;
2858166ec09SArd Biesheuvel 		u32 mode;
2868166ec09SArd Biesheuvel 		u32 info;
2878166ec09SArd Biesheuvel 		u32 size_of_info;
2888166ec09SArd Biesheuvel 		u64 frame_buffer_base;
2898166ec09SArd Biesheuvel 		u32 frame_buffer_size;
2908166ec09SArd Biesheuvel 	} mixed_mode;
2918166ec09SArd Biesheuvel };
2928166ec09SArd Biesheuvel 
2938166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
2948166ec09SArd Biesheuvel 
2958166ec09SArd Biesheuvel union efi_graphics_output_protocol {
2968166ec09SArd Biesheuvel 	struct {
2978166ec09SArd Biesheuvel 		void *query_mode;
2988166ec09SArd Biesheuvel 		void *set_mode;
2998166ec09SArd Biesheuvel 		void *blt;
3008166ec09SArd Biesheuvel 		efi_graphics_output_protocol_mode_t *mode;
3018166ec09SArd Biesheuvel 	};
3028166ec09SArd Biesheuvel 	struct {
3038166ec09SArd Biesheuvel 		u32 query_mode;
3048166ec09SArd Biesheuvel 		u32 set_mode;
3058166ec09SArd Biesheuvel 		u32 blt;
3068166ec09SArd Biesheuvel 		u32 mode;
3078166ec09SArd Biesheuvel 	} mixed_mode;
3088166ec09SArd Biesheuvel };
3098166ec09SArd Biesheuvel 
3108166ec09SArd Biesheuvel typedef struct {
311a46a290aSArd Biesheuvel 	u32			revision;
312a46a290aSArd Biesheuvel 	efi_handle_t		parent_handle;
313a46a290aSArd Biesheuvel 	efi_system_table_t	*system_table;
314a46a290aSArd Biesheuvel 	efi_handle_t		device_handle;
315a46a290aSArd Biesheuvel 	void			*file_path;
316a46a290aSArd Biesheuvel 	void			*reserved;
317a46a290aSArd Biesheuvel 	u32			load_options_size;
318a46a290aSArd Biesheuvel 	void			*load_options;
319a46a290aSArd Biesheuvel 	void			*image_base;
320a46a290aSArd Biesheuvel 	__aligned_u64		image_size;
321a46a290aSArd Biesheuvel 	unsigned int		image_code_type;
322a46a290aSArd Biesheuvel 	unsigned int		image_data_type;
323a46a290aSArd Biesheuvel 	efi_status_t		(__efiapi *unload)(efi_handle_t image_handle);
324a46a290aSArd Biesheuvel } efi_loaded_image_t;
325a46a290aSArd Biesheuvel 
326a46a290aSArd Biesheuvel typedef struct {
327a46a290aSArd Biesheuvel 	u64			size;
328a46a290aSArd Biesheuvel 	u64			file_size;
329a46a290aSArd Biesheuvel 	u64			phys_size;
330a46a290aSArd Biesheuvel 	efi_time_t		create_time;
331a46a290aSArd Biesheuvel 	efi_time_t		last_access_time;
332a46a290aSArd Biesheuvel 	efi_time_t		modification_time;
333a46a290aSArd Biesheuvel 	__aligned_u64		attribute;
3349302c1bbSArd Biesheuvel 	efi_char16_t		filename[];
335a46a290aSArd Biesheuvel } efi_file_info_t;
336a46a290aSArd Biesheuvel 
337a46a290aSArd Biesheuvel typedef struct efi_file_protocol efi_file_protocol_t;
338a46a290aSArd Biesheuvel 
339a46a290aSArd Biesheuvel struct efi_file_protocol {
340a46a290aSArd Biesheuvel 	u64		revision;
341a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *open)	(efi_file_protocol_t *,
342a46a290aSArd Biesheuvel 						 efi_file_protocol_t **,
343a46a290aSArd Biesheuvel 						 efi_char16_t *, u64, u64);
344a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *close)	(efi_file_protocol_t *);
345a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *delete)	(efi_file_protocol_t *);
346a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *read)	(efi_file_protocol_t *,
347a46a290aSArd Biesheuvel 						 unsigned long *, void *);
348a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *write)	(efi_file_protocol_t *,
349a46a290aSArd Biesheuvel 						 unsigned long, void *);
350a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_position)(efi_file_protocol_t *, u64 *);
351a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_position)(efi_file_protocol_t *, u64);
352a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_info)	(efi_file_protocol_t *,
353a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long *,
354a46a290aSArd Biesheuvel 						 void *);
355a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_info)	(efi_file_protocol_t *,
356a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long,
357a46a290aSArd Biesheuvel 						 void *);
358a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *flush)	(efi_file_protocol_t *);
359a46a290aSArd Biesheuvel };
360a46a290aSArd Biesheuvel 
361a46a290aSArd Biesheuvel typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t;
362a46a290aSArd Biesheuvel 
363a46a290aSArd Biesheuvel struct efi_simple_file_system_protocol {
364a46a290aSArd Biesheuvel 	u64	revision;
365a46a290aSArd Biesheuvel 	int	(__efiapi *open_volume)(efi_simple_file_system_protocol_t *,
366a46a290aSArd Biesheuvel 					efi_file_protocol_t **);
367a46a290aSArd Biesheuvel };
368a46a290aSArd Biesheuvel 
369a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ	0x0000000000000001
370a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE	0x0000000000000002
371a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE	0x8000000000000000
372a46a290aSArd Biesheuvel 
3738166ec09SArd Biesheuvel typedef enum {
3748166ec09SArd Biesheuvel 	EfiPciIoWidthUint8,
3758166ec09SArd Biesheuvel 	EfiPciIoWidthUint16,
3768166ec09SArd Biesheuvel 	EfiPciIoWidthUint32,
3778166ec09SArd Biesheuvel 	EfiPciIoWidthUint64,
3788166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint8,
3798166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint16,
3808166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint32,
3818166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint64,
3828166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint8,
3838166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint16,
3848166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint32,
3858166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint64,
3868166ec09SArd Biesheuvel 	EfiPciIoWidthMaximum
3878166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH;
3888166ec09SArd Biesheuvel 
3898166ec09SArd Biesheuvel typedef enum {
3908166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationGet,
3918166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSet,
3928166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationEnable,
3938166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationDisable,
3948166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSupported,
3958166ec09SArd Biesheuvel     EfiPciIoAttributeOperationMaximum
3968166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
3978166ec09SArd Biesheuvel 
3988166ec09SArd Biesheuvel typedef struct {
3998166ec09SArd Biesheuvel 	u32 read;
4008166ec09SArd Biesheuvel 	u32 write;
4018166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t;
4028166ec09SArd Biesheuvel 
4038166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
4048166ec09SArd Biesheuvel 
4058166ec09SArd Biesheuvel typedef
4068166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
4078166ec09SArd Biesheuvel 						   EFI_PCI_IO_PROTOCOL_WIDTH,
4088166ec09SArd Biesheuvel 						   u32 offset,
4098166ec09SArd Biesheuvel 						   unsigned long count,
4108166ec09SArd Biesheuvel 						   void *buffer);
4118166ec09SArd Biesheuvel 
4128166ec09SArd Biesheuvel typedef struct {
4138166ec09SArd Biesheuvel 	void *read;
4148166ec09SArd Biesheuvel 	void *write;
4158166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t;
4168166ec09SArd Biesheuvel 
4178166ec09SArd Biesheuvel typedef struct {
4188166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t read;
4198166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t write;
4208166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t;
4218166ec09SArd Biesheuvel 
4228166ec09SArd Biesheuvel union efi_pci_io_protocol {
4238166ec09SArd Biesheuvel 	struct {
4248166ec09SArd Biesheuvel 		void *poll_mem;
4258166ec09SArd Biesheuvel 		void *poll_io;
4268166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t mem;
4278166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t io;
4288166ec09SArd Biesheuvel 		efi_pci_io_protocol_config_access_t pci;
4298166ec09SArd Biesheuvel 		void *copy_mem;
4308166ec09SArd Biesheuvel 		void *map;
4318166ec09SArd Biesheuvel 		void *unmap;
4328166ec09SArd Biesheuvel 		void *allocate_buffer;
4338166ec09SArd Biesheuvel 		void *free_buffer;
4348166ec09SArd Biesheuvel 		void *flush;
4358166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
4368166ec09SArd Biesheuvel 						      unsigned long *segment_nr,
4378166ec09SArd Biesheuvel 						      unsigned long *bus_nr,
4388166ec09SArd Biesheuvel 						      unsigned long *device_nr,
4398166ec09SArd Biesheuvel 						      unsigned long *func_nr);
4408166ec09SArd Biesheuvel 		void *attributes;
4418166ec09SArd Biesheuvel 		void *get_bar_attributes;
4428166ec09SArd Biesheuvel 		void *set_bar_attributes;
4438166ec09SArd Biesheuvel 		uint64_t romsize;
4448166ec09SArd Biesheuvel 		void *romimage;
4458166ec09SArd Biesheuvel 	};
4468166ec09SArd Biesheuvel 	struct {
4478166ec09SArd Biesheuvel 		u32 poll_mem;
4488166ec09SArd Biesheuvel 		u32 poll_io;
4498166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t mem;
4508166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t io;
4518166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t pci;
4528166ec09SArd Biesheuvel 		u32 copy_mem;
4538166ec09SArd Biesheuvel 		u32 map;
4548166ec09SArd Biesheuvel 		u32 unmap;
4558166ec09SArd Biesheuvel 		u32 allocate_buffer;
4568166ec09SArd Biesheuvel 		u32 free_buffer;
4578166ec09SArd Biesheuvel 		u32 flush;
4588166ec09SArd Biesheuvel 		u32 get_location;
4598166ec09SArd Biesheuvel 		u32 attributes;
4608166ec09SArd Biesheuvel 		u32 get_bar_attributes;
4618166ec09SArd Biesheuvel 		u32 set_bar_attributes;
4628166ec09SArd Biesheuvel 		u64 romsize;
4638166ec09SArd Biesheuvel 		u32 romimage;
4648166ec09SArd Biesheuvel 	} mixed_mode;
4658166ec09SArd Biesheuvel };
4668166ec09SArd Biesheuvel 
4678166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
4688166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
4698166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
4708166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
4718166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
4728166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
4738166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
4748166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
4758166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
4768166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
4778166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
4788166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
4798166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
4808166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
4818166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
4828166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
4838166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
4848166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
4858166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
4868166ec09SArd Biesheuvel 
4878166ec09SArd Biesheuvel struct efi_dev_path;
4888166ec09SArd Biesheuvel 
4898166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t;
4908166ec09SArd Biesheuvel 
4918166ec09SArd Biesheuvel union apple_properties_protocol {
4928166ec09SArd Biesheuvel 	struct {
4938166ec09SArd Biesheuvel 		unsigned long version;
4948166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
4958166ec09SArd Biesheuvel 					     struct efi_dev_path *,
4968166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32 *);
4978166ec09SArd Biesheuvel 		efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
4988166ec09SArd Biesheuvel 					     struct efi_dev_path *,
4998166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32);
5008166ec09SArd Biesheuvel 		efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
5018166ec09SArd Biesheuvel 					     struct efi_dev_path *,
5028166ec09SArd Biesheuvel 					     efi_char16_t *);
5038166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
5048166ec09SArd Biesheuvel 						 void *buffer, u32 *);
5058166ec09SArd Biesheuvel 	};
5068166ec09SArd Biesheuvel 	struct {
5078166ec09SArd Biesheuvel 		u32 version;
5088166ec09SArd Biesheuvel 		u32 get;
5098166ec09SArd Biesheuvel 		u32 set;
5108166ec09SArd Biesheuvel 		u32 del;
5118166ec09SArd Biesheuvel 		u32 get_all;
5128166ec09SArd Biesheuvel 	} mixed_mode;
5138166ec09SArd Biesheuvel };
5148166ec09SArd Biesheuvel 
5158166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format;
5168166ec09SArd Biesheuvel 
5178166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
5188166ec09SArd Biesheuvel 
5198166ec09SArd Biesheuvel union efi_tcg2_protocol {
5208166ec09SArd Biesheuvel 	struct {
5218166ec09SArd Biesheuvel 		void *get_capability;
5228166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_event_log)(efi_handle_t,
5238166ec09SArd Biesheuvel 						       efi_tcg2_event_log_format,
5248166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
5258166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
5268166ec09SArd Biesheuvel 						       efi_bool_t *);
5278166ec09SArd Biesheuvel 		void *hash_log_extend_event;
5288166ec09SArd Biesheuvel 		void *submit_command;
5298166ec09SArd Biesheuvel 		void *get_active_pcr_banks;
5308166ec09SArd Biesheuvel 		void *set_active_pcr_banks;
5318166ec09SArd Biesheuvel 		void *get_result_of_set_active_pcr_banks;
5328166ec09SArd Biesheuvel 	};
5338166ec09SArd Biesheuvel 	struct {
5348166ec09SArd Biesheuvel 		u32 get_capability;
5358166ec09SArd Biesheuvel 		u32 get_event_log;
5368166ec09SArd Biesheuvel 		u32 hash_log_extend_event;
5378166ec09SArd Biesheuvel 		u32 submit_command;
5388166ec09SArd Biesheuvel 		u32 get_active_pcr_banks;
5398166ec09SArd Biesheuvel 		u32 set_active_pcr_banks;
5408166ec09SArd Biesheuvel 		u32 get_result_of_set_active_pcr_banks;
5418166ec09SArd Biesheuvel 	} mixed_mode;
5428166ec09SArd Biesheuvel };
5438166ec09SArd Biesheuvel 
5442931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t;
5452931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t;
5462931d526SArd Biesheuvel 
5472931d526SArd Biesheuvel union efi_load_file_protocol {
5482931d526SArd Biesheuvel 	struct {
5492931d526SArd Biesheuvel 		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,
5502931d526SArd Biesheuvel 						   efi_device_path_protocol_t *,
5512931d526SArd Biesheuvel 						   bool, unsigned long *, void *);
5522931d526SArd Biesheuvel 	};
5532931d526SArd Biesheuvel 	struct {
5542931d526SArd Biesheuvel 		u32 load_file;
5552931d526SArd Biesheuvel 	} mixed_mode;
5562931d526SArd Biesheuvel };
5572931d526SArd Biesheuvel 
5588166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void);
5598166ec09SArd Biesheuvel 
5608166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)(
5618166ec09SArd Biesheuvel 	struct efi_boot_memmap *map,
5628166ec09SArd Biesheuvel 	void *priv);
5638166ec09SArd Biesheuvel 
5648166ec09SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle,
5658166ec09SArd Biesheuvel 				    struct efi_boot_memmap *map,
5668166ec09SArd Biesheuvel 				    void *priv,
5678166ec09SArd Biesheuvel 				    efi_exit_boot_map_processing priv_func);
5688166ec09SArd Biesheuvel 
5698166ec09SArd Biesheuvel void efi_char16_printk(efi_char16_t *);
5708166ec09SArd Biesheuvel 
5718166ec09SArd Biesheuvel efi_status_t allocate_new_fdt_and_exit_boot(void *handle,
5728166ec09SArd Biesheuvel 					    unsigned long *new_fdt_addr,
5738166ec09SArd Biesheuvel 					    unsigned long max_addr,
5748166ec09SArd Biesheuvel 					    u64 initrd_addr, u64 initrd_size,
5758166ec09SArd Biesheuvel 					    char *cmdline_ptr,
5768166ec09SArd Biesheuvel 					    unsigned long fdt_addr,
5778166ec09SArd Biesheuvel 					    unsigned long fdt_size);
5788166ec09SArd Biesheuvel 
5798166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size);
5808166ec09SArd Biesheuvel 
5818166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
5828166ec09SArd Biesheuvel 		     unsigned long desc_size, efi_memory_desc_t *runtime_map,
5838166ec09SArd Biesheuvel 		     int *count);
5848166ec09SArd Biesheuvel 
5858166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);
5868166ec09SArd Biesheuvel 
5878166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align,
5888166ec09SArd Biesheuvel 			      unsigned long *addr, unsigned long random_seed);
5898166ec09SArd Biesheuvel 
5908166ec09SArd Biesheuvel efi_status_t check_platform_features(void);
5918166ec09SArd Biesheuvel 
5928166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid);
5938166ec09SArd Biesheuvel 
5948166ec09SArd Biesheuvel void efi_printk(char *str);
5958166ec09SArd Biesheuvel 
5968166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr);
5978166ec09SArd Biesheuvel 
5981e45bf73SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len,
5991e45bf73SArd Biesheuvel 			  unsigned long max_addr);
6008166ec09SArd Biesheuvel 
6018166ec09SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
6028166ec09SArd Biesheuvel 
6038166ec09SArd Biesheuvel efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
6048166ec09SArd Biesheuvel 				 unsigned long *addr, unsigned long min);
6058166ec09SArd Biesheuvel 
6068166ec09SArd Biesheuvel static inline
6078166ec09SArd Biesheuvel efi_status_t efi_low_alloc(unsigned long size, unsigned long align,
6088166ec09SArd Biesheuvel 			   unsigned long *addr)
6098166ec09SArd Biesheuvel {
6108166ec09SArd Biesheuvel 	/*
6118166ec09SArd Biesheuvel 	 * Don't allocate at 0x0. It will confuse code that
6128166ec09SArd Biesheuvel 	 * checks pointers against NULL. Skip the first 8
6138166ec09SArd Biesheuvel 	 * bytes so we start at a nice even number.
6148166ec09SArd Biesheuvel 	 */
6158166ec09SArd Biesheuvel 	return efi_low_alloc_above(size, align, addr, 0x8);
6168166ec09SArd Biesheuvel }
6178166ec09SArd Biesheuvel 
6188166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
6198166ec09SArd Biesheuvel 				unsigned long max);
6208166ec09SArd Biesheuvel 
6218166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr,
6228166ec09SArd Biesheuvel 				 unsigned long image_size,
6238166ec09SArd Biesheuvel 				 unsigned long alloc_size,
6248166ec09SArd Biesheuvel 				 unsigned long preferred_addr,
6258166ec09SArd Biesheuvel 				 unsigned long alignment,
6268166ec09SArd Biesheuvel 				 unsigned long min_addr);
6278166ec09SArd Biesheuvel 
6288166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline);
6298166ec09SArd Biesheuvel 
6308166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
6318166ec09SArd Biesheuvel 			   unsigned long size);
6328166ec09SArd Biesheuvel 
6339302c1bbSArd Biesheuvel efi_status_t efi_load_dtb(efi_loaded_image_t *image,
6349302c1bbSArd Biesheuvel 			  unsigned long *load_addr,
6359302c1bbSArd Biesheuvel 			  unsigned long *load_size);
6369302c1bbSArd Biesheuvel 
6379302c1bbSArd Biesheuvel efi_status_t efi_load_initrd(efi_loaded_image_t *image,
6389302c1bbSArd Biesheuvel 			     unsigned long *load_addr,
6399302c1bbSArd Biesheuvel 			     unsigned long *load_size,
64031f5e546SArd Biesheuvel 			     unsigned long soft_limit,
64131f5e546SArd Biesheuvel 			     unsigned long hard_limit);
6429302c1bbSArd Biesheuvel 
643f4f75ad5SArd Biesheuvel #endif
644