uboot/include/efi_api.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Extensible Firmware Interface
   4 * Based on 'Extensible Firmware Interface Specification' version 0.9,
   5 * April 30, 1999
   6 *
   7 * Copyright (C) 1999 VA Linux Systems
   8 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
   9 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
  10 *      David Mosberger-Tang <davidm@hpl.hp.com>
  11 *      Stephane Eranian <eranian@hpl.hp.com>
  12 *
  13 * From include/linux/efi.h in kernel 4.1 with some additions/subtractions
  14 */
  15
  16#ifndef _EFI_API_H
  17#define _EFI_API_H
  18
  19#include <efi.h>
  20
  21#ifdef CONFIG_EFI_LOADER
  22#include <asm/setjmp.h>
  23#endif
  24
  25/* UEFI spec version 2.7 */
  26#define EFI_SPECIFICATION_VERSION (2 << 16 | 70)
  27
  28/* Types and defines for EFI CreateEvent */
  29enum efi_timer_delay {
  30        EFI_TIMER_STOP = 0,
  31        EFI_TIMER_PERIODIC = 1,
  32        EFI_TIMER_RELATIVE = 2
  33};
  34
  35#define efi_intn_t ssize_t
  36#define efi_uintn_t size_t
  37typedef uint16_t *efi_string_t;
  38
  39#define EVT_TIMER                               0x80000000
  40#define EVT_RUNTIME                             0x40000000
  41#define EVT_NOTIFY_WAIT                         0x00000100
  42#define EVT_NOTIFY_SIGNAL                       0x00000200
  43#define EVT_SIGNAL_EXIT_BOOT_SERVICES           0x00000201
  44#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE       0x60000202
  45
  46#define TPL_APPLICATION         0x04
  47#define TPL_CALLBACK            0x08
  48#define TPL_NOTIFY              0x10
  49#define TPL_HIGH_LEVEL          0x1F
  50
  51struct efi_event;
  52
  53/* EFI Boot Services table */
  54#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
  55struct efi_boot_services {
  56        struct efi_table_hdr hdr;
  57        efi_status_t (EFIAPI *raise_tpl)(efi_uintn_t new_tpl);
  58        void (EFIAPI *restore_tpl)(efi_uintn_t old_tpl);
  59
  60        efi_status_t (EFIAPI *allocate_pages)(int, int, efi_uintn_t,
  61                                              efi_physical_addr_t *);
  62        efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, efi_uintn_t);
  63        efi_status_t (EFIAPI *get_memory_map)(efi_uintn_t *memory_map_size,
  64                                              struct efi_mem_desc *desc,
  65                                              efi_uintn_t *key,
  66                                              efi_uintn_t *desc_size,
  67                                              u32 *desc_version);
  68        efi_status_t (EFIAPI *allocate_pool)(int, efi_uintn_t, void **);
  69        efi_status_t (EFIAPI *free_pool)(void *);
  70
  71        efi_status_t (EFIAPI *create_event)(uint32_t type,
  72                        efi_uintn_t notify_tpl,
  73                        void (EFIAPI *notify_function) (
  74                                        struct efi_event *event,
  75                                        void *context),
  76                        void *notify_context, struct efi_event **event);
  77        efi_status_t (EFIAPI *set_timer)(struct efi_event *event,
  78                                         enum efi_timer_delay type,
  79                                         uint64_t trigger_time);
  80        efi_status_t (EFIAPI *wait_for_event)(efi_uintn_t number_of_events,
  81                                              struct efi_event **event,
  82                                              efi_uintn_t *index);
  83        efi_status_t (EFIAPI *signal_event)(struct efi_event *event);
  84        efi_status_t (EFIAPI *close_event)(struct efi_event *event);
  85        efi_status_t (EFIAPI *check_event)(struct efi_event *event);
  86#define EFI_NATIVE_INTERFACE    0x00000000
  87        efi_status_t (EFIAPI *install_protocol_interface)(
  88                        void **handle, const efi_guid_t *protocol,
  89                        int protocol_interface_type, void *protocol_interface);
  90        efi_status_t (EFIAPI *reinstall_protocol_interface)(
  91                        void *handle, const efi_guid_t *protocol,
  92                        void *old_interface, void *new_interface);
  93        efi_status_t (EFIAPI *uninstall_protocol_interface)(
  94                        efi_handle_t handle, const efi_guid_t *protocol,
  95                        void *protocol_interface);
  96        efi_status_t (EFIAPI *handle_protocol)(
  97                        efi_handle_t handle, const efi_guid_t *protocol,
  98                        void **protocol_interface);
  99        void *reserved;
 100        efi_status_t (EFIAPI *register_protocol_notify)(
 101                        const efi_guid_t *protocol, struct efi_event *event,
 102                        void **registration);
 103        efi_status_t (EFIAPI *locate_handle)(
 104                        enum efi_locate_search_type search_type,
 105                        const efi_guid_t *protocol, void *search_key,
 106                        efi_uintn_t *buffer_size, efi_handle_t *buffer);
 107        efi_status_t (EFIAPI *locate_device_path)(const efi_guid_t *protocol,
 108                        struct efi_device_path **device_path,
 109                        efi_handle_t *device);
 110        efi_status_t (EFIAPI *install_configuration_table)(
 111                        efi_guid_t *guid, void *table);
 112
 113        efi_status_t (EFIAPI *load_image)(bool boot_policiy,
 114                        efi_handle_t parent_image,
 115                        struct efi_device_path *file_path, void *source_buffer,
 116                        efi_uintn_t source_size, efi_handle_t *image);
 117        efi_status_t (EFIAPI *start_image)(efi_handle_t handle,
 118                                           unsigned long *exitdata_size,
 119                                           s16 **exitdata);
 120        efi_status_t (EFIAPI *exit)(efi_handle_t handle,
 121                                    efi_status_t exit_status,
 122                                    unsigned long exitdata_size, s16 *exitdata);
 123        efi_status_t (EFIAPI *unload_image)(efi_handle_t image_handle);
 124        efi_status_t (EFIAPI *exit_boot_services)(efi_handle_t, unsigned long);
 125
 126        efi_status_t (EFIAPI *get_next_monotonic_count)(u64 *count);
 127        efi_status_t (EFIAPI *stall)(unsigned long usecs);
 128        efi_status_t (EFIAPI *set_watchdog_timer)(unsigned long timeout,
 129                        uint64_t watchdog_code, unsigned long data_size,
 130                        uint16_t *watchdog_data);
 131        efi_status_t(EFIAPI *connect_controller)(efi_handle_t controller_handle,
 132                        efi_handle_t *driver_image_handle,
 133                        struct efi_device_path *remaining_device_path,
 134                        bool recursive);
 135        efi_status_t (EFIAPI *disconnect_controller)(
 136                        efi_handle_t controller_handle,
 137                        efi_handle_t driver_image_handle,
 138                        efi_handle_t child_handle);
 139#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
 140#define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
 141#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
 142#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
 143#define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
 144#define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
 145        efi_status_t (EFIAPI *open_protocol)(efi_handle_t handle,
 146                        const efi_guid_t *protocol, void **interface,
 147                        efi_handle_t agent_handle,
 148                        efi_handle_t controller_handle, u32 attributes);
 149        efi_status_t (EFIAPI *close_protocol)(
 150                        efi_handle_t handle, const efi_guid_t *protocol,
 151                        efi_handle_t agent_handle,
 152                        efi_handle_t controller_handle);
 153        efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle,
 154                        const efi_guid_t *protocol,
 155                        struct efi_open_protocol_info_entry **entry_buffer,
 156                        efi_uintn_t *entry_count);
 157        efi_status_t (EFIAPI *protocols_per_handle)(efi_handle_t handle,
 158                        efi_guid_t ***protocol_buffer,
 159                        efi_uintn_t *protocols_buffer_count);
 160        efi_status_t (EFIAPI *locate_handle_buffer) (
 161                        enum efi_locate_search_type search_type,
 162                        const efi_guid_t *protocol, void *search_key,
 163                        efi_uintn_t *no_handles, efi_handle_t **buffer);
 164        efi_status_t (EFIAPI *locate_protocol)(const efi_guid_t *protocol,
 165                        void *registration, void **protocol_interface);
 166        efi_status_t (EFIAPI *install_multiple_protocol_interfaces)(
 167                        void **handle, ...);
 168        efi_status_t (EFIAPI *uninstall_multiple_protocol_interfaces)(
 169                        void *handle, ...);
 170        efi_status_t (EFIAPI *calculate_crc32)(const void *data,
 171                                               efi_uintn_t data_size,
 172                                               u32 *crc32);
 173        void (EFIAPI *copy_mem)(void *destination, const void *source,
 174                        size_t length);
 175        void (EFIAPI *set_mem)(void *buffer, size_t size, uint8_t value);
 176        efi_status_t (EFIAPI *create_event_ex)(
 177                                uint32_t type, efi_uintn_t notify_tpl,
 178                                void (EFIAPI *notify_function) (
 179                                        struct efi_event *event,
 180                                        void *context),
 181                                void *notify_context,
 182                                efi_guid_t *event_group,
 183                                struct efi_event **event);
 184};
 185
 186/* Types and defines for EFI ResetSystem */
 187enum efi_reset_type {
 188        EFI_RESET_COLD = 0,
 189        EFI_RESET_WARM = 1,
 190        EFI_RESET_SHUTDOWN = 2,
 191        EFI_RESET_PLATFORM_SPECIFIC = 3,
 192};
 193
 194/* EFI Runtime Services table */
 195#define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552ULL
 196
 197#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET      0x00010000
 198#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE     0x00020000
 199#define CAPSULE_FLAGS_INITIATE_RESET            0x00040000
 200
 201struct efi_capsule_header {
 202        efi_guid_t *capsule_guid;
 203        u32 header_size;
 204        u32 flags;
 205        u32 capsule_image_size;
 206};
 207
 208struct efi_runtime_services {
 209        struct efi_table_hdr hdr;
 210        efi_status_t (EFIAPI *get_time)(struct efi_time *time,
 211                        struct efi_time_cap *capabilities);
 212        efi_status_t (EFIAPI *set_time)(struct efi_time *time);
 213        efi_status_t (EFIAPI *get_wakeup_time)(char *enabled, char *pending,
 214                        struct efi_time *time);
 215        efi_status_t (EFIAPI *set_wakeup_time)(char enabled,
 216                        struct efi_time *time);
 217        efi_status_t (EFIAPI *set_virtual_address_map)(
 218                        unsigned long memory_map_size,
 219                        unsigned long descriptor_size,
 220                        uint32_t descriptor_version,
 221                        struct efi_mem_desc *virtmap);
 222        efi_status_t (*convert_pointer)(unsigned long dbg, void **address);
 223        efi_status_t (EFIAPI *get_variable)(u16 *variable_name,
 224                                            efi_guid_t *vendor, u32 *attributes,
 225                                            efi_uintn_t *data_size, void *data);
 226        efi_status_t (EFIAPI *get_next_variable_name)(
 227                        efi_uintn_t *variable_name_size,
 228                        u16 *variable_name, efi_guid_t *vendor);
 229        efi_status_t (EFIAPI *set_variable)(u16 *variable_name,
 230                                            efi_guid_t *vendor, u32 attributes,
 231                                            efi_uintn_t data_size, void *data);
 232        efi_status_t (EFIAPI *get_next_high_mono_count)(
 233                        uint32_t *high_count);
 234        void (EFIAPI *reset_system)(enum efi_reset_type reset_type,
 235                                    efi_status_t reset_status,
 236                                    unsigned long data_size, void *reset_data);
 237        efi_status_t (EFIAPI *update_capsule)(
 238                        struct efi_capsule_header **capsule_header_array,
 239                        efi_uintn_t capsule_count,
 240                        u64 scatter_gather_list);
 241        efi_status_t (EFIAPI *query_capsule_caps)(
 242                        struct efi_capsule_header **capsule_header_array,
 243                        efi_uintn_t capsule_count,
 244                        u64 maximum_capsule_size,
 245                        u32 reset_type);
 246        efi_status_t (EFIAPI *query_variable_info)(
 247                        u32 attributes,
 248                        u64 *maximum_variable_storage_size,
 249                        u64 *remaining_variable_storage_size,
 250                        u64 *maximum_variable_size);
 251};
 252
 253/* EFI event group GUID definitions */
 254#define EFI_EVENT_GROUP_EXIT_BOOT_SERVICES \
 255        EFI_GUID(0x27abf055, 0xb1b8, 0x4c26, 0x80, 0x48, \
 256                 0x74, 0x8f, 0x37, 0xba, 0xa2, 0xdf)
 257
 258#define EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE \
 259        EFI_GUID(0x13fa7698, 0xc831, 0x49c7, 0x87, 0xea, \
 260                 0x8f, 0x43, 0xfc, 0xc2, 0x51, 0x96)
 261
 262#define EFI_EVENT_GROUP_MEMORY_MAP_CHANGE \
 263        EFI_GUID(0x78bee926, 0x692f, 0x48fd, 0x9e, 0xdb, \
 264                 0x01, 0x42, 0x2e, 0xf0, 0xd7, 0xab)
 265
 266#define EFI_EVENT_GROUP_READY_TO_BOOT \
 267        EFI_GUID(0x7ce88fb3, 0x4bd7, 0x4679, 0x87, 0xa8, \
 268                 0xa8, 0xd8, 0xde, 0xe5, 0x0d, 0x2b)
 269
 270#define EFI_EVENT_GROUP_RESET_SYSTEM \
 271        EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \
 272                 0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b)
 273
 274/* EFI Configuration Table and GUID definitions */
 275#define NULL_GUID \
 276        EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, \
 277                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
 278
 279#define EFI_GLOBAL_VARIABLE_GUID \
 280        EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, \
 281                 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
 282
 283#define LOADED_IMAGE_PROTOCOL_GUID \
 284        EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, \
 285                 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 286
 287#define EFI_FDT_GUID \
 288        EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
 289                 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
 290
 291#define EFI_ACPI_TABLE_GUID \
 292        EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \
 293                 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
 294
 295#define SMBIOS_TABLE_GUID \
 296        EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
 297                 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 298
 299struct efi_configuration_table {
 300        efi_guid_t guid;
 301        void *table;
 302};
 303
 304#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
 305
 306struct efi_system_table {
 307        struct efi_table_hdr hdr;
 308        u16 *fw_vendor;   /* physical addr of wchar_t vendor string */
 309        u32 fw_revision;
 310        efi_handle_t con_in_handle;
 311        struct efi_simple_text_input_protocol *con_in;
 312        efi_handle_t con_out_handle;
 313        struct efi_simple_text_output_protocol *con_out;
 314        efi_handle_t stderr_handle;
 315        struct efi_simple_text_output_protocol *std_err;
 316        struct efi_runtime_services *runtime;
 317        struct efi_boot_services *boottime;
 318        efi_uintn_t nr_tables;
 319        struct efi_configuration_table *tables;
 320};
 321
 322#define LOADED_IMAGE_GUID \
 323        EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \
 324                 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 325
 326#define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000
 327
 328struct efi_loaded_image {
 329        u32 revision;
 330        void *parent_handle;
 331        struct efi_system_table *system_table;
 332        efi_handle_t device_handle;
 333        struct efi_device_path *file_path;
 334        void *reserved;
 335        u32 load_options_size;
 336        void *load_options;
 337        void *image_base;
 338        aligned_u64 image_size;
 339        unsigned int image_code_type;
 340        unsigned int image_data_type;
 341        unsigned long unload;
 342};
 343
 344#define DEVICE_PATH_GUID \
 345        EFI_GUID(0x09576e91, 0x6d3f, 0x11d2, \
 346                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 347
 348#define DEVICE_PATH_TYPE_END                    0x7f
 349#  define DEVICE_PATH_SUB_TYPE_INSTANCE_END     0x01
 350#  define DEVICE_PATH_SUB_TYPE_END              0xff
 351
 352struct efi_device_path {
 353        u8 type;
 354        u8 sub_type;
 355        u16 length;
 356} __packed;
 357
 358struct efi_mac_addr {
 359        u8 addr[32];
 360} __packed;
 361
 362#define DEVICE_PATH_TYPE_HARDWARE_DEVICE        0x01
 363#  define DEVICE_PATH_SUB_TYPE_MEMORY           0x03
 364#  define DEVICE_PATH_SUB_TYPE_VENDOR           0x04
 365
 366struct efi_device_path_memory {
 367        struct efi_device_path dp;
 368        u32 memory_type;
 369        u64 start_address;
 370        u64 end_address;
 371} __packed;
 372
 373struct efi_device_path_vendor {
 374        struct efi_device_path dp;
 375        efi_guid_t guid;
 376        u8 vendor_data[];
 377} __packed;
 378
 379#define DEVICE_PATH_TYPE_ACPI_DEVICE            0x02
 380#  define DEVICE_PATH_SUB_TYPE_ACPI_DEVICE      0x01
 381
 382#define EFI_PNP_ID(ID)                          (u32)(((ID) << 16) | 0x41D0)
 383#define EISA_PNP_ID(ID)                         EFI_PNP_ID(ID)
 384#define EISA_PNP_NUM(ID)                        ((ID) >> 16)
 385
 386struct efi_device_path_acpi_path {
 387        struct efi_device_path dp;
 388        u32 hid;
 389        u32 uid;
 390} __packed;
 391
 392#define DEVICE_PATH_TYPE_MESSAGING_DEVICE       0x03
 393#  define DEVICE_PATH_SUB_TYPE_MSG_ATAPI        0x01
 394#  define DEVICE_PATH_SUB_TYPE_MSG_SCSI         0x02
 395#  define DEVICE_PATH_SUB_TYPE_MSG_USB          0x05
 396#  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR     0x0b
 397#  define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS    0x0f
 398#  define DEVICE_PATH_SUB_TYPE_MSG_SD           0x1a
 399#  define DEVICE_PATH_SUB_TYPE_MSG_MMC          0x1d
 400
 401struct efi_device_path_atapi {
 402        struct efi_device_path dp;
 403        u8 primary_secondary;
 404        u8 slave_master;
 405        u16 logical_unit_number;
 406} __packed;
 407
 408struct efi_device_path_scsi {
 409        struct efi_device_path dp;
 410        u16 target_id;
 411        u16 logical_unit_number;
 412} __packed;
 413
 414struct efi_device_path_usb {
 415        struct efi_device_path dp;
 416        u8 parent_port_number;
 417        u8 usb_interface;
 418} __packed;
 419
 420struct efi_device_path_mac_addr {
 421        struct efi_device_path dp;
 422        struct efi_mac_addr mac;
 423        u8 if_type;
 424} __packed;
 425
 426struct efi_device_path_usb_class {
 427        struct efi_device_path dp;
 428        u16 vendor_id;
 429        u16 product_id;
 430        u8 device_class;
 431        u8 device_subclass;
 432        u8 device_protocol;
 433} __packed;
 434
 435struct efi_device_path_sd_mmc_path {
 436        struct efi_device_path dp;
 437        u8 slot_number;
 438} __packed;
 439
 440#define DEVICE_PATH_TYPE_MEDIA_DEVICE           0x04
 441#  define DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH  0x01
 442#  define DEVICE_PATH_SUB_TYPE_CDROM_PATH       0x02
 443#  define DEVICE_PATH_SUB_TYPE_FILE_PATH        0x04
 444
 445struct efi_device_path_hard_drive_path {
 446        struct efi_device_path dp;
 447        u32 partition_number;
 448        u64 partition_start;
 449        u64 partition_end;
 450        u8 partition_signature[16];
 451        u8 partmap_type;
 452        u8 signature_type;
 453} __packed;
 454
 455struct efi_device_path_cdrom_path {
 456        struct efi_device_path dp;
 457        u32 boot_entry;
 458        u64 partition_start;
 459        u64 partition_end;
 460} __packed;
 461
 462struct efi_device_path_file_path {
 463        struct efi_device_path dp;
 464        u16 str[];
 465} __packed;
 466
 467#define BLOCK_IO_GUID \
 468        EFI_GUID(0x964e5b21, 0x6459, 0x11d2, \
 469                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 470
 471struct efi_block_io_media {
 472        u32 media_id;
 473        char removable_media;
 474        char media_present;
 475        char logical_partition;
 476        char read_only;
 477        char write_caching;
 478        u8 pad[3];
 479        u32 block_size;
 480        u32 io_align;
 481        u8 pad2[4];
 482        u64 last_block;
 483        /* Added in revision 2 of the protocol */
 484        u64 lowest_aligned_lba;
 485        u32 logical_blocks_per_physical_block;
 486        /* Added in revision 3 of the protocol */
 487        u32 optimal_transfer_length_granualarity;
 488};
 489
 490#define EFI_BLOCK_IO_PROTOCOL_REVISION2 0x00020001
 491#define EFI_BLOCK_IO_PROTOCOL_REVISION3 0x0002001f
 492
 493struct efi_block_io {
 494        u64 revision;
 495        struct efi_block_io_media *media;
 496        efi_status_t (EFIAPI *reset)(struct efi_block_io *this,
 497                        char extended_verification);
 498        efi_status_t (EFIAPI *read_blocks)(struct efi_block_io *this,
 499                        u32 media_id, u64 lba, efi_uintn_t buffer_size,
 500                        void *buffer);
 501        efi_status_t (EFIAPI *write_blocks)(struct efi_block_io *this,
 502                        u32 media_id, u64 lba, efi_uintn_t buffer_size,
 503                        void *buffer);
 504        efi_status_t (EFIAPI *flush_blocks)(struct efi_block_io *this);
 505};
 506
 507struct simple_text_output_mode {
 508        s32 max_mode;
 509        s32 mode;
 510        s32 attribute;
 511        s32 cursor_column;
 512        s32 cursor_row;
 513        bool cursor_visible;
 514};
 515
 516#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
 517        EFI_GUID(0x387477c2, 0x69c7, 0x11d2, \
 518                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 519
 520#define EFI_BLACK                0x00
 521#define EFI_BLUE                 0x01
 522#define EFI_GREEN                0x02
 523#define EFI_CYAN                 0x03
 524#define EFI_RED                  0x04
 525#define EFI_MAGENTA              0x05
 526#define EFI_BROWN                0x06
 527#define EFI_LIGHTGRAY            0x07
 528#define EFI_BRIGHT               0x08
 529#define EFI_DARKGRAY             0x08
 530#define EFI_LIGHTBLUE            0x09
 531#define EFI_LIGHTGREEN           0x0a
 532#define EFI_LIGHTCYAN            0x0b
 533#define EFI_LIGHTRED             0x0c
 534#define EFI_LIGHTMAGENTA         0x0d
 535#define EFI_YELLOW               0x0e
 536#define EFI_WHITE                0x0f
 537#define EFI_BACKGROUND_BLACK     0x00
 538#define EFI_BACKGROUND_BLUE      0x10
 539#define EFI_BACKGROUND_GREEN     0x20
 540#define EFI_BACKGROUND_CYAN      0x30
 541#define EFI_BACKGROUND_RED       0x40
 542#define EFI_BACKGROUND_MAGENTA   0x50
 543#define EFI_BACKGROUND_BROWN     0x60
 544#define EFI_BACKGROUND_LIGHTGRAY 0x70
 545
 546/* extract foreground color from EFI attribute */
 547#define EFI_ATTR_FG(attr)        ((attr) & 0x07)
 548/* treat high bit of FG as bright/bold (similar to edk2) */
 549#define EFI_ATTR_BOLD(attr)      (((attr) >> 3) & 0x01)
 550/* extract background color from EFI attribute */
 551#define EFI_ATTR_BG(attr)        (((attr) >> 4) & 0x7)
 552
 553struct efi_simple_text_output_protocol {
 554        void *reset;
 555        efi_status_t (EFIAPI *output_string)(
 556                        struct efi_simple_text_output_protocol *this,
 557                        const efi_string_t str);
 558        efi_status_t (EFIAPI *test_string)(
 559                        struct efi_simple_text_output_protocol *this,
 560                        const efi_string_t str);
 561        efi_status_t(EFIAPI *query_mode)(
 562                        struct efi_simple_text_output_protocol *this,
 563                        unsigned long mode_number, unsigned long *columns,
 564                        unsigned long *rows);
 565        efi_status_t(EFIAPI *set_mode)(
 566                        struct efi_simple_text_output_protocol *this,
 567                        unsigned long mode_number);
 568        efi_status_t(EFIAPI *set_attribute)(
 569                        struct efi_simple_text_output_protocol *this,
 570                        unsigned long attribute);
 571        efi_status_t(EFIAPI *clear_screen) (
 572                        struct efi_simple_text_output_protocol *this);
 573        efi_status_t(EFIAPI *set_cursor_position) (
 574                        struct efi_simple_text_output_protocol *this,
 575                        unsigned long column, unsigned long row);
 576        efi_status_t(EFIAPI *enable_cursor)(
 577                        struct efi_simple_text_output_protocol *this,
 578                        bool enable);
 579        struct simple_text_output_mode *mode;
 580};
 581
 582#define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \
 583        EFI_GUID(0xdd9e7534, 0x7762, 0x4698, \
 584                 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa)
 585
 586struct efi_input_key {
 587        u16 scan_code;
 588        s16 unicode_char;
 589};
 590
 591#define EFI_SHIFT_STATE_INVALID         0x00000000
 592#define EFI_RIGHT_SHIFT_PRESSED         0x00000001
 593#define EFI_LEFT_SHIFT_PRESSED          0x00000002
 594#define EFI_RIGHT_CONTROL_PRESSED       0x00000004
 595#define EFI_LEFT_CONTROL_PRESSED        0x00000008
 596#define EFI_RIGHT_ALT_PRESSED           0x00000010
 597#define EFI_LEFT_ALT_PRESSED            0x00000020
 598#define EFI_RIGHT_LOGO_PRESSED          0x00000040
 599#define EFI_LEFT_LOGO_PRESSED           0x00000080
 600#define EFI_MENU_KEY_PRESSED            0x00000100
 601#define EFI_SYS_REQ_PRESSED             0x00000200
 602#define EFI_SHIFT_STATE_VALID           0x80000000
 603
 604#define EFI_TOGGLE_STATE_INVALID        0x00
 605#define EFI_SCROLL_LOCK_ACTIVE          0x01
 606#define EFI_NUM_LOCK_ACTIVE             0x02
 607#define EFI_CAPS_LOCK_ACTIVE            0x04
 608#define EFI_KEY_STATE_EXPOSED           0x40
 609#define EFI_TOGGLE_STATE_VALID          0x80
 610
 611struct efi_key_state {
 612        u32 key_shift_state;
 613        u8 key_toggle_state;
 614};
 615
 616struct efi_key_data {
 617        struct efi_input_key key;
 618        struct efi_key_state key_state;
 619};
 620
 621struct efi_simple_text_input_ex_protocol {
 622        efi_status_t (EFIAPI *reset) (
 623                struct efi_simple_text_input_ex_protocol *this,
 624                bool extended_verification);
 625        efi_status_t (EFIAPI *read_key_stroke_ex) (
 626                struct efi_simple_text_input_ex_protocol *this,
 627                struct efi_key_data *key_data);
 628        struct efi_event *wait_for_key_ex;
 629        efi_status_t (EFIAPI *set_state) (
 630                struct efi_simple_text_input_ex_protocol *this,
 631                u8 key_toggle_state);
 632        efi_status_t (EFIAPI *register_key_notify) (
 633                struct efi_simple_text_input_ex_protocol *this,
 634                struct efi_key_data *key_data,
 635                efi_status_t (EFIAPI *key_notify_function)(
 636                        struct efi_key_data *key_data),
 637                void **notify_handle);
 638        efi_status_t (EFIAPI *unregister_key_notify) (
 639                struct efi_simple_text_input_ex_protocol *this,
 640                void *notification_handle);
 641};
 642
 643#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \
 644        EFI_GUID(0x387477c1, 0x69c7, 0x11d2, \
 645                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 646
 647struct efi_simple_text_input_protocol {
 648        efi_status_t(EFIAPI *reset)(struct efi_simple_text_input_protocol *this,
 649                                    bool extended_verification);
 650        efi_status_t(EFIAPI *read_key_stroke)(
 651                        struct efi_simple_text_input_protocol *this,
 652                        struct efi_input_key *key);
 653        struct efi_event *wait_for_key;
 654};
 655
 656#define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
 657        EFI_GUID(0x8b843e20, 0x8132, 0x4852, \
 658                 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c)
 659
 660struct efi_device_path_to_text_protocol {
 661        uint16_t *(EFIAPI *convert_device_node_to_text)(
 662                        struct efi_device_path *device_node,
 663                        bool display_only,
 664                        bool allow_shortcuts);
 665        uint16_t *(EFIAPI *convert_device_path_to_text)(
 666                        struct efi_device_path *device_path,
 667                        bool display_only,
 668                        bool allow_shortcuts);
 669};
 670
 671#define EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \
 672        EFI_GUID(0x0379be4e, 0xd706, 0x437d, \
 673                 0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4)
 674
 675struct efi_device_path_utilities_protocol {
 676        efi_uintn_t (EFIAPI *get_device_path_size)(
 677                const struct efi_device_path *device_path);
 678        struct efi_device_path *(EFIAPI *duplicate_device_path)(
 679                const struct efi_device_path *device_path);
 680        struct efi_device_path *(EFIAPI *append_device_path)(
 681                const struct efi_device_path *src1,
 682                const struct efi_device_path *src2);
 683        struct efi_device_path *(EFIAPI *append_device_node)(
 684                const struct efi_device_path *device_path,
 685                const struct efi_device_path *device_node);
 686        struct efi_device_path *(EFIAPI *append_device_path_instance)(
 687                const struct efi_device_path *device_path,
 688                const struct efi_device_path *device_path_instance);
 689        struct efi_device_path *(EFIAPI *get_next_device_path_instance)(
 690                struct efi_device_path **device_path_instance,
 691                efi_uintn_t *device_path_instance_size);
 692        bool (EFIAPI *is_device_path_multi_instance)(
 693                const struct efi_device_path *device_path);
 694        struct efi_device_path *(EFIAPI *create_device_node)(
 695                uint8_t node_type,
 696                uint8_t node_sub_type,
 697                uint16_t node_length);
 698};
 699
 700#define EFI_GOP_GUID \
 701        EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
 702                 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
 703
 704#define EFI_GOT_RGBA8           0
 705#define EFI_GOT_BGRA8           1
 706#define EFI_GOT_BITMASK         2
 707
 708struct efi_gop_mode_info {
 709        u32 version;
 710        u32 width;
 711        u32 height;
 712        u32 pixel_format;
 713        u32 pixel_bitmask[4];
 714        u32 pixels_per_scanline;
 715};
 716
 717struct efi_gop_mode {
 718        u32 max_mode;
 719        u32 mode;
 720        struct efi_gop_mode_info *info;
 721        unsigned long info_size;
 722        efi_physical_addr_t fb_base;
 723        unsigned long fb_size;
 724};
 725
 726struct efi_gop_pixel {
 727        u8 blue;
 728        u8 green;
 729        u8 red;
 730        u8 reserved;
 731};
 732
 733#define EFI_BLT_VIDEO_FILL              0
 734#define EFI_BLT_VIDEO_TO_BLT_BUFFER     1
 735#define EFI_BLT_BUFFER_TO_VIDEO         2
 736#define EFI_BLT_VIDEO_TO_VIDEO          3
 737
 738struct efi_gop {
 739        efi_status_t (EFIAPI *query_mode)(struct efi_gop *this, u32 mode_number,
 740                                          efi_uintn_t *size_of_info,
 741                                          struct efi_gop_mode_info **info);
 742        efi_status_t (EFIAPI *set_mode)(struct efi_gop *this, u32 mode_number);
 743        efi_status_t (EFIAPI *blt)(struct efi_gop *this,
 744                                   struct efi_gop_pixel *buffer,
 745                                   u32 operation, efi_uintn_t sx,
 746                                   efi_uintn_t sy, efi_uintn_t dx,
 747                                   efi_uintn_t dy, efi_uintn_t width,
 748                                   efi_uintn_t height, efi_uintn_t delta);
 749        struct efi_gop_mode *mode;
 750};
 751
 752#define EFI_SIMPLE_NETWORK_GUID \
 753        EFI_GUID(0xa19832b9, 0xac25, 0x11d3, \
 754                 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 755
 756struct efi_mac_address {
 757        char mac_addr[32];
 758};
 759
 760struct efi_ip_address {
 761        u8 ip_addr[16];
 762} __attribute__((aligned(4)));
 763
 764enum efi_simple_network_state {
 765        EFI_NETWORK_STOPPED,
 766        EFI_NETWORK_STARTED,
 767        EFI_NETWORK_INITIALIZED,
 768};
 769
 770struct efi_simple_network_mode {
 771        enum efi_simple_network_state state;
 772        u32 hwaddr_size;
 773        u32 media_header_size;
 774        u32 max_packet_size;
 775        u32 nvram_size;
 776        u32 nvram_access_size;
 777        u32 receive_filter_mask;
 778        u32 receive_filter_setting;
 779        u32 max_mcast_filter_count;
 780        u32 mcast_filter_count;
 781        struct efi_mac_address mcast_filter[16];
 782        struct efi_mac_address current_address;
 783        struct efi_mac_address broadcast_address;
 784        struct efi_mac_address permanent_address;
 785        u8 if_type;
 786        u8 mac_changeable;
 787        u8 multitx_supported;
 788        u8 media_present_supported;
 789        u8 media_present;
 790};
 791
 792/* receive_filters bit mask */
 793#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST               0x01
 794#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST             0x02
 795#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST             0x04
 796#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS           0x08
 797#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
 798
 799/* interrupt status bit mask */
 800#define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT    0x01
 801#define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT   0x02
 802#define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT    0x04
 803#define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT   0x08
 804
 805/* revision of the simple network protocol */
 806#define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION    0x00010000
 807
 808struct efi_simple_network {
 809        u64 revision;
 810        efi_status_t (EFIAPI *start)(struct efi_simple_network *this);
 811        efi_status_t (EFIAPI *stop)(struct efi_simple_network *this);
 812        efi_status_t (EFIAPI *initialize)(struct efi_simple_network *this,
 813                        ulong extra_rx, ulong extra_tx);
 814        efi_status_t (EFIAPI *reset)(struct efi_simple_network *this,
 815                        int extended_verification);
 816        efi_status_t (EFIAPI *shutdown)(struct efi_simple_network *this);
 817        efi_status_t (EFIAPI *receive_filters)(struct efi_simple_network *this,
 818                        u32 enable, u32 disable, int reset_mcast_filter,
 819                        ulong mcast_filter_count,
 820                        struct efi_mac_address *mcast_filter);
 821        efi_status_t (EFIAPI *station_address)(struct efi_simple_network *this,
 822                        int reset, struct efi_mac_address *new_mac);
 823        efi_status_t (EFIAPI *statistics)(struct efi_simple_network *this,
 824                        int reset, ulong *stat_size, void *stat_table);
 825        efi_status_t (EFIAPI *mcastiptomac)(struct efi_simple_network *this,
 826                        int ipv6, struct efi_ip_address *ip,
 827                        struct efi_mac_address *mac);
 828        efi_status_t (EFIAPI *nvdata)(struct efi_simple_network *this,
 829                        int read_write, ulong offset, ulong buffer_size,
 830                        char *buffer);
 831        efi_status_t (EFIAPI *get_status)(struct efi_simple_network *this,
 832                        u32 *int_status, void **txbuf);
 833        efi_status_t (EFIAPI *transmit)(struct efi_simple_network *this,
 834                        size_t header_size, size_t buffer_size, void *buffer,
 835                        struct efi_mac_address *src_addr,
 836                        struct efi_mac_address *dest_addr, u16 *protocol);
 837        efi_status_t (EFIAPI *receive)(struct efi_simple_network *this,
 838                        size_t *header_size, size_t *buffer_size, void *buffer,
 839                        struct efi_mac_address *src_addr,
 840                        struct efi_mac_address *dest_addr, u16 *protocol);
 841        struct efi_event *wait_for_packet;
 842        struct efi_simple_network_mode *mode;
 843};
 844
 845#define EFI_PXE_GUID \
 846        EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \
 847                 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 848
 849struct efi_pxe_packet {
 850        u8 packet[1472];
 851};
 852
 853struct efi_pxe_mode {
 854        u8 started;
 855        u8 ipv6_available;
 856        u8 ipv6_supported;
 857        u8 using_ipv6;
 858        u8 bis_supported;
 859        u8 bis_detected;
 860        u8 auto_arp;
 861        u8 send_guid;
 862        u8 dhcp_discover_valid;
 863        u8 dhcp_ack_received;
 864        u8 proxy_offer_received;
 865        u8 pxe_discover_valid;
 866        u8 pxe_reply_received;
 867        u8 pxe_bis_reply_received;
 868        u8 icmp_error_received;
 869        u8 tftp_error_received;
 870        u8 make_callbacks;
 871        u8 ttl;
 872        u8 tos;
 873        u8 pad;
 874        struct efi_ip_address station_ip;
 875        struct efi_ip_address subnet_mask;
 876        struct efi_pxe_packet dhcp_discover;
 877        struct efi_pxe_packet dhcp_ack;
 878        struct efi_pxe_packet proxy_offer;
 879        struct efi_pxe_packet pxe_discover;
 880        struct efi_pxe_packet pxe_reply;
 881};
 882
 883struct efi_pxe {
 884        u64 rev;
 885        void (EFIAPI *start)(void);
 886        void (EFIAPI *stop)(void);
 887        void (EFIAPI *dhcp)(void);
 888        void (EFIAPI *discover)(void);
 889        void (EFIAPI *mftp)(void);
 890        void (EFIAPI *udpwrite)(void);
 891        void (EFIAPI *udpread)(void);
 892        void (EFIAPI *setipfilter)(void);
 893        void (EFIAPI *arp)(void);
 894        void (EFIAPI *setparams)(void);
 895        void (EFIAPI *setstationip)(void);
 896        void (EFIAPI *setpackets)(void);
 897        struct efi_pxe_mode *mode;
 898};
 899
 900#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
 901        EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
 902                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 903#define EFI_FILE_PROTOCOL_REVISION 0x00010000
 904
 905struct efi_file_handle {
 906        u64 rev;
 907        efi_status_t (EFIAPI *open)(struct efi_file_handle *file,
 908                        struct efi_file_handle **new_handle,
 909                        s16 *file_name, u64 open_mode, u64 attributes);
 910        efi_status_t (EFIAPI *close)(struct efi_file_handle *file);
 911        efi_status_t (EFIAPI *delete)(struct efi_file_handle *file);
 912        efi_status_t (EFIAPI *read)(struct efi_file_handle *file,
 913                        efi_uintn_t *buffer_size, void *buffer);
 914        efi_status_t (EFIAPI *write)(struct efi_file_handle *file,
 915                        efi_uintn_t *buffer_size, void *buffer);
 916        efi_status_t (EFIAPI *getpos)(struct efi_file_handle *file,
 917                                      u64 *pos);
 918        efi_status_t (EFIAPI *setpos)(struct efi_file_handle *file,
 919                                      u64 pos);
 920        efi_status_t (EFIAPI *getinfo)(struct efi_file_handle *file,
 921                        const efi_guid_t *info_type, efi_uintn_t *buffer_size,
 922                        void *buffer);
 923        efi_status_t (EFIAPI *setinfo)(struct efi_file_handle *file,
 924                        const efi_guid_t *info_type, efi_uintn_t buffer_size,
 925                        void *buffer);
 926        efi_status_t (EFIAPI *flush)(struct efi_file_handle *file);
 927};
 928
 929#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
 930        EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
 931                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 932#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000
 933
 934struct efi_simple_file_system_protocol {
 935        u64 rev;
 936        efi_status_t (EFIAPI *open_volume)(struct efi_simple_file_system_protocol *this,
 937                        struct efi_file_handle **root);
 938};
 939
 940#define EFI_FILE_INFO_GUID \
 941        EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, \
 942                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 943
 944#define EFI_FILE_SYSTEM_INFO_GUID \
 945        EFI_GUID(0x09576e93, 0x6d3f, 0x11d2, \
 946                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 947
 948#define EFI_FILE_MODE_READ      0x0000000000000001
 949#define EFI_FILE_MODE_WRITE     0x0000000000000002
 950#define EFI_FILE_MODE_CREATE    0x8000000000000000
 951
 952#define EFI_FILE_READ_ONLY      0x0000000000000001
 953#define EFI_FILE_HIDDEN         0x0000000000000002
 954#define EFI_FILE_SYSTEM         0x0000000000000004
 955#define EFI_FILE_RESERVED       0x0000000000000008
 956#define EFI_FILE_DIRECTORY      0x0000000000000010
 957#define EFI_FILE_ARCHIVE        0x0000000000000020
 958#define EFI_FILE_VALID_ATTR     0x0000000000000037
 959
 960struct efi_file_info {
 961        u64 size;
 962        u64 file_size;
 963        u64 physical_size;
 964        struct efi_time create_time;
 965        struct efi_time last_access_time;
 966        struct efi_time modification_time;
 967        u64 attribute;
 968        s16 file_name[0];
 969};
 970
 971struct efi_file_system_info {
 972        u64 size;
 973        u8 read_only;
 974        u64 volume_size;
 975        u64 free_space;
 976        u32 block_size;
 977        u16 volume_label[0];
 978};
 979
 980#define EFI_DRIVER_BINDING_PROTOCOL_GUID \
 981        EFI_GUID(0x18a031ab, 0xb443, 0x4d1a,\
 982                 0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71)
 983struct efi_driver_binding_protocol {
 984        efi_status_t (EFIAPI * supported)(
 985                        struct efi_driver_binding_protocol *this,
 986                        efi_handle_t controller_handle,
 987                        struct efi_device_path *remaining_device_path);
 988        efi_status_t (EFIAPI * start)(
 989                        struct efi_driver_binding_protocol *this,
 990                        efi_handle_t controller_handle,
 991                        struct efi_device_path *remaining_device_path);
 992        efi_status_t (EFIAPI * stop)(
 993                        struct efi_driver_binding_protocol *this,
 994                        efi_handle_t controller_handle,
 995                        efi_uintn_t number_of_children,
 996                        efi_handle_t *child_handle_buffer);
 997        u32 version;
 998        efi_handle_t image_handle;
 999        efi_handle_t driver_binding_handle;
1000};
1001
1002#define EFI_UNICODE_COLLATION_PROTOCOL2_GUID \
1003        EFI_GUID(0xa4c751fc, 0x23ae, 0x4c3e, \
1004                 0x92, 0xe9, 0x49, 0x64, 0xcf, 0x63, 0xf3, 0x49)
1005struct efi_unicode_collation_protocol {
1006        efi_intn_t (EFIAPI *stri_coll)(
1007                struct efi_unicode_collation_protocol *this, u16 *s1, u16 *s2);
1008        bool (EFIAPI *metai_match)(struct efi_unicode_collation_protocol *this,
1009                                   const u16 *string, const u16 *patter);
1010        void (EFIAPI *str_lwr)(struct efi_unicode_collation_protocol
1011                               *this, u16 *string);
1012        void (EFIAPI *str_upr)(struct efi_unicode_collation_protocol *this,
1013                               u16 *string);
1014        void (EFIAPI *fat_to_str)(struct efi_unicode_collation_protocol *this,
1015                                  efi_uintn_t fat_size, char *fat, u16 *string);
1016        bool (EFIAPI *str_to_fat)(struct efi_unicode_collation_protocol *this,
1017                                  const u16 *string, efi_uintn_t fat_size,
1018                                  char *fat);
1019        char *supported_languages;
1020};
1021
1022#endif
1023