11da177e4SLinus Torvalds #ifndef _LINUX_EFI_H 21da177e4SLinus Torvalds #define _LINUX_EFI_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds /* 51da177e4SLinus Torvalds * Extensible Firmware Interface 61da177e4SLinus Torvalds * Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * Copyright (C) 1999 VA Linux Systems 91da177e4SLinus Torvalds * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> 101da177e4SLinus Torvalds * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co. 111da177e4SLinus Torvalds * David Mosberger-Tang <davidm@hpl.hp.com> 121da177e4SLinus Torvalds * Stephane Eranian <eranian@hpl.hp.com> 131da177e4SLinus Torvalds */ 141da177e4SLinus Torvalds #include <linux/init.h> 151da177e4SLinus Torvalds #include <linux/string.h> 161da177e4SLinus Torvalds #include <linux/time.h> 171da177e4SLinus Torvalds #include <linux/types.h> 181da177e4SLinus Torvalds #include <linux/proc_fs.h> 191da177e4SLinus Torvalds #include <linux/rtc.h> 201da177e4SLinus Torvalds #include <linux/ioport.h> 214a3575fdSHuang, Ying #include <linux/pfn.h> 225ee9c198SMatthew Garrett #include <linux/pstore.h> 2360863c0dSMatt Fleming #include <linux/range.h> 248562c99cSMatt Fleming #include <linux/reboot.h> 25ba7e34b1SAndy Shevchenko #include <linux/uuid.h> 262c23b73cSArd Biesheuvel #include <linux/screen_info.h> 271da177e4SLinus Torvalds 281da177e4SLinus Torvalds #include <asm/page.h> 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds #define EFI_SUCCESS 0 311da177e4SLinus Torvalds #define EFI_LOAD_ERROR ( 1 | (1UL << (BITS_PER_LONG-1))) 321da177e4SLinus Torvalds #define EFI_INVALID_PARAMETER ( 2 | (1UL << (BITS_PER_LONG-1))) 331da177e4SLinus Torvalds #define EFI_UNSUPPORTED ( 3 | (1UL << (BITS_PER_LONG-1))) 341da177e4SLinus Torvalds #define EFI_BAD_BUFFER_SIZE ( 4 | (1UL << (BITS_PER_LONG-1))) 351da177e4SLinus Torvalds #define EFI_BUFFER_TOO_SMALL ( 5 | (1UL << (BITS_PER_LONG-1))) 365d9db883SMatthew Garrett #define EFI_NOT_READY ( 6 | (1UL << (BITS_PER_LONG-1))) 375d9db883SMatthew Garrett #define EFI_DEVICE_ERROR ( 7 | (1UL << (BITS_PER_LONG-1))) 385d9db883SMatthew Garrett #define EFI_WRITE_PROTECTED ( 8 | (1UL << (BITS_PER_LONG-1))) 395d9db883SMatthew Garrett #define EFI_OUT_OF_RESOURCES ( 9 | (1UL << (BITS_PER_LONG-1))) 401da177e4SLinus Torvalds #define EFI_NOT_FOUND (14 | (1UL << (BITS_PER_LONG-1))) 41dce48e35SArd Biesheuvel #define EFI_ABORTED (21 | (1UL << (BITS_PER_LONG-1))) 425d9db883SMatthew Garrett #define EFI_SECURITY_VIOLATION (26 | (1UL << (BITS_PER_LONG-1))) 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds typedef unsigned long efi_status_t; 451da177e4SLinus Torvalds typedef u8 efi_bool_t; 461da177e4SLinus Torvalds typedef u16 efi_char16_t; /* UNICODE character */ 47ed37ddffSRoy Franz typedef u64 efi_physical_addr_t; 48ed37ddffSRoy Franz typedef void *efi_handle_t; 491da177e4SLinus Torvalds 50ba7e34b1SAndy Shevchenko typedef uuid_le efi_guid_t; 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \ 53ba7e34b1SAndy Shevchenko UUID_LE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds /* 561da177e4SLinus Torvalds * Generic EFI table header 571da177e4SLinus Torvalds */ 581da177e4SLinus Torvalds typedef struct { 591da177e4SLinus Torvalds u64 signature; 601da177e4SLinus Torvalds u32 revision; 611da177e4SLinus Torvalds u32 headersize; 621da177e4SLinus Torvalds u32 crc32; 631da177e4SLinus Torvalds u32 reserved; 641da177e4SLinus Torvalds } efi_table_hdr_t; 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds /* 671da177e4SLinus Torvalds * Memory map descriptor: 681da177e4SLinus Torvalds */ 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds /* Memory types: */ 711da177e4SLinus Torvalds #define EFI_RESERVED_TYPE 0 721da177e4SLinus Torvalds #define EFI_LOADER_CODE 1 731da177e4SLinus Torvalds #define EFI_LOADER_DATA 2 741da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_CODE 3 751da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_DATA 4 761da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_CODE 5 771da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_DATA 6 781da177e4SLinus Torvalds #define EFI_CONVENTIONAL_MEMORY 7 791da177e4SLinus Torvalds #define EFI_UNUSABLE_MEMORY 8 801da177e4SLinus Torvalds #define EFI_ACPI_RECLAIM_MEMORY 9 811da177e4SLinus Torvalds #define EFI_ACPI_MEMORY_NVS 10 821da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO 11 831da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 841da177e4SLinus Torvalds #define EFI_PAL_CODE 13 85ad5fb870SDan Williams #define EFI_PERSISTENT_MEMORY 14 86ad5fb870SDan Williams #define EFI_MAX_MEMORY_TYPE 15 871da177e4SLinus Torvalds 881da177e4SLinus Torvalds /* Attribute values: */ 891da177e4SLinus Torvalds #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */ 901da177e4SLinus Torvalds #define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */ 911da177e4SLinus Torvalds #define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */ 921da177e4SLinus Torvalds #define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */ 939c97e0bdSLaszlo Ersek #define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL) /* uncached, exported */ 941da177e4SLinus Torvalds #define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */ 951da177e4SLinus Torvalds #define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */ 961da177e4SLinus Torvalds #define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */ 97c016ca08SRobert Elliott #define EFI_MEMORY_NV ((u64)0x0000000000008000ULL) /* non-volatile */ 98b05b9f5fSTony Luck #define EFI_MEMORY_MORE_RELIABLE \ 99b05b9f5fSTony Luck ((u64)0x0000000000010000ULL) /* higher reliability */ 10087db73aeSArd Biesheuvel #define EFI_MEMORY_RO ((u64)0x0000000000020000ULL) /* read-only */ 1011da177e4SLinus Torvalds #define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */ 1021da177e4SLinus Torvalds #define EFI_MEMORY_DESCRIPTOR_VERSION 1 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds #define EFI_PAGE_SHIFT 12 105ed37ddffSRoy Franz #define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) 1060100a3e6SPeter Jones #define EFI_PAGES_MAX (U64_MAX >> EFI_PAGE_SHIFT) 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds typedef struct { 1091da177e4SLinus Torvalds u32 type; 1101da177e4SLinus Torvalds u32 pad; 1111da177e4SLinus Torvalds u64 phys_addr; 1121da177e4SLinus Torvalds u64 virt_addr; 1131da177e4SLinus Torvalds u64 num_pages; 1141da177e4SLinus Torvalds u64 attribute; 1151da177e4SLinus Torvalds } efi_memory_desc_t; 1161da177e4SLinus Torvalds 1173b370237SMatthew Garrett typedef struct { 1183b370237SMatthew Garrett efi_guid_t guid; 1193b370237SMatthew Garrett u32 headersize; 1203b370237SMatthew Garrett u32 flags; 1213b370237SMatthew Garrett u32 imagesize; 1223b370237SMatthew Garrett } efi_capsule_header_t; 1233b370237SMatthew Garrett 124dadb57abSJeffrey Hugo struct efi_boot_memmap { 125dadb57abSJeffrey Hugo efi_memory_desc_t **map; 126dadb57abSJeffrey Hugo unsigned long *map_size; 127dadb57abSJeffrey Hugo unsigned long *desc_size; 128dadb57abSJeffrey Hugo u32 *desc_ver; 129dadb57abSJeffrey Hugo unsigned long *key_ptr; 130dadb57abSJeffrey Hugo unsigned long *buff_size; 131dadb57abSJeffrey Hugo }; 132dadb57abSJeffrey Hugo 133bb05e4baSMatt Fleming /* 134f0133f3cSMatt Fleming * EFI capsule flags 135f0133f3cSMatt Fleming */ 136f0133f3cSMatt Fleming #define EFI_CAPSULE_PERSIST_ACROSS_RESET 0x00010000 137f0133f3cSMatt Fleming #define EFI_CAPSULE_POPULATE_SYSTEM_TABLE 0x00020000 138f0133f3cSMatt Fleming #define EFI_CAPSULE_INITIATE_RESET 0x00040000 139f0133f3cSMatt Fleming 140f0133f3cSMatt Fleming /* 141bb05e4baSMatt Fleming * Allocation types for calls to boottime->allocate_pages. 142bb05e4baSMatt Fleming */ 143bb05e4baSMatt Fleming #define EFI_ALLOCATE_ANY_PAGES 0 144bb05e4baSMatt Fleming #define EFI_ALLOCATE_MAX_ADDRESS 1 145bb05e4baSMatt Fleming #define EFI_ALLOCATE_ADDRESS 2 146bb05e4baSMatt Fleming #define EFI_MAX_ALLOCATE_TYPE 3 147bb05e4baSMatt Fleming 148e088a4adSMatthew Wilcox typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg); 1491da177e4SLinus Torvalds 1501da177e4SLinus Torvalds /* 1511da177e4SLinus Torvalds * Types and defines for Time Services 1521da177e4SLinus Torvalds */ 1531da177e4SLinus Torvalds #define EFI_TIME_ADJUST_DAYLIGHT 0x1 1541da177e4SLinus Torvalds #define EFI_TIME_IN_DAYLIGHT 0x2 1551da177e4SLinus Torvalds #define EFI_UNSPECIFIED_TIMEZONE 0x07ff 1561da177e4SLinus Torvalds 1571da177e4SLinus Torvalds typedef struct { 1581da177e4SLinus Torvalds u16 year; 1591da177e4SLinus Torvalds u8 month; 1601da177e4SLinus Torvalds u8 day; 1611da177e4SLinus Torvalds u8 hour; 1621da177e4SLinus Torvalds u8 minute; 1631da177e4SLinus Torvalds u8 second; 1641da177e4SLinus Torvalds u8 pad1; 1651da177e4SLinus Torvalds u32 nanosecond; 1661da177e4SLinus Torvalds s16 timezone; 1671da177e4SLinus Torvalds u8 daylight; 1681da177e4SLinus Torvalds u8 pad2; 1691da177e4SLinus Torvalds } efi_time_t; 1701da177e4SLinus Torvalds 1711da177e4SLinus Torvalds typedef struct { 1721da177e4SLinus Torvalds u32 resolution; 1731da177e4SLinus Torvalds u32 accuracy; 1741da177e4SLinus Torvalds u8 sets_to_zero; 1751da177e4SLinus Torvalds } efi_time_cap_t; 1761da177e4SLinus Torvalds 177677703ceSMatt Fleming typedef struct { 178677703ceSMatt Fleming efi_table_hdr_t hdr; 179677703ceSMatt Fleming u32 raise_tpl; 180677703ceSMatt Fleming u32 restore_tpl; 181677703ceSMatt Fleming u32 allocate_pages; 182677703ceSMatt Fleming u32 free_pages; 183677703ceSMatt Fleming u32 get_memory_map; 184677703ceSMatt Fleming u32 allocate_pool; 185677703ceSMatt Fleming u32 free_pool; 186677703ceSMatt Fleming u32 create_event; 187677703ceSMatt Fleming u32 set_timer; 188677703ceSMatt Fleming u32 wait_for_event; 189677703ceSMatt Fleming u32 signal_event; 190677703ceSMatt Fleming u32 close_event; 191677703ceSMatt Fleming u32 check_event; 192677703ceSMatt Fleming u32 install_protocol_interface; 193677703ceSMatt Fleming u32 reinstall_protocol_interface; 194677703ceSMatt Fleming u32 uninstall_protocol_interface; 195677703ceSMatt Fleming u32 handle_protocol; 196677703ceSMatt Fleming u32 __reserved; 197677703ceSMatt Fleming u32 register_protocol_notify; 198677703ceSMatt Fleming u32 locate_handle; 199677703ceSMatt Fleming u32 locate_device_path; 200677703ceSMatt Fleming u32 install_configuration_table; 201677703ceSMatt Fleming u32 load_image; 202677703ceSMatt Fleming u32 start_image; 203677703ceSMatt Fleming u32 exit; 204677703ceSMatt Fleming u32 unload_image; 205677703ceSMatt Fleming u32 exit_boot_services; 206677703ceSMatt Fleming u32 get_next_monotonic_count; 207677703ceSMatt Fleming u32 stall; 208677703ceSMatt Fleming u32 set_watchdog_timer; 209677703ceSMatt Fleming u32 connect_controller; 210677703ceSMatt Fleming u32 disconnect_controller; 211677703ceSMatt Fleming u32 open_protocol; 212677703ceSMatt Fleming u32 close_protocol; 213677703ceSMatt Fleming u32 open_protocol_information; 214677703ceSMatt Fleming u32 protocols_per_handle; 215677703ceSMatt Fleming u32 locate_handle_buffer; 216677703ceSMatt Fleming u32 locate_protocol; 217677703ceSMatt Fleming u32 install_multiple_protocol_interfaces; 218677703ceSMatt Fleming u32 uninstall_multiple_protocol_interfaces; 219677703ceSMatt Fleming u32 calculate_crc32; 220677703ceSMatt Fleming u32 copy_mem; 221677703ceSMatt Fleming u32 set_mem; 222677703ceSMatt Fleming u32 create_event_ex; 223677703ceSMatt Fleming } __packed efi_boot_services_32_t; 224677703ceSMatt Fleming 225677703ceSMatt Fleming typedef struct { 226677703ceSMatt Fleming efi_table_hdr_t hdr; 227677703ceSMatt Fleming u64 raise_tpl; 228677703ceSMatt Fleming u64 restore_tpl; 229677703ceSMatt Fleming u64 allocate_pages; 230677703ceSMatt Fleming u64 free_pages; 231677703ceSMatt Fleming u64 get_memory_map; 232677703ceSMatt Fleming u64 allocate_pool; 233677703ceSMatt Fleming u64 free_pool; 234677703ceSMatt Fleming u64 create_event; 235677703ceSMatt Fleming u64 set_timer; 236677703ceSMatt Fleming u64 wait_for_event; 237677703ceSMatt Fleming u64 signal_event; 238677703ceSMatt Fleming u64 close_event; 239677703ceSMatt Fleming u64 check_event; 240677703ceSMatt Fleming u64 install_protocol_interface; 241677703ceSMatt Fleming u64 reinstall_protocol_interface; 242677703ceSMatt Fleming u64 uninstall_protocol_interface; 243677703ceSMatt Fleming u64 handle_protocol; 244677703ceSMatt Fleming u64 __reserved; 245677703ceSMatt Fleming u64 register_protocol_notify; 246677703ceSMatt Fleming u64 locate_handle; 247677703ceSMatt Fleming u64 locate_device_path; 248677703ceSMatt Fleming u64 install_configuration_table; 249677703ceSMatt Fleming u64 load_image; 250677703ceSMatt Fleming u64 start_image; 251677703ceSMatt Fleming u64 exit; 252677703ceSMatt Fleming u64 unload_image; 253677703ceSMatt Fleming u64 exit_boot_services; 254677703ceSMatt Fleming u64 get_next_monotonic_count; 255677703ceSMatt Fleming u64 stall; 256677703ceSMatt Fleming u64 set_watchdog_timer; 257677703ceSMatt Fleming u64 connect_controller; 258677703ceSMatt Fleming u64 disconnect_controller; 259677703ceSMatt Fleming u64 open_protocol; 260677703ceSMatt Fleming u64 close_protocol; 261677703ceSMatt Fleming u64 open_protocol_information; 262677703ceSMatt Fleming u64 protocols_per_handle; 263677703ceSMatt Fleming u64 locate_handle_buffer; 264677703ceSMatt Fleming u64 locate_protocol; 265677703ceSMatt Fleming u64 install_multiple_protocol_interfaces; 266677703ceSMatt Fleming u64 uninstall_multiple_protocol_interfaces; 267677703ceSMatt Fleming u64 calculate_crc32; 268677703ceSMatt Fleming u64 copy_mem; 269677703ceSMatt Fleming u64 set_mem; 270677703ceSMatt Fleming u64 create_event_ex; 271677703ceSMatt Fleming } __packed efi_boot_services_64_t; 272677703ceSMatt Fleming 2731da177e4SLinus Torvalds /* 274f30ca6baSMatt Fleming * EFI Boot Services table 275f30ca6baSMatt Fleming */ 276f30ca6baSMatt Fleming typedef struct { 277f30ca6baSMatt Fleming efi_table_hdr_t hdr; 278f30ca6baSMatt Fleming void *raise_tpl; 279f30ca6baSMatt Fleming void *restore_tpl; 280ed37ddffSRoy Franz efi_status_t (*allocate_pages)(int, int, unsigned long, 281ed37ddffSRoy Franz efi_physical_addr_t *); 282ed37ddffSRoy Franz efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long); 283ed37ddffSRoy Franz efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *, 284ed37ddffSRoy Franz unsigned long *, u32 *); 285ed37ddffSRoy Franz efi_status_t (*allocate_pool)(int, unsigned long, void **); 286ed37ddffSRoy Franz efi_status_t (*free_pool)(void *); 287f30ca6baSMatt Fleming void *create_event; 288f30ca6baSMatt Fleming void *set_timer; 289f30ca6baSMatt Fleming void *wait_for_event; 290f30ca6baSMatt Fleming void *signal_event; 291f30ca6baSMatt Fleming void *close_event; 292f30ca6baSMatt Fleming void *check_event; 293f30ca6baSMatt Fleming void *install_protocol_interface; 294f30ca6baSMatt Fleming void *reinstall_protocol_interface; 295f30ca6baSMatt Fleming void *uninstall_protocol_interface; 296ed37ddffSRoy Franz efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **); 297f30ca6baSMatt Fleming void *__reserved; 298f30ca6baSMatt Fleming void *register_protocol_notify; 299fc372064SArd Biesheuvel efi_status_t (*locate_handle)(int, efi_guid_t *, void *, 300fc372064SArd Biesheuvel unsigned long *, efi_handle_t *); 301f30ca6baSMatt Fleming void *locate_device_path; 302801820beSArd Biesheuvel efi_status_t (*install_configuration_table)(efi_guid_t *, void *); 303f30ca6baSMatt Fleming void *load_image; 304f30ca6baSMatt Fleming void *start_image; 305f30ca6baSMatt Fleming void *exit; 306f30ca6baSMatt Fleming void *unload_image; 307ed37ddffSRoy Franz efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long); 308f30ca6baSMatt Fleming void *get_next_monotonic_count; 309f30ca6baSMatt Fleming void *stall; 310f30ca6baSMatt Fleming void *set_watchdog_timer; 311f30ca6baSMatt Fleming void *connect_controller; 312f30ca6baSMatt Fleming void *disconnect_controller; 313f30ca6baSMatt Fleming void *open_protocol; 314f30ca6baSMatt Fleming void *close_protocol; 315f30ca6baSMatt Fleming void *open_protocol_information; 316f30ca6baSMatt Fleming void *protocols_per_handle; 317f30ca6baSMatt Fleming void *locate_handle_buffer; 318e4fbf476SArd Biesheuvel efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **); 319f30ca6baSMatt Fleming void *install_multiple_protocol_interfaces; 320f30ca6baSMatt Fleming void *uninstall_multiple_protocol_interfaces; 321f30ca6baSMatt Fleming void *calculate_crc32; 322f30ca6baSMatt Fleming void *copy_mem; 323f30ca6baSMatt Fleming void *set_mem; 324f30ca6baSMatt Fleming void *create_event_ex; 325f30ca6baSMatt Fleming } efi_boot_services_t; 326f30ca6baSMatt Fleming 327dd5fc854SMatthew Garrett typedef enum { 328dd5fc854SMatthew Garrett EfiPciIoWidthUint8, 329dd5fc854SMatthew Garrett EfiPciIoWidthUint16, 330dd5fc854SMatthew Garrett EfiPciIoWidthUint32, 331dd5fc854SMatthew Garrett EfiPciIoWidthUint64, 332dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint8, 333dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint16, 334dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint32, 335dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint64, 336dd5fc854SMatthew Garrett EfiPciIoWidthFillUint8, 337dd5fc854SMatthew Garrett EfiPciIoWidthFillUint16, 338dd5fc854SMatthew Garrett EfiPciIoWidthFillUint32, 339dd5fc854SMatthew Garrett EfiPciIoWidthFillUint64, 340dd5fc854SMatthew Garrett EfiPciIoWidthMaximum 341dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_WIDTH; 342dd5fc854SMatthew Garrett 343dd5fc854SMatthew Garrett typedef enum { 344dd5fc854SMatthew Garrett EfiPciIoAttributeOperationGet, 345dd5fc854SMatthew Garrett EfiPciIoAttributeOperationSet, 346dd5fc854SMatthew Garrett EfiPciIoAttributeOperationEnable, 347dd5fc854SMatthew Garrett EfiPciIoAttributeOperationDisable, 348dd5fc854SMatthew Garrett EfiPciIoAttributeOperationSupported, 349dd5fc854SMatthew Garrett EfiPciIoAttributeOperationMaximum 350dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION; 351dd5fc854SMatthew Garrett 352677703ceSMatt Fleming typedef struct { 353677703ceSMatt Fleming u32 read; 354677703ceSMatt Fleming u32 write; 355677703ceSMatt Fleming } efi_pci_io_protocol_access_32_t; 356677703ceSMatt Fleming 357677703ceSMatt Fleming typedef struct { 358677703ceSMatt Fleming u64 read; 359677703ceSMatt Fleming u64 write; 360677703ceSMatt Fleming } efi_pci_io_protocol_access_64_t; 361dd5fc854SMatthew Garrett 362dd5fc854SMatthew Garrett typedef struct { 363dd5fc854SMatthew Garrett void *read; 364dd5fc854SMatthew Garrett void *write; 365dd5fc854SMatthew Garrett } efi_pci_io_protocol_access_t; 366dd5fc854SMatthew Garrett 367dd5fc854SMatthew Garrett typedef struct { 368677703ceSMatt Fleming u32 poll_mem; 369677703ceSMatt Fleming u32 poll_io; 370677703ceSMatt Fleming efi_pci_io_protocol_access_32_t mem; 371677703ceSMatt Fleming efi_pci_io_protocol_access_32_t io; 372677703ceSMatt Fleming efi_pci_io_protocol_access_32_t pci; 373677703ceSMatt Fleming u32 copy_mem; 374677703ceSMatt Fleming u32 map; 375677703ceSMatt Fleming u32 unmap; 376677703ceSMatt Fleming u32 allocate_buffer; 377677703ceSMatt Fleming u32 free_buffer; 378677703ceSMatt Fleming u32 flush; 379677703ceSMatt Fleming u32 get_location; 380677703ceSMatt Fleming u32 attributes; 381677703ceSMatt Fleming u32 get_bar_attributes; 382677703ceSMatt Fleming u32 set_bar_attributes; 383677703ceSMatt Fleming uint64_t romsize; 384677703ceSMatt Fleming void *romimage; 385677703ceSMatt Fleming } efi_pci_io_protocol_32; 386677703ceSMatt Fleming 387677703ceSMatt Fleming typedef struct { 388677703ceSMatt Fleming u64 poll_mem; 389677703ceSMatt Fleming u64 poll_io; 390677703ceSMatt Fleming efi_pci_io_protocol_access_64_t mem; 391677703ceSMatt Fleming efi_pci_io_protocol_access_64_t io; 392677703ceSMatt Fleming efi_pci_io_protocol_access_64_t pci; 393677703ceSMatt Fleming u64 copy_mem; 394677703ceSMatt Fleming u64 map; 395677703ceSMatt Fleming u64 unmap; 396677703ceSMatt Fleming u64 allocate_buffer; 397677703ceSMatt Fleming u64 free_buffer; 398677703ceSMatt Fleming u64 flush; 399677703ceSMatt Fleming u64 get_location; 400677703ceSMatt Fleming u64 attributes; 401677703ceSMatt Fleming u64 get_bar_attributes; 402677703ceSMatt Fleming u64 set_bar_attributes; 403677703ceSMatt Fleming uint64_t romsize; 404677703ceSMatt Fleming void *romimage; 405677703ceSMatt Fleming } efi_pci_io_protocol_64; 406677703ceSMatt Fleming 407677703ceSMatt Fleming typedef struct { 408dd5fc854SMatthew Garrett void *poll_mem; 409dd5fc854SMatthew Garrett void *poll_io; 410dd5fc854SMatthew Garrett efi_pci_io_protocol_access_t mem; 411dd5fc854SMatthew Garrett efi_pci_io_protocol_access_t io; 412dd5fc854SMatthew Garrett efi_pci_io_protocol_access_t pci; 413dd5fc854SMatthew Garrett void *copy_mem; 414dd5fc854SMatthew Garrett void *map; 415dd5fc854SMatthew Garrett void *unmap; 416dd5fc854SMatthew Garrett void *allocate_buffer; 417dd5fc854SMatthew Garrett void *free_buffer; 418dd5fc854SMatthew Garrett void *flush; 419dd5fc854SMatthew Garrett void *get_location; 420dd5fc854SMatthew Garrett void *attributes; 421dd5fc854SMatthew Garrett void *get_bar_attributes; 422dd5fc854SMatthew Garrett void *set_bar_attributes; 423dd5fc854SMatthew Garrett uint64_t romsize; 424dd5fc854SMatthew Garrett void *romimage; 425dd5fc854SMatthew Garrett } efi_pci_io_protocol; 426dd5fc854SMatthew Garrett 427dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001 428dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002 429dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004 430dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008 431dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010 432dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020 433dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040 434dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080 435dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100 436dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200 437dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400 438dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800 439dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000 440dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000 441dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000 442dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 443dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000 444dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 445dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000 446dd5fc854SMatthew Garrett 44758c5475aSLukas Wunner typedef struct { 44858c5475aSLukas Wunner u32 version; 44958c5475aSLukas Wunner u32 get; 45058c5475aSLukas Wunner u32 set; 45158c5475aSLukas Wunner u32 del; 45258c5475aSLukas Wunner u32 get_all; 45358c5475aSLukas Wunner } apple_properties_protocol_32_t; 45458c5475aSLukas Wunner 45558c5475aSLukas Wunner typedef struct { 45658c5475aSLukas Wunner u64 version; 45758c5475aSLukas Wunner u64 get; 45858c5475aSLukas Wunner u64 set; 45958c5475aSLukas Wunner u64 del; 46058c5475aSLukas Wunner u64 get_all; 46158c5475aSLukas Wunner } apple_properties_protocol_64_t; 46258c5475aSLukas Wunner 463f30ca6baSMatt Fleming /* 4641da177e4SLinus Torvalds * Types and defines for EFI ResetSystem 4651da177e4SLinus Torvalds */ 4661da177e4SLinus Torvalds #define EFI_RESET_COLD 0 4671da177e4SLinus Torvalds #define EFI_RESET_WARM 1 4681da177e4SLinus Torvalds #define EFI_RESET_SHUTDOWN 2 4691da177e4SLinus Torvalds 4701da177e4SLinus Torvalds /* 4711da177e4SLinus Torvalds * EFI Runtime Services table 4721da177e4SLinus Torvalds */ 4731da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL) 4741da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_REVISION 0x00010000 4751da177e4SLinus Torvalds 4761da177e4SLinus Torvalds typedef struct { 4771da177e4SLinus Torvalds efi_table_hdr_t hdr; 478677703ceSMatt Fleming u32 get_time; 479677703ceSMatt Fleming u32 set_time; 480677703ceSMatt Fleming u32 get_wakeup_time; 481677703ceSMatt Fleming u32 set_wakeup_time; 482677703ceSMatt Fleming u32 set_virtual_address_map; 483677703ceSMatt Fleming u32 convert_pointer; 484677703ceSMatt Fleming u32 get_variable; 485677703ceSMatt Fleming u32 get_next_variable; 486677703ceSMatt Fleming u32 set_variable; 487677703ceSMatt Fleming u32 get_next_high_mono_count; 488677703ceSMatt Fleming u32 reset_system; 489677703ceSMatt Fleming u32 update_capsule; 490677703ceSMatt Fleming u32 query_capsule_caps; 491677703ceSMatt Fleming u32 query_variable_info; 492677703ceSMatt Fleming } efi_runtime_services_32_t; 493677703ceSMatt Fleming 494677703ceSMatt Fleming typedef struct { 495677703ceSMatt Fleming efi_table_hdr_t hdr; 496677703ceSMatt Fleming u64 get_time; 497677703ceSMatt Fleming u64 set_time; 498677703ceSMatt Fleming u64 get_wakeup_time; 499677703ceSMatt Fleming u64 set_wakeup_time; 500677703ceSMatt Fleming u64 set_virtual_address_map; 501677703ceSMatt Fleming u64 convert_pointer; 502677703ceSMatt Fleming u64 get_variable; 503677703ceSMatt Fleming u64 get_next_variable; 504677703ceSMatt Fleming u64 set_variable; 505677703ceSMatt Fleming u64 get_next_high_mono_count; 506677703ceSMatt Fleming u64 reset_system; 507677703ceSMatt Fleming u64 update_capsule; 508677703ceSMatt Fleming u64 query_capsule_caps; 509677703ceSMatt Fleming u64 query_variable_info; 510677703ceSMatt Fleming } efi_runtime_services_64_t; 511677703ceSMatt Fleming 5121da177e4SLinus Torvalds typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc); 5131da177e4SLinus Torvalds typedef efi_status_t efi_set_time_t (efi_time_t *tm); 5141da177e4SLinus Torvalds typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending, 5151da177e4SLinus Torvalds efi_time_t *tm); 5161da177e4SLinus Torvalds typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm); 5171da177e4SLinus Torvalds typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, 5181da177e4SLinus Torvalds unsigned long *data_size, void *data); 5191da177e4SLinus Torvalds typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name, 5201da177e4SLinus Torvalds efi_guid_t *vendor); 5211da177e4SLinus Torvalds typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, 522f7a2d73fSMatthew Garrett u32 attr, unsigned long data_size, 5231da177e4SLinus Torvalds void *data); 5241da177e4SLinus Torvalds typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count); 5251da177e4SLinus Torvalds typedef void efi_reset_system_t (int reset_type, efi_status_t status, 5261da177e4SLinus Torvalds unsigned long data_size, efi_char16_t *data); 5271da177e4SLinus Torvalds typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size, 5281da177e4SLinus Torvalds unsigned long descriptor_size, 5291da177e4SLinus Torvalds u32 descriptor_version, 5301da177e4SLinus Torvalds efi_memory_desc_t *virtual_map); 5313b370237SMatthew Garrett typedef efi_status_t efi_query_variable_info_t(u32 attr, 5323b370237SMatthew Garrett u64 *storage_space, 5333b370237SMatthew Garrett u64 *remaining_space, 5343b370237SMatthew Garrett u64 *max_variable_size); 5353b370237SMatthew Garrett typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules, 5363b370237SMatthew Garrett unsigned long count, 5373b370237SMatthew Garrett unsigned long sg_list); 5383b370237SMatthew Garrett typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules, 5393b370237SMatthew Garrett unsigned long count, 5403b370237SMatthew Garrett u64 *max_size, 5413b370237SMatthew Garrett int *reset_type); 542ca0e30dcSArd Biesheuvel typedef efi_status_t efi_query_variable_store_t(u32 attributes, 543ca0e30dcSArd Biesheuvel unsigned long size, 544ca0e30dcSArd Biesheuvel bool nonblocking); 5451da177e4SLinus Torvalds 546c4c39c70SArd Biesheuvel typedef struct { 547c4c39c70SArd Biesheuvel efi_table_hdr_t hdr; 548c4c39c70SArd Biesheuvel efi_get_time_t *get_time; 549c4c39c70SArd Biesheuvel efi_set_time_t *set_time; 550c4c39c70SArd Biesheuvel efi_get_wakeup_time_t *get_wakeup_time; 551c4c39c70SArd Biesheuvel efi_set_wakeup_time_t *set_wakeup_time; 552c4c39c70SArd Biesheuvel efi_set_virtual_address_map_t *set_virtual_address_map; 553c4c39c70SArd Biesheuvel void *convert_pointer; 554c4c39c70SArd Biesheuvel efi_get_variable_t *get_variable; 555c4c39c70SArd Biesheuvel efi_get_next_variable_t *get_next_variable; 556c4c39c70SArd Biesheuvel efi_set_variable_t *set_variable; 557c4c39c70SArd Biesheuvel efi_get_next_high_mono_count_t *get_next_high_mono_count; 558c4c39c70SArd Biesheuvel efi_reset_system_t *reset_system; 559c4c39c70SArd Biesheuvel efi_update_capsule_t *update_capsule; 560c4c39c70SArd Biesheuvel efi_query_capsule_caps_t *query_capsule_caps; 561c4c39c70SArd Biesheuvel efi_query_variable_info_t *query_variable_info; 562c4c39c70SArd Biesheuvel } efi_runtime_services_t; 563c4c39c70SArd Biesheuvel 564022ee6c5SArd Biesheuvel void efi_native_runtime_setup(void); 565022ee6c5SArd Biesheuvel 5661da177e4SLinus Torvalds /* 5671da177e4SLinus Torvalds * EFI Configuration Table and GUID definitions 56854fd11feSPeter Jones * 5697fb2b43cSIngo Molnar * These are all defined in a single line to make them easier to 5707fb2b43cSIngo Molnar * grep for and to see them at a glance - while still having a 5717fb2b43cSIngo Molnar * similar structure to the definitions in the spec. 5727fb2b43cSIngo Molnar * 5737fb2b43cSIngo Molnar * Here's how they are structured: 57454fd11feSPeter Jones * 57554fd11feSPeter Jones * GUID: 12345678-1234-1234-1234-123456789012 57654fd11feSPeter Jones * Spec: 57754fd11feSPeter Jones * #define EFI_SOME_PROTOCOL_GUID \ 57854fd11feSPeter Jones * {0x12345678,0x1234,0x1234,\ 57954fd11feSPeter Jones * {0x12,0x34,0x12,0x34,0x56,0x78,0x90,0x12}} 58054fd11feSPeter Jones * Here: 5817fb2b43cSIngo Molnar * #define SOME_PROTOCOL_GUID EFI_GUID(0x12345678, 0x1234, 0x1234, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12) 5827fb2b43cSIngo Molnar * ^ tabs ^extra space 5837fb2b43cSIngo Molnar * 5847fb2b43cSIngo Molnar * Note that the 'extra space' separates the values at the same place 5857fb2b43cSIngo Molnar * where the UEFI SPEC breaks the line. 5861da177e4SLinus Torvalds */ 5877fb2b43cSIngo Molnar #define NULL_GUID EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 5887fb2b43cSIngo Molnar #define MPS_TABLE_GUID EFI_GUID(0xeb9d2d2f, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5897fb2b43cSIngo Molnar #define ACPI_TABLE_GUID EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5907fb2b43cSIngo Molnar #define ACPI_20_TABLE_GUID EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81) 5917fb2b43cSIngo Molnar #define SMBIOS_TABLE_GUID EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5927fb2b43cSIngo Molnar #define SMBIOS3_TABLE_GUID EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c, 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94) 5937fb2b43cSIngo Molnar #define SAL_SYSTEM_TABLE_GUID EFI_GUID(0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5947fb2b43cSIngo Molnar #define HCDP_TABLE_GUID EFI_GUID(0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98) 5957fb2b43cSIngo Molnar #define UGA_IO_PROTOCOL_GUID EFI_GUID(0x61a4d49e, 0x6f68, 0x4f1b, 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2) 5967fb2b43cSIngo Molnar #define EFI_GLOBAL_VARIABLE_GUID EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c) 5977fb2b43cSIngo Molnar #define UV_SYSTEM_TABLE_GUID EFI_GUID(0x3b13a7d4, 0x633e, 0x11dd, 0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93) 5987fb2b43cSIngo Molnar #define LINUX_EFI_CRASH_GUID EFI_GUID(0xcfc8fc79, 0xbe2e, 0x4ddc, 0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0) 5997fb2b43cSIngo Molnar #define LOADED_IMAGE_PROTOCOL_GUID EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 6007fb2b43cSIngo Molnar #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a) 6017fb2b43cSIngo Molnar #define EFI_UGA_PROTOCOL_GUID EFI_GUID(0x982c298b, 0xf4fa, 0x41cb, 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39) 6027fb2b43cSIngo Molnar #define EFI_PCI_IO_PROTOCOL_GUID EFI_GUID(0x4cf5b200, 0x68b8, 0x4ca5, 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a) 6037fb2b43cSIngo Molnar #define EFI_FILE_INFO_ID EFI_GUID(0x09576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 6047fb2b43cSIngo Molnar #define EFI_SYSTEM_RESOURCE_TABLE_GUID EFI_GUID(0xb122a263, 0x3661, 0x4f68, 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80) 6057fb2b43cSIngo Molnar #define EFI_FILE_SYSTEM_GUID EFI_GUID(0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 6067fb2b43cSIngo Molnar #define DEVICE_TREE_GUID EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0) 6077fb2b43cSIngo Molnar #define EFI_PROPERTIES_TABLE_GUID EFI_GUID(0x880aaca3, 0x4adc, 0x4a04, 0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5) 6087fb2b43cSIngo Molnar #define EFI_RNG_PROTOCOL_GUID EFI_GUID(0x3152bca5, 0xeade, 0x433d, 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44) 609568bc4e8SArd Biesheuvel #define EFI_RNG_ALGORITHM_RAW EFI_GUID(0xe43176d7, 0xb6e8, 0x4827, 0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61) 6107fb2b43cSIngo Molnar #define EFI_MEMORY_ATTRIBUTES_TABLE_GUID EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20) 6117fb2b43cSIngo Molnar #define EFI_CONSOLE_OUT_DEVICE_GUID EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 61258c5475aSLukas Wunner #define APPLE_PROPERTIES_PROTOCOL_GUID EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb, 0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0) 613fc372064SArd Biesheuvel 614*e58910cdSJosh Boyer #define EFI_IMAGE_SECURITY_DATABASE_GUID EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596, 0xa3, 0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f) 615*e58910cdSJosh Boyer #define EFI_SHIM_LOCK_GUID EFI_GUID(0x605dab50, 0xe046, 0x4300, 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23) 616*e58910cdSJosh Boyer 617801820beSArd Biesheuvel /* 618801820beSArd Biesheuvel * This GUID is used to pass to the kernel proper the struct screen_info 619801820beSArd Biesheuvel * structure that was populated by the stub based on the GOP protocol instance 620801820beSArd Biesheuvel * associated with ConOut 621801820beSArd Biesheuvel */ 6227fb2b43cSIngo Molnar #define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID EFI_GUID(0xe03fc20a, 0x85dc, 0x406e, 0xb9, 0x0e, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95) 6237fb2b43cSIngo Molnar #define LINUX_EFI_LOADER_ENTRY_GUID EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf, 0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f) 62463625988SArd Biesheuvel #define LINUX_EFI_RANDOM_SEED_TABLE_GUID EFI_GUID(0x1ce1e5bc, 0x7ceb, 0x42f2, 0x81, 0xe5, 0x8a, 0xad, 0xf1, 0x80, 0xf5, 0x7b) 62506f7d4a1SCompostella, Jeremy 6261da177e4SLinus Torvalds typedef struct { 6271da177e4SLinus Torvalds efi_guid_t guid; 6281adbfa35SOlof Johansson u64 table; 6291adbfa35SOlof Johansson } efi_config_table_64_t; 6301adbfa35SOlof Johansson 6311adbfa35SOlof Johansson typedef struct { 6321adbfa35SOlof Johansson efi_guid_t guid; 6331adbfa35SOlof Johansson u32 table; 6341adbfa35SOlof Johansson } efi_config_table_32_t; 6351adbfa35SOlof Johansson 6361adbfa35SOlof Johansson typedef struct { 6371adbfa35SOlof Johansson efi_guid_t guid; 6381da177e4SLinus Torvalds unsigned long table; 6391da177e4SLinus Torvalds } efi_config_table_t; 6401da177e4SLinus Torvalds 641272686bfSLeif Lindholm typedef struct { 642272686bfSLeif Lindholm efi_guid_t guid; 643272686bfSLeif Lindholm const char *name; 644272686bfSLeif Lindholm unsigned long *ptr; 645272686bfSLeif Lindholm } efi_config_table_type_t; 646272686bfSLeif Lindholm 6471da177e4SLinus Torvalds #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) 6481da177e4SLinus Torvalds 6493b370237SMatthew Garrett #define EFI_2_30_SYSTEM_TABLE_REVISION ((2 << 16) | (30)) 6503b370237SMatthew Garrett #define EFI_2_20_SYSTEM_TABLE_REVISION ((2 << 16) | (20)) 6513b370237SMatthew Garrett #define EFI_2_10_SYSTEM_TABLE_REVISION ((2 << 16) | (10)) 6523b370237SMatthew Garrett #define EFI_2_00_SYSTEM_TABLE_REVISION ((2 << 16) | (00)) 6533b370237SMatthew Garrett #define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10)) 6543b370237SMatthew Garrett #define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02)) 6553b370237SMatthew Garrett 6561da177e4SLinus Torvalds typedef struct { 6571da177e4SLinus Torvalds efi_table_hdr_t hdr; 6581adbfa35SOlof Johansson u64 fw_vendor; /* physical addr of CHAR16 vendor string */ 6591adbfa35SOlof Johansson u32 fw_revision; 6601adbfa35SOlof Johansson u32 __pad1; 6611adbfa35SOlof Johansson u64 con_in_handle; 6621adbfa35SOlof Johansson u64 con_in; 6631adbfa35SOlof Johansson u64 con_out_handle; 6641adbfa35SOlof Johansson u64 con_out; 6651adbfa35SOlof Johansson u64 stderr_handle; 6661adbfa35SOlof Johansson u64 stderr; 6671adbfa35SOlof Johansson u64 runtime; 6681adbfa35SOlof Johansson u64 boottime; 6691adbfa35SOlof Johansson u32 nr_tables; 6701adbfa35SOlof Johansson u32 __pad2; 6711adbfa35SOlof Johansson u64 tables; 6721adbfa35SOlof Johansson } efi_system_table_64_t; 6731adbfa35SOlof Johansson 6741adbfa35SOlof Johansson typedef struct { 6751adbfa35SOlof Johansson efi_table_hdr_t hdr; 6761adbfa35SOlof Johansson u32 fw_vendor; /* physical addr of CHAR16 vendor string */ 6771adbfa35SOlof Johansson u32 fw_revision; 6781adbfa35SOlof Johansson u32 con_in_handle; 6791adbfa35SOlof Johansson u32 con_in; 6801adbfa35SOlof Johansson u32 con_out_handle; 6811adbfa35SOlof Johansson u32 con_out; 6821adbfa35SOlof Johansson u32 stderr_handle; 6831adbfa35SOlof Johansson u32 stderr; 6841adbfa35SOlof Johansson u32 runtime; 6851adbfa35SOlof Johansson u32 boottime; 6861adbfa35SOlof Johansson u32 nr_tables; 6871adbfa35SOlof Johansson u32 tables; 6881adbfa35SOlof Johansson } efi_system_table_32_t; 6891adbfa35SOlof Johansson 6901adbfa35SOlof Johansson typedef struct { 6911adbfa35SOlof Johansson efi_table_hdr_t hdr; 6921da177e4SLinus Torvalds unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ 6931da177e4SLinus Torvalds u32 fw_revision; 6941da177e4SLinus Torvalds unsigned long con_in_handle; 6951da177e4SLinus Torvalds unsigned long con_in; 6961da177e4SLinus Torvalds unsigned long con_out_handle; 6971da177e4SLinus Torvalds unsigned long con_out; 6981da177e4SLinus Torvalds unsigned long stderr_handle; 6991da177e4SLinus Torvalds unsigned long stderr; 7001da177e4SLinus Torvalds efi_runtime_services_t *runtime; 701f30ca6baSMatt Fleming efi_boot_services_t *boottime; 7021da177e4SLinus Torvalds unsigned long nr_tables; 7031da177e4SLinus Torvalds unsigned long tables; 7041da177e4SLinus Torvalds } efi_system_table_t; 7051da177e4SLinus Torvalds 7069479c7ceSMatt Fleming /* 7079479c7ceSMatt Fleming * Architecture independent structure for describing a memory map for the 7089479c7ceSMatt Fleming * benefit of efi_memmap_init_early(), saving us the need to pass four 7099479c7ceSMatt Fleming * parameters. 7109479c7ceSMatt Fleming */ 7119479c7ceSMatt Fleming struct efi_memory_map_data { 7129479c7ceSMatt Fleming phys_addr_t phys_map; 7139479c7ceSMatt Fleming unsigned long size; 7149479c7ceSMatt Fleming unsigned long desc_version; 7159479c7ceSMatt Fleming unsigned long desc_size; 7169479c7ceSMatt Fleming }; 7179479c7ceSMatt Fleming 7181da177e4SLinus Torvalds struct efi_memory_map { 71944511fb9SArd Biesheuvel phys_addr_t phys_map; 7207ae65fd3SMatt Tolentino void *map; 7217ae65fd3SMatt Tolentino void *map_end; 7221da177e4SLinus Torvalds int nr_map; 7231da177e4SLinus Torvalds unsigned long desc_version; 7247ae65fd3SMatt Tolentino unsigned long desc_size; 725dca0f971SMatt Fleming bool late; 7261da177e4SLinus Torvalds }; 7271da177e4SLinus Torvalds 72860863c0dSMatt Fleming struct efi_mem_range { 72960863c0dSMatt Fleming struct range range; 73060863c0dSMatt Fleming u64 attribute; 7311da177e4SLinus Torvalds }; 7321da177e4SLinus Torvalds 7330302f71cSMark Salter struct efi_fdt_params { 7340302f71cSMark Salter u64 system_table; 7350302f71cSMark Salter u64 mmap; 7360302f71cSMark Salter u32 mmap_size; 7370302f71cSMark Salter u32 desc_size; 7380302f71cSMark Salter u32 desc_ver; 7390302f71cSMark Salter }; 7400302f71cSMark Salter 7418e84f345SMatt Fleming typedef struct { 7428e84f345SMatt Fleming u32 revision; 743677703ceSMatt Fleming u32 parent_handle; 744677703ceSMatt Fleming u32 system_table; 745677703ceSMatt Fleming u32 device_handle; 746677703ceSMatt Fleming u32 file_path; 747677703ceSMatt Fleming u32 reserved; 748677703ceSMatt Fleming u32 load_options_size; 749677703ceSMatt Fleming u32 load_options; 750677703ceSMatt Fleming u32 image_base; 751677703ceSMatt Fleming __aligned_u64 image_size; 752677703ceSMatt Fleming unsigned int image_code_type; 753677703ceSMatt Fleming unsigned int image_data_type; 754677703ceSMatt Fleming unsigned long unload; 755677703ceSMatt Fleming } efi_loaded_image_32_t; 756677703ceSMatt Fleming 757677703ceSMatt Fleming typedef struct { 758677703ceSMatt Fleming u32 revision; 759677703ceSMatt Fleming u64 parent_handle; 760677703ceSMatt Fleming u64 system_table; 761677703ceSMatt Fleming u64 device_handle; 762677703ceSMatt Fleming u64 file_path; 763677703ceSMatt Fleming u64 reserved; 764677703ceSMatt Fleming u32 load_options_size; 765677703ceSMatt Fleming u64 load_options; 766677703ceSMatt Fleming u64 image_base; 767677703ceSMatt Fleming __aligned_u64 image_size; 768677703ceSMatt Fleming unsigned int image_code_type; 769677703ceSMatt Fleming unsigned int image_data_type; 770677703ceSMatt Fleming unsigned long unload; 771677703ceSMatt Fleming } efi_loaded_image_64_t; 772677703ceSMatt Fleming 773677703ceSMatt Fleming typedef struct { 774677703ceSMatt Fleming u32 revision; 7758e84f345SMatt Fleming void *parent_handle; 7768e84f345SMatt Fleming efi_system_table_t *system_table; 7778e84f345SMatt Fleming void *device_handle; 7788e84f345SMatt Fleming void *file_path; 7798e84f345SMatt Fleming void *reserved; 7808e84f345SMatt Fleming u32 load_options_size; 7818e84f345SMatt Fleming void *load_options; 7828e84f345SMatt Fleming void *image_base; 7838e84f345SMatt Fleming __aligned_u64 image_size; 7848e84f345SMatt Fleming unsigned int image_code_type; 7858e84f345SMatt Fleming unsigned int image_data_type; 7868e84f345SMatt Fleming unsigned long unload; 7878e84f345SMatt Fleming } efi_loaded_image_t; 7888e84f345SMatt Fleming 78955839d51SMatt Fleming 79055839d51SMatt Fleming typedef struct { 79155839d51SMatt Fleming u64 size; 79255839d51SMatt Fleming u64 file_size; 79355839d51SMatt Fleming u64 phys_size; 79455839d51SMatt Fleming efi_time_t create_time; 79555839d51SMatt Fleming efi_time_t last_access_time; 79655839d51SMatt Fleming efi_time_t modification_time; 79755839d51SMatt Fleming __aligned_u64 attribute; 79855839d51SMatt Fleming efi_char16_t filename[1]; 79955839d51SMatt Fleming } efi_file_info_t; 80055839d51SMatt Fleming 801677703ceSMatt Fleming typedef struct { 802677703ceSMatt Fleming u64 revision; 803677703ceSMatt Fleming u32 open; 804677703ceSMatt Fleming u32 close; 805677703ceSMatt Fleming u32 delete; 806677703ceSMatt Fleming u32 read; 807677703ceSMatt Fleming u32 write; 808677703ceSMatt Fleming u32 get_position; 809677703ceSMatt Fleming u32 set_position; 810677703ceSMatt Fleming u32 get_info; 811677703ceSMatt Fleming u32 set_info; 812677703ceSMatt Fleming u32 flush; 813677703ceSMatt Fleming } efi_file_handle_32_t; 814677703ceSMatt Fleming 815677703ceSMatt Fleming typedef struct { 816677703ceSMatt Fleming u64 revision; 817677703ceSMatt Fleming u64 open; 818677703ceSMatt Fleming u64 close; 819677703ceSMatt Fleming u64 delete; 820677703ceSMatt Fleming u64 read; 821677703ceSMatt Fleming u64 write; 822677703ceSMatt Fleming u64 get_position; 823677703ceSMatt Fleming u64 set_position; 824677703ceSMatt Fleming u64 get_info; 825677703ceSMatt Fleming u64 set_info; 826677703ceSMatt Fleming u64 flush; 827677703ceSMatt Fleming } efi_file_handle_64_t; 828677703ceSMatt Fleming 829ed37ddffSRoy Franz typedef struct _efi_file_handle { 83055839d51SMatt Fleming u64 revision; 831ed37ddffSRoy Franz efi_status_t (*open)(struct _efi_file_handle *, 832ed37ddffSRoy Franz struct _efi_file_handle **, 833ed37ddffSRoy Franz efi_char16_t *, u64, u64); 834ed37ddffSRoy Franz efi_status_t (*close)(struct _efi_file_handle *); 83555839d51SMatt Fleming void *delete; 836ed37ddffSRoy Franz efi_status_t (*read)(struct _efi_file_handle *, unsigned long *, 837ed37ddffSRoy Franz void *); 83855839d51SMatt Fleming void *write; 83955839d51SMatt Fleming void *get_position; 84055839d51SMatt Fleming void *set_position; 841ed37ddffSRoy Franz efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *, 842ed37ddffSRoy Franz unsigned long *, void *); 84355839d51SMatt Fleming void *set_info; 84455839d51SMatt Fleming void *flush; 84555839d51SMatt Fleming } efi_file_handle_t; 84655839d51SMatt Fleming 847ed37ddffSRoy Franz typedef struct _efi_file_io_interface { 848ed37ddffSRoy Franz u64 revision; 849ed37ddffSRoy Franz int (*open_volume)(struct _efi_file_io_interface *, 850ed37ddffSRoy Franz efi_file_handle_t **); 851ed37ddffSRoy Franz } efi_file_io_interface_t; 852ed37ddffSRoy Franz 85355839d51SMatt Fleming #define EFI_FILE_MODE_READ 0x0000000000000001 85455839d51SMatt Fleming #define EFI_FILE_MODE_WRITE 0x0000000000000002 85555839d51SMatt Fleming #define EFI_FILE_MODE_CREATE 0x8000000000000000 85655839d51SMatt Fleming 857bf924863SArd Biesheuvel typedef struct { 858bf924863SArd Biesheuvel u32 version; 859bf924863SArd Biesheuvel u32 length; 860bf924863SArd Biesheuvel u64 memory_protection_attribute; 861bf924863SArd Biesheuvel } efi_properties_table_t; 862bf924863SArd Biesheuvel 863bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_VERSION 0x00010000 864bf924863SArd Biesheuvel #define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA 0x1 865bf924863SArd Biesheuvel 866b2c99e3cSBjorn Helgaas #define EFI_INVALID_TABLE_ADDR (~0UL) 867b2c99e3cSBjorn Helgaas 868a604af07SArd Biesheuvel typedef struct { 869a604af07SArd Biesheuvel u32 version; 870a604af07SArd Biesheuvel u32 num_entries; 871a604af07SArd Biesheuvel u32 desc_size; 872a604af07SArd Biesheuvel u32 reserved; 873a604af07SArd Biesheuvel efi_memory_desc_t entry[0]; 874a604af07SArd Biesheuvel } efi_memory_attributes_table_t; 875a604af07SArd Biesheuvel 8761da177e4SLinus Torvalds /* 8771da177e4SLinus Torvalds * All runtime access to EFI goes through this structure: 8781da177e4SLinus Torvalds */ 8791da177e4SLinus Torvalds extern struct efi { 8801da177e4SLinus Torvalds efi_system_table_t *systab; /* EFI system table */ 8813b370237SMatthew Garrett unsigned int runtime_version; /* Runtime services version */ 882b2c99e3cSBjorn Helgaas unsigned long mps; /* MPS table */ 883b2c99e3cSBjorn Helgaas unsigned long acpi; /* ACPI table (IA64 ext 0.71) */ 884b2c99e3cSBjorn Helgaas unsigned long acpi20; /* ACPI table (ACPI 2.0) */ 885e1ccbbc9SArd Biesheuvel unsigned long smbios; /* SMBIOS table (32 bit entry point) */ 886e1ccbbc9SArd Biesheuvel unsigned long smbios3; /* SMBIOS table (64 bit entry point) */ 887b2c99e3cSBjorn Helgaas unsigned long sal_systab; /* SAL system table */ 888b2c99e3cSBjorn Helgaas unsigned long boot_info; /* boot info table */ 889b2c99e3cSBjorn Helgaas unsigned long hcdp; /* HCDP table */ 890b2c99e3cSBjorn Helgaas unsigned long uga; /* UGA table */ 891a50f70b1SRuss Anderson unsigned long uv_systab; /* UV system table */ 892a0998eb1SDave Young unsigned long fw_vendor; /* fw_vendor */ 893a0998eb1SDave Young unsigned long runtime; /* runtime table */ 894a0998eb1SDave Young unsigned long config_table; /* config tables */ 8950bb54905SPeter Jones unsigned long esrt; /* ESRT table */ 896bf924863SArd Biesheuvel unsigned long properties_table; /* properties table */ 897a604af07SArd Biesheuvel unsigned long mem_attr_table; /* memory attributes table */ 89863625988SArd Biesheuvel unsigned long rng_seed; /* UEFI firmware random seed */ 8991da177e4SLinus Torvalds efi_get_time_t *get_time; 9001da177e4SLinus Torvalds efi_set_time_t *set_time; 9011da177e4SLinus Torvalds efi_get_wakeup_time_t *get_wakeup_time; 9021da177e4SLinus Torvalds efi_set_wakeup_time_t *set_wakeup_time; 9031da177e4SLinus Torvalds efi_get_variable_t *get_variable; 9041da177e4SLinus Torvalds efi_get_next_variable_t *get_next_variable; 9051da177e4SLinus Torvalds efi_set_variable_t *set_variable; 90670d2a3cfSArd Biesheuvel efi_set_variable_t *set_variable_nonblocking; 9073b370237SMatthew Garrett efi_query_variable_info_t *query_variable_info; 908d3cac1f8SArd Biesheuvel efi_query_variable_info_t *query_variable_info_nonblocking; 9093b370237SMatthew Garrett efi_update_capsule_t *update_capsule; 9103b370237SMatthew Garrett efi_query_capsule_caps_t *query_capsule_caps; 9111da177e4SLinus Torvalds efi_get_next_high_mono_count_t *get_next_high_mono_count; 9121da177e4SLinus Torvalds efi_reset_system_t *reset_system; 9131da177e4SLinus Torvalds efi_set_virtual_address_map_t *set_virtual_address_map; 914884f4f66SMatt Fleming struct efi_memory_map memmap; 9153e909599SMatt Fleming unsigned long flags; 9161da177e4SLinus Torvalds } efi; 9171da177e4SLinus Torvalds 9181da177e4SLinus Torvalds static inline int 9191da177e4SLinus Torvalds efi_guidcmp (efi_guid_t left, efi_guid_t right) 9201da177e4SLinus Torvalds { 9211da177e4SLinus Torvalds return memcmp(&left, &right, sizeof (efi_guid_t)); 9221da177e4SLinus Torvalds } 9231da177e4SLinus Torvalds 9241da177e4SLinus Torvalds static inline char * 92526e02272SBorislav Petkov efi_guid_to_str(efi_guid_t *guid, char *out) 9261da177e4SLinus Torvalds { 927925ede0bSJoe Perches sprintf(out, "%pUl", guid->b); 9281da177e4SLinus Torvalds return out; 9291da177e4SLinus Torvalds } 9301da177e4SLinus Torvalds 9311da177e4SLinus Torvalds extern void efi_init (void); 9321da177e4SLinus Torvalds extern void *efi_get_pal_addr (void); 9331da177e4SLinus Torvalds extern void efi_map_pal_code (void); 9341da177e4SLinus Torvalds extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg); 93570f4f935SArnd Bergmann extern void efi_gettimeofday (struct timespec64 *ts); 9361da177e4SLinus Torvalds extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */ 93778510792SJosh Triplett #ifdef CONFIG_X86 9382223af38SJosh Triplett extern void efi_late_init(void); 93978510792SJosh Triplett extern void efi_free_boot_services(void); 940ca0e30dcSArd Biesheuvel extern efi_status_t efi_query_variable_store(u32 attributes, 941ca0e30dcSArd Biesheuvel unsigned long size, 942ca0e30dcSArd Biesheuvel bool nonblocking); 943b05b9f5fSTony Luck extern void efi_find_mirror(void); 94478510792SJosh Triplett #else 9452223af38SJosh Triplett static inline void efi_late_init(void) {} 94678510792SJosh Triplett static inline void efi_free_boot_services(void) {} 947a6e4d5a0SMatt Fleming 948ca0e30dcSArd Biesheuvel static inline efi_status_t efi_query_variable_store(u32 attributes, 949ca0e30dcSArd Biesheuvel unsigned long size, 950ca0e30dcSArd Biesheuvel bool nonblocking) 951a6e4d5a0SMatt Fleming { 952a6e4d5a0SMatt Fleming return EFI_SUCCESS; 953a6e4d5a0SMatt Fleming } 95478510792SJosh Triplett #endif 9557bc90e01SJosh Triplett extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr); 9569479c7ceSMatt Fleming 95720b1e22dSNicolai Stange extern phys_addr_t __init efi_memmap_alloc(unsigned int num_entries); 9589479c7ceSMatt Fleming extern int __init efi_memmap_init_early(struct efi_memory_map_data *data); 959dca0f971SMatt Fleming extern int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size); 9609479c7ceSMatt Fleming extern void __init efi_memmap_unmap(void); 961c45f4da3SMatt Fleming extern int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map); 96260863c0dSMatt Fleming extern int __init efi_memmap_split_count(efi_memory_desc_t *md, 96360863c0dSMatt Fleming struct range *range); 96460863c0dSMatt Fleming extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap, 96560863c0dSMatt Fleming void *buf, struct efi_mem_range *mem); 9669479c7ceSMatt Fleming 967272686bfSLeif Lindholm extern int efi_config_init(efi_config_table_type_t *arch_tables); 9683846c158SPeter Jones #ifdef CONFIG_EFI_ESRT 9690bb54905SPeter Jones extern void __init efi_esrt_init(void); 9703846c158SPeter Jones #else 9713846c158SPeter Jones static inline void efi_esrt_init(void) { } 9723846c158SPeter Jones #endif 9737bb68410SArd Biesheuvel extern int efi_config_parse_tables(void *config_tables, int count, int sz, 9747bb68410SArd Biesheuvel efi_config_table_type_t *arch_tables); 9751da177e4SLinus Torvalds extern u64 efi_get_iobase (void); 9761da177e4SLinus Torvalds extern u32 efi_mem_type (unsigned long phys_addr); 9771da177e4SLinus Torvalds extern u64 efi_mem_attributes (unsigned long phys_addr); 97832e62c63SBjorn Helgaas extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size); 9791da177e4SLinus Torvalds extern int __init efi_uart_console_only (void); 9800bb54905SPeter Jones extern u64 efi_mem_desc_end(efi_memory_desc_t *md); 9810bb54905SPeter Jones extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md); 982816e7612SMatt Fleming extern void efi_mem_reserve(phys_addr_t addr, u64 size); 9831da177e4SLinus Torvalds extern void efi_initialize_iomem_resources(struct resource *code_resource, 98400bf4098SBernhard Walle struct resource *data_resource, struct resource *bss_resource); 985916f676fSMatthew Garrett extern void efi_reserve_boot_services(void); 9867968c0e3SLeif Lindholm extern int efi_get_fdt_params(struct efi_fdt_params *params); 9870bb54905SPeter Jones extern struct kobject *efi_kobj; 9881da177e4SLinus Torvalds 98944be28e9SMatt Fleming extern int efi_reboot_quirk_mode; 9900c5ed61aSMatt Fleming extern bool efi_poweroff_required(void); 9910c5ed61aSMatt Fleming 9920f96a99dSTaku Izumi #ifdef CONFIG_EFI_FAKE_MEMMAP 9930f96a99dSTaku Izumi extern void __init efi_fake_memmap(void); 9940f96a99dSTaku Izumi #else 9950f96a99dSTaku Izumi static inline void efi_fake_memmap(void) { } 9960f96a99dSTaku Izumi #endif 9970f96a99dSTaku Izumi 99810f0d2f5SArd Biesheuvel /* 99910f0d2f5SArd Biesheuvel * efi_memattr_perm_setter - arch specific callback function passed into 100010f0d2f5SArd Biesheuvel * efi_memattr_apply_permissions() that updates the 100110f0d2f5SArd Biesheuvel * mapping permissions described by the second 100210f0d2f5SArd Biesheuvel * argument in the page tables referred to by the 100310f0d2f5SArd Biesheuvel * first argument. 100410f0d2f5SArd Biesheuvel */ 100510f0d2f5SArd Biesheuvel typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *); 100610f0d2f5SArd Biesheuvel 100710f0d2f5SArd Biesheuvel extern int efi_memattr_init(void); 100810f0d2f5SArd Biesheuvel extern int efi_memattr_apply_permissions(struct mm_struct *mm, 100910f0d2f5SArd Biesheuvel efi_memattr_perm_setter fn); 101010f0d2f5SArd Biesheuvel 1011e885cd80SMark Salter /* Iterate through an efi_memory_map */ 101278ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md) \ 1013e885cd80SMark Salter for ((md) = (m)->map; \ 1014d4c4fed0SJan Beulich (md) && ((void *)(md) + (m)->desc_size) <= (m)->map_end; \ 1015e885cd80SMark Salter (md) = (void *)(md) + (m)->desc_size) 1016e885cd80SMark Salter 101778ce248fSMatt Fleming /** 101878ce248fSMatt Fleming * for_each_efi_memory_desc - iterate over descriptors in efi.memmap 101978ce248fSMatt Fleming * @md: the efi_memory_desc_t * iterator 102078ce248fSMatt Fleming * 102178ce248fSMatt Fleming * Once the loop finishes @md must not be accessed. 102278ce248fSMatt Fleming */ 102378ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \ 1024884f4f66SMatt Fleming for_each_efi_memory_desc_in_map(&efi.memmap, md) 102578ce248fSMatt Fleming 102698d2a6caSLaszlo Ersek /* 102798d2a6caSLaszlo Ersek * Format an EFI memory descriptor's type and attributes to a user-provided 102898d2a6caSLaszlo Ersek * character buffer, as per snprintf(), and return the buffer. 102998d2a6caSLaszlo Ersek */ 103098d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size, 103198d2a6caSLaszlo Ersek const efi_memory_desc_t *md); 103298d2a6caSLaszlo Ersek 10331da177e4SLinus Torvalds /** 10341da177e4SLinus Torvalds * efi_range_is_wc - check the WC bit on an address range 10351da177e4SLinus Torvalds * @start: starting kvirt address 10361da177e4SLinus Torvalds * @len: length of range 10371da177e4SLinus Torvalds * 10381da177e4SLinus Torvalds * Consult the EFI memory map and make sure it's ok to set this range WC. 10391da177e4SLinus Torvalds * Returns true or false. 10401da177e4SLinus Torvalds */ 10411da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len) 10421da177e4SLinus Torvalds { 1043986a80d5SJesper Juhl unsigned long i; 10441da177e4SLinus Torvalds 10451da177e4SLinus Torvalds for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) { 10461da177e4SLinus Torvalds unsigned long paddr = __pa(start + i); 10471da177e4SLinus Torvalds if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC)) 10481da177e4SLinus Torvalds return 0; 10491da177e4SLinus Torvalds } 10501da177e4SLinus Torvalds /* The range checked out */ 10511da177e4SLinus Torvalds return 1; 10521da177e4SLinus Torvalds } 10531da177e4SLinus Torvalds 10541da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP 10551da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *); 10561da177e4SLinus Torvalds #endif 10571da177e4SLinus Torvalds 10581da177e4SLinus Torvalds /* 105983e68189SMatt Fleming * We play games with efi_enabled so that the compiler will, if 106083e68189SMatt Fleming * possible, remove EFI-related code altogether. 10611da177e4SLinus Torvalds */ 106283e68189SMatt Fleming #define EFI_BOOT 0 /* Were we booted from EFI? */ 106383e68189SMatt Fleming #define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */ 106483e68189SMatt Fleming #define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */ 106583e68189SMatt Fleming #define EFI_MEMMAP 4 /* Can we use EFI memory map? */ 106683e68189SMatt Fleming #define EFI_64BIT 5 /* Is the firmware 64-bit? */ 10679f27bc54SDaniel Kiper #define EFI_PARAVIRT 6 /* Access is via a paravirt interface */ 10689f27bc54SDaniel Kiper #define EFI_ARCH_1 7 /* First arch-specific bit */ 1069fed6cefeSBorislav Petkov #define EFI_DBG 8 /* Print additional debug info at runtime */ 1070a1041713SArd Biesheuvel #define EFI_NX_PE_DATA 9 /* Can runtime data regions be mapped non-executable? */ 1071a19ebf59SSai Praneeth #define EFI_MEM_ATTR 10 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */ 107283e68189SMatt Fleming 10731da177e4SLinus Torvalds #ifdef CONFIG_EFI 10743e909599SMatt Fleming /* 10753e909599SMatt Fleming * Test whether the above EFI_* bits are enabled. 10763e909599SMatt Fleming */ 10773e909599SMatt Fleming static inline bool efi_enabled(int feature) 107883e68189SMatt Fleming { 10793e909599SMatt Fleming return test_bit(feature, &efi.flags) != 0; 10803e909599SMatt Fleming } 10818562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); 10823e909599SMatt Fleming #else 10833e909599SMatt Fleming static inline bool efi_enabled(int feature) 10843e909599SMatt Fleming { 10853e909599SMatt Fleming return false; 108683e68189SMatt Fleming } 10878562c99cSMatt Fleming static inline void 10888562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {} 108987615a34SMatt Fleming 109087615a34SMatt Fleming static inline bool 109187615a34SMatt Fleming efi_capsule_pending(int *reset_type) 109287615a34SMatt Fleming { 109387615a34SMatt Fleming return false; 109487615a34SMatt Fleming } 10951da177e4SLinus Torvalds #endif 10961da177e4SLinus Torvalds 1097806b0351SMatt Fleming extern int efi_status_to_err(efi_status_t status); 1098806b0351SMatt Fleming 10991da177e4SLinus Torvalds /* 11001da177e4SLinus Torvalds * Variable Attributes 11011da177e4SLinus Torvalds */ 11021da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001 11031da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002 11041da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004 110541b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008 110641b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010 110741b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020 110841b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE 0x0000000000000040 11091da177e4SLinus Torvalds 111041b3254cSMatthew Garrett #define EFI_VARIABLE_MASK (EFI_VARIABLE_NON_VOLATILE | \ 111141b3254cSMatthew Garrett EFI_VARIABLE_BOOTSERVICE_ACCESS | \ 111241b3254cSMatthew Garrett EFI_VARIABLE_RUNTIME_ACCESS | \ 111341b3254cSMatthew Garrett EFI_VARIABLE_HARDWARE_ERROR_RECORD | \ 111441b3254cSMatthew Garrett EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \ 111541b3254cSMatthew Garrett EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \ 111641b3254cSMatthew Garrett EFI_VARIABLE_APPEND_WRITE) 11171da177e4SLinus Torvalds /* 1118e14ab23dSMatt Fleming * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")) 1119e14ab23dSMatt Fleming * not including trailing NUL 1120e14ab23dSMatt Fleming */ 1121ba7e34b1SAndy Shevchenko #define EFI_VARIABLE_GUID_LEN UUID_STRING_LEN 1122e14ab23dSMatt Fleming 1123e14ab23dSMatt Fleming /* 1124e2527a7cSMatt Fleming * The type of search to perform when calling boottime->locate_handle 1125e2527a7cSMatt Fleming */ 1126e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES 0 1127e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY 1 1128e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL 2 1129e2527a7cSMatt Fleming 1130e2527a7cSMatt Fleming /* 11311da177e4SLinus Torvalds * EFI Device Path information 11321da177e4SLinus Torvalds */ 11331da177e4SLinus Torvalds #define EFI_DEV_HW 0x01 11341da177e4SLinus Torvalds #define EFI_DEV_PCI 1 11351da177e4SLinus Torvalds #define EFI_DEV_PCCARD 2 11361da177e4SLinus Torvalds #define EFI_DEV_MEM_MAPPED 3 11371da177e4SLinus Torvalds #define EFI_DEV_VENDOR 4 11381da177e4SLinus Torvalds #define EFI_DEV_CONTROLLER 5 11391da177e4SLinus Torvalds #define EFI_DEV_ACPI 0x02 11401da177e4SLinus Torvalds #define EFI_DEV_BASIC_ACPI 1 11411da177e4SLinus Torvalds #define EFI_DEV_EXPANDED_ACPI 2 11421da177e4SLinus Torvalds #define EFI_DEV_MSG 0x03 11431da177e4SLinus Torvalds #define EFI_DEV_MSG_ATAPI 1 11441da177e4SLinus Torvalds #define EFI_DEV_MSG_SCSI 2 11451da177e4SLinus Torvalds #define EFI_DEV_MSG_FC 3 11461da177e4SLinus Torvalds #define EFI_DEV_MSG_1394 4 11471da177e4SLinus Torvalds #define EFI_DEV_MSG_USB 5 11481da177e4SLinus Torvalds #define EFI_DEV_MSG_USB_CLASS 15 11491da177e4SLinus Torvalds #define EFI_DEV_MSG_I20 6 11501da177e4SLinus Torvalds #define EFI_DEV_MSG_MAC 11 11511da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV4 12 11521da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV6 13 11531da177e4SLinus Torvalds #define EFI_DEV_MSG_INFINIBAND 9 11541da177e4SLinus Torvalds #define EFI_DEV_MSG_UART 14 11551da177e4SLinus Torvalds #define EFI_DEV_MSG_VENDOR 10 11561da177e4SLinus Torvalds #define EFI_DEV_MEDIA 0x04 11571da177e4SLinus Torvalds #define EFI_DEV_MEDIA_HARD_DRIVE 1 11581da177e4SLinus Torvalds #define EFI_DEV_MEDIA_CDROM 2 11591da177e4SLinus Torvalds #define EFI_DEV_MEDIA_VENDOR 3 11601da177e4SLinus Torvalds #define EFI_DEV_MEDIA_FILE 4 11611da177e4SLinus Torvalds #define EFI_DEV_MEDIA_PROTOCOL 5 11621da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT 0x05 11631da177e4SLinus Torvalds #define EFI_DEV_END_PATH 0x7F 11641da177e4SLinus Torvalds #define EFI_DEV_END_PATH2 0xFF 11651da177e4SLinus Torvalds #define EFI_DEV_END_INSTANCE 0x01 11661da177e4SLinus Torvalds #define EFI_DEV_END_ENTIRE 0xFF 11671da177e4SLinus Torvalds 11681da177e4SLinus Torvalds struct efi_generic_dev_path { 11691da177e4SLinus Torvalds u8 type; 11701da177e4SLinus Torvalds u8 sub_type; 11711da177e4SLinus Torvalds u16 length; 11721da177e4SLinus Torvalds } __attribute ((packed)); 11731da177e4SLinus Torvalds 117446cd4b75SLukas Wunner struct efi_dev_path { 117546cd4b75SLukas Wunner u8 type; /* can be replaced with unnamed */ 117646cd4b75SLukas Wunner u8 sub_type; /* struct efi_generic_dev_path; */ 117746cd4b75SLukas Wunner u16 length; /* once we've moved to -std=c11 */ 117846cd4b75SLukas Wunner union { 117946cd4b75SLukas Wunner struct { 118046cd4b75SLukas Wunner u32 hid; 118146cd4b75SLukas Wunner u32 uid; 118246cd4b75SLukas Wunner } acpi; 118346cd4b75SLukas Wunner struct { 118446cd4b75SLukas Wunner u8 fn; 118546cd4b75SLukas Wunner u8 dev; 118646cd4b75SLukas Wunner } pci; 118746cd4b75SLukas Wunner }; 118846cd4b75SLukas Wunner } __attribute ((packed)); 118946cd4b75SLukas Wunner 119046cd4b75SLukas Wunner #if IS_ENABLED(CONFIG_EFI_DEV_PATH_PARSER) 119146cd4b75SLukas Wunner struct device *efi_get_device_by_path(struct efi_dev_path **node, size_t *len); 119246cd4b75SLukas Wunner #endif 119346cd4b75SLukas Wunner 11944a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages) 11954a3575fdSHuang, Ying { 11964a3575fdSHuang, Ying *npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr); 11974a3575fdSHuang, Ying *addr &= PAGE_MASK; 11984a3575fdSHuang, Ying } 11994a3575fdSHuang, Ying 120004851772SMatt Fleming /* 12014fc756bdSMike Waychison * EFI Variable support. 12024fc756bdSMike Waychison * 12034fc756bdSMike Waychison * Different firmware drivers can expose their EFI-like variables using 12044fc756bdSMike Waychison * the following. 12054fc756bdSMike Waychison */ 12064fc756bdSMike Waychison 12074fc756bdSMike Waychison struct efivar_operations { 12084fc756bdSMike Waychison efi_get_variable_t *get_variable; 12094fc756bdSMike Waychison efi_get_next_variable_t *get_next_variable; 12104fc756bdSMike Waychison efi_set_variable_t *set_variable; 121170d2a3cfSArd Biesheuvel efi_set_variable_t *set_variable_nonblocking; 1212a6e4d5a0SMatt Fleming efi_query_variable_store_t *query_variable_store; 12134fc756bdSMike Waychison }; 12144fc756bdSMike Waychison 12154fc756bdSMike Waychison struct efivars { 12164fc756bdSMike Waychison struct kset *kset; 1217605e70c7SLee, Chun-Yi struct kobject *kobject; 12184fc756bdSMike Waychison const struct efivar_operations *ops; 12194fc756bdSMike Waychison }; 12204fc756bdSMike Waychison 1221e14ab23dSMatt Fleming /* 1222e14ab23dSMatt Fleming * The maximum size of VariableName + Data = 1024 1223e14ab23dSMatt Fleming * Therefore, it's reasonable to save that much 1224e14ab23dSMatt Fleming * space in each part of the structure, 1225e14ab23dSMatt Fleming * and we use a page for reading/writing. 1226e14ab23dSMatt Fleming */ 1227e14ab23dSMatt Fleming 1228a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN 1024 1229a5d92ad3SMatt Fleming 1230e14ab23dSMatt Fleming struct efi_variable { 1231a5d92ad3SMatt Fleming efi_char16_t VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)]; 1232e14ab23dSMatt Fleming efi_guid_t VendorGuid; 1233e14ab23dSMatt Fleming unsigned long DataSize; 1234e14ab23dSMatt Fleming __u8 Data[1024]; 1235e14ab23dSMatt Fleming efi_status_t Status; 1236e14ab23dSMatt Fleming __u32 Attributes; 1237e14ab23dSMatt Fleming } __attribute__((packed)); 1238e14ab23dSMatt Fleming 1239e14ab23dSMatt Fleming struct efivar_entry { 1240e14ab23dSMatt Fleming struct efi_variable var; 1241e14ab23dSMatt Fleming struct list_head list; 1242e14ab23dSMatt Fleming struct kobject kobj; 1243e0d59733SSeiji Aguchi bool scanning; 1244e0d59733SSeiji Aguchi bool deleting; 1245e14ab23dSMatt Fleming }; 1246e14ab23dSMatt Fleming 1247db4545d9SLukas Wunner typedef struct { 1248677703ceSMatt Fleming u32 reset; 1249677703ceSMatt Fleming u32 output_string; 1250677703ceSMatt Fleming u32 test_string; 1251db4545d9SLukas Wunner } efi_simple_text_output_protocol_32_t; 1252677703ceSMatt Fleming 1253db4545d9SLukas Wunner typedef struct { 1254677703ceSMatt Fleming u64 reset; 1255677703ceSMatt Fleming u64 output_string; 1256677703ceSMatt Fleming u64 test_string; 1257db4545d9SLukas Wunner } efi_simple_text_output_protocol_64_t; 1258ed37ddffSRoy Franz 1259ed37ddffSRoy Franz struct efi_simple_text_output_protocol { 1260ed37ddffSRoy Franz void *reset; 1261ed37ddffSRoy Franz efi_status_t (*output_string)(void *, void *); 1262ed37ddffSRoy Franz void *test_string; 1263ed37ddffSRoy Franz }; 1264ed37ddffSRoy Franz 1265fc372064SArd Biesheuvel #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0 1266fc372064SArd Biesheuvel #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1 1267fc372064SArd Biesheuvel #define PIXEL_BIT_MASK 2 1268fc372064SArd Biesheuvel #define PIXEL_BLT_ONLY 3 1269fc372064SArd Biesheuvel #define PIXEL_FORMAT_MAX 4 1270fc372064SArd Biesheuvel 1271fc372064SArd Biesheuvel struct efi_pixel_bitmask { 1272fc372064SArd Biesheuvel u32 red_mask; 1273fc372064SArd Biesheuvel u32 green_mask; 1274fc372064SArd Biesheuvel u32 blue_mask; 1275fc372064SArd Biesheuvel u32 reserved_mask; 1276fc372064SArd Biesheuvel }; 1277fc372064SArd Biesheuvel 1278fc372064SArd Biesheuvel struct efi_graphics_output_mode_info { 1279fc372064SArd Biesheuvel u32 version; 1280fc372064SArd Biesheuvel u32 horizontal_resolution; 1281fc372064SArd Biesheuvel u32 vertical_resolution; 1282fc372064SArd Biesheuvel int pixel_format; 1283fc372064SArd Biesheuvel struct efi_pixel_bitmask pixel_information; 1284fc372064SArd Biesheuvel u32 pixels_per_scan_line; 1285fc372064SArd Biesheuvel } __packed; 1286fc372064SArd Biesheuvel 1287fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode_32 { 1288fc372064SArd Biesheuvel u32 max_mode; 1289fc372064SArd Biesheuvel u32 mode; 1290fc372064SArd Biesheuvel u32 info; 1291fc372064SArd Biesheuvel u32 size_of_info; 1292fc372064SArd Biesheuvel u64 frame_buffer_base; 1293fc372064SArd Biesheuvel u32 frame_buffer_size; 1294fc372064SArd Biesheuvel } __packed; 1295fc372064SArd Biesheuvel 1296fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode_64 { 1297fc372064SArd Biesheuvel u32 max_mode; 1298fc372064SArd Biesheuvel u32 mode; 1299fc372064SArd Biesheuvel u64 info; 1300fc372064SArd Biesheuvel u64 size_of_info; 1301fc372064SArd Biesheuvel u64 frame_buffer_base; 1302fc372064SArd Biesheuvel u64 frame_buffer_size; 1303fc372064SArd Biesheuvel } __packed; 1304fc372064SArd Biesheuvel 1305fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode { 1306fc372064SArd Biesheuvel u32 max_mode; 1307fc372064SArd Biesheuvel u32 mode; 1308fc372064SArd Biesheuvel unsigned long info; 1309fc372064SArd Biesheuvel unsigned long size_of_info; 1310fc372064SArd Biesheuvel u64 frame_buffer_base; 1311fc372064SArd Biesheuvel unsigned long frame_buffer_size; 1312fc372064SArd Biesheuvel } __packed; 1313fc372064SArd Biesheuvel 1314fc372064SArd Biesheuvel struct efi_graphics_output_protocol_32 { 1315fc372064SArd Biesheuvel u32 query_mode; 1316fc372064SArd Biesheuvel u32 set_mode; 1317fc372064SArd Biesheuvel u32 blt; 1318fc372064SArd Biesheuvel u32 mode; 1319fc372064SArd Biesheuvel }; 1320fc372064SArd Biesheuvel 1321fc372064SArd Biesheuvel struct efi_graphics_output_protocol_64 { 1322fc372064SArd Biesheuvel u64 query_mode; 1323fc372064SArd Biesheuvel u64 set_mode; 1324fc372064SArd Biesheuvel u64 blt; 1325fc372064SArd Biesheuvel u64 mode; 1326fc372064SArd Biesheuvel }; 1327fc372064SArd Biesheuvel 1328fc372064SArd Biesheuvel struct efi_graphics_output_protocol { 1329fc372064SArd Biesheuvel unsigned long query_mode; 1330fc372064SArd Biesheuvel unsigned long set_mode; 1331fc372064SArd Biesheuvel unsigned long blt; 1332fc372064SArd Biesheuvel struct efi_graphics_output_protocol_mode *mode; 1333fc372064SArd Biesheuvel }; 1334fc372064SArd Biesheuvel 1335fc372064SArd Biesheuvel typedef efi_status_t (*efi_graphics_output_protocol_query_mode)( 1336fc372064SArd Biesheuvel struct efi_graphics_output_protocol *, u32, unsigned long *, 1337fc372064SArd Biesheuvel struct efi_graphics_output_mode_info **); 1338fc372064SArd Biesheuvel 133904851772SMatt Fleming extern struct list_head efivar_sysfs_list; 134004851772SMatt Fleming 134104851772SMatt Fleming static inline void 134204851772SMatt Fleming efivar_unregister(struct efivar_entry *var) 134304851772SMatt Fleming { 134404851772SMatt Fleming kobject_put(&var->kobj); 134504851772SMatt Fleming } 134604851772SMatt Fleming 1347e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars, 13484fc756bdSMike Waychison const struct efivar_operations *ops, 1349e14ab23dSMatt Fleming struct kobject *kobject); 1350e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars); 1351e14ab23dSMatt Fleming struct kobject *efivars_kobject(void); 1352e14ab23dSMatt Fleming 1353e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *), 13541cfd6316SJulia Lawall void *data, bool duplicates, struct list_head *head); 1355e14ab23dSMatt Fleming 135621b3ddd3SSylvain Chouleur int efivar_entry_add(struct efivar_entry *entry, struct list_head *head); 135721b3ddd3SSylvain Chouleur int efivar_entry_remove(struct efivar_entry *entry); 1358e14ab23dSMatt Fleming 1359e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry); 1360e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry); 1361e14ab23dSMatt Fleming 1362e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size); 13638a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 13648a415b8cSMatt Fleming unsigned long *size, void *data); 1365e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 1366e14ab23dSMatt Fleming unsigned long *size, void *data); 1367e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes, 1368e14ab23dSMatt Fleming unsigned long size, void *data, struct list_head *head); 1369e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes, 1370e14ab23dSMatt Fleming unsigned long *size, void *data, bool *set); 1371e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, 1372e14ab23dSMatt Fleming bool block, unsigned long size, void *data); 1373e14ab23dSMatt Fleming 137421b3ddd3SSylvain Chouleur int efivar_entry_iter_begin(void); 1375e14ab23dSMatt Fleming void efivar_entry_iter_end(void); 1376e14ab23dSMatt Fleming 1377e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1378e14ab23dSMatt Fleming struct list_head *head, void *data, 1379e14ab23dSMatt Fleming struct efivar_entry **prev); 1380e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1381e14ab23dSMatt Fleming struct list_head *head, void *data); 1382e14ab23dSMatt Fleming 1383e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, 1384e14ab23dSMatt Fleming struct list_head *head, bool remove); 1385e14ab23dSMatt Fleming 13868282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data, 13878282f5d9SPeter Jones unsigned long data_size); 1388ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name, 1389ed8b0de5SPeter Jones size_t len); 1390e14ab23dSMatt Fleming 1391a9499fa7STom Gundersen extern struct work_struct efivar_work; 139204851772SMatt Fleming void efivar_run_worker(void); 139304851772SMatt Fleming 1394a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE) 1395e14ab23dSMatt Fleming int efivars_sysfs_init(void); 13964fc756bdSMike Waychison 1397e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024 1398e0d59733SSeiji Aguchi 13994fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */ 1400f0133f3cSMatt Fleming extern bool efi_capsule_pending(int *reset_type); 1401f0133f3cSMatt Fleming 1402f0133f3cSMatt Fleming extern int efi_capsule_supported(efi_guid_t guid, u32 flags, 1403f0133f3cSMatt Fleming size_t size, int *reset); 1404f0133f3cSMatt Fleming 1405f0133f3cSMatt Fleming extern int efi_capsule_update(efi_capsule_header_t *capsule, 1406f0133f3cSMatt Fleming struct page **pages); 14074fc756bdSMike Waychison 1408926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP 1409926172d4SDave Young int efi_runtime_map_init(struct kobject *); 14106a2c20e7SVivek Goyal int efi_get_runtime_map_size(void); 14116a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void); 14126a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz); 1413926172d4SDave Young #else 1414926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj) 1415926172d4SDave Young { 1416926172d4SDave Young return 0; 1417926172d4SDave Young } 1418926172d4SDave Young 14196a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void) 14206a2c20e7SVivek Goyal { 14216a2c20e7SVivek Goyal return 0; 14226a2c20e7SVivek Goyal } 14236a2c20e7SVivek Goyal 14246a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void) 14256a2c20e7SVivek Goyal { 14266a2c20e7SVivek Goyal return 0; 14276a2c20e7SVivek Goyal } 14286a2c20e7SVivek Goyal 14296a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz) 14306a2c20e7SVivek Goyal { 14316a2c20e7SVivek Goyal return 0; 14326a2c20e7SVivek Goyal } 14336a2c20e7SVivek Goyal 1434926172d4SDave Young #endif 1435926172d4SDave Young 1436bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */ 1437bd669475SArd Biesheuvel 1438bd669475SArd Biesheuvel #define pr_efi(sys_table, msg) efi_printk(sys_table, "EFI stub: "msg) 1439bd669475SArd Biesheuvel #define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg) 1440bd669475SArd Biesheuvel 1441bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str); 1442bd669475SArd Biesheuvel 1443bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size, 1444bd669475SArd Biesheuvel unsigned long addr); 1445bd669475SArd Biesheuvel 1446bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg, 1447bd669475SArd Biesheuvel efi_loaded_image_t *image, int *cmd_line_len); 1448bd669475SArd Biesheuvel 1449bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg, 1450dadb57abSJeffrey Hugo struct efi_boot_memmap *map); 1451bd669475SArd Biesheuvel 1452bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg, 1453bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1454bd669475SArd Biesheuvel unsigned long *addr); 1455bd669475SArd Biesheuvel 1456bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg, 1457bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1458bd669475SArd Biesheuvel unsigned long *addr, unsigned long max); 1459bd669475SArd Biesheuvel 1460bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg, 1461bd669475SArd Biesheuvel unsigned long *image_addr, 1462bd669475SArd Biesheuvel unsigned long image_size, 1463bd669475SArd Biesheuvel unsigned long alloc_size, 1464bd669475SArd Biesheuvel unsigned long preferred_addr, 1465bd669475SArd Biesheuvel unsigned long alignment); 1466bd669475SArd Biesheuvel 1467bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg, 1468bd669475SArd Biesheuvel efi_loaded_image_t *image, 1469bd669475SArd Biesheuvel char *cmd_line, char *option_string, 1470bd669475SArd Biesheuvel unsigned long max_addr, 1471bd669475SArd Biesheuvel unsigned long *load_addr, 1472bd669475SArd Biesheuvel unsigned long *load_size); 1473bd669475SArd Biesheuvel 14745a17dae4SMatt Fleming efi_status_t efi_parse_options(char *cmdline); 14755a17dae4SMatt Fleming 14762c23b73cSArd Biesheuvel efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg, 14772c23b73cSArd Biesheuvel struct screen_info *si, efi_guid_t *proto, 14782c23b73cSArd Biesheuvel unsigned long size); 14792c23b73cSArd Biesheuvel 1480b2e0a54aSDave Young bool efi_runtime_disabled(void); 148180e75596SAlex Thorlton extern void efi_call_virt_check_flags(unsigned long flags, const char *call); 148280e75596SAlex Thorlton 148380e75596SAlex Thorlton /* 148480e75596SAlex Thorlton * Arch code can implement the following three template macros, avoiding 148580e75596SAlex Thorlton * reptition for the void/non-void return cases of {__,}efi_call_virt(): 148680e75596SAlex Thorlton * 148780e75596SAlex Thorlton * * arch_efi_call_virt_setup() 148880e75596SAlex Thorlton * 148980e75596SAlex Thorlton * Sets up the environment for the call (e.g. switching page tables, 149080e75596SAlex Thorlton * allowing kernel-mode use of floating point, if required). 149180e75596SAlex Thorlton * 149280e75596SAlex Thorlton * * arch_efi_call_virt() 149380e75596SAlex Thorlton * 149480e75596SAlex Thorlton * Performs the call. The last expression in the macro must be the call 149580e75596SAlex Thorlton * itself, allowing the logic to be shared by the void and non-void 149680e75596SAlex Thorlton * cases. 149780e75596SAlex Thorlton * 149880e75596SAlex Thorlton * * arch_efi_call_virt_teardown() 149980e75596SAlex Thorlton * 150080e75596SAlex Thorlton * Restores the usual kernel environment once the call has returned. 150180e75596SAlex Thorlton */ 150280e75596SAlex Thorlton 150380e75596SAlex Thorlton #define efi_call_virt_pointer(p, f, args...) \ 150480e75596SAlex Thorlton ({ \ 150580e75596SAlex Thorlton efi_status_t __s; \ 150680e75596SAlex Thorlton unsigned long __flags; \ 150780e75596SAlex Thorlton \ 150880e75596SAlex Thorlton arch_efi_call_virt_setup(); \ 150980e75596SAlex Thorlton \ 151080e75596SAlex Thorlton local_save_flags(__flags); \ 151180e75596SAlex Thorlton __s = arch_efi_call_virt(p, f, args); \ 151280e75596SAlex Thorlton efi_call_virt_check_flags(__flags, __stringify(f)); \ 151380e75596SAlex Thorlton \ 151480e75596SAlex Thorlton arch_efi_call_virt_teardown(); \ 151580e75596SAlex Thorlton \ 151680e75596SAlex Thorlton __s; \ 151780e75596SAlex Thorlton }) 151880e75596SAlex Thorlton 151980e75596SAlex Thorlton #define __efi_call_virt_pointer(p, f, args...) \ 152080e75596SAlex Thorlton ({ \ 152180e75596SAlex Thorlton unsigned long __flags; \ 152280e75596SAlex Thorlton \ 152380e75596SAlex Thorlton arch_efi_call_virt_setup(); \ 152480e75596SAlex Thorlton \ 152580e75596SAlex Thorlton local_save_flags(__flags); \ 152680e75596SAlex Thorlton arch_efi_call_virt(p, f, args); \ 152780e75596SAlex Thorlton efi_call_virt_check_flags(__flags, __stringify(f)); \ 152880e75596SAlex Thorlton \ 152980e75596SAlex Thorlton arch_efi_call_virt_teardown(); \ 153080e75596SAlex Thorlton }) 153180e75596SAlex Thorlton 1532fc07716bSJeffrey Hugo typedef efi_status_t (*efi_exit_boot_map_processing)( 1533fc07716bSJeffrey Hugo efi_system_table_t *sys_table_arg, 1534fc07716bSJeffrey Hugo struct efi_boot_memmap *map, 1535fc07716bSJeffrey Hugo void *priv); 1536fc07716bSJeffrey Hugo 1537fc07716bSJeffrey Hugo efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table, 1538fc07716bSJeffrey Hugo void *handle, 1539fc07716bSJeffrey Hugo struct efi_boot_memmap *map, 1540fc07716bSJeffrey Hugo void *priv, 1541fc07716bSJeffrey Hugo efi_exit_boot_map_processing priv_func); 154263625988SArd Biesheuvel 154363625988SArd Biesheuvel struct linux_efi_random_seed { 154463625988SArd Biesheuvel u32 size; 154563625988SArd Biesheuvel u8 bits[]; 154663625988SArd Biesheuvel }; 154763625988SArd Biesheuvel 15481da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */ 1549