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