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#include <charset.h>
  21#include <pe.h>
  22
  23/* UEFI spec version 2.9 */
  24#define EFI_SPECIFICATION_VERSION (2 << 16 | 90)
  25
  26/* Types and defines for EFI CreateEvent */
  27enum efi_timer_delay {
  28        EFI_TIMER_STOP = 0,
  29        EFI_TIMER_PERIODIC = 1,
  30        EFI_TIMER_RELATIVE = 2
  31};
  32
  33typedef void *efi_hii_handle_t;
  34typedef u16 *efi_string_t;
  35typedef u16 efi_string_id_t;
  36typedef u32 efi_hii_font_style_t;
  37typedef u16 efi_question_id_t;
  38typedef u16 efi_image_id_t;
  39typedef u16 efi_form_id_t;
  40
  41#define EVT_TIMER                               0x80000000
  42#define EVT_RUNTIME                             0x40000000
  43#define EVT_NOTIFY_WAIT                         0x00000100
  44#define EVT_NOTIFY_SIGNAL                       0x00000200
  45#define EVT_SIGNAL_EXIT_BOOT_SERVICES           0x00000201
  46#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE       0x60000202
  47
  48#define TPL_APPLICATION         0x04
  49#define TPL_CALLBACK            0x08
  50#define TPL_NOTIFY              0x10
  51#define TPL_HIGH_LEVEL          0x1F
  52
  53struct efi_event;
  54
  55/* OsIndicationsSupported flags */
  56#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI                    0x0000000000000001
  57#define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION             0x0000000000000002
  58#define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED  0x0000000000000004
  59#define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED            0x0000000000000008
  60#define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED     0x0000000000000010
  61#define EFI_OS_INDICATIONS_START_OS_RECOVERY                0x0000000000000020
  62#define EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY          0x0000000000000040
  63#define EFI_OS_INDICATIONS_JSON_CONFIG_DATA_REFRESH         0x0000000000000080
  64
  65/* EFI Boot Services table */
  66#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
  67struct efi_boot_services {
  68        struct efi_table_hdr hdr;
  69        efi_status_t (EFIAPI *raise_tpl)(efi_uintn_t new_tpl);
  70        void (EFIAPI *restore_tpl)(efi_uintn_t old_tpl);
  71
  72        efi_status_t (EFIAPI *allocate_pages)(int, int, efi_uintn_t,
  73                                              efi_physical_addr_t *);
  74        efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, efi_uintn_t);
  75        efi_status_t (EFIAPI *get_memory_map)(efi_uintn_t *memory_map_size,
  76                                              struct efi_mem_desc *desc,
  77                                              efi_uintn_t *key,
  78                                              efi_uintn_t *desc_size,
  79                                              u32 *desc_version);
  80        efi_status_t (EFIAPI *allocate_pool)(int, efi_uintn_t, void **);
  81        efi_status_t (EFIAPI *free_pool)(void *);
  82
  83        efi_status_t (EFIAPI *create_event)(uint32_t type,
  84                        efi_uintn_t notify_tpl,
  85                        void (EFIAPI *notify_function) (
  86                                        struct efi_event *event,
  87                                        void *context),
  88                        void *notify_context, struct efi_event **event);
  89        efi_status_t (EFIAPI *set_timer)(struct efi_event *event,
  90                                         enum efi_timer_delay type,
  91                                         uint64_t trigger_time);
  92        efi_status_t (EFIAPI *wait_for_event)(efi_uintn_t number_of_events,
  93                                              struct efi_event **event,
  94                                              efi_uintn_t *index);
  95        efi_status_t (EFIAPI *signal_event)(struct efi_event *event);
  96        efi_status_t (EFIAPI *close_event)(struct efi_event *event);
  97        efi_status_t (EFIAPI *check_event)(struct efi_event *event);
  98#define EFI_NATIVE_INTERFACE    0x00000000
  99        efi_status_t (EFIAPI *install_protocol_interface)(
 100                        efi_handle_t *handle, const efi_guid_t *protocol,
 101                        int protocol_interface_type, void *protocol_interface);
 102        efi_status_t (EFIAPI *reinstall_protocol_interface)(
 103                        efi_handle_t handle, const efi_guid_t *protocol,
 104                        void *old_interface, void *new_interface);
 105        efi_status_t (EFIAPI *uninstall_protocol_interface)(
 106                        efi_handle_t handle, const efi_guid_t *protocol,
 107                        void *protocol_interface);
 108        efi_status_t (EFIAPI *handle_protocol)(
 109                        efi_handle_t handle, const efi_guid_t *protocol,
 110                        void **protocol_interface);
 111        void *reserved;
 112        efi_status_t (EFIAPI *register_protocol_notify)(
 113                        const efi_guid_t *protocol, struct efi_event *event,
 114                        void **registration);
 115        efi_status_t (EFIAPI *locate_handle)(
 116                        enum efi_locate_search_type search_type,
 117                        const efi_guid_t *protocol, void *search_key,
 118                        efi_uintn_t *buffer_size, efi_handle_t *buffer);
 119        efi_status_t (EFIAPI *locate_device_path)(const efi_guid_t *protocol,
 120                        struct efi_device_path **device_path,
 121                        efi_handle_t *device);
 122        efi_status_t (EFIAPI *install_configuration_table)(
 123                        const efi_guid_t *guid, void *table);
 124
 125        efi_status_t (EFIAPI *load_image)(bool boot_policiy,
 126                        efi_handle_t parent_image,
 127                        struct efi_device_path *file_path, void *source_buffer,
 128                        efi_uintn_t source_size, efi_handle_t *image);
 129        efi_status_t (EFIAPI *start_image)(efi_handle_t handle,
 130                                           efi_uintn_t *exitdata_size,
 131                                           u16 **exitdata);
 132        efi_status_t (EFIAPI *exit)(efi_handle_t handle,
 133                                    efi_status_t exit_status,
 134                                    efi_uintn_t exitdata_size, u16 *exitdata);
 135        efi_status_t (EFIAPI *unload_image)(efi_handle_t image_handle);
 136        efi_status_t (EFIAPI *exit_boot_services)(efi_handle_t image_handle,
 137                                                  efi_uintn_t map_key);
 138
 139        efi_status_t (EFIAPI *get_next_monotonic_count)(u64 *count);
 140        efi_status_t (EFIAPI *stall)(unsigned long usecs);
 141        efi_status_t (EFIAPI *set_watchdog_timer)(unsigned long timeout,
 142                        uint64_t watchdog_code, unsigned long data_size,
 143                        uint16_t *watchdog_data);
 144        efi_status_t(EFIAPI *connect_controller)(efi_handle_t controller_handle,
 145                        efi_handle_t *driver_image_handle,
 146                        struct efi_device_path *remaining_device_path,
 147                        bool recursive);
 148        efi_status_t (EFIAPI *disconnect_controller)(
 149                        efi_handle_t controller_handle,
 150                        efi_handle_t driver_image_handle,
 151                        efi_handle_t child_handle);
 152#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
 153#define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
 154#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
 155#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
 156#define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
 157#define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
 158        efi_status_t (EFIAPI *open_protocol)(efi_handle_t handle,
 159                        const efi_guid_t *protocol, void **interface,
 160                        efi_handle_t agent_handle,
 161                        efi_handle_t controller_handle, u32 attributes);
 162        efi_status_t (EFIAPI *close_protocol)(
 163                        efi_handle_t handle, const efi_guid_t *protocol,
 164                        efi_handle_t agent_handle,
 165                        efi_handle_t controller_handle);
 166        efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle,
 167                        const efi_guid_t *protocol,
 168                        struct efi_open_protocol_info_entry **entry_buffer,
 169                        efi_uintn_t *entry_count);
 170        efi_status_t (EFIAPI *protocols_per_handle)(efi_handle_t handle,
 171                        efi_guid_t ***protocol_buffer,
 172                        efi_uintn_t *protocols_buffer_count);
 173        efi_status_t (EFIAPI *locate_handle_buffer) (
 174                        enum efi_locate_search_type search_type,
 175                        const efi_guid_t *protocol, void *search_key,
 176                        efi_uintn_t *no_handles, efi_handle_t **buffer);
 177        efi_status_t (EFIAPI *locate_protocol)(const efi_guid_t *protocol,
 178                        void *registration, void **protocol_interface);
 179        efi_status_t (EFIAPI *install_multiple_protocol_interfaces)(
 180                        efi_handle_t *handle, ...);
 181        efi_status_t (EFIAPI *uninstall_multiple_protocol_interfaces)(
 182                        efi_handle_t handle, ...);
 183        efi_status_t (EFIAPI *calculate_crc32)(const void *data,
 184                                               efi_uintn_t data_size,
 185                                               u32 *crc32);
 186        void (EFIAPI *copy_mem)(void *destination, const void *source,
 187                        size_t length);
 188        void (EFIAPI *set_mem)(void *buffer, size_t size, uint8_t value);
 189        efi_status_t (EFIAPI *create_event_ex)(
 190                                uint32_t type, efi_uintn_t notify_tpl,
 191                                void (EFIAPI *notify_function) (
 192                                        struct efi_event *event,
 193                                        void *context),
 194                                void *notify_context,
 195                                efi_guid_t *event_group,
 196                                struct efi_event **event);
 197};
 198
 199/* Types and defines for EFI ResetSystem */
 200enum efi_reset_type {
 201        EFI_RESET_COLD = 0,
 202        EFI_RESET_WARM = 1,
 203        EFI_RESET_SHUTDOWN = 2,
 204        EFI_RESET_PLATFORM_SPECIFIC = 3,
 205};
 206
 207/* EFI Runtime Services table */
 208#define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552ULL
 209
 210#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET      0x00010000
 211#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE     0x00020000
 212#define CAPSULE_FLAGS_INITIATE_RESET            0x00040000
 213
 214#define CAPSULE_SUPPORT_AUTHENTICATION          0x0000000000000001
 215#define CAPSULE_SUPPORT_DEPENDENCY              0x0000000000000002
 216
 217#define EFI_CAPSULE_REPORT_GUID \
 218        EFI_GUID(0x39b68c46, 0xf7fb, 0x441b, 0xb6, 0xec, \
 219                 0x16, 0xb0, 0xf6, 0x98, 0x21, 0xf3)
 220
 221#define EFI_MEMORY_RANGE_CAPSULE_GUID \
 222        EFI_GUID(0xde9f0ec, 0x88b6, 0x428f, 0x97, 0x7a, \
 223                 0x25, 0x8f, 0x1d, 0xe, 0x5e, 0x72)
 224
 225#define EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID \
 226        EFI_GUID(0x6dcbd5ed, 0xe82d, 0x4c44, 0xbd, 0xa1, \
 227                 0x71, 0x94, 0x19, 0x9a, 0xd9, 0x2a)
 228
 229struct efi_capsule_header {
 230        efi_guid_t capsule_guid;
 231        u32 header_size;
 232        u32 flags;
 233        u32 capsule_image_size;
 234} __packed;
 235
 236struct efi_capsule_result_variable_header {
 237        u32 variable_total_size;
 238        u32 reserved;
 239        efi_guid_t capsule_guid;
 240        struct efi_time capsule_processed;
 241        efi_status_t capsule_status;
 242} __packed;
 243
 244struct efi_memory_range {
 245        efi_physical_addr_t     address;
 246        u64                     length;
 247};
 248
 249struct efi_memory_range_capsule {
 250        struct efi_capsule_header *header;
 251        /* EFI_MEMORY_TYPE: 0x80000000-0xFFFFFFFF */
 252        enum efi_memory_type os_requested_memory_type;
 253        u64 number_of_memory_ranges;
 254        struct efi_memory_range memory_ranges[];
 255} __packed;
 256
 257struct efi_firmware_management_capsule_header {
 258        u32 version;
 259        u16 embedded_driver_count;
 260        u16 payload_item_count;
 261        u64 item_offset_list[];
 262} __packed;
 263
 264struct efi_firmware_management_capsule_image_header {
 265        u32 version;
 266        efi_guid_t update_image_type_id;
 267        u8 update_image_index;
 268        u8 reserved[3];
 269        u32 update_image_size;
 270        u32 update_vendor_code_size;
 271        u64 update_hardware_instance;
 272        u64 image_capsule_support;
 273} __packed;
 274
 275struct efi_capsule_result_variable_fmp {
 276        u16 version;
 277        u8 payload_index;
 278        u8 update_image_index;
 279        efi_guid_t update_image_type_id;
 280        // u16 capsule_file_name[];
 281        // u16 capsule_target[];
 282} __packed;
 283
 284#define EFI_RT_SUPPORTED_GET_TIME                       0x0001
 285#define EFI_RT_SUPPORTED_SET_TIME                       0x0002
 286#define EFI_RT_SUPPORTED_GET_WAKEUP_TIME                0x0004
 287#define EFI_RT_SUPPORTED_SET_WAKEUP_TIME                0x0008
 288#define EFI_RT_SUPPORTED_GET_VARIABLE                   0x0010
 289#define EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME         0x0020
 290#define EFI_RT_SUPPORTED_SET_VARIABLE                   0x0040
 291#define EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP        0x0080
 292#define EFI_RT_SUPPORTED_CONVERT_POINTER                0x0100
 293#define EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT  0x0200
 294#define EFI_RT_SUPPORTED_RESET_SYSTEM                   0x0400
 295#define EFI_RT_SUPPORTED_UPDATE_CAPSULE                 0x0800
 296#define EFI_RT_SUPPORTED_QUERY_CAPSULE_CAPABILITIES     0x1000
 297#define EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO            0x2000
 298
 299#define EFI_RT_PROPERTIES_TABLE_GUID \
 300        EFI_GUID(0xeb66918a, 0x7eef, 0x402a, 0x84, 0x2e, \
 301                 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9)
 302
 303#define EFI_RT_PROPERTIES_TABLE_VERSION 0x1
 304
 305struct efi_rt_properties_table {
 306        u16 version;
 307        u16 length;
 308        u32 runtime_services_supported;
 309};
 310
 311#define EFI_OPTIONAL_PTR        0x00000001
 312
 313struct efi_runtime_services {
 314        struct efi_table_hdr hdr;
 315        efi_status_t (EFIAPI *get_time)(struct efi_time *time,
 316                        struct efi_time_cap *capabilities);
 317        efi_status_t (EFIAPI *set_time)(struct efi_time *time);
 318        efi_status_t (EFIAPI *get_wakeup_time)(char *enabled, char *pending,
 319                        struct efi_time *time);
 320        efi_status_t (EFIAPI *set_wakeup_time)(char enabled,
 321                        struct efi_time *time);
 322        efi_status_t (EFIAPI *set_virtual_address_map)(
 323                        efi_uintn_t memory_map_size,
 324                        efi_uintn_t descriptor_size,
 325                        uint32_t descriptor_version,
 326                        struct efi_mem_desc *virtmap);
 327        efi_status_t (EFIAPI *convert_pointer)(
 328                        efi_uintn_t debug_disposition, void **address);
 329        efi_status_t (EFIAPI *get_variable)(u16 *variable_name,
 330                                            const efi_guid_t *vendor,
 331                                            u32 *attributes,
 332                                            efi_uintn_t *data_size, void *data);
 333        efi_status_t (EFIAPI *get_next_variable_name)(
 334                        efi_uintn_t *variable_name_size,
 335                        u16 *variable_name, efi_guid_t *vendor);
 336        efi_status_t (EFIAPI *set_variable)(u16 *variable_name,
 337                                            const efi_guid_t *vendor,
 338                                            u32 attributes,
 339                                            efi_uintn_t data_size,
 340                                            const void *data);
 341        efi_status_t (EFIAPI *get_next_high_mono_count)(
 342                        uint32_t *high_count);
 343        void (EFIAPI *reset_system)(enum efi_reset_type reset_type,
 344                                    efi_status_t reset_status,
 345                                    unsigned long data_size, void *reset_data);
 346        efi_status_t (EFIAPI *update_capsule)(
 347                        struct efi_capsule_header **capsule_header_array,
 348                        efi_uintn_t capsule_count,
 349                        u64 scatter_gather_list);
 350        efi_status_t (EFIAPI *query_capsule_caps)(
 351                        struct efi_capsule_header **capsule_header_array,
 352                        efi_uintn_t capsule_count,
 353                        u64 *maximum_capsule_size,
 354                        u32 *reset_type);
 355        efi_status_t (EFIAPI *query_variable_info)(
 356                        u32 attributes,
 357                        u64 *maximum_variable_storage_size,
 358                        u64 *remaining_variable_storage_size,
 359                        u64 *maximum_variable_size);
 360};
 361
 362/* EFI event group GUID definitions */
 363
 364#define EFI_EVENT_GROUP_EXIT_BOOT_SERVICES \
 365        EFI_GUID(0x27abf055, 0xb1b8, 0x4c26, 0x80, 0x48, \
 366                 0x74, 0x8f, 0x37, 0xba, 0xa2, 0xdf)
 367
 368#define EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES \
 369        EFI_GUID(0x8be0e274, 0x3970, 0x4b44, 0x80, 0xc5, \
 370                 0x1a, 0xb9, 0x50, 0x2f, 0x3b, 0xfc)
 371
 372#define EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE \
 373        EFI_GUID(0x13fa7698, 0xc831, 0x49c7, 0x87, 0xea, \
 374                 0x8f, 0x43, 0xfc, 0xc2, 0x51, 0x96)
 375
 376#define EFI_EVENT_GROUP_MEMORY_MAP_CHANGE \
 377        EFI_GUID(0x78bee926, 0x692f, 0x48fd, 0x9e, 0xdb, \
 378                 0x01, 0x42, 0x2e, 0xf0, 0xd7, 0xab)
 379
 380#define EFI_EVENT_GROUP_READY_TO_BOOT \
 381        EFI_GUID(0x7ce88fb3, 0x4bd7, 0x4679, 0x87, 0xa8, \
 382                 0xa8, 0xd8, 0xde, 0xe5, 0x0d, 0x2b)
 383
 384#define EFI_EVENT_GROUP_AFTER_READY_TO_BOOT \
 385        EFI_GUID(0x3a2a00ad, 0x98b9, 0x4cdf, 0xa4, 0x78, \
 386                 0x70, 0x27, 0x77, 0xf1, 0xc1, 0xb)
 387
 388#define EFI_EVENT_GROUP_RESET_SYSTEM \
 389        EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \
 390                 0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b)
 391
 392/* EFI Configuration Table and GUID definitions */
 393#define NULL_GUID \
 394        EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, \
 395                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
 396
 397#define EFI_GLOBAL_VARIABLE_GUID \
 398        EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, \
 399                 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
 400
 401#define EFI_IMAGE_SECURITY_DATABASE_GUID \
 402        EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596, 0xa3, 0xbc, \
 403                 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f)
 404
 405#define EFI_FDT_GUID \
 406        EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
 407                 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
 408
 409#define EFI_ACPI_TABLE_GUID \
 410        EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \
 411                 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
 412
 413#define SMBIOS_TABLE_GUID \
 414        EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
 415                 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 416
 417#define EFI_LOAD_FILE_PROTOCOL_GUID \
 418        EFI_GUID(0x56ec3091, 0x954c, 0x11d2, \
 419                 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 420
 421#define EFI_LOAD_FILE2_PROTOCOL_GUID \
 422        EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e, \
 423                 0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
 424
 425#define EFI_TCG2_FINAL_EVENTS_TABLE_GUID \
 426        EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, \
 427                 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25)
 428
 429/**
 430 * struct efi_configuration_table - EFI Configuration Table
 431 *
 432 * This table contains a set of GUID/pointer pairs.
 433 * The EFI Configuration Table may contain at most one instance of each table type.
 434 *
 435 * @guid:               GUID that uniquely identifies the system configuration table
 436 * @table:              A pointer to the table associated with guid
 437 */
 438struct efi_configuration_table {
 439        efi_guid_t guid;
 440        void *table;
 441} __packed;
 442
 443#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
 444
 445/**
 446 * struct efi_system_table - EFI System Table
 447 *
 448 * EFI System Table contains pointers to the runtime and boot services tables.
 449 *
 450 * @hdr:                The table header for the EFI System Table
 451 * @fw_vendor:          A pointer to a null terminated string that identifies the vendor
 452 *                      that produces the system firmware
 453 * @fw_revision:        The revision of the system firmware
 454 * @con_in_handle:      The handle for the active console input device
 455 * @con_in:             A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface
 456 *                      that is associated with con_in_handle
 457 * @con_out_handle:     The handle for the active console output device
 458 * @con_out:            A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
 459 *                      that is associated with con_out_handle
 460 * @stderr_handle:      The handle for the active standard error console device
 461 * @std_err:            A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
 462 *                      that is associated with stderr_handle
 463 * @runtime:            A pointer to the EFI Runtime Services Table
 464 * @boottime:           A pointer to the EFI Boot Services Table
 465 * @nr_tables:          The number of system configuration tables
 466 * @tables:             A pointer to the system configuration tables
 467 */
 468struct efi_system_table {
 469        struct efi_table_hdr hdr;
 470        u16 *fw_vendor;   /* physical addr of wchar_t vendor string */
 471        u32 fw_revision;
 472        efi_handle_t con_in_handle;
 473        struct efi_simple_text_input_protocol *con_in;
 474        efi_handle_t con_out_handle;
 475        struct efi_simple_text_output_protocol *con_out;
 476        efi_handle_t stderr_handle;
 477        struct efi_simple_text_output_protocol *std_err;
 478        struct efi_runtime_services *runtime;
 479        struct efi_boot_services *boottime;
 480        efi_uintn_t nr_tables;
 481        struct efi_configuration_table *tables;
 482};
 483
 484#define EFI_LOADED_IMAGE_PROTOCOL_GUID \
 485        EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \
 486                 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 487
 488#define EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID \
 489        EFI_GUID(0xbc62157e, 0x3e33, 0x4fec, \
 490                 0x99, 0x20, 0x2d, 0x3b, 0x36, 0xd7, 0x50, 0xdf)
 491
 492#define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000
 493
 494struct efi_loaded_image {
 495        u32 revision;
 496        void *parent_handle;
 497        struct efi_system_table *system_table;
 498        efi_handle_t device_handle;
 499        struct efi_device_path *file_path;
 500        void *reserved;
 501        u32 load_options_size;
 502        void *load_options;
 503        void *image_base;
 504        aligned_u64 image_size;
 505        unsigned int image_code_type;
 506        unsigned int image_data_type;
 507        efi_status_t (EFIAPI *unload)(efi_handle_t image_handle);
 508};
 509
 510#define EFI_DEVICE_PATH_PROTOCOL_GUID \
 511        EFI_GUID(0x09576e91, 0x6d3f, 0x11d2, \
 512                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 513
 514#define DEVICE_PATH_TYPE_END                    0x7f
 515#  define DEVICE_PATH_SUB_TYPE_INSTANCE_END     0x01
 516#  define DEVICE_PATH_SUB_TYPE_END              0xff
 517
 518struct efi_device_path {
 519        u8 type;
 520        u8 sub_type;
 521        u16 length;
 522} __packed;
 523
 524struct efi_mac_addr {
 525        u8 addr[32];
 526} __packed;
 527
 528#define DEVICE_PATH_TYPE_HARDWARE_DEVICE        0x01
 529#  define DEVICE_PATH_SUB_TYPE_MEMORY           0x03
 530#  define DEVICE_PATH_SUB_TYPE_VENDOR           0x04
 531
 532struct efi_device_path_memory {
 533        struct efi_device_path dp;
 534        u32 memory_type;
 535        u64 start_address;
 536        u64 end_address;
 537} __packed;
 538
 539struct efi_device_path_vendor {
 540        struct efi_device_path dp;
 541        efi_guid_t guid;
 542        u8 vendor_data[];
 543} __packed;
 544
 545#define DEVICE_PATH_TYPE_ACPI_DEVICE            0x02
 546#  define DEVICE_PATH_SUB_TYPE_ACPI_DEVICE      0x01
 547
 548#define EFI_PNP_ID(ID)                          (u32)(((ID) << 16) | 0x41D0)
 549#define EISA_PNP_ID(ID)                         EFI_PNP_ID(ID)
 550#define EISA_PNP_NUM(ID)                        ((ID) >> 16)
 551
 552struct efi_device_path_acpi_path {
 553        struct efi_device_path dp;
 554        u32 hid;
 555        u32 uid;
 556} __packed;
 557
 558#define DEVICE_PATH_TYPE_MESSAGING_DEVICE       0x03
 559#  define DEVICE_PATH_SUB_TYPE_MSG_ATAPI        0x01
 560#  define DEVICE_PATH_SUB_TYPE_MSG_SCSI         0x02
 561#  define DEVICE_PATH_SUB_TYPE_MSG_USB          0x05
 562#  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR     0x0b
 563#  define DEVICE_PATH_SUB_TYPE_MSG_UART         0x0e
 564#  define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS    0x0f
 565#  define DEVICE_PATH_SUB_TYPE_MSG_SATA         0x12
 566#  define DEVICE_PATH_SUB_TYPE_MSG_NVME         0x17
 567#  define DEVICE_PATH_SUB_TYPE_MSG_URI          0x18
 568#  define DEVICE_PATH_SUB_TYPE_MSG_SD           0x1a
 569#  define DEVICE_PATH_SUB_TYPE_MSG_MMC          0x1d
 570
 571struct efi_device_path_atapi {
 572        struct efi_device_path dp;
 573        u8 primary_secondary;
 574        u8 slave_master;
 575        u16 logical_unit_number;
 576} __packed;
 577
 578struct efi_device_path_scsi {
 579        struct efi_device_path dp;
 580        u16 target_id;
 581        u16 logical_unit_number;
 582} __packed;
 583
 584struct efi_device_path_uart {
 585        struct efi_device_path dp;
 586        u32 reserved;
 587        u64 baud_rate;
 588        u8 data_bits;
 589        u8 parity;
 590        u8 stop_bits;
 591} __packed;
 592
 593struct efi_device_path_usb {
 594        struct efi_device_path dp;
 595        u8 parent_port_number;
 596        u8 usb_interface;
 597} __packed;
 598
 599struct efi_device_path_sata {
 600        struct efi_device_path dp;
 601        u16 hba_port;
 602        u16 port_multiplier_port;
 603        u16 logical_unit_number;
 604} __packed;
 605
 606struct efi_device_path_mac_addr {
 607        struct efi_device_path dp;
 608        struct efi_mac_addr mac;
 609        u8 if_type;
 610} __packed;
 611
 612struct efi_device_path_usb_class {
 613        struct efi_device_path dp;
 614        u16 vendor_id;
 615        u16 product_id;
 616        u8 device_class;
 617        u8 device_subclass;
 618        u8 device_protocol;
 619} __packed;
 620
 621struct efi_device_path_sd_mmc_path {
 622        struct efi_device_path dp;
 623        u8 slot_number;
 624} __packed;
 625
 626struct efi_device_path_nvme {
 627        struct efi_device_path dp;
 628        u32 ns_id;
 629        u8 eui64[8];
 630} __packed;
 631
 632struct efi_device_path_uri {
 633        struct efi_device_path dp;
 634        u8 uri[];
 635} __packed;
 636
 637#define DEVICE_PATH_TYPE_MEDIA_DEVICE           0x04
 638#  define DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH  0x01
 639#  define DEVICE_PATH_SUB_TYPE_CDROM_PATH       0x02
 640#  define DEVICE_PATH_SUB_TYPE_VENDOR_PATH      0x03
 641#  define DEVICE_PATH_SUB_TYPE_FILE_PATH        0x04
 642
 643struct efi_device_path_hard_drive_path {
 644        struct efi_device_path dp;
 645        u32 partition_number;
 646        u64 partition_start;
 647        u64 partition_end;
 648        u8 partition_signature[16];
 649        u8 partmap_type;
 650        u8 signature_type;
 651} __packed;
 652
 653struct efi_device_path_cdrom_path {
 654        struct efi_device_path dp;
 655        u32 boot_entry;
 656        u64 partition_start;
 657        u64 partition_size;
 658} __packed;
 659
 660struct efi_device_path_file_path {
 661        struct efi_device_path dp;
 662        u16 str[];
 663} __packed;
 664
 665#define EFI_BLOCK_IO_PROTOCOL_GUID \
 666        EFI_GUID(0x964e5b21, 0x6459, 0x11d2, \
 667                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 668
 669struct efi_block_io_media {
 670        u32 media_id;
 671        char removable_media;
 672        char media_present;
 673        char logical_partition;
 674        char read_only;
 675        char write_caching;
 676        u8 pad[3];
 677        u32 block_size;
 678        u32 io_align;
 679        u8 pad2[4];
 680        u64 last_block;
 681        /* Added in revision 2 of the protocol */
 682        u64 lowest_aligned_lba;
 683        u32 logical_blocks_per_physical_block;
 684        /* Added in revision 3 of the protocol */
 685        u32 optimal_transfer_length_granualarity;
 686};
 687
 688#define EFI_BLOCK_IO_PROTOCOL_REVISION2 0x00020001
 689#define EFI_BLOCK_IO_PROTOCOL_REVISION3 0x0002001f
 690
 691struct efi_block_io {
 692        u64 revision;
 693        struct efi_block_io_media *media;
 694        efi_status_t (EFIAPI *reset)(struct efi_block_io *this,
 695                        char extended_verification);
 696        efi_status_t (EFIAPI *read_blocks)(struct efi_block_io *this,
 697                        u32 media_id, u64 lba, efi_uintn_t buffer_size,
 698                        void *buffer);
 699        efi_status_t (EFIAPI *write_blocks)(struct efi_block_io *this,
 700                        u32 media_id, u64 lba, efi_uintn_t buffer_size,
 701                        void *buffer);
 702        efi_status_t (EFIAPI *flush_blocks)(struct efi_block_io *this);
 703};
 704
 705struct simple_text_output_mode {
 706        s32 max_mode;
 707        s32 mode;
 708        s32 attribute;
 709        s32 cursor_column;
 710        s32 cursor_row;
 711        bool cursor_visible;
 712};
 713
 714#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
 715        EFI_GUID(0x387477c2, 0x69c7, 0x11d2, \
 716                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 717
 718#define EFI_BLACK                0x00
 719#define EFI_BLUE                 0x01
 720#define EFI_GREEN                0x02
 721#define EFI_CYAN                 0x03
 722#define EFI_RED                  0x04
 723#define EFI_MAGENTA              0x05
 724#define EFI_BROWN                0x06
 725#define EFI_LIGHTGRAY            0x07
 726#define EFI_BRIGHT               0x08
 727#define EFI_DARKGRAY             0x08
 728#define EFI_LIGHTBLUE            0x09
 729#define EFI_LIGHTGREEN           0x0a
 730#define EFI_LIGHTCYAN            0x0b
 731#define EFI_LIGHTRED             0x0c
 732#define EFI_LIGHTMAGENTA         0x0d
 733#define EFI_YELLOW               0x0e
 734#define EFI_WHITE                0x0f
 735#define EFI_BACKGROUND_BLACK     0x00
 736#define EFI_BACKGROUND_BLUE      0x10
 737#define EFI_BACKGROUND_GREEN     0x20
 738#define EFI_BACKGROUND_CYAN      0x30
 739#define EFI_BACKGROUND_RED       0x40
 740#define EFI_BACKGROUND_MAGENTA   0x50
 741#define EFI_BACKGROUND_BROWN     0x60
 742#define EFI_BACKGROUND_LIGHTGRAY 0x70
 743
 744/* extract foreground color from EFI attribute */
 745#define EFI_ATTR_FG(attr)        ((attr) & 0x07)
 746/* treat high bit of FG as bright/bold (similar to edk2) */
 747#define EFI_ATTR_BOLD(attr)      (((attr) >> 3) & 0x01)
 748/* extract background color from EFI attribute */
 749#define EFI_ATTR_BG(attr)        (((attr) >> 4) & 0x7)
 750
 751struct efi_simple_text_output_protocol {
 752        efi_status_t (EFIAPI *reset)(
 753                        struct efi_simple_text_output_protocol *this,
 754                        char extended_verification);
 755        efi_status_t (EFIAPI *output_string)(
 756                        struct efi_simple_text_output_protocol *this,
 757                        const u16 *str);
 758        efi_status_t (EFIAPI *test_string)(
 759                        struct efi_simple_text_output_protocol *this,
 760                        const u16 *str);
 761        efi_status_t(EFIAPI *query_mode)(
 762                        struct efi_simple_text_output_protocol *this,
 763                        unsigned long mode_number, unsigned long *columns,
 764                        unsigned long *rows);
 765        efi_status_t(EFIAPI *set_mode)(
 766                        struct efi_simple_text_output_protocol *this,
 767                        unsigned long mode_number);
 768        efi_status_t(EFIAPI *set_attribute)(
 769                        struct efi_simple_text_output_protocol *this,
 770                        unsigned long attribute);
 771        efi_status_t(EFIAPI *clear_screen) (
 772                        struct efi_simple_text_output_protocol *this);
 773        efi_status_t(EFIAPI *set_cursor_position) (
 774                        struct efi_simple_text_output_protocol *this,
 775                        unsigned long column, unsigned long row);
 776        efi_status_t(EFIAPI *enable_cursor)(
 777                        struct efi_simple_text_output_protocol *this,
 778                        bool enable);
 779        struct simple_text_output_mode *mode;
 780};
 781
 782#define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \
 783        EFI_GUID(0xdd9e7534, 0x7762, 0x4698, \
 784                 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa)
 785
 786struct efi_input_key {
 787        u16 scan_code;
 788        s16 unicode_char;
 789};
 790
 791#define EFI_SHIFT_STATE_INVALID         0x00000000
 792#define EFI_RIGHT_SHIFT_PRESSED         0x00000001
 793#define EFI_LEFT_SHIFT_PRESSED          0x00000002
 794#define EFI_RIGHT_CONTROL_PRESSED       0x00000004
 795#define EFI_LEFT_CONTROL_PRESSED        0x00000008
 796#define EFI_RIGHT_ALT_PRESSED           0x00000010
 797#define EFI_LEFT_ALT_PRESSED            0x00000020
 798#define EFI_RIGHT_LOGO_PRESSED          0x00000040
 799#define EFI_LEFT_LOGO_PRESSED           0x00000080
 800#define EFI_MENU_KEY_PRESSED            0x00000100
 801#define EFI_SYS_REQ_PRESSED             0x00000200
 802#define EFI_SHIFT_STATE_VALID           0x80000000
 803
 804#define EFI_TOGGLE_STATE_INVALID        0x00
 805#define EFI_SCROLL_LOCK_ACTIVE          0x01
 806#define EFI_NUM_LOCK_ACTIVE             0x02
 807#define EFI_CAPS_LOCK_ACTIVE            0x04
 808#define EFI_KEY_STATE_EXPOSED           0x40
 809#define EFI_TOGGLE_STATE_VALID          0x80
 810
 811struct efi_key_state {
 812        u32 key_shift_state;
 813        u8 key_toggle_state;
 814};
 815
 816struct efi_key_data {
 817        struct efi_input_key key;
 818        struct efi_key_state key_state;
 819};
 820
 821struct efi_simple_text_input_ex_protocol {
 822        efi_status_t (EFIAPI *reset) (
 823                struct efi_simple_text_input_ex_protocol *this,
 824                bool extended_verification);
 825        efi_status_t (EFIAPI *read_key_stroke_ex) (
 826                struct efi_simple_text_input_ex_protocol *this,
 827                struct efi_key_data *key_data);
 828        struct efi_event *wait_for_key_ex;
 829        efi_status_t (EFIAPI *set_state) (
 830                struct efi_simple_text_input_ex_protocol *this,
 831                u8 *key_toggle_state);
 832        efi_status_t (EFIAPI *register_key_notify) (
 833                struct efi_simple_text_input_ex_protocol *this,
 834                struct efi_key_data *key_data,
 835                efi_status_t (EFIAPI *key_notify_function)(
 836                        struct efi_key_data *key_data),
 837                void **notify_handle);
 838        efi_status_t (EFIAPI *unregister_key_notify) (
 839                struct efi_simple_text_input_ex_protocol *this,
 840                void *notification_handle);
 841};
 842
 843#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \
 844        EFI_GUID(0x387477c1, 0x69c7, 0x11d2, \
 845                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 846
 847struct efi_simple_text_input_protocol {
 848        efi_status_t(EFIAPI *reset)(struct efi_simple_text_input_protocol *this,
 849                                    bool extended_verification);
 850        efi_status_t(EFIAPI *read_key_stroke)(
 851                        struct efi_simple_text_input_protocol *this,
 852                        struct efi_input_key *key);
 853        struct efi_event *wait_for_key;
 854};
 855
 856#define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
 857        EFI_GUID(0x8b843e20, 0x8132, 0x4852, \
 858                 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c)
 859
 860struct efi_device_path_to_text_protocol {
 861        uint16_t *(EFIAPI *convert_device_node_to_text)(
 862                        struct efi_device_path *device_node,
 863                        bool display_only,
 864                        bool allow_shortcuts);
 865        uint16_t *(EFIAPI *convert_device_path_to_text)(
 866                        struct efi_device_path *device_path,
 867                        bool display_only,
 868                        bool allow_shortcuts);
 869};
 870
 871#define EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \
 872        EFI_GUID(0x0379be4e, 0xd706, 0x437d, \
 873                 0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4)
 874
 875struct efi_device_path_utilities_protocol {
 876        efi_uintn_t (EFIAPI *get_device_path_size)(
 877                const struct efi_device_path *device_path);
 878        struct efi_device_path *(EFIAPI *duplicate_device_path)(
 879                const struct efi_device_path *device_path);
 880        struct efi_device_path *(EFIAPI *append_device_path)(
 881                const struct efi_device_path *src1,
 882                const struct efi_device_path *src2);
 883        struct efi_device_path *(EFIAPI *append_device_node)(
 884                const struct efi_device_path *device_path,
 885                const struct efi_device_path *device_node);
 886        struct efi_device_path *(EFIAPI *append_device_path_instance)(
 887                const struct efi_device_path *device_path,
 888                const struct efi_device_path *device_path_instance);
 889        struct efi_device_path *(EFIAPI *get_next_device_path_instance)(
 890                struct efi_device_path **device_path_instance,
 891                efi_uintn_t *device_path_instance_size);
 892        bool (EFIAPI *is_device_path_multi_instance)(
 893                const struct efi_device_path *device_path);
 894        struct efi_device_path *(EFIAPI *create_device_node)(
 895                uint8_t node_type,
 896                uint8_t node_sub_type,
 897                uint16_t node_length);
 898};
 899
 900/*
 901 * Human Interface Infrastructure (HII)
 902 */
 903struct efi_hii_package_list_header {
 904        efi_guid_t package_list_guid;
 905        u32 package_length;
 906} __packed;
 907
 908/**
 909 * struct efi_hii_package_header - EFI HII package header
 910 *
 911 * @fields:     'fields' replaces the bit-fields defined in the EFI
 912 *              specification to to avoid possible compiler incompatibilities::
 913 *
 914 *                  u32 length:24;
 915 *                  u32 type:8;
 916 */
 917struct efi_hii_package_header {
 918        u32 fields;
 919} __packed;
 920
 921#define __EFI_HII_PACKAGE_LEN_SHIFT     0
 922#define __EFI_HII_PACKAGE_TYPE_SHIFT    24
 923#define __EFI_HII_PACKAGE_LEN_MASK      0xffffff
 924#define __EFI_HII_PACKAGE_TYPE_MASK     0xff
 925
 926#define EFI_HII_PACKAGE_TYPE_ALL          0x00
 927#define EFI_HII_PACKAGE_TYPE_GUID         0x01
 928#define EFI_HII_PACKAGE_FORMS             0x02
 929#define EFI_HII_PACKAGE_STRINGS           0x04
 930#define EFI_HII_PACKAGE_FONTS             0x05
 931#define EFI_HII_PACKAGE_IMAGES            0x06
 932#define EFI_HII_PACKAGE_SIMPLE_FONTS      0x07
 933#define EFI_HII_PACKAGE_DEVICE_PATH       0x08
 934#define EFI_HII_PACKAGE_KEYBOARD_LAYOUT   0x09
 935#define EFI_HII_PACKAGE_ANIMATIONS        0x0A
 936#define EFI_HII_PACKAGE_END               0xDF
 937#define EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN 0xE0
 938#define EFI_HII_PACKAGE_TYPE_SYSTEM_END   0xFF
 939
 940/*
 941 * HII GUID package
 942 */
 943struct efi_hii_guid_package {
 944        struct efi_hii_package_header header;
 945        efi_guid_t guid;
 946        char data[];
 947} __packed;
 948
 949/*
 950 * HII string package
 951 */
 952struct efi_hii_strings_package {
 953        struct efi_hii_package_header header;
 954        u32 header_size;
 955        u32 string_info_offset;
 956        u16 language_window[16];
 957        efi_string_id_t language_name;
 958        u8  language[];
 959} __packed;
 960
 961struct efi_hii_string_block {
 962        u8 block_type;
 963        /* u8 block_body[]; */
 964} __packed;
 965
 966#define EFI_HII_SIBT_END               0x00
 967#define EFI_HII_SIBT_STRING_SCSU       0x10
 968#define EFI_HII_SIBT_STRING_SCSU_FONT  0x11
 969#define EFI_HII_SIBT_STRINGS_SCSU      0x12
 970#define EFI_HII_SIBT_STRINGS_SCSU_FONT 0x13
 971#define EFI_HII_SIBT_STRING_UCS2       0x14
 972#define EFI_HII_SIBT_STRING_UCS2_FONT  0x15
 973#define EFI_HII_SIBT_STRINGS_UCS2      0x16
 974#define EFI_HII_SIBT_STRINGS_UCS2_FONT 0x17
 975#define EFI_HII_SIBT_DUPLICATE         0x20
 976#define EFI_HII_SIBT_SKIP2             0x21
 977#define EFI_HII_SIBT_SKIP1             0x22
 978#define EFI_HII_SIBT_EXT1              0x30
 979#define EFI_HII_SIBT_EXT2              0x31
 980#define EFI_HII_SIBT_EXT4              0x32
 981#define EFI_HII_SIBT_FONT              0x40
 982
 983struct efi_hii_sibt_string_ucs2_block {
 984        struct efi_hii_string_block header;
 985        u16 string_text[];
 986} __packed;
 987
 988static inline struct efi_hii_string_block *
 989efi_hii_sibt_string_ucs2_block_next(struct efi_hii_sibt_string_ucs2_block *blk)
 990{
 991        return ((void *)blk) + sizeof(*blk) +
 992                (u16_strlen(blk->string_text) + 1) * 2;
 993}
 994
 995/*
 996 * HII forms package
 997 * TODO: full scope of definitions
 998 */
 999struct efi_hii_time {
1000        u8 hour;
1001        u8 minute;
1002        u8 second;
1003};
1004
1005struct efi_hii_date {
1006        u16 year;
1007        u8 month;
1008        u8 day;
1009};
1010
1011struct efi_hii_ref {
1012        efi_question_id_t question_id;
1013        efi_form_id_t form_id;
1014        efi_guid_t form_set_guid;
1015        efi_string_id_t device_path;
1016};
1017
1018union efi_ifr_type_value {
1019        u8 u8;                          // EFI_IFR_TYPE_NUM_SIZE_8
1020        u16 u16;                        // EFI_IFR_TYPE_NUM_SIZE_16
1021        u32 u32;                        // EFI_IFR_TYPE_NUM_SIZE_32
1022        u64 u64;                        // EFI_IFR_TYPE_NUM_SIZE_64
1023        bool b;                         // EFI_IFR_TYPE_BOOLEAN
1024        struct efi_hii_time time;       // EFI_IFR_TYPE_TIME
1025        struct efi_hii_date date;       // EFI_IFR_TYPE_DATE
1026        efi_string_id_t string; // EFI_IFR_TYPE_STRING, EFI_IFR_TYPE_ACTION
1027        struct efi_hii_ref ref;         // EFI_IFR_TYPE_REF
1028        // u8 buffer[];                 // EFI_IFR_TYPE_BUFFER
1029};
1030
1031#define EFI_IFR_TYPE_NUM_SIZE_8         0x00
1032#define EFI_IFR_TYPE_NUM_SIZE_16        0x01
1033#define EFI_IFR_TYPE_NUM_SIZE_32        0x02
1034#define EFI_IFR_TYPE_NUM_SIZE_64        0x03
1035#define EFI_IFR_TYPE_BOOLEAN            0x04
1036#define EFI_IFR_TYPE_TIME               0x05
1037#define EFI_IFR_TYPE_DATE               0x06
1038#define EFI_IFR_TYPE_STRING             0x07
1039#define EFI_IFR_TYPE_OTHER              0x08
1040#define EFI_IFR_TYPE_UNDEFINED          0x09
1041#define EFI_IFR_TYPE_ACTION             0x0A
1042#define EFI_IFR_TYPE_BUFFER             0x0B
1043#define EFI_IFR_TYPE_REF                0x0C
1044#define EFI_IFR_OPTION_DEFAULT          0x10
1045#define EFI_IFR_OPTION_DEFAULT_MFG      0x20
1046
1047#define EFI_IFR_ONE_OF_OPTION_OP        0x09
1048
1049struct efi_ifr_op_header {
1050        u8 opCode;
1051        u8 length:7;
1052        u8 scope:1;
1053};
1054
1055struct efi_ifr_one_of_option {
1056        struct efi_ifr_op_header header;
1057        efi_string_id_t option;
1058        u8 flags;
1059        u8 type;
1060        union efi_ifr_type_value value;
1061};
1062
1063typedef efi_uintn_t efi_browser_action_t;
1064
1065#define EFI_BROWSER_ACTION_REQUEST_NONE                 0
1066#define EFI_BROWSER_ACTION_REQUEST_RESET                1
1067#define EFI_BROWSER_ACTION_REQUEST_SUBMIT               2
1068#define EFI_BROWSER_ACTION_REQUEST_EXIT                 3
1069#define EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT     4
1070#define EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT    5
1071#define EFI_BROWSER_ACTION_REQUEST_FORM_APPLY           6
1072#define EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD         7
1073#define EFI_BROWSER_ACTION_REQUEST_RECONNECT            8
1074
1075typedef efi_uintn_t efi_browser_action_request_t;
1076
1077#define EFI_BROWSER_ACTION_CHANGING                     0
1078#define EFI_BROWSER_ACTION_CHANGED                      1
1079#define EFI_BROWSER_ACTION_RETRIEVE                     2
1080#define EFI_BROWSER_ACTION_FORM_OPEN                    3
1081#define EFI_BROWSER_ACTION_FORM_CLOSE                   4
1082#define EFI_BROWSER_ACTION_SUBMITTED                    5
1083#define EFI_BROWSER_ACTION_DEFAULT_STANDARD             0x1000
1084#define EFI_BROWSER_ACTION_DEFAULT_MANUFACTURING        0x1001
1085#define EFI_BROWSER_ACTION_DEFAULT_SAFE                 0x1002
1086#define EFI_BROWSER_ACTION_DEFAULT_PLATFORM             0x2000
1087#define EFI_BROWSER_ACTION_DEFAULT_HARDWARE             0x3000
1088#define EFI_BROWSER_ACTION_DEFAULT_FIRMWARE             0x4000
1089
1090/*
1091 * HII keyboard package
1092 */
1093typedef enum {
1094        EFI_KEY_LCTRL, EFI_KEY_A0, EFI_KEY_LALT, EFI_KEY_SPACE_BAR,
1095        EFI_KEY_A2, EFI_KEY_A3, EFI_KEY_A4, EFI_KEY_RCTRL, EFI_KEY_LEFT_ARROW,
1096        EFI_KEY_DOWN_ARROW, EFI_KEY_RIGHT_ARROW, EFI_KEY_ZERO,
1097        EFI_KEY_PERIOD, EFI_KEY_ENTER, EFI_KEY_LSHIFT, EFI_KEY_B0,
1098        EFI_KEY_B1, EFI_KEY_B2, EFI_KEY_B3, EFI_KEY_B4, EFI_KEY_B5, EFI_KEY_B6,
1099        EFI_KEY_B7, EFI_KEY_B8, EFI_KEY_B9, EFI_KEY_B10, EFI_KEY_RSHIFT,
1100        EFI_KEY_UP_ARROW, EFI_KEY_ONE, EFI_KEY_TWO, EFI_KEY_THREE,
1101        EFI_KEY_CAPS_LOCK, EFI_KEY_C1, EFI_KEY_C2, EFI_KEY_C3, EFI_KEY_C4,
1102        EFI_KEY_C5, EFI_KEY_C6, EFI_KEY_C7, EFI_KEY_C8, EFI_KEY_C9,
1103        EFI_KEY_C10, EFI_KEY_C11, EFI_KEY_C12, EFI_KEY_FOUR, EFI_KEY_FIVE,
1104        EFI_KEY_SIX, EFI_KEY_PLUS, EFI_KEY_TAB, EFI_KEY_D1, EFI_KEY_D2,
1105        EFI_KEY_D3, EFI_KEY_D4, EFI_KEY_D5, EFI_KEY_D6, EFI_KEY_D7, EFI_KEY_D8,
1106        EFI_KEY_D9, EFI_KEY_D10, EFI_KEY_D11, EFI_KEY_D12, EFI_KEY_D13,
1107        EFI_KEY_DEL, EFI_KEY_END, EFI_KEY_PG_DN, EFI_KEY_SEVEN, EFI_KEY_EIGHT,
1108        EFI_KEY_NINE, EFI_KEY_E0, EFI_KEY_E1, EFI_KEY_E2, EFI_KEY_E3,
1109        EFI_KEY_E4, EFI_KEY_E5, EFI_KEY_E6, EFI_KEY_E7, EFI_KEY_E8, EFI_KEY_E9,
1110        EFI_KEY_E10, EFI_KEY_E11, EFI_KEY_E12, EFI_KEY_BACK_SPACE,
1111        EFI_KEY_INS, EFI_KEY_HOME, EFI_KEY_PG_UP, EFI_KEY_NLCK, EFI_KEY_SLASH,
1112        EFI_KEY_ASTERISK, EFI_KEY_MINUS, EFI_KEY_ESC, EFI_KEY_F1, EFI_KEY_F2,
1113        EFI_KEY_F3, EFI_KEY_F4, EFI_KEY_F5, EFI_KEY_F6, EFI_KEY_F7, EFI_KEY_F8,
1114        EFI_KEY_F9, EFI_KEY_F10, EFI_KEY_F11, EFI_KEY_F12, EFI_KEY_PRINT,
1115        EFI_KEY_SLCK, EFI_KEY_PAUSE,
1116} efi_key;
1117
1118struct efi_key_descriptor {
1119        u32 key;
1120        u16 unicode;
1121        u16 shifted_unicode;
1122        u16 alt_gr_unicode;
1123        u16 shifted_alt_gr_unicode;
1124        u16 modifier;
1125        u16 affected_attribute;
1126} __packed;
1127
1128struct efi_hii_keyboard_layout {
1129        u16 layout_length;
1130        efi_guid_t guid;
1131        u32 layout_descriptor_string_offset;
1132        u8 descriptor_count;
1133        struct efi_key_descriptor descriptors[];
1134} __packed;
1135
1136struct efi_hii_keyboard_package {
1137        struct efi_hii_package_header header;
1138        u16 layout_count;
1139        struct efi_hii_keyboard_layout layout[];
1140} __packed;
1141
1142/*
1143 * HII protocols
1144 */
1145#define EFI_HII_STRING_PROTOCOL_GUID \
1146        EFI_GUID(0x0fd96974, 0x23aa, 0x4cdc, \
1147                 0xb9, 0xcb, 0x98, 0xd1, 0x77, 0x50, 0x32, 0x2a)
1148
1149struct efi_font_info {
1150        efi_hii_font_style_t font_style;
1151        u16 font_size;
1152        u16 font_name[1];
1153};
1154
1155struct efi_hii_string_protocol {
1156        efi_status_t(EFIAPI *new_string)(
1157                const struct efi_hii_string_protocol *this,
1158                efi_hii_handle_t package_list,
1159                efi_string_id_t *string_id,
1160                const u8 *language,
1161                const u16 *language_name,
1162                const efi_string_t string,
1163                const struct efi_font_info *string_font_info);
1164        efi_status_t(EFIAPI *get_string)(
1165                const struct efi_hii_string_protocol *this,
1166                const u8 *language,
1167                efi_hii_handle_t package_list,
1168                efi_string_id_t string_id,
1169                efi_string_t string,
1170                efi_uintn_t *string_size,
1171                struct efi_font_info **string_font_info);
1172        efi_status_t(EFIAPI *set_string)(
1173                const struct efi_hii_string_protocol *this,
1174                efi_hii_handle_t package_list,
1175                efi_string_id_t string_id,
1176                const u8 *language,
1177                const efi_string_t string,
1178                const struct efi_font_info *string_font_info);
1179        efi_status_t(EFIAPI *get_languages)(
1180                const struct efi_hii_string_protocol *this,
1181                efi_hii_handle_t package_list,
1182                u8 *languages,
1183                efi_uintn_t *languages_size);
1184        efi_status_t(EFIAPI *get_secondary_languages)(
1185                const struct efi_hii_string_protocol *this,
1186                efi_hii_handle_t package_list,
1187                const u8 *primary_language,
1188                u8 *secondary_languages,
1189                efi_uintn_t *secondary_languages_size);
1190};
1191
1192#define EFI_HII_DATABASE_PROTOCOL_GUID       \
1193        EFI_GUID(0xef9fc172, 0xa1b2, 0x4693, \
1194                 0xb3, 0x27, 0x6d, 0x32, 0xfc, 0x41, 0x60, 0x42)
1195
1196struct efi_hii_database_protocol {
1197        efi_status_t(EFIAPI *new_package_list)(
1198                const struct efi_hii_database_protocol *this,
1199                const struct efi_hii_package_list_header *package_list,
1200                const efi_handle_t driver_handle,
1201                efi_hii_handle_t *handle);
1202        efi_status_t(EFIAPI *remove_package_list)(
1203                const struct efi_hii_database_protocol *this,
1204                efi_hii_handle_t handle);
1205        efi_status_t(EFIAPI *update_package_list)(
1206                const struct efi_hii_database_protocol *this,
1207                efi_hii_handle_t handle,
1208                const struct efi_hii_package_list_header *package_list);
1209        efi_status_t(EFIAPI *list_package_lists)(
1210                const struct efi_hii_database_protocol *this,
1211                u8 package_type,
1212                const efi_guid_t *package_guid,
1213                efi_uintn_t *handle_buffer_length,
1214                efi_hii_handle_t *handle);
1215        efi_status_t(EFIAPI *export_package_lists)(
1216                const struct efi_hii_database_protocol *this,
1217                efi_hii_handle_t handle,
1218                efi_uintn_t *buffer_size,
1219                struct efi_hii_package_list_header *buffer);
1220        efi_status_t(EFIAPI *register_package_notify)(
1221                const struct efi_hii_database_protocol *this,
1222                u8 package_type,
1223                const efi_guid_t *package_guid,
1224                const void *package_notify_fn,
1225                efi_uintn_t notify_type,
1226                efi_handle_t *notify_handle);
1227        efi_status_t(EFIAPI *unregister_package_notify)(
1228                const struct efi_hii_database_protocol *this,
1229                efi_handle_t notification_handle
1230                );
1231        efi_status_t(EFIAPI *find_keyboard_layouts)(
1232                const struct efi_hii_database_protocol *this,
1233                u16 *key_guid_buffer_length,
1234                efi_guid_t *key_guid_buffer);
1235        efi_status_t(EFIAPI *get_keyboard_layout)(
1236                const struct efi_hii_database_protocol *this,
1237                efi_guid_t *key_guid,
1238                u16 *keyboard_layout_length,
1239                struct efi_hii_keyboard_layout *keyboard_layout);
1240        efi_status_t(EFIAPI *set_keyboard_layout)(
1241                const struct efi_hii_database_protocol *this,
1242                efi_guid_t *key_guid);
1243        efi_status_t(EFIAPI *get_package_list_handle)(
1244                const struct efi_hii_database_protocol *this,
1245                efi_hii_handle_t package_list_handle,
1246                efi_handle_t *driver_handle);
1247};
1248
1249#define EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID \
1250        EFI_GUID(0x587e72d7, 0xcc50, 0x4f79, \
1251                 0x82, 0x09, 0xca, 0x29, 0x1f, 0xc1, 0xa1, 0x0f)
1252
1253struct efi_hii_config_routing_protocol {
1254        efi_status_t(EFIAPI *extract_config)(
1255                const struct efi_hii_config_routing_protocol *this,
1256                const efi_string_t request,
1257                efi_string_t *progress,
1258                efi_string_t *results);
1259        efi_status_t(EFIAPI *export_config)(
1260                const struct efi_hii_config_routing_protocol *this,
1261                efi_string_t *results);
1262        efi_status_t(EFIAPI *route_config)(
1263                const struct efi_hii_config_routing_protocol *this,
1264                const efi_string_t configuration,
1265                efi_string_t *progress);
1266        efi_status_t(EFIAPI *block_to_config)(
1267                const struct efi_hii_config_routing_protocol *this,
1268                const efi_string_t config_request,
1269                const uint8_t *block,
1270                const efi_uintn_t block_size,
1271                efi_string_t *config,
1272                efi_string_t *progress);
1273        efi_status_t(EFIAPI *config_to_block)(
1274                const struct efi_hii_config_routing_protocol *this,
1275                const efi_string_t config_resp,
1276                const uint8_t *block,
1277                const efi_uintn_t *block_size,
1278                efi_string_t *progress);
1279        efi_status_t(EFIAPI *get_alt_config)(
1280                const struct efi_hii_config_routing_protocol *this,
1281                const efi_string_t config_resp,
1282                const efi_guid_t *guid,
1283                const efi_string_t name,
1284                const struct efi_device_path *device_path,
1285                const efi_string_t alt_cfg_id,
1286                efi_string_t *alt_cfg_resp);
1287};
1288
1289#define EFI_HII_CONFIG_ACCESS_PROTOCOL_GUID \
1290        EFI_GUID(0x330d4706, 0xf2a0, 0x4e4f, \
1291                 0xa3, 0x69, 0xb6, 0x6f, 0xa8, 0xd5, 0x43, 0x85)
1292
1293struct efi_hii_config_access_protocol {
1294        efi_status_t(EFIAPI *extract_config_access)(
1295                const struct efi_hii_config_access_protocol *this,
1296                const efi_string_t request,
1297                efi_string_t *progress,
1298                efi_string_t *results);
1299        efi_status_t(EFIAPI *route_config_access)(
1300                const struct efi_hii_config_access_protocol *this,
1301                const efi_string_t configuration,
1302                efi_string_t *progress);
1303        efi_status_t(EFIAPI *form_callback)(
1304                const struct efi_hii_config_access_protocol *this,
1305                efi_browser_action_t action,
1306                efi_question_id_t question_id,
1307                u8 type,
1308                union efi_ifr_type_value *value,
1309                efi_browser_action_request_t *action_request);
1310};
1311
1312#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
1313        EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
1314                 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
1315
1316#define EFI_GOT_RGBA8           0
1317#define EFI_GOT_BGRA8           1
1318#define EFI_GOT_BITMASK         2
1319
1320struct efi_gop_mode_info {
1321        u32 version;
1322        u32 width;
1323        u32 height;
1324        u32 pixel_format;
1325        u32 pixel_bitmask[4];
1326        u32 pixels_per_scanline;
1327};
1328
1329struct efi_gop_mode {
1330        u32 max_mode;
1331        u32 mode;
1332        struct efi_gop_mode_info *info;
1333        unsigned long info_size;
1334        efi_physical_addr_t fb_base;
1335        unsigned long fb_size;
1336};
1337
1338struct efi_gop_pixel {
1339        u8 blue;
1340        u8 green;
1341        u8 red;
1342        u8 reserved;
1343};
1344
1345#define EFI_BLT_VIDEO_FILL              0
1346#define EFI_BLT_VIDEO_TO_BLT_BUFFER     1
1347#define EFI_BLT_BUFFER_TO_VIDEO         2
1348#define EFI_BLT_VIDEO_TO_VIDEO          3
1349
1350struct efi_gop {
1351        efi_status_t (EFIAPI *query_mode)(struct efi_gop *this, u32 mode_number,
1352                                          efi_uintn_t *size_of_info,
1353                                          struct efi_gop_mode_info **info);
1354        efi_status_t (EFIAPI *set_mode)(struct efi_gop *this, u32 mode_number);
1355        efi_status_t (EFIAPI *blt)(struct efi_gop *this,
1356                                   struct efi_gop_pixel *buffer,
1357                                   u32 operation, efi_uintn_t sx,
1358                                   efi_uintn_t sy, efi_uintn_t dx,
1359                                   efi_uintn_t dy, efi_uintn_t width,
1360                                   efi_uintn_t height, efi_uintn_t delta);
1361        struct efi_gop_mode *mode;
1362};
1363
1364#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \
1365        EFI_GUID(0xa19832b9, 0xac25, 0x11d3, \
1366                 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
1367
1368struct efi_mac_address {
1369        char mac_addr[32];
1370};
1371
1372struct efi_ip_address {
1373        u8 ip_addr[16];
1374} __attribute__((aligned(4)));
1375
1376enum efi_simple_network_state {
1377        EFI_NETWORK_STOPPED,
1378        EFI_NETWORK_STARTED,
1379        EFI_NETWORK_INITIALIZED,
1380};
1381
1382struct efi_simple_network_mode {
1383        enum efi_simple_network_state state;
1384        u32 hwaddr_size;
1385        u32 media_header_size;
1386        u32 max_packet_size;
1387        u32 nvram_size;
1388        u32 nvram_access_size;
1389        u32 receive_filter_mask;
1390        u32 receive_filter_setting;
1391        u32 max_mcast_filter_count;
1392        u32 mcast_filter_count;
1393        struct efi_mac_address mcast_filter[16];
1394        struct efi_mac_address current_address;
1395        struct efi_mac_address broadcast_address;
1396        struct efi_mac_address permanent_address;
1397        u8 if_type;
1398        u8 mac_changeable;
1399        u8 multitx_supported;
1400        u8 media_present_supported;
1401        u8 media_present;
1402};
1403
1404/* receive_filters bit mask */
1405#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST               0x01
1406#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST             0x02
1407#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST             0x04
1408#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS           0x08
1409#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
1410
1411/* interrupt status bit mask */
1412#define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT    0x01
1413#define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT   0x02
1414#define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT    0x04
1415#define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT   0x08
1416
1417/* revision of the simple network protocol */
1418#define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION    0x00010000
1419
1420struct efi_simple_network {
1421        u64 revision;
1422        efi_status_t (EFIAPI *start)(struct efi_simple_network *this);
1423        efi_status_t (EFIAPI *stop)(struct efi_simple_network *this);
1424        efi_status_t (EFIAPI *initialize)(struct efi_simple_network *this,
1425                        ulong extra_rx, ulong extra_tx);
1426        efi_status_t (EFIAPI *reset)(struct efi_simple_network *this,
1427                        int extended_verification);
1428        efi_status_t (EFIAPI *shutdown)(struct efi_simple_network *this);
1429        efi_status_t (EFIAPI *receive_filters)(struct efi_simple_network *this,
1430                        u32 enable, u32 disable, int reset_mcast_filter,
1431                        ulong mcast_filter_count,
1432                        struct efi_mac_address *mcast_filter);
1433        efi_status_t (EFIAPI *station_address)(struct efi_simple_network *this,
1434                        int reset, struct efi_mac_address *new_mac);
1435        efi_status_t (EFIAPI *statistics)(struct efi_simple_network *this,
1436                        int reset, ulong *stat_size, void *stat_table);
1437        efi_status_t (EFIAPI *mcastiptomac)(struct efi_simple_network *this,
1438                        int ipv6, struct efi_ip_address *ip,
1439                        struct efi_mac_address *mac);
1440        efi_status_t (EFIAPI *nvdata)(struct efi_simple_network *this,
1441                        int read_write, ulong offset, ulong buffer_size,
1442                        char *buffer);
1443        efi_status_t (EFIAPI *get_status)(struct efi_simple_network *this,
1444                        u32 *int_status, void **txbuf);
1445        efi_status_t (EFIAPI *transmit)(struct efi_simple_network *this,
1446                        size_t header_size, size_t buffer_size, void *buffer,
1447                        struct efi_mac_address *src_addr,
1448                        struct efi_mac_address *dest_addr, u16 *protocol);
1449        efi_status_t (EFIAPI *receive)(struct efi_simple_network *this,
1450                        size_t *header_size, size_t *buffer_size, void *buffer,
1451                        struct efi_mac_address *src_addr,
1452                        struct efi_mac_address *dest_addr, u16 *protocol);
1453        struct efi_event *wait_for_packet;
1454        struct efi_simple_network_mode *mode;
1455        /* private fields */
1456        u32 int_status;
1457};
1458
1459#define EFI_PXE_BASE_CODE_PROTOCOL_GUID \
1460        EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \
1461                 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
1462
1463#define EFI_PXE_BASE_CODE_PROTOCOL_REVISION 0x00010000
1464#define EFI_PXE_BASE_CODE_MAX_IPCNT 8
1465
1466struct efi_pxe_packet {
1467        u8 packet[1472];
1468};
1469
1470struct efi_pxe_mode {
1471        u8 started;
1472        u8 ipv6_available;
1473        u8 ipv6_supported;
1474        u8 using_ipv6;
1475        u8 bis_supported;
1476        u8 bis_detected;
1477        u8 auto_arp;
1478        u8 send_guid;
1479        u8 dhcp_discover_valid;
1480        u8 dhcp_ack_received;
1481        u8 proxy_offer_received;
1482        u8 pxe_discover_valid;
1483        u8 pxe_reply_received;
1484        u8 pxe_bis_reply_received;
1485        u8 icmp_error_received;
1486        u8 tftp_error_received;
1487        u8 make_callbacks;
1488        u8 ttl;
1489        u8 tos;
1490        u8 pad;
1491        struct efi_ip_address station_ip;
1492        struct efi_ip_address subnet_mask;
1493        struct efi_pxe_packet dhcp_discover;
1494        struct efi_pxe_packet dhcp_ack;
1495        struct efi_pxe_packet proxy_offer;
1496        struct efi_pxe_packet pxe_discover;
1497        struct efi_pxe_packet pxe_reply;
1498};
1499
1500struct efi_pxe_base_code_srvlist {
1501        u16 type;
1502        u8 accept_any_response;
1503        u8 reserved;
1504        struct efi_ip_address ip_addr;
1505};
1506
1507struct efi_pxe_base_code_discover_info {
1508        u8 use_m_cast;
1509        u8 use_b_cast;
1510        u8 use_u_cast;
1511        u8 must_use_list;
1512        struct efi_ip_address server_m_cast_ip;
1513        u16 ip_cnt;
1514        struct efi_pxe_base_code_srvlist srv_list[];
1515};
1516
1517struct efi_pxe_base_code_mtftp_info {
1518        struct efi_ip_address m_cast_ip;
1519        u16 cport;
1520        u16 sport;
1521        u16 listen_timeout;
1522        u16 transit_timeout;
1523};
1524
1525struct efi_pxe_base_code_filter {
1526        u8 filters;
1527        u8 ip_cnt;
1528        u16 reserved;
1529        struct efi_ip_address ip_list[EFI_PXE_BASE_CODE_MAX_IPCNT];
1530};
1531
1532struct efi_pxe_base_code_dhcpv4_packet {
1533        u8 bootp_op_code;
1534        u8 bootp_hw_type;
1535        u8 bootp_addr_len;
1536        u8 bootp_gate_hops;
1537        u32 bootp_ident;
1538        u16 bootp_seconds;
1539        u16 bootp_flags;
1540        u8 bootp_ci_addr[4];
1541        u8 bootp_yi_addr[4];
1542        u8 bootp_si_addr[4];
1543        u8 bootp_gi_addr[4];
1544        u8 bootp_hw_addr[16];
1545        u8 bootp_srv_name[64];
1546        u8 bootp_boot_file[128];
1547        u32 dhcp_magick;
1548        u8 dhcp_options[56];
1549};
1550
1551struct efi_pxe_base_code_dhcpv6_packet {
1552        u8 message_type;
1553        u8 transaction_id[3];
1554        u8 dhcp_options[1024];
1555};
1556
1557typedef union {
1558        u8 raw[1472];
1559        struct efi_pxe_base_code_dhcpv4_packet dhcpv4;
1560        struct efi_pxe_base_code_dhcpv6_packet dhcpv6;
1561} EFI_PXE_BASE_CODE_PACKET;
1562
1563struct efi_pxe_base_code_protocol {
1564        u64 revision;
1565        efi_status_t (EFIAPI *start)(struct efi_pxe_base_code_protocol *this,
1566                                     u8 use_ipv6);
1567        efi_status_t (EFIAPI *stop)(struct efi_pxe_base_code_protocol *this);
1568        efi_status_t (EFIAPI *dhcp)(struct efi_pxe_base_code_protocol *this,
1569                                    u8 sort_offers);
1570        efi_status_t (EFIAPI *discover)(
1571                                struct efi_pxe_base_code_protocol *this,
1572                                u16 type, u16 *layer, u8 bis,
1573                                struct efi_pxe_base_code_discover_info *info);
1574        efi_status_t (EFIAPI *mtftp)(
1575                                struct efi_pxe_base_code_protocol *this,
1576                                u32 operation, void *buffer_ptr,
1577                                u8 overwrite, efi_uintn_t *buffer_size,
1578                                struct efi_ip_address server_ip, char *filename,
1579                                struct efi_pxe_base_code_mtftp_info *info,
1580                                u8 dont_use_buffer);
1581        efi_status_t (EFIAPI *udp_write)(
1582                                struct efi_pxe_base_code_protocol *this,
1583                                u16 op_flags, struct efi_ip_address *dest_ip,
1584                                u16 *dest_port,
1585                                struct efi_ip_address *gateway_ip,
1586                                struct efi_ip_address *src_ip, u16 *src_port,
1587                                efi_uintn_t *header_size, void *header_ptr,
1588                                efi_uintn_t *buffer_size, void *buffer_ptr);
1589        efi_status_t (EFIAPI *udp_read)(
1590                                struct efi_pxe_base_code_protocol *this,
1591                                u16 op_flags, struct efi_ip_address *dest_ip,
1592                                u16 *dest_port, struct efi_ip_address *src_ip,
1593                                u16 *src_port, efi_uintn_t *header_size,
1594                                void *header_ptr, efi_uintn_t *buffer_size,
1595                                void *buffer_ptr);
1596        efi_status_t (EFIAPI *set_ip_filter)(
1597                                struct efi_pxe_base_code_protocol *this,
1598                                struct efi_pxe_base_code_filter *new_filter);
1599        efi_status_t (EFIAPI *arp)(struct efi_pxe_base_code_protocol *this,
1600                                   struct efi_ip_address *ip_addr,
1601                                   struct efi_mac_address *mac_addr);
1602        efi_status_t (EFIAPI *set_parameters)(
1603                                struct efi_pxe_base_code_protocol *this,
1604                                u8 *new_auto_arp, u8 *new_send_guid,
1605                                u8 *new_ttl, u8 *new_tos,
1606                                u8 *new_make_callback);
1607        efi_status_t (EFIAPI *set_station_ip)(
1608                                struct efi_pxe_base_code_protocol *this,
1609                                struct efi_ip_address *new_station_ip,
1610                                struct efi_ip_address *new_subnet_mask);
1611        efi_status_t (EFIAPI *set_packets)(
1612                                struct efi_pxe_base_code_protocol *this,
1613                                u8 *new_dhcp_discover_valid,
1614                                u8 *new_dhcp_ack_received,
1615                                u8 *new_proxy_offer_received,
1616                                u8 *new_pxe_discover_valid,
1617                                u8 *new_pxe_reply_received,
1618                                u8 *new_pxe_bis_reply_received,
1619                                EFI_PXE_BASE_CODE_PACKET *new_dchp_discover,
1620                                EFI_PXE_BASE_CODE_PACKET *new_dhcp_acc,
1621                                EFI_PXE_BASE_CODE_PACKET *new_proxy_offer,
1622                                EFI_PXE_BASE_CODE_PACKET *new_pxe_discover,
1623                                EFI_PXE_BASE_CODE_PACKET *new_pxe_reply,
1624                                EFI_PXE_BASE_CODE_PACKET *new_pxe_bis_reply);
1625        struct efi_pxe_mode *mode;
1626};
1627
1628#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
1629        EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
1630                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
1631#define EFI_FILE_PROTOCOL_REVISION      0x00010000
1632#define EFI_FILE_PROTOCOL_REVISION2     0x00020000
1633#define EFI_FILE_PROTOCOL_LATEST_REVISION EFI_FILE_PROTOCOL_REVISION2
1634
1635struct efi_file_io_token {
1636        struct efi_event *event;
1637        efi_status_t status;
1638        efi_uintn_t buffer_size;
1639        void *buffer;};
1640
1641struct efi_file_handle {
1642        u64 rev;
1643        efi_status_t (EFIAPI *open)(struct efi_file_handle *this,
1644                        struct efi_file_handle **new_handle,
1645                        u16 *file_name, u64 open_mode, u64 attributes);
1646        efi_status_t (EFIAPI *close)(struct efi_file_handle *this);
1647        efi_status_t (EFIAPI *delete)(struct efi_file_handle *this);
1648        efi_status_t (EFIAPI *read)(struct efi_file_handle *this,
1649                        efi_uintn_t *buffer_size, void *buffer);
1650        efi_status_t (EFIAPI *write)(struct efi_file_handle *this,
1651                        efi_uintn_t *buffer_size, void *buffer);
1652        efi_status_t (EFIAPI *getpos)(struct efi_file_handle *this,
1653                                      u64 *pos);
1654        efi_status_t (EFIAPI *setpos)(struct efi_file_handle *this,
1655                                      u64 pos);
1656        efi_status_t (EFIAPI *getinfo)(struct efi_file_handle *this,
1657                        const efi_guid_t *info_type, efi_uintn_t *buffer_size,
1658                        void *buffer);
1659        efi_status_t (EFIAPI *setinfo)(struct efi_file_handle *this,
1660                        const efi_guid_t *info_type, efi_uintn_t buffer_size,
1661                        void *buffer);
1662        efi_status_t (EFIAPI *flush)(struct efi_file_handle *this);
1663        efi_status_t (EFIAPI *open_ex)(struct efi_file_handle *this,
1664                        struct efi_file_handle **new_handle,
1665                        u16 *file_name, u64 open_mode, u64 attributes,
1666                        struct efi_file_io_token *token);
1667        efi_status_t (EFIAPI *read_ex)(struct efi_file_handle *this,
1668                        struct efi_file_io_token *token);
1669        efi_status_t (EFIAPI *write_ex)(struct efi_file_handle *this,
1670                        struct efi_file_io_token *token);
1671        efi_status_t (EFIAPI *flush_ex)(struct efi_file_handle *this,
1672                        struct efi_file_io_token *token);
1673};
1674
1675#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000
1676
1677struct efi_simple_file_system_protocol {
1678        u64 rev;
1679        efi_status_t (EFIAPI *open_volume)(struct efi_simple_file_system_protocol *this,
1680                        struct efi_file_handle **root);
1681};
1682
1683#define EFI_FILE_INFO_GUID \
1684        EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, \
1685                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
1686
1687#define EFI_FILE_SYSTEM_INFO_GUID \
1688        EFI_GUID(0x09576e93, 0x6d3f, 0x11d2, \
1689                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
1690
1691#define EFI_FILE_SYSTEM_VOLUME_LABEL_ID \
1692        EFI_GUID(0xdb47d7d3, 0xfe81, 0x11d3, \
1693                 0x9a, 0x35, 0x00, 0x90, 0x27, 0x3f, 0xC1, 0x4d)
1694
1695#define EFI_FILE_MODE_READ      0x0000000000000001
1696#define EFI_FILE_MODE_WRITE     0x0000000000000002
1697#define EFI_FILE_MODE_CREATE    0x8000000000000000
1698
1699#define EFI_FILE_READ_ONLY      0x0000000000000001
1700#define EFI_FILE_HIDDEN         0x0000000000000002
1701#define EFI_FILE_SYSTEM         0x0000000000000004
1702#define EFI_FILE_RESERVED       0x0000000000000008
1703#define EFI_FILE_DIRECTORY      0x0000000000000010
1704#define EFI_FILE_ARCHIVE        0x0000000000000020
1705#define EFI_FILE_VALID_ATTR     0x0000000000000037
1706
1707struct efi_file_info {
1708        u64 size;
1709        u64 file_size;
1710        u64 physical_size;
1711        struct efi_time create_time;
1712        struct efi_time last_access_time;
1713        struct efi_time modification_time;
1714        u64 attribute;
1715        u16 file_name[0];
1716};
1717
1718struct efi_file_system_info {
1719        u64 size;
1720        u8 read_only;
1721        u64 volume_size;
1722        u64 free_space;
1723        u32 block_size;
1724        u16 volume_label[0];
1725};
1726
1727#define EFI_DRIVER_BINDING_PROTOCOL_GUID \
1728        EFI_GUID(0x18a031ab, 0xb443, 0x4d1a,\
1729                 0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71)
1730struct efi_driver_binding_protocol {
1731        efi_status_t (EFIAPI * supported)(
1732                        struct efi_driver_binding_protocol *this,
1733                        efi_handle_t controller_handle,
1734                        struct efi_device_path *remaining_device_path);
1735        efi_status_t (EFIAPI * start)(
1736                        struct efi_driver_binding_protocol *this,
1737                        efi_handle_t controller_handle,
1738                        struct efi_device_path *remaining_device_path);
1739        efi_status_t (EFIAPI * stop)(
1740                        struct efi_driver_binding_protocol *this,
1741                        efi_handle_t controller_handle,
1742                        efi_uintn_t number_of_children,
1743                        efi_handle_t *child_handle_buffer);
1744        u32 version;
1745        efi_handle_t image_handle;
1746        efi_handle_t driver_binding_handle;
1747};
1748
1749/* Current version of the Unicode collation protocol */
1750#define EFI_UNICODE_COLLATION_PROTOCOL2_GUID \
1751        EFI_GUID(0xa4c751fc, 0x23ae, 0x4c3e, \
1752                 0x92, 0xe9, 0x49, 0x64, 0xcf, 0x63, 0xf3, 0x49)
1753struct efi_unicode_collation_protocol {
1754        efi_intn_t (EFIAPI *stri_coll)(
1755                struct efi_unicode_collation_protocol *this, u16 *s1, u16 *s2);
1756        bool (EFIAPI *metai_match)(struct efi_unicode_collation_protocol *this,
1757                                   const u16 *string, const u16 *patter);
1758        void (EFIAPI *str_lwr)(struct efi_unicode_collation_protocol
1759                               *this, u16 *string);
1760        void (EFIAPI *str_upr)(struct efi_unicode_collation_protocol *this,
1761                               u16 *string);
1762        void (EFIAPI *fat_to_str)(struct efi_unicode_collation_protocol *this,
1763                                  efi_uintn_t fat_size, char *fat, u16 *string);
1764        bool (EFIAPI *str_to_fat)(struct efi_unicode_collation_protocol *this,
1765                                  const u16 *string, efi_uintn_t fat_size,
1766                                  char *fat);
1767        char *supported_languages;
1768};
1769
1770struct efi_load_file_protocol {
1771        efi_status_t (EFIAPI *load_file)(struct efi_load_file_protocol *this,
1772                                         struct efi_device_path *file_path,
1773                                         bool boot_policy,
1774                                         efi_uintn_t *buffer_size,
1775                                         void *buffer);
1776};
1777
1778struct efi_system_resource_entry {
1779        efi_guid_t fw_class;
1780        u32 fw_type;
1781        u32 fw_version;
1782        u32 lowest_supported_fw_version;
1783        u32 capsule_flags;
1784        u32 last_attempt_version;
1785        u32 last_attempt_status;
1786} __packed;
1787
1788struct efi_system_resource_table {
1789        u32 fw_resource_count;
1790        u32 fw_resource_count_max;
1791        u64 fw_resource_version;
1792        struct efi_system_resource_entry entries[];
1793} __packed;
1794
1795/* Boot manager load options */
1796#define LOAD_OPTION_ACTIVE              0x00000001
1797#define LOAD_OPTION_FORCE_RECONNECT     0x00000002
1798#define LOAD_OPTION_HIDDEN              0x00000008
1799/* All values 0x00000200-0x00001F00 are reserved */
1800#define LOAD_OPTION_CATEGORY            0x00001F00
1801#define LOAD_OPTION_CATEGORY_BOOT       0x00000000
1802#define LOAD_OPTION_CATEGORY_APP        0x00000100
1803
1804/*
1805 * System Resource Table
1806 */
1807/* Firmware Type Definitions */
1808#define ESRT_FW_TYPE_UNKNOWN            0x00000000
1809#define ESRT_FW_TYPE_SYSTEMFIRMWARE     0x00000001
1810#define ESRT_FW_TYPE_DEVICEFIRMWARE     0x00000002
1811#define ESRT_FW_TYPE_UEFIDRIVER         0x00000003
1812
1813#define EFI_SYSTEM_RESOURCE_TABLE_GUID\
1814        EFI_GUID(0xb122a263, 0x3661, 0x4f68,\
1815                0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
1816
1817/* Last Attempt Status Values */
1818#define LAST_ATTEMPT_STATUS_SUCCESS                     0x00000000
1819#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL          0x00000001
1820#define LAST_ATTEMPT_STATUS_ERROR_INSUFFICIENT_RESOURCES 0x00000002
1821#define LAST_ATTEMPT_STATUS_ERROR_INCORRECT_VERSION     0x00000003
1822#define LAST_ATTEMPT_STATUS_ERROR_INVALID_FORMAT        0x00000004
1823#define LAST_ATTEMPT_STATUS_ERROR_AUTH_ERROR            0x00000005
1824#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_AC            0x00000006
1825#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_BATT          0x00000007
1826#define LAST_ATTEMPT_STATUS_ERROR_UNSATISFIED_DEPENDENCIES 0x00000008
1827
1828/*
1829 * The LastAttemptStatus values of 0x1000 - 0x4000 are reserved for vendor
1830 * usage.
1831 */
1832#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN 0x00001000
1833#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX 0x00004000
1834
1835/* Certificate types in signature database */
1836#define EFI_CERT_SHA256_GUID \
1837        EFI_GUID(0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, \
1838                 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28)
1839#define EFI_CERT_RSA2048_GUID \
1840        EFI_GUID(0x3c5766e8, 0x269c, 0x4e34, 0xaa, 0x14, \
1841                 0xed, 0x77, 0x6e, 0x85, 0xb3, 0xb6)
1842#define EFI_CERT_X509_GUID \
1843        EFI_GUID(0xa5c059a1, 0x94e4, 0x4aa7, 0x87, 0xb5, \
1844                 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72)
1845#define EFI_CERT_X509_SHA256_GUID \
1846        EFI_GUID(0x3bd2a492, 0x96c0, 0x4079, 0xb4, 0x20, \
1847                 0xfc, 0xf9, 0x8e, 0xf1, 0x03, 0xed)
1848#define EFI_CERT_TYPE_PKCS7_GUID \
1849        EFI_GUID(0x4aafd29d, 0x68df, 0x49ee, 0x8a, 0xa9, \
1850                 0x34, 0x7d, 0x37, 0x56, 0x65, 0xa7)
1851
1852/**
1853 * struct win_certificate_uefi_guid - A certificate that encapsulates
1854 * a GUID-specific signature
1855 *
1856 * @hdr:        Windows certificate header
1857 * @cert_type:  Certificate type
1858 * @cert_data:  Certificate data
1859 */
1860struct win_certificate_uefi_guid {
1861        WIN_CERTIFICATE hdr;
1862        efi_guid_t      cert_type;
1863        u8              cert_data[];
1864} __attribute__((__packed__));
1865
1866/**
1867 * struct efi_variable_authentication_2 - A time-based authentication method
1868 * descriptor
1869 *
1870 * This structure describes an authentication information for
1871 * a variable with EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS
1872 * and should be included as part of a variable's value.
1873 * Only EFI_CERT_TYPE_PKCS7_GUID is accepted.
1874 *
1875 * @time_stamp: Descriptor's time stamp
1876 * @auth_info:  Authentication info
1877 */
1878struct efi_variable_authentication_2 {
1879        struct efi_time                  time_stamp;
1880        struct win_certificate_uefi_guid auth_info;
1881} __attribute__((__packed__));
1882
1883/**
1884 * struct efi_firmware_image_authentication - Capsule authentication method
1885 * descriptor
1886 *
1887 * This structure describes an authentication information for
1888 * a capsule with IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED set
1889 * and should be included as part of the capsule.
1890 * Only EFI_CERT_TYPE_PKCS7_GUID is accepted.
1891 *
1892 * @monotonic_count: Count to prevent replay
1893 * @auth_info: Authentication info
1894 */
1895struct efi_firmware_image_authentication {
1896        uint64_t monotonic_count;
1897        struct win_certificate_uefi_guid auth_info;
1898} __attribute__((__packed__));
1899
1900
1901/**
1902 * struct efi_signature_data - A format of signature
1903 *
1904 * This structure describes a single signature in signature database.
1905 *
1906 * @signature_owner:    Signature owner
1907 * @signature_data:     Signature data
1908 */
1909struct efi_signature_data {
1910        efi_guid_t      signature_owner;
1911        u8              signature_data[];
1912} __attribute__((__packed__));
1913
1914/**
1915 * struct efi_signature_list - A format of signature database
1916 *
1917 * This structure describes a list of signatures with the same type.
1918 * An authenticated variable's value is a concatenation of one or more
1919 * efi_signature_list's.
1920 *
1921 * @signature_type:             Signature type
1922 * @signature_list_size:        Size of signature list
1923 * @signature_header_size:      Size of signature header
1924 * @signature_size:             Size of signature
1925 */
1926struct efi_signature_list {
1927        efi_guid_t      signature_type;
1928        u32             signature_list_size;
1929        u32             signature_header_size;
1930        u32             signature_size;
1931/*      u8              signature_header[signature_header_size]; */
1932/*      struct efi_signature_data signatures[...][signature_size]; */
1933} __attribute__((__packed__));
1934
1935/*
1936 * Firmware management protocol
1937 */
1938#define EFI_FIRMWARE_MANAGEMENT_PROTOCOL_GUID \
1939        EFI_GUID(0x86c77a67, 0x0b97, 0x4633, 0xa1, 0x87, \
1940                 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7)
1941
1942#define EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID \
1943        EFI_GUID(0xae13ff2d, 0x9ad4, 0x4e25, 0x9a, 0xc8, \
1944                 0x6d, 0x80, 0xb3, 0xb2, 0x21, 0x47)
1945
1946#define EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID \
1947        EFI_GUID(0xe2bb9c06, 0x70e9, 0x4b14, 0x97, 0xa3, \
1948                 0x5a, 0x79, 0x13, 0x17, 0x6e, 0x3f)
1949
1950#define IMAGE_ATTRIBUTE_IMAGE_UPDATABLE         0x0000000000000001
1951#define IMAGE_ATTRIBUTE_RESET_REQUIRED          0x0000000000000002
1952#define IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED 0x0000000000000004
1953#define IMAGE_ATTRIBUTE_IN_USE                  0x0000000000000008
1954#define IMAGE_ATTRIBUTE_UEFI_IMAGE              0x0000000000000010
1955#define IMAGE_ATTRIBUTE_DEPENDENCY              0x0000000000000020
1956
1957#define IMAGE_COMPATIBILITY_CHECK_SUPPORTED     0x0000000000000001
1958
1959#define IMAGE_UPDATABLE_VALID                   0x0000000000000001
1960#define IMAGE_UPDATABLE_INVALID                 0x0000000000000002
1961#define IMAGE_UPDATABLE_INVALID_TYPE            0x0000000000000004
1962#define IMAGE_UPDATABLE_INVALID_OLLD            0x0000000000000008
1963#define IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE  0x0000000000000010
1964
1965#define PACKAGE_ATTRIBUTE_VERSION_UPDATABLE             0x0000000000000001
1966#define PACKAGE_ATTRIBUTE_RESET_REQUIRED                0x0000000000000002
1967#define PACKAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED       0x0000000000000004
1968
1969#define EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION   4
1970
1971typedef struct efi_firmware_image_dependencies {
1972        u8 dependencies[0];
1973} efi_firmware_image_dep_t;
1974
1975struct efi_firmware_image_descriptor {
1976        u8 image_index;
1977        efi_guid_t image_type_id;
1978        u64 image_id;
1979        u16 *image_id_name;
1980        u32 version;
1981        u16 *version_name;
1982        efi_uintn_t size;
1983        u64 attributes_supported;
1984        u64 attributes_setting;
1985        u64 compatibilities;
1986        u32 lowest_supported_image_version;
1987        u32 last_attempt_version;
1988        u32 last_attempt_status;
1989        u64 hardware_instance;
1990        efi_firmware_image_dep_t *dependencies;
1991};
1992
1993struct efi_firmware_management_protocol {
1994        efi_status_t (EFIAPI *get_image_info)(
1995                        struct efi_firmware_management_protocol *this,
1996                        efi_uintn_t *image_info_size,
1997                        struct efi_firmware_image_descriptor *image_info,
1998                        u32 *descriptor_version,
1999                        u8 *descriptor_count,
2000                        efi_uintn_t *descriptor_size,
2001                        u32 *package_version,
2002                        u16 **package_version_name);
2003        efi_status_t (EFIAPI *get_image)(
2004                        struct efi_firmware_management_protocol *this,
2005                        u8 image_index,
2006                        void *image,
2007                        efi_uintn_t *image_size);
2008        efi_status_t (EFIAPI *set_image)(
2009                        struct efi_firmware_management_protocol *this,
2010                        u8 image_index,
2011                        const void *image,
2012                        efi_uintn_t image_size,
2013                        const void *vendor_code,
2014                        efi_status_t (*progress)(efi_uintn_t completion),
2015                        u16 **abort_reason);
2016        efi_status_t (EFIAPI *check_image)(
2017                        struct efi_firmware_management_protocol *this,
2018                        u8 image_index,
2019                        const void *image,
2020                        efi_uintn_t *image_size,
2021                        u32 *image_updatable);
2022        efi_status_t (EFIAPI *get_package_info)(
2023                        struct efi_firmware_management_protocol *this,
2024                        u32 *package_version,
2025                        u16 **package_version_name,
2026                        u32 *package_version_name_maxlen,
2027                        u64 *attributes_supported,
2028                        u64 *attributes_setting);
2029        efi_status_t (EFIAPI *set_package_info)(
2030                        struct efi_firmware_management_protocol *this,
2031                        const void *image,
2032                        efi_uintn_t *image_size,
2033                        const void *vendor_code,
2034                        u32 package_version,
2035                        const u16 *package_version_name);
2036};
2037
2038#endif
2039