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 1638166ec09SArd Biesheuvel struct efi_boot_memmap { 1648166ec09SArd Biesheuvel efi_memory_desc_t **map; 1658166ec09SArd Biesheuvel unsigned long *map_size; 1668166ec09SArd Biesheuvel unsigned long *desc_size; 1678166ec09SArd Biesheuvel u32 *desc_ver; 1688166ec09SArd Biesheuvel unsigned long *key_ptr; 1698166ec09SArd Biesheuvel unsigned long *buff_size; 1708166ec09SArd Biesheuvel }; 1718166ec09SArd Biesheuvel 172abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t; 173abd26868SArd Biesheuvel 174c7007d9fSArd Biesheuvel union efi_device_path_to_text_protocol { 175c7007d9fSArd Biesheuvel struct { 176c7007d9fSArd Biesheuvel efi_char16_t *(__efiapi *convert_device_node_to_text)( 177c7007d9fSArd Biesheuvel const efi_device_path_protocol_t *, 178c7007d9fSArd Biesheuvel bool, bool); 179c7007d9fSArd Biesheuvel efi_char16_t *(__efiapi *convert_device_path_to_text)( 180c7007d9fSArd Biesheuvel const efi_device_path_protocol_t *, 181c7007d9fSArd Biesheuvel bool, bool); 182c7007d9fSArd Biesheuvel }; 183c7007d9fSArd Biesheuvel struct { 184c7007d9fSArd Biesheuvel u32 convert_device_node_to_text; 185c7007d9fSArd Biesheuvel u32 convert_device_path_to_text; 186c7007d9fSArd Biesheuvel } mixed_mode; 187c7007d9fSArd Biesheuvel }; 188c7007d9fSArd Biesheuvel 189c7007d9fSArd Biesheuvel typedef union efi_device_path_to_text_protocol efi_device_path_to_text_protocol_t; 190c7007d9fSArd Biesheuvel 1919b47c527SArvind Sankar typedef void *efi_event_t; 1929b47c527SArvind Sankar /* Note that notifications won't work in mixed mode */ 1939b47c527SArvind Sankar typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *); 1949b47c527SArvind Sankar 1959b47c527SArvind Sankar #define EFI_EVT_TIMER 0x80000000U 1969b47c527SArvind Sankar #define EFI_EVT_RUNTIME 0x40000000U 1979b47c527SArvind Sankar #define EFI_EVT_NOTIFY_WAIT 0x00000100U 1989b47c527SArvind Sankar #define EFI_EVT_NOTIFY_SIGNAL 0x00000200U 1999b47c527SArvind Sankar 2008c0a839cSHeinrich Schuchardt /** 2018c0a839cSHeinrich Schuchardt * efi_set_event_at() - add event to events array 2028c0a839cSHeinrich Schuchardt * 2038c0a839cSHeinrich Schuchardt * @events: array of UEFI events 2048c0a839cSHeinrich Schuchardt * @ids: index where to put the event in the array 2058c0a839cSHeinrich Schuchardt * @event: event to add to the aray 2068c0a839cSHeinrich Schuchardt * 2078c0a839cSHeinrich Schuchardt * boottime->wait_for_event() takes an array of events as input. 2089b47c527SArvind Sankar * Provide a helper to set it up correctly for mixed mode. 2099b47c527SArvind Sankar */ 2109b47c527SArvind Sankar static inline 2119b47c527SArvind Sankar void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event) 2129b47c527SArvind Sankar { 2139b47c527SArvind Sankar if (efi_is_native()) 2149b47c527SArvind Sankar events[idx] = event; 2159b47c527SArvind Sankar else 2169b47c527SArvind Sankar ((u32 *)events)[idx] = (u32)(unsigned long)event; 2179b47c527SArvind Sankar } 2189b47c527SArvind Sankar 2199b47c527SArvind Sankar #define EFI_TPL_APPLICATION 4 2209b47c527SArvind Sankar #define EFI_TPL_CALLBACK 8 2219b47c527SArvind Sankar #define EFI_TPL_NOTIFY 16 2229b47c527SArvind Sankar #define EFI_TPL_HIGH_LEVEL 31 2239b47c527SArvind Sankar 2249b47c527SArvind Sankar typedef enum { 2259b47c527SArvind Sankar EfiTimerCancel, 2269b47c527SArvind Sankar EfiTimerPeriodic, 2279b47c527SArvind Sankar EfiTimerRelative 2289b47c527SArvind Sankar } EFI_TIMER_DELAY; 2299b47c527SArvind Sankar 2308166ec09SArd Biesheuvel /* 2318166ec09SArd Biesheuvel * EFI Boot Services table 2328166ec09SArd Biesheuvel */ 2338166ec09SArd Biesheuvel union efi_boot_services { 2348166ec09SArd Biesheuvel struct { 2358166ec09SArd Biesheuvel efi_table_hdr_t hdr; 2368166ec09SArd Biesheuvel void *raise_tpl; 2378166ec09SArd Biesheuvel void *restore_tpl; 2388166ec09SArd Biesheuvel efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long, 2398166ec09SArd Biesheuvel efi_physical_addr_t *); 2408166ec09SArd Biesheuvel efi_status_t (__efiapi *free_pages)(efi_physical_addr_t, 2418166ec09SArd Biesheuvel unsigned long); 2428166ec09SArd Biesheuvel efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *, 2438166ec09SArd Biesheuvel unsigned long *, 2448166ec09SArd Biesheuvel unsigned long *, u32 *); 2458166ec09SArd Biesheuvel efi_status_t (__efiapi *allocate_pool)(int, unsigned long, 2468166ec09SArd Biesheuvel void **); 2478166ec09SArd Biesheuvel efi_status_t (__efiapi *free_pool)(void *); 2489b47c527SArvind Sankar efi_status_t (__efiapi *create_event)(u32, unsigned long, 2499b47c527SArvind Sankar efi_event_notify_t, void *, 2509b47c527SArvind Sankar efi_event_t *); 2519b47c527SArvind Sankar efi_status_t (__efiapi *set_timer)(efi_event_t, 2529b47c527SArvind Sankar EFI_TIMER_DELAY, u64); 2539b47c527SArvind Sankar efi_status_t (__efiapi *wait_for_event)(unsigned long, 2549b47c527SArvind Sankar efi_event_t *, 2559b47c527SArvind Sankar unsigned long *); 2568166ec09SArd Biesheuvel void *signal_event; 2579b47c527SArvind Sankar efi_status_t (__efiapi *close_event)(efi_event_t); 2588166ec09SArd Biesheuvel void *check_event; 2598166ec09SArd Biesheuvel void *install_protocol_interface; 2608166ec09SArd Biesheuvel void *reinstall_protocol_interface; 2618166ec09SArd Biesheuvel void *uninstall_protocol_interface; 2628166ec09SArd Biesheuvel efi_status_t (__efiapi *handle_protocol)(efi_handle_t, 2638166ec09SArd Biesheuvel efi_guid_t *, void **); 2648166ec09SArd Biesheuvel void *__reserved; 2658166ec09SArd Biesheuvel void *register_protocol_notify; 2668166ec09SArd Biesheuvel efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *, 2678166ec09SArd Biesheuvel void *, unsigned long *, 2688166ec09SArd Biesheuvel efi_handle_t *); 269abd26868SArd Biesheuvel efi_status_t (__efiapi *locate_device_path)(efi_guid_t *, 270abd26868SArd Biesheuvel efi_device_path_protocol_t **, 271abd26868SArd Biesheuvel efi_handle_t *); 2728166ec09SArd Biesheuvel efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *, 2738166ec09SArd Biesheuvel void *); 274c7007d9fSArd Biesheuvel efi_status_t (__efiapi *load_image)(bool, efi_handle_t, 275c7007d9fSArd Biesheuvel efi_device_path_protocol_t *, 276c7007d9fSArd Biesheuvel void *, unsigned long, 277c7007d9fSArd Biesheuvel efi_handle_t *); 278c7007d9fSArd Biesheuvel efi_status_t (__efiapi *start_image)(efi_handle_t, unsigned long *, 279c7007d9fSArd Biesheuvel efi_char16_t **); 2803b8f44fcSArd Biesheuvel efi_status_t __noreturn (__efiapi *exit)(efi_handle_t, 2813b8f44fcSArd Biesheuvel efi_status_t, 2823b8f44fcSArd Biesheuvel unsigned long, 2833b8f44fcSArd Biesheuvel efi_char16_t *); 284c7007d9fSArd Biesheuvel efi_status_t (__efiapi *unload_image)(efi_handle_t); 2858166ec09SArd Biesheuvel efi_status_t (__efiapi *exit_boot_services)(efi_handle_t, 2868166ec09SArd Biesheuvel unsigned long); 2878166ec09SArd Biesheuvel void *get_next_monotonic_count; 2889b47c527SArvind Sankar efi_status_t (__efiapi *stall)(unsigned long); 2898166ec09SArd Biesheuvel void *set_watchdog_timer; 2908166ec09SArd Biesheuvel void *connect_controller; 2918166ec09SArd Biesheuvel efi_status_t (__efiapi *disconnect_controller)(efi_handle_t, 2928166ec09SArd Biesheuvel efi_handle_t, 2938166ec09SArd Biesheuvel efi_handle_t); 2948166ec09SArd Biesheuvel void *open_protocol; 2958166ec09SArd Biesheuvel void *close_protocol; 2968166ec09SArd Biesheuvel void *open_protocol_information; 2978166ec09SArd Biesheuvel void *protocols_per_handle; 2988166ec09SArd Biesheuvel void *locate_handle_buffer; 2998166ec09SArd Biesheuvel efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *, 3008166ec09SArd Biesheuvel void **); 301c7007d9fSArd Biesheuvel efi_status_t (__efiapi *install_multiple_protocol_interfaces)(efi_handle_t *, ...); 302c7007d9fSArd Biesheuvel efi_status_t (__efiapi *uninstall_multiple_protocol_interfaces)(efi_handle_t, ...); 3038166ec09SArd Biesheuvel void *calculate_crc32; 304c82ceb44SArd Biesheuvel void (__efiapi *copy_mem)(void *, const void *, unsigned long); 305c82ceb44SArd Biesheuvel void (__efiapi *set_mem)(void *, unsigned long, unsigned char); 3068166ec09SArd Biesheuvel void *create_event_ex; 3078166ec09SArd Biesheuvel }; 3088166ec09SArd Biesheuvel struct { 3098166ec09SArd Biesheuvel efi_table_hdr_t hdr; 3108166ec09SArd Biesheuvel u32 raise_tpl; 3118166ec09SArd Biesheuvel u32 restore_tpl; 3128166ec09SArd Biesheuvel u32 allocate_pages; 3138166ec09SArd Biesheuvel u32 free_pages; 3148166ec09SArd Biesheuvel u32 get_memory_map; 3158166ec09SArd Biesheuvel u32 allocate_pool; 3168166ec09SArd Biesheuvel u32 free_pool; 3178166ec09SArd Biesheuvel u32 create_event; 3188166ec09SArd Biesheuvel u32 set_timer; 3198166ec09SArd Biesheuvel u32 wait_for_event; 3208166ec09SArd Biesheuvel u32 signal_event; 3218166ec09SArd Biesheuvel u32 close_event; 3228166ec09SArd Biesheuvel u32 check_event; 3238166ec09SArd Biesheuvel u32 install_protocol_interface; 3248166ec09SArd Biesheuvel u32 reinstall_protocol_interface; 3258166ec09SArd Biesheuvel u32 uninstall_protocol_interface; 3268166ec09SArd Biesheuvel u32 handle_protocol; 3278166ec09SArd Biesheuvel u32 __reserved; 3288166ec09SArd Biesheuvel u32 register_protocol_notify; 3298166ec09SArd Biesheuvel u32 locate_handle; 3308166ec09SArd Biesheuvel u32 locate_device_path; 3318166ec09SArd Biesheuvel u32 install_configuration_table; 3328166ec09SArd Biesheuvel u32 load_image; 3338166ec09SArd Biesheuvel u32 start_image; 3348166ec09SArd Biesheuvel u32 exit; 3358166ec09SArd Biesheuvel u32 unload_image; 3368166ec09SArd Biesheuvel u32 exit_boot_services; 3378166ec09SArd Biesheuvel u32 get_next_monotonic_count; 3388166ec09SArd Biesheuvel u32 stall; 3398166ec09SArd Biesheuvel u32 set_watchdog_timer; 3408166ec09SArd Biesheuvel u32 connect_controller; 3418166ec09SArd Biesheuvel u32 disconnect_controller; 3428166ec09SArd Biesheuvel u32 open_protocol; 3438166ec09SArd Biesheuvel u32 close_protocol; 3448166ec09SArd Biesheuvel u32 open_protocol_information; 3458166ec09SArd Biesheuvel u32 protocols_per_handle; 3468166ec09SArd Biesheuvel u32 locate_handle_buffer; 3478166ec09SArd Biesheuvel u32 locate_protocol; 3488166ec09SArd Biesheuvel u32 install_multiple_protocol_interfaces; 3498166ec09SArd Biesheuvel u32 uninstall_multiple_protocol_interfaces; 3508166ec09SArd Biesheuvel u32 calculate_crc32; 3518166ec09SArd Biesheuvel u32 copy_mem; 3528166ec09SArd Biesheuvel u32 set_mem; 3538166ec09SArd Biesheuvel u32 create_event_ex; 3548166ec09SArd Biesheuvel } mixed_mode; 3558166ec09SArd Biesheuvel }; 3568166ec09SArd Biesheuvel 3573ba75c13SBaskov Evgeniy typedef enum { 3583ba75c13SBaskov Evgeniy EfiGcdMemoryTypeNonExistent, 3593ba75c13SBaskov Evgeniy EfiGcdMemoryTypeReserved, 3603ba75c13SBaskov Evgeniy EfiGcdMemoryTypeSystemMemory, 3613ba75c13SBaskov Evgeniy EfiGcdMemoryTypeMemoryMappedIo, 3623ba75c13SBaskov Evgeniy EfiGcdMemoryTypePersistent, 3633ba75c13SBaskov Evgeniy EfiGcdMemoryTypeMoreReliable, 3643ba75c13SBaskov Evgeniy EfiGcdMemoryTypeMaximum 3653ba75c13SBaskov Evgeniy } efi_gcd_memory_type_t; 3663ba75c13SBaskov Evgeniy 3673ba75c13SBaskov Evgeniy typedef struct { 3683ba75c13SBaskov Evgeniy efi_physical_addr_t base_address; 3693ba75c13SBaskov Evgeniy u64 length; 3703ba75c13SBaskov Evgeniy u64 capabilities; 3713ba75c13SBaskov Evgeniy u64 attributes; 3723ba75c13SBaskov Evgeniy efi_gcd_memory_type_t gcd_memory_type; 3733ba75c13SBaskov Evgeniy void *image_handle; 3743ba75c13SBaskov Evgeniy void *device_handle; 3753ba75c13SBaskov Evgeniy } efi_gcd_memory_space_desc_t; 3763ba75c13SBaskov Evgeniy 3773ba75c13SBaskov Evgeniy /* 3783ba75c13SBaskov Evgeniy * EFI DXE Services table 3793ba75c13SBaskov Evgeniy */ 3803ba75c13SBaskov Evgeniy union efi_dxe_services_table { 3813ba75c13SBaskov Evgeniy struct { 3823ba75c13SBaskov Evgeniy efi_table_hdr_t hdr; 3833ba75c13SBaskov Evgeniy void *add_memory_space; 3843ba75c13SBaskov Evgeniy void *allocate_memory_space; 3853ba75c13SBaskov Evgeniy void *free_memory_space; 3863ba75c13SBaskov Evgeniy void *remove_memory_space; 3873ba75c13SBaskov Evgeniy efi_status_t (__efiapi *get_memory_space_descriptor)(efi_physical_addr_t, 3883ba75c13SBaskov Evgeniy efi_gcd_memory_space_desc_t *); 3893ba75c13SBaskov Evgeniy efi_status_t (__efiapi *set_memory_space_attributes)(efi_physical_addr_t, 3903ba75c13SBaskov Evgeniy u64, u64); 3913ba75c13SBaskov Evgeniy void *get_memory_space_map; 3923ba75c13SBaskov Evgeniy void *add_io_space; 3933ba75c13SBaskov Evgeniy void *allocate_io_space; 3943ba75c13SBaskov Evgeniy void *free_io_space; 3953ba75c13SBaskov Evgeniy void *remove_io_space; 3963ba75c13SBaskov Evgeniy void *get_io_space_descriptor; 3973ba75c13SBaskov Evgeniy void *get_io_space_map; 3983ba75c13SBaskov Evgeniy void *dispatch; 3993ba75c13SBaskov Evgeniy void *schedule; 4003ba75c13SBaskov Evgeniy void *trust; 4013ba75c13SBaskov Evgeniy void *process_firmware_volume; 4023ba75c13SBaskov Evgeniy void *set_memory_space_capabilities; 4033ba75c13SBaskov Evgeniy }; 4043ba75c13SBaskov Evgeniy struct { 4053ba75c13SBaskov Evgeniy efi_table_hdr_t hdr; 4063ba75c13SBaskov Evgeniy u32 add_memory_space; 4073ba75c13SBaskov Evgeniy u32 allocate_memory_space; 4083ba75c13SBaskov Evgeniy u32 free_memory_space; 4093ba75c13SBaskov Evgeniy u32 remove_memory_space; 4103ba75c13SBaskov Evgeniy u32 get_memory_space_descriptor; 4113ba75c13SBaskov Evgeniy u32 set_memory_space_attributes; 4123ba75c13SBaskov Evgeniy u32 get_memory_space_map; 4133ba75c13SBaskov Evgeniy u32 add_io_space; 4143ba75c13SBaskov Evgeniy u32 allocate_io_space; 4153ba75c13SBaskov Evgeniy u32 free_io_space; 4163ba75c13SBaskov Evgeniy u32 remove_io_space; 4173ba75c13SBaskov Evgeniy u32 get_io_space_descriptor; 4183ba75c13SBaskov Evgeniy u32 get_io_space_map; 4193ba75c13SBaskov Evgeniy u32 dispatch; 4203ba75c13SBaskov Evgeniy u32 schedule; 4213ba75c13SBaskov Evgeniy u32 trust; 4223ba75c13SBaskov Evgeniy u32 process_firmware_volume; 4233ba75c13SBaskov Evgeniy u32 set_memory_space_capabilities; 4243ba75c13SBaskov Evgeniy } mixed_mode; 4253ba75c13SBaskov Evgeniy }; 4263ba75c13SBaskov Evgeniy 427c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t; 428c2d0b470SArd Biesheuvel 429c2d0b470SArd Biesheuvel union efi_uga_draw_protocol { 430c2d0b470SArd Biesheuvel struct { 431c2d0b470SArd Biesheuvel efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *, 432c2d0b470SArd Biesheuvel u32*, u32*, u32*, u32*); 433c2d0b470SArd Biesheuvel void *set_mode; 434c2d0b470SArd Biesheuvel void *blt; 435c2d0b470SArd Biesheuvel }; 436c2d0b470SArd Biesheuvel struct { 437c2d0b470SArd Biesheuvel u32 get_mode; 438c2d0b470SArd Biesheuvel u32 set_mode; 439c2d0b470SArd Biesheuvel u32 blt; 440c2d0b470SArd Biesheuvel } mixed_mode; 441c2d0b470SArd Biesheuvel }; 442c2d0b470SArd Biesheuvel 4439b47c527SArvind Sankar typedef struct { 4449b47c527SArvind Sankar u16 scan_code; 4459b47c527SArvind Sankar efi_char16_t unicode_char; 4469b47c527SArvind Sankar } efi_input_key_t; 4479b47c527SArvind Sankar 4489b47c527SArvind Sankar union efi_simple_text_input_protocol { 4499b47c527SArvind Sankar struct { 4509b47c527SArvind Sankar void *reset; 4519b47c527SArvind Sankar efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *, 4529b47c527SArvind Sankar efi_input_key_t *); 4539b47c527SArvind Sankar efi_event_t wait_for_key; 4549b47c527SArvind Sankar }; 4559b47c527SArvind Sankar struct { 4569b47c527SArvind Sankar u32 reset; 4579b47c527SArvind Sankar u32 read_keystroke; 4589b47c527SArvind Sankar u32 wait_for_key; 4599b47c527SArvind Sankar } mixed_mode; 4609b47c527SArvind Sankar }; 4619b47c527SArvind Sankar 46214c574f3SArvind Sankar efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key); 46314c574f3SArvind Sankar 4648166ec09SArd Biesheuvel union efi_simple_text_output_protocol { 4658166ec09SArd Biesheuvel struct { 4668166ec09SArd Biesheuvel void *reset; 4678166ec09SArd Biesheuvel efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *, 4688166ec09SArd Biesheuvel efi_char16_t *); 4698166ec09SArd Biesheuvel void *test_string; 4708166ec09SArd Biesheuvel }; 4718166ec09SArd Biesheuvel struct { 4728166ec09SArd Biesheuvel u32 reset; 4738166ec09SArd Biesheuvel u32 output_string; 4748166ec09SArd Biesheuvel u32 test_string; 4758166ec09SArd Biesheuvel } mixed_mode; 4768166ec09SArd Biesheuvel }; 4778166ec09SArd Biesheuvel 4788166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0 4798166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1 4808166ec09SArd Biesheuvel #define PIXEL_BIT_MASK 2 4818166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY 3 4828166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX 4 4838166ec09SArd Biesheuvel 4848166ec09SArd Biesheuvel typedef struct { 4858166ec09SArd Biesheuvel u32 red_mask; 4868166ec09SArd Biesheuvel u32 green_mask; 4878166ec09SArd Biesheuvel u32 blue_mask; 4888166ec09SArd Biesheuvel u32 reserved_mask; 4898166ec09SArd Biesheuvel } efi_pixel_bitmask_t; 4908166ec09SArd Biesheuvel 4918166ec09SArd Biesheuvel typedef struct { 4928166ec09SArd Biesheuvel u32 version; 4938166ec09SArd Biesheuvel u32 horizontal_resolution; 4948166ec09SArd Biesheuvel u32 vertical_resolution; 4958166ec09SArd Biesheuvel int pixel_format; 4968166ec09SArd Biesheuvel efi_pixel_bitmask_t pixel_information; 4978166ec09SArd Biesheuvel u32 pixels_per_scan_line; 4988166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t; 4998166ec09SArd Biesheuvel 5008166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t; 5018166ec09SArd Biesheuvel 5028166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode { 5038166ec09SArd Biesheuvel struct { 5048166ec09SArd Biesheuvel u32 max_mode; 5058166ec09SArd Biesheuvel u32 mode; 5068166ec09SArd Biesheuvel efi_graphics_output_mode_info_t *info; 5078166ec09SArd Biesheuvel unsigned long size_of_info; 5088166ec09SArd Biesheuvel efi_physical_addr_t frame_buffer_base; 5098166ec09SArd Biesheuvel unsigned long frame_buffer_size; 5108166ec09SArd Biesheuvel }; 5118166ec09SArd Biesheuvel struct { 5128166ec09SArd Biesheuvel u32 max_mode; 5138166ec09SArd Biesheuvel u32 mode; 5148166ec09SArd Biesheuvel u32 info; 5158166ec09SArd Biesheuvel u32 size_of_info; 5168166ec09SArd Biesheuvel u64 frame_buffer_base; 5178166ec09SArd Biesheuvel u32 frame_buffer_size; 5188166ec09SArd Biesheuvel } mixed_mode; 5198166ec09SArd Biesheuvel }; 5208166ec09SArd Biesheuvel 5218166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t; 5228166ec09SArd Biesheuvel 5238166ec09SArd Biesheuvel union efi_graphics_output_protocol { 5248166ec09SArd Biesheuvel struct { 525b4b89a02SArvind Sankar efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *, 526b4b89a02SArvind Sankar u32, unsigned long *, 527b4b89a02SArvind Sankar efi_graphics_output_mode_info_t **); 528b4b89a02SArvind Sankar efi_status_t (__efiapi *set_mode) (efi_graphics_output_protocol_t *, u32); 5298166ec09SArd Biesheuvel void *blt; 5308166ec09SArd Biesheuvel efi_graphics_output_protocol_mode_t *mode; 5318166ec09SArd Biesheuvel }; 5328166ec09SArd Biesheuvel struct { 5338166ec09SArd Biesheuvel u32 query_mode; 5348166ec09SArd Biesheuvel u32 set_mode; 5358166ec09SArd Biesheuvel u32 blt; 5368166ec09SArd Biesheuvel u32 mode; 5378166ec09SArd Biesheuvel } mixed_mode; 5388166ec09SArd Biesheuvel }; 5398166ec09SArd Biesheuvel 540f7b85b33SArd Biesheuvel typedef union { 541f7b85b33SArd Biesheuvel struct { 542a46a290aSArd Biesheuvel u32 revision; 543a46a290aSArd Biesheuvel efi_handle_t parent_handle; 544a46a290aSArd Biesheuvel efi_system_table_t *system_table; 545a46a290aSArd Biesheuvel efi_handle_t device_handle; 546a46a290aSArd Biesheuvel void *file_path; 547a46a290aSArd Biesheuvel void *reserved; 548a46a290aSArd Biesheuvel u32 load_options_size; 549a46a290aSArd Biesheuvel void *load_options; 550a46a290aSArd Biesheuvel void *image_base; 551a46a290aSArd Biesheuvel __aligned_u64 image_size; 552a46a290aSArd Biesheuvel unsigned int image_code_type; 553a46a290aSArd Biesheuvel unsigned int image_data_type; 554a46a290aSArd Biesheuvel efi_status_t (__efiapi *unload)(efi_handle_t image_handle); 555f7b85b33SArd Biesheuvel }; 556f7b85b33SArd Biesheuvel struct { 557f7b85b33SArd Biesheuvel u32 revision; 558f7b85b33SArd Biesheuvel u32 parent_handle; 559f7b85b33SArd Biesheuvel u32 system_table; 560f7b85b33SArd Biesheuvel u32 device_handle; 561f7b85b33SArd Biesheuvel u32 file_path; 562f7b85b33SArd Biesheuvel u32 reserved; 563f7b85b33SArd Biesheuvel u32 load_options_size; 564f7b85b33SArd Biesheuvel u32 load_options; 565f7b85b33SArd Biesheuvel u32 image_base; 566f7b85b33SArd Biesheuvel __aligned_u64 image_size; 567f7b85b33SArd Biesheuvel u32 image_code_type; 568f7b85b33SArd Biesheuvel u32 image_data_type; 569f7b85b33SArd Biesheuvel u32 unload; 570f7b85b33SArd Biesheuvel } mixed_mode; 571a46a290aSArd Biesheuvel } efi_loaded_image_t; 572a46a290aSArd Biesheuvel 573a46a290aSArd Biesheuvel typedef struct { 574a46a290aSArd Biesheuvel u64 size; 575a46a290aSArd Biesheuvel u64 file_size; 576a46a290aSArd Biesheuvel u64 phys_size; 577a46a290aSArd Biesheuvel efi_time_t create_time; 578a46a290aSArd Biesheuvel efi_time_t last_access_time; 579a46a290aSArd Biesheuvel efi_time_t modification_time; 580a46a290aSArd Biesheuvel __aligned_u64 attribute; 5819302c1bbSArd Biesheuvel efi_char16_t filename[]; 582a46a290aSArd Biesheuvel } efi_file_info_t; 583a46a290aSArd Biesheuvel 584a46a290aSArd Biesheuvel typedef struct efi_file_protocol efi_file_protocol_t; 585a46a290aSArd Biesheuvel 586a46a290aSArd Biesheuvel struct efi_file_protocol { 587a46a290aSArd Biesheuvel u64 revision; 588a46a290aSArd Biesheuvel efi_status_t (__efiapi *open) (efi_file_protocol_t *, 589a46a290aSArd Biesheuvel efi_file_protocol_t **, 590a46a290aSArd Biesheuvel efi_char16_t *, u64, u64); 591a46a290aSArd Biesheuvel efi_status_t (__efiapi *close) (efi_file_protocol_t *); 592a46a290aSArd Biesheuvel efi_status_t (__efiapi *delete) (efi_file_protocol_t *); 593a46a290aSArd Biesheuvel efi_status_t (__efiapi *read) (efi_file_protocol_t *, 594a46a290aSArd Biesheuvel unsigned long *, void *); 595a46a290aSArd Biesheuvel efi_status_t (__efiapi *write) (efi_file_protocol_t *, 596a46a290aSArd Biesheuvel unsigned long, void *); 597a46a290aSArd Biesheuvel efi_status_t (__efiapi *get_position)(efi_file_protocol_t *, u64 *); 598a46a290aSArd Biesheuvel efi_status_t (__efiapi *set_position)(efi_file_protocol_t *, u64); 599a46a290aSArd Biesheuvel efi_status_t (__efiapi *get_info) (efi_file_protocol_t *, 600a46a290aSArd Biesheuvel efi_guid_t *, unsigned long *, 601a46a290aSArd Biesheuvel void *); 602a46a290aSArd Biesheuvel efi_status_t (__efiapi *set_info) (efi_file_protocol_t *, 603a46a290aSArd Biesheuvel efi_guid_t *, unsigned long, 604a46a290aSArd Biesheuvel void *); 605a46a290aSArd Biesheuvel efi_status_t (__efiapi *flush) (efi_file_protocol_t *); 606a46a290aSArd Biesheuvel }; 607a46a290aSArd Biesheuvel 608a46a290aSArd Biesheuvel typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t; 609a46a290aSArd Biesheuvel 610a46a290aSArd Biesheuvel struct efi_simple_file_system_protocol { 611a46a290aSArd Biesheuvel u64 revision; 612a46a290aSArd Biesheuvel int (__efiapi *open_volume)(efi_simple_file_system_protocol_t *, 613a46a290aSArd Biesheuvel efi_file_protocol_t **); 614a46a290aSArd Biesheuvel }; 615a46a290aSArd Biesheuvel 616a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ 0x0000000000000001 617a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE 0x0000000000000002 618a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE 0x8000000000000000 619a46a290aSArd Biesheuvel 6208166ec09SArd Biesheuvel typedef enum { 6218166ec09SArd Biesheuvel EfiPciIoWidthUint8, 6228166ec09SArd Biesheuvel EfiPciIoWidthUint16, 6238166ec09SArd Biesheuvel EfiPciIoWidthUint32, 6248166ec09SArd Biesheuvel EfiPciIoWidthUint64, 6258166ec09SArd Biesheuvel EfiPciIoWidthFifoUint8, 6268166ec09SArd Biesheuvel EfiPciIoWidthFifoUint16, 6278166ec09SArd Biesheuvel EfiPciIoWidthFifoUint32, 6288166ec09SArd Biesheuvel EfiPciIoWidthFifoUint64, 6298166ec09SArd Biesheuvel EfiPciIoWidthFillUint8, 6308166ec09SArd Biesheuvel EfiPciIoWidthFillUint16, 6318166ec09SArd Biesheuvel EfiPciIoWidthFillUint32, 6328166ec09SArd Biesheuvel EfiPciIoWidthFillUint64, 6338166ec09SArd Biesheuvel EfiPciIoWidthMaximum 6348166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH; 6358166ec09SArd Biesheuvel 6368166ec09SArd Biesheuvel typedef enum { 6378166ec09SArd Biesheuvel EfiPciIoAttributeOperationGet, 6388166ec09SArd Biesheuvel EfiPciIoAttributeOperationSet, 6398166ec09SArd Biesheuvel EfiPciIoAttributeOperationEnable, 6408166ec09SArd Biesheuvel EfiPciIoAttributeOperationDisable, 6418166ec09SArd Biesheuvel EfiPciIoAttributeOperationSupported, 6428166ec09SArd Biesheuvel EfiPciIoAttributeOperationMaximum 6438166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION; 6448166ec09SArd Biesheuvel 6458166ec09SArd Biesheuvel typedef struct { 6468166ec09SArd Biesheuvel u32 read; 6478166ec09SArd Biesheuvel u32 write; 6488166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t; 6498166ec09SArd Biesheuvel 6508166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t; 6518166ec09SArd Biesheuvel 6528166ec09SArd Biesheuvel typedef 6538166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *, 6548166ec09SArd Biesheuvel EFI_PCI_IO_PROTOCOL_WIDTH, 6558166ec09SArd Biesheuvel u32 offset, 6568166ec09SArd Biesheuvel unsigned long count, 6578166ec09SArd Biesheuvel void *buffer); 6588166ec09SArd Biesheuvel 6598166ec09SArd Biesheuvel typedef struct { 6608166ec09SArd Biesheuvel void *read; 6618166ec09SArd Biesheuvel void *write; 6628166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t; 6638166ec09SArd Biesheuvel 6648166ec09SArd Biesheuvel typedef struct { 6658166ec09SArd Biesheuvel efi_pci_io_protocol_cfg_t read; 6668166ec09SArd Biesheuvel efi_pci_io_protocol_cfg_t write; 6678166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t; 6688166ec09SArd Biesheuvel 6698166ec09SArd Biesheuvel union efi_pci_io_protocol { 6708166ec09SArd Biesheuvel struct { 6718166ec09SArd Biesheuvel void *poll_mem; 6728166ec09SArd Biesheuvel void *poll_io; 6738166ec09SArd Biesheuvel efi_pci_io_protocol_access_t mem; 6748166ec09SArd Biesheuvel efi_pci_io_protocol_access_t io; 6758166ec09SArd Biesheuvel efi_pci_io_protocol_config_access_t pci; 6768166ec09SArd Biesheuvel void *copy_mem; 6778166ec09SArd Biesheuvel void *map; 6788166ec09SArd Biesheuvel void *unmap; 6798166ec09SArd Biesheuvel void *allocate_buffer; 6808166ec09SArd Biesheuvel void *free_buffer; 6818166ec09SArd Biesheuvel void *flush; 6828166ec09SArd Biesheuvel efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *, 6838166ec09SArd Biesheuvel unsigned long *segment_nr, 6848166ec09SArd Biesheuvel unsigned long *bus_nr, 6858166ec09SArd Biesheuvel unsigned long *device_nr, 6868166ec09SArd Biesheuvel unsigned long *func_nr); 6878166ec09SArd Biesheuvel void *attributes; 6888166ec09SArd Biesheuvel void *get_bar_attributes; 6898166ec09SArd Biesheuvel void *set_bar_attributes; 6908166ec09SArd Biesheuvel uint64_t romsize; 6918166ec09SArd Biesheuvel void *romimage; 6928166ec09SArd Biesheuvel }; 6938166ec09SArd Biesheuvel struct { 6948166ec09SArd Biesheuvel u32 poll_mem; 6958166ec09SArd Biesheuvel u32 poll_io; 6968166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t mem; 6978166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t io; 6988166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t pci; 6998166ec09SArd Biesheuvel u32 copy_mem; 7008166ec09SArd Biesheuvel u32 map; 7018166ec09SArd Biesheuvel u32 unmap; 7028166ec09SArd Biesheuvel u32 allocate_buffer; 7038166ec09SArd Biesheuvel u32 free_buffer; 7048166ec09SArd Biesheuvel u32 flush; 7058166ec09SArd Biesheuvel u32 get_location; 7068166ec09SArd Biesheuvel u32 attributes; 7078166ec09SArd Biesheuvel u32 get_bar_attributes; 7088166ec09SArd Biesheuvel u32 set_bar_attributes; 7098166ec09SArd Biesheuvel u64 romsize; 7108166ec09SArd Biesheuvel u32 romimage; 7118166ec09SArd Biesheuvel } mixed_mode; 7128166ec09SArd Biesheuvel }; 7138166ec09SArd Biesheuvel 7148166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001 7158166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002 7168166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004 7178166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008 7188166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010 7198166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020 7208166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040 7218166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080 7228166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100 7238166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200 7248166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400 7258166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800 7268166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000 7278166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000 7288166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000 7298166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 7308166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000 7318166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 7328166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000 7338166ec09SArd Biesheuvel 7348166ec09SArd Biesheuvel struct efi_dev_path; 7358166ec09SArd Biesheuvel 7368166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t; 7378166ec09SArd Biesheuvel 7388166ec09SArd Biesheuvel union apple_properties_protocol { 7398166ec09SArd Biesheuvel struct { 7408166ec09SArd Biesheuvel unsigned long version; 7418166ec09SArd Biesheuvel efi_status_t (__efiapi *get)(apple_properties_protocol_t *, 7428166ec09SArd Biesheuvel struct efi_dev_path *, 7438166ec09SArd Biesheuvel efi_char16_t *, void *, u32 *); 7448166ec09SArd Biesheuvel efi_status_t (__efiapi *set)(apple_properties_protocol_t *, 7458166ec09SArd Biesheuvel struct efi_dev_path *, 7468166ec09SArd Biesheuvel efi_char16_t *, void *, u32); 7478166ec09SArd Biesheuvel efi_status_t (__efiapi *del)(apple_properties_protocol_t *, 7488166ec09SArd Biesheuvel struct efi_dev_path *, 7498166ec09SArd Biesheuvel efi_char16_t *); 7508166ec09SArd Biesheuvel efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *, 7518166ec09SArd Biesheuvel void *buffer, u32 *); 7528166ec09SArd Biesheuvel }; 7538166ec09SArd Biesheuvel struct { 7548166ec09SArd Biesheuvel u32 version; 7558166ec09SArd Biesheuvel u32 get; 7568166ec09SArd Biesheuvel u32 set; 7578166ec09SArd Biesheuvel u32 del; 7588166ec09SArd Biesheuvel u32 get_all; 7598166ec09SArd Biesheuvel } mixed_mode; 7608166ec09SArd Biesheuvel }; 7618166ec09SArd Biesheuvel 7628166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format; 7638166ec09SArd Biesheuvel 7644da87c51SArd Biesheuvel #define INITRD_EVENT_TAG_ID 0x8F3B22ECU 7654da87c51SArd Biesheuvel #define EV_EVENT_TAG 0x00000006U 7664da87c51SArd Biesheuvel #define EFI_TCG2_EVENT_HEADER_VERSION 0x1 7674da87c51SArd Biesheuvel 7684da87c51SArd Biesheuvel struct efi_tcg2_event { 7694da87c51SArd Biesheuvel u32 event_size; 7704da87c51SArd Biesheuvel struct { 7714da87c51SArd Biesheuvel u32 header_size; 7724da87c51SArd Biesheuvel u16 header_version; 7734da87c51SArd Biesheuvel u32 pcr_index; 7744da87c51SArd Biesheuvel u32 event_type; 7754da87c51SArd Biesheuvel } __packed event_header; 7764da87c51SArd Biesheuvel /* u8[] event follows here */ 7774da87c51SArd Biesheuvel } __packed; 7784da87c51SArd Biesheuvel 7794da87c51SArd Biesheuvel struct efi_tcg2_tagged_event { 7804da87c51SArd Biesheuvel u32 tagged_event_id; 7814da87c51SArd Biesheuvel u32 tagged_event_data_size; 7824da87c51SArd Biesheuvel /* u8 tagged event data follows here */ 7834da87c51SArd Biesheuvel } __packed; 7844da87c51SArd Biesheuvel 7854da87c51SArd Biesheuvel typedef struct efi_tcg2_event efi_tcg2_event_t; 7864da87c51SArd Biesheuvel typedef struct efi_tcg2_tagged_event efi_tcg2_tagged_event_t; 7878166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t; 7888166ec09SArd Biesheuvel 7898166ec09SArd Biesheuvel union efi_tcg2_protocol { 7908166ec09SArd Biesheuvel struct { 7918166ec09SArd Biesheuvel void *get_capability; 792cdec91c0SArd Biesheuvel efi_status_t (__efiapi *get_event_log)(efi_tcg2_protocol_t *, 7938166ec09SArd Biesheuvel efi_tcg2_event_log_format, 7948166ec09SArd Biesheuvel efi_physical_addr_t *, 7958166ec09SArd Biesheuvel efi_physical_addr_t *, 7968166ec09SArd Biesheuvel efi_bool_t *); 7974da87c51SArd Biesheuvel efi_status_t (__efiapi *hash_log_extend_event)(efi_tcg2_protocol_t *, 7984da87c51SArd Biesheuvel u64, 7994da87c51SArd Biesheuvel efi_physical_addr_t, 8004da87c51SArd Biesheuvel u64, 8014da87c51SArd Biesheuvel const efi_tcg2_event_t *); 8028166ec09SArd Biesheuvel void *submit_command; 8038166ec09SArd Biesheuvel void *get_active_pcr_banks; 8048166ec09SArd Biesheuvel void *set_active_pcr_banks; 8058166ec09SArd Biesheuvel void *get_result_of_set_active_pcr_banks; 8068166ec09SArd Biesheuvel }; 8078166ec09SArd Biesheuvel struct { 8088166ec09SArd Biesheuvel u32 get_capability; 8098166ec09SArd Biesheuvel u32 get_event_log; 8108166ec09SArd Biesheuvel u32 hash_log_extend_event; 8118166ec09SArd Biesheuvel u32 submit_command; 8128166ec09SArd Biesheuvel u32 get_active_pcr_banks; 8138166ec09SArd Biesheuvel u32 set_active_pcr_banks; 8148166ec09SArd Biesheuvel u32 get_result_of_set_active_pcr_banks; 8158166ec09SArd Biesheuvel } mixed_mode; 8168166ec09SArd Biesheuvel }; 8178166ec09SArd Biesheuvel 8183f68e695SSunil V L struct riscv_efi_boot_protocol { 8193f68e695SSunil V L u64 revision; 8203f68e695SSunil V L 8213f68e695SSunil V L efi_status_t (__efiapi *get_boot_hartid)(struct riscv_efi_boot_protocol *, 8223f68e695SSunil V L unsigned long *boot_hartid); 8233f68e695SSunil V L }; 8243f68e695SSunil V L 8252931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t; 8262931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t; 8272931d526SArd Biesheuvel 8282931d526SArd Biesheuvel union efi_load_file_protocol { 8292931d526SArd Biesheuvel struct { 8302931d526SArd Biesheuvel efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *, 8312931d526SArd Biesheuvel efi_device_path_protocol_t *, 8322931d526SArd Biesheuvel bool, unsigned long *, void *); 8332931d526SArd Biesheuvel }; 8342931d526SArd Biesheuvel struct { 8352931d526SArd Biesheuvel u32 load_file; 8362931d526SArd Biesheuvel } mixed_mode; 8372931d526SArd Biesheuvel }; 8382931d526SArd Biesheuvel 8394a568ce2SArvind Sankar typedef struct { 8404a568ce2SArvind Sankar u32 attributes; 8414a568ce2SArvind Sankar u16 file_path_list_length; 8424a568ce2SArvind Sankar u8 variable_data[]; 8434a568ce2SArvind Sankar // efi_char16_t description[]; 8444a568ce2SArvind Sankar // efi_device_path_protocol_t file_path_list[]; 8454a568ce2SArvind Sankar // u8 optional_data[]; 8464a568ce2SArvind Sankar } __packed efi_load_option_t; 8474a568ce2SArvind Sankar 8484a568ce2SArvind Sankar #define EFI_LOAD_OPTION_ACTIVE 0x0001U 8494a568ce2SArvind Sankar #define EFI_LOAD_OPTION_FORCE_RECONNECT 0x0002U 8504a568ce2SArvind Sankar #define EFI_LOAD_OPTION_HIDDEN 0x0008U 8514a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY 0x1f00U 8524a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY_BOOT 0x0000U 8534a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY_APP 0x0100U 8544a568ce2SArvind Sankar 8554a568ce2SArvind Sankar #define EFI_LOAD_OPTION_BOOT_MASK \ 8564a568ce2SArvind Sankar (EFI_LOAD_OPTION_ACTIVE|EFI_LOAD_OPTION_HIDDEN|EFI_LOAD_OPTION_CATEGORY) 8574a568ce2SArvind Sankar #define EFI_LOAD_OPTION_MASK (EFI_LOAD_OPTION_FORCE_RECONNECT|EFI_LOAD_OPTION_BOOT_MASK) 8584a568ce2SArvind Sankar 8594a568ce2SArvind Sankar typedef struct { 8604a568ce2SArvind Sankar u32 attributes; 8614a568ce2SArvind Sankar u16 file_path_list_length; 8624a568ce2SArvind Sankar const efi_char16_t *description; 8634a568ce2SArvind Sankar const efi_device_path_protocol_t *file_path_list; 864*a241d94bSArd Biesheuvel u32 optional_data_size; 8654a568ce2SArvind Sankar const void *optional_data; 8664a568ce2SArvind Sankar } efi_load_option_unpacked_t; 8674a568ce2SArvind Sankar 8688166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void); 8698166ec09SArd Biesheuvel 8708166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)( 8718166ec09SArd Biesheuvel struct efi_boot_memmap *map, 8728166ec09SArd Biesheuvel void *priv); 8738166ec09SArd Biesheuvel 8748166ec09SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle, 8758166ec09SArd Biesheuvel struct efi_boot_memmap *map, 8768166ec09SArd Biesheuvel void *priv, 8778166ec09SArd Biesheuvel efi_exit_boot_map_processing priv_func); 8788166ec09SArd Biesheuvel 8798166ec09SArd Biesheuvel efi_status_t allocate_new_fdt_and_exit_boot(void *handle, 8808166ec09SArd Biesheuvel unsigned long *new_fdt_addr, 8818166ec09SArd Biesheuvel u64 initrd_addr, u64 initrd_size, 8828166ec09SArd Biesheuvel char *cmdline_ptr, 8838166ec09SArd Biesheuvel unsigned long fdt_addr, 8848166ec09SArd Biesheuvel unsigned long fdt_size); 8858166ec09SArd Biesheuvel 8868166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size); 8878166ec09SArd Biesheuvel 8888166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size, 8898166ec09SArd Biesheuvel unsigned long desc_size, efi_memory_desc_t *runtime_map, 8908166ec09SArd Biesheuvel int *count); 8918166ec09SArd Biesheuvel 8928166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out); 8938166ec09SArd Biesheuvel 8948166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align, 8958166ec09SArd Biesheuvel unsigned long *addr, unsigned long random_seed); 8968166ec09SArd Biesheuvel 8978166ec09SArd Biesheuvel efi_status_t check_platform_features(void); 8988166ec09SArd Biesheuvel 8998166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid); 9008166ec09SArd Biesheuvel 901cb8c90a0SArvind Sankar /* NOTE: These functions do not print a trailing newline after the string */ 902cb8c90a0SArvind Sankar void efi_char16_puts(efi_char16_t *); 903cb8c90a0SArvind Sankar void efi_puts(const char *str); 9048166ec09SArd Biesheuvel 9052c7d1e30SArvind Sankar __printf(1, 2) int efi_printk(char const *fmt, ...); 9068166ec09SArd Biesheuvel 9078166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr); 9088166ec09SArd Biesheuvel 909*a241d94bSArd Biesheuvel void efi_apply_loadoptions_quirk(const void **load_options, u32 *load_options_size); 9104a568ce2SArvind Sankar 91127cd5511SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len); 9128166ec09SArd Biesheuvel 9138166ec09SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap *map); 9148166ec09SArd Biesheuvel 9158166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr, 9168166ec09SArd Biesheuvel unsigned long max); 9178166ec09SArd Biesheuvel 91843b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr, 91943b1df0eSArd Biesheuvel unsigned long max, unsigned long align); 92043b1df0eSArd Biesheuvel 9211a895dbfSArd Biesheuvel efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align, 9221a895dbfSArd Biesheuvel unsigned long *addr, unsigned long min); 9231a895dbfSArd Biesheuvel 9248166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr, 9258166ec09SArd Biesheuvel unsigned long image_size, 9268166ec09SArd Biesheuvel unsigned long alloc_size, 9278166ec09SArd Biesheuvel unsigned long preferred_addr, 9288166ec09SArd Biesheuvel unsigned long alignment, 9298166ec09SArd Biesheuvel unsigned long min_addr); 9308166ec09SArd Biesheuvel 9318166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline); 9328166ec09SArd Biesheuvel 933fffb6804SArvind Sankar void efi_parse_option_graphics(char *option); 934fffb6804SArvind Sankar 9358166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto, 9368166ec09SArd Biesheuvel unsigned long size); 9378166ec09SArd Biesheuvel 938cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image, 939cf6b8366SArd Biesheuvel const efi_char16_t *optstr, 940cf6b8366SArd Biesheuvel int optstr_size, 941cf6b8366SArd Biesheuvel unsigned long soft_limit, 942cf6b8366SArd Biesheuvel unsigned long hard_limit, 9439302c1bbSArd Biesheuvel unsigned long *load_addr, 9449302c1bbSArd Biesheuvel unsigned long *load_size); 9459302c1bbSArd Biesheuvel 946cf6b8366SArd Biesheuvel 947cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image, 948cf6b8366SArd Biesheuvel unsigned long *load_addr, 949cf6b8366SArd Biesheuvel unsigned long *load_size) 950cf6b8366SArd Biesheuvel { 951cf6b8366SArd Biesheuvel return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2, 952cf6b8366SArd Biesheuvel ULONG_MAX, ULONG_MAX, load_addr, load_size); 953cf6b8366SArd Biesheuvel } 954cf6b8366SArd Biesheuvel 955f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image, 9569302c1bbSArd Biesheuvel unsigned long *load_addr, 9579302c1bbSArd Biesheuvel unsigned long *load_size, 95831f5e546SArd Biesheuvel unsigned long soft_limit, 959f61900fdSArvind Sankar unsigned long hard_limit); 9603230d95cSAtish Patra /* 9613230d95cSAtish Patra * This function handles the architcture specific differences between arm and 9623230d95cSAtish Patra * arm64 regarding where the kernel image must be loaded and any memory that 9633230d95cSAtish Patra * must be reserved. On failure it is required to free all 9643230d95cSAtish Patra * all allocations it has made. 9653230d95cSAtish Patra */ 9663230d95cSAtish Patra efi_status_t handle_kernel_image(unsigned long *image_addr, 9673230d95cSAtish Patra unsigned long *image_size, 9683230d95cSAtish Patra unsigned long *reserve_addr, 9693230d95cSAtish Patra unsigned long *reserve_size, 970416a9f84SArd Biesheuvel efi_loaded_image_t *image, 971416a9f84SArd Biesheuvel efi_handle_t image_handle); 9723230d95cSAtish Patra 9733230d95cSAtish Patra asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint, 9743230d95cSAtish Patra unsigned long fdt_addr, 9753230d95cSAtish Patra unsigned long fdt_size); 976ec93fc37SArd Biesheuvel 9772a55280aSArd Biesheuvel void efi_handle_post_ebs_state(void); 9782a55280aSArd Biesheuvel 979e1ac4b24SChester Lin enum efi_secureboot_mode efi_get_secureboot(void); 980e1ac4b24SChester Lin 9813820749dSArd Biesheuvel #ifdef CONFIG_RESET_ATTACK_MITIGATION 9823820749dSArd Biesheuvel void efi_enable_reset_attack_mitigation(void); 9833820749dSArd Biesheuvel #else 9843820749dSArd Biesheuvel static inline void 9853820749dSArd Biesheuvel efi_enable_reset_attack_mitigation(void) { } 9863820749dSArd Biesheuvel #endif 9873820749dSArd Biesheuvel 9883820749dSArd Biesheuvel void efi_retrieve_tpm2_eventlog(void); 9893820749dSArd Biesheuvel 990f4f75ad5SArd Biesheuvel #endif 991