linux/include/linux/efi.h
<<
>>
Prefs
   1#ifndef _LINUX_EFI_H
   2#define _LINUX_EFI_H
   3
   4/*
   5 * Extensible Firmware Interface
   6 * Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999
   7 *
   8 * Copyright (C) 1999 VA Linux Systems
   9 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  10 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co.
  11 *      David Mosberger-Tang <davidm@hpl.hp.com>
  12 *      Stephane Eranian <eranian@hpl.hp.com>
  13 */
  14#include <linux/init.h>
  15#include <linux/string.h>
  16#include <linux/time.h>
  17#include <linux/types.h>
  18#include <linux/proc_fs.h>
  19#include <linux/rtc.h>
  20#include <linux/ioport.h>
  21#include <linux/pfn.h>
  22#include <linux/pstore.h>
  23#include <linux/reboot.h>
  24#include <linux/uuid.h>
  25#include <linux/screen_info.h>
  26
  27#include <asm/page.h>
  28
  29#define EFI_SUCCESS             0
  30#define EFI_LOAD_ERROR          ( 1 | (1UL << (BITS_PER_LONG-1)))
  31#define EFI_INVALID_PARAMETER   ( 2 | (1UL << (BITS_PER_LONG-1)))
  32#define EFI_UNSUPPORTED         ( 3 | (1UL << (BITS_PER_LONG-1)))
  33#define EFI_BAD_BUFFER_SIZE     ( 4 | (1UL << (BITS_PER_LONG-1)))
  34#define EFI_BUFFER_TOO_SMALL    ( 5 | (1UL << (BITS_PER_LONG-1)))
  35#define EFI_NOT_READY           ( 6 | (1UL << (BITS_PER_LONG-1)))
  36#define EFI_DEVICE_ERROR        ( 7 | (1UL << (BITS_PER_LONG-1)))
  37#define EFI_WRITE_PROTECTED     ( 8 | (1UL << (BITS_PER_LONG-1)))
  38#define EFI_OUT_OF_RESOURCES    ( 9 | (1UL << (BITS_PER_LONG-1)))
  39#define EFI_NOT_FOUND           (14 | (1UL << (BITS_PER_LONG-1)))
  40#define EFI_SECURITY_VIOLATION  (26 | (1UL << (BITS_PER_LONG-1)))
  41
  42typedef unsigned long efi_status_t;
  43typedef u8 efi_bool_t;
  44typedef u16 efi_char16_t;               /* UNICODE character */
  45typedef u64 efi_physical_addr_t;
  46typedef void *efi_handle_t;
  47
  48typedef uuid_le efi_guid_t;
  49
  50#define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
  51        UUID_LE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
  52
  53/*
  54 * Generic EFI table header
  55 */
  56typedef struct {
  57        u64 signature;
  58        u32 revision;
  59        u32 headersize;
  60        u32 crc32;
  61        u32 reserved;
  62} efi_table_hdr_t;
  63
  64/*
  65 * Memory map descriptor:
  66 */
  67
  68/* Memory types: */
  69#define EFI_RESERVED_TYPE                0
  70#define EFI_LOADER_CODE                  1
  71#define EFI_LOADER_DATA                  2
  72#define EFI_BOOT_SERVICES_CODE           3
  73#define EFI_BOOT_SERVICES_DATA           4
  74#define EFI_RUNTIME_SERVICES_CODE        5
  75#define EFI_RUNTIME_SERVICES_DATA        6
  76#define EFI_CONVENTIONAL_MEMORY          7
  77#define EFI_UNUSABLE_MEMORY              8
  78#define EFI_ACPI_RECLAIM_MEMORY          9
  79#define EFI_ACPI_MEMORY_NVS             10
  80#define EFI_MEMORY_MAPPED_IO            11
  81#define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12
  82#define EFI_PAL_CODE                    13
  83#define EFI_PERSISTENT_MEMORY           14
  84#define EFI_MAX_MEMORY_TYPE             15
  85
  86/* Attribute values: */
  87#define EFI_MEMORY_UC           ((u64)0x0000000000000001ULL)    /* uncached */
  88#define EFI_MEMORY_WC           ((u64)0x0000000000000002ULL)    /* write-coalescing */
  89#define EFI_MEMORY_WT           ((u64)0x0000000000000004ULL)    /* write-through */
  90#define EFI_MEMORY_WB           ((u64)0x0000000000000008ULL)    /* write-back */
  91#define EFI_MEMORY_UCE          ((u64)0x0000000000000010ULL)    /* uncached, exported */
  92#define EFI_MEMORY_WP           ((u64)0x0000000000001000ULL)    /* write-protect */
  93#define EFI_MEMORY_RP           ((u64)0x0000000000002000ULL)    /* read-protect */
  94#define EFI_MEMORY_XP           ((u64)0x0000000000004000ULL)    /* execute-protect */
  95#define EFI_MEMORY_NV           ((u64)0x0000000000008000ULL)    /* non-volatile */
  96#define EFI_MEMORY_MORE_RELIABLE \
  97                                ((u64)0x0000000000010000ULL)    /* higher reliability */
  98#define EFI_MEMORY_RO           ((u64)0x0000000000020000ULL)    /* read-only */
  99#define EFI_MEMORY_RUNTIME      ((u64)0x8000000000000000ULL)    /* range requires runtime mapping */
 100#define EFI_MEMORY_DESCRIPTOR_VERSION   1
 101
 102#define EFI_PAGE_SHIFT          12
 103#define EFI_PAGE_SIZE           (1UL << EFI_PAGE_SHIFT)
 104
 105typedef struct {
 106        u32 type;
 107        u32 pad;
 108        u64 phys_addr;
 109        u64 virt_addr;
 110        u64 num_pages;
 111        u64 attribute;
 112} efi_memory_desc_t;
 113
 114typedef struct {
 115        efi_guid_t guid;
 116        u32 headersize;
 117        u32 flags;
 118        u32 imagesize;
 119} efi_capsule_header_t;
 120
 121struct efi_boot_memmap {
 122        efi_memory_desc_t       **map;
 123        unsigned long           *map_size;
 124        unsigned long           *desc_size;
 125        u32                     *desc_ver;
 126        unsigned long           *key_ptr;
 127        unsigned long           *buff_size;
 128};
 129
 130/*
 131 * EFI capsule flags
 132 */
 133#define EFI_CAPSULE_PERSIST_ACROSS_RESET        0x00010000
 134#define EFI_CAPSULE_POPULATE_SYSTEM_TABLE       0x00020000
 135#define EFI_CAPSULE_INITIATE_RESET              0x00040000
 136
 137/*
 138 * Allocation types for calls to boottime->allocate_pages.
 139 */
 140#define EFI_ALLOCATE_ANY_PAGES          0
 141#define EFI_ALLOCATE_MAX_ADDRESS        1
 142#define EFI_ALLOCATE_ADDRESS            2
 143#define EFI_MAX_ALLOCATE_TYPE           3
 144
 145typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
 146
 147/*
 148 * Types and defines for Time Services
 149 */
 150#define EFI_TIME_ADJUST_DAYLIGHT 0x1
 151#define EFI_TIME_IN_DAYLIGHT     0x2
 152#define EFI_UNSPECIFIED_TIMEZONE 0x07ff
 153
 154typedef struct {
 155        u16 year;
 156        u8 month;
 157        u8 day;
 158        u8 hour;
 159        u8 minute;
 160        u8 second;
 161        u8 pad1;
 162        u32 nanosecond;
 163        s16 timezone;
 164        u8 daylight;
 165        u8 pad2;
 166} efi_time_t;
 167
 168typedef struct {
 169        u32 resolution;
 170        u32 accuracy;
 171        u8 sets_to_zero;
 172} efi_time_cap_t;
 173
 174typedef struct {
 175        efi_table_hdr_t hdr;
 176        u32 raise_tpl;
 177        u32 restore_tpl;
 178        u32 allocate_pages;
 179        u32 free_pages;
 180        u32 get_memory_map;
 181        u32 allocate_pool;
 182        u32 free_pool;
 183        u32 create_event;
 184        u32 set_timer;
 185        u32 wait_for_event;
 186        u32 signal_event;
 187        u32 close_event;
 188        u32 check_event;
 189        u32 install_protocol_interface;
 190        u32 reinstall_protocol_interface;
 191        u32 uninstall_protocol_interface;
 192        u32 handle_protocol;
 193        u32 __reserved;
 194        u32 register_protocol_notify;
 195        u32 locate_handle;
 196        u32 locate_device_path;
 197        u32 install_configuration_table;
 198        u32 load_image;
 199        u32 start_image;
 200        u32 exit;
 201        u32 unload_image;
 202        u32 exit_boot_services;
 203        u32 get_next_monotonic_count;
 204        u32 stall;
 205        u32 set_watchdog_timer;
 206        u32 connect_controller;
 207        u32 disconnect_controller;
 208        u32 open_protocol;
 209        u32 close_protocol;
 210        u32 open_protocol_information;
 211        u32 protocols_per_handle;
 212        u32 locate_handle_buffer;
 213        u32 locate_protocol;
 214        u32 install_multiple_protocol_interfaces;
 215        u32 uninstall_multiple_protocol_interfaces;
 216        u32 calculate_crc32;
 217        u32 copy_mem;
 218        u32 set_mem;
 219        u32 create_event_ex;
 220} __packed efi_boot_services_32_t;
 221
 222typedef struct {
 223        efi_table_hdr_t hdr;
 224        u64 raise_tpl;
 225        u64 restore_tpl;
 226        u64 allocate_pages;
 227        u64 free_pages;
 228        u64 get_memory_map;
 229        u64 allocate_pool;
 230        u64 free_pool;
 231        u64 create_event;
 232        u64 set_timer;
 233        u64 wait_for_event;
 234        u64 signal_event;
 235        u64 close_event;
 236        u64 check_event;
 237        u64 install_protocol_interface;
 238        u64 reinstall_protocol_interface;
 239        u64 uninstall_protocol_interface;
 240        u64 handle_protocol;
 241        u64 __reserved;
 242        u64 register_protocol_notify;
 243        u64 locate_handle;
 244        u64 locate_device_path;
 245        u64 install_configuration_table;
 246        u64 load_image;
 247        u64 start_image;
 248        u64 exit;
 249        u64 unload_image;
 250        u64 exit_boot_services;
 251        u64 get_next_monotonic_count;
 252        u64 stall;
 253        u64 set_watchdog_timer;
 254        u64 connect_controller;
 255        u64 disconnect_controller;
 256        u64 open_protocol;
 257        u64 close_protocol;
 258        u64 open_protocol_information;
 259        u64 protocols_per_handle;
 260        u64 locate_handle_buffer;
 261        u64 locate_protocol;
 262        u64 install_multiple_protocol_interfaces;
 263        u64 uninstall_multiple_protocol_interfaces;
 264        u64 calculate_crc32;
 265        u64 copy_mem;
 266        u64 set_mem;
 267        u64 create_event_ex;
 268} __packed efi_boot_services_64_t;
 269
 270/*
 271 * EFI Boot Services table
 272 */
 273typedef struct {
 274        efi_table_hdr_t hdr;
 275        void *raise_tpl;
 276        void *restore_tpl;
 277        efi_status_t (*allocate_pages)(int, int, unsigned long,
 278                                       efi_physical_addr_t *);
 279        efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long);
 280        efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *,
 281                                       unsigned long *, u32 *);
 282        efi_status_t (*allocate_pool)(int, unsigned long, void **);
 283        efi_status_t (*free_pool)(void *);
 284        void *create_event;
 285        void *set_timer;
 286        void *wait_for_event;
 287        void *signal_event;
 288        void *close_event;
 289        void *check_event;
 290        void *install_protocol_interface;
 291        void *reinstall_protocol_interface;
 292        void *uninstall_protocol_interface;
 293        efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **);
 294        void *__reserved;
 295        void *register_protocol_notify;
 296        efi_status_t (*locate_handle)(int, efi_guid_t *, void *,
 297                                      unsigned long *, efi_handle_t *);
 298        void *locate_device_path;
 299        efi_status_t (*install_configuration_table)(efi_guid_t *, void *);
 300        void *load_image;
 301        void *start_image;
 302        void *exit;
 303        void *unload_image;
 304        efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long);
 305        void *get_next_monotonic_count;
 306        void *stall;
 307        void *set_watchdog_timer;
 308        void *connect_controller;
 309        void *disconnect_controller;
 310        void *open_protocol;
 311        void *close_protocol;
 312        void *open_protocol_information;
 313        void *protocols_per_handle;
 314        void *locate_handle_buffer;
 315        efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **);
 316        void *install_multiple_protocol_interfaces;
 317        void *uninstall_multiple_protocol_interfaces;
 318        void *calculate_crc32;
 319        void *copy_mem;
 320        void *set_mem;
 321        void *create_event_ex;
 322} efi_boot_services_t;
 323
 324typedef enum {
 325        EfiPciIoWidthUint8,
 326        EfiPciIoWidthUint16,
 327        EfiPciIoWidthUint32,
 328        EfiPciIoWidthUint64,
 329        EfiPciIoWidthFifoUint8,
 330        EfiPciIoWidthFifoUint16,
 331        EfiPciIoWidthFifoUint32,
 332        EfiPciIoWidthFifoUint64,
 333        EfiPciIoWidthFillUint8,
 334        EfiPciIoWidthFillUint16,
 335        EfiPciIoWidthFillUint32,
 336        EfiPciIoWidthFillUint64,
 337        EfiPciIoWidthMaximum
 338} EFI_PCI_IO_PROTOCOL_WIDTH;
 339
 340typedef enum {
 341        EfiPciIoAttributeOperationGet,
 342        EfiPciIoAttributeOperationSet,
 343        EfiPciIoAttributeOperationEnable,
 344        EfiPciIoAttributeOperationDisable,
 345        EfiPciIoAttributeOperationSupported,
 346    EfiPciIoAttributeOperationMaximum
 347} EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
 348
 349typedef struct {
 350        u32 read;
 351        u32 write;
 352} efi_pci_io_protocol_access_32_t;
 353
 354typedef struct {
 355        u64 read;
 356        u64 write;
 357} efi_pci_io_protocol_access_64_t;
 358
 359typedef struct {
 360        void *read;
 361        void *write;
 362} efi_pci_io_protocol_access_t;
 363
 364typedef struct {
 365        u32 poll_mem;
 366        u32 poll_io;
 367        efi_pci_io_protocol_access_32_t mem;
 368        efi_pci_io_protocol_access_32_t io;
 369        efi_pci_io_protocol_access_32_t pci;
 370        u32 copy_mem;
 371        u32 map;
 372        u32 unmap;
 373        u32 allocate_buffer;
 374        u32 free_buffer;
 375        u32 flush;
 376        u32 get_location;
 377        u32 attributes;
 378        u32 get_bar_attributes;
 379        u32 set_bar_attributes;
 380        uint64_t romsize;
 381        void *romimage;
 382} efi_pci_io_protocol_32;
 383
 384typedef struct {
 385        u64 poll_mem;
 386        u64 poll_io;
 387        efi_pci_io_protocol_access_64_t mem;
 388        efi_pci_io_protocol_access_64_t io;
 389        efi_pci_io_protocol_access_64_t pci;
 390        u64 copy_mem;
 391        u64 map;
 392        u64 unmap;
 393        u64 allocate_buffer;
 394        u64 free_buffer;
 395        u64 flush;
 396        u64 get_location;
 397        u64 attributes;
 398        u64 get_bar_attributes;
 399        u64 set_bar_attributes;
 400        uint64_t romsize;
 401        void *romimage;
 402} efi_pci_io_protocol_64;
 403
 404typedef struct {
 405        void *poll_mem;
 406        void *poll_io;
 407        efi_pci_io_protocol_access_t mem;
 408        efi_pci_io_protocol_access_t io;
 409        efi_pci_io_protocol_access_t pci;
 410        void *copy_mem;
 411        void *map;
 412        void *unmap;
 413        void *allocate_buffer;
 414        void *free_buffer;
 415        void *flush;
 416        void *get_location;
 417        void *attributes;
 418        void *get_bar_attributes;
 419        void *set_bar_attributes;
 420        uint64_t romsize;
 421        void *romimage;
 422} efi_pci_io_protocol;
 423
 424#define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
 425#define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
 426#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
 427#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
 428#define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
 429#define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
 430#define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
 431#define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
 432#define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
 433#define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
 434#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
 435#define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
 436#define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
 437#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
 438#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
 439#define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
 440#define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
 441#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
 442#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
 443
 444/*
 445 * Types and defines for EFI ResetSystem
 446 */
 447#define EFI_RESET_COLD 0
 448#define EFI_RESET_WARM 1
 449#define EFI_RESET_SHUTDOWN 2
 450
 451/*
 452 * EFI Runtime Services table
 453 */
 454#define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
 455#define EFI_RUNTIME_SERVICES_REVISION  0x00010000
 456
 457typedef struct {
 458        efi_table_hdr_t hdr;
 459        u32 get_time;
 460        u32 set_time;
 461        u32 get_wakeup_time;
 462        u32 set_wakeup_time;
 463        u32 set_virtual_address_map;
 464        u32 convert_pointer;
 465        u32 get_variable;
 466        u32 get_next_variable;
 467        u32 set_variable;
 468        u32 get_next_high_mono_count;
 469        u32 reset_system;
 470        u32 update_capsule;
 471        u32 query_capsule_caps;
 472        u32 query_variable_info;
 473} efi_runtime_services_32_t;
 474
 475typedef struct {
 476        efi_table_hdr_t hdr;
 477        u64 get_time;
 478        u64 set_time;
 479        u64 get_wakeup_time;
 480        u64 set_wakeup_time;
 481        u64 set_virtual_address_map;
 482        u64 convert_pointer;
 483        u64 get_variable;
 484        u64 get_next_variable;
 485        u64 set_variable;
 486        u64 get_next_high_mono_count;
 487        u64 reset_system;
 488        u64 update_capsule;
 489        u64 query_capsule_caps;
 490        u64 query_variable_info;
 491} efi_runtime_services_64_t;
 492
 493typedef struct {
 494        efi_table_hdr_t hdr;
 495        void *get_time;
 496        void *set_time;
 497        void *get_wakeup_time;
 498        void *set_wakeup_time;
 499        void *set_virtual_address_map;
 500        void *convert_pointer;
 501        void *get_variable;
 502        void *get_next_variable;
 503        void *set_variable;
 504        void *get_next_high_mono_count;
 505        void *reset_system;
 506        void *update_capsule;
 507        void *query_capsule_caps;
 508        void *query_variable_info;
 509} efi_runtime_services_t;
 510
 511typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc);
 512typedef efi_status_t efi_set_time_t (efi_time_t *tm);
 513typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending,
 514                                            efi_time_t *tm);
 515typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm);
 516typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,
 517                                         unsigned long *data_size, void *data);
 518typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name,
 519                                              efi_guid_t *vendor);
 520typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, 
 521                                         u32 attr, unsigned long data_size,
 522                                         void *data);
 523typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
 524typedef void efi_reset_system_t (int reset_type, efi_status_t status,
 525                                 unsigned long data_size, efi_char16_t *data);
 526typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
 527                                                unsigned long descriptor_size,
 528                                                u32 descriptor_version,
 529                                                efi_memory_desc_t *virtual_map);
 530typedef efi_status_t efi_query_variable_info_t(u32 attr,
 531                                               u64 *storage_space,
 532                                               u64 *remaining_space,
 533                                               u64 *max_variable_size);
 534typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules,
 535                                          unsigned long count,
 536                                          unsigned long sg_list);
 537typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
 538                                              unsigned long count,
 539                                              u64 *max_size,
 540                                              int *reset_type);
 541typedef efi_status_t efi_query_variable_store_t(u32 attributes,
 542                                                unsigned long size,
 543                                                bool nonblocking);
 544
 545void efi_native_runtime_setup(void);
 546
 547/*
 548 * EFI Configuration Table and GUID definitions
 549 *
 550 * These are all defined in a single line to make them easier to
 551 * grep for and to see them at a glance - while still having a
 552 * similar structure to the definitions in the spec.
 553 *
 554 * Here's how they are structured:
 555 *
 556 * GUID: 12345678-1234-1234-1234-123456789012
 557 * Spec:
 558 *      #define EFI_SOME_PROTOCOL_GUID \
 559 *        {0x12345678,0x1234,0x1234,\
 560 *          {0x12,0x34,0x12,0x34,0x56,0x78,0x90,0x12}}
 561 * Here:
 562 *      #define SOME_PROTOCOL_GUID              EFI_GUID(0x12345678, 0x1234, 0x1234,  0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12)
 563 *                                      ^ tabs                                      ^extra space
 564 *
 565 * Note that the 'extra space' separates the values at the same place
 566 * where the UEFI SPEC breaks the line.
 567 */
 568#define NULL_GUID                               EFI_GUID(0x00000000, 0x0000, 0x0000,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
 569#define MPS_TABLE_GUID                          EFI_GUID(0xeb9d2d2f, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 570#define ACPI_TABLE_GUID                         EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 571#define ACPI_20_TABLE_GUID                      EFI_GUID(0x8868e871, 0xe4f1, 0x11d3,  0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
 572#define SMBIOS_TABLE_GUID                       EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 573#define SMBIOS3_TABLE_GUID                      EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c,  0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94)
 574#define SAL_SYSTEM_TABLE_GUID                   EFI_GUID(0xeb9d2d32, 0x2d88, 0x11d3,  0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 575#define HCDP_TABLE_GUID                         EFI_GUID(0xf951938d, 0x620b, 0x42ef,  0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98)
 576#define UGA_IO_PROTOCOL_GUID                    EFI_GUID(0x61a4d49e, 0x6f68, 0x4f1b,  0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2)
 577#define EFI_GLOBAL_VARIABLE_GUID                EFI_GUID(0x8be4df61, 0x93ca, 0x11d2,  0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c)
 578#define UV_SYSTEM_TABLE_GUID                    EFI_GUID(0x3b13a7d4, 0x633e, 0x11dd,  0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93)
 579#define LINUX_EFI_CRASH_GUID                    EFI_GUID(0xcfc8fc79, 0xbe2e, 0x4ddc,  0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0)
 580#define LOADED_IMAGE_PROTOCOL_GUID              EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2,  0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 581#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID       EFI_GUID(0x9042a9de, 0x23dc, 0x4a38,  0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a)
 582#define EFI_UGA_PROTOCOL_GUID                   EFI_GUID(0x982c298b, 0xf4fa, 0x41cb,  0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39)
 583#define EFI_PCI_IO_PROTOCOL_GUID                EFI_GUID(0x4cf5b200, 0x68b8, 0x4ca5,  0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a)
 584#define EFI_FILE_INFO_ID                        EFI_GUID(0x09576e92, 0x6d3f, 0x11d2,  0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 585#define EFI_SYSTEM_RESOURCE_TABLE_GUID          EFI_GUID(0xb122a263, 0x3661, 0x4f68,  0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80)
 586#define EFI_FILE_SYSTEM_GUID                    EFI_GUID(0x964e5b22, 0x6459, 0x11d2,  0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
 587#define DEVICE_TREE_GUID                        EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5,  0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
 588#define EFI_PROPERTIES_TABLE_GUID               EFI_GUID(0x880aaca3, 0x4adc, 0x4a04,  0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5)
 589#define EFI_RNG_PROTOCOL_GUID                   EFI_GUID(0x3152bca5, 0xeade, 0x433d,  0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
 590#define EFI_MEMORY_ATTRIBUTES_TABLE_GUID        EFI_GUID(0xdcfa911d, 0x26eb, 0x469f,  0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
 591#define EFI_CONSOLE_OUT_DEVICE_GUID             EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4,  0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
 592
 593/*
 594 * This GUID is used to pass to the kernel proper the struct screen_info
 595 * structure that was populated by the stub based on the GOP protocol instance
 596 * associated with ConOut
 597 */
 598#define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID    EFI_GUID(0xe03fc20a, 0x85dc, 0x406e,  0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
 599#define LINUX_EFI_LOADER_ENTRY_GUID             EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf,  0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
 600
 601typedef struct {
 602        efi_guid_t guid;
 603        u64 table;
 604} efi_config_table_64_t;
 605
 606typedef struct {
 607        efi_guid_t guid;
 608        u32 table;
 609} efi_config_table_32_t;
 610
 611typedef struct {
 612        efi_guid_t guid;
 613        unsigned long table;
 614} efi_config_table_t;
 615
 616typedef struct {
 617        efi_guid_t guid;
 618        const char *name;
 619        unsigned long *ptr;
 620} efi_config_table_type_t;
 621
 622#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
 623
 624#define EFI_2_30_SYSTEM_TABLE_REVISION  ((2 << 16) | (30))
 625#define EFI_2_20_SYSTEM_TABLE_REVISION  ((2 << 16) | (20))
 626#define EFI_2_10_SYSTEM_TABLE_REVISION  ((2 << 16) | (10))
 627#define EFI_2_00_SYSTEM_TABLE_REVISION  ((2 << 16) | (00))
 628#define EFI_1_10_SYSTEM_TABLE_REVISION  ((1 << 16) | (10))
 629#define EFI_1_02_SYSTEM_TABLE_REVISION  ((1 << 16) | (02))
 630
 631typedef struct {
 632        efi_table_hdr_t hdr;
 633        u64 fw_vendor;  /* physical addr of CHAR16 vendor string */
 634        u32 fw_revision;
 635        u32 __pad1;
 636        u64 con_in_handle;
 637        u64 con_in;
 638        u64 con_out_handle;
 639        u64 con_out;
 640        u64 stderr_handle;
 641        u64 stderr;
 642        u64 runtime;
 643        u64 boottime;
 644        u32 nr_tables;
 645        u32 __pad2;
 646        u64 tables;
 647} efi_system_table_64_t;
 648
 649typedef struct {
 650        efi_table_hdr_t hdr;
 651        u32 fw_vendor;  /* physical addr of CHAR16 vendor string */
 652        u32 fw_revision;
 653        u32 con_in_handle;
 654        u32 con_in;
 655        u32 con_out_handle;
 656        u32 con_out;
 657        u32 stderr_handle;
 658        u32 stderr;
 659        u32 runtime;
 660        u32 boottime;
 661        u32 nr_tables;
 662        u32 tables;
 663} efi_system_table_32_t;
 664
 665typedef struct {
 666        efi_table_hdr_t hdr;
 667        unsigned long fw_vendor;        /* physical addr of CHAR16 vendor string */
 668        u32 fw_revision;
 669        unsigned long con_in_handle;
 670        unsigned long con_in;
 671        unsigned long con_out_handle;
 672        unsigned long con_out;
 673        unsigned long stderr_handle;
 674        unsigned long stderr;
 675        efi_runtime_services_t *runtime;
 676        efi_boot_services_t *boottime;
 677        unsigned long nr_tables;
 678        unsigned long tables;
 679} efi_system_table_t;
 680
 681struct efi_memory_map {
 682        phys_addr_t phys_map;
 683        void *map;
 684        void *map_end;
 685        int nr_map;
 686        unsigned long desc_version;
 687        unsigned long desc_size;
 688};
 689
 690struct efi_fdt_params {
 691        u64 system_table;
 692        u64 mmap;
 693        u32 mmap_size;
 694        u32 desc_size;
 695        u32 desc_ver;
 696};
 697
 698typedef struct {
 699        u32 revision;
 700        u32 parent_handle;
 701        u32 system_table;
 702        u32 device_handle;
 703        u32 file_path;
 704        u32 reserved;
 705        u32 load_options_size;
 706        u32 load_options;
 707        u32 image_base;
 708        __aligned_u64 image_size;
 709        unsigned int image_code_type;
 710        unsigned int image_data_type;
 711        unsigned long unload;
 712} efi_loaded_image_32_t;
 713
 714typedef struct {
 715        u32 revision;
 716        u64 parent_handle;
 717        u64 system_table;
 718        u64 device_handle;
 719        u64 file_path;
 720        u64 reserved;
 721        u32 load_options_size;
 722        u64 load_options;
 723        u64 image_base;
 724        __aligned_u64 image_size;
 725        unsigned int image_code_type;
 726        unsigned int image_data_type;
 727        unsigned long unload;
 728} efi_loaded_image_64_t;
 729
 730typedef struct {
 731        u32 revision;
 732        void *parent_handle;
 733        efi_system_table_t *system_table;
 734        void *device_handle;
 735        void *file_path;
 736        void *reserved;
 737        u32 load_options_size;
 738        void *load_options;
 739        void *image_base;
 740        __aligned_u64 image_size;
 741        unsigned int image_code_type;
 742        unsigned int image_data_type;
 743        unsigned long unload;
 744} efi_loaded_image_t;
 745
 746
 747typedef struct {
 748        u64 size;
 749        u64 file_size;
 750        u64 phys_size;
 751        efi_time_t create_time;
 752        efi_time_t last_access_time;
 753        efi_time_t modification_time;
 754        __aligned_u64 attribute;
 755        efi_char16_t filename[1];
 756} efi_file_info_t;
 757
 758typedef struct {
 759        u64 revision;
 760        u32 open;
 761        u32 close;
 762        u32 delete;
 763        u32 read;
 764        u32 write;
 765        u32 get_position;
 766        u32 set_position;
 767        u32 get_info;
 768        u32 set_info;
 769        u32 flush;
 770} efi_file_handle_32_t;
 771
 772typedef struct {
 773        u64 revision;
 774        u64 open;
 775        u64 close;
 776        u64 delete;
 777        u64 read;
 778        u64 write;
 779        u64 get_position;
 780        u64 set_position;
 781        u64 get_info;
 782        u64 set_info;
 783        u64 flush;
 784} efi_file_handle_64_t;
 785
 786typedef struct _efi_file_handle {
 787        u64 revision;
 788        efi_status_t (*open)(struct _efi_file_handle *,
 789                             struct _efi_file_handle **,
 790                             efi_char16_t *, u64, u64);
 791        efi_status_t (*close)(struct _efi_file_handle *);
 792        void *delete;
 793        efi_status_t (*read)(struct _efi_file_handle *, unsigned long *,
 794                             void *);
 795        void *write;
 796        void *get_position;
 797        void *set_position;
 798        efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *,
 799                        unsigned long *, void *);
 800        void *set_info;
 801        void *flush;
 802} efi_file_handle_t;
 803
 804typedef struct _efi_file_io_interface {
 805        u64 revision;
 806        int (*open_volume)(struct _efi_file_io_interface *,
 807                           efi_file_handle_t **);
 808} efi_file_io_interface_t;
 809
 810#define EFI_FILE_MODE_READ      0x0000000000000001
 811#define EFI_FILE_MODE_WRITE     0x0000000000000002
 812#define EFI_FILE_MODE_CREATE    0x8000000000000000
 813
 814typedef struct {
 815        u32 version;
 816        u32 length;
 817        u64 memory_protection_attribute;
 818} efi_properties_table_t;
 819
 820#define EFI_PROPERTIES_TABLE_VERSION    0x00010000
 821#define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA 0x1
 822
 823#define EFI_INVALID_TABLE_ADDR          (~0UL)
 824
 825typedef struct {
 826        u32 version;
 827        u32 num_entries;
 828        u32 desc_size;
 829        u32 reserved;
 830        efi_memory_desc_t entry[0];
 831} efi_memory_attributes_table_t;
 832
 833/*
 834 * All runtime access to EFI goes through this structure:
 835 */
 836extern struct efi {
 837        efi_system_table_t *systab;     /* EFI system table */
 838        unsigned int runtime_version;   /* Runtime services version */
 839        unsigned long mps;              /* MPS table */
 840        unsigned long acpi;             /* ACPI table  (IA64 ext 0.71) */
 841        unsigned long acpi20;           /* ACPI table  (ACPI 2.0) */
 842        unsigned long smbios;           /* SMBIOS table (32 bit entry point) */
 843        unsigned long smbios3;          /* SMBIOS table (64 bit entry point) */
 844        unsigned long sal_systab;       /* SAL system table */
 845        unsigned long boot_info;        /* boot info table */
 846        unsigned long hcdp;             /* HCDP table */
 847        unsigned long uga;              /* UGA table */
 848        unsigned long uv_systab;        /* UV system table */
 849        unsigned long fw_vendor;        /* fw_vendor */
 850        unsigned long runtime;          /* runtime table */
 851        unsigned long config_table;     /* config tables */
 852        unsigned long esrt;             /* ESRT table */
 853        unsigned long properties_table; /* properties table */
 854        unsigned long mem_attr_table;   /* memory attributes table */
 855        efi_get_time_t *get_time;
 856        efi_set_time_t *set_time;
 857        efi_get_wakeup_time_t *get_wakeup_time;
 858        efi_set_wakeup_time_t *set_wakeup_time;
 859        efi_get_variable_t *get_variable;
 860        efi_get_next_variable_t *get_next_variable;
 861        efi_set_variable_t *set_variable;
 862        efi_set_variable_t *set_variable_nonblocking;
 863        efi_query_variable_info_t *query_variable_info;
 864        efi_query_variable_info_t *query_variable_info_nonblocking;
 865        efi_update_capsule_t *update_capsule;
 866        efi_query_capsule_caps_t *query_capsule_caps;
 867        efi_get_next_high_mono_count_t *get_next_high_mono_count;
 868        efi_reset_system_t *reset_system;
 869        efi_set_virtual_address_map_t *set_virtual_address_map;
 870        struct efi_memory_map memmap;
 871        unsigned long flags;
 872} efi;
 873
 874static inline int
 875efi_guidcmp (efi_guid_t left, efi_guid_t right)
 876{
 877        return memcmp(&left, &right, sizeof (efi_guid_t));
 878}
 879
 880static inline char *
 881efi_guid_to_str(efi_guid_t *guid, char *out)
 882{
 883        sprintf(out, "%pUl", guid->b);
 884        return out;
 885}
 886
 887extern void efi_init (void);
 888extern void *efi_get_pal_addr (void);
 889extern void efi_map_pal_code (void);
 890extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
 891extern void efi_gettimeofday (struct timespec64 *ts);
 892extern void efi_enter_virtual_mode (void);      /* switch EFI to virtual mode, if possible */
 893#ifdef CONFIG_X86
 894extern void efi_late_init(void);
 895extern void efi_free_boot_services(void);
 896extern efi_status_t efi_query_variable_store(u32 attributes,
 897                                             unsigned long size,
 898                                             bool nonblocking);
 899extern void efi_find_mirror(void);
 900#else
 901static inline void efi_late_init(void) {}
 902static inline void efi_free_boot_services(void) {}
 903
 904static inline efi_status_t efi_query_variable_store(u32 attributes,
 905                                                    unsigned long size,
 906                                                    bool nonblocking)
 907{
 908        return EFI_SUCCESS;
 909}
 910#endif
 911extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
 912extern int efi_config_init(efi_config_table_type_t *arch_tables);
 913#ifdef CONFIG_EFI_ESRT
 914extern void __init efi_esrt_init(void);
 915#else
 916static inline void efi_esrt_init(void) { }
 917#endif
 918extern int efi_config_parse_tables(void *config_tables, int count, int sz,
 919                                   efi_config_table_type_t *arch_tables);
 920extern u64 efi_get_iobase (void);
 921extern u32 efi_mem_type (unsigned long phys_addr);
 922extern u64 efi_mem_attributes (unsigned long phys_addr);
 923extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
 924extern int __init efi_uart_console_only (void);
 925extern u64 efi_mem_desc_end(efi_memory_desc_t *md);
 926extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md);
 927extern void efi_initialize_iomem_resources(struct resource *code_resource,
 928                struct resource *data_resource, struct resource *bss_resource);
 929extern void efi_reserve_boot_services(void);
 930extern int efi_get_fdt_params(struct efi_fdt_params *params);
 931extern struct kobject *efi_kobj;
 932
 933extern int efi_reboot_quirk_mode;
 934extern bool efi_poweroff_required(void);
 935
 936#ifdef CONFIG_EFI_FAKE_MEMMAP
 937extern void __init efi_fake_memmap(void);
 938#else
 939static inline void efi_fake_memmap(void) { }
 940#endif
 941
 942/*
 943 * efi_memattr_perm_setter - arch specific callback function passed into
 944 *                           efi_memattr_apply_permissions() that updates the
 945 *                           mapping permissions described by the second
 946 *                           argument in the page tables referred to by the
 947 *                           first argument.
 948 */
 949typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *);
 950
 951extern int efi_memattr_init(void);
 952extern int efi_memattr_apply_permissions(struct mm_struct *mm,
 953                                         efi_memattr_perm_setter fn);
 954
 955/* Iterate through an efi_memory_map */
 956#define for_each_efi_memory_desc_in_map(m, md)                             \
 957        for ((md) = (m)->map;                                              \
 958             (md) && ((void *)(md) + (m)->desc_size) <= (m)->map_end;      \
 959             (md) = (void *)(md) + (m)->desc_size)
 960
 961/**
 962 * for_each_efi_memory_desc - iterate over descriptors in efi.memmap
 963 * @md: the efi_memory_desc_t * iterator
 964 *
 965 * Once the loop finishes @md must not be accessed.
 966 */
 967#define for_each_efi_memory_desc(md) \
 968        for_each_efi_memory_desc_in_map(&efi.memmap, md)
 969
 970/*
 971 * Format an EFI memory descriptor's type and attributes to a user-provided
 972 * character buffer, as per snprintf(), and return the buffer.
 973 */
 974char * __init efi_md_typeattr_format(char *buf, size_t size,
 975                                     const efi_memory_desc_t *md);
 976
 977/**
 978 * efi_range_is_wc - check the WC bit on an address range
 979 * @start: starting kvirt address
 980 * @len: length of range
 981 *
 982 * Consult the EFI memory map and make sure it's ok to set this range WC.
 983 * Returns true or false.
 984 */
 985static inline int efi_range_is_wc(unsigned long start, unsigned long len)
 986{
 987        unsigned long i;
 988
 989        for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) {
 990                unsigned long paddr = __pa(start + i);
 991                if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC))
 992                        return 0;
 993        }
 994        /* The range checked out */
 995        return 1;
 996}
 997
 998#ifdef CONFIG_EFI_PCDP
 999extern int __init efi_setup_pcdp_console(char *);
