brintos

brintos / linux-shallow public Read only

0
0
Text · 33.4 KiB · 685098f Raw
1236 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2 3#ifndef _DRIVERS_FIRMWARE_EFI_EFISTUB_H4#define _DRIVERS_FIRMWARE_EFI_EFISTUB_H5 6#include <linux/compiler.h>7#include <linux/efi.h>8#include <linux/kernel.h>9#include <linux/kern_levels.h>10#include <linux/types.h>11#include <asm/efi.h>12 13/*14 * __init annotations should not be used in the EFI stub, since the code is15 * either included in the decompressor (x86, ARM) where they have no effect,16 * or the whole stub is __init annotated at the section level (arm64), by17 * renaming the sections, in which case the __init annotation will be18 * redundant, and will result in section names like .init.init.text, and our19 * linker script does not expect that.20 */21#undef __init22 23/*24 * Allow the platform to override the allocation granularity: this allows25 * systems that have the capability to run with a larger page size to deal26 * with the allocations for initrd and fdt more efficiently.27 */28#ifndef EFI_ALLOC_ALIGN29#define EFI_ALLOC_ALIGN		EFI_PAGE_SIZE30#endif31 32#ifndef EFI_ALLOC_LIMIT33#define EFI_ALLOC_LIMIT		ULONG_MAX34#endif35 36extern bool efi_no5lvl;37extern bool efi_nochunk;38extern bool efi_nokaslr;39extern int efi_loglevel;40extern int efi_mem_encrypt;41extern bool efi_novamap;42extern const efi_system_table_t *efi_system_table;43 44typedef union efi_dxe_services_table efi_dxe_services_table_t;45extern const efi_dxe_services_table_t *efi_dxe_table;46 47efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,48				   efi_system_table_t *sys_table_arg);49 50#ifndef ARCH_HAS_EFISTUB_WRAPPERS51 52#define efi_is_native()			(true)53#define efi_table_attr(inst, attr)	(inst)->attr54#define efi_fn_call(inst, func, ...)	(inst)->func(__VA_ARGS__)55 56#endif57 58#define efi_call_proto(inst, func, ...) ({			\59	__typeof__(inst) __inst = (inst);			\60	efi_fn_call(__inst, func, __inst, ##__VA_ARGS__);	\61})62#define efi_bs_call(func, ...) \63	efi_fn_call(efi_table_attr(efi_system_table, boottime), func, ##__VA_ARGS__)64#define efi_rt_call(func, ...) \65	efi_fn_call(efi_table_attr(efi_system_table, runtime), func, ##__VA_ARGS__)66#define efi_dxe_call(func, ...) \67	efi_fn_call(efi_dxe_table, func, ##__VA_ARGS__)68 69#define efi_info(fmt, ...) \70	efi_printk(KERN_INFO fmt, ##__VA_ARGS__)71#define efi_warn(fmt, ...) \72	efi_printk(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)73#define efi_err(fmt, ...) \74	efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)75#define efi_debug(fmt, ...) \76	efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)77 78#define efi_printk_once(fmt, ...) 		\79({						\80	static bool __print_once;		\81	bool __ret_print_once = !__print_once;	\82						\83	if (!__print_once) {			\84		__print_once = true;		\85		efi_printk(fmt, ##__VA_ARGS__);	\86	}					\87	__ret_print_once;			\88})89 90#define efi_info_once(fmt, ...) \91	efi_printk_once(KERN_INFO fmt, ##__VA_ARGS__)92#define efi_warn_once(fmt, ...) \93	efi_printk_once(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)94#define efi_err_once(fmt, ...) \95	efi_printk_once(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)96#define efi_debug_once(fmt, ...) \97	efi_printk_once(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)98 99/* Helper macros for the usual case of using simple C variables: */100#ifndef fdt_setprop_inplace_var101#define fdt_setprop_inplace_var(fdt, node_offset, name, var) \102	fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var))103#endif104 105#ifndef fdt_setprop_var106#define fdt_setprop_var(fdt, node_offset, name, var) \107	fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var))108#endif109 110#define get_efi_var(name, vendor, ...)				\111	efi_rt_call(get_variable, (efi_char16_t *)(name),	\112		    (efi_guid_t *)(vendor), __VA_ARGS__)113 114#define set_efi_var(name, vendor, ...)				\115	efi_rt_call(set_variable, (efi_char16_t *)(name),	\116		    (efi_guid_t *)(vendor), __VA_ARGS__)117 118#define efi_get_handle_at(array, idx)					\119	(efi_is_native() ? (array)[idx] 				\120		: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])121 122#define efi_get_handle_num(size)					\123	((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))124 125#define for_each_efi_handle(handle, array, size, i)			\126	for (i = 0;							\127	     i < efi_get_handle_num(size) &&				\128		((handle = efi_get_handle_at((array), i)) || true);	\129	     i++)130 131static inline132void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)133{134	*lo = lower_32_bits(data);135	*hi = upper_32_bits(data);136}137 138/*139 * Allocation types for calls to boottime->allocate_pages.140 */141#define EFI_ALLOCATE_ANY_PAGES		0142#define EFI_ALLOCATE_MAX_ADDRESS	1143#define EFI_ALLOCATE_ADDRESS		2144#define EFI_MAX_ALLOCATE_TYPE		3145 146/*147 * The type of search to perform when calling boottime->locate_handle148 */149#define EFI_LOCATE_ALL_HANDLES			0150#define EFI_LOCATE_BY_REGISTER_NOTIFY		1151#define EFI_LOCATE_BY_PROTOCOL			2152 153/*154 * boottime->stall takes the time period in microseconds155 */156#define EFI_USEC_PER_SEC		1000000157 158/*159 * boottime->set_timer takes the time in 100ns units160 */161#define EFI_100NSEC_PER_USEC	((u64)10)162 163/*164 * An efi_boot_memmap is used by efi_get_memory_map() to return the165 * EFI memory map in a dynamically allocated buffer.166 *167 * The buffer allocated for the EFI memory map includes extra room for168 * a minimum of EFI_MMAP_NR_SLACK_SLOTS additional EFI memory descriptors.169 * This facilitates the reuse of the EFI memory map buffer when a second170 * call to ExitBootServices() is needed because of intervening changes to171 * the EFI memory map. Other related structures, e.g. x86 e820ext, need172 * to factor in this headroom requirement as well.173 */174#define EFI_MMAP_NR_SLACK_SLOTS	8175 176typedef struct efi_generic_dev_path efi_device_path_protocol_t;177 178union efi_device_path_to_text_protocol {179	struct {180		efi_char16_t *(__efiapi *convert_device_node_to_text)(181					const efi_device_path_protocol_t *,182					bool, bool);183		efi_char16_t *(__efiapi *convert_device_path_to_text)(184					const efi_device_path_protocol_t *,185					bool, bool);186	};187	struct {188		u32 convert_device_node_to_text;189		u32 convert_device_path_to_text;190	} mixed_mode;191};192 193typedef union efi_device_path_to_text_protocol efi_device_path_to_text_protocol_t;194 195union efi_device_path_from_text_protocol {196	struct {197		efi_device_path_protocol_t *198			(__efiapi *convert_text_to_device_node)(const efi_char16_t *);199		efi_device_path_protocol_t *200			(__efiapi *convert_text_to_device_path)(const efi_char16_t *);201	};202	struct {203		u32 convert_text_to_device_node;204		u32 convert_text_to_device_path;205	} mixed_mode;206};207 208typedef union efi_device_path_from_text_protocol efi_device_path_from_text_protocol_t;209 210typedef void *efi_event_t;211/* Note that notifications won't work in mixed mode */212typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *);213 214#define EFI_EVT_TIMER		0x80000000U215#define EFI_EVT_RUNTIME		0x40000000U216#define EFI_EVT_NOTIFY_WAIT	0x00000100U217#define EFI_EVT_NOTIFY_SIGNAL	0x00000200U218 219/**220 * efi_set_event_at() - add event to events array221 *222 * @events:	array of UEFI events223 * @ids:	index where to put the event in the array224 * @event:	event to add to the aray225 *226 * boottime->wait_for_event() takes an array of events as input.227 * Provide a helper to set it up correctly for mixed mode.228 */229static inline230void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event)231{232	if (efi_is_native())233		events[idx] = event;234	else235		((u32 *)events)[idx] = (u32)(unsigned long)event;236}237 238#define EFI_TPL_APPLICATION	4239#define EFI_TPL_CALLBACK	8240#define EFI_TPL_NOTIFY		16241#define EFI_TPL_HIGH_LEVEL	31242 243typedef enum {244	EfiTimerCancel,245	EfiTimerPeriodic,246	EfiTimerRelative247} EFI_TIMER_DELAY;248 249/*250 * EFI Boot Services table251 */252union efi_boot_services {253	struct {254		efi_table_hdr_t hdr;255		void *raise_tpl;256		void *restore_tpl;257		efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,258							efi_physical_addr_t *);259		efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,260						    unsigned long);261		efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,262							unsigned long *,263							unsigned long *, u32 *);264		efi_status_t (__efiapi *allocate_pool)(int, unsigned long,265						       void **);266		efi_status_t (__efiapi *free_pool)(void *);267		efi_status_t (__efiapi *create_event)(u32, unsigned long,268						      efi_event_notify_t, void *,269						      efi_event_t *);270		efi_status_t (__efiapi *set_timer)(efi_event_t,271						  EFI_TIMER_DELAY, u64);272		efi_status_t (__efiapi *wait_for_event)(unsigned long,273							efi_event_t *,274							unsigned long *);275		void *signal_event;276		efi_status_t (__efiapi *close_event)(efi_event_t);277		void *check_event;278		void *install_protocol_interface;279		void *reinstall_protocol_interface;280		void *uninstall_protocol_interface;281		efi_status_t (__efiapi *handle_protocol)(efi_handle_t,282							 efi_guid_t *, void **);283		void *__reserved;284		void *register_protocol_notify;285		efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,286						       void *, unsigned long *,287						       efi_handle_t *);288		efi_status_t (__efiapi *locate_device_path)(efi_guid_t *,289							    efi_device_path_protocol_t **,290							    efi_handle_t *);291		efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,292								     void *);293		efi_status_t (__efiapi *load_image)(bool, efi_handle_t,294						    efi_device_path_protocol_t *,295						    void *, unsigned long,296						    efi_handle_t *);297		efi_status_t (__efiapi *start_image)(efi_handle_t, unsigned long *,298						     efi_char16_t **);299		efi_status_t __noreturn (__efiapi *exit)(efi_handle_t,300							 efi_status_t,301							 unsigned long,302							 efi_char16_t *);303		efi_status_t (__efiapi *unload_image)(efi_handle_t);304		efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,305							    unsigned long);306		void *get_next_monotonic_count;307		efi_status_t (__efiapi *stall)(unsigned long);308		void *set_watchdog_timer;309		void *connect_controller;310		efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,311							       efi_handle_t,312							       efi_handle_t);313		void *open_protocol;314		void *close_protocol;315		void *open_protocol_information;316		void *protocols_per_handle;317		void *locate_handle_buffer;318		efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,319							 void **);320		efi_status_t (__efiapi *install_multiple_protocol_interfaces)(efi_handle_t *, ...);321		efi_status_t (__efiapi *uninstall_multiple_protocol_interfaces)(efi_handle_t, ...);322		void *calculate_crc32;323		void (__efiapi *copy_mem)(void *, const void *, unsigned long);324		void (__efiapi *set_mem)(void *, unsigned long, unsigned char);325		void *create_event_ex;326	};327	struct {328		efi_table_hdr_t hdr;329		u32 raise_tpl;330		u32 restore_tpl;331		u32 allocate_pages;332		u32 free_pages;333		u32 get_memory_map;334		u32 allocate_pool;335		u32 free_pool;336		u32 create_event;337		u32 set_timer;338		u32 wait_for_event;339		u32 signal_event;340		u32 close_event;341		u32 check_event;342		u32 install_protocol_interface;343		u32 reinstall_protocol_interface;344		u32 uninstall_protocol_interface;345		u32 handle_protocol;346		u32 __reserved;347		u32 register_protocol_notify;348		u32 locate_handle;349		u32 locate_device_path;350		u32 install_configuration_table;351		u32 load_image;352		u32 start_image;353		u32 exit;354		u32 unload_image;355		u32 exit_boot_services;356		u32 get_next_monotonic_count;357		u32 stall;358		u32 set_watchdog_timer;359		u32 connect_controller;360		u32 disconnect_controller;361		u32 open_protocol;362		u32 close_protocol;363		u32 open_protocol_information;364		u32 protocols_per_handle;365		u32 locate_handle_buffer;366		u32 locate_protocol;367		u32 install_multiple_protocol_interfaces;368		u32 uninstall_multiple_protocol_interfaces;369		u32 calculate_crc32;370		u32 copy_mem;371		u32 set_mem;372		u32 create_event_ex;373	} mixed_mode;374};375 376typedef enum {377	EfiGcdMemoryTypeNonExistent,378	EfiGcdMemoryTypeReserved,379	EfiGcdMemoryTypeSystemMemory,380	EfiGcdMemoryTypeMemoryMappedIo,381	EfiGcdMemoryTypePersistent,382	EfiGcdMemoryTypeMoreReliable,383	EfiGcdMemoryTypeMaximum384} efi_gcd_memory_type_t;385 386typedef struct {387	efi_physical_addr_t base_address;388	u64 length;389	u64 capabilities;390	u64 attributes;391	efi_gcd_memory_type_t gcd_memory_type;392	void *image_handle;393	void *device_handle;394} efi_gcd_memory_space_desc_t;395 396/*397 * EFI DXE Services table398 */399union efi_dxe_services_table {400	struct {401		efi_table_hdr_t hdr;402		void *add_memory_space;403		void *allocate_memory_space;404		void *free_memory_space;405		void *remove_memory_space;406		efi_status_t (__efiapi *get_memory_space_descriptor)(efi_physical_addr_t,407								     efi_gcd_memory_space_desc_t *);408		efi_status_t (__efiapi *set_memory_space_attributes)(efi_physical_addr_t,409								     u64, u64);410		void *get_memory_space_map;411		void *add_io_space;412		void *allocate_io_space;413		void *free_io_space;414		void *remove_io_space;415		void *get_io_space_descriptor;416		void *get_io_space_map;417		void *dispatch;418		void *schedule;419		void *trust;420		void *process_firmware_volume;421		void *set_memory_space_capabilities;422	};423	struct {424		efi_table_hdr_t hdr;425		u32 add_memory_space;426		u32 allocate_memory_space;427		u32 free_memory_space;428		u32 remove_memory_space;429		u32 get_memory_space_descriptor;430		u32 set_memory_space_attributes;431		u32 get_memory_space_map;432		u32 add_io_space;433		u32 allocate_io_space;434		u32 free_io_space;435		u32 remove_io_space;436		u32 get_io_space_descriptor;437		u32 get_io_space_map;438		u32 dispatch;439		u32 schedule;440		u32 trust;441		u32 process_firmware_volume;442		u32 set_memory_space_capabilities;443	} mixed_mode;444};445 446typedef union efi_memory_attribute_protocol efi_memory_attribute_protocol_t;447 448union efi_memory_attribute_protocol {449	struct {450		efi_status_t (__efiapi *get_memory_attributes)(451			efi_memory_attribute_protocol_t *, efi_physical_addr_t, u64, u64 *);452 453		efi_status_t (__efiapi *set_memory_attributes)(454			efi_memory_attribute_protocol_t *, efi_physical_addr_t, u64, u64);455 456		efi_status_t (__efiapi *clear_memory_attributes)(457			efi_memory_attribute_protocol_t *, efi_physical_addr_t, u64, u64);458	};459	struct {460		u32 get_memory_attributes;461		u32 set_memory_attributes;462		u32 clear_memory_attributes;463	} mixed_mode;464};465 466typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t;467 468union efi_uga_draw_protocol {469	struct {470		efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *,471						  u32*, u32*, u32*, u32*);472		void *set_mode;473		void *blt;474	};475	struct {476		u32 get_mode;477		u32 set_mode;478		u32 blt;479	} mixed_mode;480};481 482typedef struct {483	u16 scan_code;484	efi_char16_t unicode_char;485} efi_input_key_t;486 487union efi_simple_text_input_protocol {488	struct {489		void *reset;490		efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *,491							efi_input_key_t *);492		efi_event_t wait_for_key;493	};494	struct {495		u32 reset;496		u32 read_keystroke;497		u32 wait_for_key;498	} mixed_mode;499};500 501efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key);502 503union efi_simple_text_output_protocol {504	struct {505		void *reset;506		efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,507						       efi_char16_t *);508		void *test_string;509	};510	struct {511		u32 reset;512		u32 output_string;513		u32 test_string;514	} mixed_mode;515};516 517#define PIXEL_RGB_RESERVED_8BIT_PER_COLOR		0518#define PIXEL_BGR_RESERVED_8BIT_PER_COLOR		1519#define PIXEL_BIT_MASK					2520#define PIXEL_BLT_ONLY					3521#define PIXEL_FORMAT_MAX				4522 523typedef struct {524	u32 red_mask;525	u32 green_mask;526	u32 blue_mask;527	u32 reserved_mask;528} efi_pixel_bitmask_t;529 530typedef struct {531	u32 version;532	u32 horizontal_resolution;533	u32 vertical_resolution;534	int pixel_format;535	efi_pixel_bitmask_t pixel_information;536	u32 pixels_per_scan_line;537} efi_graphics_output_mode_info_t;538 539typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;540 541union efi_graphics_output_protocol_mode {542	struct {543		u32 max_mode;544		u32 mode;545		efi_graphics_output_mode_info_t *info;546		unsigned long size_of_info;547		efi_physical_addr_t frame_buffer_base;548		unsigned long frame_buffer_size;549	};550	struct {551		u32 max_mode;552		u32 mode;553		u32 info;554		u32 size_of_info;555		u64 frame_buffer_base;556		u32 frame_buffer_size;557	} mixed_mode;558};559 560typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;561 562union efi_graphics_output_protocol {563	struct {564		efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *,565						    u32, unsigned long *,566						    efi_graphics_output_mode_info_t **);567		efi_status_t (__efiapi *set_mode)  (efi_graphics_output_protocol_t *, u32);568		void *blt;569		efi_graphics_output_protocol_mode_t *mode;570	};571	struct {572		u32 query_mode;573		u32 set_mode;574		u32 blt;575		u32 mode;576	} mixed_mode;577};578 579typedef union {580	struct {581		u32			revision;582		efi_handle_t		parent_handle;583		efi_system_table_t	*system_table;584		efi_handle_t		device_handle;585		void			*file_path;586		void			*reserved;587		u32			load_options_size;588		void			*load_options;589		void			*image_base;590		__aligned_u64		image_size;591		unsigned int		image_code_type;592		unsigned int		image_data_type;593		efi_status_t		(__efiapi *unload)(efi_handle_t image_handle);594	};595	struct {596		u32		revision;597		u32		parent_handle;598		u32		system_table;599		u32		device_handle;600		u32		file_path;601		u32		reserved;602		u32		load_options_size;603		u32		load_options;604		u32		image_base;605		__aligned_u64	image_size;606		u32		image_code_type;607		u32		image_data_type;608		u32		unload;609	} mixed_mode;610} efi_loaded_image_t;611 612typedef struct {613	u64			size;614	u64			file_size;615	u64			phys_size;616	efi_time_t		create_time;617	efi_time_t		last_access_time;618	efi_time_t		modification_time;619	__aligned_u64		attribute;620	efi_char16_t		filename[];621} efi_file_info_t;622 623typedef union efi_file_protocol efi_file_protocol_t;624 625union efi_file_protocol {626	struct {627		u64		revision;628		efi_status_t	(__efiapi *open)	(efi_file_protocol_t *,629							 efi_file_protocol_t **,630							 efi_char16_t *, u64,631							 u64);632		efi_status_t	(__efiapi *close)	(efi_file_protocol_t *);633		efi_status_t	(__efiapi *delete)	(efi_file_protocol_t *);634		efi_status_t	(__efiapi *read)	(efi_file_protocol_t *,635							 unsigned long *,636							 void *);637		efi_status_t	(__efiapi *write)	(efi_file_protocol_t *,638							 unsigned long, void *);639		efi_status_t	(__efiapi *get_position)(efi_file_protocol_t *,640							 u64 *);641		efi_status_t	(__efiapi *set_position)(efi_file_protocol_t *,642							 u64);643		efi_status_t	(__efiapi *get_info)	(efi_file_protocol_t *,644							 efi_guid_t *,645							 unsigned long *,646							 void *);647		efi_status_t	(__efiapi *set_info)	(efi_file_protocol_t *,648							 efi_guid_t *,649							 unsigned long,650							 void *);651		efi_status_t	(__efiapi *flush)	(efi_file_protocol_t *);652	};653	struct {654		u64 revision;655		u32 open;656		u32 close;657		u32 delete;658		u32 read;659		u32 write;660		u32 get_position;661		u32 set_position;662		u32 get_info;663		u32 set_info;664		u32 flush;665	} mixed_mode;666};667 668typedef union efi_simple_file_system_protocol efi_simple_file_system_protocol_t;669 670union efi_simple_file_system_protocol {671	struct {672		u64		revision;673		efi_status_t	(__efiapi *open_volume)(efi_simple_file_system_protocol_t *,674							efi_file_protocol_t **);675	};676	struct {677		u64 revision;678		u32 open_volume;679	} mixed_mode;680};681 682#define EFI_FILE_MODE_READ	0x0000000000000001683#define EFI_FILE_MODE_WRITE	0x0000000000000002684#define EFI_FILE_MODE_CREATE	0x8000000000000000685 686typedef enum {687	EfiPciIoWidthUint8,688	EfiPciIoWidthUint16,689	EfiPciIoWidthUint32,690	EfiPciIoWidthUint64,691	EfiPciIoWidthFifoUint8,692	EfiPciIoWidthFifoUint16,693	EfiPciIoWidthFifoUint32,694	EfiPciIoWidthFifoUint64,695	EfiPciIoWidthFillUint8,696	EfiPciIoWidthFillUint16,697	EfiPciIoWidthFillUint32,698	EfiPciIoWidthFillUint64,699	EfiPciIoWidthMaximum700} EFI_PCI_IO_PROTOCOL_WIDTH;701 702typedef enum {703	EfiPciIoAttributeOperationGet,704	EfiPciIoAttributeOperationSet,705	EfiPciIoAttributeOperationEnable,706	EfiPciIoAttributeOperationDisable,707	EfiPciIoAttributeOperationSupported,708    EfiPciIoAttributeOperationMaximum709} EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;710 711typedef struct {712	u32 read;713	u32 write;714} efi_pci_io_protocol_access_32_t;715 716typedef union efi_pci_io_protocol efi_pci_io_protocol_t;717 718typedef719efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,720						   EFI_PCI_IO_PROTOCOL_WIDTH,721						   u32 offset,722						   unsigned long count,723						   void *buffer);724 725typedef struct {726	void *read;727	void *write;728} efi_pci_io_protocol_access_t;729 730typedef struct {731	efi_pci_io_protocol_cfg_t read;732	efi_pci_io_protocol_cfg_t write;733} efi_pci_io_protocol_config_access_t;734 735union efi_pci_io_protocol {736	struct {737		void *poll_mem;738		void *poll_io;739		efi_pci_io_protocol_access_t mem;740		efi_pci_io_protocol_access_t io;741		efi_pci_io_protocol_config_access_t pci;742		void *copy_mem;743		void *map;744		void *unmap;745		void *allocate_buffer;746		void *free_buffer;747		void *flush;748		efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,749						      unsigned long *segment_nr,750						      unsigned long *bus_nr,751						      unsigned long *device_nr,752						      unsigned long *func_nr);753		void *attributes;754		void *get_bar_attributes;755		void *set_bar_attributes;756		uint64_t romsize;757		void *romimage;758	};759	struct {760		u32 poll_mem;761		u32 poll_io;762		efi_pci_io_protocol_access_32_t mem;763		efi_pci_io_protocol_access_32_t io;764		efi_pci_io_protocol_access_32_t pci;765		u32 copy_mem;766		u32 map;767		u32 unmap;768		u32 allocate_buffer;769		u32 free_buffer;770		u32 flush;771		u32 get_location;772		u32 attributes;773		u32 get_bar_attributes;774		u32 set_bar_attributes;775		u64 romsize;776		u32 romimage;777	} mixed_mode;778};779 780#define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001781#define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002782#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004783#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008784#define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010785#define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020786#define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040787#define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080788#define EFI_PCI_IO_ATTRIBUTE_IO 0x0100789#define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200790#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400791#define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800792#define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000793#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000794#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000795#define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000796#define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000797#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000798#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000799 800struct efi_dev_path;801 802typedef union apple_properties_protocol apple_properties_protocol_t;803 804union apple_properties_protocol {805	struct {806		unsigned long version;807		efi_status_t (__efiapi *get)(apple_properties_protocol_t *,808					     struct efi_dev_path *,809					     efi_char16_t *, void *, u32 *);810		efi_status_t (__efiapi *set)(apple_properties_protocol_t *,811					     struct efi_dev_path *,812					     efi_char16_t *, void *, u32);813		efi_status_t (__efiapi *del)(apple_properties_protocol_t *,814					     struct efi_dev_path *,815					     efi_char16_t *);816		efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,817						 void *buffer, u32 *);818	};819	struct {820		u32 version;821		u32 get;822		u32 set;823		u32 del;824		u32 get_all;825	} mixed_mode;826};827 828typedef u32 efi_tcg2_event_log_format;829 830#define INITRD_EVENT_TAG_ID 0x8F3B22ECU831#define LOAD_OPTIONS_EVENT_TAG_ID 0x8F3B22EDU832#define EV_EVENT_TAG 0x00000006U833#define EFI_TCG2_EVENT_HEADER_VERSION	0x1834 835struct efi_tcg2_event {836	u32		event_size;837	struct {838		u32	header_size;839		u16	header_version;840		u32	pcr_index;841		u32	event_type;842	} __packed event_header;843	/* u8[] event follows here */844} __packed;845 846/* from TCG PC Client Platform Firmware Profile Specification */847typedef struct tdTCG_PCClientTaggedEvent {848	u32	tagged_event_id;849	u32	tagged_event_data_size;850	u8	tagged_event_data[];851} TCG_PCClientTaggedEvent;852 853typedef struct efi_tcg2_event efi_tcg2_event_t;854typedef union efi_tcg2_protocol efi_tcg2_protocol_t;855 856union efi_tcg2_protocol {857	struct {858		void *get_capability;859		efi_status_t (__efiapi *get_event_log)(efi_tcg2_protocol_t *,860						       efi_tcg2_event_log_format,861						       efi_physical_addr_t *,862						       efi_physical_addr_t *,863						       efi_bool_t *);864		efi_status_t (__efiapi *hash_log_extend_event)(efi_tcg2_protocol_t *,865							       u64,866							       efi_physical_addr_t,867							       u64,868							       const efi_tcg2_event_t *);869		void *submit_command;870		void *get_active_pcr_banks;871		void *set_active_pcr_banks;872		void *get_result_of_set_active_pcr_banks;873	};874	struct {875		u32 get_capability;876		u32 get_event_log;877		u32 hash_log_extend_event;878		u32 submit_command;879		u32 get_active_pcr_banks;880		u32 set_active_pcr_banks;881		u32 get_result_of_set_active_pcr_banks;882	} mixed_mode;883};884 885typedef struct {886	u8 major;887	u8 minor;888} efi_cc_version_t;889 890typedef struct {891	u8 type;892	u8 sub_type;893} efi_cc_type_t;894 895/* EFI CC type/subtype defines */896#define EFI_CC_TYPE_NONE		0897#define EFI_CC_TYPE_AMD_SEV		1898#define EFI_CC_TYPE_INTEL_TDX		2899 900typedef u32 efi_cc_mr_index_t;901 902struct efi_cc_event {903	u32 event_size;904	struct {905		u32 header_size;906		u16 header_version;907		u32 mr_index;908		u32 event_type;909	} __packed event_header;910	/* u8[] event follows here */911} __packed;912 913typedef struct efi_cc_event efi_cc_event_t;914 915typedef u32 efi_cc_event_log_bitmap_t;916typedef u32 efi_cc_event_log_format_t;917typedef u32 efi_cc_event_algorithm_bitmap_t;918 919typedef struct {920	u8				size;921	efi_cc_version_t		structure_version;922	efi_cc_version_t		protocol_version;923	efi_cc_event_algorithm_bitmap_t	hash_algorithm_bitmap;924	efi_cc_event_log_bitmap_t	supported_event_logs;925	efi_cc_type_t			cc_type;926} efi_cc_boot_service_cap_t;927 928#define EFI_CC_EVENT_HEADER_VERSION	1929 930#define EFI_CC_BOOT_HASH_ALG_SHA384	0x00000004931 932#define EFI_CC_EVENT_LOG_FORMAT_TCG_2	0x00000002933 934typedef union efi_cc_protocol efi_cc_protocol_t;935 936union efi_cc_protocol {937	struct {938		efi_status_t939		(__efiapi *get_capability)(efi_cc_protocol_t *,940					   efi_cc_boot_service_cap_t *);941 942		efi_status_t943		(__efiapi *get_event_log)(efi_cc_protocol_t *,944					  efi_cc_event_log_format_t,945					  efi_physical_addr_t *,946					  efi_physical_addr_t *,947					  efi_bool_t *);948 949		efi_status_t950		(__efiapi *hash_log_extend_event)(efi_cc_protocol_t *, u64,951						  efi_physical_addr_t, u64,952						  const efi_cc_event_t *);953 954		efi_status_t955		(__efiapi *map_pcr_to_mr_index)(efi_cc_protocol_t *, u32,956						efi_cc_mr_index_t *);957	};958	struct {959		u32 get_capability;960		u32 get_event_log;961		u32 hash_log_extend_event;962		u32 map_pcr_to_mr_index;963	} mixed_mode;964};965 966struct riscv_efi_boot_protocol {967	u64 revision;968 969	efi_status_t (__efiapi *get_boot_hartid)(struct riscv_efi_boot_protocol *,970						 unsigned long *boot_hartid);971};972 973typedef union efi_load_file_protocol efi_load_file_protocol_t;974typedef union efi_load_file_protocol efi_load_file2_protocol_t;975 976union efi_load_file_protocol {977	struct {978		efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *,979						   efi_device_path_protocol_t *,980						   bool, unsigned long *, void *);981	};982	struct {983		u32 load_file;984	} mixed_mode;985};986 987typedef struct {988	u32 attributes;989	u16 file_path_list_length;990	u8 variable_data[];991	// efi_char16_t description[];992	// efi_device_path_protocol_t file_path_list[];993	// u8 optional_data[];994} __packed efi_load_option_t;995 996#define EFI_LOAD_OPTION_ACTIVE		0x0001U997#define EFI_LOAD_OPTION_FORCE_RECONNECT	0x0002U998#define EFI_LOAD_OPTION_HIDDEN		0x0008U999#define EFI_LOAD_OPTION_CATEGORY	0x1f00U1000#define   EFI_LOAD_OPTION_CATEGORY_BOOT	0x0000U1001#define   EFI_LOAD_OPTION_CATEGORY_APP	0x0100U1002 1003#define EFI_LOAD_OPTION_BOOT_MASK \1004	(EFI_LOAD_OPTION_ACTIVE|EFI_LOAD_OPTION_HIDDEN|EFI_LOAD_OPTION_CATEGORY)1005#define EFI_LOAD_OPTION_MASK (EFI_LOAD_OPTION_FORCE_RECONNECT|EFI_LOAD_OPTION_BOOT_MASK)1006 1007typedef struct {1008	u32 attributes;1009	u16 file_path_list_length;1010	const efi_char16_t *description;1011	const efi_device_path_protocol_t *file_path_list;1012	u32 optional_data_size;1013	const void *optional_data;1014} efi_load_option_unpacked_t;1015 1016void efi_pci_disable_bridge_busmaster(void);1017 1018typedef efi_status_t (*efi_exit_boot_map_processing)(1019	struct efi_boot_memmap *map,1020	void *priv);1021 1022efi_status_t efi_exit_boot_services(void *handle, void *priv,1023				    efi_exit_boot_map_processing priv_func);1024 1025efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image,1026			     unsigned long kernel_addr, char *cmdline_ptr);1027 1028void *get_fdt(unsigned long *fdt_size);1029 1030efi_status_t efi_alloc_virtmap(efi_memory_desc_t **virtmap,1031			       unsigned long *desc_size, u32 *desc_ver);1032void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,1033		     unsigned long desc_size, efi_memory_desc_t *runtime_map,1034		     int *count);1035 1036efi_status_t efi_get_random_bytes(unsigned long size, u8 *out);1037 1038efi_status_t efi_random_alloc(unsigned long size, unsigned long align,1039			      unsigned long *addr, unsigned long random_seed,1040			      int memory_type, unsigned long alloc_min,1041			      unsigned long alloc_max);1042 1043efi_status_t efi_random_get_seed(void);1044 1045efi_status_t check_platform_features(void);1046 1047void *get_efi_config_table(efi_guid_t guid);1048 1049/* NOTE: These functions do not print a trailing newline after the string */1050void efi_char16_puts(efi_char16_t *);1051void efi_puts(const char *str);1052 1053__printf(1, 2) int efi_printk(char const *fmt, ...);1054 1055void efi_free(unsigned long size, unsigned long addr);1056 1057void efi_apply_loadoptions_quirk(const void **load_options, u32 *load_options_size);1058 1059char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);1060 1061efi_status_t efi_get_memory_map(struct efi_boot_memmap **map,1062				bool install_cfg_tbl);1063 1064efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,1065				unsigned long max);1066 1067efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,1068					unsigned long max, unsigned long align,1069					int memory_type);1070 1071efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,1072				 unsigned long *addr, unsigned long min);1073 1074efi_status_t efi_relocate_kernel(unsigned long *image_addr,1075				 unsigned long image_size,1076				 unsigned long alloc_size,1077				 unsigned long preferred_addr,1078				 unsigned long alignment,1079				 unsigned long min_addr);1080 1081efi_status_t efi_parse_options(char const *cmdline);1082 1083void efi_parse_option_graphics(char *option);1084 1085efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,1086			   unsigned long size);1087 1088efi_status_t handle_cmdline_files(efi_loaded_image_t *image,1089				  const efi_char16_t *optstr,1090				  int optstr_size,1091				  unsigned long soft_limit,1092				  unsigned long hard_limit,1093				  unsigned long *load_addr,1094				  unsigned long *load_size);1095 1096 1097static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,1098					unsigned long *load_addr,1099					unsigned long *load_size)1100{1101	return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,1102				    ULONG_MAX, ULONG_MAX, load_addr, load_size);1103}1104 1105efi_status_t efi_load_initrd(efi_loaded_image_t *image,1106			     unsigned long soft_limit,1107			     unsigned long hard_limit,1108			     const struct linux_efi_initrd **out);1109/*1110 * This function handles the architcture specific differences between arm and1111 * arm64 regarding where the kernel image must be loaded and any memory that1112 * must be reserved. On failure it is required to free all1113 * all allocations it has made.1114 */1115efi_status_t handle_kernel_image(unsigned long *image_addr,1116				 unsigned long *image_size,1117				 unsigned long *reserve_addr,1118				 unsigned long *reserve_size,1119				 efi_loaded_image_t *image,1120				 efi_handle_t image_handle);1121 1122/* shared entrypoint between the normal stub and the zboot stub */1123efi_status_t efi_stub_common(efi_handle_t handle,1124			     efi_loaded_image_t *image,1125			     unsigned long image_addr,1126			     char *cmdline_ptr);1127 1128efi_status_t efi_handle_cmdline(efi_loaded_image_t *image, char **cmdline_ptr);1129 1130asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint,1131					    unsigned long fdt_addr,1132					    unsigned long fdt_size);1133 1134void efi_handle_post_ebs_state(void);1135 1136enum efi_secureboot_mode efi_get_secureboot(void);1137 1138#ifdef CONFIG_RESET_ATTACK_MITIGATION1139void efi_enable_reset_attack_mitigation(void);1140#else1141static inline void1142efi_enable_reset_attack_mitigation(void) { }1143#endif1144 1145void efi_retrieve_eventlog(void);1146 1147struct screen_info *alloc_screen_info(void);1148struct screen_info *__alloc_screen_info(void);1149void free_screen_info(struct screen_info *si);1150 1151void efi_cache_sync_image(unsigned long image_base,1152			  unsigned long alloc_size);1153 1154struct efi_smbios_record {1155	u8	type;1156	u8	length;1157	u16	handle;1158};1159 1160const struct efi_smbios_record *efi_get_smbios_record(u8 type);1161 1162struct efi_smbios_type1_record {1163	struct efi_smbios_record	header;1164 1165	u8				manufacturer;1166	u8				product_name;1167	u8				version;1168	u8				serial_number;1169	efi_guid_t			uuid;1170	u8				wakeup_type;1171	u8				sku_number;1172	u8				family;1173};1174 1175struct efi_smbios_type4_record {1176	struct efi_smbios_record	header;1177 1178	u8				socket;1179	u8				processor_type;1180	u8				processor_family;1181	u8				processor_manufacturer;1182	u8				processor_id[8];1183	u8				processor_version;1184	u8				voltage;1185	u16				external_clock;1186	u16				max_speed;1187	u16				current_speed;1188	u8				status;1189	u8				processor_upgrade;1190	u16				l1_cache_handle;1191	u16				l2_cache_handle;1192	u16				l3_cache_handle;1193	u8				serial_number;1194	u8				asset_tag;1195	u8				part_number;1196	u8				core_count;1197	u8				enabled_core_count;1198	u8				thread_count;1199	u16				processor_characteristics;1200	u16				processor_family2;1201	u16				core_count2;1202	u16				enabled_core_count2;1203	u16				thread_count2;1204	u16				thread_enabled;1205};1206 1207#define efi_get_smbios_string(__record, __field) ({			\1208	__typeof__(__record) __rec = __record;				\1209	__efi_get_smbios_string(&__rec->header, &__rec->__field);	\1210})1211 1212const u8 *__efi_get_smbios_string(const struct efi_smbios_record *record,1213				  const u8 *offset);1214 1215void efi_remap_image(unsigned long image_base, unsigned alloc_size,1216		     unsigned long code_size);1217efi_status_t efi_kaslr_relocate_kernel(unsigned long *image_addr,1218				       unsigned long *reserve_addr,1219				       unsigned long *reserve_size,1220				       unsigned long kernel_size,1221				       unsigned long kernel_codesize,1222				       unsigned long kernel_memsize,1223				       u32 phys_seed);1224u32 efi_kaslr_get_phys_seed(efi_handle_t image_handle);1225 1226asmlinkage efi_status_t __efiapi1227efi_zboot_entry(efi_handle_t handle, efi_system_table_t *systab);1228 1229efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,1230					struct efi_boot_memmap *map);1231void process_unaccepted_memory(u64 start, u64 end);1232void accept_memory(phys_addr_t start, unsigned long size);1233void arch_accept_memory(phys_addr_t start, phys_addr_t end);1234 1235#endif1236