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> 238562c99cSMatt Fleming #include <linux/reboot.h> 24*2c23b73cSArd Biesheuvel #include <linux/screen_info.h> 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds #include <asm/page.h> 271da177e4SLinus Torvalds 281da177e4SLinus Torvalds #define EFI_SUCCESS 0 291da177e4SLinus Torvalds #define EFI_LOAD_ERROR ( 1 | (1UL << (BITS_PER_LONG-1))) 301da177e4SLinus Torvalds #define EFI_INVALID_PARAMETER ( 2 | (1UL << (BITS_PER_LONG-1))) 311da177e4SLinus Torvalds #define EFI_UNSUPPORTED ( 3 | (1UL << (BITS_PER_LONG-1))) 321da177e4SLinus Torvalds #define EFI_BAD_BUFFER_SIZE ( 4 | (1UL << (BITS_PER_LONG-1))) 331da177e4SLinus Torvalds #define EFI_BUFFER_TOO_SMALL ( 5 | (1UL << (BITS_PER_LONG-1))) 345d9db883SMatthew Garrett #define EFI_NOT_READY ( 6 | (1UL << (BITS_PER_LONG-1))) 355d9db883SMatthew Garrett #define EFI_DEVICE_ERROR ( 7 | (1UL << (BITS_PER_LONG-1))) 365d9db883SMatthew Garrett #define EFI_WRITE_PROTECTED ( 8 | (1UL << (BITS_PER_LONG-1))) 375d9db883SMatthew Garrett #define EFI_OUT_OF_RESOURCES ( 9 | (1UL << (BITS_PER_LONG-1))) 381da177e4SLinus Torvalds #define EFI_NOT_FOUND (14 | (1UL << (BITS_PER_LONG-1))) 395d9db883SMatthew Garrett #define EFI_SECURITY_VIOLATION (26 | (1UL << (BITS_PER_LONG-1))) 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds typedef unsigned long efi_status_t; 421da177e4SLinus Torvalds typedef u8 efi_bool_t; 431da177e4SLinus Torvalds typedef u16 efi_char16_t; /* UNICODE character */ 44ed37ddffSRoy Franz typedef u64 efi_physical_addr_t; 45ed37ddffSRoy Franz typedef void *efi_handle_t; 461da177e4SLinus Torvalds 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds typedef struct { 491da177e4SLinus Torvalds u8 b[16]; 501da177e4SLinus Torvalds } efi_guid_t; 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \ 531da177e4SLinus Torvalds ((efi_guid_t) \ 541da177e4SLinus Torvalds {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \ 551da177e4SLinus Torvalds (b) & 0xff, ((b) >> 8) & 0xff, \ 561da177e4SLinus Torvalds (c) & 0xff, ((c) >> 8) & 0xff, \ 571da177e4SLinus Torvalds (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}) 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds /* 601da177e4SLinus Torvalds * Generic EFI table header 611da177e4SLinus Torvalds */ 621da177e4SLinus Torvalds typedef struct { 631da177e4SLinus Torvalds u64 signature; 641da177e4SLinus Torvalds u32 revision; 651da177e4SLinus Torvalds u32 headersize; 661da177e4SLinus Torvalds u32 crc32; 671da177e4SLinus Torvalds u32 reserved; 681da177e4SLinus Torvalds } efi_table_hdr_t; 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds /* 711da177e4SLinus Torvalds * Memory map descriptor: 721da177e4SLinus Torvalds */ 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds /* Memory types: */ 751da177e4SLinus Torvalds #define EFI_RESERVED_TYPE 0 761da177e4SLinus Torvalds #define EFI_LOADER_CODE 1 771da177e4SLinus Torvalds #define EFI_LOADER_DATA 2 781da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_CODE 3 791da177e4SLinus Torvalds #define EFI_BOOT_SERVICES_DATA 4 801da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_CODE 5 811da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_DATA 6 821da177e4SLinus Torvalds #define EFI_CONVENTIONAL_MEMORY 7 831da177e4SLinus Torvalds #define EFI_UNUSABLE_MEMORY 8 841da177e4SLinus Torvalds #define EFI_ACPI_RECLAIM_MEMORY 9 851da177e4SLinus Torvalds #define EFI_ACPI_MEMORY_NVS 10 861da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO 11 871da177e4SLinus Torvalds #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 881da177e4SLinus Torvalds #define EFI_PAL_CODE 13 89ad5fb870SDan Williams #define EFI_PERSISTENT_MEMORY 14 90ad5fb870SDan Williams #define EFI_MAX_MEMORY_TYPE 15 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds /* Attribute values: */ 931da177e4SLinus Torvalds #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */ 941da177e4SLinus Torvalds #define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */ 951da177e4SLinus Torvalds #define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */ 961da177e4SLinus Torvalds #define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */ 979c97e0bdSLaszlo Ersek #define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL) /* uncached, exported */ 981da177e4SLinus Torvalds #define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */ 991da177e4SLinus Torvalds #define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */ 1001da177e4SLinus Torvalds #define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */ 101c016ca08SRobert Elliott #define EFI_MEMORY_NV ((u64)0x0000000000008000ULL) /* non-volatile */ 102b05b9f5fSTony Luck #define EFI_MEMORY_MORE_RELIABLE \ 103b05b9f5fSTony Luck ((u64)0x0000000000010000ULL) /* higher reliability */ 10487db73aeSArd Biesheuvel #define EFI_MEMORY_RO ((u64)0x0000000000020000ULL) /* read-only */ 1051da177e4SLinus Torvalds #define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */ 1061da177e4SLinus Torvalds #define EFI_MEMORY_DESCRIPTOR_VERSION 1 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds #define EFI_PAGE_SHIFT 12 109ed37ddffSRoy Franz #define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) 1101da177e4SLinus Torvalds 1111da177e4SLinus Torvalds typedef struct { 1121da177e4SLinus Torvalds u32 type; 1131da177e4SLinus Torvalds u32 pad; 1141da177e4SLinus Torvalds u64 phys_addr; 1151da177e4SLinus Torvalds u64 virt_addr; 1161da177e4SLinus Torvalds u64 num_pages; 1171da177e4SLinus Torvalds u64 attribute; 1181da177e4SLinus Torvalds } efi_memory_desc_t; 1191da177e4SLinus Torvalds 1203b370237SMatthew Garrett typedef struct { 1213b370237SMatthew Garrett efi_guid_t guid; 1223b370237SMatthew Garrett u32 headersize; 1233b370237SMatthew Garrett u32 flags; 1243b370237SMatthew Garrett u32 imagesize; 1253b370237SMatthew Garrett } efi_capsule_header_t; 1263b370237SMatthew Garrett 127bb05e4baSMatt Fleming /* 128bb05e4baSMatt Fleming * Allocation types for calls to boottime->allocate_pages. 129bb05e4baSMatt Fleming */ 130bb05e4baSMatt Fleming #define EFI_ALLOCATE_ANY_PAGES 0 131bb05e4baSMatt Fleming #define EFI_ALLOCATE_MAX_ADDRESS 1 132bb05e4baSMatt Fleming #define EFI_ALLOCATE_ADDRESS 2 133bb05e4baSMatt Fleming #define EFI_MAX_ALLOCATE_TYPE 3 134bb05e4baSMatt Fleming 135e088a4adSMatthew Wilcox typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg); 1361da177e4SLinus Torvalds 1371da177e4SLinus Torvalds /* 1381da177e4SLinus Torvalds * Types and defines for Time Services 1391da177e4SLinus Torvalds */ 1401da177e4SLinus Torvalds #define EFI_TIME_ADJUST_DAYLIGHT 0x1 1411da177e4SLinus Torvalds #define EFI_TIME_IN_DAYLIGHT 0x2 1421da177e4SLinus Torvalds #define EFI_UNSPECIFIED_TIMEZONE 0x07ff 1431da177e4SLinus Torvalds 1441da177e4SLinus Torvalds typedef struct { 1451da177e4SLinus Torvalds u16 year; 1461da177e4SLinus Torvalds u8 month; 1471da177e4SLinus Torvalds u8 day; 1481da177e4SLinus Torvalds u8 hour; 1491da177e4SLinus Torvalds u8 minute; 1501da177e4SLinus Torvalds u8 second; 1511da177e4SLinus Torvalds u8 pad1; 1521da177e4SLinus Torvalds u32 nanosecond; 1531da177e4SLinus Torvalds s16 timezone; 1541da177e4SLinus Torvalds u8 daylight; 1551da177e4SLinus Torvalds u8 pad2; 1561da177e4SLinus Torvalds } efi_time_t; 1571da177e4SLinus Torvalds 1581da177e4SLinus Torvalds typedef struct { 1591da177e4SLinus Torvalds u32 resolution; 1601da177e4SLinus Torvalds u32 accuracy; 1611da177e4SLinus Torvalds u8 sets_to_zero; 1621da177e4SLinus Torvalds } efi_time_cap_t; 1631da177e4SLinus Torvalds 164677703ceSMatt Fleming typedef struct { 165677703ceSMatt Fleming efi_table_hdr_t hdr; 166677703ceSMatt Fleming u32 raise_tpl; 167677703ceSMatt Fleming u32 restore_tpl; 168677703ceSMatt Fleming u32 allocate_pages; 169677703ceSMatt Fleming u32 free_pages; 170677703ceSMatt Fleming u32 get_memory_map; 171677703ceSMatt Fleming u32 allocate_pool; 172677703ceSMatt Fleming u32 free_pool; 173677703ceSMatt Fleming u32 create_event; 174677703ceSMatt Fleming u32 set_timer; 175677703ceSMatt Fleming u32 wait_for_event; 176677703ceSMatt Fleming u32 signal_event; 177677703ceSMatt Fleming u32 close_event; 178677703ceSMatt Fleming u32 check_event; 179677703ceSMatt Fleming u32 install_protocol_interface; 180677703ceSMatt Fleming u32 reinstall_protocol_interface; 181677703ceSMatt Fleming u32 uninstall_protocol_interface; 182677703ceSMatt Fleming u32 handle_protocol; 183677703ceSMatt Fleming u32 __reserved; 184677703ceSMatt Fleming u32 register_protocol_notify; 185677703ceSMatt Fleming u32 locate_handle; 186677703ceSMatt Fleming u32 locate_device_path; 187677703ceSMatt Fleming u32 install_configuration_table; 188677703ceSMatt Fleming u32 load_image; 189677703ceSMatt Fleming u32 start_image; 190677703ceSMatt Fleming u32 exit; 191677703ceSMatt Fleming u32 unload_image; 192677703ceSMatt Fleming u32 exit_boot_services; 193677703ceSMatt Fleming u32 get_next_monotonic_count; 194677703ceSMatt Fleming u32 stall; 195677703ceSMatt Fleming u32 set_watchdog_timer; 196677703ceSMatt Fleming u32 connect_controller; 197677703ceSMatt Fleming u32 disconnect_controller; 198677703ceSMatt Fleming u32 open_protocol; 199677703ceSMatt Fleming u32 close_protocol; 200677703ceSMatt Fleming u32 open_protocol_information; 201677703ceSMatt Fleming u32 protocols_per_handle; 202677703ceSMatt Fleming u32 locate_handle_buffer; 203677703ceSMatt Fleming u32 locate_protocol; 204677703ceSMatt Fleming u32 install_multiple_protocol_interfaces; 205677703ceSMatt Fleming u32 uninstall_multiple_protocol_interfaces; 206677703ceSMatt Fleming u32 calculate_crc32; 207677703ceSMatt Fleming u32 copy_mem; 208677703ceSMatt Fleming u32 set_mem; 209677703ceSMatt Fleming u32 create_event_ex; 210677703ceSMatt Fleming } __packed efi_boot_services_32_t; 211677703ceSMatt Fleming 212677703ceSMatt Fleming typedef struct { 213677703ceSMatt Fleming efi_table_hdr_t hdr; 214677703ceSMatt Fleming u64 raise_tpl; 215677703ceSMatt Fleming u64 restore_tpl; 216677703ceSMatt Fleming u64 allocate_pages; 217677703ceSMatt Fleming u64 free_pages; 218677703ceSMatt Fleming u64 get_memory_map; 219677703ceSMatt Fleming u64 allocate_pool; 220677703ceSMatt Fleming u64 free_pool; 221677703ceSMatt Fleming u64 create_event; 222677703ceSMatt Fleming u64 set_timer; 223677703ceSMatt Fleming u64 wait_for_event; 224677703ceSMatt Fleming u64 signal_event; 225677703ceSMatt Fleming u64 close_event; 226677703ceSMatt Fleming u64 check_event; 227677703ceSMatt Fleming u64 install_protocol_interface; 228677703ceSMatt Fleming u64 reinstall_protocol_interface; 229677703ceSMatt Fleming u64 uninstall_protocol_interface; 230677703ceSMatt Fleming u64 handle_protocol; 231677703ceSMatt Fleming u64 __reserved; 232677703ceSMatt Fleming u64 register_protocol_notify; 233677703ceSMatt Fleming u64 locate_handle; 234677703ceSMatt Fleming u64 locate_device_path; 235677703ceSMatt Fleming u64 install_configuration_table; 236677703ceSMatt Fleming u64 load_image; 237677703ceSMatt Fleming u64 start_image; 238677703ceSMatt Fleming u64 exit; 239677703ceSMatt Fleming u64 unload_image; 240677703ceSMatt Fleming u64 exit_boot_services; 241677703ceSMatt Fleming u64 get_next_monotonic_count; 242677703ceSMatt Fleming u64 stall; 243677703ceSMatt Fleming u64 set_watchdog_timer; 244677703ceSMatt Fleming u64 connect_controller; 245677703ceSMatt Fleming u64 disconnect_controller; 246677703ceSMatt Fleming u64 open_protocol; 247677703ceSMatt Fleming u64 close_protocol; 248677703ceSMatt Fleming u64 open_protocol_information; 249677703ceSMatt Fleming u64 protocols_per_handle; 250677703ceSMatt Fleming u64 locate_handle_buffer; 251677703ceSMatt Fleming u64 locate_protocol; 252677703ceSMatt Fleming u64 install_multiple_protocol_interfaces; 253677703ceSMatt Fleming u64 uninstall_multiple_protocol_interfaces; 254677703ceSMatt Fleming u64 calculate_crc32; 255677703ceSMatt Fleming u64 copy_mem; 256677703ceSMatt Fleming u64 set_mem; 257677703ceSMatt Fleming u64 create_event_ex; 258677703ceSMatt Fleming } __packed efi_boot_services_64_t; 259677703ceSMatt Fleming 2601da177e4SLinus Torvalds /* 261f30ca6baSMatt Fleming * EFI Boot Services table 262f30ca6baSMatt Fleming */ 263f30ca6baSMatt Fleming typedef struct { 264f30ca6baSMatt Fleming efi_table_hdr_t hdr; 265f30ca6baSMatt Fleming void *raise_tpl; 266f30ca6baSMatt Fleming void *restore_tpl; 267ed37ddffSRoy Franz efi_status_t (*allocate_pages)(int, int, unsigned long, 268ed37ddffSRoy Franz efi_physical_addr_t *); 269ed37ddffSRoy Franz efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long); 270ed37ddffSRoy Franz efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *, 271ed37ddffSRoy Franz unsigned long *, u32 *); 272ed37ddffSRoy Franz efi_status_t (*allocate_pool)(int, unsigned long, void **); 273ed37ddffSRoy Franz efi_status_t (*free_pool)(void *); 274f30ca6baSMatt Fleming void *create_event; 275f30ca6baSMatt Fleming void *set_timer; 276f30ca6baSMatt Fleming void *wait_for_event; 277f30ca6baSMatt Fleming void *signal_event; 278f30ca6baSMatt Fleming void *close_event; 279f30ca6baSMatt Fleming void *check_event; 280f30ca6baSMatt Fleming void *install_protocol_interface; 281f30ca6baSMatt Fleming void *reinstall_protocol_interface; 282f30ca6baSMatt Fleming void *uninstall_protocol_interface; 283ed37ddffSRoy Franz efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **); 284f30ca6baSMatt Fleming void *__reserved; 285f30ca6baSMatt Fleming void *register_protocol_notify; 286f30ca6baSMatt Fleming void *locate_handle; 287f30ca6baSMatt Fleming void *locate_device_path; 288f30ca6baSMatt Fleming void *install_configuration_table; 289f30ca6baSMatt Fleming void *load_image; 290f30ca6baSMatt Fleming void *start_image; 291f30ca6baSMatt Fleming void *exit; 292f30ca6baSMatt Fleming void *unload_image; 293ed37ddffSRoy Franz efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long); 294f30ca6baSMatt Fleming void *get_next_monotonic_count; 295f30ca6baSMatt Fleming void *stall; 296f30ca6baSMatt Fleming void *set_watchdog_timer; 297f30ca6baSMatt Fleming void *connect_controller; 298f30ca6baSMatt Fleming void *disconnect_controller; 299f30ca6baSMatt Fleming void *open_protocol; 300f30ca6baSMatt Fleming void *close_protocol; 301f30ca6baSMatt Fleming void *open_protocol_information; 302f30ca6baSMatt Fleming void *protocols_per_handle; 303f30ca6baSMatt Fleming void *locate_handle_buffer; 304e4fbf476SArd Biesheuvel efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **); 305f30ca6baSMatt Fleming void *install_multiple_protocol_interfaces; 306f30ca6baSMatt Fleming void *uninstall_multiple_protocol_interfaces; 307f30ca6baSMatt Fleming void *calculate_crc32; 308f30ca6baSMatt Fleming void *copy_mem; 309f30ca6baSMatt Fleming void *set_mem; 310f30ca6baSMatt Fleming void *create_event_ex; 311f30ca6baSMatt Fleming } efi_boot_services_t; 312f30ca6baSMatt Fleming 313dd5fc854SMatthew Garrett typedef enum { 314dd5fc854SMatthew Garrett EfiPciIoWidthUint8, 315dd5fc854SMatthew Garrett EfiPciIoWidthUint16, 316dd5fc854SMatthew Garrett EfiPciIoWidthUint32, 317dd5fc854SMatthew Garrett EfiPciIoWidthUint64, 318dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint8, 319dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint16, 320dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint32, 321dd5fc854SMatthew Garrett EfiPciIoWidthFifoUint64, 322dd5fc854SMatthew Garrett EfiPciIoWidthFillUint8, 323dd5fc854SMatthew Garrett EfiPciIoWidthFillUint16, 324dd5fc854SMatthew Garrett EfiPciIoWidthFillUint32, 325dd5fc854SMatthew Garrett EfiPciIoWidthFillUint64, 326dd5fc854SMatthew Garrett EfiPciIoWidthMaximum 327dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_WIDTH; 328dd5fc854SMatthew Garrett 329dd5fc854SMatthew Garrett typedef enum { 330dd5fc854SMatthew Garrett EfiPciIoAttributeOperationGet, 331dd5fc854SMatthew Garrett EfiPciIoAttributeOperationSet, 332dd5fc854SMatthew Garrett EfiPciIoAttributeOperationEnable, 333dd5fc854SMatthew Garrett EfiPciIoAttributeOperationDisable, 334dd5fc854SMatthew Garrett EfiPciIoAttributeOperationSupported, 335dd5fc854SMatthew Garrett EfiPciIoAttributeOperationMaximum 336dd5fc854SMatthew Garrett } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION; 337dd5fc854SMatthew Garrett 338677703ceSMatt Fleming typedef struct { 339677703ceSMatt Fleming u32 read; 340677703ceSMatt Fleming u32 write; 341677703ceSMatt Fleming } efi_pci_io_protocol_access_32_t; 342677703ceSMatt Fleming 343677703ceSMatt Fleming typedef struct { 344677703ceSMatt Fleming u64 read; 345677703ceSMatt Fleming u64 write; 346677703ceSMatt Fleming } efi_pci_io_protocol_access_64_t; 347dd5fc854SMatthew Garrett 348dd5fc854SMatthew Garrett typedef struct { 349dd5fc854SMatthew Garrett void *read; 350dd5fc854SMatthew Garrett void *write; 351dd5fc854SMatthew Garrett } efi_pci_io_protocol_access_t; 352dd5fc854SMatthew Garrett 353dd5fc854SMatthew Garrett typedef struct { 354677703ceSMatt Fleming u32 poll_mem; 355677703ceSMatt Fleming u32 poll_io; 356677703ceSMatt Fleming efi_pci_io_protocol_access_32_t mem; 357677703ceSMatt Fleming efi_pci_io_protocol_access_32_t io; 358677703ceSMatt Fleming efi_pci_io_protocol_access_32_t pci; 359677703ceSMatt Fleming u32 copy_mem; 360677703ceSMatt Fleming u32 map; 361677703ceSMatt Fleming u32 unmap; 362677703ceSMatt Fleming u32 allocate_buffer; 363677703ceSMatt Fleming u32 free_buffer; 364677703ceSMatt Fleming u32 flush; 365677703ceSMatt Fleming u32 get_location; 366677703ceSMatt Fleming u32 attributes; 367677703ceSMatt Fleming u32 get_bar_attributes; 368677703ceSMatt Fleming u32 set_bar_attributes; 369677703ceSMatt Fleming uint64_t romsize; 370677703ceSMatt Fleming void *romimage; 371677703ceSMatt Fleming } efi_pci_io_protocol_32; 372677703ceSMatt Fleming 373677703ceSMatt Fleming typedef struct { 374677703ceSMatt Fleming u64 poll_mem; 375677703ceSMatt Fleming u64 poll_io; 376677703ceSMatt Fleming efi_pci_io_protocol_access_64_t mem; 377677703ceSMatt Fleming efi_pci_io_protocol_access_64_t io; 378677703ceSMatt Fleming efi_pci_io_protocol_access_64_t pci; 379677703ceSMatt Fleming u64 copy_mem; 380677703ceSMatt Fleming u64 map; 381677703ceSMatt Fleming u64 unmap; 382677703ceSMatt Fleming u64 allocate_buffer; 383677703ceSMatt Fleming u64 free_buffer; 384677703ceSMatt Fleming u64 flush; 385677703ceSMatt Fleming u64 get_location; 386677703ceSMatt Fleming u64 attributes; 387677703ceSMatt Fleming u64 get_bar_attributes; 388677703ceSMatt Fleming u64 set_bar_attributes; 389677703ceSMatt Fleming uint64_t romsize; 390677703ceSMatt Fleming void *romimage; 391677703ceSMatt Fleming } efi_pci_io_protocol_64; 392677703ceSMatt Fleming 393677703ceSMatt Fleming typedef struct { 394dd5fc854SMatthew Garrett void *poll_mem; 395dd5fc854SMatthew Garrett void *poll_io; 396dd5fc854SMatthew Garrett efi_pci_io_protocol_access_t mem; 397dd5fc854SMatthew Garrett efi_pci_io_protocol_access_t io; 398dd5fc854SMatthew Garrett efi_pci_io_protocol_access_t pci; 399dd5fc854SMatthew Garrett void *copy_mem; 400dd5fc854SMatthew Garrett void *map; 401dd5fc854SMatthew Garrett void *unmap; 402dd5fc854SMatthew Garrett void *allocate_buffer; 403dd5fc854SMatthew Garrett void *free_buffer; 404dd5fc854SMatthew Garrett void *flush; 405dd5fc854SMatthew Garrett void *get_location; 406dd5fc854SMatthew Garrett void *attributes; 407dd5fc854SMatthew Garrett void *get_bar_attributes; 408dd5fc854SMatthew Garrett void *set_bar_attributes; 409dd5fc854SMatthew Garrett uint64_t romsize; 410dd5fc854SMatthew Garrett void *romimage; 411dd5fc854SMatthew Garrett } efi_pci_io_protocol; 412dd5fc854SMatthew Garrett 413dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001 414dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002 415dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004 416dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008 417dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010 418dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020 419dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040 420dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080 421dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_IO 0x0100 422dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200 423dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400 424dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800 425dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000 426dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000 427dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000 428dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 429dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000 430dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 431dd5fc854SMatthew Garrett #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000 432dd5fc854SMatthew Garrett 433f30ca6baSMatt Fleming /* 4341da177e4SLinus Torvalds * Types and defines for EFI ResetSystem 4351da177e4SLinus Torvalds */ 4361da177e4SLinus Torvalds #define EFI_RESET_COLD 0 4371da177e4SLinus Torvalds #define EFI_RESET_WARM 1 4381da177e4SLinus Torvalds #define EFI_RESET_SHUTDOWN 2 4391da177e4SLinus Torvalds 4401da177e4SLinus Torvalds /* 4411da177e4SLinus Torvalds * EFI Runtime Services table 4421da177e4SLinus Torvalds */ 4431da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL) 4441da177e4SLinus Torvalds #define EFI_RUNTIME_SERVICES_REVISION 0x00010000 4451da177e4SLinus Torvalds 4461da177e4SLinus Torvalds typedef struct { 4471da177e4SLinus Torvalds efi_table_hdr_t hdr; 448677703ceSMatt Fleming u32 get_time; 449677703ceSMatt Fleming u32 set_time; 450677703ceSMatt Fleming u32 get_wakeup_time; 451677703ceSMatt Fleming u32 set_wakeup_time; 452677703ceSMatt Fleming u32 set_virtual_address_map; 453677703ceSMatt Fleming u32 convert_pointer; 454677703ceSMatt Fleming u32 get_variable; 455677703ceSMatt Fleming u32 get_next_variable; 456677703ceSMatt Fleming u32 set_variable; 457677703ceSMatt Fleming u32 get_next_high_mono_count; 458677703ceSMatt Fleming u32 reset_system; 459677703ceSMatt Fleming u32 update_capsule; 460677703ceSMatt Fleming u32 query_capsule_caps; 461677703ceSMatt Fleming u32 query_variable_info; 462677703ceSMatt Fleming } efi_runtime_services_32_t; 463677703ceSMatt Fleming 464677703ceSMatt Fleming typedef struct { 465677703ceSMatt Fleming efi_table_hdr_t hdr; 466677703ceSMatt Fleming u64 get_time; 467677703ceSMatt Fleming u64 set_time; 468677703ceSMatt Fleming u64 get_wakeup_time; 469677703ceSMatt Fleming u64 set_wakeup_time; 470677703ceSMatt Fleming u64 set_virtual_address_map; 471677703ceSMatt Fleming u64 convert_pointer; 472677703ceSMatt Fleming u64 get_variable; 473677703ceSMatt Fleming u64 get_next_variable; 474677703ceSMatt Fleming u64 set_variable; 475677703ceSMatt Fleming u64 get_next_high_mono_count; 476677703ceSMatt Fleming u64 reset_system; 477677703ceSMatt Fleming u64 update_capsule; 478677703ceSMatt Fleming u64 query_capsule_caps; 479677703ceSMatt Fleming u64 query_variable_info; 480677703ceSMatt Fleming } efi_runtime_services_64_t; 481677703ceSMatt Fleming 482677703ceSMatt Fleming typedef struct { 483677703ceSMatt Fleming efi_table_hdr_t hdr; 48443ab0476SBorislav Petkov void *get_time; 48543ab0476SBorislav Petkov void *set_time; 48643ab0476SBorislav Petkov void *get_wakeup_time; 48743ab0476SBorislav Petkov void *set_wakeup_time; 48843ab0476SBorislav Petkov void *set_virtual_address_map; 48943ab0476SBorislav Petkov void *convert_pointer; 49043ab0476SBorislav Petkov void *get_variable; 49143ab0476SBorislav Petkov void *get_next_variable; 49243ab0476SBorislav Petkov void *set_variable; 49343ab0476SBorislav Petkov void *get_next_high_mono_count; 49443ab0476SBorislav Petkov void *reset_system; 49543ab0476SBorislav Petkov void *update_capsule; 49643ab0476SBorislav Petkov void *query_capsule_caps; 49743ab0476SBorislav Petkov void *query_variable_info; 4981da177e4SLinus Torvalds } efi_runtime_services_t; 4991da177e4SLinus Torvalds 5001da177e4SLinus Torvalds typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc); 5011da177e4SLinus Torvalds typedef efi_status_t efi_set_time_t (efi_time_t *tm); 5021da177e4SLinus Torvalds typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending, 5031da177e4SLinus Torvalds efi_time_t *tm); 5041da177e4SLinus Torvalds typedef efi_status_t efi_set_wakeup_time_t (efi_bool_t enabled, efi_time_t *tm); 5051da177e4SLinus Torvalds typedef efi_status_t efi_get_variable_t (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, 5061da177e4SLinus Torvalds unsigned long *data_size, void *data); 5071da177e4SLinus Torvalds typedef efi_status_t efi_get_next_variable_t (unsigned long *name_size, efi_char16_t *name, 5081da177e4SLinus Torvalds efi_guid_t *vendor); 5091da177e4SLinus Torvalds typedef efi_status_t efi_set_variable_t (efi_char16_t *name, efi_guid_t *vendor, 510f7a2d73fSMatthew Garrett u32 attr, unsigned long data_size, 5111da177e4SLinus Torvalds void *data); 5121da177e4SLinus Torvalds typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count); 5131da177e4SLinus Torvalds typedef void efi_reset_system_t (int reset_type, efi_status_t status, 5141da177e4SLinus Torvalds unsigned long data_size, efi_char16_t *data); 5151da177e4SLinus Torvalds typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size, 5161da177e4SLinus Torvalds unsigned long descriptor_size, 5171da177e4SLinus Torvalds u32 descriptor_version, 5181da177e4SLinus Torvalds efi_memory_desc_t *virtual_map); 5193b370237SMatthew Garrett typedef efi_status_t efi_query_variable_info_t(u32 attr, 5203b370237SMatthew Garrett u64 *storage_space, 5213b370237SMatthew Garrett u64 *remaining_space, 5223b370237SMatthew Garrett u64 *max_variable_size); 5233b370237SMatthew Garrett typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **capsules, 5243b370237SMatthew Garrett unsigned long count, 5253b370237SMatthew Garrett unsigned long sg_list); 5263b370237SMatthew Garrett typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules, 5273b370237SMatthew Garrett unsigned long count, 5283b370237SMatthew Garrett u64 *max_size, 5293b370237SMatthew Garrett int *reset_type); 530ca0e30dcSArd Biesheuvel typedef efi_status_t efi_query_variable_store_t(u32 attributes, 531ca0e30dcSArd Biesheuvel unsigned long size, 532ca0e30dcSArd Biesheuvel bool nonblocking); 5331da177e4SLinus Torvalds 534022ee6c5SArd Biesheuvel void efi_native_runtime_setup(void); 535022ee6c5SArd Biesheuvel 5361da177e4SLinus Torvalds /* 5371da177e4SLinus Torvalds * EFI Configuration Table and GUID definitions 5381da177e4SLinus Torvalds */ 5391da177e4SLinus Torvalds #define NULL_GUID \ 540662b1d89SPeter Jones EFI_GUID(0x00000000, 0x0000, 0x0000, \ 541662b1d89SPeter Jones 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 5421da177e4SLinus Torvalds 5431da177e4SLinus Torvalds #define MPS_TABLE_GUID \ 544662b1d89SPeter Jones EFI_GUID(0xeb9d2d2f, 0x2d88, 0x11d3, \ 545662b1d89SPeter Jones 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5461da177e4SLinus Torvalds 5471da177e4SLinus Torvalds #define ACPI_TABLE_GUID \ 548662b1d89SPeter Jones EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, \ 549662b1d89SPeter Jones 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5501da177e4SLinus Torvalds 5511da177e4SLinus Torvalds #define ACPI_20_TABLE_GUID \ 552662b1d89SPeter Jones EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \ 553662b1d89SPeter Jones 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81) 5541da177e4SLinus Torvalds 5551da177e4SLinus Torvalds #define SMBIOS_TABLE_GUID \ 556662b1d89SPeter Jones EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3, \ 557662b1d89SPeter Jones 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5581da177e4SLinus Torvalds 559e1ccbbc9SArd Biesheuvel #define SMBIOS3_TABLE_GUID \ 560662b1d89SPeter Jones EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c, \ 561662b1d89SPeter Jones 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94) 562e1ccbbc9SArd Biesheuvel 5631da177e4SLinus Torvalds #define SAL_SYSTEM_TABLE_GUID \ 564662b1d89SPeter Jones EFI_GUID(0xeb9d2d32, 0x2d88, 0x11d3, \ 565662b1d89SPeter Jones 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 5661da177e4SLinus Torvalds 5671da177e4SLinus Torvalds #define HCDP_TABLE_GUID \ 568662b1d89SPeter Jones EFI_GUID(0xf951938d, 0x620b, 0x42ef, \ 569662b1d89SPeter Jones 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98) 5701da177e4SLinus Torvalds 5711da177e4SLinus Torvalds #define UGA_IO_PROTOCOL_GUID \ 572662b1d89SPeter Jones EFI_GUID(0x61a4d49e, 0x6f68, 0x4f1b, \ 573662b1d89SPeter Jones 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2) 5741da177e4SLinus Torvalds 5751da177e4SLinus Torvalds #define EFI_GLOBAL_VARIABLE_GUID \ 576662b1d89SPeter Jones EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, \ 577662b1d89SPeter Jones 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c) 5781da177e4SLinus Torvalds 579a50f70b1SRuss Anderson #define UV_SYSTEM_TABLE_GUID \ 580662b1d89SPeter Jones EFI_GUID(0x3b13a7d4, 0x633e, 0x11dd, \ 581662b1d89SPeter Jones 0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93) 582a50f70b1SRuss Anderson 5835ee9c198SMatthew Garrett #define LINUX_EFI_CRASH_GUID \ 584662b1d89SPeter Jones EFI_GUID(0xcfc8fc79, 0xbe2e, 0x4ddc, \ 585662b1d89SPeter Jones 0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0) 5865ee9c198SMatthew Garrett 5878e84f345SMatt Fleming #define LOADED_IMAGE_PROTOCOL_GUID \ 588662b1d89SPeter Jones EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \ 589662b1d89SPeter Jones 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 5908e84f345SMatt Fleming 5910f7c5d47SMatt Fleming #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \ 592662b1d89SPeter Jones EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \ 593662b1d89SPeter Jones 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a) 5940f7c5d47SMatt Fleming 5950f7c5d47SMatt Fleming #define EFI_UGA_PROTOCOL_GUID \ 596662b1d89SPeter Jones EFI_GUID(0x982c298b, 0xf4fa, 0x41cb, \ 597662b1d89SPeter Jones 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39) 5980f7c5d47SMatt Fleming 5990f7c5d47SMatt Fleming #define EFI_PCI_IO_PROTOCOL_GUID \ 600662b1d89SPeter Jones EFI_GUID(0x4cf5b200, 0x68b8, 0x4ca5, \ 601662b1d89SPeter Jones 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a) 6020f7c5d47SMatt Fleming 60355839d51SMatt Fleming #define EFI_FILE_INFO_ID \ 604662b1d89SPeter Jones EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, \ 605662b1d89SPeter Jones 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 60655839d51SMatt Fleming 6070bb54905SPeter Jones #define EFI_SYSTEM_RESOURCE_TABLE_GUID \ 608662b1d89SPeter Jones EFI_GUID(0xb122a263, 0x3661, 0x4f68, \ 609662b1d89SPeter Jones 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80) 6100bb54905SPeter Jones 61155839d51SMatt Fleming #define EFI_FILE_SYSTEM_GUID \ 612662b1d89SPeter Jones EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \ 613662b1d89SPeter Jones 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 61455839d51SMatt Fleming 615263b4a30SRoy Franz #define DEVICE_TREE_GUID \ 616662b1d89SPeter Jones EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \ 617662b1d89SPeter Jones 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0) 618263b4a30SRoy Franz 619bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_GUID \ 620662b1d89SPeter Jones EFI_GUID(0x880aaca3, 0x4adc, 0x4a04, \ 621662b1d89SPeter Jones 0x90, 0x79, 0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5) 622bf924863SArd Biesheuvel 623e4fbf476SArd Biesheuvel #define EFI_RNG_PROTOCOL_GUID \ 624e4fbf476SArd Biesheuvel EFI_GUID(0x3152bca5, 0xeade, 0x433d, \ 625e4fbf476SArd Biesheuvel 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44) 626e4fbf476SArd Biesheuvel 627a604af07SArd Biesheuvel #define EFI_MEMORY_ATTRIBUTES_TABLE_GUID \ 628a604af07SArd Biesheuvel EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, \ 629a604af07SArd Biesheuvel 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20) 630a604af07SArd Biesheuvel 6311da177e4SLinus Torvalds typedef struct { 6321da177e4SLinus Torvalds efi_guid_t guid; 6331adbfa35SOlof Johansson u64 table; 6341adbfa35SOlof Johansson } efi_config_table_64_t; 6351adbfa35SOlof Johansson 6361adbfa35SOlof Johansson typedef struct { 6371adbfa35SOlof Johansson efi_guid_t guid; 6381adbfa35SOlof Johansson u32 table; 6391adbfa35SOlof Johansson } efi_config_table_32_t; 6401adbfa35SOlof Johansson 6411adbfa35SOlof Johansson typedef struct { 6421adbfa35SOlof Johansson efi_guid_t guid; 6431da177e4SLinus Torvalds unsigned long table; 6441da177e4SLinus Torvalds } efi_config_table_t; 6451da177e4SLinus Torvalds 646272686bfSLeif Lindholm typedef struct { 647272686bfSLeif Lindholm efi_guid_t guid; 648272686bfSLeif Lindholm const char *name; 649272686bfSLeif Lindholm unsigned long *ptr; 650272686bfSLeif Lindholm } efi_config_table_type_t; 651272686bfSLeif Lindholm 6521da177e4SLinus Torvalds #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) 6531da177e4SLinus Torvalds 6543b370237SMatthew Garrett #define EFI_2_30_SYSTEM_TABLE_REVISION ((2 << 16) | (30)) 6553b370237SMatthew Garrett #define EFI_2_20_SYSTEM_TABLE_REVISION ((2 << 16) | (20)) 6563b370237SMatthew Garrett #define EFI_2_10_SYSTEM_TABLE_REVISION ((2 << 16) | (10)) 6573b370237SMatthew Garrett #define EFI_2_00_SYSTEM_TABLE_REVISION ((2 << 16) | (00)) 6583b370237SMatthew Garrett #define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10)) 6593b370237SMatthew Garrett #define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02)) 6603b370237SMatthew Garrett 6611da177e4SLinus Torvalds typedef struct { 6621da177e4SLinus Torvalds efi_table_hdr_t hdr; 6631adbfa35SOlof Johansson u64 fw_vendor; /* physical addr of CHAR16 vendor string */ 6641adbfa35SOlof Johansson u32 fw_revision; 6651adbfa35SOlof Johansson u32 __pad1; 6661adbfa35SOlof Johansson u64 con_in_handle; 6671adbfa35SOlof Johansson u64 con_in; 6681adbfa35SOlof Johansson u64 con_out_handle; 6691adbfa35SOlof Johansson u64 con_out; 6701adbfa35SOlof Johansson u64 stderr_handle; 6711adbfa35SOlof Johansson u64 stderr; 6721adbfa35SOlof Johansson u64 runtime; 6731adbfa35SOlof Johansson u64 boottime; 6741adbfa35SOlof Johansson u32 nr_tables; 6751adbfa35SOlof Johansson u32 __pad2; 6761adbfa35SOlof Johansson u64 tables; 6771adbfa35SOlof Johansson } efi_system_table_64_t; 6781adbfa35SOlof Johansson 6791adbfa35SOlof Johansson typedef struct { 6801adbfa35SOlof Johansson efi_table_hdr_t hdr; 6811adbfa35SOlof Johansson u32 fw_vendor; /* physical addr of CHAR16 vendor string */ 6821adbfa35SOlof Johansson u32 fw_revision; 6831adbfa35SOlof Johansson u32 con_in_handle; 6841adbfa35SOlof Johansson u32 con_in; 6851adbfa35SOlof Johansson u32 con_out_handle; 6861adbfa35SOlof Johansson u32 con_out; 6871adbfa35SOlof Johansson u32 stderr_handle; 6881adbfa35SOlof Johansson u32 stderr; 6891adbfa35SOlof Johansson u32 runtime; 6901adbfa35SOlof Johansson u32 boottime; 6911adbfa35SOlof Johansson u32 nr_tables; 6921adbfa35SOlof Johansson u32 tables; 6931adbfa35SOlof Johansson } efi_system_table_32_t; 6941adbfa35SOlof Johansson 6951adbfa35SOlof Johansson typedef struct { 6961adbfa35SOlof Johansson efi_table_hdr_t hdr; 6971da177e4SLinus Torvalds unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ 6981da177e4SLinus Torvalds u32 fw_revision; 6991da177e4SLinus Torvalds unsigned long con_in_handle; 7001da177e4SLinus Torvalds unsigned long con_in; 7011da177e4SLinus Torvalds unsigned long con_out_handle; 7021da177e4SLinus Torvalds unsigned long con_out; 7031da177e4SLinus Torvalds unsigned long stderr_handle; 7041da177e4SLinus Torvalds unsigned long stderr; 7051da177e4SLinus Torvalds efi_runtime_services_t *runtime; 706f30ca6baSMatt Fleming efi_boot_services_t *boottime; 7071da177e4SLinus Torvalds unsigned long nr_tables; 7081da177e4SLinus Torvalds unsigned long tables; 7091da177e4SLinus Torvalds } efi_system_table_t; 7101da177e4SLinus Torvalds 7111da177e4SLinus Torvalds struct efi_memory_map { 71244511fb9SArd Biesheuvel phys_addr_t phys_map; 7137ae65fd3SMatt Tolentino void *map; 7147ae65fd3SMatt Tolentino void *map_end; 7151da177e4SLinus Torvalds int nr_map; 7161da177e4SLinus Torvalds unsigned long desc_version; 7177ae65fd3SMatt Tolentino unsigned long desc_size; 7181da177e4SLinus Torvalds }; 7191da177e4SLinus Torvalds 7200302f71cSMark Salter struct efi_fdt_params { 7210302f71cSMark Salter u64 system_table; 7220302f71cSMark Salter u64 mmap; 7230302f71cSMark Salter u32 mmap_size; 7240302f71cSMark Salter u32 desc_size; 7250302f71cSMark Salter u32 desc_ver; 7260302f71cSMark Salter }; 7270302f71cSMark Salter 7288e84f345SMatt Fleming typedef struct { 7298e84f345SMatt Fleming u32 revision; 730677703ceSMatt Fleming u32 parent_handle; 731677703ceSMatt Fleming u32 system_table; 732677703ceSMatt Fleming u32 device_handle; 733677703ceSMatt Fleming u32 file_path; 734677703ceSMatt Fleming u32 reserved; 735677703ceSMatt Fleming u32 load_options_size; 736677703ceSMatt Fleming u32 load_options; 737677703ceSMatt Fleming u32 image_base; 738677703ceSMatt Fleming __aligned_u64 image_size; 739677703ceSMatt Fleming unsigned int image_code_type; 740677703ceSMatt Fleming unsigned int image_data_type; 741677703ceSMatt Fleming unsigned long unload; 742677703ceSMatt Fleming } efi_loaded_image_32_t; 743677703ceSMatt Fleming 744677703ceSMatt Fleming typedef struct { 745677703ceSMatt Fleming u32 revision; 746677703ceSMatt Fleming u64 parent_handle; 747677703ceSMatt Fleming u64 system_table; 748677703ceSMatt Fleming u64 device_handle; 749677703ceSMatt Fleming u64 file_path; 750677703ceSMatt Fleming u64 reserved; 751677703ceSMatt Fleming u32 load_options_size; 752677703ceSMatt Fleming u64 load_options; 753677703ceSMatt Fleming u64 image_base; 754677703ceSMatt Fleming __aligned_u64 image_size; 755677703ceSMatt Fleming unsigned int image_code_type; 756677703ceSMatt Fleming unsigned int image_data_type; 757677703ceSMatt Fleming unsigned long unload; 758677703ceSMatt Fleming } efi_loaded_image_64_t; 759677703ceSMatt Fleming 760677703ceSMatt Fleming typedef struct { 761677703ceSMatt Fleming u32 revision; 7628e84f345SMatt Fleming void *parent_handle; 7638e84f345SMatt Fleming efi_system_table_t *system_table; 7648e84f345SMatt Fleming void *device_handle; 7658e84f345SMatt Fleming void *file_path; 7668e84f345SMatt Fleming void *reserved; 7678e84f345SMatt Fleming u32 load_options_size; 7688e84f345SMatt Fleming void *load_options; 7698e84f345SMatt Fleming void *image_base; 7708e84f345SMatt Fleming __aligned_u64 image_size; 7718e84f345SMatt Fleming unsigned int image_code_type; 7728e84f345SMatt Fleming unsigned int image_data_type; 7738e84f345SMatt Fleming unsigned long unload; 7748e84f345SMatt Fleming } efi_loaded_image_t; 7758e84f345SMatt Fleming 77655839d51SMatt Fleming 77755839d51SMatt Fleming typedef struct { 77855839d51SMatt Fleming u64 size; 77955839d51SMatt Fleming u64 file_size; 78055839d51SMatt Fleming u64 phys_size; 78155839d51SMatt Fleming efi_time_t create_time; 78255839d51SMatt Fleming efi_time_t last_access_time; 78355839d51SMatt Fleming efi_time_t modification_time; 78455839d51SMatt Fleming __aligned_u64 attribute; 78555839d51SMatt Fleming efi_char16_t filename[1]; 78655839d51SMatt Fleming } efi_file_info_t; 78755839d51SMatt Fleming 788677703ceSMatt Fleming typedef struct { 789677703ceSMatt Fleming u64 revision; 790677703ceSMatt Fleming u32 open; 791677703ceSMatt Fleming u32 close; 792677703ceSMatt Fleming u32 delete; 793677703ceSMatt Fleming u32 read; 794677703ceSMatt Fleming u32 write; 795677703ceSMatt Fleming u32 get_position; 796677703ceSMatt Fleming u32 set_position; 797677703ceSMatt Fleming u32 get_info; 798677703ceSMatt Fleming u32 set_info; 799677703ceSMatt Fleming u32 flush; 800677703ceSMatt Fleming } efi_file_handle_32_t; 801677703ceSMatt Fleming 802677703ceSMatt Fleming typedef struct { 803677703ceSMatt Fleming u64 revision; 804677703ceSMatt Fleming u64 open; 805677703ceSMatt Fleming u64 close; 806677703ceSMatt Fleming u64 delete; 807677703ceSMatt Fleming u64 read; 808677703ceSMatt Fleming u64 write; 809677703ceSMatt Fleming u64 get_position; 810677703ceSMatt Fleming u64 set_position; 811677703ceSMatt Fleming u64 get_info; 812677703ceSMatt Fleming u64 set_info; 813677703ceSMatt Fleming u64 flush; 814677703ceSMatt Fleming } efi_file_handle_64_t; 815677703ceSMatt Fleming 816ed37ddffSRoy Franz typedef struct _efi_file_handle { 81755839d51SMatt Fleming u64 revision; 818ed37ddffSRoy Franz efi_status_t (*open)(struct _efi_file_handle *, 819ed37ddffSRoy Franz struct _efi_file_handle **, 820ed37ddffSRoy Franz efi_char16_t *, u64, u64); 821ed37ddffSRoy Franz efi_status_t (*close)(struct _efi_file_handle *); 82255839d51SMatt Fleming void *delete; 823ed37ddffSRoy Franz efi_status_t (*read)(struct _efi_file_handle *, unsigned long *, 824ed37ddffSRoy Franz void *); 82555839d51SMatt Fleming void *write; 82655839d51SMatt Fleming void *get_position; 82755839d51SMatt Fleming void *set_position; 828ed37ddffSRoy Franz efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *, 829ed37ddffSRoy Franz unsigned long *, void *); 83055839d51SMatt Fleming void *set_info; 83155839d51SMatt Fleming void *flush; 83255839d51SMatt Fleming } efi_file_handle_t; 83355839d51SMatt Fleming 834ed37ddffSRoy Franz typedef struct _efi_file_io_interface { 835ed37ddffSRoy Franz u64 revision; 836ed37ddffSRoy Franz int (*open_volume)(struct _efi_file_io_interface *, 837ed37ddffSRoy Franz efi_file_handle_t **); 838ed37ddffSRoy Franz } efi_file_io_interface_t; 839ed37ddffSRoy Franz 84055839d51SMatt Fleming #define EFI_FILE_MODE_READ 0x0000000000000001 84155839d51SMatt Fleming #define EFI_FILE_MODE_WRITE 0x0000000000000002 84255839d51SMatt Fleming #define EFI_FILE_MODE_CREATE 0x8000000000000000 84355839d51SMatt Fleming 844bf924863SArd Biesheuvel typedef struct { 845bf924863SArd Biesheuvel u32 version; 846bf924863SArd Biesheuvel u32 length; 847bf924863SArd Biesheuvel u64 memory_protection_attribute; 848bf924863SArd Biesheuvel } efi_properties_table_t; 849bf924863SArd Biesheuvel 850bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_VERSION 0x00010000 851bf924863SArd Biesheuvel #define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA 0x1 852bf924863SArd Biesheuvel 853b2c99e3cSBjorn Helgaas #define EFI_INVALID_TABLE_ADDR (~0UL) 854b2c99e3cSBjorn Helgaas 855a604af07SArd Biesheuvel typedef struct { 856a604af07SArd Biesheuvel u32 version; 857a604af07SArd Biesheuvel u32 num_entries; 858a604af07SArd Biesheuvel u32 desc_size; 859a604af07SArd Biesheuvel u32 reserved; 860a604af07SArd Biesheuvel efi_memory_desc_t entry[0]; 861a604af07SArd Biesheuvel } efi_memory_attributes_table_t; 862a604af07SArd Biesheuvel 8631da177e4SLinus Torvalds /* 8641da177e4SLinus Torvalds * All runtime access to EFI goes through this structure: 8651da177e4SLinus Torvalds */ 8661da177e4SLinus Torvalds extern struct efi { 8671da177e4SLinus Torvalds efi_system_table_t *systab; /* EFI system table */ 8683b370237SMatthew Garrett unsigned int runtime_version; /* Runtime services version */ 869b2c99e3cSBjorn Helgaas unsigned long mps; /* MPS table */ 870b2c99e3cSBjorn Helgaas unsigned long acpi; /* ACPI table (IA64 ext 0.71) */ 871b2c99e3cSBjorn Helgaas unsigned long acpi20; /* ACPI table (ACPI 2.0) */ 872e1ccbbc9SArd Biesheuvel unsigned long smbios; /* SMBIOS table (32 bit entry point) */ 873e1ccbbc9SArd Biesheuvel unsigned long smbios3; /* SMBIOS table (64 bit entry point) */ 874b2c99e3cSBjorn Helgaas unsigned long sal_systab; /* SAL system table */ 875b2c99e3cSBjorn Helgaas unsigned long boot_info; /* boot info table */ 876b2c99e3cSBjorn Helgaas unsigned long hcdp; /* HCDP table */ 877b2c99e3cSBjorn Helgaas unsigned long uga; /* UGA table */ 878a50f70b1SRuss Anderson unsigned long uv_systab; /* UV system table */ 879a0998eb1SDave Young unsigned long fw_vendor; /* fw_vendor */ 880a0998eb1SDave Young unsigned long runtime; /* runtime table */ 881a0998eb1SDave Young unsigned long config_table; /* config tables */ 8820bb54905SPeter Jones unsigned long esrt; /* ESRT table */ 883bf924863SArd Biesheuvel unsigned long properties_table; /* properties table */ 884a604af07SArd Biesheuvel unsigned long mem_attr_table; /* memory attributes table */ 8851da177e4SLinus Torvalds efi_get_time_t *get_time; 8861da177e4SLinus Torvalds efi_set_time_t *set_time; 8871da177e4SLinus Torvalds efi_get_wakeup_time_t *get_wakeup_time; 8881da177e4SLinus Torvalds efi_set_wakeup_time_t *set_wakeup_time; 8891da177e4SLinus Torvalds efi_get_variable_t *get_variable; 8901da177e4SLinus Torvalds efi_get_next_variable_t *get_next_variable; 8911da177e4SLinus Torvalds efi_set_variable_t *set_variable; 89270d2a3cfSArd Biesheuvel efi_set_variable_t *set_variable_nonblocking; 8933b370237SMatthew Garrett efi_query_variable_info_t *query_variable_info; 894d3cac1f8SArd Biesheuvel efi_query_variable_info_t *query_variable_info_nonblocking; 8953b370237SMatthew Garrett efi_update_capsule_t *update_capsule; 8963b370237SMatthew Garrett efi_query_capsule_caps_t *query_capsule_caps; 8971da177e4SLinus Torvalds efi_get_next_high_mono_count_t *get_next_high_mono_count; 8981da177e4SLinus Torvalds efi_reset_system_t *reset_system; 8991da177e4SLinus Torvalds efi_set_virtual_address_map_t *set_virtual_address_map; 900884f4f66SMatt Fleming struct efi_memory_map memmap; 9013e909599SMatt Fleming unsigned long flags; 9021da177e4SLinus Torvalds } efi; 9031da177e4SLinus Torvalds 9041da177e4SLinus Torvalds static inline int 9051da177e4SLinus Torvalds efi_guidcmp (efi_guid_t left, efi_guid_t right) 9061da177e4SLinus Torvalds { 9071da177e4SLinus Torvalds return memcmp(&left, &right, sizeof (efi_guid_t)); 9081da177e4SLinus Torvalds } 9091da177e4SLinus Torvalds 9101da177e4SLinus Torvalds static inline char * 91126e02272SBorislav Petkov efi_guid_to_str(efi_guid_t *guid, char *out) 9121da177e4SLinus Torvalds { 913925ede0bSJoe Perches sprintf(out, "%pUl", guid->b); 9141da177e4SLinus Torvalds return out; 9151da177e4SLinus Torvalds } 9161da177e4SLinus Torvalds 9171da177e4SLinus Torvalds extern void efi_init (void); 9181da177e4SLinus Torvalds extern void *efi_get_pal_addr (void); 9191da177e4SLinus Torvalds extern void efi_map_pal_code (void); 9201da177e4SLinus Torvalds extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg); 9211da177e4SLinus Torvalds extern void efi_gettimeofday (struct timespec *ts); 9221da177e4SLinus Torvalds extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */ 92378510792SJosh Triplett #ifdef CONFIG_X86 9242223af38SJosh Triplett extern void efi_late_init(void); 92578510792SJosh Triplett extern void efi_free_boot_services(void); 926ca0e30dcSArd Biesheuvel extern efi_status_t efi_query_variable_store(u32 attributes, 927ca0e30dcSArd Biesheuvel unsigned long size, 928ca0e30dcSArd Biesheuvel bool nonblocking); 929b05b9f5fSTony Luck extern void efi_find_mirror(void); 93078510792SJosh Triplett #else 9312223af38SJosh Triplett static inline void efi_late_init(void) {} 93278510792SJosh Triplett static inline void efi_free_boot_services(void) {} 933a6e4d5a0SMatt Fleming 934ca0e30dcSArd Biesheuvel static inline efi_status_t efi_query_variable_store(u32 attributes, 935ca0e30dcSArd Biesheuvel unsigned long size, 936ca0e30dcSArd Biesheuvel bool nonblocking) 937a6e4d5a0SMatt Fleming { 938a6e4d5a0SMatt Fleming return EFI_SUCCESS; 939a6e4d5a0SMatt Fleming } 94078510792SJosh Triplett #endif 9417bc90e01SJosh Triplett extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr); 942272686bfSLeif Lindholm extern int efi_config_init(efi_config_table_type_t *arch_tables); 9433846c158SPeter Jones #ifdef CONFIG_EFI_ESRT 9440bb54905SPeter Jones extern void __init efi_esrt_init(void); 9453846c158SPeter Jones #else 9463846c158SPeter Jones static inline void efi_esrt_init(void) { } 9473846c158SPeter Jones #endif 9487bb68410SArd Biesheuvel extern int efi_config_parse_tables(void *config_tables, int count, int sz, 9497bb68410SArd Biesheuvel efi_config_table_type_t *arch_tables); 9501da177e4SLinus Torvalds extern u64 efi_get_iobase (void); 9511da177e4SLinus Torvalds extern u32 efi_mem_type (unsigned long phys_addr); 9521da177e4SLinus Torvalds extern u64 efi_mem_attributes (unsigned long phys_addr); 95332e62c63SBjorn Helgaas extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size); 9541da177e4SLinus Torvalds extern int __init efi_uart_console_only (void); 9550bb54905SPeter Jones extern u64 efi_mem_desc_end(efi_memory_desc_t *md); 9560bb54905SPeter Jones extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md); 9571da177e4SLinus Torvalds extern void efi_initialize_iomem_resources(struct resource *code_resource, 95800bf4098SBernhard Walle struct resource *data_resource, struct resource *bss_resource); 9593565184eSDavid Vrabel extern void efi_get_time(struct timespec *now); 960916f676fSMatthew Garrett extern void efi_reserve_boot_services(void); 9617968c0e3SLeif Lindholm extern int efi_get_fdt_params(struct efi_fdt_params *params); 9620bb54905SPeter Jones extern struct kobject *efi_kobj; 9631da177e4SLinus Torvalds 96444be28e9SMatt Fleming extern int efi_reboot_quirk_mode; 9650c5ed61aSMatt Fleming extern bool efi_poweroff_required(void); 9660c5ed61aSMatt Fleming 9670f96a99dSTaku Izumi #ifdef CONFIG_EFI_FAKE_MEMMAP 9680f96a99dSTaku Izumi extern void __init efi_fake_memmap(void); 9690f96a99dSTaku Izumi #else 9700f96a99dSTaku Izumi static inline void efi_fake_memmap(void) { } 9710f96a99dSTaku Izumi #endif 9720f96a99dSTaku Izumi 97310f0d2f5SArd Biesheuvel /* 97410f0d2f5SArd Biesheuvel * efi_memattr_perm_setter - arch specific callback function passed into 97510f0d2f5SArd Biesheuvel * efi_memattr_apply_permissions() that updates the 97610f0d2f5SArd Biesheuvel * mapping permissions described by the second 97710f0d2f5SArd Biesheuvel * argument in the page tables referred to by the 97810f0d2f5SArd Biesheuvel * first argument. 97910f0d2f5SArd Biesheuvel */ 98010f0d2f5SArd Biesheuvel typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *); 98110f0d2f5SArd Biesheuvel 98210f0d2f5SArd Biesheuvel extern int efi_memattr_init(void); 98310f0d2f5SArd Biesheuvel extern int efi_memattr_apply_permissions(struct mm_struct *mm, 98410f0d2f5SArd Biesheuvel efi_memattr_perm_setter fn); 98510f0d2f5SArd Biesheuvel 986e885cd80SMark Salter /* Iterate through an efi_memory_map */ 98778ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md) \ 988e885cd80SMark Salter for ((md) = (m)->map; \ 989e885cd80SMark Salter (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \ 990e885cd80SMark Salter (md) = (void *)(md) + (m)->desc_size) 991e885cd80SMark Salter 99278ce248fSMatt Fleming /** 99378ce248fSMatt Fleming * for_each_efi_memory_desc - iterate over descriptors in efi.memmap 99478ce248fSMatt Fleming * @md: the efi_memory_desc_t * iterator 99578ce248fSMatt Fleming * 99678ce248fSMatt Fleming * Once the loop finishes @md must not be accessed. 99778ce248fSMatt Fleming */ 99878ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \ 999884f4f66SMatt Fleming for_each_efi_memory_desc_in_map(&efi.memmap, md) 100078ce248fSMatt Fleming 100198d2a6caSLaszlo Ersek /* 100298d2a6caSLaszlo Ersek * Format an EFI memory descriptor's type and attributes to a user-provided 100398d2a6caSLaszlo Ersek * character buffer, as per snprintf(), and return the buffer. 100498d2a6caSLaszlo Ersek */ 100598d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size, 100698d2a6caSLaszlo Ersek const efi_memory_desc_t *md); 100798d2a6caSLaszlo Ersek 10081da177e4SLinus Torvalds /** 10091da177e4SLinus Torvalds * efi_range_is_wc - check the WC bit on an address range 10101da177e4SLinus Torvalds * @start: starting kvirt address 10111da177e4SLinus Torvalds * @len: length of range 10121da177e4SLinus Torvalds * 10131da177e4SLinus Torvalds * Consult the EFI memory map and make sure it's ok to set this range WC. 10141da177e4SLinus Torvalds * Returns true or false. 10151da177e4SLinus Torvalds */ 10161da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len) 10171da177e4SLinus Torvalds { 1018986a80d5SJesper Juhl unsigned long i; 10191da177e4SLinus Torvalds 10201da177e4SLinus Torvalds for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) { 10211da177e4SLinus Torvalds unsigned long paddr = __pa(start + i); 10221da177e4SLinus Torvalds if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC)) 10231da177e4SLinus Torvalds return 0; 10241da177e4SLinus Torvalds } 10251da177e4SLinus Torvalds /* The range checked out */ 10261da177e4SLinus Torvalds return 1; 10271da177e4SLinus Torvalds } 10281da177e4SLinus Torvalds 10291da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP 10301da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *); 10311da177e4SLinus Torvalds #endif 10321da177e4SLinus Torvalds 10331da177e4SLinus Torvalds /* 103483e68189SMatt Fleming * We play games with efi_enabled so that the compiler will, if 103583e68189SMatt Fleming * possible, remove EFI-related code altogether. 10361da177e4SLinus Torvalds */ 103783e68189SMatt Fleming #define EFI_BOOT 0 /* Were we booted from EFI? */ 103883e68189SMatt Fleming #define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */ 103983e68189SMatt Fleming #define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */ 104083e68189SMatt Fleming #define EFI_MEMMAP 4 /* Can we use EFI memory map? */ 104183e68189SMatt Fleming #define EFI_64BIT 5 /* Is the firmware 64-bit? */ 10429f27bc54SDaniel Kiper #define EFI_PARAVIRT 6 /* Access is via a paravirt interface */ 10439f27bc54SDaniel Kiper #define EFI_ARCH_1 7 /* First arch-specific bit */ 1044fed6cefeSBorislav Petkov #define EFI_DBG 8 /* Print additional debug info at runtime */ 1045a1041713SArd Biesheuvel #define EFI_NX_PE_DATA 9 /* Can runtime data regions be mapped non-executable? */ 104683e68189SMatt Fleming 10471da177e4SLinus Torvalds #ifdef CONFIG_EFI 10483e909599SMatt Fleming /* 10493e909599SMatt Fleming * Test whether the above EFI_* bits are enabled. 10503e909599SMatt Fleming */ 10513e909599SMatt Fleming static inline bool efi_enabled(int feature) 105283e68189SMatt Fleming { 10533e909599SMatt Fleming return test_bit(feature, &efi.flags) != 0; 10543e909599SMatt Fleming } 10558562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); 10563e909599SMatt Fleming #else 10573e909599SMatt Fleming static inline bool efi_enabled(int feature) 10583e909599SMatt Fleming { 10593e909599SMatt Fleming return false; 106083e68189SMatt Fleming } 10618562c99cSMatt Fleming static inline void 10628562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {} 10631da177e4SLinus Torvalds #endif 10641da177e4SLinus Torvalds 10651da177e4SLinus Torvalds /* 10661da177e4SLinus Torvalds * Variable Attributes 10671da177e4SLinus Torvalds */ 10681da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001 10691da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002 10701da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004 107141b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008 107241b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010 107341b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020 107441b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE 0x0000000000000040 10751da177e4SLinus Torvalds 107641b3254cSMatthew Garrett #define EFI_VARIABLE_MASK (EFI_VARIABLE_NON_VOLATILE | \ 107741b3254cSMatthew Garrett EFI_VARIABLE_BOOTSERVICE_ACCESS | \ 107841b3254cSMatthew Garrett EFI_VARIABLE_RUNTIME_ACCESS | \ 107941b3254cSMatthew Garrett EFI_VARIABLE_HARDWARE_ERROR_RECORD | \ 108041b3254cSMatthew Garrett EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \ 108141b3254cSMatthew Garrett EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \ 108241b3254cSMatthew Garrett EFI_VARIABLE_APPEND_WRITE) 10831da177e4SLinus Torvalds /* 1084e14ab23dSMatt Fleming * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")) 1085e14ab23dSMatt Fleming * not including trailing NUL 1086e14ab23dSMatt Fleming */ 1087e14ab23dSMatt Fleming #define EFI_VARIABLE_GUID_LEN 36 1088e14ab23dSMatt Fleming 1089e14ab23dSMatt Fleming /* 1090e2527a7cSMatt Fleming * The type of search to perform when calling boottime->locate_handle 1091e2527a7cSMatt Fleming */ 1092e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES 0 1093e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY 1 1094e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL 2 1095e2527a7cSMatt Fleming 1096e2527a7cSMatt Fleming /* 10971da177e4SLinus Torvalds * EFI Device Path information 10981da177e4SLinus Torvalds */ 10991da177e4SLinus Torvalds #define EFI_DEV_HW 0x01 11001da177e4SLinus Torvalds #define EFI_DEV_PCI 1 11011da177e4SLinus Torvalds #define EFI_DEV_PCCARD 2 11021da177e4SLinus Torvalds #define EFI_DEV_MEM_MAPPED 3 11031da177e4SLinus Torvalds #define EFI_DEV_VENDOR 4 11041da177e4SLinus Torvalds #define EFI_DEV_CONTROLLER 5 11051da177e4SLinus Torvalds #define EFI_DEV_ACPI 0x02 11061da177e4SLinus Torvalds #define EFI_DEV_BASIC_ACPI 1 11071da177e4SLinus Torvalds #define EFI_DEV_EXPANDED_ACPI 2 11081da177e4SLinus Torvalds #define EFI_DEV_MSG 0x03 11091da177e4SLinus Torvalds #define EFI_DEV_MSG_ATAPI 1 11101da177e4SLinus Torvalds #define EFI_DEV_MSG_SCSI 2 11111da177e4SLinus Torvalds #define EFI_DEV_MSG_FC 3 11121da177e4SLinus Torvalds #define EFI_DEV_MSG_1394 4 11131da177e4SLinus Torvalds #define EFI_DEV_MSG_USB 5 11141da177e4SLinus Torvalds #define EFI_DEV_MSG_USB_CLASS 15 11151da177e4SLinus Torvalds #define EFI_DEV_MSG_I20 6 11161da177e4SLinus Torvalds #define EFI_DEV_MSG_MAC 11 11171da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV4 12 11181da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV6 13 11191da177e4SLinus Torvalds #define EFI_DEV_MSG_INFINIBAND 9 11201da177e4SLinus Torvalds #define EFI_DEV_MSG_UART 14 11211da177e4SLinus Torvalds #define EFI_DEV_MSG_VENDOR 10 11221da177e4SLinus Torvalds #define EFI_DEV_MEDIA 0x04 11231da177e4SLinus Torvalds #define EFI_DEV_MEDIA_HARD_DRIVE 1 11241da177e4SLinus Torvalds #define EFI_DEV_MEDIA_CDROM 2 11251da177e4SLinus Torvalds #define EFI_DEV_MEDIA_VENDOR 3 11261da177e4SLinus Torvalds #define EFI_DEV_MEDIA_FILE 4 11271da177e4SLinus Torvalds #define EFI_DEV_MEDIA_PROTOCOL 5 11281da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT 0x05 11291da177e4SLinus Torvalds #define EFI_DEV_END_PATH 0x7F 11301da177e4SLinus Torvalds #define EFI_DEV_END_PATH2 0xFF 11311da177e4SLinus Torvalds #define EFI_DEV_END_INSTANCE 0x01 11321da177e4SLinus Torvalds #define EFI_DEV_END_ENTIRE 0xFF 11331da177e4SLinus Torvalds 11341da177e4SLinus Torvalds struct efi_generic_dev_path { 11351da177e4SLinus Torvalds u8 type; 11361da177e4SLinus Torvalds u8 sub_type; 11371da177e4SLinus Torvalds u16 length; 11381da177e4SLinus Torvalds } __attribute ((packed)); 11391da177e4SLinus Torvalds 11404a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages) 11414a3575fdSHuang, Ying { 11424a3575fdSHuang, Ying *npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr); 11434a3575fdSHuang, Ying *addr &= PAGE_MASK; 11444a3575fdSHuang, Ying } 11454a3575fdSHuang, Ying 114604851772SMatt Fleming /* 11474fc756bdSMike Waychison * EFI Variable support. 11484fc756bdSMike Waychison * 11494fc756bdSMike Waychison * Different firmware drivers can expose their EFI-like variables using 11504fc756bdSMike Waychison * the following. 11514fc756bdSMike Waychison */ 11524fc756bdSMike Waychison 11534fc756bdSMike Waychison struct efivar_operations { 11544fc756bdSMike Waychison efi_get_variable_t *get_variable; 11554fc756bdSMike Waychison efi_get_next_variable_t *get_next_variable; 11564fc756bdSMike Waychison efi_set_variable_t *set_variable; 115770d2a3cfSArd Biesheuvel efi_set_variable_t *set_variable_nonblocking; 1158a6e4d5a0SMatt Fleming efi_query_variable_store_t *query_variable_store; 11594fc756bdSMike Waychison }; 11604fc756bdSMike Waychison 11614fc756bdSMike Waychison struct efivars { 11624fc756bdSMike Waychison /* 11634fc756bdSMike Waychison * ->lock protects two things: 116482f990a8SMatt Fleming * 1) efivarfs_list and efivars_sysfs_list 116582f990a8SMatt Fleming * 2) ->ops calls 11664fc756bdSMike Waychison */ 11674fc756bdSMike Waychison spinlock_t lock; 11684fc756bdSMike Waychison struct kset *kset; 1169605e70c7SLee, Chun-Yi struct kobject *kobject; 11704fc756bdSMike Waychison const struct efivar_operations *ops; 11714fc756bdSMike Waychison }; 11724fc756bdSMike Waychison 1173e14ab23dSMatt Fleming /* 1174e14ab23dSMatt Fleming * The maximum size of VariableName + Data = 1024 1175e14ab23dSMatt Fleming * Therefore, it's reasonable to save that much 1176e14ab23dSMatt Fleming * space in each part of the structure, 1177e14ab23dSMatt Fleming * and we use a page for reading/writing. 1178e14ab23dSMatt Fleming */ 1179e14ab23dSMatt Fleming 1180a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN 1024 1181a5d92ad3SMatt Fleming 1182e14ab23dSMatt Fleming struct efi_variable { 1183a5d92ad3SMatt Fleming efi_char16_t VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)]; 1184e14ab23dSMatt Fleming efi_guid_t VendorGuid; 1185e14ab23dSMatt Fleming unsigned long DataSize; 1186e14ab23dSMatt Fleming __u8 Data[1024]; 1187e14ab23dSMatt Fleming efi_status_t Status; 1188e14ab23dSMatt Fleming __u32 Attributes; 1189e14ab23dSMatt Fleming } __attribute__((packed)); 1190e14ab23dSMatt Fleming 1191e14ab23dSMatt Fleming struct efivar_entry { 1192e14ab23dSMatt Fleming struct efi_variable var; 1193e14ab23dSMatt Fleming struct list_head list; 1194e14ab23dSMatt Fleming struct kobject kobj; 1195e0d59733SSeiji Aguchi bool scanning; 1196e0d59733SSeiji Aguchi bool deleting; 1197e14ab23dSMatt Fleming }; 1198e14ab23dSMatt Fleming 1199677703ceSMatt Fleming struct efi_simple_text_output_protocol_32 { 1200677703ceSMatt Fleming u32 reset; 1201677703ceSMatt Fleming u32 output_string; 1202677703ceSMatt Fleming u32 test_string; 1203677703ceSMatt Fleming }; 1204677703ceSMatt Fleming 1205677703ceSMatt Fleming struct efi_simple_text_output_protocol_64 { 1206677703ceSMatt Fleming u64 reset; 1207677703ceSMatt Fleming u64 output_string; 1208677703ceSMatt Fleming u64 test_string; 1209677703ceSMatt Fleming }; 1210ed37ddffSRoy Franz 1211ed37ddffSRoy Franz struct efi_simple_text_output_protocol { 1212ed37ddffSRoy Franz void *reset; 1213ed37ddffSRoy Franz efi_status_t (*output_string)(void *, void *); 1214ed37ddffSRoy Franz void *test_string; 1215ed37ddffSRoy Franz }; 1216ed37ddffSRoy Franz 121704851772SMatt Fleming extern struct list_head efivar_sysfs_list; 121804851772SMatt Fleming 121904851772SMatt Fleming static inline void 122004851772SMatt Fleming efivar_unregister(struct efivar_entry *var) 122104851772SMatt Fleming { 122204851772SMatt Fleming kobject_put(&var->kobj); 122304851772SMatt Fleming } 122404851772SMatt Fleming 1225e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars, 12264fc756bdSMike Waychison const struct efivar_operations *ops, 1227e14ab23dSMatt Fleming struct kobject *kobject); 1228e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars); 1229e14ab23dSMatt Fleming struct kobject *efivars_kobject(void); 1230e14ab23dSMatt Fleming 1231e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *), 1232e14ab23dSMatt Fleming void *data, bool atomic, bool duplicates, 1233e14ab23dSMatt Fleming struct list_head *head); 1234e14ab23dSMatt Fleming 1235e14ab23dSMatt Fleming void efivar_entry_add(struct efivar_entry *entry, struct list_head *head); 1236e14ab23dSMatt Fleming void efivar_entry_remove(struct efivar_entry *entry); 1237e14ab23dSMatt Fleming 1238e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry); 1239e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry); 1240e14ab23dSMatt Fleming 1241e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size); 12428a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 12438a415b8cSMatt Fleming unsigned long *size, void *data); 1244e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 1245e14ab23dSMatt Fleming unsigned long *size, void *data); 1246e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes, 1247e14ab23dSMatt Fleming unsigned long size, void *data, struct list_head *head); 1248e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes, 1249e14ab23dSMatt Fleming unsigned long *size, void *data, bool *set); 1250e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, 1251e14ab23dSMatt Fleming bool block, unsigned long size, void *data); 1252e14ab23dSMatt Fleming 1253e14ab23dSMatt Fleming void efivar_entry_iter_begin(void); 1254e14ab23dSMatt Fleming void efivar_entry_iter_end(void); 1255e14ab23dSMatt Fleming 1256e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1257e14ab23dSMatt Fleming struct list_head *head, void *data, 1258e14ab23dSMatt Fleming struct efivar_entry **prev); 1259e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1260e14ab23dSMatt Fleming struct list_head *head, void *data); 1261e14ab23dSMatt Fleming 1262e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, 1263e14ab23dSMatt Fleming struct list_head *head, bool remove); 1264e14ab23dSMatt Fleming 12658282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data, 12668282f5d9SPeter Jones unsigned long data_size); 1267ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name, 1268ed8b0de5SPeter Jones size_t len); 1269e14ab23dSMatt Fleming 1270a9499fa7STom Gundersen extern struct work_struct efivar_work; 127104851772SMatt Fleming void efivar_run_worker(void); 127204851772SMatt Fleming 1273a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE) 1274e14ab23dSMatt Fleming int efivars_sysfs_init(void); 12754fc756bdSMike Waychison 1276e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024 1277e0d59733SSeiji Aguchi 12784fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */ 12794fc756bdSMike Waychison 1280926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP 1281926172d4SDave Young int efi_runtime_map_init(struct kobject *); 1282926172d4SDave Young void efi_runtime_map_setup(void *, int, u32); 12836a2c20e7SVivek Goyal int efi_get_runtime_map_size(void); 12846a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void); 12856a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz); 1286926172d4SDave Young #else 1287926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj) 1288926172d4SDave Young { 1289926172d4SDave Young return 0; 1290926172d4SDave Young } 1291926172d4SDave Young 1292926172d4SDave Young static inline void 1293926172d4SDave Young efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size) {} 12946a2c20e7SVivek Goyal 12956a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void) 12966a2c20e7SVivek Goyal { 12976a2c20e7SVivek Goyal return 0; 12986a2c20e7SVivek Goyal } 12996a2c20e7SVivek Goyal 13006a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void) 13016a2c20e7SVivek Goyal { 13026a2c20e7SVivek Goyal return 0; 13036a2c20e7SVivek Goyal } 13046a2c20e7SVivek Goyal 13056a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz) 13066a2c20e7SVivek Goyal { 13076a2c20e7SVivek Goyal return 0; 13086a2c20e7SVivek Goyal } 13096a2c20e7SVivek Goyal 1310926172d4SDave Young #endif 1311926172d4SDave Young 1312bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */ 1313bd669475SArd Biesheuvel 1314bd669475SArd Biesheuvel #define pr_efi(sys_table, msg) efi_printk(sys_table, "EFI stub: "msg) 1315bd669475SArd Biesheuvel #define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg) 1316bd669475SArd Biesheuvel 1317bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str); 1318bd669475SArd Biesheuvel 1319bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size, 1320bd669475SArd Biesheuvel unsigned long addr); 1321bd669475SArd Biesheuvel 1322bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg, 1323bd669475SArd Biesheuvel efi_loaded_image_t *image, int *cmd_line_len); 1324bd669475SArd Biesheuvel 1325bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg, 1326bd669475SArd Biesheuvel efi_memory_desc_t **map, 1327bd669475SArd Biesheuvel unsigned long *map_size, 1328bd669475SArd Biesheuvel unsigned long *desc_size, 1329bd669475SArd Biesheuvel u32 *desc_ver, 1330bd669475SArd Biesheuvel unsigned long *key_ptr); 1331bd669475SArd Biesheuvel 1332bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg, 1333bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1334bd669475SArd Biesheuvel unsigned long *addr); 1335bd669475SArd Biesheuvel 1336bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg, 1337bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1338bd669475SArd Biesheuvel unsigned long *addr, unsigned long max); 1339bd669475SArd Biesheuvel 1340bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg, 1341bd669475SArd Biesheuvel unsigned long *image_addr, 1342bd669475SArd Biesheuvel unsigned long image_size, 1343bd669475SArd Biesheuvel unsigned long alloc_size, 1344bd669475SArd Biesheuvel unsigned long preferred_addr, 1345bd669475SArd Biesheuvel unsigned long alignment); 1346bd669475SArd Biesheuvel 1347bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg, 1348bd669475SArd Biesheuvel efi_loaded_image_t *image, 1349bd669475SArd Biesheuvel char *cmd_line, char *option_string, 1350bd669475SArd Biesheuvel unsigned long max_addr, 1351bd669475SArd Biesheuvel unsigned long *load_addr, 1352bd669475SArd Biesheuvel unsigned long *load_size); 1353bd669475SArd Biesheuvel 13545a17dae4SMatt Fleming efi_status_t efi_parse_options(char *cmdline); 13555a17dae4SMatt Fleming 1356*2c23b73cSArd Biesheuvel efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg, 1357*2c23b73cSArd Biesheuvel struct screen_info *si, efi_guid_t *proto, 1358*2c23b73cSArd Biesheuvel unsigned long size); 1359*2c23b73cSArd Biesheuvel 1360b2e0a54aSDave Young bool efi_runtime_disabled(void); 13611da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */ 1362