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