uboot/include/efi_api.h
<<
>>
Prefs
   1/*
   2 * Extensible Firmware Interface
   3 * Based on 'Extensible Firmware Interface Specification' version 0.9,
   4 * April 30, 1999
   5 *
   6 * Copyright (C) 1999 VA Linux Systems
   7 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
   8 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
   9 *      David Mosberger-Tang <davidm@hpl.hp.com>
  10 *      Stephane Eranian <eranian@hpl.hp.com>
  11 *
  12 * From include/linux/efi.h in kernel 4.1 with some additions/subtractions
  13 */
  14
  15#ifndef _EFI_API_H
  16#define _EFI_API_H
  17
  18#include <efi.h>
  19
  20#ifdef CONFIG_EFI_LOADER
  21#include <asm/setjmp.h>
  22#endif
  23
  24/* Types and defines for EFI CreateEvent */
  25enum efi_timer_delay {
  26        EFI_TIMER_STOP = 0,
  27        EFI_TIMER_PERIODIC = 1,
  28        EFI_TIMER_RELATIVE = 2
  29};
  30
  31#define efi_uintn_t size_t
  32typedef uint16_t *efi_string_t;
  33
  34#define EVT_TIMER                               0x80000000
  35#define EVT_RUNTIME                             0x40000000
  36#define EVT_NOTIFY_WAIT                         0x00000100
  37#define EVT_NOTIFY_SIGNAL                       0x00000200
  38#define EVT_SIGNAL_EXIT_BOOT_SERVICES           0x00000201
  39#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE       0x60000202
  40
  41#define TPL_APPLICATION         0x04
  42#define TPL_CALLBACK            0x08
  43#define TPL_NOTIFY              0x10
  44#define TPL_HIGH_LEVEL          0x1F
  45
  46struct efi_event;
  47
  48/* EFI Boot Services table */
  49struct efi_boot_services {
  50        struct efi_table_hdr hdr;
  51        efi_status_t (EFIAPI *raise_tpl)(efi_uintn_t new_tpl);
  52        void (EFIAPI *restore_tpl)(efi_uintn_t old_tpl);
  53
  54        efi_status_t (EFIAPI *allocate_pages)(int, int, efi_uintn_t,
  55                                              efi_physical_addr_t *);
  56        efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, efi_uintn_t);
  57        efi_status_t (EFIAPI *get_memory_map)(efi_uintn_t *memory_map_size,
  58                                              struct efi_mem_desc *desc,
  59                                              efi_uintn_t *key,
  60                                              efi_uintn_t *desc_size,
  61                                              u32 *desc_version);
  62        efi_status_t (EFIAPI *allocate_pool)(int, efi_uintn_t, void **);
  63        efi_status_t (EFIAPI *free_pool)(void *);
  64
  65        efi_status_t (EFIAPI *create_event)(uint32_t type,
  66                        efi_uintn_t notify_tpl,
  67                        void (EFIAPI *notify_function) (
  68                                        struct efi_event *event,
  69                                        void *context),
  70                        void *notify_context, struct efi_event **event);
  71        efi_status_t (EFIAPI *set_timer)(struct efi_event *event,
  72                                         enum efi_timer_delay type,
  73                                         uint64_t trigger_time);
  74        efi_status_t (EFIAPI *wait_for_event)(efi_uintn_t number_of_events,
  75                                              struct efi_event **event,
  76                                              efi_uintn_t *index);
  77        efi_status_t (EFIAPI *signal_event)(struct efi_event *event);
  78        efi_status_t (EFIAPI *close_event)(struct efi_event *event);
  79        efi_status_t (EFIAPI *check_event)(struct efi_event *event);
  80#define EFI_NATIVE_INTERFACE    0x00000000
  81        efi_status_t (EFIAPI *install_protocol_interface)(
  82                        void **handle, const efi_guid_t *protocol,
  83                        int protocol_interface_type, void *protocol_interface);
  84        efi_status_t (EFIAPI *reinstall_protocol_interface)(
  85                        void *handle, const efi_guid_t *protocol,
  86                        void *old_interface, void *new_interface);
  87        efi_status_t (EFIAPI *uninstall_protocol_interface)(void *handle,
  88                        const efi_guid_t *protocol, void *protocol_interface);
  89        efi_status_t (EFIAPI *handle_protocol)(efi_handle_t,
  90                                               const efi_guid_t *protocol,
  91                                               void **protocol_interface);
  92        void *reserved;
  93        efi_status_t (EFIAPI *register_protocol_notify)(
  94                        const efi_guid_t *protocol, struct efi_event *event,
  95                        void **registration);
  96        efi_status_t (EFIAPI *locate_handle)(
  97                        enum efi_locate_search_type search_type,
  98                        const efi_guid_t *protocol, void *search_key,
  99                        efi_uintn_t *buffer_size, efi_handle_t *buffer);
 100        efi_status_t (EFIAPI *locate_device_path)(const efi_guid_t *protocol,
 101                        struct efi_device_path **device_path,
 102                        efi_handle_t *device);
 103        efi_status_t (EFIAPI *install_configuration_table)(
 104                        efi_guid_t *guid, void *table);
 105
 106        efi_status_t (EFIAPI *load_image)(bool boot_policiy,
 107                        efi_handle_t parent_image,
 108                        struct efi_device_path *file_path, void *source_buffer,
 109                        unsigned long source_size, efi_handle_t *image);
 110        efi_status_t (EFIAPI *start_image)(efi_handle_t handle,
 111                                           unsigned long *exitdata_size,
 112                                           s16 **exitdata);
 113        efi_status_t (EFIAPI *exit)(efi_handle_t handle,
 114                                    efi_status_t exit_status,
 115                                    unsigned long exitdata_size, s16 *exitdata);
 116        efi_status_t (EFIAPI *unload_image)(void *image_handle);
 117        efi_status_t (EFIAPI *exit_boot_services)(efi_handle_t, unsigned long);
 118
 119        efi_status_t (EFIAPI *get_next_monotonic_count)(u64 *count);
 120        efi_status_t (EFIAPI *stall)(unsigned long usecs);
 121        efi_status_t (EFIAPI *set_watchdog_timer)(unsigned long timeout,
 122                        uint64_t watchdog_code, unsigned long data_size,
 123                        uint16_t *watchdog_data);
 124        efi_status_t(EFIAPI *connect_controller)(efi_handle_t controller_handle,
 125                        efi_handle_t *driver_image_handle,
 126                        struct efi_device_path *remaining_device_path,
 127                        bool recursive);
 128        efi_status_t (EFIAPI *disconnect_controller)(void *controller_handle,
 129                        void *driver_image_handle, void *child_handle);
 130#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
 131#define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
 132#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
 133#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
 134#define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
 135#define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
 136        efi_status_t (EFIAPI *open_protocol)(efi_handle_t handle,
 137                        const efi_guid_t *protocol, void **interface,
 138                        efi_handle_t agent_handle,
 139                        efi_handle_t controller_handle, u32 attributes);
 140        efi_status_t (EFIAPI *close_protocol)(void *handle,
 141                        const efi_guid_t *protocol, void *agent_handle,
 142                        void *controller_handle);
 143        efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle,
 144                        const efi_guid_t *protocol,
 145                        struct efi_open_protocol_info_entry **entry_buffer,
 146                        efi_uintn_t *entry_count);
 147        efi_status_t (EFIAPI *protocols_per_handle)(efi_handle_t handle,
 148                        efi_guid_t ***protocol_buffer,
 149                        efi_uintn_t *protocols_buffer_count);
 150        efi_status_t (EFIAPI *locate_handle_buffer) (
 151                        enum efi_locate_search_type search_type,
 152                        const efi_guid_t *protocol, void *search_key,
 153                        efi_uintn_t *no_handles, efi_handle_t **buffer);
 154        efi_status_t (EFIAPI *locate_protocol)(const efi_guid_t *protocol,
 155                        void *registration, void **protocol_interface);
 156        efi_status_t (EFIAPI *install_multiple_protocol_interfaces)(
 157                        void **handle, ...);
 158        efi_status_t (EFIAPI *uninstall_multiple_protocol_interfaces)(
 159                        void *handle, ...);
 160        efi_status_t (EFIAPI *calculate_crc32)(void *data,
 161                        unsigned long data_size, uint32_t *crc32);
 162        void (EFIAPI *copy_mem)(void *destination, const void *source,
 163                        size_t length);
 164        void (EFIAPI *set_mem)(void *buffer, size_t size, uint8_t value);
 165        void *create_event_ex;
 166};
 167
 168/* Types and defines for EFI ResetSystem */
 169enum efi_reset_type {
 170        EFI_RESET_COLD = 0,
 171        EFI_RESET_WARM = 1,
 172        EFI_RESET_SHUTDOWN = 2
 173};
 174
 175/* EFI Runtime Services table */
 176#define EFI_RUNTIME_SERVICES_SIGNATURE  0x5652453544e5552ULL
 177#define EFI_RUNTIME_SERVICES_REVISION   0x00010000
 178
 179struct efi_runtime_services {
 180        struct efi_table_hdr hdr;
 181        efi_status_t (EFIAPI *get_time)(struct efi_time *time,
 182                        struct efi_time_cap *capabilities);
 183        efi_status_t (EFIAPI *set_time)(struct efi_time *time);
 184        efi_status_t (EFIAPI *get_wakeup_time)(char *enabled, char *pending,
 185                        struct efi_time *time);
 186        efi_status_t (EFIAPI *set_wakeup_time)(char enabled,
 187                        struct efi_time *time);
 188        efi_status_t (EFIAPI *set_virtual_address_map)(
 189                        unsigned long memory_map_size,
 190                        unsigned long descriptor_size,
 191                        uint32_t descriptor_version,
 192                        struct efi_mem_desc *virtmap);
 193        efi_status_t (*convert_pointer)(unsigned long dbg, void **address);
 194        efi_status_t (EFIAPI *get_variable)(s16 *variable_name,
 195                        efi_guid_t *vendor, u32 *attributes,
 196                        unsigned long *data_size, void *data);
 197        efi_status_t (EFIAPI *get_next_variable)(
 198                        unsigned long *variable_name_size,
 199                        s16 *variable_name, efi_guid_t *vendor);
 200        efi_status_t (EFIAPI *set_variable)(s16 *variable_name,
 201                        efi_guid_t *vendor, u32 attributes,
 202                        unsigned long data_size, void *data);
 203        efi_status_t (EFIAPI *get_next_high_mono_count)(
 204                        uint32_t *high_count);
 205        void (EFIAPI *reset_system)(enum efi_reset_type reset_type,
 206                                    efi_status_t reset_status,
 207                                    unsigned long data_size, void *reset_data);
 208        void *update_capsule;
 209        void *query_capsule_caps;
 210        void *query_variable_info;
 211};
 212
 213/* EFI Configuration Table and GUID definitions */
 214#define NULL_GUID \
 215        EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, \
 216                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
 217
 218#define EFI_GLOBAL_VARIABLE_GUID \
 219        EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, \
 220                 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
 221
 222#define LOADED_IMAGE_PROTOCOL_GUID \
 223        EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, \
 224                 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 225
 226#define EFI_FDT_GUID \
 227        EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
 228                 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
 229
 230#define SMBIOS_TABLE_GUID \
 231        EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
 232                 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 233
 234struct efi_configuration_table
 235{
 236        efi_guid_t guid;
 237        void *table;
 238};
 239
 240#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
 241
 242struct efi_system_table {
 243        struct efi_table_hdr hdr;
 244        unsigned long fw_vendor;   /* physical addr of wchar_t vendor string */
 245        u32 fw_revision;
 246        unsigned long con_in_handle;
 247        struct efi_simple_input_interface *con_in;
 248        unsigned long con_out_handle;
 249        struct efi_simple_text_output_protocol *con_out;
 250        unsigned long stderr_handle;
 251        struct efi_simple_text_output_protocol *std_err;
 252        struct efi_runtime_services *runtime;
 253        struct efi_boot_services *boottime;
 254        efi_uintn_t nr_tables;
 255        struct efi_configuration_table *tables;
 256};
 257
 258#define LOADED_IMAGE_GUID \
 259        EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \
 260                 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 261
 262struct efi_loaded_image {
 263        u32 revision;
 264        void *parent_handle;
 265        struct efi_system_table *system_table;
 266        void *device_handle;
 267        void *file_path;
 268        void *reserved;
 269        u32 load_options_size;
 270        void *load_options;
 271        void *image_base;
 272        aligned_u64 image_size;
 273        unsigned int image_code_type;
 274        unsigned int image_data_type;
 275        unsigned long unload;
 276
 277        /* Below are efi loader private fields */
 278#ifdef CONFIG_EFI_LOADER
 279        efi_status_t exit_status;
 280        struct jmp_buf_data exit_jmp;
 281#endif
 282};
 283
 284#define DEVICE_PATH_GUID \
 285        EFI_GUID(0x09576e91, 0x6d3f, 0x11d2, \
 286                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
 287
 288#define DEVICE_PATH_TYPE_END                    0x7f
 289#  define DEVICE_PATH_SUB_TYPE_END              0xff
 290
 291struct efi_device_path {
 292        u8 type;
 293        u8 sub_type;
 294        u16 length;
 295} __packed;
 296
 297struct efi_mac_addr {
 298        u8 addr[32];
 299} __packed;
 300
 301#define DEVICE_PATH_TYPE_HARDWARE_DEVICE        0x01
 302#  define DEVICE_PATH_SUB_TYPE_MEMORY           0x03
 303#  define DEVICE_PATH_SUB_TYPE_VENDOR           0x04
 304
 305struct efi_device_path_memory {
 306        struct efi_device_path dp;
 307        u32 memory_type;
 308        u64 start_address;
 309        u64 end_address;
 310} __packed;
 311
 312struct efi_device_path_vendor {
 313        struct efi_device_path dp;
 314        efi_guid_t guid;
 315        u8 vendor_data[];
 316} __packed;
 317
 318#define DEVICE_PATH_TYPE_ACPI_DEVICE            0x02
 319#  define DEVICE_PATH_SUB_TYPE_ACPI_DEVICE      0x01
 320
 321#define EFI_PNP_ID(ID)                          (u32)(((ID) << 16) | 0x41D0)
 322#define EISA_PNP_ID(ID)                         EFI_PNP_ID(ID)
 323#define EISA_PNP_NUM(ID)                        ((ID) >> 16)
 324
 325struct efi_device_path_acpi_path {
 326        struct efi_device_path dp;
 327        u32 hid;
 328        u32 uid;
 329} __packed;
 330
 331#define DEVICE_PATH_TYPE_MESSAGING_DEVICE       0x03
 332#  define DEVICE_PATH_SUB_TYPE_MSG_USB          0x05
 333#  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR     0x0b
 334#  define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS    0x0f
 335#  define DEVICE_PATH_SUB_TYPE_MSG_SD           0x1a
 336#  define DEVICE_PATH_SUB_TYPE_MSG_MMC          0x1d
 337
 338struct efi_device_path_usb {
 339        struct efi_device_path dp;
 340        u8 parent_port_number;
 341        u8 usb_interface;
 342} __packed;
 343
 344struct efi_device_path_mac_addr {
 345        struct efi_device_path dp;
 346        struct efi_mac_addr mac;
 347        u8 if_type;
 348} __packed;
 349
 350struct efi_device_path_usb_class {
 351        struct efi_device_path dp;
 352        u16 vendor_id;
 353        u16 product_id;
 354        u8 device_class;
 355        u8 device_subclass;
 356        u8 device_protocol;
 357} __packed;
 358
 359struct efi_device_path_sd_mmc_path {
 360        struct efi_device_path dp;
 361        u8 slot_number;
 362} __packed;
 363
 364#define DEVICE_PATH_TYPE_MEDIA_DEVICE           0x04
 365#  define DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH  0x01
 366#  define DEVICE_PATH_SUB_TYPE_CDROM_PATH       0x02
 367#  define DEVICE_PATH_SUB_TYPE_FILE_PATH        0x04
 368
 369struct efi_device_path_hard_drive_path {
 370        struct efi_device_path dp;
 371        u32 partition_number;
 372        u64 partition_start;
 373        u64 partition_end;
 374        u8 partition_signature[16];
 375        u8 partmap_type;
 376        u8 signature_type;
 377} __packed;
 378
 379struct efi_device_path_cdrom_path {
 380        struct efi_device_path dp;
 381        u32 boot_entry;
 382        u64 partition_start;
 383        u64 partition_end;
 384} __packed;
 385
 386struct efi_device_path_file_path {
 387        struct efi_device_path dp;
 388        u16 str[];
 389} __packed;
 390
 391#define BLOCK_IO_GUID \
 392        EFI_GUID(0x964e5b21, 0x6459, 0x11d2, \
 393                 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 394
 395struct efi_block_io_media
 396{
 397        u32 media_id;
 398        char removable_media;
 399        char media_present;
 400        char logical_partition;
 401        char read_only;
 402        char write_caching;
 403        u8 pad[3];
 404        u32 block_size;
 405        u32 io_align;
 406        u8 pad2[4];
 407        u64 last_block;
 408};
 409
 410struct efi_block_io {
 411        u64 revision;
 412        struct efi_block_io_media *media;
 413        efi_status_t (EFIAPI *reset)(struct efi_block_io *this,
 414                        char extended_verification);
 415        efi_status_t (EFIAPI *read_blocks)(struct efi_block_io *this,
 416                        u32 media_id, u64 lba, unsigned long buffer_size,
 417                        void *buffer);
 418        efi_status_t (EFIAPI *write_blocks)(struct efi_block_io *this,
 419                        u32 media_id, u64 lba, unsigned long buffer_size,
 420                        void *buffer);
 421        efi_status_t (EFIAPI *flush_blocks)(struct efi_block_io *this);
 422};
 423
 424struct simple_text_output_mode {
 425        s32 max_mode;
 426        s32 mode;
 427        s32 attribute;
 428        s32 cursor_column;
 429        s32 cursor_row;
 430        bool cursor_visible;
 431};
 432
 433
 434#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
 435        EFI_GUID(0x387477c2, 0x69c7, 0x11d2, \
 436                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 437
 438#define EFI_BLACK                0x00
 439#define EFI_BLUE                 0x01
 440#define EFI_GREEN                0x02
 441#define EFI_CYAN                 0x03
 442#define EFI_RED                  0x04
 443#define EFI_MAGENTA              0x05
 444#define EFI_BROWN                0x06
 445#define EFI_LIGHTGRAY            0x07
 446#define EFI_BRIGHT               0x08
 447#define EFI_DARKGRAY             0x08
 448#define EFI_LIGHTBLUE            0x09
 449#define EFI_LIGHTGREEN           0x0a
 450#define EFI_LIGHTCYAN            0x0b
 451#define EFI_LIGHTRED             0x0c
 452#define EFI_LIGHTMAGENTA         0x0d
 453#define EFI_YELLOW               0x0e
 454#define EFI_WHITE                0x0f
 455#define EFI_BACKGROUND_BLACK     0x00
 456#define EFI_BACKGROUND_BLUE      0x10
 457#define EFI_BACKGROUND_GREEN     0x20
 458#define EFI_BACKGROUND_CYAN      0x30
 459#define EFI_BACKGROUND_RED       0x40
 460#define EFI_BACKGROUND_MAGENTA   0x50
 461#define EFI_BACKGROUND_BROWN     0x60
 462#define EFI_BACKGROUND_LIGHTGRAY 0x70
 463
 464/* extract foreground color from EFI attribute */
 465#define EFI_ATTR_FG(attr)        ((attr) & 0x07)
 466/* treat high bit of FG as bright/bold (similar to edk2) */
 467#define EFI_ATTR_BOLD(attr)      (((attr) >> 3) & 0x01)
 468/* extract background color from EFI attribute */
 469#define EFI_ATTR_BG(attr)        (((attr) >> 4) & 0x7)
 470
 471struct efi_simple_text_output_protocol {
 472        void *reset;
 473        efi_status_t (EFIAPI *output_string)(
 474                        struct efi_simple_text_output_protocol *this,
 475                        const efi_string_t str);
 476        efi_status_t (EFIAPI *test_string)(
 477                        struct efi_simple_text_output_protocol *this,
 478                        const efi_string_t str);
 479        efi_status_t(EFIAPI *query_mode)(
 480                        struct efi_simple_text_output_protocol *this,
 481                        unsigned long mode_number, unsigned long *columns,
 482                        unsigned long *rows);
 483        efi_status_t(EFIAPI *set_mode)(
 484                        struct efi_simple_text_output_protocol *this,
 485                        unsigned long mode_number);
 486        efi_status_t(EFIAPI *set_attribute)(
 487                        struct efi_simple_text_output_protocol *this,
 488                        unsigned long attribute);
 489        efi_status_t(EFIAPI *clear_screen) (
 490                        struct efi_simple_text_output_protocol *this);
 491        efi_status_t(EFIAPI *set_cursor_position) (
 492                        struct efi_simple_text_output_protocol *this,
 493                        unsigned long column, unsigned long row);
 494        efi_status_t(EFIAPI *enable_cursor)(
 495                        struct efi_simple_text_output_protocol *this,
 496                        bool enable);
 497        struct simple_text_output_mode *mode;
 498};
 499
 500struct efi_input_key {
 501        u16 scan_code;
 502        s16 unicode_char;
 503};
 504
 505#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \
 506        EFI_GUID(0x387477c1, 0x69c7, 0x11d2, \
 507                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 508
 509struct efi_simple_input_interface {
 510        efi_status_t(EFIAPI *reset)(struct efi_simple_input_interface *this,
 511                        bool ExtendedVerification);
 512        efi_status_t(EFIAPI *read_key_stroke)(
 513                        struct efi_simple_input_interface *this,
 514                        struct efi_input_key *key);
 515        struct efi_event *wait_for_key;
 516};
 517
 518#define CONSOLE_CONTROL_GUID \
 519        EFI_GUID(0xf42f7782, 0x12e, 0x4c12, \
 520                 0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21)
 521#define EFI_CONSOLE_MODE_TEXT   0
 522#define EFI_CONSOLE_MODE_GFX    1
 523
 524struct efi_console_control_protocol
 525{
 526        efi_status_t (EFIAPI *get_mode)(
 527                        struct efi_console_control_protocol *this, int *mode,
 528                        char *uga_exists, char *std_in_locked);
 529        efi_status_t (EFIAPI *set_mode)(
 530                        struct efi_console_control_protocol *this, int mode);
 531        efi_status_t (EFIAPI *lock_std_in)(
 532                        struct efi_console_control_protocol *this,
 533                        uint16_t *password);
 534};
 535
 536#define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
 537        EFI_GUID(0x8b843e20, 0x8132, 0x4852, \
 538                 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c)
 539
 540struct efi_device_path_to_text_protocol
 541{
 542        uint16_t *(EFIAPI *convert_device_node_to_text)(
 543                        struct efi_device_path *device_node,
 544                        bool display_only,
 545                        bool allow_shortcuts);
 546        uint16_t *(EFIAPI *convert_device_path_to_text)(
 547                        struct efi_device_path *device_path,
 548                        bool display_only,
 549                        bool allow_shortcuts);
 550};
 551
 552#define EFI_GOP_GUID \
 553        EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \
 554                 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
 555
 556#define EFI_GOT_RGBA8           0
 557#define EFI_GOT_BGRA8           1
 558#define EFI_GOT_BITMASK         2
 559
 560struct efi_gop_mode_info
 561{
 562        u32 version;
 563        u32 width;
 564        u32 height;
 565        u32 pixel_format;
 566        u32 pixel_bitmask[4];
 567        u32 pixels_per_scanline;
 568};
 569
 570struct efi_gop_mode
 571{
 572        u32 max_mode;
 573        u32 mode;
 574        struct efi_gop_mode_info *info;
 575        unsigned long info_size;
 576        efi_physical_addr_t fb_base;
 577        unsigned long fb_size;
 578};
 579
 580#define EFI_BLT_VIDEO_FILL              0
 581#define EFI_BLT_VIDEO_TO_BLT_BUFFER     1
 582#define EFI_BLT_BUFFER_TO_VIDEO         2
 583#define EFI_BLT_VIDEO_TO_VIDEO          3
 584
 585struct efi_gop
 586{
 587        efi_status_t (EFIAPI *query_mode)(struct efi_gop *this, u32 mode_number,
 588                                          efi_uintn_t *size_of_info,
 589                                          struct efi_gop_mode_info **info);
 590        efi_status_t (EFIAPI *set_mode)(struct efi_gop *this, u32 mode_number);
 591        efi_status_t (EFIAPI *blt)(struct efi_gop *this, void *buffer,
 592                                   u32 operation, efi_uintn_t sx,
 593                                   efi_uintn_t sy, efi_uintn_t dx,
 594                                   efi_uintn_t dy, efi_uintn_t width,
 595                                   efi_uintn_t height, efi_uintn_t delta);
 596        struct efi_gop_mode *mode;
 597};
 598
 599#define EFI_SIMPLE_NETWORK_GUID \
 600        EFI_GUID(0xa19832b9, 0xac25, 0x11d3, \
 601                 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 602
 603struct efi_mac_address {
 604        char mac_addr[32];
 605};
 606
 607struct efi_ip_address {
 608        u8 ip_addr[16];
 609};
 610
 611enum efi_simple_network_state {
 612        EFI_NETWORK_STOPPED,
 613        EFI_NETWORK_STARTED,
 614        EFI_NETWORK_INITIALIZED,
 615};
 616
 617struct efi_simple_network_mode {
 618        enum efi_simple_network_state state;
 619        u32 hwaddr_size;
 620        u32 media_header_size;
 621        u32 max_packet_size;
 622        u32 nvram_size;
 623        u32 nvram_access_size;
 624        u32 receive_filter_mask;
 625        u32 receive_filter_setting;
 626        u32 max_mcast_filter_count;
 627        u32 mcast_filter_count;
 628        struct efi_mac_address mcast_filter[16];
 629        struct efi_mac_address current_address;
 630        struct efi_mac_address broadcast_address;
 631        struct efi_mac_address permanent_address;
 632        u8 if_type;
 633        u8 mac_changeable;
 634        u8 multitx_supported;
 635        u8 media_present_supported;
 636        u8 media_present;
 637};
 638
 639/* receive_filters bit mask */
 640#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST               0x01
 641#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST             0x02
 642#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST             0x04
 643#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS           0x08
 644#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
 645
 646/* interrupt status bit mask */
 647#define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT    0x01
 648#define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT   0x02
 649#define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT    0x04
 650#define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT   0x08
 651
 652/* revision of the simple network protocol */
 653#define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION    0x00010000
 654
 655struct efi_simple_network
 656{
 657        u64 revision;
 658        efi_status_t (EFIAPI *start)(struct efi_simple_network *this);
 659        efi_status_t (EFIAPI *stop)(struct efi_simple_network *this);
 660        efi_status_t (EFIAPI *initialize)(struct efi_simple_network *this,
 661                        ulong extra_rx, ulong extra_tx);
 662        efi_status_t (EFIAPI *reset)(struct efi_simple_network *this,
 663                        int extended_verification);
 664        efi_status_t (EFIAPI *shutdown)(struct efi_simple_network *this);
 665        efi_status_t (EFIAPI *receive_filters)(struct efi_simple_network *this,
 666                        u32 enable, u32 disable, int reset_mcast_filter,
 667                        ulong mcast_filter_count,
 668                        struct efi_mac_address *mcast_filter);
 669        efi_status_t (EFIAPI *station_address)(struct efi_simple_network *this,
 670                        int reset, struct efi_mac_address *new_mac);
 671        efi_status_t (EFIAPI *statistics)(struct efi_simple_network *this,
 672                        int reset, ulong *stat_size, void *stat_table);
 673        efi_status_t (EFIAPI *mcastiptomac)(struct efi_simple_network *this,
 674                        int ipv6, struct efi_ip_address *ip,
 675                        struct efi_mac_address *mac);
 676        efi_status_t (EFIAPI *nvdata)(struct efi_simple_network *this,
 677                        int read_write, ulong offset, ulong buffer_size,
 678                        char *buffer);
 679        efi_status_t (EFIAPI *get_status)(struct efi_simple_network *this,
 680                        u32 *int_status, void **txbuf);
 681        efi_status_t (EFIAPI *transmit)(struct efi_simple_network *this,
 682                        size_t header_size, size_t buffer_size, void *buffer,
 683                        struct efi_mac_address *src_addr,
 684                        struct efi_mac_address *dest_addr, u16 *protocol);
 685        efi_status_t (EFIAPI *receive)(struct efi_simple_network *this,
 686                        size_t *header_size, size_t *buffer_size, void *buffer,
 687                        struct efi_mac_address *src_addr,
 688                        struct efi_mac_address *dest_addr, u16 *protocol);
 689        struct efi_event *wait_for_packet;
 690        struct efi_simple_network_mode *mode;
 691};
 692
 693#define EFI_PXE_GUID \
 694        EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \
 695                 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 696
 697struct efi_pxe_packet {
 698        u8 packet[1472];
 699};
 700
 701struct efi_pxe_mode
 702{
 703        u8 unused[52];
 704        struct efi_pxe_packet dhcp_discover;
 705        struct efi_pxe_packet dhcp_ack;
 706        struct efi_pxe_packet proxy_offer;
 707        struct efi_pxe_packet pxe_discover;
 708        struct efi_pxe_packet pxe_reply;
 709};
 710
 711struct efi_pxe {
 712        u64 rev;
 713        void (EFIAPI *start)(void);
 714        void (EFIAPI *stop)(void);
 715        void (EFIAPI *dhcp)(void);
 716        void (EFIAPI *discover)(void);
 717        void (EFIAPI *mftp)(void);
 718        void (EFIAPI *udpwrite)(void);
 719        void (EFIAPI *udpread)(void);
 720        void (EFIAPI *setipfilter)(void);
 721        void (EFIAPI *arp)(void);
 722        void (EFIAPI *setparams)(void);
 723        void (EFIAPI *setstationip)(void);
 724        void (EFIAPI *setpackets)(void);
 725        struct efi_pxe_mode *mode;
 726};
 727
 728#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
 729        EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
 730                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 731#define EFI_FILE_PROTOCOL_REVISION 0x00010000
 732
 733struct efi_file_handle {
 734        u64 rev;
 735        efi_status_t (EFIAPI *open)(struct efi_file_handle *file,
 736                        struct efi_file_handle **new_handle,
 737                        s16 *file_name, u64 open_mode, u64 attributes);
 738        efi_status_t (EFIAPI *close)(struct efi_file_handle *file);
 739        efi_status_t (EFIAPI *delete)(struct efi_file_handle *file);
 740        efi_status_t (EFIAPI *read)(struct efi_file_handle *file,
 741                        u64 *buffer_size, void *buffer);
 742        efi_status_t (EFIAPI *write)(struct efi_file_handle *file,
 743                        u64 *buffer_size, void *buffer);
 744        efi_status_t (EFIAPI *getpos)(struct efi_file_handle *file,
 745                        u64 *pos);
 746        efi_status_t (EFIAPI *setpos)(struct efi_file_handle *file,
 747                        u64 pos);
 748        efi_status_t (EFIAPI *getinfo)(struct efi_file_handle *file,
 749                        efi_guid_t *info_type, u64 *buffer_size, void *buffer);
 750        efi_status_t (EFIAPI *setinfo)(struct efi_file_handle *file,
 751                        efi_guid_t *info_type, u64 buffer_size, void *buffer);
 752        efi_status_t (EFIAPI *flush)(struct efi_file_handle *file);
 753};
 754
 755#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
 756        EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \
 757                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 758#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000
 759
 760struct efi_simple_file_system_protocol {
 761        u64 rev;
 762        efi_status_t (EFIAPI *open_volume)(struct efi_simple_file_system_protocol *this,
 763                        struct efi_file_handle **root);
 764};
 765
 766#define EFI_FILE_INFO_GUID \
 767        EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, \
 768                 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 769
 770#define EFI_FILE_MODE_READ      0x0000000000000001
 771#define EFI_FILE_MODE_WRITE     0x0000000000000002
 772#define EFI_FILE_MODE_CREATE    0x8000000000000000
 773
 774#define EFI_FILE_READ_ONLY      0x0000000000000001
 775#define EFI_FILE_HIDDEN         0x0000000000000002
 776#define EFI_FILE_SYSTEM         0x0000000000000004
 777#define EFI_FILE_RESERVED       0x0000000000000008
 778#define EFI_FILE_DIRECTORY      0x0000000000000010
 779#define EFI_FILE_ARCHIVE        0x0000000000000020
 780#define EFI_FILE_VALID_ATTR     0x0000000000000037
 781
 782struct efi_file_info {
 783        u64 size;
 784        u64 file_size;
 785        u64 physical_size;
 786        struct efi_time create_time;
 787        struct efi_time last_access_time;
 788        struct efi_time modification_time;
 789        u64 attribute;
 790        s16 file_name[0];
 791};
 792
 793#endif
 794