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)
48de8c5520SArvind Sankar #define efi_bs_call(func, ...)	efi_system_table->boottime->func(__VA_ARGS__)
49de8c5520SArvind Sankar #define efi_rt_call(func, ...)	efi_system_table->runtime->func(__VA_ARGS__)
503ba75c13SBaskov Evgeniy #define efi_dxe_call(func, ...)	efi_dxe_table->func(__VA_ARGS__)
5122090f84SArd Biesheuvel #define efi_table_attr(inst, attr)	(inst->attr)
5222090f84SArd Biesheuvel #define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
53de8c5520SArvind Sankar 
5422090f84SArd Biesheuvel #endif
5522090f84SArd Biesheuvel 
5623d5b73fSArvind Sankar #define efi_info(fmt, ...) \
5723d5b73fSArvind Sankar 	efi_printk(KERN_INFO fmt, ##__VA_ARGS__)
58c1df5e0cSArvind Sankar #define efi_warn(fmt, ...) \
59c1df5e0cSArvind Sankar 	efi_printk(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
6023d5b73fSArvind Sankar #define efi_err(fmt, ...) \
6123d5b73fSArvind Sankar 	efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
6223d5b73fSArvind Sankar #define efi_debug(fmt, ...) \
6323d5b73fSArvind Sankar 	efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
6460f38de7SArd Biesheuvel 
65c1df5e0cSArvind Sankar #define efi_printk_once(fmt, ...) 		\
66c1df5e0cSArvind Sankar ({						\
67c1df5e0cSArvind Sankar 	static bool __print_once;		\
68c1df5e0cSArvind Sankar 	bool __ret_print_once = !__print_once;	\
69c1df5e0cSArvind Sankar 						\
70c1df5e0cSArvind Sankar 	if (!__print_once) {			\
71c1df5e0cSArvind Sankar 		__print_once = true;		\
72c1df5e0cSArvind Sankar 		efi_printk(fmt, ##__VA_ARGS__);	\
73c1df5e0cSArvind Sankar 	}					\
74c1df5e0cSArvind Sankar 	__ret_print_once;			\
75c1df5e0cSArvind Sankar })
76c1df5e0cSArvind Sankar 
77c1df5e0cSArvind Sankar #define efi_info_once(fmt, ...) \
78c1df5e0cSArvind Sankar 	efi_printk_once(KERN_INFO fmt, ##__VA_ARGS__)
79c1df5e0cSArvind Sankar #define efi_warn_once(fmt, ...) \
80c1df5e0cSArvind Sankar 	efi_printk_once(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
81c1df5e0cSArvind Sankar #define efi_err_once(fmt, ...) \
82c1df5e0cSArvind Sankar 	efi_printk_once(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
83c1df5e0cSArvind Sankar #define efi_debug_once(fmt, ...) \
84c1df5e0cSArvind Sankar 	efi_printk_once(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
85c1df5e0cSArvind Sankar 
86ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */
87ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var
88ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \
89ac9aff8eSIngo Molnar 	fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var))
90ac9aff8eSIngo Molnar #endif
91ac9aff8eSIngo Molnar 
92ac9aff8eSIngo Molnar #ifndef fdt_setprop_var
93ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \
94ac9aff8eSIngo Molnar 	fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var))
95ac9aff8eSIngo Molnar #endif
96ac9aff8eSIngo Molnar 
97966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...)				\
98966291f6SArd Biesheuvel 	efi_rt_call(get_variable, (efi_char16_t *)(name),	\
99966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
100966291f6SArd Biesheuvel 
101966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...)				\
102966291f6SArd Biesheuvel 	efi_rt_call(set_variable, (efi_char16_t *)(name),	\
103966291f6SArd Biesheuvel 		    (efi_guid_t *)(vendor), __VA_ARGS__)
104966291f6SArd Biesheuvel 
1058166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx)					\
1068166ec09SArd Biesheuvel 	(efi_is_native() ? (array)[idx] 				\
1078166ec09SArd Biesheuvel 		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
1088166ec09SArd Biesheuvel 
1098166ec09SArd Biesheuvel #define efi_get_handle_num(size)					\
1108166ec09SArd Biesheuvel 	((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
1118166ec09SArd Biesheuvel 
1128166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i)			\
1138166ec09SArd Biesheuvel 	for (i = 0;							\
1148166ec09SArd Biesheuvel 	     i < efi_get_handle_num(size) &&				\
1158166ec09SArd Biesheuvel 		((handle = efi_get_handle_at((array), i)) || true);	\
1168166ec09SArd Biesheuvel 	     i++)
1178166ec09SArd Biesheuvel 
118eed4e019SArvind Sankar static inline
119eed4e019SArvind Sankar void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)
120eed4e019SArvind Sankar {
121eed4e019SArvind Sankar 	*lo = lower_32_bits(data);
122eed4e019SArvind Sankar 	*hi = upper_32_bits(data);
123eed4e019SArvind Sankar }
124eed4e019SArvind Sankar 
1258166ec09SArd Biesheuvel /*
1268166ec09SArd Biesheuvel  * Allocation types for calls to boottime->allocate_pages.
1278166ec09SArd Biesheuvel  */
1288166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES		0
1298166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS	1
1308166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS		2
1318166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE		3
1328166ec09SArd Biesheuvel 
1338166ec09SArd Biesheuvel /*
1348166ec09SArd Biesheuvel  * The type of search to perform when calling boottime->locate_handle
1358166ec09SArd Biesheuvel  */
1368166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES			0
1378166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY		1
1388166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL			2
1398166ec09SArd Biesheuvel 
140fd626195SLenny Szubowicz /*
1419b47c527SArvind Sankar  * boottime->stall takes the time period in microseconds
1429b47c527SArvind Sankar  */
1439b47c527SArvind Sankar #define EFI_USEC_PER_SEC		1000000
1449b47c527SArvind Sankar 
1459b47c527SArvind Sankar /*
1469b47c527SArvind Sankar  * boottime->set_timer takes the time in 100ns units
1479b47c527SArvind Sankar  */
1489b47c527SArvind Sankar #define EFI_100NSEC_PER_USEC	((u64)10)
1499b47c527SArvind Sankar 
150d1343da3SIngo Molnar /*
151fd626195SLenny Szubowicz  * An efi_boot_memmap is used by efi_get_memory_map() to return the
152fd626195SLenny Szubowicz  * EFI memory map in a dynamically allocated buffer.
153fd626195SLenny Szubowicz  *
154fd626195SLenny Szubowicz  * The buffer allocated for the EFI memory map includes extra room for
155fd626195SLenny Szubowicz  * a minimum of EFI_MMAP_NR_SLACK_SLOTS additional EFI memory descriptors.
156fd626195SLenny Szubowicz  * This facilitates the reuse of the EFI memory map buffer when a second
157fd626195SLenny Szubowicz  * call to ExitBootServices() is needed because of intervening changes to
158fd626195SLenny Szubowicz  * the EFI memory map. Other related structures, e.g. x86 e820ext, need
159fd626195SLenny Szubowicz  * to factor in this headroom requirement as well.
160fd626195SLenny Szubowicz  */
161fd626195SLenny Szubowicz #define EFI_MMAP_NR_SLACK_SLOTS	8
162fd626195SLenny Szubowicz 
163abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t;
164abd26868SArd Biesheuvel 
165c7007d9fSArd Biesheuvel union efi_device_path_to_text_protocol {
166c7007d9fSArd Biesheuvel 	struct {
167c7007d9fSArd Biesheuvel 		efi_char16_t *(__efiapi *convert_device_node_to_text)(
168c7007d9fSArd Biesheuvel 					const efi_device_path_protocol_t *,
169c7007d9fSArd Biesheuvel 					bool, bool);
170c7007d9fSArd Biesheuvel 		efi_char16_t *(__efiapi *convert_device_path_to_text)(
171c7007d9fSArd Biesheuvel 					const efi_device_path_protocol_t *,
172c7007d9fSArd Biesheuvel 					bool, bool);
173c7007d9fSArd Biesheuvel 	};
174c7007d9fSArd Biesheuvel 	struct {
175c7007d9fSArd Biesheuvel 		u32 convert_device_node_to_text;
176c7007d9fSArd Biesheuvel 		u32 convert_device_path_to_text;
177c7007d9fSArd Biesheuvel 	} mixed_mode;
178c7007d9fSArd Biesheuvel };
179c7007d9fSArd Biesheuvel 
180c7007d9fSArd Biesheuvel typedef union efi_device_path_to_text_protocol efi_device_path_to_text_protocol_t;
181c7007d9fSArd Biesheuvel 
1829b47c527SArvind Sankar typedef void *efi_event_t;
1839b47c527SArvind Sankar /* Note that notifications won't work in mixed mode */
1849b47c527SArvind Sankar typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *);
1859b47c527SArvind Sankar 
1869b47c527SArvind Sankar #define EFI_EVT_TIMER		0x80000000U
1879b47c527SArvind Sankar #define EFI_EVT_RUNTIME		0x40000000U
1889b47c527SArvind Sankar #define EFI_EVT_NOTIFY_WAIT	0x00000100U
1899b47c527SArvind Sankar #define EFI_EVT_NOTIFY_SIGNAL	0x00000200U
1909b47c527SArvind Sankar 
1918c0a839cSHeinrich Schuchardt /**
1928c0a839cSHeinrich Schuchardt  * efi_set_event_at() - add event to events array
1938c0a839cSHeinrich Schuchardt  *
1948c0a839cSHeinrich Schuchardt  * @events:	array of UEFI events
1958c0a839cSHeinrich Schuchardt  * @ids:	index where to put the event in the array
1968c0a839cSHeinrich Schuchardt  * @event:	event to add to the aray
1978c0a839cSHeinrich Schuchardt  *
1988c0a839cSHeinrich Schuchardt  * boottime->wait_for_event() takes an array of events as input.
1999b47c527SArvind Sankar  * Provide a helper to set it up correctly for mixed mode.
2009b47c527SArvind Sankar  */
2019b47c527SArvind Sankar static inline
2029b47c527SArvind Sankar void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event)
2039b47c527SArvind Sankar {
2049b47c527SArvind Sankar 	if (efi_is_native())
2059b47c527SArvind Sankar 		events[idx] = event;
2069b47c527SArvind Sankar 	else
2079b47c527SArvind Sankar 		((u32 *)events)[idx] = (u32)(unsigned long)event;
2089b47c527SArvind Sankar }
2099b47c527SArvind Sankar 
2109b47c527SArvind Sankar #define EFI_TPL_APPLICATION	4
2119b47c527SArvind Sankar #define EFI_TPL_CALLBACK	8
2129b47c527SArvind Sankar #define EFI_TPL_NOTIFY		16
2139b47c527SArvind Sankar #define EFI_TPL_HIGH_LEVEL	31
2149b47c527SArvind Sankar 
2159b47c527SArvind Sankar typedef enum {
2169b47c527SArvind Sankar 	EfiTimerCancel,
2179b47c527SArvind Sankar 	EfiTimerPeriodic,
2189b47c527SArvind Sankar 	EfiTimerRelative
2199b47c527SArvind Sankar } EFI_TIMER_DELAY;
2209b47c527SArvind Sankar 
2218166ec09SArd Biesheuvel /*
2228166ec09SArd Biesheuvel  * EFI Boot Services table
2238166ec09SArd Biesheuvel  */
2248166ec09SArd Biesheuvel union efi_boot_services {
2258166ec09SArd Biesheuvel 	struct {
2268166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
2278166ec09SArd Biesheuvel 		void *raise_tpl;
2288166ec09SArd Biesheuvel 		void *restore_tpl;
2298166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
2308166ec09SArd Biesheuvel 							efi_physical_addr_t *);
2318166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
2328166ec09SArd Biesheuvel 						    unsigned long);
2338166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
2348166ec09SArd Biesheuvel 							unsigned long *,
2358166ec09SArd Biesheuvel 							unsigned long *, u32 *);
2368166ec09SArd Biesheuvel 		efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
2378166ec09SArd Biesheuvel 						       void **);
2388166ec09SArd Biesheuvel 		efi_status_t (__efiapi *free_pool)(void *);
2399b47c527SArvind Sankar 		efi_status_t (__efiapi *create_event)(u32, unsigned long,
2409b47c527SArvind Sankar 						      efi_event_notify_t, void *,
2419b47c527SArvind Sankar 						      efi_event_t *);
2429b47c527SArvind Sankar 		efi_status_t (__efiapi *set_timer)(efi_event_t,
2439b47c527SArvind Sankar 						  EFI_TIMER_DELAY, u64);
2449b47c527SArvind Sankar 		efi_status_t (__efiapi *wait_for_event)(unsigned long,
2459b47c527SArvind Sankar 							efi_event_t *,
2469b47c527SArvind Sankar 							unsigned long *);
2478166ec09SArd Biesheuvel 		void *signal_event;
2489b47c527SArvind Sankar 		efi_status_t (__efiapi *close_event)(efi_event_t);
2498166ec09SArd Biesheuvel 		void *check_event;
2508166ec09SArd Biesheuvel 		void *install_protocol_interface;
2518166ec09SArd Biesheuvel 		void *reinstall_protocol_interface;
2528166ec09SArd Biesheuvel 		void *uninstall_protocol_interface;
2538166ec09SArd Biesheuvel 		efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
2548166ec09SArd Biesheuvel 							 efi_guid_t *, void **);
2558166ec09SArd Biesheuvel 		void *__reserved;
2568166ec09SArd Biesheuvel 		void *register_protocol_notify;
2578166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
2588166ec09SArd Biesheuvel 						       void *, unsigned long *,
2598166ec09SArd Biesheuvel 						       efi_handle_t *);
260abd26868SArd Biesheuvel 		efi_status_t (__efiapi *locate_device_path)(efi_guid_t *,
261abd26868SArd Biesheuvel 							    efi_device_path_protocol_t **,
262abd26868SArd Biesheuvel 							    efi_handle_t *);
2638166ec09SArd Biesheuvel 		efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
2648166ec09SArd Biesheuvel 								     void *);
265c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *load_image)(bool, efi_handle_t,
266c7007d9fSArd Biesheuvel 						    efi_device_path_protocol_t *,
267c7007d9fSArd Biesheuvel 						    void *, unsigned long,
268c7007d9fSArd Biesheuvel 						    efi_handle_t *);
269c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *start_image)(efi_handle_t, unsigned long *,
270c7007d9fSArd Biesheuvel 						     efi_char16_t **);
2713b8f44fcSArd Biesheuvel 		efi_status_t __noreturn (__efiapi *exit)(efi_handle_t,
2723b8f44fcSArd Biesheuvel 							 efi_status_t,
2733b8f44fcSArd Biesheuvel 							 unsigned long,
2743b8f44fcSArd Biesheuvel 							 efi_char16_t *);
275c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *unload_image)(efi_handle_t);
2768166ec09SArd Biesheuvel 		efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
2778166ec09SArd Biesheuvel 							    unsigned long);
2788166ec09SArd Biesheuvel 		void *get_next_monotonic_count;
2799b47c527SArvind Sankar 		efi_status_t (__efiapi *stall)(unsigned long);
2808166ec09SArd Biesheuvel 		void *set_watchdog_timer;
2818166ec09SArd Biesheuvel 		void *connect_controller;
2828166ec09SArd Biesheuvel 		efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
2838166ec09SArd Biesheuvel 							       efi_handle_t,
2848166ec09SArd Biesheuvel 							       efi_handle_t);
2858166ec09SArd Biesheuvel 		void *open_protocol;
2868166ec09SArd Biesheuvel 		void *close_protocol;
2878166ec09SArd Biesheuvel 		void *open_protocol_information;
2888166ec09SArd Biesheuvel 		void *protocols_per_handle;
2898166ec09SArd Biesheuvel 		void *locate_handle_buffer;
2908166ec09SArd Biesheuvel 		efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
2918166ec09SArd Biesheuvel 							 void **);
292c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *install_multiple_protocol_interfaces)(efi_handle_t *, ...);
293c7007d9fSArd Biesheuvel 		efi_status_t (__efiapi *uninstall_multiple_protocol_interfaces)(efi_handle_t, ...);
2948166ec09SArd Biesheuvel 		void *calculate_crc32;
295c82ceb44SArd Biesheuvel 		void (__efiapi *copy_mem)(void *, const void *, unsigned long);
296c82ceb44SArd Biesheuvel 		void (__efiapi *set_mem)(void *, unsigned long, unsigned char);
2978166ec09SArd Biesheuvel 		void *create_event_ex;
2988166ec09SArd Biesheuvel 	};
2998166ec09SArd Biesheuvel 	struct {
3008166ec09SArd Biesheuvel 		efi_table_hdr_t hdr;
3018166ec09SArd Biesheuvel 		u32 raise_tpl;
3028166ec09SArd Biesheuvel 		u32 restore_tpl;
3038166ec09SArd Biesheuvel 		u32 allocate_pages;
3048166ec09SArd Biesheuvel 		u32 free_pages;
3058166ec09SArd Biesheuvel 		u32 get_memory_map;
3068166ec09SArd Biesheuvel 		u32 allocate_pool;
3078166ec09SArd Biesheuvel 		u32 free_pool;
3088166ec09SArd Biesheuvel 		u32 create_event;
3098166ec09SArd Biesheuvel 		u32 set_timer;
3108166ec09SArd Biesheuvel 		u32 wait_for_event;
3118166ec09SArd Biesheuvel 		u32 signal_event;
3128166ec09SArd Biesheuvel 		u32 close_event;
3138166ec09SArd Biesheuvel 		u32 check_event;
3148166ec09SArd Biesheuvel 		u32 install_protocol_interface;
3158166ec09SArd Biesheuvel 		u32 reinstall_protocol_interface;
3168166ec09SArd Biesheuvel 		u32 uninstall_protocol_interface;
3178166ec09SArd Biesheuvel 		u32 handle_protocol;
3188166ec09SArd Biesheuvel 		u32 __reserved;
3198166ec09SArd Biesheuvel 		u32 register_protocol_notify;
3208166ec09SArd Biesheuvel 		u32 locate_handle;
3218166ec09SArd Biesheuvel 		u32 locate_device_path;
3228166ec09SArd Biesheuvel 		u32 install_configuration_table;
3238166ec09SArd Biesheuvel 		u32 load_image;
3248166ec09SArd Biesheuvel 		u32 start_image;
3258166ec09SArd Biesheuvel 		u32 exit;
3268166ec09SArd Biesheuvel 		u32 unload_image;
3278166ec09SArd Biesheuvel 		u32 exit_boot_services;
3288166ec09SArd Biesheuvel 		u32 get_next_monotonic_count;
3298166ec09SArd Biesheuvel 		u32 stall;
3308166ec09SArd Biesheuvel 		u32 set_watchdog_timer;
3318166ec09SArd Biesheuvel 		u32 connect_controller;
3328166ec09SArd Biesheuvel 		u32 disconnect_controller;
3338166ec09SArd Biesheuvel 		u32 open_protocol;
3348166ec09SArd Biesheuvel 		u32 close_protocol;
3358166ec09SArd Biesheuvel 		u32 open_protocol_information;
3368166ec09SArd Biesheuvel 		u32 protocols_per_handle;
3378166ec09SArd Biesheuvel 		u32 locate_handle_buffer;
3388166ec09SArd Biesheuvel 		u32 locate_protocol;
3398166ec09SArd Biesheuvel 		u32 install_multiple_protocol_interfaces;
3408166ec09SArd Biesheuvel 		u32 uninstall_multiple_protocol_interfaces;
3418166ec09SArd Biesheuvel 		u32 calculate_crc32;
3428166ec09SArd Biesheuvel 		u32 copy_mem;
3438166ec09SArd Biesheuvel 		u32 set_mem;
3448166ec09SArd Biesheuvel 		u32 create_event_ex;
3458166ec09SArd Biesheuvel 	} mixed_mode;
3468166ec09SArd Biesheuvel };
3478166ec09SArd Biesheuvel 
3483ba75c13SBaskov Evgeniy typedef enum {
3493ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeNonExistent,
3503ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeReserved,
3513ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeSystemMemory,
3523ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeMemoryMappedIo,
3533ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypePersistent,
3543ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeMoreReliable,
3553ba75c13SBaskov Evgeniy 	EfiGcdMemoryTypeMaximum
3563ba75c13SBaskov Evgeniy } efi_gcd_memory_type_t;
3573ba75c13SBaskov Evgeniy 
3583ba75c13SBaskov Evgeniy typedef struct {
3593ba75c13SBaskov Evgeniy 	efi_physical_addr_t base_address;
3603ba75c13SBaskov Evgeniy 	u64 length;
3613ba75c13SBaskov Evgeniy 	u64 capabilities;
3623ba75c13SBaskov Evgeniy 	u64 attributes;
3633ba75c13SBaskov Evgeniy 	efi_gcd_memory_type_t gcd_memory_type;
3643ba75c13SBaskov Evgeniy 	void *image_handle;
3653ba75c13SBaskov Evgeniy 	void *device_handle;
3663ba75c13SBaskov Evgeniy } efi_gcd_memory_space_desc_t;
3673ba75c13SBaskov Evgeniy 
3683ba75c13SBaskov Evgeniy /*
3693ba75c13SBaskov Evgeniy  * EFI DXE Services table
3703ba75c13SBaskov Evgeniy  */
3713ba75c13SBaskov Evgeniy union efi_dxe_services_table {
3723ba75c13SBaskov Evgeniy 	struct {
3733ba75c13SBaskov Evgeniy 		efi_table_hdr_t hdr;
3743ba75c13SBaskov Evgeniy 		void *add_memory_space;
3753ba75c13SBaskov Evgeniy 		void *allocate_memory_space;
3763ba75c13SBaskov Evgeniy 		void *free_memory_space;
3773ba75c13SBaskov Evgeniy 		void *remove_memory_space;
3783ba75c13SBaskov Evgeniy 		efi_status_t (__efiapi *get_memory_space_descriptor)(efi_physical_addr_t,
3793ba75c13SBaskov Evgeniy 								     efi_gcd_memory_space_desc_t *);
3803ba75c13SBaskov Evgeniy 		efi_status_t (__efiapi *set_memory_space_attributes)(efi_physical_addr_t,
3813ba75c13SBaskov Evgeniy 								     u64, u64);
3823ba75c13SBaskov Evgeniy 		void *get_memory_space_map;
3833ba75c13SBaskov Evgeniy 		void *add_io_space;
3843ba75c13SBaskov Evgeniy 		void *allocate_io_space;
3853ba75c13SBaskov Evgeniy 		void *free_io_space;
3863ba75c13SBaskov Evgeniy 		void *remove_io_space;
3873ba75c13SBaskov Evgeniy 		void *get_io_space_descriptor;
3883ba75c13SBaskov Evgeniy 		void *get_io_space_map;
3893ba75c13SBaskov Evgeniy 		void *dispatch;
3903ba75c13SBaskov Evgeniy 		void *schedule;
3913ba75c13SBaskov Evgeniy 		void *trust;
3923ba75c13SBaskov Evgeniy 		void *process_firmware_volume;
3933ba75c13SBaskov Evgeniy 		void *set_memory_space_capabilities;
3943ba75c13SBaskov Evgeniy 	};
3953ba75c13SBaskov Evgeniy 	struct {
3963ba75c13SBaskov Evgeniy 		efi_table_hdr_t hdr;
3973ba75c13SBaskov Evgeniy 		u32 add_memory_space;
3983ba75c13SBaskov Evgeniy 		u32 allocate_memory_space;
3993ba75c13SBaskov Evgeniy 		u32 free_memory_space;
4003ba75c13SBaskov Evgeniy 		u32 remove_memory_space;
4013ba75c13SBaskov Evgeniy 		u32 get_memory_space_descriptor;
4023ba75c13SBaskov Evgeniy 		u32 set_memory_space_attributes;
4033ba75c13SBaskov Evgeniy 		u32 get_memory_space_map;
4043ba75c13SBaskov Evgeniy 		u32 add_io_space;
4053ba75c13SBaskov Evgeniy 		u32 allocate_io_space;
4063ba75c13SBaskov Evgeniy 		u32 free_io_space;
4073ba75c13SBaskov Evgeniy 		u32 remove_io_space;
4083ba75c13SBaskov Evgeniy 		u32 get_io_space_descriptor;
4093ba75c13SBaskov Evgeniy 		u32 get_io_space_map;
4103ba75c13SBaskov Evgeniy 		u32 dispatch;
4113ba75c13SBaskov Evgeniy 		u32 schedule;
4123ba75c13SBaskov Evgeniy 		u32 trust;
4133ba75c13SBaskov Evgeniy 		u32 process_firmware_volume;
4143ba75c13SBaskov Evgeniy 		u32 set_memory_space_capabilities;
4153ba75c13SBaskov Evgeniy 	} mixed_mode;
4163ba75c13SBaskov Evgeniy };
4173ba75c13SBaskov Evgeniy 
418c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t;
419c2d0b470SArd Biesheuvel 
420c2d0b470SArd Biesheuvel union efi_uga_draw_protocol {
421c2d0b470SArd Biesheuvel 	struct {
422c2d0b470SArd Biesheuvel 		efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *,
423c2d0b470SArd Biesheuvel 						  u32*, u32*, u32*, u32*);
424c2d0b470SArd Biesheuvel 		void *set_mode;
425c2d0b470SArd Biesheuvel 		void *blt;
426c2d0b470SArd Biesheuvel 	};
427c2d0b470SArd Biesheuvel 	struct {
428c2d0b470SArd Biesheuvel 		u32 get_mode;
429c2d0b470SArd Biesheuvel 		u32 set_mode;
430c2d0b470SArd Biesheuvel 		u32 blt;
431c2d0b470SArd Biesheuvel 	} mixed_mode;
432c2d0b470SArd Biesheuvel };
433c2d0b470SArd Biesheuvel 
4349b47c527SArvind Sankar typedef struct {
4359b47c527SArvind Sankar 	u16 scan_code;
4369b47c527SArvind Sankar 	efi_char16_t unicode_char;
4379b47c527SArvind Sankar } efi_input_key_t;
4389b47c527SArvind Sankar 
4399b47c527SArvind Sankar union efi_simple_text_input_protocol {
4409b47c527SArvind Sankar 	struct {
4419b47c527SArvind Sankar 		void *reset;
4429b47c527SArvind Sankar 		efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *,
4439b47c527SArvind Sankar 							efi_input_key_t *);
4449b47c527SArvind Sankar 		efi_event_t wait_for_key;
4459b47c527SArvind Sankar 	};
4469b47c527SArvind Sankar 	struct {
4479b47c527SArvind Sankar 		u32 reset;
4489b47c527SArvind Sankar 		u32 read_keystroke;
4499b47c527SArvind Sankar 		u32 wait_for_key;
4509b47c527SArvind Sankar 	} mixed_mode;
4519b47c527SArvind Sankar };
4529b47c527SArvind Sankar 
45314c574f3SArvind Sankar efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key);
45414c574f3SArvind Sankar 
4558166ec09SArd Biesheuvel union efi_simple_text_output_protocol {
4568166ec09SArd Biesheuvel 	struct {
4578166ec09SArd Biesheuvel 		void *reset;
4588166ec09SArd Biesheuvel 		efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
4598166ec09SArd Biesheuvel 						       efi_char16_t *);
4608166ec09SArd Biesheuvel 		void *test_string;
4618166ec09SArd Biesheuvel 	};
4628166ec09SArd Biesheuvel 	struct {
4638166ec09SArd Biesheuvel 		u32 reset;
4648166ec09SArd Biesheuvel 		u32 output_string;
4658166ec09SArd Biesheuvel 		u32 test_string;
4668166ec09SArd Biesheuvel 	} mixed_mode;
4678166ec09SArd Biesheuvel };
4688166ec09SArd Biesheuvel 
4698166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0
4708166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1
4718166ec09SArd Biesheuvel #define PIXEL_BIT_MASK					2
4728166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY					3
4738166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX				4
4748166ec09SArd Biesheuvel 
4758166ec09SArd Biesheuvel typedef struct {
4768166ec09SArd Biesheuvel 	u32 red_mask;
4778166ec09SArd Biesheuvel 	u32 green_mask;
4788166ec09SArd Biesheuvel 	u32 blue_mask;
4798166ec09SArd Biesheuvel 	u32 reserved_mask;
4808166ec09SArd Biesheuvel } efi_pixel_bitmask_t;
4818166ec09SArd Biesheuvel 
4828166ec09SArd Biesheuvel typedef struct {
4838166ec09SArd Biesheuvel 	u32 version;
4848166ec09SArd Biesheuvel 	u32 horizontal_resolution;
4858166ec09SArd Biesheuvel 	u32 vertical_resolution;
4868166ec09SArd Biesheuvel 	int pixel_format;
4878166ec09SArd Biesheuvel 	efi_pixel_bitmask_t pixel_information;
4888166ec09SArd Biesheuvel 	u32 pixels_per_scan_line;
4898166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t;
4908166ec09SArd Biesheuvel 
4918166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
4928166ec09SArd Biesheuvel 
4938166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode {
4948166ec09SArd Biesheuvel 	struct {
4958166ec09SArd Biesheuvel 		u32 max_mode;
4968166ec09SArd Biesheuvel 		u32 mode;
4978166ec09SArd Biesheuvel 		efi_graphics_output_mode_info_t *info;
4988166ec09SArd Biesheuvel 		unsigned long size_of_info;
4998166ec09SArd Biesheuvel 		efi_physical_addr_t frame_buffer_base;
5008166ec09SArd Biesheuvel 		unsigned long frame_buffer_size;
5018166ec09SArd Biesheuvel 	};
5028166ec09SArd Biesheuvel 	struct {
5038166ec09SArd Biesheuvel 		u32 max_mode;
5048166ec09SArd Biesheuvel 		u32 mode;
5058166ec09SArd Biesheuvel 		u32 info;
5068166ec09SArd Biesheuvel 		u32 size_of_info;
5078166ec09SArd Biesheuvel 		u64 frame_buffer_base;
5088166ec09SArd Biesheuvel 		u32 frame_buffer_size;
5098166ec09SArd Biesheuvel 	} mixed_mode;
5108166ec09SArd Biesheuvel };
5118166ec09SArd Biesheuvel 
5128166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
5138166ec09SArd Biesheuvel 
5148166ec09SArd Biesheuvel union efi_graphics_output_protocol {
5158166ec09SArd Biesheuvel 	struct {
516b4b89a02SArvind Sankar 		efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *,
517b4b89a02SArvind Sankar 						    u32, unsigned long *,
518b4b89a02SArvind Sankar 						    efi_graphics_output_mode_info_t **);
519b4b89a02SArvind Sankar 		efi_status_t (__efiapi *set_mode)  (efi_graphics_output_protocol_t *, u32);
5208166ec09SArd Biesheuvel 		void *blt;
5218166ec09SArd Biesheuvel 		efi_graphics_output_protocol_mode_t *mode;
5228166ec09SArd Biesheuvel 	};
5238166ec09SArd Biesheuvel 	struct {
5248166ec09SArd Biesheuvel 		u32 query_mode;
5258166ec09SArd Biesheuvel 		u32 set_mode;
5268166ec09SArd Biesheuvel 		u32 blt;
5278166ec09SArd Biesheuvel 		u32 mode;
5288166ec09SArd Biesheuvel 	} mixed_mode;
5298166ec09SArd Biesheuvel };
5308166ec09SArd Biesheuvel 
531f7b85b33SArd Biesheuvel typedef union {
532f7b85b33SArd Biesheuvel 	struct {
533a46a290aSArd Biesheuvel 		u32			revision;
534a46a290aSArd Biesheuvel 		efi_handle_t		parent_handle;
535a46a290aSArd Biesheuvel 		efi_system_table_t	*system_table;
536a46a290aSArd Biesheuvel 		efi_handle_t		device_handle;
537a46a290aSArd Biesheuvel 		void			*file_path;
538a46a290aSArd Biesheuvel 		void			*reserved;
539a46a290aSArd Biesheuvel 		u32			load_options_size;
540a46a290aSArd Biesheuvel 		void			*load_options;
541a46a290aSArd Biesheuvel 		void			*image_base;
542a46a290aSArd Biesheuvel 		__aligned_u64		image_size;
543a46a290aSArd Biesheuvel 		unsigned int		image_code_type;
544a46a290aSArd Biesheuvel 		unsigned int		image_data_type;
545a46a290aSArd Biesheuvel 		efi_status_t		(__efiapi *unload)(efi_handle_t image_handle);
546f7b85b33SArd Biesheuvel 	};
547f7b85b33SArd Biesheuvel 	struct {
548f7b85b33SArd Biesheuvel 		u32		revision;
549f7b85b33SArd Biesheuvel 		u32		parent_handle;
550f7b85b33SArd Biesheuvel 		u32		system_table;
551f7b85b33SArd Biesheuvel 		u32		device_handle;
552f7b85b33SArd Biesheuvel 		u32		file_path;
553f7b85b33SArd Biesheuvel 		u32		reserved;
554f7b85b33SArd Biesheuvel 		u32		load_options_size;
555f7b85b33SArd Biesheuvel 		u32		load_options;
556f7b85b33SArd Biesheuvel 		u32		image_base;
557f7b85b33SArd Biesheuvel 		__aligned_u64	image_size;
558f7b85b33SArd Biesheuvel 		u32		image_code_type;
559f7b85b33SArd Biesheuvel 		u32		image_data_type;
560f7b85b33SArd Biesheuvel 		u32		unload;
561f7b85b33SArd Biesheuvel 	} mixed_mode;
562a46a290aSArd Biesheuvel } efi_loaded_image_t;
563a46a290aSArd Biesheuvel 
564a46a290aSArd Biesheuvel typedef struct {
565a46a290aSArd Biesheuvel 	u64			size;
566a46a290aSArd Biesheuvel 	u64			file_size;
567a46a290aSArd Biesheuvel 	u64			phys_size;
568a46a290aSArd Biesheuvel 	efi_time_t		create_time;
569a46a290aSArd Biesheuvel 	efi_time_t		last_access_time;
570a46a290aSArd Biesheuvel 	efi_time_t		modification_time;
571a46a290aSArd Biesheuvel 	__aligned_u64		attribute;
5729302c1bbSArd Biesheuvel 	efi_char16_t		filename[];
573a46a290aSArd Biesheuvel } efi_file_info_t;
574a46a290aSArd Biesheuvel 
575a46a290aSArd Biesheuvel typedef struct efi_file_protocol efi_file_protocol_t;
576a46a290aSArd Biesheuvel 
577a46a290aSArd Biesheuvel struct efi_file_protocol {
578a46a290aSArd Biesheuvel 	u64		revision;
579a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *open)	(efi_file_protocol_t *,
580a46a290aSArd Biesheuvel 						 efi_file_protocol_t **,
581a46a290aSArd Biesheuvel 						 efi_char16_t *, u64, u64);
582a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *close)	(efi_file_protocol_t *);
583a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *delete)	(efi_file_protocol_t *);
584a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *read)	(efi_file_protocol_t *,
585a46a290aSArd Biesheuvel 						 unsigned long *, void *);
586a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *write)	(efi_file_protocol_t *,
587a46a290aSArd Biesheuvel 						 unsigned long, void *);
588a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_position)(efi_file_protocol_t *, u64 *);
589a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_position)(efi_file_protocol_t *, u64);
590a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *get_info)	(efi_file_protocol_t *,
591a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long *,
592a46a290aSArd Biesheuvel 						 void *);
593a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *set_info)	(efi_file_protocol_t *,
594a46a290aSArd Biesheuvel 						 efi_guid_t *, unsigned long,
595a46a290aSArd Biesheuvel 						 void *);
596a46a290aSArd Biesheuvel 	efi_status_t	(__efiapi *flush)	(efi_file_protocol_t *);
597a46a290aSArd Biesheuvel };
598a46a290aSArd Biesheuvel 
599a46a290aSArd Biesheuvel typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t;
600a46a290aSArd Biesheuvel 
601a46a290aSArd Biesheuvel struct efi_simple_file_system_protocol {
602a46a290aSArd Biesheuvel 	u64	revision;
603a46a290aSArd Biesheuvel 	int	(__efiapi *open_volume)(efi_simple_file_system_protocol_t *,
604a46a290aSArd Biesheuvel 					efi_file_protocol_t **);
605a46a290aSArd Biesheuvel };
606a46a290aSArd Biesheuvel 
607a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ	0x0000000000000001
608a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE	0x0000000000000002
609a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE	0x8000000000000000
610a46a290aSArd Biesheuvel 
6118166ec09SArd Biesheuvel typedef enum {
6128166ec09SArd Biesheuvel 	EfiPciIoWidthUint8,
6138166ec09SArd Biesheuvel 	EfiPciIoWidthUint16,
6148166ec09SArd Biesheuvel 	EfiPciIoWidthUint32,
6158166ec09SArd Biesheuvel 	EfiPciIoWidthUint64,
6168166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint8,
6178166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint16,
6188166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint32,
6198166ec09SArd Biesheuvel 	EfiPciIoWidthFifoUint64,
6208166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint8,
6218166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint16,
6228166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint32,
6238166ec09SArd Biesheuvel 	EfiPciIoWidthFillUint64,
6248166ec09SArd Biesheuvel 	EfiPciIoWidthMaximum
6258166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH;
6268166ec09SArd Biesheuvel 
6278166ec09SArd Biesheuvel typedef enum {
6288166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationGet,
6298166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSet,
6308166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationEnable,
6318166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationDisable,
6328166ec09SArd Biesheuvel 	EfiPciIoAttributeOperationSupported,
6338166ec09SArd Biesheuvel     EfiPciIoAttributeOperationMaximum
6348166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
6358166ec09SArd Biesheuvel 
6368166ec09SArd Biesheuvel typedef struct {
6378166ec09SArd Biesheuvel 	u32 read;
6388166ec09SArd Biesheuvel 	u32 write;
6398166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t;
6408166ec09SArd Biesheuvel 
6418166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
6428166ec09SArd Biesheuvel 
6438166ec09SArd Biesheuvel typedef
6448166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
6458166ec09SArd Biesheuvel 						   EFI_PCI_IO_PROTOCOL_WIDTH,
6468166ec09SArd Biesheuvel 						   u32 offset,
6478166ec09SArd Biesheuvel 						   unsigned long count,
6488166ec09SArd Biesheuvel 						   void *buffer);
6498166ec09SArd Biesheuvel 
6508166ec09SArd Biesheuvel typedef struct {
6518166ec09SArd Biesheuvel 	void *read;
6528166ec09SArd Biesheuvel 	void *write;
6538166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t;
6548166ec09SArd Biesheuvel 
6558166ec09SArd Biesheuvel typedef struct {
6568166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t read;
6578166ec09SArd Biesheuvel 	efi_pci_io_protocol_cfg_t write;
6588166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t;
6598166ec09SArd Biesheuvel 
6608166ec09SArd Biesheuvel union efi_pci_io_protocol {
6618166ec09SArd Biesheuvel 	struct {
6628166ec09SArd Biesheuvel 		void *poll_mem;
6638166ec09SArd Biesheuvel 		void *poll_io;
6648166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t mem;
6658166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_t io;
6668166ec09SArd Biesheuvel 		efi_pci_io_protocol_config_access_t pci;
6678166ec09SArd Biesheuvel 		void *copy_mem;
6688166ec09SArd Biesheuvel 		void *map;
6698166ec09SArd Biesheuvel 		void *unmap;
6708166ec09SArd Biesheuvel 		void *allocate_buffer;
6718166ec09SArd Biesheuvel 		void *free_buffer;
6728166ec09SArd Biesheuvel 		void *flush;
6738166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
6748166ec09SArd Biesheuvel 						      unsigned long *segment_nr,
6758166ec09SArd Biesheuvel 						      unsigned long *bus_nr,
6768166ec09SArd Biesheuvel 						      unsigned long *device_nr,
6778166ec09SArd Biesheuvel 						      unsigned long *func_nr);
6788166ec09SArd Biesheuvel 		void *attributes;
6798166ec09SArd Biesheuvel 		void *get_bar_attributes;
6808166ec09SArd Biesheuvel 		void *set_bar_attributes;
6818166ec09SArd Biesheuvel 		uint64_t romsize;
6828166ec09SArd Biesheuvel 		void *romimage;
6838166ec09SArd Biesheuvel 	};
6848166ec09SArd Biesheuvel 	struct {
6858166ec09SArd Biesheuvel 		u32 poll_mem;
6868166ec09SArd Biesheuvel 		u32 poll_io;
6878166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t mem;
6888166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t io;
6898166ec09SArd Biesheuvel 		efi_pci_io_protocol_access_32_t pci;
6908166ec09SArd Biesheuvel 		u32 copy_mem;
6918166ec09SArd Biesheuvel 		u32 map;
6928166ec09SArd Biesheuvel 		u32 unmap;
6938166ec09SArd Biesheuvel 		u32 allocate_buffer;
6948166ec09SArd Biesheuvel 		u32 free_buffer;
6958166ec09SArd Biesheuvel 		u32 flush;
6968166ec09SArd Biesheuvel 		u32 get_location;
6978166ec09SArd Biesheuvel 		u32 attributes;
6988166ec09SArd Biesheuvel 		u32 get_bar_attributes;
6998166ec09SArd Biesheuvel 		u32 set_bar_attributes;
7008166ec09SArd Biesheuvel 		u64 romsize;
7018166ec09SArd Biesheuvel 		u32 romimage;
7028166ec09SArd Biesheuvel 	} mixed_mode;
7038166ec09SArd Biesheuvel };
7048166ec09SArd Biesheuvel 
7058166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
7068166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
7078166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
7088166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
7098166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
7108166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
7118166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
7128166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
7138166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
7148166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
7158166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
7168166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
7178166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
7188166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
7198166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
7208166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
7218166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
7228166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
7238166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
7248166ec09SArd Biesheuvel 
7258166ec09SArd Biesheuvel struct efi_dev_path;
7268166ec09SArd Biesheuvel 
7278166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t;
7288166ec09SArd Biesheuvel 
7298166ec09SArd Biesheuvel union apple_properties_protocol {
7308166ec09SArd Biesheuvel 	struct {
7318166ec09SArd Biesheuvel 		unsigned long version;
7328166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
7338166ec09SArd Biesheuvel 					     struct efi_dev_path *,
7348166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32 *);
7358166ec09SArd Biesheuvel 		efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
7368166ec09SArd Biesheuvel 					     struct efi_dev_path *,
7378166ec09SArd Biesheuvel 					     efi_char16_t *, void *, u32);
7388166ec09SArd Biesheuvel 		efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
7398166ec09SArd Biesheuvel 					     struct efi_dev_path *,
7408166ec09SArd Biesheuvel 					     efi_char16_t *);
7418166ec09SArd Biesheuvel 		efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
7428166ec09SArd Biesheuvel 						 void *buffer, u32 *);
7438166ec09SArd Biesheuvel 	};
7448166ec09SArd Biesheuvel 	struct {
7458166ec09SArd Biesheuvel 		u32 version;
7468166ec09SArd Biesheuvel 		u32 get;
7478166ec09SArd Biesheuvel 		u32 set;
7488166ec09SArd Biesheuvel 		u32 del;
7498166ec09SArd Biesheuvel 		u32 get_all;
7508166ec09SArd Biesheuvel 	} mixed_mode;
7518166ec09SArd Biesheuvel };
7528166ec09SArd Biesheuvel 
7538166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format;
7548166ec09SArd Biesheuvel 
7554da87c51SArd Biesheuvel #define INITRD_EVENT_TAG_ID 0x8F3B22ECU
75671c7adc9SIlias Apalodimas #define LOAD_OPTIONS_EVENT_TAG_ID 0x8F3B22EDU
7574da87c51SArd Biesheuvel #define EV_EVENT_TAG 0x00000006U
7584da87c51SArd Biesheuvel #define EFI_TCG2_EVENT_HEADER_VERSION	0x1
7594da87c51SArd Biesheuvel 
7604da87c51SArd Biesheuvel struct efi_tcg2_event {
7614da87c51SArd Biesheuvel 	u32		event_size;
7624da87c51SArd Biesheuvel 	struct {
7634da87c51SArd Biesheuvel 		u32	header_size;
7644da87c51SArd Biesheuvel 		u16	header_version;
7654da87c51SArd Biesheuvel 		u32	pcr_index;
7664da87c51SArd Biesheuvel 		u32	event_type;
7674da87c51SArd Biesheuvel 	} __packed event_header;
7684da87c51SArd Biesheuvel 	/* u8[] event follows here */
7694da87c51SArd Biesheuvel } __packed;
7704da87c51SArd Biesheuvel 
7714da87c51SArd Biesheuvel struct efi_tcg2_tagged_event {
7724da87c51SArd Biesheuvel 	u32 tagged_event_id;
7734da87c51SArd Biesheuvel 	u32 tagged_event_data_size;
7744da87c51SArd Biesheuvel 	/* u8  tagged event data follows here */
7754da87c51SArd Biesheuvel } __packed;
7764da87c51SArd Biesheuvel 
7774da87c51SArd Biesheuvel typedef struct efi_tcg2_event efi_tcg2_event_t;
7784da87c51SArd Biesheuvel typedef struct efi_tcg2_tagged_event efi_tcg2_tagged_event_t;
7798166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
7808166ec09SArd Biesheuvel 
7818166ec09SArd Biesheuvel union efi_tcg2_protocol {
7828166ec09SArd Biesheuvel 	struct {
7838166ec09SArd Biesheuvel 		void *get_capability;
784cdec91c0SArd Biesheuvel 		efi_status_t (__efiapi *get_event_log)(efi_tcg2_protocol_t *,
7858166ec09SArd Biesheuvel 						       efi_tcg2_event_log_format,
7868166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
7878166ec09SArd Biesheuvel 						       efi_physical_addr_t *,
7888166ec09SArd Biesheuvel 						       efi_bool_t *);
7894da87c51SArd Biesheuvel 		efi_status_t (__efiapi *hash_log_extend_event)(efi_tcg2_protocol_t *,
7904da87c51SArd Biesheuvel 							       u64,
7914da87c51SArd Biesheuvel 							       efi_physical_addr_t,
7924da87c51SArd Biesheuvel 							       u64,
7934da87c51SArd Biesheuvel 							       const efi_tcg2_event_t *);
7948166ec09SArd Biesheuvel 		void *submit_command;
7958166ec09SArd Biesheuvel 		void *get_active_pcr_banks;
7968166ec09SArd Biesheuvel 		void *set_active_pcr_banks;
7978166ec09SArd Biesheuvel 		void *get_result_of_set_active_pcr_banks;
7988166ec09SArd Biesheuvel 	};
7998166ec09SArd Biesheuvel 	struct {
8008166ec09SArd Biesheuvel 		u32 get_capability;
8018166ec09SArd Biesheuvel 		u32 get_event_log;
8028166ec09SArd Biesheuvel 		u32 hash_log_extend_event;
8038166ec09SArd Biesheuvel 		u32 submit_command;
8048166ec09SArd Biesheuvel 		u32 get_active_pcr_banks;
8058166ec09SArd Biesheuvel 		u32 set_active_pcr_banks;
8068166ec09SArd Biesheuvel 		u32 get_result_of_set_active_pcr_banks;
8078166ec09SArd Biesheuvel 	} mixed_mode;
8088166ec09SArd Biesheuvel };
8098166ec09SArd Biesheuvel 
8103f68e695SSunil V L struct riscv_efi_boot_protocol {
8113f68e695SSunil V L 	u64 revision;
8123f68e695SSunil V L 
8133f68e695SSunil V L 	efi_status_t (__efiapi *get_boot_hartid)(struct riscv_efi_boot_protocol *,
8143f68e695SSunil V L 						 unsigned long *boot_hartid);
8153f68e695SSunil V L };
8163f68e695SSunil V L 
8172931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t;
8182931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t;
8192931d526SArd Biesheuvel 
8202931d526SArd Biesheuvel union efi_load_file_protocol {
8212931d526SArd Biesheuvel 	struct {
8222931d526SArd Biesheuvel 		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,
8232931d526SArd Biesheuvel 						   efi_device_path_protocol_t *,
8242931d526SArd Biesheuvel 						   bool, unsigned long *, void *);
8252931d526SArd Biesheuvel 	};
8262931d526SArd Biesheuvel 	struct {
8272931d526SArd Biesheuvel 		u32 load_file;
8282931d526SArd Biesheuvel 	} mixed_mode;
8292931d526SArd Biesheuvel };
8302931d526SArd Biesheuvel 
8314a568ce2SArvind Sankar typedef struct {
8324a568ce2SArvind Sankar 	u32 attributes;
8334a568ce2SArvind Sankar 	u16 file_path_list_length;
8344a568ce2SArvind Sankar 	u8 variable_data[];
8354a568ce2SArvind Sankar 	// efi_char16_t description[];
8364a568ce2SArvind Sankar 	// efi_device_path_protocol_t file_path_list[];
8374a568ce2SArvind Sankar 	// u8 optional_data[];
8384a568ce2SArvind Sankar } __packed efi_load_option_t;
8394a568ce2SArvind Sankar 
8404a568ce2SArvind Sankar #define EFI_LOAD_OPTION_ACTIVE		0x0001U
8414a568ce2SArvind Sankar #define EFI_LOAD_OPTION_FORCE_RECONNECT	0x0002U
8424a568ce2SArvind Sankar #define EFI_LOAD_OPTION_HIDDEN		0x0008U
8434a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY	0x1f00U
8444a568ce2SArvind Sankar #define   EFI_LOAD_OPTION_CATEGORY_BOOT	0x0000U
8454a568ce2SArvind Sankar #define   EFI_LOAD_OPTION_CATEGORY_APP	0x0100U
8464a568ce2SArvind Sankar 
8474a568ce2SArvind Sankar #define EFI_LOAD_OPTION_BOOT_MASK \
8484a568ce2SArvind Sankar 	(EFI_LOAD_OPTION_ACTIVE|EFI_LOAD_OPTION_HIDDEN|EFI_LOAD_OPTION_CATEGORY)
8494a568ce2SArvind Sankar #define EFI_LOAD_OPTION_MASK (EFI_LOAD_OPTION_FORCE_RECONNECT|EFI_LOAD_OPTION_BOOT_MASK)
8504a568ce2SArvind Sankar 
8514a568ce2SArvind Sankar typedef struct {
8524a568ce2SArvind Sankar 	u32 attributes;
8534a568ce2SArvind Sankar 	u16 file_path_list_length;
8544a568ce2SArvind Sankar 	const efi_char16_t *description;
8554a568ce2SArvind Sankar 	const efi_device_path_protocol_t *file_path_list;
856a241d94bSArd Biesheuvel 	u32 optional_data_size;
8574a568ce2SArvind Sankar 	const void *optional_data;
8584a568ce2SArvind Sankar } efi_load_option_unpacked_t;
8594a568ce2SArvind Sankar 
8608166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void);
8618166ec09SArd Biesheuvel 
8628166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)(
8638166ec09SArd Biesheuvel 	struct efi_boot_memmap *map,
8648166ec09SArd Biesheuvel 	void *priv);
8658166ec09SArd Biesheuvel 
866eab31265SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle, void *priv,
8678166ec09SArd Biesheuvel 				    efi_exit_boot_map_processing priv_func);
8688166ec09SArd Biesheuvel 
8694fc8e738SArd Biesheuvel efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image,
8704fc8e738SArd Biesheuvel 			     unsigned long kernel_addr, char *cmdline_ptr);
8718166ec09SArd Biesheuvel 
8728166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size);
8738166ec09SArd Biesheuvel 
874f80d2604SArd Biesheuvel efi_status_t efi_alloc_virtmap(efi_memory_desc_t **virtmap,
875f80d2604SArd Biesheuvel 			       unsigned long *desc_size, u32 *desc_ver);
8768166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
8778166ec09SArd Biesheuvel 		     unsigned long desc_size, efi_memory_desc_t *runtime_map,
8788166ec09SArd Biesheuvel 		     int *count);
8798166ec09SArd Biesheuvel 
8808166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);
8818166ec09SArd Biesheuvel 
8828166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align,
8838166ec09SArd Biesheuvel 			      unsigned long *addr, unsigned long random_seed);
8848166ec09SArd Biesheuvel 
8858166ec09SArd Biesheuvel efi_status_t check_platform_features(void);
8868166ec09SArd Biesheuvel 
8878166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid);
8888166ec09SArd Biesheuvel 
889cb8c90a0SArvind Sankar /* NOTE: These functions do not print a trailing newline after the string */
890cb8c90a0SArvind Sankar void efi_char16_puts(efi_char16_t *);
891cb8c90a0SArvind Sankar void efi_puts(const char *str);
8928166ec09SArd Biesheuvel 
8932c7d1e30SArvind Sankar __printf(1, 2) int efi_printk(char const *fmt, ...);
8948166ec09SArd Biesheuvel 
8958166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr);
8968166ec09SArd Biesheuvel 
897a241d94bSArd Biesheuvel void efi_apply_loadoptions_quirk(const void **load_options, u32 *load_options_size);
8984a568ce2SArvind Sankar 
89927cd5511SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
9008166ec09SArd Biesheuvel 
901171539f5SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap **map,
902171539f5SArd Biesheuvel 				bool install_cfg_tbl);
9038166ec09SArd Biesheuvel 
9048166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
9058166ec09SArd Biesheuvel 				unsigned long max);
9068166ec09SArd Biesheuvel 
90743b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
90843b1df0eSArd Biesheuvel 					unsigned long max, unsigned long align);
90943b1df0eSArd Biesheuvel 
9101a895dbfSArd Biesheuvel efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
9111a895dbfSArd Biesheuvel 				 unsigned long *addr, unsigned long min);
9121a895dbfSArd Biesheuvel 
9138166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr,
9148166ec09SArd Biesheuvel 				 unsigned long image_size,
9158166ec09SArd Biesheuvel 				 unsigned long alloc_size,
9168166ec09SArd Biesheuvel 				 unsigned long preferred_addr,
9178166ec09SArd Biesheuvel 				 unsigned long alignment,
9188166ec09SArd Biesheuvel 				 unsigned long min_addr);
9198166ec09SArd Biesheuvel 
9208166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline);
9218166ec09SArd Biesheuvel 
922fffb6804SArvind Sankar void efi_parse_option_graphics(char *option);
923fffb6804SArvind Sankar 
9248166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
9258166ec09SArd Biesheuvel 			   unsigned long size);
9268166ec09SArd Biesheuvel 
927cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
928cf6b8366SArd Biesheuvel 				  const efi_char16_t *optstr,
929cf6b8366SArd Biesheuvel 				  int optstr_size,
930cf6b8366SArd Biesheuvel 				  unsigned long soft_limit,
931cf6b8366SArd Biesheuvel 				  unsigned long hard_limit,
9329302c1bbSArd Biesheuvel 				  unsigned long *load_addr,
9339302c1bbSArd Biesheuvel 				  unsigned long *load_size);
9349302c1bbSArd Biesheuvel 
935cf6b8366SArd Biesheuvel 
936cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
937cf6b8366SArd Biesheuvel 					unsigned long *load_addr,
938cf6b8366SArd Biesheuvel 					unsigned long *load_size)
939cf6b8366SArd Biesheuvel {
940cf6b8366SArd Biesheuvel 	return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
941cf6b8366SArd Biesheuvel 				    ULONG_MAX, ULONG_MAX, load_addr, load_size);
942cf6b8366SArd Biesheuvel }
943cf6b8366SArd Biesheuvel 
944f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image,
94531f5e546SArd Biesheuvel 			     unsigned long soft_limit,
946f4dc7fffSArd Biesheuvel 			     unsigned long hard_limit,
947f4dc7fffSArd Biesheuvel 			     const struct linux_efi_initrd **out);
9483230d95cSAtish Patra /*
9493230d95cSAtish Patra  * This function handles the architcture specific differences between arm and
9503230d95cSAtish Patra  * arm64 regarding where the kernel image must be loaded and any memory that
9513230d95cSAtish Patra  * must be reserved. On failure it is required to free all
9523230d95cSAtish Patra  * all allocations it has made.
9533230d95cSAtish Patra  */
9543230d95cSAtish Patra efi_status_t handle_kernel_image(unsigned long *image_addr,
9553230d95cSAtish Patra 				 unsigned long *image_size,
9563230d95cSAtish Patra 				 unsigned long *reserve_addr,
9573230d95cSAtish Patra 				 unsigned long *reserve_size,
958416a9f84SArd Biesheuvel 				 efi_loaded_image_t *image,
959416a9f84SArd Biesheuvel 				 efi_handle_t image_handle);
9603230d95cSAtish Patra 
9613230d95cSAtish Patra asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint,
9623230d95cSAtish Patra 					    unsigned long fdt_addr,
9633230d95cSAtish Patra 					    unsigned long fdt_size);
964ec93fc37SArd Biesheuvel 
9652a55280aSArd Biesheuvel void efi_handle_post_ebs_state(void);
9662a55280aSArd Biesheuvel 
967e1ac4b24SChester Lin enum efi_secureboot_mode efi_get_secureboot(void);
968e1ac4b24SChester Lin 
9693820749dSArd Biesheuvel #ifdef CONFIG_RESET_ATTACK_MITIGATION
9703820749dSArd Biesheuvel void efi_enable_reset_attack_mitigation(void);
9713820749dSArd Biesheuvel #else
9723820749dSArd Biesheuvel static inline void
9733820749dSArd Biesheuvel efi_enable_reset_attack_mitigation(void) { }
9743820749dSArd Biesheuvel #endif
9753820749dSArd Biesheuvel 
9763820749dSArd Biesheuvel void efi_retrieve_tpm2_eventlog(void);
9773820749dSArd Biesheuvel 
978*732ea9dbSArd Biesheuvel struct screen_info *alloc_screen_info(void);
979*732ea9dbSArd Biesheuvel void free_screen_info(struct screen_info *si);
980*732ea9dbSArd Biesheuvel 
981f4f75ad5SArd Biesheuvel #endif
982