1c3770197SVarad Gautam /* SPDX-License-Identifier: GPL-2.0 */ 2c3770197SVarad Gautam /* Relevant definitions from linux/efi.h. */ 3c3770197SVarad Gautam 4c3770197SVarad Gautam #ifndef __LINUX_UEFI_H 5c3770197SVarad Gautam #define __LINUX_UEFI_H 6c3770197SVarad Gautam 7ad5fb883SZixuan Wang #include "libcflat.h" 8ad5fb883SZixuan Wang 9ad5fb883SZixuan Wang #ifndef __packed 10ad5fb883SZixuan Wang # define __packed __attribute__((__packed__)) 11ad5fb883SZixuan Wang #endif 12ad5fb883SZixuan Wang 13c3770197SVarad Gautam #define BITS_PER_LONG 64 14c3770197SVarad Gautam 15529ab889SNikos Nikoleris #define EFI_ERROR(a) (((int64_t) a) < 0) 16c3770197SVarad Gautam #define EFI_SUCCESS 0 17c3770197SVarad Gautam #define EFI_LOAD_ERROR ( 1 | (1UL << (BITS_PER_LONG-1))) 18c3770197SVarad Gautam #define EFI_INVALID_PARAMETER ( 2 | (1UL << (BITS_PER_LONG-1))) 19c3770197SVarad Gautam #define EFI_UNSUPPORTED ( 3 | (1UL << (BITS_PER_LONG-1))) 20c3770197SVarad Gautam #define EFI_BAD_BUFFER_SIZE ( 4 | (1UL << (BITS_PER_LONG-1))) 21c3770197SVarad Gautam #define EFI_BUFFER_TOO_SMALL ( 5 | (1UL << (BITS_PER_LONG-1))) 22c3770197SVarad Gautam #define EFI_NOT_READY ( 6 | (1UL << (BITS_PER_LONG-1))) 23c3770197SVarad Gautam #define EFI_DEVICE_ERROR ( 7 | (1UL << (BITS_PER_LONG-1))) 24c3770197SVarad Gautam #define EFI_WRITE_PROTECTED ( 8 | (1UL << (BITS_PER_LONG-1))) 25c3770197SVarad Gautam #define EFI_OUT_OF_RESOURCES ( 9 | (1UL << (BITS_PER_LONG-1))) 26c3770197SVarad Gautam #define EFI_NOT_FOUND (14 | (1UL << (BITS_PER_LONG-1))) 27c3770197SVarad Gautam #define EFI_TIMEOUT (18 | (1UL << (BITS_PER_LONG-1))) 28c3770197SVarad Gautam #define EFI_ABORTED (21 | (1UL << (BITS_PER_LONG-1))) 29c3770197SVarad Gautam #define EFI_SECURITY_VIOLATION (26 | (1UL << (BITS_PER_LONG-1))) 30c3770197SVarad Gautam 31c3770197SVarad Gautam typedef unsigned long efi_status_t; 32c3770197SVarad Gautam typedef u8 efi_bool_t; 33c3770197SVarad Gautam typedef u16 efi_char16_t; /* UNICODE character */ 34c3770197SVarad Gautam typedef u64 efi_physical_addr_t; 35c3770197SVarad Gautam typedef void *efi_handle_t; 36c3770197SVarad Gautam 37*f49151beSNikos Nikoleris #ifdef __x86_64__ 38c3770197SVarad Gautam #define __efiapi __attribute__((ms_abi)) 39*f49151beSNikos Nikoleris #else 40*f49151beSNikos Nikoleris #define __efiapi 41*f49151beSNikos Nikoleris #endif 42c3770197SVarad Gautam 43c3770197SVarad Gautam /* 44c3770197SVarad Gautam * The UEFI spec and EDK2 reference implementation both define EFI_GUID as 45c3770197SVarad Gautam * struct { u32 a; u16; b; u16 c; u8 d[8]; }; and so the implied alignment 46c3770197SVarad Gautam * is 32 bits not 8 bits like our guid_t. In some cases (i.e., on 32-bit ARM), 47c3770197SVarad Gautam * this means that firmware services invoked by the kernel may assume that 48c3770197SVarad Gautam * efi_guid_t* arguments are 32-bit aligned, and use memory accessors that 49c3770197SVarad Gautam * do not tolerate misalignment. So let's set the minimum alignment to 32 bits. 50c3770197SVarad Gautam * 51c3770197SVarad Gautam * Note that the UEFI spec as well as some comments in the EDK2 code base 52c3770197SVarad Gautam * suggest that EFI_GUID should be 64-bit aligned, but this appears to be 53c3770197SVarad Gautam * a mistake, given that no code seems to exist that actually enforces that 54c3770197SVarad Gautam * or relies on it. 55c3770197SVarad Gautam */ 56c3770197SVarad Gautam typedef struct { 57c3770197SVarad Gautam u8 b[16]; 58c3770197SVarad Gautam } guid_t __attribute__((aligned(__alignof__(u32)))); 59c3770197SVarad Gautam typedef guid_t efi_guid_t; 60c3770197SVarad Gautam 61c3770197SVarad Gautam #define EFI_GUID(a, b, c, d...) (efi_guid_t){ { \ 62c3770197SVarad Gautam (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ 63c3770197SVarad Gautam (b) & 0xff, ((b) >> 8) & 0xff, \ 64c3770197SVarad Gautam (c) & 0xff, ((c) >> 8) & 0xff, d } } 65c3770197SVarad Gautam 66f20589d6SZixuan Wang #define ACPI_TABLE_GUID EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 67f20589d6SZixuan Wang 6885c3c524SNikos Nikoleris #define LOADED_IMAGE_PROTOCOL_GUID EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 6985c3c524SNikos Nikoleris 70f20589d6SZixuan Wang typedef struct { 71f20589d6SZixuan Wang efi_guid_t guid; 72f20589d6SZixuan Wang void *table; 73f20589d6SZixuan Wang } efi_config_table_t; 74f20589d6SZixuan Wang 75c3770197SVarad Gautam /* 76c3770197SVarad Gautam * Generic EFI table header 77c3770197SVarad Gautam */ 78c3770197SVarad Gautam typedef struct { 79c3770197SVarad Gautam u64 signature; 80c3770197SVarad Gautam u32 revision; 81c3770197SVarad Gautam u32 headersize; 82c3770197SVarad Gautam u32 crc32; 83c3770197SVarad Gautam u32 reserved; 84c3770197SVarad Gautam } efi_table_hdr_t; 85c3770197SVarad Gautam 86c3770197SVarad Gautam /* 87c3770197SVarad Gautam * Memory map descriptor: 88c3770197SVarad Gautam */ 89c3770197SVarad Gautam 90c3770197SVarad Gautam /* Memory types: */ 91c3770197SVarad Gautam #define EFI_RESERVED_TYPE 0 92c3770197SVarad Gautam #define EFI_LOADER_CODE 1 93c3770197SVarad Gautam #define EFI_LOADER_DATA 2 94c3770197SVarad Gautam #define EFI_BOOT_SERVICES_CODE 3 95c3770197SVarad Gautam #define EFI_BOOT_SERVICES_DATA 4 96c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_CODE 5 97c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_DATA 6 98c3770197SVarad Gautam #define EFI_CONVENTIONAL_MEMORY 7 99c3770197SVarad Gautam #define EFI_UNUSABLE_MEMORY 8 100c3770197SVarad Gautam #define EFI_ACPI_RECLAIM_MEMORY 9 101c3770197SVarad Gautam #define EFI_ACPI_MEMORY_NVS 10 102c3770197SVarad Gautam #define EFI_MEMORY_MAPPED_IO 11 103c3770197SVarad Gautam #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 104c3770197SVarad Gautam #define EFI_PAL_CODE 13 105c3770197SVarad Gautam #define EFI_PERSISTENT_MEMORY 14 106c3770197SVarad Gautam #define EFI_MAX_MEMORY_TYPE 15 107c3770197SVarad Gautam 108c3770197SVarad Gautam /* Attribute values: */ 109c3770197SVarad Gautam #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */ 110c3770197SVarad Gautam #define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */ 111c3770197SVarad Gautam #define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */ 112c3770197SVarad Gautam #define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */ 113c3770197SVarad Gautam #define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL) /* uncached, exported */ 114c3770197SVarad Gautam #define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */ 115c3770197SVarad Gautam #define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */ 116c3770197SVarad Gautam #define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */ 117c3770197SVarad Gautam #define EFI_MEMORY_NV ((u64)0x0000000000008000ULL) /* non-volatile */ 118c3770197SVarad Gautam #define EFI_MEMORY_MORE_RELIABLE \ 119c3770197SVarad Gautam ((u64)0x0000000000010000ULL) /* higher reliability */ 120c3770197SVarad Gautam #define EFI_MEMORY_RO ((u64)0x0000000000020000ULL) /* read-only */ 121c3770197SVarad Gautam #define EFI_MEMORY_SP ((u64)0x0000000000040000ULL) /* soft reserved */ 122c3770197SVarad Gautam #define EFI_MEMORY_CPU_CRYPTO ((u64)0x0000000000080000ULL) /* supports encryption */ 123c3770197SVarad Gautam #define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */ 124c3770197SVarad Gautam #define EFI_MEMORY_DESCRIPTOR_VERSION 1 125c3770197SVarad Gautam 126c3770197SVarad Gautam #define EFI_PAGE_SHIFT 12 127c3770197SVarad Gautam #define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) 128c3770197SVarad Gautam #define EFI_PAGES_MAX (U64_MAX >> EFI_PAGE_SHIFT) 129c3770197SVarad Gautam 130c3770197SVarad Gautam typedef struct { 131c3770197SVarad Gautam u32 type; 132c3770197SVarad Gautam u32 pad; 133c3770197SVarad Gautam u64 phys_addr; 134c3770197SVarad Gautam u64 virt_addr; 135c3770197SVarad Gautam u64 num_pages; 136c3770197SVarad Gautam u64 attribute; 137c3770197SVarad Gautam } efi_memory_desc_t; 138c3770197SVarad Gautam 139c3770197SVarad Gautam typedef struct { 140c3770197SVarad Gautam efi_guid_t guid; 141c3770197SVarad Gautam u32 headersize; 142c3770197SVarad Gautam u32 flags; 143c3770197SVarad Gautam u32 imagesize; 144c3770197SVarad Gautam } efi_capsule_header_t; 145c3770197SVarad Gautam 146c3770197SVarad Gautam /* 147c3770197SVarad Gautam * EFI capsule flags 148c3770197SVarad Gautam */ 149c3770197SVarad Gautam #define EFI_CAPSULE_PERSIST_ACROSS_RESET 0x00010000 150c3770197SVarad Gautam #define EFI_CAPSULE_POPULATE_SYSTEM_TABLE 0x00020000 151c3770197SVarad Gautam #define EFI_CAPSULE_INITIATE_RESET 0x00040000 152c3770197SVarad Gautam 153c3770197SVarad Gautam struct capsule_info { 154c3770197SVarad Gautam efi_capsule_header_t header; 155c3770197SVarad Gautam efi_capsule_header_t *capsule; 156c3770197SVarad Gautam int reset_type; 157c3770197SVarad Gautam long index; 158c3770197SVarad Gautam size_t count; 159c3770197SVarad Gautam size_t total_size; 160c3770197SVarad Gautam struct page **pages; 161c3770197SVarad Gautam phys_addr_t *phys; 162c3770197SVarad Gautam size_t page_bytes_remain; 163c3770197SVarad Gautam }; 164c3770197SVarad Gautam 165c3770197SVarad Gautam int __efi_capsule_setup_info(struct capsule_info *cap_info); 166c3770197SVarad Gautam 167c3770197SVarad Gautam /* 168c3770197SVarad Gautam * Types and defines for Time Services 169c3770197SVarad Gautam */ 170c3770197SVarad Gautam #define EFI_TIME_ADJUST_DAYLIGHT 0x1 171c3770197SVarad Gautam #define EFI_TIME_IN_DAYLIGHT 0x2 172c3770197SVarad Gautam #define EFI_UNSPECIFIED_TIMEZONE 0x07ff 173c3770197SVarad Gautam 174c3770197SVarad Gautam typedef struct { 175c3770197SVarad Gautam u16 year; 176c3770197SVarad Gautam u8 month; 177c3770197SVarad Gautam u8 day; 178c3770197SVarad Gautam u8 hour; 179c3770197SVarad Gautam u8 minute; 180c3770197SVarad Gautam u8 second; 181c3770197SVarad Gautam u8 pad1; 182c3770197SVarad Gautam u32 nanosecond; 183c3770197SVarad Gautam s16 timezone; 184c3770197SVarad Gautam u8 daylight; 185c3770197SVarad Gautam u8 pad2; 186c3770197SVarad Gautam } efi_time_t; 187c3770197SVarad Gautam 188c3770197SVarad Gautam typedef struct { 189c3770197SVarad Gautam u32 resolution; 190c3770197SVarad Gautam u32 accuracy; 191c3770197SVarad Gautam u8 sets_to_zero; 192c3770197SVarad Gautam } efi_time_cap_t; 193c3770197SVarad Gautam 194c3770197SVarad Gautam typedef void *efi_event_t; 195c3770197SVarad Gautam /* Note that notifications won't work in mixed mode */ 196c3770197SVarad Gautam typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *); 197c3770197SVarad Gautam 198c3770197SVarad Gautam typedef enum { 199c3770197SVarad Gautam EfiTimerCancel, 200c3770197SVarad Gautam EfiTimerPeriodic, 201c3770197SVarad Gautam EfiTimerRelative 202c3770197SVarad Gautam } EFI_TIMER_DELAY; 203c3770197SVarad Gautam 204c3770197SVarad Gautam /* 205c3770197SVarad Gautam * EFI Device Path information 206c3770197SVarad Gautam */ 207c3770197SVarad Gautam #define EFI_DEV_HW 0x01 208c3770197SVarad Gautam #define EFI_DEV_PCI 1 209c3770197SVarad Gautam #define EFI_DEV_PCCARD 2 210c3770197SVarad Gautam #define EFI_DEV_MEM_MAPPED 3 211c3770197SVarad Gautam #define EFI_DEV_VENDOR 4 212c3770197SVarad Gautam #define EFI_DEV_CONTROLLER 5 213c3770197SVarad Gautam #define EFI_DEV_ACPI 0x02 214c3770197SVarad Gautam #define EFI_DEV_BASIC_ACPI 1 215c3770197SVarad Gautam #define EFI_DEV_EXPANDED_ACPI 2 216c3770197SVarad Gautam #define EFI_DEV_MSG 0x03 217c3770197SVarad Gautam #define EFI_DEV_MSG_ATAPI 1 218c3770197SVarad Gautam #define EFI_DEV_MSG_SCSI 2 219c3770197SVarad Gautam #define EFI_DEV_MSG_FC 3 220c3770197SVarad Gautam #define EFI_DEV_MSG_1394 4 221c3770197SVarad Gautam #define EFI_DEV_MSG_USB 5 222c3770197SVarad Gautam #define EFI_DEV_MSG_USB_CLASS 15 223c3770197SVarad Gautam #define EFI_DEV_MSG_I20 6 224c3770197SVarad Gautam #define EFI_DEV_MSG_MAC 11 225c3770197SVarad Gautam #define EFI_DEV_MSG_IPV4 12 226c3770197SVarad Gautam #define EFI_DEV_MSG_IPV6 13 227c3770197SVarad Gautam #define EFI_DEV_MSG_INFINIBAND 9 228c3770197SVarad Gautam #define EFI_DEV_MSG_UART 14 229c3770197SVarad Gautam #define EFI_DEV_MSG_VENDOR 10 230c3770197SVarad Gautam #define EFI_DEV_MEDIA 0x04 231c3770197SVarad Gautam #define EFI_DEV_MEDIA_HARD_DRIVE 1 232c3770197SVarad Gautam #define EFI_DEV_MEDIA_CDROM 2 233c3770197SVarad Gautam #define EFI_DEV_MEDIA_VENDOR 3 234c3770197SVarad Gautam #define EFI_DEV_MEDIA_FILE 4 235c3770197SVarad Gautam #define EFI_DEV_MEDIA_PROTOCOL 5 236c3770197SVarad Gautam #define EFI_DEV_BIOS_BOOT 0x05 237c3770197SVarad Gautam #define EFI_DEV_END_PATH 0x7F 238c3770197SVarad Gautam #define EFI_DEV_END_PATH2 0xFF 239c3770197SVarad Gautam #define EFI_DEV_END_INSTANCE 0x01 240c3770197SVarad Gautam #define EFI_DEV_END_ENTIRE 0xFF 241c3770197SVarad Gautam 242c3770197SVarad Gautam struct efi_generic_dev_path { 243c3770197SVarad Gautam u8 type; 244c3770197SVarad Gautam u8 sub_type; 245c3770197SVarad Gautam u16 length; 246c3770197SVarad Gautam } __packed; 247c3770197SVarad Gautam 248c3770197SVarad Gautam typedef struct efi_generic_dev_path efi_device_path_protocol_t; 249c3770197SVarad Gautam 250c3770197SVarad Gautam /* 251c3770197SVarad Gautam * EFI Boot Services table 252c3770197SVarad Gautam */ 253c3770197SVarad Gautam typedef struct { 254c3770197SVarad Gautam efi_table_hdr_t hdr; 255c3770197SVarad Gautam void *raise_tpl; 256c3770197SVarad Gautam void *restore_tpl; 257c3770197SVarad Gautam efi_status_t(__efiapi *allocate_pages)(int, int, unsigned long, 258c3770197SVarad Gautam efi_physical_addr_t *); 259c3770197SVarad Gautam efi_status_t(__efiapi *free_pages)(efi_physical_addr_t, 260c3770197SVarad Gautam unsigned long); 261c3770197SVarad Gautam efi_status_t(__efiapi *get_memory_map)(unsigned long *, void *, 262c3770197SVarad Gautam unsigned long *, 263c3770197SVarad Gautam unsigned long *, u32 *); 264c3770197SVarad Gautam efi_status_t(__efiapi *allocate_pool)(int, unsigned long, 265c3770197SVarad Gautam void **); 266c3770197SVarad Gautam efi_status_t(__efiapi *free_pool)(void *); 267c3770197SVarad Gautam efi_status_t(__efiapi *create_event)(u32, unsigned long, 268c3770197SVarad Gautam efi_event_notify_t, void *, 269c3770197SVarad Gautam efi_event_t *); 270c3770197SVarad Gautam efi_status_t(__efiapi *set_timer)(efi_event_t, 271c3770197SVarad Gautam EFI_TIMER_DELAY, u64); 272c3770197SVarad Gautam efi_status_t(__efiapi *wait_for_event)(unsigned long, 273c3770197SVarad Gautam efi_event_t *, 274c3770197SVarad Gautam unsigned long *); 275c3770197SVarad Gautam void *signal_event; 276c3770197SVarad Gautam efi_status_t(__efiapi *close_event)(efi_event_t); 277c3770197SVarad Gautam void *check_event; 278c3770197SVarad Gautam void *install_protocol_interface; 279c3770197SVarad Gautam void *reinstall_protocol_interface; 280c3770197SVarad Gautam void *uninstall_protocol_interface; 281c3770197SVarad Gautam efi_status_t(__efiapi *handle_protocol)(efi_handle_t, 282c3770197SVarad Gautam efi_guid_t *, void **); 283c3770197SVarad Gautam void *__reserved; 284c3770197SVarad Gautam void *register_protocol_notify; 285c3770197SVarad Gautam efi_status_t(__efiapi *locate_handle)(int, efi_guid_t *, 286c3770197SVarad Gautam void *, unsigned long *, 287c3770197SVarad Gautam efi_handle_t *); 288c3770197SVarad Gautam efi_status_t(__efiapi *locate_device_path)(efi_guid_t *, 289c3770197SVarad Gautam efi_device_path_protocol_t **, 290c3770197SVarad Gautam efi_handle_t *); 291c3770197SVarad Gautam efi_status_t(__efiapi *install_configuration_table)(efi_guid_t *, 292c3770197SVarad Gautam void *); 293c3770197SVarad Gautam void *load_image; 294c3770197SVarad Gautam void *start_image; 295c3770197SVarad Gautam efi_status_t(__efiapi *exit)(efi_handle_t, 296c3770197SVarad Gautam efi_status_t, 297c3770197SVarad Gautam unsigned long, 298c3770197SVarad Gautam efi_char16_t *); 299c3770197SVarad Gautam void *unload_image; 300c3770197SVarad Gautam efi_status_t(__efiapi *exit_boot_services)(efi_handle_t, 301c3770197SVarad Gautam unsigned long); 302c3770197SVarad Gautam void *get_next_monotonic_count; 303c3770197SVarad Gautam efi_status_t(__efiapi *stall)(unsigned long); 304c3770197SVarad Gautam void *set_watchdog_timer; 305c3770197SVarad Gautam void *connect_controller; 306c3770197SVarad Gautam efi_status_t(__efiapi *disconnect_controller)(efi_handle_t, 307c3770197SVarad Gautam efi_handle_t, 308c3770197SVarad Gautam efi_handle_t); 309c3770197SVarad Gautam void *open_protocol; 310c3770197SVarad Gautam void *close_protocol; 311c3770197SVarad Gautam void *open_protocol_information; 312c3770197SVarad Gautam void *protocols_per_handle; 313c3770197SVarad Gautam void *locate_handle_buffer; 314c3770197SVarad Gautam efi_status_t(__efiapi *locate_protocol)(efi_guid_t *, void *, 315c3770197SVarad Gautam void **); 316c3770197SVarad Gautam void *install_multiple_protocol_interfaces; 317c3770197SVarad Gautam void *uninstall_multiple_protocol_interfaces; 318c3770197SVarad Gautam void *calculate_crc32; 319c3770197SVarad Gautam void *copy_mem; 320c3770197SVarad Gautam void *set_mem; 321c3770197SVarad Gautam void *create_event_ex; 322c3770197SVarad Gautam } efi_boot_services_t; 323c3770197SVarad Gautam 324c3770197SVarad Gautam /* 325c3770197SVarad Gautam * Types and defines for EFI ResetSystem 326c3770197SVarad Gautam */ 327c3770197SVarad Gautam #define EFI_RESET_COLD 0 328c3770197SVarad Gautam #define EFI_RESET_WARM 1 329c3770197SVarad Gautam #define EFI_RESET_SHUTDOWN 2 330c3770197SVarad Gautam 331c3770197SVarad Gautam /* 332c3770197SVarad Gautam * EFI Runtime Services table 333c3770197SVarad Gautam */ 334c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL) 335c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_REVISION 0x00010000 336c3770197SVarad Gautam 337c3770197SVarad Gautam typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc); 338c3770197SVarad Gautam typedef efi_status_t efi_set_time_t (efi_time_t *tm); 339c3770197SVarad Gautam typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending, 340c3770197SVarad Gautam efi_time_t *tm); 341c3770197SVarad Gautam typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm); 342c3770197SVarad Gautam typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, 343c3770197SVarad Gautam unsigned long *data_size, void *data); 344c3770197SVarad Gautam typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name, 345c3770197SVarad Gautam efi_guid_t *vendor); 346c3770197SVarad Gautam typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, 347c3770197SVarad Gautam u32 attr, unsigned long data_size, 348c3770197SVarad Gautam void *data); 349c3770197SVarad Gautam typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count); 350c3770197SVarad Gautam typedef void efi_reset_system_t (int reset_type, efi_status_t status, 351c3770197SVarad Gautam unsigned long data_size, efi_char16_t *data); 352c3770197SVarad Gautam typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size, 353c3770197SVarad Gautam unsigned long descriptor_size, 354c3770197SVarad Gautam u32 descriptor_version, 355c3770197SVarad Gautam efi_memory_desc_t *virtual_map); 356c3770197SVarad Gautam typedef efi_status_t efi_query_variable_info_t(u32 attr, 357c3770197SVarad Gautam u64 *storage_space, 358c3770197SVarad Gautam u64 *remaining_space, 359c3770197SVarad Gautam u64 *max_variable_size); 360c3770197SVarad Gautam typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules, 361c3770197SVarad Gautam unsigned long count, 362c3770197SVarad Gautam unsigned long sg_list); 363c3770197SVarad Gautam typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules, 364c3770197SVarad Gautam unsigned long count, 365c3770197SVarad Gautam u64 *max_size, 366c3770197SVarad Gautam int *reset_type); 367c3770197SVarad Gautam typedef efi_status_t efi_query_variable_store_t(u32 attributes, 368c3770197SVarad Gautam unsigned long size, 369c3770197SVarad Gautam bool nonblocking); 370c3770197SVarad Gautam 371c3770197SVarad Gautam typedef struct { 372c3770197SVarad Gautam efi_table_hdr_t hdr; 373c3770197SVarad Gautam efi_get_time_t __efiapi *get_time; 374c3770197SVarad Gautam efi_set_time_t __efiapi *set_time; 375c3770197SVarad Gautam efi_get_wakeup_time_t __efiapi *get_wakeup_time; 376c3770197SVarad Gautam efi_set_wakeup_time_t __efiapi *set_wakeup_time; 377c3770197SVarad Gautam efi_set_virtual_address_map_t __efiapi *set_virtual_address_map; 378c3770197SVarad Gautam void *convert_pointer; 379c3770197SVarad Gautam efi_get_variable_t __efiapi *get_variable; 380c3770197SVarad Gautam efi_get_next_variable_t __efiapi *get_next_variable; 381c3770197SVarad Gautam efi_set_variable_t __efiapi *set_variable; 382c3770197SVarad Gautam efi_get_next_high_mono_count_t __efiapi *get_next_high_mono_count; 383c3770197SVarad Gautam efi_reset_system_t __efiapi *reset_system; 384c3770197SVarad Gautam efi_update_capsule_t __efiapi *update_capsule; 385c3770197SVarad Gautam efi_query_capsule_caps_t __efiapi *query_capsule_caps; 386c3770197SVarad Gautam efi_query_variable_info_t __efiapi *query_variable_info; 387c3770197SVarad Gautam } efi_runtime_services_t; 388c3770197SVarad Gautam 389c3770197SVarad Gautam #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) 390c3770197SVarad Gautam 391c3770197SVarad Gautam #define EFI_2_30_SYSTEM_TABLE_REVISION ((2 << 16) | (30)) 392c3770197SVarad Gautam #define EFI_2_20_SYSTEM_TABLE_REVISION ((2 << 16) | (20)) 393c3770197SVarad Gautam #define EFI_2_10_SYSTEM_TABLE_REVISION ((2 << 16) | (10)) 394c3770197SVarad Gautam #define EFI_2_00_SYSTEM_TABLE_REVISION ((2 << 16) | (00)) 395c3770197SVarad Gautam #define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10)) 396c3770197SVarad Gautam #define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02)) 397c3770197SVarad Gautam 398c3770197SVarad Gautam typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; 399c3770197SVarad Gautam typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; 400c3770197SVarad Gautam 401c3770197SVarad Gautam typedef struct { 402c3770197SVarad Gautam efi_table_hdr_t hdr; 403c3770197SVarad Gautam unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ 404c3770197SVarad Gautam u32 fw_revision; 405c3770197SVarad Gautam unsigned long con_in_handle; 406c3770197SVarad Gautam efi_simple_text_input_protocol_t *con_in; 407c3770197SVarad Gautam unsigned long con_out_handle; 408c3770197SVarad Gautam efi_simple_text_output_protocol_t *con_out; 409c3770197SVarad Gautam unsigned long stderr_handle; 410c3770197SVarad Gautam unsigned long stderr; 411c3770197SVarad Gautam efi_runtime_services_t *runtime; 412c3770197SVarad Gautam efi_boot_services_t *boottime; 413c3770197SVarad Gautam unsigned long nr_tables; 414c3770197SVarad Gautam unsigned long tables; 415c3770197SVarad Gautam } efi_system_table_t; 416c3770197SVarad Gautam 417c3770197SVarad Gautam struct efi_boot_memmap { 418c3770197SVarad Gautam efi_memory_desc_t **map; 419c3770197SVarad Gautam unsigned long *map_size; 420c3770197SVarad Gautam unsigned long *desc_size; 421c3770197SVarad Gautam u32 *desc_ver; 422c3770197SVarad Gautam unsigned long *key_ptr; 423c3770197SVarad Gautam unsigned long *buff_size; 424c3770197SVarad Gautam }; 425c3770197SVarad Gautam 42685c3c524SNikos Nikoleris #define __aligned_u64 u64 __attribute__((aligned(8))) 42785c3c524SNikos Nikoleris 42885c3c524SNikos Nikoleris struct efi_loaded_image_64 { 42985c3c524SNikos Nikoleris u32 revision; 43085c3c524SNikos Nikoleris efi_handle_t parent_handle; 43185c3c524SNikos Nikoleris efi_system_table_t *system_table; 43285c3c524SNikos Nikoleris efi_handle_t device_handle; 43385c3c524SNikos Nikoleris void *file_path; 43485c3c524SNikos Nikoleris void *reserved; 43585c3c524SNikos Nikoleris u32 load_options_size; 43685c3c524SNikos Nikoleris void *load_options; 43785c3c524SNikos Nikoleris void *image_base; 43885c3c524SNikos Nikoleris __aligned_u64 image_size; 43985c3c524SNikos Nikoleris unsigned int image_code_type; 44085c3c524SNikos Nikoleris unsigned int image_data_type; 44185c3c524SNikos Nikoleris efi_status_t (__efiapi * unload)(efi_handle_t image_handle); 44285c3c524SNikos Nikoleris }; 44385c3c524SNikos Nikoleris 444529ab889SNikos Nikoleris 445529ab889SNikos Nikoleris typedef struct _efi_simple_file_system_protocol efi_simple_file_system_protocol_t; 446529ab889SNikos Nikoleris typedef struct _efi_file_protocol efi_file_protocol_t; 447529ab889SNikos Nikoleris typedef efi_simple_file_system_protocol_t efi_file_io_interface_t; 448529ab889SNikos Nikoleris typedef efi_file_protocol_t efi_file_t; 449529ab889SNikos Nikoleris 450529ab889SNikos Nikoleris typedef efi_status_t efi_simple_file_system_protocol_open_volume( 451529ab889SNikos Nikoleris efi_simple_file_system_protocol_t *this, 452529ab889SNikos Nikoleris efi_file_protocol_t **root); 453529ab889SNikos Nikoleris 454529ab889SNikos Nikoleris #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID EFI_GUID(0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 455529ab889SNikos Nikoleris 456529ab889SNikos Nikoleris struct _efi_simple_file_system_protocol { 457529ab889SNikos Nikoleris uint64_t revision; 458529ab889SNikos Nikoleris efi_simple_file_system_protocol_open_volume __efiapi *open_volume; 459529ab889SNikos Nikoleris }; 460529ab889SNikos Nikoleris 461529ab889SNikos Nikoleris /* Open modes */ 462529ab889SNikos Nikoleris #define EFI_FILE_MODE_READ 0x0000000000000001ULL 463529ab889SNikos Nikoleris #define EFI_FILE_MODE_WRITE 0x0000000000000002ULL 464529ab889SNikos Nikoleris #define EFI_FILE_MODE_CREATE 0x8000000000000000ULL 465529ab889SNikos Nikoleris 466529ab889SNikos Nikoleris typedef efi_status_t efi_file_open(efi_file_protocol_t *this, 467529ab889SNikos Nikoleris efi_file_protocol_t **new_handle, 468529ab889SNikos Nikoleris efi_char16_t *file_name, 469529ab889SNikos Nikoleris uint64_t open_mode, 470529ab889SNikos Nikoleris uint64_t attributes); 471529ab889SNikos Nikoleris typedef efi_status_t efi_file_close(efi_file_protocol_t *this); 472529ab889SNikos Nikoleris typedef efi_status_t efi_file_delete(efi_file_protocol_t *this); 473529ab889SNikos Nikoleris typedef efi_status_t efi_file_read(efi_file_protocol_t *this, 474529ab889SNikos Nikoleris uint64_t *buffer_size, 475529ab889SNikos Nikoleris void *buffer); 476529ab889SNikos Nikoleris typedef efi_status_t efi_file_write(efi_file_protocol_t *this, 477529ab889SNikos Nikoleris uint64_t *buffer_size, 478529ab889SNikos Nikoleris void *buffer); 479529ab889SNikos Nikoleris typedef efi_status_t efi_file_set_position(efi_file_protocol_t *this, 480529ab889SNikos Nikoleris uint64_t position); 481529ab889SNikos Nikoleris typedef efi_status_t efi_file_get_position(efi_file_protocol_t *this, 482529ab889SNikos Nikoleris uint64_t *position); 483529ab889SNikos Nikoleris typedef efi_status_t efi_file_get_info(efi_file_protocol_t *this, 484529ab889SNikos Nikoleris efi_guid_t *information_type, 485529ab889SNikos Nikoleris uint64_t *buffer_size, 486529ab889SNikos Nikoleris void *buffer); 487529ab889SNikos Nikoleris typedef efi_status_t efi_file_set_info(efi_file_protocol_t *this, 488529ab889SNikos Nikoleris efi_guid_t *information_type, 489529ab889SNikos Nikoleris uint64_t *buffer_size, 490529ab889SNikos Nikoleris void *buffer); 491529ab889SNikos Nikoleris typedef efi_status_t efi_file_flush(efi_file_protocol_t *this); 492529ab889SNikos Nikoleris 493529ab889SNikos Nikoleris typedef struct { 494529ab889SNikos Nikoleris efi_event_t event; 495529ab889SNikos Nikoleris efi_status_t status; 496529ab889SNikos Nikoleris uint64_t buffer_size; 497529ab889SNikos Nikoleris void *buffer; 498529ab889SNikos Nikoleris } efi_file_io_open_t; 499529ab889SNikos Nikoleris 500529ab889SNikos Nikoleris typedef efi_status_t efi_file_open_ex(efi_file_protocol_t *this, 501529ab889SNikos Nikoleris efi_file_protocol_t **new_handle, 502529ab889SNikos Nikoleris efi_char16_t *file_name, 503529ab889SNikos Nikoleris uint64_t open_mode, 504529ab889SNikos Nikoleris uint64_t attributes, 505529ab889SNikos Nikoleris efi_file_io_open_t *token); 506529ab889SNikos Nikoleris typedef efi_status_t efi_file_read_ex(efi_file_protocol_t *this, 507529ab889SNikos Nikoleris efi_file_io_open_t *token); 508529ab889SNikos Nikoleris typedef efi_status_t efi_file_write_ex(efi_file_protocol_t *this, 509529ab889SNikos Nikoleris efi_file_io_open_t *token); 510529ab889SNikos Nikoleris typedef efi_status_t efi_file_flush_ex(efi_file_protocol_t *this, 511529ab889SNikos Nikoleris efi_file_io_open_t *token); 512529ab889SNikos Nikoleris 513529ab889SNikos Nikoleris struct _efi_file_protocol { 514529ab889SNikos Nikoleris uint64_t revision; 515529ab889SNikos Nikoleris efi_file_open __efiapi *open; 516529ab889SNikos Nikoleris efi_file_close __efiapi *close; 517529ab889SNikos Nikoleris efi_file_delete __efiapi *delete; 518529ab889SNikos Nikoleris efi_file_read __efiapi *read; 519529ab889SNikos Nikoleris efi_file_write __efiapi *write; 520529ab889SNikos Nikoleris efi_file_get_position __efiapi *get_position; 521529ab889SNikos Nikoleris efi_file_set_position __efiapi *set_position; 522529ab889SNikos Nikoleris efi_file_get_info __efiapi *get_info; 523529ab889SNikos Nikoleris efi_file_set_info __efiapi *set_info; 524529ab889SNikos Nikoleris efi_file_flush __efiapi *flush; 525529ab889SNikos Nikoleris efi_file_open_ex __efiapi *open_ex; 526529ab889SNikos Nikoleris efi_file_read_ex __efiapi *read_ex; 527529ab889SNikos Nikoleris efi_file_write_ex __efiapi *write_ex; 528529ab889SNikos Nikoleris efi_file_flush_ex __efiapi *flush_ex; 529529ab889SNikos Nikoleris }; 530529ab889SNikos Nikoleris 531529ab889SNikos Nikoleris #define EFI_FILE_INFO_ID EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b ) 532529ab889SNikos Nikoleris 533529ab889SNikos Nikoleris typedef struct { 534529ab889SNikos Nikoleris uint64_t size; 535529ab889SNikos Nikoleris uint64_t file_size; 536529ab889SNikos Nikoleris uint64_t physical_size; 537529ab889SNikos Nikoleris efi_time_t create_time; 538529ab889SNikos Nikoleris efi_time_t last_access_time; 539529ab889SNikos Nikoleris efi_time_t modification_time; 540529ab889SNikos Nikoleris uint64_t attributes; 541529ab889SNikos Nikoleris efi_char16_t file_name[1]; 542529ab889SNikos Nikoleris } efi_file_info_t; 543529ab889SNikos Nikoleris 544ad5fb883SZixuan Wang #define efi_bs_call(func, ...) efi_system_table->boottime->func(__VA_ARGS__) 545ad5fb883SZixuan Wang #define efi_rs_call(func, ...) efi_system_table->runtime->func(__VA_ARGS__) 546c3770197SVarad Gautam 547c3770197SVarad Gautam #endif /* __LINUX_UEFI_H */ 548