1000#endif
1001
1002/*
1003 * We play games with efi_enabled so that the compiler will, if
1004 * possible, remove EFI-related code altogether.
1005 */
1006#define EFI_BOOT                0       /* Were we booted from EFI? */
1007#define EFI_CONFIG_TABLES       2       /* Can we use EFI config tables? */
1008#define EFI_RUNTIME_SERVICES    3       /* Can we use runtime services? */
1009#define EFI_MEMMAP              4       /* Can we use EFI memory map? */
1010#define EFI_64BIT               5       /* Is the firmware 64-bit? */
1011#define EFI_PARAVIRT            6       /* Access is via a paravirt interface */
1012#define EFI_ARCH_1              7       /* First arch-specific bit */
1013#define EFI_DBG                 8       /* Print additional debug info at runtime */
1014#define EFI_NX_PE_DATA          9       /* Can runtime data regions be mapped non-executable? */
1015
1016#ifdef CONFIG_EFI
1017/*
1018 * Test whether the above EFI_* bits are enabled.
1019 */
1020static inline bool efi_enabled(int feature)
1021{
1022        return test_bit(feature, &efi.flags) != 0;
1023}
1024extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
1025#else
1026static inline bool efi_enabled(int feature)
1027{
1028        return false;
1029}
1030static inline void
1031efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
1032
1033static inline bool
1034efi_capsule_pending(int *reset_type)
1035{
1036        return false;
1037}
1038#endif
1039
1040extern int efi_status_to_err(efi_status_t status);
1041
1042/*
1043 * Variable Attributes
1044 */
1045#define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
1046#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
1047#define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
1048#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
1049#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
1050#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
1051#define EFI_VARIABLE_APPEND_WRITE       0x0000000000000040
1052
1053#define EFI_VARIABLE_MASK       (EFI_VARIABLE_NON_VOLATILE | \
1054                                EFI_VARIABLE_BOOTSERVICE_ACCESS | \
1055                                EFI_VARIABLE_RUNTIME_ACCESS | \
1056                                EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
1057                                EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
1058                                EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
1059                                EFI_VARIABLE_APPEND_WRITE)
1060/*
1061 * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
1062 * not including trailing NUL
1063 */
1064#define EFI_VARIABLE_GUID_LEN   UUID_STRING_LEN
1065
1066/*
1067 * The type of search to perform when calling boottime->locate_handle
1068 */
1069#define EFI_LOCATE_ALL_HANDLES                  0
1070#define EFI_LOCATE_BY_REGISTER_NOTIFY           1
1071#define EFI_LOCATE_BY_PROTOCOL                  2
1072
1073/*
1074 * EFI Device Path information
1075 */
1076#define EFI_DEV_HW                      0x01
1077#define  EFI_DEV_PCI                             1
1078#define  EFI_DEV_PCCARD                          2
1079#define  EFI_DEV_MEM_MAPPED                      3
1080#define  EFI_DEV_VENDOR                          4
1081#define  EFI_DEV_CONTROLLER                      5
1082#define EFI_DEV_ACPI                    0x02
1083#define   EFI_DEV_BASIC_ACPI                     1
1084#define   EFI_DEV_EXPANDED_ACPI                  2
1085#define EFI_DEV_MSG                     0x03
1086#define   EFI_DEV_MSG_ATAPI                      1
1087#define   EFI_DEV_MSG_SCSI                       2
1088#define   EFI_DEV_MSG_FC                         3
1089#define   EFI_DEV_MSG_1394                       4
1090#define   EFI_DEV_MSG_USB                        5
1091#define   EFI_DEV_MSG_USB_CLASS                 15
1092#define   EFI_DEV_MSG_I20                        6
1093#define   EFI_DEV_MSG_MAC                       11
1094#define   EFI_DEV_MSG_IPV4                      12
1095#define   EFI_DEV_MSG_IPV6                      13
1096#define   EFI_DEV_MSG_INFINIBAND                 9
1097#define   EFI_DEV_MSG_UART                      14
1098#define   EFI_DEV_MSG_VENDOR                    10
1099#define EFI_DEV_MEDIA                   0x04
1100#define   EFI_DEV_MEDIA_HARD_DRIVE               1
1101#define   EFI_DEV_MEDIA_CDROM                    2
1102#define   EFI_DEV_MEDIA_VENDOR                   3
1103#define   EFI_DEV_MEDIA_FILE                     4
1104#define   EFI_DEV_MEDIA_PROTOCOL                 5
1105#define EFI_DEV_BIOS_BOOT               0x05
1106#define EFI_DEV_END_PATH                0x7F
1107#define EFI_DEV_END_PATH2               0xFF
1108#define   EFI_DEV_END_INSTANCE                  0x01
1109#define   EFI_DEV_END_ENTIRE                    0xFF
1110
1111struct efi_generic_dev_path {
1112        u8 type;
1113        u8 sub_type;
1114        u16 length;
1115} __attribute ((packed));
1116
1117static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
1118{
1119        *npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
1120        *addr &= PAGE_MASK;
1121}
1122
1123/*
1124 * EFI Variable support.
1125 *
1126 * Different firmware drivers can expose their EFI-like variables using
1127 * the following.
1128 */
1129
1130struct efivar_operations {
1131        efi_get_variable_t *get_variable;
1132        efi_get_next_variable_t *get_next_variable;
1133        efi_set_variable_t *set_variable;
1134        efi_set_variable_t *set_variable_nonblocking;
1135        efi_query_variable_store_t *query_variable_store;
1136};
1137
1138struct efivars {
1139        /*
1140         * ->lock protects two things:
1141         * 1) efivarfs_list and efivars_sysfs_list
1142         * 2) ->ops calls
1143         */
1144        spinlock_t lock;
1145        struct kset *kset;
1146        struct kobject *kobject;
1147        const struct efivar_operations *ops;
1148};
1149
1150/*
1151 * The maximum size of VariableName + Data = 1024
1152 * Therefore, it's reasonable to save that much
1153 * space in each part of the structure,
1154 * and we use a page for reading/writing.
1155 */
1156
1157#define EFI_VAR_NAME_LEN        1024
1158
1159struct efi_variable {
1160        efi_char16_t  VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)];
1161        efi_guid_t    VendorGuid;
1162        unsigned long DataSize;
1163        __u8          Data[1024];
1164        efi_status_t  Status;
1165        __u32         Attributes;
1166} __attribute__((packed));
1167
1168struct efivar_entry {
1169        struct efi_variable var;
1170        struct list_head list;
1171        struct kobject kobj;
1172        bool scanning;
1173        bool deleting;
1174};
1175
1176struct efi_simple_text_output_protocol_32 {
1177        u32 reset;
1178        u32 output_string;
1179        u32 test_string;
1180};
1181
1182struct efi_simple_text_output_protocol_64 {
1183        u64 reset;
1184        u64 output_string;
1185        u64 test_string;
1186};
1187
1188struct efi_simple_text_output_protocol {
1189        void *reset;
1190        efi_status_t (*output_string)(void *, void *);
1191        void *test_string;
1192};
1193
1194#define PIXEL_RGB_RESERVED_8BIT_PER_COLOR               0
1195#define PIXEL_BGR_RESERVED_8BIT_PER_COLOR               1
1196#define PIXEL_BIT_MASK                                  2
1197#define PIXEL_BLT_ONLY                                  3
1198#define PIXEL_FORMAT_MAX                                4
1199
1200struct efi_pixel_bitmask {
1201        u32 red_mask;
1202        u32 green_mask;
1203        u32 blue_mask;
1204        u32 reserved_mask;
1205};
1206
1207struct efi_graphics_output_mode_info {
1208        u32 version;
1209        u32 horizontal_resolution;
1210        u32 vertical_resolution;
1211        int pixel_format;
1212        struct efi_pixel_bitmask pixel_information;
1213        u32 pixels_per_scan_line;
1214} __packed;
1215
1216struct efi_graphics_output_protocol_mode_32 {
1217        u32 max_mode;
1218        u32 mode;
1219        u32 info;
1220        u32 size_of_info;
1221        u64 frame_buffer_base;
1222        u32 frame_buffer_size;
1223} __packed;
1224
1225struct efi_graphics_output_protocol_mode_64 {
1226        u32 max_mode;
1227        u32 mode;
1228        u64 info;
1229        u64 size_of_info;
1230        u64 frame_buffer_base;
1231        u64 frame_buffer_size;
1232} __packed;
1233
1234struct efi_graphics_output_protocol_mode {
1235        u32 max_mode;
1236        u32 mode;
1237        unsigned long info;
1238        unsigned long size_of_info;
1239        u64 frame_buffer_base;
1240        unsigned long frame_buffer_size;
1241} __packed;
1242
1243struct efi_graphics_output_protocol_32 {
1244        u32 query_mode;
1245        u32 set_mode;
1246        u32 blt;
1247        u32 mode;
1248};
1249
1250struct efi_graphics_output_protocol_64 {
1251        u64 query_mode;
1252        u64 set_mode;
1253        u64 blt;
1254        u64 mode;
1255};
1256
1257struct efi_graphics_output_protocol {
1258        unsigned long query_mode;
1259        unsigned long set_mode;
1260        unsigned long blt;
1261        struct efi_graphics_output_protocol_mode *mode;
1262};
1263
1264typedef efi_status_t (*efi_graphics_output_protocol_query_mode)(
1265        struct efi_graphics_output_protocol *, u32, unsigned long *,
1266        struct efi_graphics_output_mode_info **);
1267
1268extern struct list_head efivar_sysfs_list;
1269
1270static inline void
1271efivar_unregister(struct efivar_entry *var)
1272{
1273        kobject_put(&var->kobj);
1274}
1275
1276int efivars_register(struct efivars *efivars,
1277                     const struct efivar_operations *ops,
1278                     struct kobject *kobject);
1279int efivars_unregister(struct efivars *efivars);
1280struct kobject *efivars_kobject(void);
1281
1282int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
1283                void *data, bool duplicates, struct list_head *head);
1284
1285void efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
1286void efivar_entry_remove(struct efivar_entry *entry);
1287
1288int __efivar_entry_delete(struct efivar_entry *entry);
1289int efivar_entry_delete(struct efivar_entry *entry);
1290
1291int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
1292int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1293                       unsigned long *size, void *data);
1294int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
1295                     unsigned long *size, void *data);
1296int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
1297                     unsigned long size, void *data, struct list_head *head);
1298int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
1299                              unsigned long *size, void *data, bool *set);
1300int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
1301                          bool block, unsigned long size, void *data);
1302
1303void efivar_entry_iter_begin(void);
1304void efivar_entry_iter_end(void);
1305
1306int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1307                        struct list_head *head, void *data,
1308                        struct efivar_entry **prev);
1309int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
1310                      struct list_head *head, void *data);
1311
1312struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
1313                                       struct list_head *head, bool remove);
1314
1315bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
1316                     unsigned long data_size);
1317bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
1318                                  size_t len);
1319
1320extern struct work_struct efivar_work;
1321void efivar_run_worker(void);
1322
1323#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
1324int efivars_sysfs_init(void);
1325
1326#define EFIVARS_DATA_SIZE_MAX 1024
1327
1328#endif /* CONFIG_EFI_VARS */
1329extern bool efi_capsule_pending(int *reset_type);
1330
1331extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
1332                                 size_t size, int *reset);
1333
1334extern int efi_capsule_update(efi_capsule_header_t *capsule,
1335                              struct page **pages);
1336
1337#ifdef CONFIG_EFI_RUNTIME_MAP
1338int efi_runtime_map_init(struct kobject *);
1339void efi_runtime_map_setup(void *, int, u32);
1340int efi_get_runtime_map_size(void);
1341int efi_get_runtime_map_desc_size(void);
1342int efi_runtime_map_copy(void *buf, size_t bufsz);
1343#else
1344static inline int efi_runtime_map_init(struct kobject *kobj)
1345{
1346        return 0;
1347}
1348
1349static inline void
1350efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size) {}
1351
1352static inline int efi_get_runtime_map_size(void)
1353{
1354        return 0;
1355}
1356
1357static inline int efi_get_runtime_map_desc_size(void)
1358{
1359        return 0;
1360}
1361
1362static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
1363{
1364        return 0;
1365}
1366
1367#endif
1368
1369/* prototypes shared between arch specific and generic stub code */
1370
1371#define pr_efi(sys_table, msg)     efi_printk(sys_table, "EFI stub: "msg)
1372#define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg)
1373
1374void efi_printk(efi_system_table_t *sys_table_arg, char *str);
1375
1376void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
1377              unsigned long addr);
1378
1379char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,
1380                          efi_loaded_image_t *image, int *cmd_line_len);
1381
1382efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
1383                                struct efi_boot_memmap *map);
1384
1385efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
1386                           unsigned long size, unsigned long align,
1387                           unsigned long *addr);
1388
1389efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
1390                            unsigned long size, unsigned long align,
1391                            unsigned long *addr, unsigned long max);
1392
1393efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
1394                                 unsigned long *image_addr,
1395                                 unsigned long image_size,
1396                                 unsigned long alloc_size,
1397                                 unsigned long preferred_addr,
1398                                 unsigned long alignment);
1399
1400efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
1401                                  efi_loaded_image_t *image,
1402                                  char *cmd_line, char *option_string,
1403                                  unsigned long max_addr,
1404                                  unsigned long *load_addr,
1405                                  unsigned long *load_size);
1406
1407efi_status_t efi_parse_options(char *cmdline);
1408
1409efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg,
1410                           struct screen_info *si, efi_guid_t *proto,
1411                           unsigned long size);
1412
1413bool efi_runtime_disabled(void);
1414extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
1415
1416/*
1417 * Arch code can implement the following three template macros, avoiding
1418 * reptition for the void/non-void return cases of {__,}efi_call_virt():
1419 *
1420 *  * arch_efi_call_virt_setup()
1421 *
1422 *    Sets up the environment for the call (e.g. switching page tables,
1423 *    allowing kernel-mode use of floating point, if required).
1424 *
1425 *  * arch_efi_call_virt()
1426 *
1427 *    Performs the call. The last expression in the macro must be the call
1428 *    itself, allowing the logic to be shared by the void and non-void
1429 *    cases.
1430 *
1431 *  * arch_efi_call_virt_teardown()
1432 *
1433 *    Restores the usual kernel environment once the call has returned.
1434 */
1435
1436#define efi_call_virt_pointer(p, f, args...)                            \
1437({                                                                      \
1438        efi_status_t __s;                                               \
1439        unsigned long __flags;                                          \
1440                                                                        \
1441        arch_efi_call_virt_setup();                                     \
1442                                                                        \
1443        local_save_flags(__flags);                                      \
1444        __s = arch_efi_call_virt(p, f, args);                           \
1445        efi_call_virt_check_flags(__flags, __stringify(f));             \
1446                                                                        \
1447        arch_efi_call_virt_teardown();                                  \
1448                                                                        \
1449        __s;                                                            \
1450})
1451
1452#define __efi_call_virt_pointer(p, f, args...)                          \
1453({                                                                      \
1454        unsigned long __flags;                                          \
1455                                                                        \
1456        arch_efi_call_virt_setup();                                     \
1457                                                                        \
1458        local_save_flags(__flags);                                      \
1459        arch_efi_call_virt(p, f, args);                                 \
1460        efi_call_virt_check_flags(__flags, __stringify(f));             \
1461                                                                        \
1462        arch_efi_call_virt_teardown();                                  \
1463})
1464
1465typedef efi_status_t (*efi_exit_boot_map_processing)(
1466        efi_system_table_t *sys_table_arg,
1467        struct efi_boot_memmap *map,
1468        void *priv);
1469
1470efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table,
1471                                    void *handle,
1472                                    struct efi_boot_memmap *map,
1473                                    void *priv,
1474                                    efi_exit_boot_map_processing priv_func);
1475#endif /* _LINUX_EFI_H */
1476