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 13f4f75ad5SArd Biesheuvel /* error code which can't be mistaken for valid address */ 14f4f75ad5SArd Biesheuvel #define EFI_ERROR (~0UL) 15f4f75ad5SArd Biesheuvel 1607e83dbbSArd Biesheuvel /* 1707e83dbbSArd Biesheuvel * __init annotations should not be used in the EFI stub, since the code is 1807e83dbbSArd Biesheuvel * either included in the decompressor (x86, ARM) where they have no effect, 1907e83dbbSArd Biesheuvel * or the whole stub is __init annotated at the section level (arm64), by 2007e83dbbSArd Biesheuvel * renaming the sections, in which case the __init annotation will be 2107e83dbbSArd Biesheuvel * redundant, and will result in section names like .init.init.text, and our 2207e83dbbSArd Biesheuvel * linker script does not expect that. 2307e83dbbSArd Biesheuvel */ 2407e83dbbSArd Biesheuvel #undef __init 2507e83dbbSArd Biesheuvel 26a6a14469SArd Biesheuvel /* 27a6a14469SArd Biesheuvel * Allow the platform to override the allocation granularity: this allows 28a6a14469SArd Biesheuvel * systems that have the capability to run with a larger page size to deal 29a6a14469SArd Biesheuvel * with the allocations for initrd and fdt more efficiently. 30a6a14469SArd Biesheuvel */ 31a6a14469SArd Biesheuvel #ifndef EFI_ALLOC_ALIGN 32a6a14469SArd Biesheuvel #define EFI_ALLOC_ALIGN EFI_PAGE_SIZE 33a6a14469SArd Biesheuvel #endif 34a6a14469SArd Biesheuvel 35980771f6SArd Biesheuvel extern bool efi_nochunk; 36980771f6SArd Biesheuvel extern bool efi_nokaslr; 37980771f6SArd Biesheuvel extern bool efi_noinitrd; 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 436e99d321SArd Biesheuvel efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, 446e99d321SArd Biesheuvel efi_system_table_t *sys_table_arg); 456e99d321SArd Biesheuvel 46de8c5520SArvind Sankar #ifndef ARCH_HAS_EFISTUB_WRAPPERS 47de8c5520SArvind Sankar 4822090f84SArd Biesheuvel #define efi_is_native() (true) 49de8c5520SArvind Sankar #define efi_bs_call(func, ...) efi_system_table->boottime->func(__VA_ARGS__) 50de8c5520SArvind Sankar #define efi_rt_call(func, ...) efi_system_table->runtime->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__) 5823d5b73fSArvind Sankar #define efi_err(fmt, ...) \ 5923d5b73fSArvind Sankar efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__) 6023d5b73fSArvind Sankar #define efi_debug(fmt, ...) \ 6123d5b73fSArvind Sankar efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__) 6260f38de7SArd Biesheuvel 63ac9aff8eSIngo Molnar /* Helper macros for the usual case of using simple C variables: */ 64ac9aff8eSIngo Molnar #ifndef fdt_setprop_inplace_var 65ac9aff8eSIngo Molnar #define fdt_setprop_inplace_var(fdt, node_offset, name, var) \ 66ac9aff8eSIngo Molnar fdt_setprop_inplace((fdt), (node_offset), (name), &(var), sizeof(var)) 67ac9aff8eSIngo Molnar #endif 68ac9aff8eSIngo Molnar 69ac9aff8eSIngo Molnar #ifndef fdt_setprop_var 70ac9aff8eSIngo Molnar #define fdt_setprop_var(fdt, node_offset, name, var) \ 71ac9aff8eSIngo Molnar fdt_setprop((fdt), (node_offset), (name), &(var), sizeof(var)) 72ac9aff8eSIngo Molnar #endif 73ac9aff8eSIngo Molnar 74966291f6SArd Biesheuvel #define get_efi_var(name, vendor, ...) \ 75966291f6SArd Biesheuvel efi_rt_call(get_variable, (efi_char16_t *)(name), \ 76966291f6SArd Biesheuvel (efi_guid_t *)(vendor), __VA_ARGS__) 77966291f6SArd Biesheuvel 78966291f6SArd Biesheuvel #define set_efi_var(name, vendor, ...) \ 79966291f6SArd Biesheuvel efi_rt_call(set_variable, (efi_char16_t *)(name), \ 80966291f6SArd Biesheuvel (efi_guid_t *)(vendor), __VA_ARGS__) 81966291f6SArd Biesheuvel 828166ec09SArd Biesheuvel #define efi_get_handle_at(array, idx) \ 838166ec09SArd Biesheuvel (efi_is_native() ? (array)[idx] \ 848166ec09SArd Biesheuvel : (efi_handle_t)(unsigned long)((u32 *)(array))[idx]) 858166ec09SArd Biesheuvel 868166ec09SArd Biesheuvel #define efi_get_handle_num(size) \ 878166ec09SArd Biesheuvel ((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32))) 888166ec09SArd Biesheuvel 898166ec09SArd Biesheuvel #define for_each_efi_handle(handle, array, size, i) \ 908166ec09SArd Biesheuvel for (i = 0; \ 918166ec09SArd Biesheuvel i < efi_get_handle_num(size) && \ 928166ec09SArd Biesheuvel ((handle = efi_get_handle_at((array), i)) || true); \ 938166ec09SArd Biesheuvel i++) 948166ec09SArd Biesheuvel 95eed4e019SArvind Sankar static inline 96eed4e019SArvind Sankar void efi_set_u64_split(u64 data, u32 *lo, u32 *hi) 97eed4e019SArvind Sankar { 98eed4e019SArvind Sankar *lo = lower_32_bits(data); 99eed4e019SArvind Sankar *hi = upper_32_bits(data); 100eed4e019SArvind Sankar } 101eed4e019SArvind Sankar 1028166ec09SArd Biesheuvel /* 1038166ec09SArd Biesheuvel * Allocation types for calls to boottime->allocate_pages. 1048166ec09SArd Biesheuvel */ 1058166ec09SArd Biesheuvel #define EFI_ALLOCATE_ANY_PAGES 0 1068166ec09SArd Biesheuvel #define EFI_ALLOCATE_MAX_ADDRESS 1 1078166ec09SArd Biesheuvel #define EFI_ALLOCATE_ADDRESS 2 1088166ec09SArd Biesheuvel #define EFI_MAX_ALLOCATE_TYPE 3 1098166ec09SArd Biesheuvel 1108166ec09SArd Biesheuvel /* 1118166ec09SArd Biesheuvel * The type of search to perform when calling boottime->locate_handle 1128166ec09SArd Biesheuvel */ 1138166ec09SArd Biesheuvel #define EFI_LOCATE_ALL_HANDLES 0 1148166ec09SArd Biesheuvel #define EFI_LOCATE_BY_REGISTER_NOTIFY 1 1158166ec09SArd Biesheuvel #define EFI_LOCATE_BY_PROTOCOL 2 1168166ec09SArd Biesheuvel 117fd626195SLenny Szubowicz /* 1189b47c527SArvind Sankar * boottime->stall takes the time period in microseconds 1199b47c527SArvind Sankar */ 1209b47c527SArvind Sankar #define EFI_USEC_PER_SEC 1000000 1219b47c527SArvind Sankar 1229b47c527SArvind Sankar /* 1239b47c527SArvind Sankar * boottime->set_timer takes the time in 100ns units 1249b47c527SArvind Sankar */ 1259b47c527SArvind Sankar #define EFI_100NSEC_PER_USEC ((u64)10) 1269b47c527SArvind Sankar 127d1343da3SIngo Molnar /* 128fd626195SLenny Szubowicz * An efi_boot_memmap is used by efi_get_memory_map() to return the 129fd626195SLenny Szubowicz * EFI memory map in a dynamically allocated buffer. 130fd626195SLenny Szubowicz * 131fd626195SLenny Szubowicz * The buffer allocated for the EFI memory map includes extra room for 132fd626195SLenny Szubowicz * a minimum of EFI_MMAP_NR_SLACK_SLOTS additional EFI memory descriptors. 133fd626195SLenny Szubowicz * This facilitates the reuse of the EFI memory map buffer when a second 134fd626195SLenny Szubowicz * call to ExitBootServices() is needed because of intervening changes to 135fd626195SLenny Szubowicz * the EFI memory map. Other related structures, e.g. x86 e820ext, need 136fd626195SLenny Szubowicz * to factor in this headroom requirement as well. 137fd626195SLenny Szubowicz */ 138fd626195SLenny Szubowicz #define EFI_MMAP_NR_SLACK_SLOTS 8 139fd626195SLenny Szubowicz 1408166ec09SArd Biesheuvel struct efi_boot_memmap { 1418166ec09SArd Biesheuvel efi_memory_desc_t **map; 1428166ec09SArd Biesheuvel unsigned long *map_size; 1438166ec09SArd Biesheuvel unsigned long *desc_size; 1448166ec09SArd Biesheuvel u32 *desc_ver; 1458166ec09SArd Biesheuvel unsigned long *key_ptr; 1468166ec09SArd Biesheuvel unsigned long *buff_size; 1478166ec09SArd Biesheuvel }; 1488166ec09SArd Biesheuvel 149abd26868SArd Biesheuvel typedef struct efi_generic_dev_path efi_device_path_protocol_t; 150abd26868SArd Biesheuvel 1519b47c527SArvind Sankar typedef void *efi_event_t; 1529b47c527SArvind Sankar /* Note that notifications won't work in mixed mode */ 1539b47c527SArvind Sankar typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *); 1549b47c527SArvind Sankar 1559b47c527SArvind Sankar #define EFI_EVT_TIMER 0x80000000U 1569b47c527SArvind Sankar #define EFI_EVT_RUNTIME 0x40000000U 1579b47c527SArvind Sankar #define EFI_EVT_NOTIFY_WAIT 0x00000100U 1589b47c527SArvind Sankar #define EFI_EVT_NOTIFY_SIGNAL 0x00000200U 1599b47c527SArvind Sankar 1608c0a839cSHeinrich Schuchardt /** 1618c0a839cSHeinrich Schuchardt * efi_set_event_at() - add event to events array 1628c0a839cSHeinrich Schuchardt * 1638c0a839cSHeinrich Schuchardt * @events: array of UEFI events 1648c0a839cSHeinrich Schuchardt * @ids: index where to put the event in the array 1658c0a839cSHeinrich Schuchardt * @event: event to add to the aray 1668c0a839cSHeinrich Schuchardt * 1678c0a839cSHeinrich Schuchardt * boottime->wait_for_event() takes an array of events as input. 1689b47c527SArvind Sankar * Provide a helper to set it up correctly for mixed mode. 1699b47c527SArvind Sankar */ 1709b47c527SArvind Sankar static inline 1719b47c527SArvind Sankar void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event) 1729b47c527SArvind Sankar { 1739b47c527SArvind Sankar if (efi_is_native()) 1749b47c527SArvind Sankar events[idx] = event; 1759b47c527SArvind Sankar else 1769b47c527SArvind Sankar ((u32 *)events)[idx] = (u32)(unsigned long)event; 1779b47c527SArvind Sankar } 1789b47c527SArvind Sankar 1799b47c527SArvind Sankar #define EFI_TPL_APPLICATION 4 1809b47c527SArvind Sankar #define EFI_TPL_CALLBACK 8 1819b47c527SArvind Sankar #define EFI_TPL_NOTIFY 16 1829b47c527SArvind Sankar #define EFI_TPL_HIGH_LEVEL 31 1839b47c527SArvind Sankar 1849b47c527SArvind Sankar typedef enum { 1859b47c527SArvind Sankar EfiTimerCancel, 1869b47c527SArvind Sankar EfiTimerPeriodic, 1879b47c527SArvind Sankar EfiTimerRelative 1889b47c527SArvind Sankar } EFI_TIMER_DELAY; 1899b47c527SArvind Sankar 1908166ec09SArd Biesheuvel /* 1918166ec09SArd Biesheuvel * EFI Boot Services table 1928166ec09SArd Biesheuvel */ 1938166ec09SArd Biesheuvel union efi_boot_services { 1948166ec09SArd Biesheuvel struct { 1958166ec09SArd Biesheuvel efi_table_hdr_t hdr; 1968166ec09SArd Biesheuvel void *raise_tpl; 1978166ec09SArd Biesheuvel void *restore_tpl; 1988166ec09SArd Biesheuvel efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long, 1998166ec09SArd Biesheuvel efi_physical_addr_t *); 2008166ec09SArd Biesheuvel efi_status_t (__efiapi *free_pages)(efi_physical_addr_t, 2018166ec09SArd Biesheuvel unsigned long); 2028166ec09SArd Biesheuvel efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *, 2038166ec09SArd Biesheuvel unsigned long *, 2048166ec09SArd Biesheuvel unsigned long *, u32 *); 2058166ec09SArd Biesheuvel efi_status_t (__efiapi *allocate_pool)(int, unsigned long, 2068166ec09SArd Biesheuvel void **); 2078166ec09SArd Biesheuvel efi_status_t (__efiapi *free_pool)(void *); 2089b47c527SArvind Sankar efi_status_t (__efiapi *create_event)(u32, unsigned long, 2099b47c527SArvind Sankar efi_event_notify_t, void *, 2109b47c527SArvind Sankar efi_event_t *); 2119b47c527SArvind Sankar efi_status_t (__efiapi *set_timer)(efi_event_t, 2129b47c527SArvind Sankar EFI_TIMER_DELAY, u64); 2139b47c527SArvind Sankar efi_status_t (__efiapi *wait_for_event)(unsigned long, 2149b47c527SArvind Sankar efi_event_t *, 2159b47c527SArvind Sankar unsigned long *); 2168166ec09SArd Biesheuvel void *signal_event; 2179b47c527SArvind Sankar efi_status_t (__efiapi *close_event)(efi_event_t); 2188166ec09SArd Biesheuvel void *check_event; 2198166ec09SArd Biesheuvel void *install_protocol_interface; 2208166ec09SArd Biesheuvel void *reinstall_protocol_interface; 2218166ec09SArd Biesheuvel void *uninstall_protocol_interface; 2228166ec09SArd Biesheuvel efi_status_t (__efiapi *handle_protocol)(efi_handle_t, 2238166ec09SArd Biesheuvel efi_guid_t *, void **); 2248166ec09SArd Biesheuvel void *__reserved; 2258166ec09SArd Biesheuvel void *register_protocol_notify; 2268166ec09SArd Biesheuvel efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *, 2278166ec09SArd Biesheuvel void *, unsigned long *, 2288166ec09SArd Biesheuvel efi_handle_t *); 229abd26868SArd Biesheuvel efi_status_t (__efiapi *locate_device_path)(efi_guid_t *, 230abd26868SArd Biesheuvel efi_device_path_protocol_t **, 231abd26868SArd Biesheuvel efi_handle_t *); 2328166ec09SArd Biesheuvel efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *, 2338166ec09SArd Biesheuvel void *); 2348166ec09SArd Biesheuvel void *load_image; 2358166ec09SArd Biesheuvel void *start_image; 2363b8f44fcSArd Biesheuvel efi_status_t __noreturn (__efiapi *exit)(efi_handle_t, 2373b8f44fcSArd Biesheuvel efi_status_t, 2383b8f44fcSArd Biesheuvel unsigned long, 2393b8f44fcSArd Biesheuvel efi_char16_t *); 2408166ec09SArd Biesheuvel void *unload_image; 2418166ec09SArd Biesheuvel efi_status_t (__efiapi *exit_boot_services)(efi_handle_t, 2428166ec09SArd Biesheuvel unsigned long); 2438166ec09SArd Biesheuvel void *get_next_monotonic_count; 2449b47c527SArvind Sankar efi_status_t (__efiapi *stall)(unsigned long); 2458166ec09SArd Biesheuvel void *set_watchdog_timer; 2468166ec09SArd Biesheuvel void *connect_controller; 2478166ec09SArd Biesheuvel efi_status_t (__efiapi *disconnect_controller)(efi_handle_t, 2488166ec09SArd Biesheuvel efi_handle_t, 2498166ec09SArd Biesheuvel efi_handle_t); 2508166ec09SArd Biesheuvel void *open_protocol; 2518166ec09SArd Biesheuvel void *close_protocol; 2528166ec09SArd Biesheuvel void *open_protocol_information; 2538166ec09SArd Biesheuvel void *protocols_per_handle; 2548166ec09SArd Biesheuvel void *locate_handle_buffer; 2558166ec09SArd Biesheuvel efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *, 2568166ec09SArd Biesheuvel void **); 2578166ec09SArd Biesheuvel void *install_multiple_protocol_interfaces; 2588166ec09SArd Biesheuvel void *uninstall_multiple_protocol_interfaces; 2598166ec09SArd Biesheuvel void *calculate_crc32; 2608166ec09SArd Biesheuvel void *copy_mem; 2618166ec09SArd Biesheuvel void *set_mem; 2628166ec09SArd Biesheuvel void *create_event_ex; 2638166ec09SArd Biesheuvel }; 2648166ec09SArd Biesheuvel struct { 2658166ec09SArd Biesheuvel efi_table_hdr_t hdr; 2668166ec09SArd Biesheuvel u32 raise_tpl; 2678166ec09SArd Biesheuvel u32 restore_tpl; 2688166ec09SArd Biesheuvel u32 allocate_pages; 2698166ec09SArd Biesheuvel u32 free_pages; 2708166ec09SArd Biesheuvel u32 get_memory_map; 2718166ec09SArd Biesheuvel u32 allocate_pool; 2728166ec09SArd Biesheuvel u32 free_pool; 2738166ec09SArd Biesheuvel u32 create_event; 2748166ec09SArd Biesheuvel u32 set_timer; 2758166ec09SArd Biesheuvel u32 wait_for_event; 2768166ec09SArd Biesheuvel u32 signal_event; 2778166ec09SArd Biesheuvel u32 close_event; 2788166ec09SArd Biesheuvel u32 check_event; 2798166ec09SArd Biesheuvel u32 install_protocol_interface; 2808166ec09SArd Biesheuvel u32 reinstall_protocol_interface; 2818166ec09SArd Biesheuvel u32 uninstall_protocol_interface; 2828166ec09SArd Biesheuvel u32 handle_protocol; 2838166ec09SArd Biesheuvel u32 __reserved; 2848166ec09SArd Biesheuvel u32 register_protocol_notify; 2858166ec09SArd Biesheuvel u32 locate_handle; 2868166ec09SArd Biesheuvel u32 locate_device_path; 2878166ec09SArd Biesheuvel u32 install_configuration_table; 2888166ec09SArd Biesheuvel u32 load_image; 2898166ec09SArd Biesheuvel u32 start_image; 2908166ec09SArd Biesheuvel u32 exit; 2918166ec09SArd Biesheuvel u32 unload_image; 2928166ec09SArd Biesheuvel u32 exit_boot_services; 2938166ec09SArd Biesheuvel u32 get_next_monotonic_count; 2948166ec09SArd Biesheuvel u32 stall; 2958166ec09SArd Biesheuvel u32 set_watchdog_timer; 2968166ec09SArd Biesheuvel u32 connect_controller; 2978166ec09SArd Biesheuvel u32 disconnect_controller; 2988166ec09SArd Biesheuvel u32 open_protocol; 2998166ec09SArd Biesheuvel u32 close_protocol; 3008166ec09SArd Biesheuvel u32 open_protocol_information; 3018166ec09SArd Biesheuvel u32 protocols_per_handle; 3028166ec09SArd Biesheuvel u32 locate_handle_buffer; 3038166ec09SArd Biesheuvel u32 locate_protocol; 3048166ec09SArd Biesheuvel u32 install_multiple_protocol_interfaces; 3058166ec09SArd Biesheuvel u32 uninstall_multiple_protocol_interfaces; 3068166ec09SArd Biesheuvel u32 calculate_crc32; 3078166ec09SArd Biesheuvel u32 copy_mem; 3088166ec09SArd Biesheuvel u32 set_mem; 3098166ec09SArd Biesheuvel u32 create_event_ex; 3108166ec09SArd Biesheuvel } mixed_mode; 3118166ec09SArd Biesheuvel }; 3128166ec09SArd Biesheuvel 313c2d0b470SArd Biesheuvel typedef union efi_uga_draw_protocol efi_uga_draw_protocol_t; 314c2d0b470SArd Biesheuvel 315c2d0b470SArd Biesheuvel union efi_uga_draw_protocol { 316c2d0b470SArd Biesheuvel struct { 317c2d0b470SArd Biesheuvel efi_status_t (__efiapi *get_mode)(efi_uga_draw_protocol_t *, 318c2d0b470SArd Biesheuvel u32*, u32*, u32*, u32*); 319c2d0b470SArd Biesheuvel void *set_mode; 320c2d0b470SArd Biesheuvel void *blt; 321c2d0b470SArd Biesheuvel }; 322c2d0b470SArd Biesheuvel struct { 323c2d0b470SArd Biesheuvel u32 get_mode; 324c2d0b470SArd Biesheuvel u32 set_mode; 325c2d0b470SArd Biesheuvel u32 blt; 326c2d0b470SArd Biesheuvel } mixed_mode; 327c2d0b470SArd Biesheuvel }; 328c2d0b470SArd Biesheuvel 3299b47c527SArvind Sankar typedef struct { 3309b47c527SArvind Sankar u16 scan_code; 3319b47c527SArvind Sankar efi_char16_t unicode_char; 3329b47c527SArvind Sankar } efi_input_key_t; 3339b47c527SArvind Sankar 3349b47c527SArvind Sankar union efi_simple_text_input_protocol { 3359b47c527SArvind Sankar struct { 3369b47c527SArvind Sankar void *reset; 3379b47c527SArvind Sankar efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *, 3389b47c527SArvind Sankar efi_input_key_t *); 3399b47c527SArvind Sankar efi_event_t wait_for_key; 3409b47c527SArvind Sankar }; 3419b47c527SArvind Sankar struct { 3429b47c527SArvind Sankar u32 reset; 3439b47c527SArvind Sankar u32 read_keystroke; 3449b47c527SArvind Sankar u32 wait_for_key; 3459b47c527SArvind Sankar } mixed_mode; 3469b47c527SArvind Sankar }; 3479b47c527SArvind Sankar 34814c574f3SArvind Sankar efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key); 34914c574f3SArvind Sankar 3508166ec09SArd Biesheuvel union efi_simple_text_output_protocol { 3518166ec09SArd Biesheuvel struct { 3528166ec09SArd Biesheuvel void *reset; 3538166ec09SArd Biesheuvel efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *, 3548166ec09SArd Biesheuvel efi_char16_t *); 3558166ec09SArd Biesheuvel void *test_string; 3568166ec09SArd Biesheuvel }; 3578166ec09SArd Biesheuvel struct { 3588166ec09SArd Biesheuvel u32 reset; 3598166ec09SArd Biesheuvel u32 output_string; 3608166ec09SArd Biesheuvel u32 test_string; 3618166ec09SArd Biesheuvel } mixed_mode; 3628166ec09SArd Biesheuvel }; 3638166ec09SArd Biesheuvel 3648166ec09SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0 3658166ec09SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1 3668166ec09SArd Biesheuvel #define PIXEL_BIT_MASK 2 3678166ec09SArd Biesheuvel #define PIXEL_BLT_ONLY 3 3688166ec09SArd Biesheuvel #define PIXEL_FORMAT_MAX 4 3698166ec09SArd Biesheuvel 3708166ec09SArd Biesheuvel typedef struct { 3718166ec09SArd Biesheuvel u32 red_mask; 3728166ec09SArd Biesheuvel u32 green_mask; 3738166ec09SArd Biesheuvel u32 blue_mask; 3748166ec09SArd Biesheuvel u32 reserved_mask; 3758166ec09SArd Biesheuvel } efi_pixel_bitmask_t; 3768166ec09SArd Biesheuvel 3778166ec09SArd Biesheuvel typedef struct { 3788166ec09SArd Biesheuvel u32 version; 3798166ec09SArd Biesheuvel u32 horizontal_resolution; 3808166ec09SArd Biesheuvel u32 vertical_resolution; 3818166ec09SArd Biesheuvel int pixel_format; 3828166ec09SArd Biesheuvel efi_pixel_bitmask_t pixel_information; 3838166ec09SArd Biesheuvel u32 pixels_per_scan_line; 3848166ec09SArd Biesheuvel } efi_graphics_output_mode_info_t; 3858166ec09SArd Biesheuvel 3868166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t; 3878166ec09SArd Biesheuvel 3888166ec09SArd Biesheuvel union efi_graphics_output_protocol_mode { 3898166ec09SArd Biesheuvel struct { 3908166ec09SArd Biesheuvel u32 max_mode; 3918166ec09SArd Biesheuvel u32 mode; 3928166ec09SArd Biesheuvel efi_graphics_output_mode_info_t *info; 3938166ec09SArd Biesheuvel unsigned long size_of_info; 3948166ec09SArd Biesheuvel efi_physical_addr_t frame_buffer_base; 3958166ec09SArd Biesheuvel unsigned long frame_buffer_size; 3968166ec09SArd Biesheuvel }; 3978166ec09SArd Biesheuvel struct { 3988166ec09SArd Biesheuvel u32 max_mode; 3998166ec09SArd Biesheuvel u32 mode; 4008166ec09SArd Biesheuvel u32 info; 4018166ec09SArd Biesheuvel u32 size_of_info; 4028166ec09SArd Biesheuvel u64 frame_buffer_base; 4038166ec09SArd Biesheuvel u32 frame_buffer_size; 4048166ec09SArd Biesheuvel } mixed_mode; 4058166ec09SArd Biesheuvel }; 4068166ec09SArd Biesheuvel 4078166ec09SArd Biesheuvel typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t; 4088166ec09SArd Biesheuvel 4098166ec09SArd Biesheuvel union efi_graphics_output_protocol { 4108166ec09SArd Biesheuvel struct { 411b4b89a02SArvind Sankar efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *, 412b4b89a02SArvind Sankar u32, unsigned long *, 413b4b89a02SArvind Sankar efi_graphics_output_mode_info_t **); 414b4b89a02SArvind Sankar efi_status_t (__efiapi *set_mode) (efi_graphics_output_protocol_t *, u32); 4158166ec09SArd Biesheuvel void *blt; 4168166ec09SArd Biesheuvel efi_graphics_output_protocol_mode_t *mode; 4178166ec09SArd Biesheuvel }; 4188166ec09SArd Biesheuvel struct { 4198166ec09SArd Biesheuvel u32 query_mode; 4208166ec09SArd Biesheuvel u32 set_mode; 4218166ec09SArd Biesheuvel u32 blt; 4228166ec09SArd Biesheuvel u32 mode; 4238166ec09SArd Biesheuvel } mixed_mode; 4248166ec09SArd Biesheuvel }; 4258166ec09SArd Biesheuvel 426f7b85b33SArd Biesheuvel typedef union { 427f7b85b33SArd Biesheuvel struct { 428a46a290aSArd Biesheuvel u32 revision; 429a46a290aSArd Biesheuvel efi_handle_t parent_handle; 430a46a290aSArd Biesheuvel efi_system_table_t *system_table; 431a46a290aSArd Biesheuvel efi_handle_t device_handle; 432a46a290aSArd Biesheuvel void *file_path; 433a46a290aSArd Biesheuvel void *reserved; 434a46a290aSArd Biesheuvel u32 load_options_size; 435a46a290aSArd Biesheuvel void *load_options; 436a46a290aSArd Biesheuvel void *image_base; 437a46a290aSArd Biesheuvel __aligned_u64 image_size; 438a46a290aSArd Biesheuvel unsigned int image_code_type; 439a46a290aSArd Biesheuvel unsigned int image_data_type; 440a46a290aSArd Biesheuvel efi_status_t (__efiapi *unload)(efi_handle_t image_handle); 441f7b85b33SArd Biesheuvel }; 442f7b85b33SArd Biesheuvel struct { 443f7b85b33SArd Biesheuvel u32 revision; 444f7b85b33SArd Biesheuvel u32 parent_handle; 445f7b85b33SArd Biesheuvel u32 system_table; 446f7b85b33SArd Biesheuvel u32 device_handle; 447f7b85b33SArd Biesheuvel u32 file_path; 448f7b85b33SArd Biesheuvel u32 reserved; 449f7b85b33SArd Biesheuvel u32 load_options_size; 450f7b85b33SArd Biesheuvel u32 load_options; 451f7b85b33SArd Biesheuvel u32 image_base; 452f7b85b33SArd Biesheuvel __aligned_u64 image_size; 453f7b85b33SArd Biesheuvel u32 image_code_type; 454f7b85b33SArd Biesheuvel u32 image_data_type; 455f7b85b33SArd Biesheuvel u32 unload; 456f7b85b33SArd Biesheuvel } mixed_mode; 457a46a290aSArd Biesheuvel } efi_loaded_image_t; 458a46a290aSArd Biesheuvel 459a46a290aSArd Biesheuvel typedef struct { 460a46a290aSArd Biesheuvel u64 size; 461a46a290aSArd Biesheuvel u64 file_size; 462a46a290aSArd Biesheuvel u64 phys_size; 463a46a290aSArd Biesheuvel efi_time_t create_time; 464a46a290aSArd Biesheuvel efi_time_t last_access_time; 465a46a290aSArd Biesheuvel efi_time_t modification_time; 466a46a290aSArd Biesheuvel __aligned_u64 attribute; 4679302c1bbSArd Biesheuvel efi_char16_t filename[]; 468a46a290aSArd Biesheuvel } efi_file_info_t; 469a46a290aSArd Biesheuvel 470a46a290aSArd Biesheuvel typedef struct efi_file_protocol efi_file_protocol_t; 471a46a290aSArd Biesheuvel 472a46a290aSArd Biesheuvel struct efi_file_protocol { 473a46a290aSArd Biesheuvel u64 revision; 474a46a290aSArd Biesheuvel efi_status_t (__efiapi *open) (efi_file_protocol_t *, 475a46a290aSArd Biesheuvel efi_file_protocol_t **, 476a46a290aSArd Biesheuvel efi_char16_t *, u64, u64); 477a46a290aSArd Biesheuvel efi_status_t (__efiapi *close) (efi_file_protocol_t *); 478a46a290aSArd Biesheuvel efi_status_t (__efiapi *delete) (efi_file_protocol_t *); 479a46a290aSArd Biesheuvel efi_status_t (__efiapi *read) (efi_file_protocol_t *, 480a46a290aSArd Biesheuvel unsigned long *, void *); 481a46a290aSArd Biesheuvel efi_status_t (__efiapi *write) (efi_file_protocol_t *, 482a46a290aSArd Biesheuvel unsigned long, void *); 483a46a290aSArd Biesheuvel efi_status_t (__efiapi *get_position)(efi_file_protocol_t *, u64 *); 484a46a290aSArd Biesheuvel efi_status_t (__efiapi *set_position)(efi_file_protocol_t *, u64); 485a46a290aSArd Biesheuvel efi_status_t (__efiapi *get_info) (efi_file_protocol_t *, 486a46a290aSArd Biesheuvel efi_guid_t *, unsigned long *, 487a46a290aSArd Biesheuvel void *); 488a46a290aSArd Biesheuvel efi_status_t (__efiapi *set_info) (efi_file_protocol_t *, 489a46a290aSArd Biesheuvel efi_guid_t *, unsigned long, 490a46a290aSArd Biesheuvel void *); 491a46a290aSArd Biesheuvel efi_status_t (__efiapi *flush) (efi_file_protocol_t *); 492a46a290aSArd Biesheuvel }; 493a46a290aSArd Biesheuvel 494a46a290aSArd Biesheuvel typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t; 495a46a290aSArd Biesheuvel 496a46a290aSArd Biesheuvel struct efi_simple_file_system_protocol { 497a46a290aSArd Biesheuvel u64 revision; 498a46a290aSArd Biesheuvel int (__efiapi *open_volume)(efi_simple_file_system_protocol_t *, 499a46a290aSArd Biesheuvel efi_file_protocol_t **); 500a46a290aSArd Biesheuvel }; 501a46a290aSArd Biesheuvel 502a46a290aSArd Biesheuvel #define EFI_FILE_MODE_READ 0x0000000000000001 503a46a290aSArd Biesheuvel #define EFI_FILE_MODE_WRITE 0x0000000000000002 504a46a290aSArd Biesheuvel #define EFI_FILE_MODE_CREATE 0x8000000000000000 505a46a290aSArd Biesheuvel 5068166ec09SArd Biesheuvel typedef enum { 5078166ec09SArd Biesheuvel EfiPciIoWidthUint8, 5088166ec09SArd Biesheuvel EfiPciIoWidthUint16, 5098166ec09SArd Biesheuvel EfiPciIoWidthUint32, 5108166ec09SArd Biesheuvel EfiPciIoWidthUint64, 5118166ec09SArd Biesheuvel EfiPciIoWidthFifoUint8, 5128166ec09SArd Biesheuvel EfiPciIoWidthFifoUint16, 5138166ec09SArd Biesheuvel EfiPciIoWidthFifoUint32, 5148166ec09SArd Biesheuvel EfiPciIoWidthFifoUint64, 5158166ec09SArd Biesheuvel EfiPciIoWidthFillUint8, 5168166ec09SArd Biesheuvel EfiPciIoWidthFillUint16, 5178166ec09SArd Biesheuvel EfiPciIoWidthFillUint32, 5188166ec09SArd Biesheuvel EfiPciIoWidthFillUint64, 5198166ec09SArd Biesheuvel EfiPciIoWidthMaximum 5208166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_WIDTH; 5218166ec09SArd Biesheuvel 5228166ec09SArd Biesheuvel typedef enum { 5238166ec09SArd Biesheuvel EfiPciIoAttributeOperationGet, 5248166ec09SArd Biesheuvel EfiPciIoAttributeOperationSet, 5258166ec09SArd Biesheuvel EfiPciIoAttributeOperationEnable, 5268166ec09SArd Biesheuvel EfiPciIoAttributeOperationDisable, 5278166ec09SArd Biesheuvel EfiPciIoAttributeOperationSupported, 5288166ec09SArd Biesheuvel EfiPciIoAttributeOperationMaximum 5298166ec09SArd Biesheuvel } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION; 5308166ec09SArd Biesheuvel 5318166ec09SArd Biesheuvel typedef struct { 5328166ec09SArd Biesheuvel u32 read; 5338166ec09SArd Biesheuvel u32 write; 5348166ec09SArd Biesheuvel } efi_pci_io_protocol_access_32_t; 5358166ec09SArd Biesheuvel 5368166ec09SArd Biesheuvel typedef union efi_pci_io_protocol efi_pci_io_protocol_t; 5378166ec09SArd Biesheuvel 5388166ec09SArd Biesheuvel typedef 5398166ec09SArd Biesheuvel efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *, 5408166ec09SArd Biesheuvel EFI_PCI_IO_PROTOCOL_WIDTH, 5418166ec09SArd Biesheuvel u32 offset, 5428166ec09SArd Biesheuvel unsigned long count, 5438166ec09SArd Biesheuvel void *buffer); 5448166ec09SArd Biesheuvel 5458166ec09SArd Biesheuvel typedef struct { 5468166ec09SArd Biesheuvel void *read; 5478166ec09SArd Biesheuvel void *write; 5488166ec09SArd Biesheuvel } efi_pci_io_protocol_access_t; 5498166ec09SArd Biesheuvel 5508166ec09SArd Biesheuvel typedef struct { 5518166ec09SArd Biesheuvel efi_pci_io_protocol_cfg_t read; 5528166ec09SArd Biesheuvel efi_pci_io_protocol_cfg_t write; 5538166ec09SArd Biesheuvel } efi_pci_io_protocol_config_access_t; 5548166ec09SArd Biesheuvel 5558166ec09SArd Biesheuvel union efi_pci_io_protocol { 5568166ec09SArd Biesheuvel struct { 5578166ec09SArd Biesheuvel void *poll_mem; 5588166ec09SArd Biesheuvel void *poll_io; 5598166ec09SArd Biesheuvel efi_pci_io_protocol_access_t mem; 5608166ec09SArd Biesheuvel efi_pci_io_protocol_access_t io; 5618166ec09SArd Biesheuvel efi_pci_io_protocol_config_access_t pci; 5628166ec09SArd Biesheuvel void *copy_mem; 5638166ec09SArd Biesheuvel void *map; 5648166ec09SArd Biesheuvel void *unmap; 5658166ec09SArd Biesheuvel void *allocate_buffer; 5668166ec09SArd Biesheuvel void *free_buffer; 5678166ec09SArd Biesheuvel void *flush; 5688166ec09SArd Biesheuvel efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *, 5698166ec09SArd Biesheuvel unsigned long *segment_nr, 5708166ec09SArd Biesheuvel unsigned long *bus_nr, 5718166ec09SArd Biesheuvel unsigned long *device_nr, 5728166ec09SArd Biesheuvel unsigned long *func_nr); 5738166ec09SArd Biesheuvel void *attributes; 5748166ec09SArd Biesheuvel void *get_bar_attributes; 5758166ec09SArd Biesheuvel void *set_bar_attributes; 5768166ec09SArd Biesheuvel uint64_t romsize; 5778166ec09SArd Biesheuvel void *romimage; 5788166ec09SArd Biesheuvel }; 5798166ec09SArd Biesheuvel struct { 5808166ec09SArd Biesheuvel u32 poll_mem; 5818166ec09SArd Biesheuvel u32 poll_io; 5828166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t mem; 5838166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t io; 5848166ec09SArd Biesheuvel efi_pci_io_protocol_access_32_t pci; 5858166ec09SArd Biesheuvel u32 copy_mem; 5868166ec09SArd Biesheuvel u32 map; 5878166ec09SArd Biesheuvel u32 unmap; 5888166ec09SArd Biesheuvel u32 allocate_buffer; 5898166ec09SArd Biesheuvel u32 free_buffer; 5908166ec09SArd Biesheuvel u32 flush; 5918166ec09SArd Biesheuvel u32 get_location; 5928166ec09SArd Biesheuvel u32 attributes; 5938166ec09SArd Biesheuvel u32 get_bar_attributes; 5948166ec09SArd Biesheuvel u32 set_bar_attributes; 5958166ec09SArd Biesheuvel u64 romsize; 5968166ec09SArd Biesheuvel u32 romimage; 5978166ec09SArd Biesheuvel } mixed_mode; 5988166ec09SArd Biesheuvel }; 5998166ec09SArd Biesheuvel 6008166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001 6018166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002 6028166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004 6038166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008 6048166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010 6058166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020 6068166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040 6078166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080 6088166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100 6098166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200 6108166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400 6118166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800 6128166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000 6138166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000 6148166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000 6158166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 6168166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000 6178166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 6188166ec09SArd Biesheuvel #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000 6198166ec09SArd Biesheuvel 6208166ec09SArd Biesheuvel struct efi_dev_path; 6218166ec09SArd Biesheuvel 6228166ec09SArd Biesheuvel typedef union apple_properties_protocol apple_properties_protocol_t; 6238166ec09SArd Biesheuvel 6248166ec09SArd Biesheuvel union apple_properties_protocol { 6258166ec09SArd Biesheuvel struct { 6268166ec09SArd Biesheuvel unsigned long version; 6278166ec09SArd Biesheuvel efi_status_t (__efiapi *get)(apple_properties_protocol_t *, 6288166ec09SArd Biesheuvel struct efi_dev_path *, 6298166ec09SArd Biesheuvel efi_char16_t *, void *, u32 *); 6308166ec09SArd Biesheuvel efi_status_t (__efiapi *set)(apple_properties_protocol_t *, 6318166ec09SArd Biesheuvel struct efi_dev_path *, 6328166ec09SArd Biesheuvel efi_char16_t *, void *, u32); 6338166ec09SArd Biesheuvel efi_status_t (__efiapi *del)(apple_properties_protocol_t *, 6348166ec09SArd Biesheuvel struct efi_dev_path *, 6358166ec09SArd Biesheuvel efi_char16_t *); 6368166ec09SArd Biesheuvel efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *, 6378166ec09SArd Biesheuvel void *buffer, u32 *); 6388166ec09SArd Biesheuvel }; 6398166ec09SArd Biesheuvel struct { 6408166ec09SArd Biesheuvel u32 version; 6418166ec09SArd Biesheuvel u32 get; 6428166ec09SArd Biesheuvel u32 set; 6438166ec09SArd Biesheuvel u32 del; 6448166ec09SArd Biesheuvel u32 get_all; 6458166ec09SArd Biesheuvel } mixed_mode; 6468166ec09SArd Biesheuvel }; 6478166ec09SArd Biesheuvel 6488166ec09SArd Biesheuvel typedef u32 efi_tcg2_event_log_format; 6498166ec09SArd Biesheuvel 6508166ec09SArd Biesheuvel typedef union efi_tcg2_protocol efi_tcg2_protocol_t; 6518166ec09SArd Biesheuvel 6528166ec09SArd Biesheuvel union efi_tcg2_protocol { 6538166ec09SArd Biesheuvel struct { 6548166ec09SArd Biesheuvel void *get_capability; 6558166ec09SArd Biesheuvel efi_status_t (__efiapi *get_event_log)(efi_handle_t, 6568166ec09SArd Biesheuvel efi_tcg2_event_log_format, 6578166ec09SArd Biesheuvel efi_physical_addr_t *, 6588166ec09SArd Biesheuvel efi_physical_addr_t *, 6598166ec09SArd Biesheuvel efi_bool_t *); 6608166ec09SArd Biesheuvel void *hash_log_extend_event; 6618166ec09SArd Biesheuvel void *submit_command; 6628166ec09SArd Biesheuvel void *get_active_pcr_banks; 6638166ec09SArd Biesheuvel void *set_active_pcr_banks; 6648166ec09SArd Biesheuvel void *get_result_of_set_active_pcr_banks; 6658166ec09SArd Biesheuvel }; 6668166ec09SArd Biesheuvel struct { 6678166ec09SArd Biesheuvel u32 get_capability; 6688166ec09SArd Biesheuvel u32 get_event_log; 6698166ec09SArd Biesheuvel u32 hash_log_extend_event; 6708166ec09SArd Biesheuvel u32 submit_command; 6718166ec09SArd Biesheuvel u32 get_active_pcr_banks; 6728166ec09SArd Biesheuvel u32 set_active_pcr_banks; 6738166ec09SArd Biesheuvel u32 get_result_of_set_active_pcr_banks; 6748166ec09SArd Biesheuvel } mixed_mode; 6758166ec09SArd Biesheuvel }; 6768166ec09SArd Biesheuvel 6772931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file_protocol_t; 6782931d526SArd Biesheuvel typedef union efi_load_file_protocol efi_load_file2_protocol_t; 6792931d526SArd Biesheuvel 6802931d526SArd Biesheuvel union efi_load_file_protocol { 6812931d526SArd Biesheuvel struct { 6822931d526SArd Biesheuvel efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *, 6832931d526SArd Biesheuvel efi_device_path_protocol_t *, 6842931d526SArd Biesheuvel bool, unsigned long *, void *); 6852931d526SArd Biesheuvel }; 6862931d526SArd Biesheuvel struct { 6872931d526SArd Biesheuvel u32 load_file; 6882931d526SArd Biesheuvel } mixed_mode; 6892931d526SArd Biesheuvel }; 6902931d526SArd Biesheuvel 6918166ec09SArd Biesheuvel void efi_pci_disable_bridge_busmaster(void); 6928166ec09SArd Biesheuvel 6938166ec09SArd Biesheuvel typedef efi_status_t (*efi_exit_boot_map_processing)( 6948166ec09SArd Biesheuvel struct efi_boot_memmap *map, 6958166ec09SArd Biesheuvel void *priv); 6968166ec09SArd Biesheuvel 6978166ec09SArd Biesheuvel efi_status_t efi_exit_boot_services(void *handle, 6988166ec09SArd Biesheuvel struct efi_boot_memmap *map, 6998166ec09SArd Biesheuvel void *priv, 7008166ec09SArd Biesheuvel efi_exit_boot_map_processing priv_func); 7018166ec09SArd Biesheuvel 7028166ec09SArd Biesheuvel efi_status_t allocate_new_fdt_and_exit_boot(void *handle, 7038166ec09SArd Biesheuvel unsigned long *new_fdt_addr, 7048166ec09SArd Biesheuvel unsigned long max_addr, 7058166ec09SArd Biesheuvel u64 initrd_addr, u64 initrd_size, 7068166ec09SArd Biesheuvel char *cmdline_ptr, 7078166ec09SArd Biesheuvel unsigned long fdt_addr, 7088166ec09SArd Biesheuvel unsigned long fdt_size); 7098166ec09SArd Biesheuvel 7108166ec09SArd Biesheuvel void *get_fdt(unsigned long *fdt_size); 7118166ec09SArd Biesheuvel 7128166ec09SArd Biesheuvel void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size, 7138166ec09SArd Biesheuvel unsigned long desc_size, efi_memory_desc_t *runtime_map, 7148166ec09SArd Biesheuvel int *count); 7158166ec09SArd Biesheuvel 7168166ec09SArd Biesheuvel efi_status_t efi_get_random_bytes(unsigned long size, u8 *out); 7178166ec09SArd Biesheuvel 7188166ec09SArd Biesheuvel efi_status_t efi_random_alloc(unsigned long size, unsigned long align, 7198166ec09SArd Biesheuvel unsigned long *addr, unsigned long random_seed); 7208166ec09SArd Biesheuvel 7218166ec09SArd Biesheuvel efi_status_t check_platform_features(void); 7228166ec09SArd Biesheuvel 7238166ec09SArd Biesheuvel void *get_efi_config_table(efi_guid_t guid); 7248166ec09SArd Biesheuvel 725cb8c90a0SArvind Sankar /* NOTE: These functions do not print a trailing newline after the string */ 726cb8c90a0SArvind Sankar void efi_char16_puts(efi_char16_t *); 727cb8c90a0SArvind Sankar void efi_puts(const char *str); 7288166ec09SArd Biesheuvel 7292c7d1e30SArvind Sankar __printf(1, 2) int efi_printk(char const *fmt, ...); 7308166ec09SArd Biesheuvel 7318166ec09SArd Biesheuvel void efi_free(unsigned long size, unsigned long addr); 7328166ec09SArd Biesheuvel 73327cd5511SArd Biesheuvel char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len); 7348166ec09SArd Biesheuvel 7358166ec09SArd Biesheuvel efi_status_t efi_get_memory_map(struct efi_boot_memmap *map); 7368166ec09SArd Biesheuvel 7378166ec09SArd Biesheuvel efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr, 7388166ec09SArd Biesheuvel unsigned long max); 7398166ec09SArd Biesheuvel 74043b1df0eSArd Biesheuvel efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr, 74143b1df0eSArd Biesheuvel unsigned long max, unsigned long align); 74243b1df0eSArd Biesheuvel 7438166ec09SArd Biesheuvel efi_status_t efi_relocate_kernel(unsigned long *image_addr, 7448166ec09SArd Biesheuvel unsigned long image_size, 7458166ec09SArd Biesheuvel unsigned long alloc_size, 7468166ec09SArd Biesheuvel unsigned long preferred_addr, 7478166ec09SArd Biesheuvel unsigned long alignment, 7488166ec09SArd Biesheuvel unsigned long min_addr); 7498166ec09SArd Biesheuvel 7508166ec09SArd Biesheuvel efi_status_t efi_parse_options(char const *cmdline); 7518166ec09SArd Biesheuvel 752fffb6804SArvind Sankar void efi_parse_option_graphics(char *option); 753fffb6804SArvind Sankar 7548166ec09SArd Biesheuvel efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto, 7558166ec09SArd Biesheuvel unsigned long size); 7568166ec09SArd Biesheuvel 757cf6b8366SArd Biesheuvel efi_status_t handle_cmdline_files(efi_loaded_image_t *image, 758cf6b8366SArd Biesheuvel const efi_char16_t *optstr, 759cf6b8366SArd Biesheuvel int optstr_size, 760cf6b8366SArd Biesheuvel unsigned long soft_limit, 761cf6b8366SArd Biesheuvel unsigned long hard_limit, 7629302c1bbSArd Biesheuvel unsigned long *load_addr, 7639302c1bbSArd Biesheuvel unsigned long *load_size); 7649302c1bbSArd Biesheuvel 765cf6b8366SArd Biesheuvel 766cf6b8366SArd Biesheuvel static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image, 767cf6b8366SArd Biesheuvel unsigned long *load_addr, 768cf6b8366SArd Biesheuvel unsigned long *load_size) 769cf6b8366SArd Biesheuvel { 770cf6b8366SArd Biesheuvel return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2, 771cf6b8366SArd Biesheuvel ULONG_MAX, ULONG_MAX, load_addr, load_size); 772cf6b8366SArd Biesheuvel } 773cf6b8366SArd Biesheuvel 774f61900fdSArvind Sankar efi_status_t efi_load_initrd(efi_loaded_image_t *image, 7759302c1bbSArd Biesheuvel unsigned long *load_addr, 7769302c1bbSArd Biesheuvel unsigned long *load_size, 77731f5e546SArd Biesheuvel unsigned long soft_limit, 778f61900fdSArvind Sankar unsigned long hard_limit); 7793230d95cSAtish Patra /* 7803230d95cSAtish Patra * This function handles the architcture specific differences between arm and 7813230d95cSAtish Patra * arm64 regarding where the kernel image must be loaded and any memory that 7823230d95cSAtish Patra * must be reserved. On failure it is required to free all 7833230d95cSAtish Patra * all allocations it has made. 7843230d95cSAtish Patra */ 7853230d95cSAtish Patra efi_status_t handle_kernel_image(unsigned long *image_addr, 7863230d95cSAtish Patra unsigned long *image_size, 7873230d95cSAtish Patra unsigned long *reserve_addr, 7883230d95cSAtish Patra unsigned long *reserve_size, 7893230d95cSAtish Patra unsigned long dram_base, 7903230d95cSAtish Patra efi_loaded_image_t *image); 7913230d95cSAtish Patra 7923230d95cSAtish Patra asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint, 7933230d95cSAtish Patra unsigned long fdt_addr, 7943230d95cSAtish Patra unsigned long fdt_size); 795ec93fc37SArd Biesheuvel 7962a55280aSArd Biesheuvel void efi_handle_post_ebs_state(void); 7972a55280aSArd Biesheuvel 798f4f75ad5SArd Biesheuvel #endif 799