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 32*a37dac5cSArd Biesheuvel #ifndef EFI_ALLOC_LIMIT 33*a37dac5cSArd Biesheuvel #define EFI_ALLOC_LIMIT ULONG_MAX 34*a37dac5cSArd Biesheuvel #endif 35*a37dac5cSArd Biesheuvel 36980771f6SArd Biesheuvel extern bool efi_nochunk; 37980771f6SArd Biesheuvel extern bool efi_nokaslr; 3823d5b73fSArvind Sankar extern int efi_loglevel; 39980771f6SArd Biesheuvel extern bool efi_novamap; 40eeff7d63SArd Biesheuvel 41ccc27ae7SArd Biesheuvel extern const efi_system_table_t *efi_system_table; 422fcdad2aSArd Biesheuvel 433ba75c13SBaskov Evgeniy typedef union efi_dxe_services_table efi_dxe_services_table_t; 443ba75c13SBaskov Evgeniy extern const efi_dxe_services_table_t *efi_dxe_table; 453ba75c13SBaskov Evgeniy 466e99d321SArd Biesheuvel efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, 476e99d321SArd Biesheuvel efi_system_table_t *sys_table_arg); 486e99d321SArd Biesheuvel 49de8c5520SArvind Sankar #ifndef ARCH_HAS_EFISTUB_WRAPPERS 50de8c5520SArvind Sankar 5122090f84SArd Biesheuvel #define efi_is_native() (true) 52a61962d8SArd Biesheuvel #define efi_table_attr(inst, attr) (inst)->attr 53a61962d8SArd Biesheuvel #define efi_fn_call(inst, func, ...) (inst)->func(__VA_ARGS__) 54de8c5520SArvind Sankar 5522090f84SArd Biesheuvel #endif 5622090f84SArd Biesheuvel 57a61962d8SArd Biesheuvel #define efi_call_proto(inst, func, ...) ({ \ 58a61962d8SArd Biesheuvel __typeof__(inst) __inst = (inst); \ 59a61962d8SArd Biesheuvel efi_fn_call(__inst, func, __inst, ##__VA_ARGS__); \ 60a61962d8SArd Biesheuvel }) 61a61962d8SArd Biesheuvel #define efi_bs_call(func, ...) \ 62a61962d8SArd Biesheuvel efi_fn_call(efi_table_attr(efi_system_table, boottime), func, ##__VA_ARGS__) 63a61962d8SArd Biesheuvel #define efi_rt_call(func, ...) \ 64a61962d8SArd Biesheuvel efi_fn_call(efi_table_attr(efi_system_table, runtime), func, ##__VA_ARGS__) 65a61962d8SArd Biesheuvel #define efi_dxe_call(func, ...) \ 66a61962d8SArd Biesheuvel efi_fn_call(efi_dxe_table, func, ##__VA_ARGS__) 67a61962d8SArd Biesheuvel 6823d5b73fSArvind Sankar #define efi_info(fmt, ...) \ 6923d5b73fSArvind Sankar efi_printk(KERN_INFO fmt, ##__VA_ARGS__) 70c1df5e0cSArvind Sankar #define efi_warn(fmt, ...) \ 71c1df5e0cSArvind Sankar efi_printk(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__) 7223d5b73fSArvind Sankar #define efi_err(fmt, ...) \ 7323d5b73fSArvind Sankar efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__) 7423d5b73fSArvind Sankar #define efi_debug(fmt, ...) \ 7523d5b73fSArvind Sankar efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__) 7660f38de7SArd Biesheuvel 77c1df5e0cSArvind Sankar #define efi_printk_once(fmt, ...) \ 78c1df5e0cSArvind Sankar ({ \ 79c1df5e0cSArvind Sankar static bool __print_once; \ 80c1df5e0cSArvind Sankar bool __ret_print_once = !__print_once; \ 81c1df5e0cSArvind Sankar \ 82c1df5e0cSArvind Sankar if (!__print_once) { \ 83c1df5e0cSArvind Sankar __print_once = true; \ 84c1df5e0cSArvind Sankar efi_printk(fmt, ##__VA_ARGS__); \ 85c1df5e0cSArvind Sankar } \ 86c1df5e0cSArvind Sankar __ret_print_once; \ 87c1df5e0cSArvind Sankar }) 88c1df5e0cSArvind Sankar 89c1df5e0cSArvind Sankar #define efi_info_once(fmt, ...) \ 90c1df5e0cSArvind Sankar efi_printk_once(KERN_INFO fmt, ##__VA_ARGS__) 91c1df5e0cSArvind Sankar #define efi_warn_once(fmt, ...) \ 92c1df5e0cSArvind Sankar efi_printk_once(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__) 93c1df5e0cSArvind Sankar #define efi_err_once(fmt, ...) \ 94c1df5e0cSArvind Sankar efi_printk_once(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__) 95c1df5e0cSArvind Sankar #define efi_debug_once(fmt, ...) \ 96c1df5e0cSArvind Sankar efi_printk_once(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__) 97c1df5e0cSArvind Sankar 98ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */ 99ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var 100ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \ 101ac9aff8eSIngo Molnar fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var)) 102ac9aff8eSIngo Molnar #endif 103ac9aff8eSIngo Molnar 104ac9aff8eSIngo Molnar #ifndef fdt_setprop_var 105ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \ 106ac9aff8eSIngo Molnar fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var)) 107ac9aff8eSIngo Molnar #endif 108ac9aff8eSIngo Molnar 109966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...) \ 110966291f6SArd Biesheuvel efi_rt_call(get_variable, (efi_char16_t *)(name), \ 111966291f6SArd Biesheuvel (efi_guid_t *)(vendor), __VA_ARGS__) 112966291f6SArd Biesheuvel 113966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...) \ 114966291f6SArd Biesheuvel efi_rt_call(set_variable, (efi_char16_t *)(name), \ 115966291f6SArd Biesheuvel (efi_guid_t *)(vendor), __VA_ARGS__) 116966291f6SArd Biesheuvel 1178166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx) \ 1188166ec09SArd Biesheuvel (efi_is_native() ? (array)[idx] \ 1198166ec09SArd Biesheuvel : (efi_handle_t)(unsigned long)((u32 *)(array))[idx]) 1208166ec09SArd Biesheuvel 1218166ec09SArd Biesheuvel #define efi_get_handle_num(size) \ 1228166ec09SArd Biesheuvel ((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32))) 1238166ec09SArd Biesheuvel 1248166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i) \ 1258166ec09SArd Biesheuvel for (i = 0; \ 1268166ec09SArd Biesheuvel i < efi_get_handle_num(size) && \ 1278166ec09SArd Biesheuvel ((handle = efi_get_handle_at((array), i)) || true); \ 1288166ec09SArd Biesheuvel i++) 1298166ec09SArd Biesheuvel 130eed4e019SArvind Sankar static inline 131eed4e019SArvind Sankar void efi_set_u64_split(u64 data, u32 *lo, u32 *hi) 132eed4e019SArvind Sankar { 133eed4e019SArvind Sankar *lo = lower_32_bits(data); 134eed4e019SArvind Sankar *hi = upper_32_bits(data); 135eed4e019SArvind Sankar } 136eed4e019SArvind Sankar 1378166ec09SArd Biesheuvel /* 1388166ec09SArd Biesheuvel * Allocation types for calls to boottime->allocate_pages. 1398166ec09SArd Biesheuvel */ 1408166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES 0 1418166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS 1 1428166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS 2 1438166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE 3 1448166ec09SArd Biesheuvel 1458166ec09SArd Biesheuvel /* 1468166ec09SArd Biesheuvel * The type of search to perform when calling boottime->locate_handle 1478166ec09SArd Biesheuvel */ 1488166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES 0 1498166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY 1 1508166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL 2 1518166ec09SArd Biesheuvel 152fd626195SLenny Szubowicz /* 1539b47c527SArvind Sankar * boottime->stall takes the time period in microseconds 1549b47c527SArvind Sankar */ 1559b47c527SArvind Sankar #define EFI_USEC_PER_SEC 1000000 1569b47c527SArvind Sankar 1579b47c527SArvind Sankar /* 1589b47c527SArvind Sankar * boottime->set_timer takes the time in 100ns units 1599b47c527SArvind Sankar */ 1609b47c527SArvind Sankar #define EFI_100NSEC_PER_USEC ((u64)10) 1619b47c527SArvind Sankar 162d1343da3SIngo Molnar /* 163fd626195SLenny Szubowicz * An efi_boot_memmap is used by efi_get_memory_map() to return the 164fd626195SLenny Szubowicz * EFI memory map in a dynamically allocated buffer. 165fd626195SLenny Szubowicz * 166fd626195SLenny Szubowicz * The buffer allocated for the EFI memory map includes extra room for 167fd626195SLenny Szubowicz * a minimum of EFI_MMAP_NR_SLACK_SLOTS additional EFI memory descriptors. 168fd626195SLenny Szubowicz * This facilitates the reuse of the EFI memory map buffer when a second 169fd626195SLenny Szubowicz * call to ExitBootServices() is needed because of intervening changes to 170fd626195SLenny Szubowicz * the EFI memory map. Other related structures, e.g. x86 e820ext, need 171fd626195SLenny Szubowicz * to factor in this headroom requirement as well. 172fd626195SLenny Szubowicz */ 173fd626195SLenny Szubowicz #define EFI_MMAP_NR_SLACK_SLOTS 8 174fd626195SLenny Szubowicz 175abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t; 176abd26868SArd Biesheuvel 177c7007d9fSArd Biesheuvel union efi_device_path_to_text_protocol { 178c7007d9fSArd Biesheuvel struct { 179c7007d9fSArd Biesheuvel efi_char16_t *(__efiapi *convert_device_node_to_text)( 180c7007d9fSArd Biesheuvel const efi_device_path_protocol_t *, 181c7007d9fSArd Biesheuvel bool, bool); 182c7007d9fSArd Biesheuvel efi_char16_t *(__efiapi *convert_device_path_to_text)( 183c7007d9fSArd Biesheuvel const efi_device_path_protocol_t *, 184c7007d9fSArd Biesheuvel bool, bool); 185c7007d9fSArd Biesheuvel }; 186c7007d9fSArd Biesheuvel struct { 187c7007d9fSArd Biesheuvel u32 convert_device_node_to_text; 188c7007d9fSArd Biesheuvel u32 convert_device_path_to_text; 189c7007d9fSArd Biesheuvel } mixed_mode; 190c7007d9fSArd Biesheuvel }; 191c7007d9fSArd Biesheuvel 192c7007d9fSArd Biesheuvel typedef union efi_device_path_to_text_protocol efi_device_path_to_text_protocol_t; 193c7007d9fSArd Biesheuvel 19470912985SArd Biesheuvel union efi_device_path_from_text_protocol { 19570912985SArd Biesheuvel struct { 19670912985SArd Biesheuvel efi_device_path_protocol_t * 19770912985SArd Biesheuvel (__efiapi *convert_text_to_device_node)(const efi_char16_t *); 19870912985SArd Biesheuvel efi_device_path_protocol_t * 19970912985SArd Biesheuvel (__efiapi *convert_text_to_device_path)(const efi_char16_t *); 20070912985SArd Biesheuvel }; 20170912985SArd Biesheuvel struct { 20270912985SArd Biesheuvel u32 convert_text_to_device_node; 20370912985SArd Biesheuvel u32 convert_text_to_device_path; 20470912985SArd Biesheuvel } mixed_mode; 20570912985SArd Biesheuvel }; 20670912985SArd Biesheuvel 20770912985SArd Biesheuvel typedef union efi_device_path_from_text_protocol efi_device_path_from_text_protocol_t; 20870912985SArd Biesheuvel 2099b47c527SArvind Sankar typedef void *efi_event_t; 2109b47c527SArvind Sankar /* Note that notifications won't work in mixed mode */ 2119b47c527SArvind Sankar typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *); 2129b47c527SArvind Sankar 2139b47c527SArvind Sankar #define EFI_EVT_TIMER 0x80000000U 2149b47c527SArvind Sankar #define EFI_EVT_RUNTIME 0x40000000U 2159b47c527SArvind Sankar #define EFI_EVT_NOTIFY_WAIT 0x00000100U 2169b47c527SArvind Sankar #define EFI_EVT_NOTIFY_SIGNAL 0x00000200U 2179b47c527SArvind Sankar 2188c0a839cSHeinrich Schuchardt /** 2198c0a839cSHeinrich Schuchardt * efi_set_event_at() - add event to events array 2208c0a839cSHeinrich Schuchardt * 2218c0a839cSHeinrich Schuchardt * @events: array of UEFI events 2228c0a839cSHeinrich Schuchardt * @ids: index where to put the event in the array 2238c0a839cSHeinrich Schuchardt * @event: event to add to the aray 2248c0a839cSHeinrich Schuchardt * 2258c0a839cSHeinrich Schuchardt * boottime->wait_for_event() takes an array of events as input. 2269b47c527SArvind Sankar * Provide a helper to set it up correctly for mixed mode. 2279b47c527SArvind Sankar */ 2289b47c527SArvind Sankar static inline 2299b47c527SArvind Sankar void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event) 2309b47c527SArvind Sankar { 2319b47c527SArvind Sankar if (efi_is_native()) 2329b47c527SArvind Sankar events[idx] = event; 2339b47c527SArvind Sankar else 2349b47c527SArvind Sankar ((u32 *)events)[idx] = (u32)(unsigned long)event; 2359b47c527SArvind Sankar } 2369b47c527SArvind Sankar 2379b47c527SArvind Sankar #define EFI_TPL_APPLICATION 4 2389b47c527SArvind Sankar #define EFI_TPL_CALLBACK 8 2399b47c527SArvind Sankar #define EFI_TPL_NOTIFY 16 2409b47c527SArvind Sankar #define EFI_TPL_HIGH_LEVEL 31 2419b47c527SArvind Sankar 2429b47c527SArvind Sankar typedef enum { 2439b47c527SArvind Sankar EfiTimerCancel, 2449b47c527SArvind Sankar EfiTimerPeriodic, 2459b47c527SArvind Sankar EfiTimerRelative 2469b47c527SArvind Sankar } EFI_TIMER_DELAY; 2479b47c527SArvind Sankar 2488166ec09SArd Biesheuvel /* 2498166ec09SArd Biesheuvel * EFI Boot Services table 2508166ec09SArd Biesheuvel */ 2518166ec09SArd Biesheuvel union efi_boot_services { 2528166ec09SArd Biesheuvel struct { 2538166ec09SArd Biesheuvel efi_table_hdr_t hdr; 2548166ec09SArd Biesheuvel void *raise_tpl; 2558166ec09SArd Biesheuvel void *restore_tpl; 2568166ec09SArd Biesheuvel efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long, 2578166ec09SArd Biesheuvel efi_physical_addr_t *); 2588166ec09SArd Biesheuvel efi_status_t (__efiapi *free_pages)(efi_physical_addr_t, 2598166ec09SArd Biesheuvel unsigned long); 2608166ec09SArd Biesheuvel efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *, 2618166ec09SArd Biesheuvel unsigned long *, 2628166ec09SArd Biesheuvel unsigned long *, u32 *); 2638166ec09SArd Biesheuvel efi_status_t (__efiapi *allocate_pool)(int, unsigned long, 2648166ec09SArd Biesheuvel void **); 2658166ec09SArd Biesheuvel efi_status_t (__efiapi *free_pool)(void *); 2669b47c527SArvind Sankar efi_status_t (__efiapi *create_event)(u32, unsigned long, 2679b47c527SArvind Sankar efi_event_notify_t, void *, 2689b47c527SArvind Sankar efi_event_t *); 2699b47c527SArvind Sankar efi_status_t (__efiapi *set_timer)(efi_event_t, 2709b47c527SArvind Sankar EFI_TIMER_DELAY, u64); 2719b47c527SArvind Sankar efi_status_t (__efiapi *wait_for_event)(unsigned long, 2729b47c527SArvind Sankar efi_event_t *, 2739b47c527SArvind Sankar unsigned long *); 2748166ec09SArd Biesheuvel void *signal_event; 2759b47c527SArvind Sankar efi_status_t (__efiapi *close_event)(efi_event_t); 2768166ec09SArd Biesheuvel void *check_event; 2778166ec09SArd Biesheuvel void *install_protocol_interface; 2788166ec09SArd Biesheuvel void *reinstall_protocol_interface; 2798166ec09SArd Biesheuvel void *uninstall_protocol_interface; 2808166ec09SArd Biesheuvel efi_status_t (__efiapi *handle_protocol)(efi_handle_t, 2818166ec09SArd Biesheuvel efi_guid_t *, void **); 2828166ec09SArd Biesheuvel void *__reserved; 2838166ec09SArd Biesheuvel void *register_protocol_notify; 2848166ec09SArd Biesheuvel efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *, 2858166ec09SArd Biesheuvel void *, unsigned long *, 2868166ec09SArd Biesheuvel efi_handle_t *); 287abd26868SArd Biesheuvel efi_status_t (__efiapi *locate_device_path)(efi_guid_t *, 288abd26868SArd Biesheuvel efi_device_path_protocol_t **, 289abd26868SArd Biesheuvel efi_handle_t *); 2908166ec09SArd Biesheuvel efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *, 2918166ec09SArd Biesheuvel void *); 292c7007d9fSArd Biesheuvel efi_status_t (__efiapi *load_image)(bool, efi_handle_t, 293c7007d9fSArd Biesheuvel efi_device_path_protocol_t *, 294c7007d9fSArd Biesheuvel void *, unsigned long, 295c7007d9fSArd Biesheuvel efi_handle_t *); 296c7007d9fSArd Biesheuvel efi_status_t (__efiapi *start_image)(efi_handle_t, unsigned long *, 297c7007d9fSArd Biesheuvel efi_char16_t **); 2983b8f44fcSArd Biesheuvel efi_status_t __noreturn (__efiapi *exit)(efi_handle_t, 2993b8f44fcSArd Biesheuvel efi_status_t, 3003b8f44fcSArd Biesheuvel unsigned long, 3013b8f44fcSArd Biesheuvel efi_char16_t *); 302c7007d9fSArd Biesheuvel efi_status_t (__efiapi *unload_image)(efi_handle_t); 3038166ec09SArd Biesheuvel efi_status_t (__efiapi *exit_boot_services)(efi_handle_t, 3048166ec09SArd Biesheuvel unsigned long); 3058166ec09SArd Biesheuvel void *get_next_monotonic_count; 3069b47c527SArvind Sankar efi_status_t (__efiapi *stall)(unsigned long); 3078166ec09SArd Biesheuvel void *set_watchdog_timer; 3088166ec09SArd Biesheuvel void *connect_controller; 3098166ec09SArd Biesheuvel efi_status_t (__efiapi *disconnect_controller)(efi_handle_t, 3108166ec09SArd Biesheuvel efi_handle_t, 3118166ec09SArd Biesheuvel efi_handle_t); 3128166ec09SArd Biesheuvel void *open_protocol; 3138166ec09SArd Biesheuvel void *close_protocol; 3148166ec09SArd Biesheuvel void *open_protocol_information; 3158166ec09SArd Biesheuvel void *protocols_per_handle; 3168166ec09SArd Biesheuvel void *locate_handle_buffer; 3178166ec09SArd Biesheuvel efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *, 3188166ec09SArd Biesheuvel void **); 319c7007d9fSArd Biesheuvel efi_status_t (__efiapi *install_multiple_protocol_interfaces)(efi_handle_t *, ...); 320c7007d9fSArd Biesheuvel efi_status_t (__efiapi *uninstall_multiple_protocol_interfaces)(efi_handle_t, ...); 3218166ec09SArd Biesheuvel void *calculate_crc32; 322c82ceb44SArd Biesheuvel void (__efiapi *copy_mem)(void *, const void *, unsigned long); 323c82ceb44SArd Biesheuvel void (__efiapi *set_mem)(void *, unsigned long, unsigned char); 3248166ec09SArd Biesheuvel void *create_event_ex; 3258166ec09SArd Biesheuvel }; 3268166ec09SArd Biesheuvel struct { 3278166ec09SArd Biesheuvel efi_table_hdr_t hdr; 3288166ec09SArd Biesheuvel u32 raise_tpl; 3298166ec09SArd Biesheuvel u32 restore_tpl; 3308166ec09SArd Biesheuvel u32 allocate_pages; 3318166ec09SArd Biesheuvel u32 free_pages; 3328166ec09SArd Biesheuvel u32 get_memory_map; 3338166ec09SArd Biesheuvel u32 allocate_pool; 3348166ec09SArd Biesheuvel u32 free_pool; 3358166ec09SArd Biesheuvel u32 create_event; 3368166ec09SArd Biesheuvel u32 set_timer; 3378166ec09SArd Biesheuvel u32 wait_for_event; 3388166ec09SArd Biesheuvel u32 signal_event; 3398166ec09SArd Biesheuvel u32 close_event; 3408166ec09SArd Biesheuvel u32 check_event; 3418166ec09SArd Biesheuvel u32 install_protocol_interface; 3428166ec09SArd Biesheuvel u32 reinstall_protocol_interface; 3438166ec09SArd Biesheuvel u32 uninstall_protocol_interface; 3448166ec09SArd Biesheuvel u32 handle_protocol; 3458166ec09SArd Biesheuvel u32 __reserved; 3468166ec09SArd Biesheuvel u32 register_protocol_notify; 3478166ec09SArd Biesheuvel u32 locate_handle; 3488166ec09SArd Biesheuvel u32 locate_device_path; 3498166ec09SArd Biesheuvel u32 install_configuration_table; 3508166ec09SArd Biesheuvel u32 load_image; 3518166ec09SArd Biesheuvel u32 start_image; 3528166ec09SArd Biesheuvel u32 exit; 3538166ec09SArd Biesheuvel u32 unload_image; 3548166ec09SArd Biesheuvel u32 exit_boot_services; 3558166ec09SArd Biesheuvel u32 get_next_monotonic_count; 3568166ec09SArd Biesheuvel u32 stall; 3578166ec09SArd Biesheuvel u32 set_watchdog_timer; 3588166ec09SArd Biesheuvel u32 connect_controller; 3598166ec09SArd Biesheuvel u32 disconnect_controller; 3608166ec09SArd Biesheuvel u32 open_protocol; 3618166ec09SArd Biesheuvel u32 close_protocol; 3628166ec09SArd Biesheuvel u32 open_protocol_information; 3638166ec09SArd Biesheuvel u32 protocols_per_handle; 3648166ec09SArd Biesheuvel u32 locate_handle_buffer; 3658166ec09SArd Biesheuvel u32 locate_protocol; 3668166ec09SArd Biesheuvel u32 install_multiple_protocol_interfaces; 3678166ec09SArd Biesheuvel u32 uninstall_multiple_protocol_interfaces; 3688166ec09SArd Biesheuvel u32 calculate_crc32; 3698166ec09SArd Biesheuvel u32 copy_mem; 3708166ec09SArd Biesheuvel u32 set_mem; 3718166ec09SArd Biesheuvel u32 create_event_ex; 3728166ec09SArd Biesheuvel } mixed_mode; 3738166ec09SArd Biesheuvel }; 3748166ec09SArd Biesheuvel 3753ba75c13SBaskov Evgeniy typedef enum { 3763ba75c13SBaskov Evgeniy EfiGcdMemoryTypeNonExistent, 3773ba75c13SBaskov Evgeniy EfiGcdMemoryTypeReserved, 3783ba75c13SBaskov Evgeniy EfiGcdMemoryTypeSystemMemory, 3793ba75c13SBaskov Evgeniy EfiGcdMemoryTypeMemoryMappedIo, 3803ba75c13SBaskov Evgeniy EfiGcdMemoryTypePersistent, 3813ba75c13SBaskov Evgeniy EfiGcdMemoryTypeMoreReliable, 3823ba75c13SBaskov Evgeniy EfiGcdMemoryTypeMaximum 3833ba75c13SBaskov Evgeniy } efi_gcd_memory_type_t; 3843ba75c13SBaskov Evgeniy 3853ba75c13SBaskov Evgeniy typedef struct { 3863ba75c13SBaskov Evgeniy efi_physical_addr_t base_address; 3873ba75c13SBaskov Evgeniy u64 length; 3883ba75c13SBaskov Evgeniy u64 capabilities; 3893ba75c13SBaskov Evgeniy u64 attributes; 3903ba75c13SBaskov Evgeniy efi_gcd_memory_type_t gcd_memory_type; 3913ba75c13SBaskov Evgeniy void *image_handle; 3923ba75c13SBaskov Evgeniy void *device_handle; 3933ba75c13SBaskov Evgeniy } efi_gcd_memory_space_desc_t; 3943ba75c13SBaskov Evgeniy 3953ba75c13SBaskov Evgeniy /* 3963ba75c13SBaskov Evgeniy * EFI DXE Services table 3973ba75c13SBaskov Evgeniy */ 3983ba75c13SBaskov Evgeniy union efi_dxe_services_table { 3993ba75c13SBaskov Evgeniy struct { 4003ba75c13SBaskov Evgeniy efi_table_hdr_t hdr; 4013ba75c13SBaskov Evgeniy void *add_memory_space; 4023ba75c13SBaskov Evgeniy void *allocate_memory_space; 4033ba75c13SBaskov Evgeniy void *free_memory_space; 4043ba75c13SBaskov Evgeniy void *remove_memory_space; 4053ba75c13SBaskov Evgeniy efi_status_t (__efiapi *get_memory_space_descriptor)(efi_physical_addr_t, 4063ba75c13SBaskov Evgeniy efi_gcd_memory_space_desc_t *); 4073ba75c13SBaskov Evgeniy efi_status_t (__efiapi *set_memory_space_attributes)(efi_physical_addr_t, 4083ba75c13SBaskov Evgeniy u64, u64); 4093ba75c13SBaskov Evgeniy void *get_memory_space_map; 4103ba75c13SBaskov Evgeniy void *add_io_space; 4113ba75c13SBaskov Evgeniy void *allocate_io_space; 4123ba75c13SBaskov Evgeniy void *free_io_space; 4133ba75c13SBaskov Evgeniy void *remove_io_space; 4143ba75c13SBaskov Evgeniy void *get_io_space_descriptor; 4153ba75c13SBaskov Evgeniy void *get_io_space_map; 4163ba75c13SBaskov Evgeniy void *dispatch; 4173ba75c13SBaskov Evgeniy void *schedule; 4183ba75c13SBaskov Evgeniy void *trust; 4193ba75c13SBaskov Evgeniy void *process_firmware_volume; 4203ba75c13SBaskov Evgeniy void *set_memory_space_capabilities; 4213ba75c13SBaskov Evgeniy }; 4223ba75c13SBaskov Evgeniy struct { 4233ba75c13SBaskov Evgeniy efi_table_hdr_t hdr; 4243ba75c13SBaskov Evgeniy u32 add_memory_space; 4253ba75c13SBaskov Evgeniy u32 allocate_memory_space; 4263ba75c13SBaskov Evgeniy u32 free_memory_space; 4273ba75c13SBaskov Evgeniy u32 remove_memory_space; 4283ba75c13SBaskov Evgeniy u32 get_memory_space_descriptor; 4293ba75c13SBaskov Evgeniy u32 set_memory_space_attributes; 4303ba75c13SBaskov Evgeniy u32 get_memory_space_map; 4313ba75c13SBaskov Evgeniy u32 add_io_space; 4323ba75c13SBaskov Evgeniy u32 allocate_io_space; 4333ba75c13SBaskov Evgeniy u32 free_io_space; 4343ba75c13SBaskov Evgeniy u32 remove_io_space; 4353ba75c13SBaskov Evgeniy u32 get_io_space_descriptor; 4363ba75c13SBaskov Evgeniy u32 get_io_space_map; 4373ba75c13SBaskov Evgeniy u32 dispatch; 4383ba75c13SBaskov Evgeniy u32 schedule; 4393ba75c13SBaskov Evgeniy u32 trust; 4403ba75c13SBaskov Evgeniy u32 process_firmware_volume; 4413ba75c13SBaskov Evgeniy u32 set_memory_space_capabilities; 4423ba75c13SBaskov Evgeniy } mixed_mode; 4433ba75c13SBaskov Evgeniy }; 4443ba75c13SBaskov Evgeniy 445c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t; 446c2d0b470SArd Biesheuvel 447c2d0b470SArd Biesheuvel union efi_uga_draw_protocol { 448c2d0b470SArd Biesheuvel struct { 449c2d0b470SArd Biesheuvel efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *, 450c2d0b470SArd Biesheuvel u32*, u32*, u32*, u32*); 451c2d0b470SArd Biesheuvel void *set_mode; 452c2d0b470SArd Biesheuvel void *blt; 453c2d0b470SArd Biesheuvel }; 454c2d0b470SArd Biesheuvel struct { 455c2d0b470SArd Biesheuvel u32 get_mode; 456c2d0b470SArd Biesheuvel u32 set_mode; 457c2d0b470SArd Biesheuvel u32 blt; 458c2d0b470SArd Biesheuvel } mixed_mode; 459c2d0b470SArd Biesheuvel }; 460c2d0b470SArd Biesheuvel 4619b47c527SArvind Sankar typedef struct { 4629b47c527SArvind Sankar u16 scan_code; 4639b47c527SArvind Sankar efi_char16_t unicode_char; 4649b47c527SArvind Sankar } efi_input_key_t; 4659b47c527SArvind Sankar 4669b47c527SArvind Sankar union efi_simple_text_input_protocol { 4679b47c527SArvind Sankar struct { 4689b47c527SArvind Sankar void *reset; 4699b47c527SArvind Sankar efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *, 4709b47c527SArvind Sankar efi_input_key_t *); 4719b47c527SArvind Sankar efi_event_t wait_for_key; 4729b47c527SArvind Sankar }; 4739b47c527SArvind Sankar struct { 4749b47c527SArvind Sankar u32 reset; 4759b47c527SArvind Sankar u32 read_keystroke; 4769b47c527SArvind Sankar u32 wait_for_key; 4779b47c527SArvind Sankar } mixed_mode; 4789b47c527SArvind Sankar }; 4799b47c527SArvind Sankar 48014c574f3SArvind Sankar efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key); 48114c574f3SArvind Sankar 4828166ec09SArd Biesheuvel union efi_simple_text_output_protocol { 4838166ec09SArd Biesheuvel struct { 4848166ec09SArd Biesheuvel void *reset; 4858166ec09SArd Biesheuvel efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *, 4868166ec09SArd Biesheuvel efi_char16_t *); 4878166ec09SArd Biesheuvel void *test_string; 4888166ec09SArd Biesheuvel }; 4898166ec09SArd Biesheuvel struct { 4908166ec09SArd Biesheuvel u32 reset; 4918166ec09SArd Biesheuvel u32 output_string; 4928166ec09SArd Biesheuvel u32 test_string; 4938166ec09SArd Biesheuvel } mixed_mode; 4948166ec09SArd Biesheuvel }; 4958166ec09SArd Biesheuvel 4968166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0 4978166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1 4988166ec09SArd Biesheuvel #define PIXEL_BIT_MASK 2 4998166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY 3 5008166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX 4 5018166ec09SArd Biesheuvel 5028166ec09SArd Biesheuvel typedef struct { 5038166ec09SArd Biesheuvel u32 red_mask; 5048166ec09SArd Biesheuvel u32 green_mask; 5058166ec09SArd Biesheuvel u32 blue_mask; 5068166ec09SArd Biesheuvel u32 reserved_mask; 5078166ec09SArd Biesheuvel } efi_pixel_bitmask_t; 5088166ec09SArd Biesheuvel 5098166ec09SArd Biesheuvel typedef struct { 5108166ec09SArd Biesheuvel u32 version; 5118166ec09SArd Biesheuvel u32 horizontal_resolution; 5128166ec09SArd Biesheuvel u32 vertical_resolution; 5138166ec09SArd Biesheuvel int pixel_format; 5148166ec09SArd Biesheuvel efi_pixel_bitmask_t pixel_information; 5158166ec09SArd Biesheuvel u32 pixels_per_scan_line; 5168166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t; 5178166ec09SArd Biesheuvel 5188166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t; 5198166ec09SArd Biesheuvel 5208166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode { 5218166ec09SArd Biesheuvel struct { 5228166ec09SArd Biesheuvel u32 max_mode; 5238166ec09SArd Biesheuvel u32 mode; 5248166ec09SArd Biesheuvel efi_graphics_output_mode_info_t *info; 5258166ec09SArd Biesheuvel unsigned long size_of_info; 5268166ec09SArd Biesheuvel efi_physical_addr_t frame_buffer_base; 5278166ec09SArd Biesheuvel unsigned long frame_buffer_size; 5288166ec09SArd Biesheuvel }; 5298166ec09SArd Biesheuvel struct { 5308166ec09SArd Biesheuvel u32 max_mode; 5318166ec09SArd Biesheuvel u32 mode; 5328166ec09SArd Biesheuvel u32 info; 5338166ec09SArd Biesheuvel u32 size_of_info; 5348166ec09SArd Biesheuvel u64 frame_buffer_base; 5358166ec09SArd Biesheuvel u32 frame_buffer_size; 5368166ec09SArd Biesheuvel } mixed_mode; 5378166ec09SArd Biesheuvel }; 5388166ec09SArd Biesheuvel 5398166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t; 5408166ec09SArd Biesheuvel 5418166ec09SArd Biesheuvel union efi_graphics_output_protocol { 5428166ec09SArd Biesheuvel struct { 543b4b89a02SArvind Sankar efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *, 544b4b89a02SArvind Sankar u32, unsigned long *, 545b4b89a02SArvind Sankar efi_graphics_output_mode_info_t **); 546b4b89a02SArvind Sankar efi_status_t (__efiapi *set_mode) (efi_graphics_output_protocol_t *, u32); 5478166ec09SArd Biesheuvel void *blt; 5488166ec09SArd Biesheuvel efi_graphics_output_protocol_mode_t *mode; 5498166ec09SArd Biesheuvel }; 5508166ec09SArd Biesheuvel struct { 5518166ec09SArd Biesheuvel u32 query_mode; 5528166ec09SArd Biesheuvel u32 set_mode; 5538166ec09SArd Biesheuvel u32 blt; 5548166ec09SArd Biesheuvel u32 mode; 5558166ec09SArd Biesheuvel } mixed_mode; 5568166ec09SArd Biesheuvel }; 5578166ec09SArd Biesheuvel 558f7b85b33SArd Biesheuvel typedef union { 559f7b85b33SArd Biesheuvel struct { 560a46a290aSArd Biesheuvel u32 revision; 561a46a290aSArd Biesheuvel efi_handle_t parent_handle; 562a46a290aSArd Biesheuvel efi_system_table_t *system_table; 563a46a290aSArd Biesheuvel efi_handle_t device_handle; 564a46a290aSArd Biesheuvel void *file_path; 565a46a290aSArd Biesheuvel void *reserved; 566a46a290aSArd Biesheuvel u32 load_options_size; 567a46a290aSArd Biesheuvel void *load_options; 568a46a290aSArd Biesheuvel void *image_base; 569a46a290aSArd Biesheuvel __aligned_u64 image_size; 570a46a290aSArd Biesheuvel unsigned int image_code_type; 571a46a290aSArd Biesheuvel unsigned int image_data_type; 572a46a290aSArd Biesheuvel efi_status_t (__efiapi *unload)(efi_handle_t image_handle); 573f7b85b33SArd Biesheuvel }; 574f7b85b33SArd Biesheuvel struct { 575f7b85b33SArd Biesheuvel u32 revision; 576f7b85b33SArd Biesheuvel u32 parent_handle; 577f7b85b33SArd Biesheuvel u32 system_table; 578f7b85b33SArd Biesheuvel u32 device_handle; 579f7b85b33SArd Biesheuvel u32 file_path; 580f7b85b33SArd Biesheuvel u32 reserved; 581f7b85b33SArd Biesheuvel u32 load_options_size; 582f7b85b33SArd Biesheuvel u32 load_options; 583f7b85b33SArd Biesheuvel u32 image_base; 584f7b85b33SArd Biesheuvel __aligned_u64 image_size; 585f7b85b33SArd Biesheuvel u32 image_code_type; 586f7b85b33SArd Biesheuvel u32 image_data_type; 587f7b85b33SArd Biesheuvel u32 unload; 588f7b85b33SArd Biesheuvel } mixed_mode; 589a46a290aSArd Biesheuvel } efi_loaded_image_t; 590a46a290aSArd Biesheuvel 591a46a290aSArd Biesheuvel typedef struct { 592a46a290aSArd Biesheuvel u64 size; 593a46a290aSArd Biesheuvel u64 file_size; 594a46a290aSArd Biesheuvel u64 phys_size; 595a46a290aSArd Biesheuvel efi_time_t create_time; 596a46a290aSArd Biesheuvel efi_time_t last_access_time; 597a46a290aSArd Biesheuvel efi_time_t modification_time; 598a46a290aSArd Biesheuvel __aligned_u64 attribute; 5999302c1bbSArd Biesheuvel efi_char16_t filename[]; 600a46a290aSArd Biesheuvel } efi_file_info_t; 601a46a290aSArd Biesheuvel 602f8a31244SArd Biesheuvel typedef union efi_file_protocol efi_file_protocol_t; 603a46a290aSArd Biesheuvel 604f8a31244SArd Biesheuvel union efi_file_protocol { 605f8a31244SArd Biesheuvel struct { 606a46a290aSArd Biesheuvel u64 revision; 607a46a290aSArd Biesheuvel efi_status_t (__efiapi *open) (efi_file_protocol_t *, 608a46a290aSArd Biesheuvel efi_file_protocol_t **, 609f8a31244SArd Biesheuvel efi_char16_t *, u64, 610f8a31244SArd Biesheuvel u64); 611a46a290aSArd Biesheuvel efi_status_t (__efiapi *close) (efi_file_protocol_t *); 612a46a290aSArd Biesheuvel efi_status_t (__efiapi *delete) (efi_file_protocol_t *); 613a46a290aSArd Biesheuvel efi_status_t (__efiapi *read) (efi_file_protocol_t *, 614f8a31244SArd Biesheuvel unsigned long *, 615f8a31244SArd Biesheuvel void *); 616a46a290aSArd Biesheuvel efi_status_t (__efiapi *write) (efi_file_protocol_t *, 617a46a290aSArd Biesheuvel unsigned long, void *); 618f8a31244SArd Biesheuvel efi_status_t (__efiapi *get_position)(efi_file_protocol_t *, 619f8a31244SArd Biesheuvel u64 *); 620f8a31244SArd Biesheuvel efi_status_t (__efiapi *set_position)(efi_file_protocol_t *, 621f8a31244SArd Biesheuvel u64); 622a46a290aSArd Biesheuvel efi_status_t (__efiapi *get_info) (efi_file_protocol_t *, 623f8a31244SArd Biesheuvel efi_guid_t *, 624f8a31244SArd Biesheuvel unsigned long *, 625a46a290aSArd Biesheuvel void *); 626a46a290aSArd Biesheuvel efi_status_t (__efiapi *set_info) (efi_file_protocol_t *, 627f8a31244SArd Biesheuvel efi_guid_t *, 628f8a31244SArd Biesheuvel unsigned long, 629a46a290aSArd Biesheuvel void *); 630a46a290aSArd Biesheuvel efi_status_t (__efiapi *flush) (efi_file_protocol_t *); 631a46a290aSArd Biesheuvel }; 632f8a31244SArd Biesheuvel struct { 633a46a290aSArd Biesheuvel u64 revision; 634f8a31244SArd Biesheuvel u32 open; 635f8a31244SArd Biesheuvel u32 close; 636f8a31244SArd Biesheuvel u32 delete; 637f8a31244SArd Biesheuvel u32 read; 638f8a31244SArd Biesheuvel u32 write; 639f8a31244SArd Biesheuvel u32 get_position; 640f8a31244SArd Biesheuvel u32 set_position; 641f8a31244SArd Biesheuvel u32 get_info; 642f8a31244SArd Biesheuvel u32 set_info; 643f8a31244SArd Biesheuvel u32 flush; 644f8a31244SArd Biesheuvel } mixed_mode; 645f8a31244SArd Biesheuvel }; 646f8a31244SArd Biesheuvel 647f8a31244SArd Biesheuvel typedef union efi_simple_file_system_protocol efi_simple_file_system_protocol_t; 648f8a31244SArd Biesheuvel 649f8a31244SArd Biesheuvel union efi_simple_file_system_protocol { 650f8a31244SArd Biesheuvel struct { 651f8a31244SArd Biesheuvel u64 revision; 652f8a31244SArd Biesheuvel efi_status_t (__efiapi *open_volume)(efi_simple_file_system_protocol_t *, 653a46a290aSArd Biesheuvel efi_file_protocol_t **); 654a46a290aSArd Biesheuvel }; 655f8a31244SArd Biesheuvel struct { 656f8a31244SArd Biesheuvel u64 revision; 657f8a31244SArd Biesheuvel u32 open_volume; 658f8a31244SArd Biesheuvel } mixed_mode; 659f8a31244SArd Biesheuvel }; 660a46a290aSArd Biesheuvel 661a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ 0x0000000000000001 662a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE 0x0000000000000002 663a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE 0x8000000000000000 664a46a290aSArd Biesheuvel 6658166ec09SArd Biesheuvel typedef enum { 6668166ec09SArd Biesheuvel EfiPciIoWidthUint8, 6678166ec09SArd Biesheuvel EfiPciIoWidthUint16, 6688166ec09SArd Biesheuvel EfiPciIoWidthUint32, 6698166ec09SArd Biesheuvel EfiPciIoWidthUint64, 6708166ec09SArd Biesheuvel EfiPciIoWidthFifoUint8, 6718166ec09SArd Biesheuvel EfiPciIoWidthFifoUint16, 6728166ec09SArd Biesheuvel EfiPciIoWidthFifoUint32, 6738166ec09SArd Biesheuvel EfiPciIoWidthFifoUint64, 6748166ec09SArd Biesheuvel EfiPciIoWidthFillUint8, 6758166ec09SArd Biesheuvel EfiPciIoWidthFillUint16, 6768166ec09SArd Biesheuvel EfiPciIoWidthFillUint32, 6778166ec09SArd Biesheuvel EfiPciIoWidthFillUint64, 6788166ec09SArd Biesheuvel EfiPciIoWidthMaximum 6798166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH; 6808166ec09SArd Biesheuvel 6818166ec09SArd Biesheuvel typedef enum { 6828166ec09SArd Biesheuvel EfiPciIoAttributeOperationGet, 6838166ec09SArd Biesheuvel EfiPciIoAttributeOperationSet, 6848166ec09SArd Biesheuvel EfiPciIoAttributeOperationEnable, 6858166ec09SArd Biesheuvel EfiPciIoAttributeOperationDisable, 6868166ec09SArd Biesheuvel EfiPciIoAttributeOperationSupported, 6878166ec09SArd Biesheuvel EfiPciIoAttributeOperationMaximum 6888166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION; 6898166ec09SArd Biesheuvel 6908166ec09SArd Biesheuvel typedef struct { 6918166ec09SArd Biesheuvel u32 read; 6928166ec09SArd Biesheuvel u32 write; 6938166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t; 6948166ec09SArd Biesheuvel 6958166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t; 6968166ec09SArd Biesheuvel 6978166ec09SArd Biesheuvel typedef 6988166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *, 6998166ec09SArd Biesheuvel EFI_PCI_IO_PROTOCOL_WIDTH, 7008166ec09SArd Biesheuvel u32 offset, 7018166ec09SArd Biesheuvel unsigned long count, 7028166ec09SArd Biesheuvel void *buffer); 7038166ec09SArd Biesheuvel 7048166ec09SArd Biesheuvel typedef struct { 7058166ec09SArd Biesheuvel void *read; 7068166ec09SArd Biesheuvel void *write; 7078166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t; 7088166ec09SArd Biesheuvel 7098166ec09SArd Biesheuvel typedef struct { 7108166ec09SArd Biesheuvel efi_pci_io_protocol_cfg_t read; 7118166ec09SArd Biesheuvel efi_pci_io_protocol_cfg_t write; 7128166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t; 7138166ec09SArd Biesheuvel 7148166ec09SArd Biesheuvel union efi_pci_io_protocol { 7158166ec09SArd Biesheuvel struct { 7168166ec09SArd Biesheuvel void *poll_mem; 7178166ec09SArd Biesheuvel void *poll_io; 7188166ec09SArd Biesheuvel efi_pci_io_protocol_access_t mem; 7198166ec09SArd Biesheuvel efi_pci_io_protocol_access_t io; 7208166ec09SArd Biesheuvel efi_pci_io_protocol_config_access_t pci; 7218166ec09SArd Biesheuvel void *copy_mem; 7228166ec09SArd Biesheuvel void *map; 7238166ec09SArd Biesheuvel void *unmap; 7248166ec09SArd Biesheuvel void *allocate_buffer; 7258166ec09SArd Biesheuvel void *free_buffer; 7268166ec09SArd Biesheuvel void *flush; 7278166ec09SArd Biesheuvel efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *, 7288166ec09SArd Biesheuvel unsigned long *segment_nr, 7298166ec09SArd Biesheuvel unsigned long *bus_nr, 7308166ec09SArd Biesheuvel unsigned long *device_nr, 7318166ec09SArd Biesheuvel unsigned long *func_nr); 7328166ec09SArd Biesheuvel void *attributes; 7338166ec09SArd Biesheuvel void *get_bar_attributes; 7348166ec09SArd Biesheuvel void *set_bar_attributes; 7358166ec09SArd Biesheuvel uint64_t romsize; 7368166ec09SArd Biesheuvel void *romimage; 7378166ec09SArd Biesheuvel }; 7388166ec09SArd Biesheuvel struct { 7398166ec09SArd Biesheuvel u32 poll_mem; 7408166ec09SArd Biesheuvel u32 poll_io; 7418166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t mem; 7428166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t io; 7438166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t pci; 7448166ec09SArd Biesheuvel u32 copy_mem; 7458166ec09SArd Biesheuvel u32 map; 7468166ec09SArd Biesheuvel u32 unmap; 7478166ec09SArd Biesheuvel u32 allocate_buffer; 7488166ec09SArd Biesheuvel u32 free_buffer; 7498166ec09SArd Biesheuvel u32 flush; 7508166ec09SArd Biesheuvel u32 get_location; 7518166ec09SArd Biesheuvel u32 attributes; 7528166ec09SArd Biesheuvel u32 get_bar_attributes; 7538166ec09SArd Biesheuvel u32 set_bar_attributes; 7548166ec09SArd Biesheuvel u64 romsize; 7558166ec09SArd Biesheuvel u32 romimage; 7568166ec09SArd Biesheuvel } mixed_mode; 7578166ec09SArd Biesheuvel }; 7588166ec09SArd Biesheuvel 7598166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001 7608166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002 7618166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004 7628166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008 7638166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010 7648166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020 7658166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040 7668166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080 7678166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100 7688166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200 7698166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400 7708166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800 7718166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000 7728166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000 7738166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000 7748166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 7758166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000 7768166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 7778166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000 7788166ec09SArd Biesheuvel 7798166ec09SArd Biesheuvel struct efi_dev_path; 7808166ec09SArd Biesheuvel 7818166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t; 7828166ec09SArd Biesheuvel 7838166ec09SArd Biesheuvel union apple_properties_protocol { 7848166ec09SArd Biesheuvel struct { 7858166ec09SArd Biesheuvel unsigned long version; 7868166ec09SArd Biesheuvel efi_status_t (__efiapi *get)(apple_properties_protocol_t *, 7878166ec09SArd Biesheuvel struct efi_dev_path *, 7888166ec09SArd Biesheuvel efi_char16_t *, void *, u32 *); 7898166ec09SArd Biesheuvel efi_status_t (__efiapi *set)(apple_properties_protocol_t *, 7908166ec09SArd Biesheuvel struct efi_dev_path *, 7918166ec09SArd Biesheuvel efi_char16_t *, void *, u32); 7928166ec09SArd Biesheuvel efi_status_t (__efiapi *del)(apple_properties_protocol_t *, 7938166ec09SArd Biesheuvel struct efi_dev_path *, 7948166ec09SArd Biesheuvel efi_char16_t *); 7958166ec09SArd Biesheuvel efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *, 7968166ec09SArd Biesheuvel void *buffer, u32 *); 7978166ec09SArd Biesheuvel }; 7988166ec09SArd Biesheuvel struct { 7998166ec09SArd Biesheuvel u32 version; 8008166ec09SArd Biesheuvel u32 get; 8018166ec09SArd Biesheuvel u32 set; 8028166ec09SArd Biesheuvel u32 del; 8038166ec09SArd Biesheuvel u32 get_all; 8048166ec09SArd Biesheuvel } mixed_mode; 8058166ec09SArd Biesheuvel }; 8068166ec09SArd Biesheuvel 8078166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format; 8088166ec09SArd Biesheuvel 8094da87c51SArd Biesheuvel #define INITRD_EVENT_TAG_ID 0x8F3B22ECU 81071c7adc9SIlias Apalodimas #define LOAD_OPTIONS_EVENT_TAG_ID 0x8F3B22EDU 8114da87c51SArd Biesheuvel #define EV_EVENT_TAG 0x00000006U 8124da87c51SArd Biesheuvel #define EFI_TCG2_EVENT_HEADER_VERSION 0x1 8134da87c51SArd Biesheuvel 8144da87c51SArd Biesheuvel struct efi_tcg2_event { 8154da87c51SArd Biesheuvel u32 event_size; 8164da87c51SArd Biesheuvel struct { 8174da87c51SArd Biesheuvel u32 header_size; 8184da87c51SArd Biesheuvel u16 header_version; 8194da87c51SArd Biesheuvel u32 pcr_index; 8204da87c51SArd Biesheuvel u32 event_type; 8214da87c51SArd Biesheuvel } __packed event_header; 8224da87c51SArd Biesheuvel /* u8[] event follows here */ 8234da87c51SArd Biesheuvel } __packed; 8244da87c51SArd Biesheuvel 8254da87c51SArd Biesheuvel struct efi_tcg2_tagged_event { 8264da87c51SArd Biesheuvel u32 tagged_event_id; 8274da87c51SArd Biesheuvel u32 tagged_event_data_size; 8284da87c51SArd Biesheuvel /* u8 tagged event data follows here */ 8294da87c51SArd Biesheuvel } __packed; 8304da87c51SArd Biesheuvel 8314da87c51SArd Biesheuvel typedef struct efi_tcg2_event efi_tcg2_event_t; 8324da87c51SArd Biesheuvel typedef struct efi_tcg2_tagged_event efi_tcg2_tagged_event_t; 8338166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t; 8348166ec09SArd Biesheuvel 8358166ec09SArd Biesheuvel union efi_tcg2_protocol { 8368166ec09SArd Biesheuvel struct { 8378166ec09SArd Biesheuvel void *get_capability; 838cdec91c0SArd Biesheuvel efi_status_t (__efiapi *get_event_log)(efi_tcg2_protocol_t *, 8398166ec09SArd Biesheuvel efi_tcg2_event_log_format, 8408166ec09SArd Biesheuvel efi_physical_addr_t *, 8418166ec09SArd Biesheuvel efi_physical_addr_t *, 8428166ec09SArd Biesheuvel efi_bool_t *); 8434da87c51SArd Biesheuvel efi_status_t (__efiapi *hash_log_extend_event)(efi_tcg2_protocol_t *, 8444da87c51SArd Biesheuvel u64, 8454da87c51SArd Biesheuvel efi_physical_addr_t, 8464da87c51SArd Biesheuvel u64, 8474da87c51SArd Biesheuvel const efi_tcg2_event_t *); 8488166ec09SArd Biesheuvel void *submit_command; 8498166ec09SArd Biesheuvel void *get_active_pcr_banks; 8508166ec09SArd Biesheuvel void *set_active_pcr_banks; 8518166ec09SArd Biesheuvel void *get_result_of_set_active_pcr_banks; 8528166ec09SArd Biesheuvel }; 8538166ec09SArd Biesheuvel struct { 8548166ec09SArd Biesheuvel u32 get_capability; 8558166ec09SArd Biesheuvel u32 get_event_log; 8568166ec09SArd Biesheuvel u32 hash_log_extend_event; 8578166ec09SArd Biesheuvel u32 submit_command; 8588166ec09SArd Biesheuvel u32 get_active_pcr_banks; 8598166ec09SArd Biesheuvel u32 set_active_pcr_banks; 8608166ec09SArd Biesheuvel u32 get_result_of_set_active_pcr_banks; 8618166ec09SArd Biesheuvel } mixed_mode; 8628166ec09SArd Biesheuvel }; 8638166ec09SArd Biesheuvel 8643f68e695SSunil V L struct riscv_efi_boot_protocol { 8653f68e695SSunil V L u64 revision; 8663f68e695SSunil V L 8673f68e695SSunil V L efi_status_t (__efiapi *get_boot_hartid)(struct riscv_efi_boot_protocol *, 8683f68e695SSunil V L unsigned long *boot_hartid); 8693f68e695SSunil V L }; 8703f68e695SSunil V L 8712931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t; 8722931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t; 8732931d526SArd Biesheuvel 8742931d526SArd Biesheuvel union efi_load_file_protocol { 8752931d526SArd Biesheuvel struct { 8762931d526SArd Biesheuvel efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *, 8772931d526SArd Biesheuvel efi_device_path_protocol_t *, 8782931d526SArd Biesheuvel bool, unsigned long *, void *); 8792931d526SArd Biesheuvel }; 8802931d526SArd Biesheuvel struct { 8812931d526SArd Biesheuvel u32 load_file; 8822931d526SArd Biesheuvel } mixed_mode; 8832931d526SArd Biesheuvel }; 8842931d526SArd Biesheuvel 8854a568ce2SArvind Sankar typedef struct { 8864a568ce2SArvind Sankar u32 attributes; 8874a568ce2SArvind Sankar u16 file_path_list_length; 8884a568ce2SArvind Sankar u8 variable_data[]; 8894a568ce2SArvind Sankar // efi_char16_t description[]; 8904a568ce2SArvind Sankar // efi_device_path_protocol_t file_path_list[]; 8914a568ce2SArvind Sankar // u8 optional_data[]; 8924a568ce2SArvind Sankar } __packed efi_load_option_t; 8934a568ce2SArvind Sankar 8944a568ce2SArvind Sankar #define EFI_LOAD_OPTION_ACTIVE 0x0001U 8954a568ce2SArvind Sankar #define EFI_LOAD_OPTION_FORCE_RECONNECT 0x0002U 8964a568ce2SArvind Sankar #define EFI_LOAD_OPTION_HIDDEN 0x0008U 8974a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY 0x1f00U 8984a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY_BOOT 0x0000U 8994a568ce2SArvind Sankar #define EFI_LOAD_OPTION_CATEGORY_APP 0x0100U 9004a568ce2SArvind Sankar 9014a568ce2SArvind Sankar #define EFI_LOAD_OPTION_BOOT_MASK \ 9024a568ce2SArvind Sankar (EFI_LOAD_OPTION_ACTIVE|EFI_LOAD_OPTION_HIDDEN|EFI_LOAD_OPTION_CATEGORY) 9034a568ce2SArvind Sankar #define EFI_LOAD_OPTION_MASK (EFI_LOAD_OPTION_FORCE_RECONNECT|EFI_LOAD_OPTION_BOOT_MASK) 9044a568ce2SArvind Sankar 9054a568ce2SArvind Sankar typedef struct { 9064a568ce2SArvind Sankar u32 attributes; 9074a568ce2SArvind Sankar u16 file_path_list_length; 9084a568ce2SArvind Sankar const efi_char16_t *description; 9094a568ce2SArvind Sankar const efi_device_path_protocol_t *file_path_list; 910a241d94bSArd Biesheuvel u32 optional_data_size; 9114a568ce2SArvind Sankar const void *optional_data; 9124a568ce2SArvind Sankar } efi_load_option_unpacked_t; 9134a568ce2SArvind Sankar 9148166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void); 9158166ec09SArd Biesheuvel 9168166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)( 9178166ec09SArd Biesheuvel struct efi_boot_memmap *map, 9188166ec09SArd Biesheuvel void *priv); 9198166ec09SArd Biesheuvel 920eab31265SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle, void *priv, 9218166ec09SArd Biesheuvel efi_exit_boot_map_processing priv_func); 9228166ec09SArd Biesheuvel 9234fc8e738SArd Biesheuvel efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image, 9244fc8e738SArd Biesheuvel unsigned long kernel_addr, char *cmdline_ptr); 9258166ec09SArd Biesheuvel 9268166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size); 9278166ec09SArd Biesheuvel 928f80d2604SArd Biesheuvel efi_status_t efi_alloc_virtmap(efi_memory_desc_t **virtmap, 929f80d2604SArd Biesheuvel unsigned long *desc_size, u32 *desc_ver); 9308166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size, 9318166ec09SArd Biesheuvel unsigned long desc_size, efi_memory_desc_t *runtime_map, 9328166ec09SArd Biesheuvel int *count); 9338166ec09SArd Biesheuvel 9348166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out); 9358166ec09SArd Biesheuvel 9368166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align, 9379cf42bcaSArd Biesheuvel unsigned long *addr, unsigned long random_seed, 9389cf42bcaSArd Biesheuvel int memory_type); 9398166ec09SArd Biesheuvel 940196dff27SArd Biesheuvel efi_status_t efi_random_get_seed(void); 941196dff27SArd Biesheuvel 9428166ec09SArd Biesheuvel efi_status_t check_platform_features(void); 9438166ec09SArd Biesheuvel 9448166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid); 9458166ec09SArd Biesheuvel 946cb8c90a0SArvind Sankar /* NOTE: These functions do not print a trailing newline after the string */ 947cb8c90a0SArvind Sankar void efi_char16_puts(efi_char16_t *); 948cb8c90a0SArvind Sankar void efi_puts(const char *str); 9498166ec09SArd Biesheuvel 9502c7d1e30SArvind Sankar __printf(1, 2) int efi_printk(char const *fmt, ...); 9518166ec09SArd Biesheuvel 9528166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr); 9538166ec09SArd Biesheuvel 954a241d94bSArd Biesheuvel void efi_apply_loadoptions_quirk(const void **load_options, u32 *load_options_size); 9554a568ce2SArvind Sankar 95627cd5511SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len); 9578166ec09SArd Biesheuvel 958171539f5SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap **map, 959171539f5SArd Biesheuvel bool install_cfg_tbl); 9608166ec09SArd Biesheuvel 9618166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr, 9628166ec09SArd Biesheuvel unsigned long max); 9638166ec09SArd Biesheuvel 96443b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr, 9659cf42bcaSArd Biesheuvel unsigned long max, unsigned long align, 9669cf42bcaSArd Biesheuvel int memory_type); 96743b1df0eSArd Biesheuvel 9681a895dbfSArd Biesheuvel efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align, 9691a895dbfSArd Biesheuvel unsigned long *addr, unsigned long min); 9701a895dbfSArd Biesheuvel 9718166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr, 9728166ec09SArd Biesheuvel unsigned long image_size, 9738166ec09SArd Biesheuvel unsigned long alloc_size, 9748166ec09SArd Biesheuvel unsigned long preferred_addr, 9758166ec09SArd Biesheuvel unsigned long alignment, 9768166ec09SArd Biesheuvel unsigned long min_addr); 9778166ec09SArd Biesheuvel 9788166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline); 9798166ec09SArd Biesheuvel 980fffb6804SArvind Sankar void efi_parse_option_graphics(char *option); 981fffb6804SArvind Sankar 9828166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto, 9838166ec09SArd Biesheuvel unsigned long size); 9848166ec09SArd Biesheuvel 985cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image, 986cf6b8366SArd Biesheuvel const efi_char16_t *optstr, 987cf6b8366SArd Biesheuvel int optstr_size, 988cf6b8366SArd Biesheuvel unsigned long soft_limit, 989cf6b8366SArd Biesheuvel unsigned long hard_limit, 9909302c1bbSArd Biesheuvel unsigned long *load_addr, 9919302c1bbSArd Biesheuvel unsigned long *load_size); 9929302c1bbSArd Biesheuvel 993cf6b8366SArd Biesheuvel 994cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image, 995cf6b8366SArd Biesheuvel unsigned long *load_addr, 996cf6b8366SArd Biesheuvel unsigned long *load_size) 997cf6b8366SArd Biesheuvel { 998cf6b8366SArd Biesheuvel return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2, 999cf6b8366SArd Biesheuvel ULONG_MAX, ULONG_MAX, load_addr, load_size); 1000cf6b8366SArd Biesheuvel } 1001cf6b8366SArd Biesheuvel 1002f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image, 100331f5e546SArd Biesheuvel unsigned long soft_limit, 1004f4dc7fffSArd Biesheuvel unsigned long hard_limit, 1005f4dc7fffSArd Biesheuvel const struct linux_efi_initrd **out); 10063230d95cSAtish Patra /* 10073230d95cSAtish Patra * This function handles the architcture specific differences between arm and 10083230d95cSAtish Patra * arm64 regarding where the kernel image must be loaded and any memory that 10093230d95cSAtish Patra * must be reserved. On failure it is required to free all 10103230d95cSAtish Patra * all allocations it has made. 10113230d95cSAtish Patra */ 10123230d95cSAtish Patra efi_status_t handle_kernel_image(unsigned long *image_addr, 10133230d95cSAtish Patra unsigned long *image_size, 10143230d95cSAtish Patra unsigned long *reserve_addr, 10153230d95cSAtish Patra unsigned long *reserve_size, 1016416a9f84SArd Biesheuvel efi_loaded_image_t *image, 1017416a9f84SArd Biesheuvel efi_handle_t image_handle); 10183230d95cSAtish Patra 101942c8ea3dSArd Biesheuvel /* shared entrypoint between the normal stub and the zboot stub */ 102042c8ea3dSArd Biesheuvel efi_status_t efi_stub_common(efi_handle_t handle, 102142c8ea3dSArd Biesheuvel efi_loaded_image_t *image, 102242c8ea3dSArd Biesheuvel unsigned long image_addr, 102342c8ea3dSArd Biesheuvel char *cmdline_ptr); 102442c8ea3dSArd Biesheuvel 102542c8ea3dSArd Biesheuvel efi_status_t efi_handle_cmdline(efi_loaded_image_t *image, char **cmdline_ptr); 102642c8ea3dSArd Biesheuvel 10273230d95cSAtish Patra asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint, 10283230d95cSAtish Patra unsigned long fdt_addr, 10293230d95cSAtish Patra unsigned long fdt_size); 1030ec93fc37SArd Biesheuvel 10312a55280aSArd Biesheuvel void efi_handle_post_ebs_state(void); 10322a55280aSArd Biesheuvel 1033e1ac4b24SChester Lin enum efi_secureboot_mode efi_get_secureboot(void); 1034e1ac4b24SChester Lin 10353820749dSArd Biesheuvel #ifdef CONFIG_RESET_ATTACK_MITIGATION 10363820749dSArd Biesheuvel void efi_enable_reset_attack_mitigation(void); 10373820749dSArd Biesheuvel #else 10383820749dSArd Biesheuvel static inline void 10393820749dSArd Biesheuvel efi_enable_reset_attack_mitigation(void) { } 10403820749dSArd Biesheuvel #endif 10413820749dSArd Biesheuvel 10423820749dSArd Biesheuvel void efi_retrieve_tpm2_eventlog(void); 10433820749dSArd Biesheuvel 1044732ea9dbSArd Biesheuvel struct screen_info *alloc_screen_info(void); 1045732ea9dbSArd Biesheuvel void free_screen_info(struct screen_info *si); 1046732ea9dbSArd Biesheuvel 1047d9ffe524SArd Biesheuvel void efi_cache_sync_image(unsigned long image_base, 1048d9ffe524SArd Biesheuvel unsigned long alloc_size, 1049d9ffe524SArd Biesheuvel unsigned long code_size); 1050d9ffe524SArd Biesheuvel 1051550b33cfSArd Biesheuvel struct efi_smbios_record { 1052550b33cfSArd Biesheuvel u8 type; 1053550b33cfSArd Biesheuvel u8 length; 1054550b33cfSArd Biesheuvel u16 handle; 1055550b33cfSArd Biesheuvel }; 1056550b33cfSArd Biesheuvel 1057550b33cfSArd Biesheuvel struct efi_smbios_type1_record { 1058550b33cfSArd Biesheuvel struct efi_smbios_record header; 1059550b33cfSArd Biesheuvel 1060550b33cfSArd Biesheuvel u8 manufacturer; 1061550b33cfSArd Biesheuvel u8 product_name; 1062550b33cfSArd Biesheuvel u8 version; 1063550b33cfSArd Biesheuvel u8 serial_number; 1064550b33cfSArd Biesheuvel efi_guid_t uuid; 1065550b33cfSArd Biesheuvel u8 wakeup_type; 1066550b33cfSArd Biesheuvel u8 sku_number; 1067550b33cfSArd Biesheuvel u8 family; 1068550b33cfSArd Biesheuvel }; 1069550b33cfSArd Biesheuvel 1070550b33cfSArd Biesheuvel #define efi_get_smbios_string(__type, __name) ({ \ 1071550b33cfSArd Biesheuvel int size = sizeof(struct efi_smbios_type ## __type ## _record); \ 1072550b33cfSArd Biesheuvel int off = offsetof(struct efi_smbios_type ## __type ## _record, \ 1073550b33cfSArd Biesheuvel __name); \ 1074550b33cfSArd Biesheuvel __efi_get_smbios_string(__type, off, size); \ 1075550b33cfSArd Biesheuvel }) 1076550b33cfSArd Biesheuvel 1077550b33cfSArd Biesheuvel const u8 *__efi_get_smbios_string(u8 type, int offset, int recsize); 1078550b33cfSArd Biesheuvel 1079f4f75ad5SArd Biesheuvel #endif 1080