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 37f49151beSNikos Nikoleris #ifdef __x86_64__ 38c3770197SVarad Gautam #define __efiapi __attribute__((ms_abi)) 39f49151beSNikos Nikoleris #else 40f49151beSNikos Nikoleris #define __efiapi 41f49151beSNikos 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) 6723e17626SNikos Nikoleris #define ACPI_20_TABLE_GUID EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81) 68f20589d6SZixuan Wang 699632ce44SAndrew Jones #define DEVICE_TREE_GUID EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0) 709632ce44SAndrew Jones 7185c3c524SNikos Nikoleris #define LOADED_IMAGE_PROTOCOL_GUID EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 7285c3c524SNikos Nikoleris 73*b9f8ff7cSAndrew Jones #define EFI_LOAD_FILE2_PROTOCOL_GUID EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e, 0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d) 74*b9f8ff7cSAndrew Jones #define LINUX_EFI_INITRD_MEDIA_GUID EFI_GUID(0x5568e427, 0x68fc, 0x4f3d, 0xac, 0x74, 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68) 75*b9f8ff7cSAndrew Jones 76f20589d6SZixuan Wang typedef struct { 77f20589d6SZixuan Wang efi_guid_t guid; 78f20589d6SZixuan Wang void *table; 79f20589d6SZixuan Wang } efi_config_table_t; 80f20589d6SZixuan Wang 81c3770197SVarad Gautam /* 82c3770197SVarad Gautam * Generic EFI table header 83c3770197SVarad Gautam */ 84c3770197SVarad Gautam typedef struct { 85c3770197SVarad Gautam u64 signature; 86c3770197SVarad Gautam u32 revision; 87c3770197SVarad Gautam u32 headersize; 88c3770197SVarad Gautam u32 crc32; 89c3770197SVarad Gautam u32 reserved; 90c3770197SVarad Gautam } efi_table_hdr_t; 91c3770197SVarad Gautam 92c3770197SVarad Gautam /* 93c3770197SVarad Gautam * Memory map descriptor: 94c3770197SVarad Gautam */ 95c3770197SVarad Gautam 96c3770197SVarad Gautam /* Memory types: */ 97c3770197SVarad Gautam #define EFI_RESERVED_TYPE 0 98c3770197SVarad Gautam #define EFI_LOADER_CODE 1 99c3770197SVarad Gautam #define EFI_LOADER_DATA 2 100c3770197SVarad Gautam #define EFI_BOOT_SERVICES_CODE 3 101c3770197SVarad Gautam #define EFI_BOOT_SERVICES_DATA 4 102c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_CODE 5 103c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_DATA 6 104c3770197SVarad Gautam #define EFI_CONVENTIONAL_MEMORY 7 105c3770197SVarad Gautam #define EFI_UNUSABLE_MEMORY 8 106c3770197SVarad Gautam #define EFI_ACPI_RECLAIM_MEMORY 9 107c3770197SVarad Gautam #define EFI_ACPI_MEMORY_NVS 10 108c3770197SVarad Gautam #define EFI_MEMORY_MAPPED_IO 11 109c3770197SVarad Gautam #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 110c3770197SVarad Gautam #define EFI_PAL_CODE 13 111c3770197SVarad Gautam #define EFI_PERSISTENT_MEMORY 14 112c3770197SVarad Gautam #define EFI_MAX_MEMORY_TYPE 15 113c3770197SVarad Gautam 114c3770197SVarad Gautam /* Attribute values: */ 115c3770197SVarad Gautam #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */ 116c3770197SVarad Gautam #define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */ 117c3770197SVarad Gautam #define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */ 118c3770197SVarad Gautam #define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */ 119c3770197SVarad Gautam #define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL) /* uncached, exported */ 120c3770197SVarad Gautam #define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */ 121c3770197SVarad Gautam #define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */ 122c3770197SVarad Gautam #define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */ 123c3770197SVarad Gautam #define EFI_MEMORY_NV ((u64)0x0000000000008000ULL) /* non-volatile */ 124c3770197SVarad Gautam #define EFI_MEMORY_MORE_RELIABLE \ 125c3770197SVarad Gautam ((u64)0x0000000000010000ULL) /* higher reliability */ 126c3770197SVarad Gautam #define EFI_MEMORY_RO ((u64)0x0000000000020000ULL) /* read-only */ 127c3770197SVarad Gautam #define EFI_MEMORY_SP ((u64)0x0000000000040000ULL) /* soft reserved */ 128c3770197SVarad Gautam #define EFI_MEMORY_CPU_CRYPTO ((u64)0x0000000000080000ULL) /* supports encryption */ 129c3770197SVarad Gautam #define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */ 130c3770197SVarad Gautam #define EFI_MEMORY_DESCRIPTOR_VERSION 1 131c3770197SVarad Gautam 132c3770197SVarad Gautam #define EFI_PAGE_SHIFT 12 133c3770197SVarad Gautam #define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) 134c3770197SVarad Gautam #define EFI_PAGES_MAX (U64_MAX >> EFI_PAGE_SHIFT) 135c3770197SVarad Gautam 136c3770197SVarad Gautam typedef struct { 137c3770197SVarad Gautam u32 type; 138c3770197SVarad Gautam u32 pad; 139c3770197SVarad Gautam u64 phys_addr; 140c3770197SVarad Gautam u64 virt_addr; 141c3770197SVarad Gautam u64 num_pages; 142c3770197SVarad Gautam u64 attribute; 143c3770197SVarad Gautam } efi_memory_desc_t; 144c3770197SVarad Gautam 145c3770197SVarad Gautam typedef struct { 146c3770197SVarad Gautam efi_guid_t guid; 147c3770197SVarad Gautam u32 headersize; 148c3770197SVarad Gautam u32 flags; 149c3770197SVarad Gautam u32 imagesize; 150c3770197SVarad Gautam } efi_capsule_header_t; 151c3770197SVarad Gautam 152c3770197SVarad Gautam /* 153c3770197SVarad Gautam * EFI capsule flags 154c3770197SVarad Gautam */ 155c3770197SVarad Gautam #define EFI_CAPSULE_PERSIST_ACROSS_RESET 0x00010000 156c3770197SVarad Gautam #define EFI_CAPSULE_POPULATE_SYSTEM_TABLE 0x00020000 157c3770197SVarad Gautam #define EFI_CAPSULE_INITIATE_RESET 0x00040000 158c3770197SVarad Gautam 159c3770197SVarad Gautam struct capsule_info { 160c3770197SVarad Gautam efi_capsule_header_t header; 161c3770197SVarad Gautam efi_capsule_header_t *capsule; 162c3770197SVarad Gautam int reset_type; 163c3770197SVarad Gautam long index; 164c3770197SVarad Gautam size_t count; 165c3770197SVarad Gautam size_t total_size; 166c3770197SVarad Gautam struct page **pages; 167c3770197SVarad Gautam phys_addr_t *phys; 168c3770197SVarad Gautam size_t page_bytes_remain; 169c3770197SVarad Gautam }; 170c3770197SVarad Gautam 171c3770197SVarad Gautam int __efi_capsule_setup_info(struct capsule_info *cap_info); 172c3770197SVarad Gautam 173c3770197SVarad Gautam /* 174c3770197SVarad Gautam * Types and defines for Time Services 175c3770197SVarad Gautam */ 176c3770197SVarad Gautam #define EFI_TIME_ADJUST_DAYLIGHT 0x1 177c3770197SVarad Gautam #define EFI_TIME_IN_DAYLIGHT 0x2 178c3770197SVarad Gautam #define EFI_UNSPECIFIED_TIMEZONE 0x07ff 179c3770197SVarad Gautam 180c3770197SVarad Gautam typedef struct { 181c3770197SVarad Gautam u16 year; 182c3770197SVarad Gautam u8 month; 183c3770197SVarad Gautam u8 day; 184c3770197SVarad Gautam u8 hour; 185c3770197SVarad Gautam u8 minute; 186c3770197SVarad Gautam u8 second; 187c3770197SVarad Gautam u8 pad1; 188c3770197SVarad Gautam u32 nanosecond; 189c3770197SVarad Gautam s16 timezone; 190c3770197SVarad Gautam u8 daylight; 191c3770197SVarad Gautam u8 pad2; 192c3770197SVarad Gautam } efi_time_t; 193c3770197SVarad Gautam 194c3770197SVarad Gautam typedef struct { 195c3770197SVarad Gautam u32 resolution; 196c3770197SVarad Gautam u32 accuracy; 197c3770197SVarad Gautam u8 sets_to_zero; 198c3770197SVarad Gautam } efi_time_cap_t; 199c3770197SVarad Gautam 200c3770197SVarad Gautam typedef void *efi_event_t; 201c3770197SVarad Gautam /* Note that notifications won't work in mixed mode */ 202c3770197SVarad Gautam typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *); 203c3770197SVarad Gautam 204c3770197SVarad Gautam typedef enum { 205c3770197SVarad Gautam EfiTimerCancel, 206c3770197SVarad Gautam EfiTimerPeriodic, 207c3770197SVarad Gautam EfiTimerRelative 208c3770197SVarad Gautam } EFI_TIMER_DELAY; 209c3770197SVarad Gautam 210c3770197SVarad Gautam /* 211c3770197SVarad Gautam * EFI Device Path information 212c3770197SVarad Gautam */ 213c3770197SVarad Gautam #define EFI_DEV_HW 0x01 214c3770197SVarad Gautam #define EFI_DEV_PCI 1 215c3770197SVarad Gautam #define EFI_DEV_PCCARD 2 216c3770197SVarad Gautam #define EFI_DEV_MEM_MAPPED 3 217c3770197SVarad Gautam #define EFI_DEV_VENDOR 4 218c3770197SVarad Gautam #define EFI_DEV_CONTROLLER 5 219c3770197SVarad Gautam #define EFI_DEV_ACPI 0x02 220c3770197SVarad Gautam #define EFI_DEV_BASIC_ACPI 1 221c3770197SVarad Gautam #define EFI_DEV_EXPANDED_ACPI 2 222c3770197SVarad Gautam #define EFI_DEV_MSG 0x03 223c3770197SVarad Gautam #define EFI_DEV_MSG_ATAPI 1 224c3770197SVarad Gautam #define EFI_DEV_MSG_SCSI 2 225c3770197SVarad Gautam #define EFI_DEV_MSG_FC 3 226c3770197SVarad Gautam #define EFI_DEV_MSG_1394 4 227c3770197SVarad Gautam #define EFI_DEV_MSG_USB 5 228c3770197SVarad Gautam #define EFI_DEV_MSG_USB_CLASS 15 229c3770197SVarad Gautam #define EFI_DEV_MSG_I20 6 230c3770197SVarad Gautam #define EFI_DEV_MSG_MAC 11 231c3770197SVarad Gautam #define EFI_DEV_MSG_IPV4 12 232c3770197SVarad Gautam #define EFI_DEV_MSG_IPV6 13 233c3770197SVarad Gautam #define EFI_DEV_MSG_INFINIBAND 9 234c3770197SVarad Gautam #define EFI_DEV_MSG_UART 14 235c3770197SVarad Gautam #define EFI_DEV_MSG_VENDOR 10 236c3770197SVarad Gautam #define EFI_DEV_MEDIA 0x04 237c3770197SVarad Gautam #define EFI_DEV_MEDIA_HARD_DRIVE 1 238c3770197SVarad Gautam #define EFI_DEV_MEDIA_CDROM 2 239c3770197SVarad Gautam #define EFI_DEV_MEDIA_VENDOR 3 240c3770197SVarad Gautam #define EFI_DEV_MEDIA_FILE 4 241c3770197SVarad Gautam #define EFI_DEV_MEDIA_PROTOCOL 5 242c3770197SVarad Gautam #define EFI_DEV_BIOS_BOOT 0x05 243c3770197SVarad Gautam #define EFI_DEV_END_PATH 0x7F 244c3770197SVarad Gautam #define EFI_DEV_END_PATH2 0xFF 245c3770197SVarad Gautam #define EFI_DEV_END_INSTANCE 0x01 246c3770197SVarad Gautam #define EFI_DEV_END_ENTIRE 0xFF 247c3770197SVarad Gautam 248c3770197SVarad Gautam struct efi_generic_dev_path { 249c3770197SVarad Gautam u8 type; 250c3770197SVarad Gautam u8 sub_type; 251c3770197SVarad Gautam u16 length; 252c3770197SVarad Gautam } __packed; 253c3770197SVarad Gautam 254*b9f8ff7cSAndrew Jones struct efi_vendor_dev_path { 255*b9f8ff7cSAndrew Jones struct efi_generic_dev_path header; 256*b9f8ff7cSAndrew Jones efi_guid_t vendorguid; 257*b9f8ff7cSAndrew Jones u8 vendordata[]; 258*b9f8ff7cSAndrew Jones } __packed; 259*b9f8ff7cSAndrew Jones 260c3770197SVarad Gautam typedef struct efi_generic_dev_path efi_device_path_protocol_t; 261c3770197SVarad Gautam 262c3770197SVarad Gautam /* 263c3770197SVarad Gautam * EFI Boot Services table 264c3770197SVarad Gautam */ 265c3770197SVarad Gautam typedef struct { 266c3770197SVarad Gautam efi_table_hdr_t hdr; 267c3770197SVarad Gautam void *raise_tpl; 268c3770197SVarad Gautam void *restore_tpl; 269c3770197SVarad Gautam efi_status_t(__efiapi *allocate_pages)(int, int, unsigned long, 270c3770197SVarad Gautam efi_physical_addr_t *); 271c3770197SVarad Gautam efi_status_t(__efiapi *free_pages)(efi_physical_addr_t, 272c3770197SVarad Gautam unsigned long); 273c3770197SVarad Gautam efi_status_t(__efiapi *get_memory_map)(unsigned long *, void *, 274c3770197SVarad Gautam unsigned long *, 275c3770197SVarad Gautam unsigned long *, u32 *); 276c3770197SVarad Gautam efi_status_t(__efiapi *allocate_pool)(int, unsigned long, 277c3770197SVarad Gautam void **); 278c3770197SVarad Gautam efi_status_t(__efiapi *free_pool)(void *); 279c3770197SVarad Gautam efi_status_t(__efiapi *create_event)(u32, unsigned long, 280c3770197SVarad Gautam efi_event_notify_t, void *, 281c3770197SVarad Gautam efi_event_t *); 282c3770197SVarad Gautam efi_status_t(__efiapi *set_timer)(efi_event_t, 283c3770197SVarad Gautam EFI_TIMER_DELAY, u64); 284c3770197SVarad Gautam efi_status_t(__efiapi *wait_for_event)(unsigned long, 285c3770197SVarad Gautam efi_event_t *, 286c3770197SVarad Gautam unsigned long *); 287c3770197SVarad Gautam void *signal_event; 288c3770197SVarad Gautam efi_status_t(__efiapi *close_event)(efi_event_t); 289c3770197SVarad Gautam void *check_event; 290c3770197SVarad Gautam void *install_protocol_interface; 291c3770197SVarad Gautam void *reinstall_protocol_interface; 292c3770197SVarad Gautam void *uninstall_protocol_interface; 293c3770197SVarad Gautam efi_status_t(__efiapi *handle_protocol)(efi_handle_t, 294c3770197SVarad Gautam efi_guid_t *, void **); 295c3770197SVarad Gautam void *__reserved; 296c3770197SVarad Gautam void *register_protocol_notify; 297c3770197SVarad Gautam efi_status_t(__efiapi *locate_handle)(int, efi_guid_t *, 298c3770197SVarad Gautam void *, unsigned long *, 299c3770197SVarad Gautam efi_handle_t *); 300c3770197SVarad Gautam efi_status_t(__efiapi *locate_device_path)(efi_guid_t *, 301c3770197SVarad Gautam efi_device_path_protocol_t **, 302c3770197SVarad Gautam efi_handle_t *); 303c3770197SVarad Gautam efi_status_t(__efiapi *install_configuration_table)(efi_guid_t *, 304c3770197SVarad Gautam void *); 305c3770197SVarad Gautam void *load_image; 306c3770197SVarad Gautam void *start_image; 307c3770197SVarad Gautam efi_status_t(__efiapi *exit)(efi_handle_t, 308c3770197SVarad Gautam efi_status_t, 309c3770197SVarad Gautam unsigned long, 310c3770197SVarad Gautam efi_char16_t *); 311c3770197SVarad Gautam void *unload_image; 312c3770197SVarad Gautam efi_status_t(__efiapi *exit_boot_services)(efi_handle_t, 313c3770197SVarad Gautam unsigned long); 314c3770197SVarad Gautam void *get_next_monotonic_count; 315c3770197SVarad Gautam efi_status_t(__efiapi *stall)(unsigned long); 316c3770197SVarad Gautam void *set_watchdog_timer; 317c3770197SVarad Gautam void *connect_controller; 318c3770197SVarad Gautam efi_status_t(__efiapi *disconnect_controller)(efi_handle_t, 319c3770197SVarad Gautam efi_handle_t, 320c3770197SVarad Gautam efi_handle_t); 321c3770197SVarad Gautam void *open_protocol; 322c3770197SVarad Gautam void *close_protocol; 323c3770197SVarad Gautam void *open_protocol_information; 324c3770197SVarad Gautam void *protocols_per_handle; 325c3770197SVarad Gautam void *locate_handle_buffer; 326c3770197SVarad Gautam efi_status_t(__efiapi *locate_protocol)(efi_guid_t *, void *, 327c3770197SVarad Gautam void **); 328c3770197SVarad Gautam void *install_multiple_protocol_interfaces; 329c3770197SVarad Gautam void *uninstall_multiple_protocol_interfaces; 330c3770197SVarad Gautam void *calculate_crc32; 331c3770197SVarad Gautam void *copy_mem; 332c3770197SVarad Gautam void *set_mem; 333c3770197SVarad Gautam void *create_event_ex; 334c3770197SVarad Gautam } efi_boot_services_t; 335c3770197SVarad Gautam 336c3770197SVarad Gautam /* 337c3770197SVarad Gautam * Types and defines for EFI ResetSystem 338c3770197SVarad Gautam */ 339c3770197SVarad Gautam #define EFI_RESET_COLD 0 340c3770197SVarad Gautam #define EFI_RESET_WARM 1 341c3770197SVarad Gautam #define EFI_RESET_SHUTDOWN 2 342c3770197SVarad Gautam 343c3770197SVarad Gautam /* 344c3770197SVarad Gautam * EFI Runtime Services table 345c3770197SVarad Gautam */ 346c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL) 347c3770197SVarad Gautam #define EFI_RUNTIME_SERVICES_REVISION 0x00010000 348c3770197SVarad Gautam 349c3770197SVarad Gautam typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc); 350c3770197SVarad Gautam typedef efi_status_t efi_set_time_t (efi_time_t *tm); 351c3770197SVarad Gautam typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending, 352c3770197SVarad Gautam efi_time_t *tm); 353c3770197SVarad Gautam typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm); 354c3770197SVarad Gautam typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, 355c3770197SVarad Gautam unsigned long *data_size, void *data); 356c3770197SVarad Gautam typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name, 357c3770197SVarad Gautam efi_guid_t *vendor); 358c3770197SVarad Gautam typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, 359c3770197SVarad Gautam u32 attr, unsigned long data_size, 360c3770197SVarad Gautam void *data); 361c3770197SVarad Gautam typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count); 362c3770197SVarad Gautam typedef void efi_reset_system_t (int reset_type, efi_status_t status, 363c3770197SVarad Gautam unsigned long data_size, efi_char16_t *data); 364c3770197SVarad Gautam typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size, 365c3770197SVarad Gautam unsigned long descriptor_size, 366c3770197SVarad Gautam u32 descriptor_version, 367c3770197SVarad Gautam efi_memory_desc_t *virtual_map); 368c3770197SVarad Gautam typedef efi_status_t efi_query_variable_info_t(u32 attr, 369c3770197SVarad Gautam u64 *storage_space, 370c3770197SVarad Gautam u64 *remaining_space, 371c3770197SVarad Gautam u64 *max_variable_size); 372c3770197SVarad Gautam typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules, 373c3770197SVarad Gautam unsigned long count, 374c3770197SVarad Gautam unsigned long sg_list); 375c3770197SVarad Gautam typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules, 376c3770197SVarad Gautam unsigned long count, 377c3770197SVarad Gautam u64 *max_size, 378c3770197SVarad Gautam int *reset_type); 379c3770197SVarad Gautam typedef efi_status_t efi_query_variable_store_t(u32 attributes, 380c3770197SVarad Gautam unsigned long size, 381c3770197SVarad Gautam bool nonblocking); 382c3770197SVarad Gautam 383c3770197SVarad Gautam typedef struct { 384c3770197SVarad Gautam efi_table_hdr_t hdr; 385c3770197SVarad Gautam efi_get_time_t __efiapi *get_time; 386c3770197SVarad Gautam efi_set_time_t __efiapi *set_time; 387c3770197SVarad Gautam efi_get_wakeup_time_t __efiapi *get_wakeup_time; 388c3770197SVarad Gautam efi_set_wakeup_time_t __efiapi *set_wakeup_time; 389c3770197SVarad Gautam efi_set_virtual_address_map_t __efiapi *set_virtual_address_map; 390c3770197SVarad Gautam void *convert_pointer; 391c3770197SVarad Gautam efi_get_variable_t __efiapi *get_variable; 392c3770197SVarad Gautam efi_get_next_variable_t __efiapi *get_next_variable; 393c3770197SVarad Gautam efi_set_variable_t __efiapi *set_variable; 394c3770197SVarad Gautam efi_get_next_high_mono_count_t __efiapi *get_next_high_mono_count; 395c3770197SVarad Gautam efi_reset_system_t __efiapi *reset_system; 396c3770197SVarad Gautam efi_update_capsule_t __efiapi *update_capsule; 397c3770197SVarad Gautam efi_query_capsule_caps_t __efiapi *query_capsule_caps; 398c3770197SVarad Gautam efi_query_variable_info_t __efiapi *query_variable_info; 399c3770197SVarad Gautam } efi_runtime_services_t; 400c3770197SVarad Gautam 401c3770197SVarad Gautam #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) 402c3770197SVarad Gautam 403c3770197SVarad Gautam #define EFI_2_30_SYSTEM_TABLE_REVISION ((2 << 16) | (30)) 404c3770197SVarad Gautam #define EFI_2_20_SYSTEM_TABLE_REVISION ((2 << 16) | (20)) 405c3770197SVarad Gautam #define EFI_2_10_SYSTEM_TABLE_REVISION ((2 << 16) | (10)) 406c3770197SVarad Gautam #define EFI_2_00_SYSTEM_TABLE_REVISION ((2 << 16) | (00)) 407c3770197SVarad Gautam #define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10)) 408c3770197SVarad Gautam #define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02)) 409c3770197SVarad Gautam 410c3770197SVarad Gautam typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; 411c3770197SVarad Gautam typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; 412c3770197SVarad Gautam 413c3770197SVarad Gautam typedef struct { 414c3770197SVarad Gautam efi_table_hdr_t hdr; 415c3770197SVarad Gautam unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ 416c3770197SVarad Gautam u32 fw_revision; 417c3770197SVarad Gautam unsigned long con_in_handle; 418c3770197SVarad Gautam efi_simple_text_input_protocol_t *con_in; 419c3770197SVarad Gautam unsigned long con_out_handle; 420c3770197SVarad Gautam efi_simple_text_output_protocol_t *con_out; 421c3770197SVarad Gautam unsigned long stderr_handle; 422c3770197SVarad Gautam unsigned long stderr; 423c3770197SVarad Gautam efi_runtime_services_t *runtime; 424c3770197SVarad Gautam efi_boot_services_t *boottime; 425c3770197SVarad Gautam unsigned long nr_tables; 426c3770197SVarad Gautam unsigned long tables; 427c3770197SVarad Gautam } efi_system_table_t; 428c3770197SVarad Gautam 429c3770197SVarad Gautam struct efi_boot_memmap { 430c3770197SVarad Gautam efi_memory_desc_t **map; 431c3770197SVarad Gautam unsigned long *map_size; 432c3770197SVarad Gautam unsigned long *desc_size; 433c3770197SVarad Gautam u32 *desc_ver; 434c3770197SVarad Gautam unsigned long *key_ptr; 435c3770197SVarad Gautam unsigned long *buff_size; 436c3770197SVarad Gautam }; 437c3770197SVarad Gautam 43885c3c524SNikos Nikoleris #define __aligned_u64 u64 __attribute__((aligned(8))) 43985c3c524SNikos Nikoleris 44085c3c524SNikos Nikoleris struct efi_loaded_image_64 { 44185c3c524SNikos Nikoleris u32 revision; 44285c3c524SNikos Nikoleris efi_handle_t parent_handle; 44385c3c524SNikos Nikoleris efi_system_table_t *system_table; 44485c3c524SNikos Nikoleris efi_handle_t device_handle; 44585c3c524SNikos Nikoleris void *file_path; 44685c3c524SNikos Nikoleris void *reserved; 44785c3c524SNikos Nikoleris u32 load_options_size; 44885c3c524SNikos Nikoleris void *load_options; 44985c3c524SNikos Nikoleris void *image_base; 45085c3c524SNikos Nikoleris __aligned_u64 image_size; 45185c3c524SNikos Nikoleris unsigned int image_code_type; 45285c3c524SNikos Nikoleris unsigned int image_data_type; 45385c3c524SNikos Nikoleris efi_status_t (__efiapi * unload)(efi_handle_t image_handle); 45485c3c524SNikos Nikoleris }; 45585c3c524SNikos Nikoleris 456529ab889SNikos Nikoleris 457529ab889SNikos Nikoleris typedef struct _efi_simple_file_system_protocol efi_simple_file_system_protocol_t; 458529ab889SNikos Nikoleris typedef struct _efi_file_protocol efi_file_protocol_t; 459529ab889SNikos Nikoleris typedef efi_simple_file_system_protocol_t efi_file_io_interface_t; 460529ab889SNikos Nikoleris typedef efi_file_protocol_t efi_file_t; 461*b9f8ff7cSAndrew Jones typedef union efi_load_file_protocol efi_load_file_protocol_t; 462*b9f8ff7cSAndrew Jones typedef union efi_load_file_protocol efi_load_file2_protocol_t; 463*b9f8ff7cSAndrew Jones 464*b9f8ff7cSAndrew Jones union efi_load_file_protocol { 465*b9f8ff7cSAndrew Jones struct { 466*b9f8ff7cSAndrew Jones efi_status_t (__efiapi *load_file)(efi_load_file_protocol_t *, 467*b9f8ff7cSAndrew Jones efi_device_path_protocol_t *, 468*b9f8ff7cSAndrew Jones bool, unsigned long *, void *); 469*b9f8ff7cSAndrew Jones }; 470*b9f8ff7cSAndrew Jones struct { 471*b9f8ff7cSAndrew Jones u32 load_file; 472*b9f8ff7cSAndrew Jones } mixed_mode; 473*b9f8ff7cSAndrew Jones }; 474529ab889SNikos Nikoleris 475529ab889SNikos Nikoleris typedef efi_status_t efi_simple_file_system_protocol_open_volume( 476529ab889SNikos Nikoleris efi_simple_file_system_protocol_t *this, 477529ab889SNikos Nikoleris efi_file_protocol_t **root); 478529ab889SNikos Nikoleris 479529ab889SNikos Nikoleris #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID EFI_GUID(0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 480529ab889SNikos Nikoleris 481529ab889SNikos Nikoleris struct _efi_simple_file_system_protocol { 482529ab889SNikos Nikoleris uint64_t revision; 483529ab889SNikos Nikoleris efi_simple_file_system_protocol_open_volume __efiapi *open_volume; 484529ab889SNikos Nikoleris }; 485529ab889SNikos Nikoleris 486529ab889SNikos Nikoleris /* Open modes */ 487529ab889SNikos Nikoleris #define EFI_FILE_MODE_READ 0x0000000000000001ULL 488529ab889SNikos Nikoleris #define EFI_FILE_MODE_WRITE 0x0000000000000002ULL 489529ab889SNikos Nikoleris #define EFI_FILE_MODE_CREATE 0x8000000000000000ULL 490529ab889SNikos Nikoleris 491529ab889SNikos Nikoleris typedef efi_status_t efi_file_open(efi_file_protocol_t *this, 492529ab889SNikos Nikoleris efi_file_protocol_t **new_handle, 493529ab889SNikos Nikoleris efi_char16_t *file_name, 494529ab889SNikos Nikoleris uint64_t open_mode, 495529ab889SNikos Nikoleris uint64_t attributes); 496529ab889SNikos Nikoleris typedef efi_status_t efi_file_close(efi_file_protocol_t *this); 497529ab889SNikos Nikoleris typedef efi_status_t efi_file_delete(efi_file_protocol_t *this); 498529ab889SNikos Nikoleris typedef efi_status_t efi_file_read(efi_file_protocol_t *this, 499529ab889SNikos Nikoleris uint64_t *buffer_size, 500529ab889SNikos Nikoleris void *buffer); 501529ab889SNikos Nikoleris typedef efi_status_t efi_file_write(efi_file_protocol_t *this, 502529ab889SNikos Nikoleris uint64_t *buffer_size, 503529ab889SNikos Nikoleris void *buffer); 504529ab889SNikos Nikoleris typedef efi_status_t efi_file_set_position(efi_file_protocol_t *this, 505529ab889SNikos Nikoleris uint64_t position); 506529ab889SNikos Nikoleris typedef efi_status_t efi_file_get_position(efi_file_protocol_t *this, 507529ab889SNikos Nikoleris uint64_t *position); 508529ab889SNikos Nikoleris typedef efi_status_t efi_file_get_info(efi_file_protocol_t *this, 509529ab889SNikos Nikoleris efi_guid_t *information_type, 510529ab889SNikos Nikoleris uint64_t *buffer_size, 511529ab889SNikos Nikoleris void *buffer); 512529ab889SNikos Nikoleris typedef efi_status_t efi_file_set_info(efi_file_protocol_t *this, 513529ab889SNikos Nikoleris efi_guid_t *information_type, 514529ab889SNikos Nikoleris uint64_t *buffer_size, 515529ab889SNikos Nikoleris void *buffer); 516529ab889SNikos Nikoleris typedef efi_status_t efi_file_flush(efi_file_protocol_t *this); 517529ab889SNikos Nikoleris 518529ab889SNikos Nikoleris typedef struct { 519529ab889SNikos Nikoleris efi_event_t event; 520529ab889SNikos Nikoleris efi_status_t status; 521529ab889SNikos Nikoleris uint64_t buffer_size; 522529ab889SNikos Nikoleris void *buffer; 523529ab889SNikos Nikoleris } efi_file_io_open_t; 524529ab889SNikos Nikoleris 525529ab889SNikos Nikoleris typedef efi_status_t efi_file_open_ex(efi_file_protocol_t *this, 526529ab889SNikos Nikoleris efi_file_protocol_t **new_handle, 527529ab889SNikos Nikoleris efi_char16_t *file_name, 528529ab889SNikos Nikoleris uint64_t open_mode, 529529ab889SNikos Nikoleris uint64_t attributes, 530529ab889SNikos Nikoleris efi_file_io_open_t *token); 531529ab889SNikos Nikoleris typedef efi_status_t efi_file_read_ex(efi_file_protocol_t *this, 532529ab889SNikos Nikoleris efi_file_io_open_t *token); 533529ab889SNikos Nikoleris typedef efi_status_t efi_file_write_ex(efi_file_protocol_t *this, 534529ab889SNikos Nikoleris efi_file_io_open_t *token); 535529ab889SNikos Nikoleris typedef efi_status_t efi_file_flush_ex(efi_file_protocol_t *this, 536529ab889SNikos Nikoleris efi_file_io_open_t *token); 537529ab889SNikos Nikoleris 538529ab889SNikos Nikoleris struct _efi_file_protocol { 539529ab889SNikos Nikoleris uint64_t revision; 540529ab889SNikos Nikoleris efi_file_open __efiapi *open; 541529ab889SNikos Nikoleris efi_file_close __efiapi *close; 542529ab889SNikos Nikoleris efi_file_delete __efiapi *delete; 543529ab889SNikos Nikoleris efi_file_read __efiapi *read; 544529ab889SNikos Nikoleris efi_file_write __efiapi *write; 545529ab889SNikos Nikoleris efi_file_get_position __efiapi *get_position; 546529ab889SNikos Nikoleris efi_file_set_position __efiapi *set_position; 547529ab889SNikos Nikoleris efi_file_get_info __efiapi *get_info; 548529ab889SNikos Nikoleris efi_file_set_info __efiapi *set_info; 549529ab889SNikos Nikoleris efi_file_flush __efiapi *flush; 550529ab889SNikos Nikoleris efi_file_open_ex __efiapi *open_ex; 551529ab889SNikos Nikoleris efi_file_read_ex __efiapi *read_ex; 552529ab889SNikos Nikoleris efi_file_write_ex __efiapi *write_ex; 553529ab889SNikos Nikoleris efi_file_flush_ex __efiapi *flush_ex; 554529ab889SNikos Nikoleris }; 555529ab889SNikos Nikoleris 556529ab889SNikos Nikoleris #define EFI_FILE_INFO_ID EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b ) 557529ab889SNikos Nikoleris 558529ab889SNikos Nikoleris typedef struct { 559529ab889SNikos Nikoleris uint64_t size; 560529ab889SNikos Nikoleris uint64_t file_size; 561529ab889SNikos Nikoleris uint64_t physical_size; 562529ab889SNikos Nikoleris efi_time_t create_time; 563529ab889SNikos Nikoleris efi_time_t last_access_time; 564529ab889SNikos Nikoleris efi_time_t modification_time; 565529ab889SNikos Nikoleris uint64_t attributes; 566529ab889SNikos Nikoleris efi_char16_t file_name[1]; 567529ab889SNikos Nikoleris } efi_file_info_t; 568529ab889SNikos Nikoleris 569*b9f8ff7cSAndrew Jones #define efi_fn_call(inst, func, ...) (inst)->func(__VA_ARGS__) 570ad5fb883SZixuan Wang #define efi_bs_call(func, ...) efi_system_table->boottime->func(__VA_ARGS__) 571ad5fb883SZixuan Wang #define efi_rs_call(func, ...) efi_system_table->runtime->func(__VA_ARGS__) 572*b9f8ff7cSAndrew Jones #define efi_call_proto(inst, func, ...) ({ \ 573*b9f8ff7cSAndrew Jones __typeof__(inst) __inst = (inst); \ 574*b9f8ff7cSAndrew Jones efi_fn_call(__inst, func, __inst, ##__VA_ARGS__); \ 575*b9f8ff7cSAndrew Jones }) 576c3770197SVarad Gautam 577c3770197SVarad Gautam #endif /* __LINUX_UEFI_H */ 578