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 6261da177e4SLinus Torvalds typedef struct { 6271da177e4SLinus Torvalds efi_guid_t guid; 6281adbfa35SOlof Johansson u64 table; 6291adbfa35SOlof Johansson } efi_config_table_64_t; 6301adbfa35SOlof Johansson 6311adbfa35SOlof Johansson typedef struct { 6321adbfa35SOlof Johansson efi_guid_t guid; 6331adbfa35SOlof Johansson u32 table; 6341adbfa35SOlof Johansson } efi_config_table_32_t; 6351adbfa35SOlof Johansson 6361adbfa35SOlof Johansson typedef struct { 6371adbfa35SOlof Johansson efi_guid_t guid; 6381da177e4SLinus Torvalds unsigned long table; 6391da177e4SLinus Torvalds } efi_config_table_t; 6401da177e4SLinus Torvalds 641272686bfSLeif Lindholm typedef struct { 642272686bfSLeif Lindholm efi_guid_t guid; 643272686bfSLeif Lindholm const char *name; 644272686bfSLeif Lindholm unsigned long *ptr; 645272686bfSLeif Lindholm } efi_config_table_type_t; 646272686bfSLeif Lindholm 6471da177e4SLinus Torvalds #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) 6481da177e4SLinus Torvalds 6493b370237SMatthew Garrett #define EFI_2_30_SYSTEM_TABLE_REVISION ((2 << 16) | (30)) 6503b370237SMatthew Garrett #define EFI_2_20_SYSTEM_TABLE_REVISION ((2 << 16) | (20)) 6513b370237SMatthew Garrett #define EFI_2_10_SYSTEM_TABLE_REVISION ((2 << 16) | (10)) 6523b370237SMatthew Garrett #define EFI_2_00_SYSTEM_TABLE_REVISION ((2 << 16) | (00)) 6533b370237SMatthew Garrett #define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10)) 6543b370237SMatthew Garrett #define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02)) 6553b370237SMatthew Garrett 6561da177e4SLinus Torvalds typedef struct { 6571da177e4SLinus Torvalds efi_table_hdr_t hdr; 6581adbfa35SOlof Johansson u64 fw_vendor; /* physical addr of CHAR16 vendor string */ 6591adbfa35SOlof Johansson u32 fw_revision; 6601adbfa35SOlof Johansson u32 __pad1; 6611adbfa35SOlof Johansson u64 con_in_handle; 6621adbfa35SOlof Johansson u64 con_in; 6631adbfa35SOlof Johansson u64 con_out_handle; 6641adbfa35SOlof Johansson u64 con_out; 6651adbfa35SOlof Johansson u64 stderr_handle; 6661adbfa35SOlof Johansson u64 stderr; 6671adbfa35SOlof Johansson u64 runtime; 6681adbfa35SOlof Johansson u64 boottime; 6691adbfa35SOlof Johansson u32 nr_tables; 6701adbfa35SOlof Johansson u32 __pad2; 6711adbfa35SOlof Johansson u64 tables; 6721adbfa35SOlof Johansson } efi_system_table_64_t; 6731adbfa35SOlof Johansson 6741adbfa35SOlof Johansson typedef struct { 6751adbfa35SOlof Johansson efi_table_hdr_t hdr; 6761adbfa35SOlof Johansson u32 fw_vendor; /* physical addr of CHAR16 vendor string */ 6771adbfa35SOlof Johansson u32 fw_revision; 6781adbfa35SOlof Johansson u32 con_in_handle; 6791adbfa35SOlof Johansson u32 con_in; 6801adbfa35SOlof Johansson u32 con_out_handle; 6811adbfa35SOlof Johansson u32 con_out; 6821adbfa35SOlof Johansson u32 stderr_handle; 6831adbfa35SOlof Johansson u32 stderr; 6841adbfa35SOlof Johansson u32 runtime; 6851adbfa35SOlof Johansson u32 boottime; 6861adbfa35SOlof Johansson u32 nr_tables; 6871adbfa35SOlof Johansson u32 tables; 6881adbfa35SOlof Johansson } efi_system_table_32_t; 6891adbfa35SOlof Johansson 6901adbfa35SOlof Johansson typedef struct { 6911adbfa35SOlof Johansson efi_table_hdr_t hdr; 6921da177e4SLinus Torvalds unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ 6931da177e4SLinus Torvalds u32 fw_revision; 6941da177e4SLinus Torvalds unsigned long con_in_handle; 6951da177e4SLinus Torvalds unsigned long con_in; 6961da177e4SLinus Torvalds unsigned long con_out_handle; 6971da177e4SLinus Torvalds unsigned long con_out; 6981da177e4SLinus Torvalds unsigned long stderr_handle; 6991da177e4SLinus Torvalds unsigned long stderr; 7001da177e4SLinus Torvalds efi_runtime_services_t *runtime; 701f30ca6baSMatt Fleming efi_boot_services_t *boottime; 7021da177e4SLinus Torvalds unsigned long nr_tables; 7031da177e4SLinus Torvalds unsigned long tables; 7041da177e4SLinus Torvalds } efi_system_table_t; 7051da177e4SLinus Torvalds 7061da177e4SLinus Torvalds struct efi_memory_map { 70744511fb9SArd Biesheuvel phys_addr_t phys_map; 7087ae65fd3SMatt Tolentino void *map; 7097ae65fd3SMatt Tolentino void *map_end; 7101da177e4SLinus Torvalds int nr_map; 7111da177e4SLinus Torvalds unsigned long desc_version; 7127ae65fd3SMatt Tolentino unsigned long desc_size; 7131da177e4SLinus Torvalds }; 7141da177e4SLinus Torvalds 7150302f71cSMark Salter struct efi_fdt_params { 7160302f71cSMark Salter u64 system_table; 7170302f71cSMark Salter u64 mmap; 7180302f71cSMark Salter u32 mmap_size; 7190302f71cSMark Salter u32 desc_size; 7200302f71cSMark Salter u32 desc_ver; 7210302f71cSMark Salter }; 7220302f71cSMark Salter 7238e84f345SMatt Fleming typedef struct { 7248e84f345SMatt Fleming u32 revision; 725677703ceSMatt Fleming u32 parent_handle; 726677703ceSMatt Fleming u32 system_table; 727677703ceSMatt Fleming u32 device_handle; 728677703ceSMatt Fleming u32 file_path; 729677703ceSMatt Fleming u32 reserved; 730677703ceSMatt Fleming u32 load_options_size; 731677703ceSMatt Fleming u32 load_options; 732677703ceSMatt Fleming u32 image_base; 733677703ceSMatt Fleming __aligned_u64 image_size; 734677703ceSMatt Fleming unsigned int image_code_type; 735677703ceSMatt Fleming unsigned int image_data_type; 736677703ceSMatt Fleming unsigned long unload; 737677703ceSMatt Fleming } efi_loaded_image_32_t; 738677703ceSMatt Fleming 739677703ceSMatt Fleming typedef struct { 740677703ceSMatt Fleming u32 revision; 741677703ceSMatt Fleming u64 parent_handle; 742677703ceSMatt Fleming u64 system_table; 743677703ceSMatt Fleming u64 device_handle; 744677703ceSMatt Fleming u64 file_path; 745677703ceSMatt Fleming u64 reserved; 746677703ceSMatt Fleming u32 load_options_size; 747677703ceSMatt Fleming u64 load_options; 748677703ceSMatt Fleming u64 image_base; 749677703ceSMatt Fleming __aligned_u64 image_size; 750677703ceSMatt Fleming unsigned int image_code_type; 751677703ceSMatt Fleming unsigned int image_data_type; 752677703ceSMatt Fleming unsigned long unload; 753677703ceSMatt Fleming } efi_loaded_image_64_t; 754677703ceSMatt Fleming 755677703ceSMatt Fleming typedef struct { 756677703ceSMatt Fleming u32 revision; 7578e84f345SMatt Fleming void *parent_handle; 7588e84f345SMatt Fleming efi_system_table_t *system_table; 7598e84f345SMatt Fleming void *device_handle; 7608e84f345SMatt Fleming void *file_path; 7618e84f345SMatt Fleming void *reserved; 7628e84f345SMatt Fleming u32 load_options_size; 7638e84f345SMatt Fleming void *load_options; 7648e84f345SMatt Fleming void *image_base; 7658e84f345SMatt Fleming __aligned_u64 image_size; 7668e84f345SMatt Fleming unsigned int image_code_type; 7678e84f345SMatt Fleming unsigned int image_data_type; 7688e84f345SMatt Fleming unsigned long unload; 7698e84f345SMatt Fleming } efi_loaded_image_t; 7708e84f345SMatt Fleming 77155839d51SMatt Fleming 77255839d51SMatt Fleming typedef struct { 77355839d51SMatt Fleming u64 size; 77455839d51SMatt Fleming u64 file_size; 77555839d51SMatt Fleming u64 phys_size; 77655839d51SMatt Fleming efi_time_t create_time; 77755839d51SMatt Fleming efi_time_t last_access_time; 77855839d51SMatt Fleming efi_time_t modification_time; 77955839d51SMatt Fleming __aligned_u64 attribute; 78055839d51SMatt Fleming efi_char16_t filename[1]; 78155839d51SMatt Fleming } efi_file_info_t; 78255839d51SMatt Fleming 783677703ceSMatt Fleming typedef struct { 784677703ceSMatt Fleming u64 revision; 785677703ceSMatt Fleming u32 open; 786677703ceSMatt Fleming u32 close; 787677703ceSMatt Fleming u32 delete; 788677703ceSMatt Fleming u32 read; 789677703ceSMatt Fleming u32 write; 790677703ceSMatt Fleming u32 get_position; 791677703ceSMatt Fleming u32 set_position; 792677703ceSMatt Fleming u32 get_info; 793677703ceSMatt Fleming u32 set_info; 794677703ceSMatt Fleming u32 flush; 795677703ceSMatt Fleming } efi_file_handle_32_t; 796677703ceSMatt Fleming 797677703ceSMatt Fleming typedef struct { 798677703ceSMatt Fleming u64 revision; 799677703ceSMatt Fleming u64 open; 800677703ceSMatt Fleming u64 close; 801677703ceSMatt Fleming u64 delete; 802677703ceSMatt Fleming u64 read; 803677703ceSMatt Fleming u64 write; 804677703ceSMatt Fleming u64 get_position; 805677703ceSMatt Fleming u64 set_position; 806677703ceSMatt Fleming u64 get_info; 807677703ceSMatt Fleming u64 set_info; 808677703ceSMatt Fleming u64 flush; 809677703ceSMatt Fleming } efi_file_handle_64_t; 810677703ceSMatt Fleming 811ed37ddffSRoy Franz typedef struct _efi_file_handle { 81255839d51SMatt Fleming u64 revision; 813ed37ddffSRoy Franz efi_status_t (*open)(struct _efi_file_handle *, 814ed37ddffSRoy Franz struct _efi_file_handle **, 815ed37ddffSRoy Franz efi_char16_t *, u64, u64); 816ed37ddffSRoy Franz efi_status_t (*close)(struct _efi_file_handle *); 81755839d51SMatt Fleming void *delete; 818ed37ddffSRoy Franz efi_status_t (*read)(struct _efi_file_handle *, unsigned long *, 819ed37ddffSRoy Franz void *); 82055839d51SMatt Fleming void *write; 82155839d51SMatt Fleming void *get_position; 82255839d51SMatt Fleming void *set_position; 823ed37ddffSRoy Franz efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *, 824ed37ddffSRoy Franz unsigned long *, void *); 82555839d51SMatt Fleming void *set_info; 82655839d51SMatt Fleming void *flush; 82755839d51SMatt Fleming } efi_file_handle_t; 82855839d51SMatt Fleming 829ed37ddffSRoy Franz typedef struct _efi_file_io_interface { 830ed37ddffSRoy Franz u64 revision; 831ed37ddffSRoy Franz int (*open_volume)(struct _efi_file_io_interface *, 832ed37ddffSRoy Franz efi_file_handle_t **); 833ed37ddffSRoy Franz } efi_file_io_interface_t; 834ed37ddffSRoy Franz 83555839d51SMatt Fleming #define EFI_FILE_MODE_READ 0x0000000000000001 83655839d51SMatt Fleming #define EFI_FILE_MODE_WRITE 0x0000000000000002 83755839d51SMatt Fleming #define EFI_FILE_MODE_CREATE 0x8000000000000000 83855839d51SMatt Fleming 839bf924863SArd Biesheuvel typedef struct { 840bf924863SArd Biesheuvel u32 version; 841bf924863SArd Biesheuvel u32 length; 842bf924863SArd Biesheuvel u64 memory_protection_attribute; 843bf924863SArd Biesheuvel } efi_properties_table_t; 844bf924863SArd Biesheuvel 845bf924863SArd Biesheuvel #define EFI_PROPERTIES_TABLE_VERSION 0x00010000 846bf924863SArd Biesheuvel #define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA 0x1 847bf924863SArd Biesheuvel 848b2c99e3cSBjorn Helgaas #define EFI_INVALID_TABLE_ADDR (~0UL) 849b2c99e3cSBjorn Helgaas 8501da177e4SLinus Torvalds /* 8511da177e4SLinus Torvalds * All runtime access to EFI goes through this structure: 8521da177e4SLinus Torvalds */ 8531da177e4SLinus Torvalds extern struct efi { 8541da177e4SLinus Torvalds efi_system_table_t *systab; /* EFI system table */ 8553b370237SMatthew Garrett unsigned int runtime_version; /* Runtime services version */ 856b2c99e3cSBjorn Helgaas unsigned long mps; /* MPS table */ 857b2c99e3cSBjorn Helgaas unsigned long acpi; /* ACPI table (IA64 ext 0.71) */ 858b2c99e3cSBjorn Helgaas unsigned long acpi20; /* ACPI table (ACPI 2.0) */ 859e1ccbbc9SArd Biesheuvel unsigned long smbios; /* SMBIOS table (32 bit entry point) */ 860e1ccbbc9SArd Biesheuvel unsigned long smbios3; /* SMBIOS table (64 bit entry point) */ 861b2c99e3cSBjorn Helgaas unsigned long sal_systab; /* SAL system table */ 862b2c99e3cSBjorn Helgaas unsigned long boot_info; /* boot info table */ 863b2c99e3cSBjorn Helgaas unsigned long hcdp; /* HCDP table */ 864b2c99e3cSBjorn Helgaas unsigned long uga; /* UGA table */ 865a50f70b1SRuss Anderson unsigned long uv_systab; /* UV system table */ 866a0998eb1SDave Young unsigned long fw_vendor; /* fw_vendor */ 867a0998eb1SDave Young unsigned long runtime; /* runtime table */ 868a0998eb1SDave Young unsigned long config_table; /* config tables */ 8690bb54905SPeter Jones unsigned long esrt; /* ESRT table */ 870bf924863SArd Biesheuvel unsigned long properties_table; /* properties table */ 8711da177e4SLinus Torvalds efi_get_time_t *get_time; 8721da177e4SLinus Torvalds efi_set_time_t *set_time; 8731da177e4SLinus Torvalds efi_get_wakeup_time_t *get_wakeup_time; 8741da177e4SLinus Torvalds efi_set_wakeup_time_t *set_wakeup_time; 8751da177e4SLinus Torvalds efi_get_variable_t *get_variable; 8761da177e4SLinus Torvalds efi_get_next_variable_t *get_next_variable; 8771da177e4SLinus Torvalds efi_set_variable_t *set_variable; 87870d2a3cfSArd Biesheuvel efi_set_variable_t *set_variable_nonblocking; 8793b370237SMatthew Garrett efi_query_variable_info_t *query_variable_info; 880d3cac1f8SArd Biesheuvel efi_query_variable_info_t *query_variable_info_nonblocking; 8813b370237SMatthew Garrett efi_update_capsule_t *update_capsule; 8823b370237SMatthew Garrett efi_query_capsule_caps_t *query_capsule_caps; 8831da177e4SLinus Torvalds efi_get_next_high_mono_count_t *get_next_high_mono_count; 8841da177e4SLinus Torvalds efi_reset_system_t *reset_system; 8851da177e4SLinus Torvalds efi_set_virtual_address_map_t *set_virtual_address_map; 886258f6fd7SLeif Lindholm struct efi_memory_map *memmap; 8873e909599SMatt Fleming unsigned long flags; 8881da177e4SLinus Torvalds } efi; 8891da177e4SLinus Torvalds 8901da177e4SLinus Torvalds static inline int 8911da177e4SLinus Torvalds efi_guidcmp (efi_guid_t left, efi_guid_t right) 8921da177e4SLinus Torvalds { 8931da177e4SLinus Torvalds return memcmp(&left, &right, sizeof (efi_guid_t)); 8941da177e4SLinus Torvalds } 8951da177e4SLinus Torvalds 8961da177e4SLinus Torvalds static inline char * 89726e02272SBorislav Petkov efi_guid_to_str(efi_guid_t *guid, char *out) 8981da177e4SLinus Torvalds { 899925ede0bSJoe Perches sprintf(out, "%pUl", guid->b); 9001da177e4SLinus Torvalds return out; 9011da177e4SLinus Torvalds } 9021da177e4SLinus Torvalds 9031da177e4SLinus Torvalds extern void efi_init (void); 9041da177e4SLinus Torvalds extern void *efi_get_pal_addr (void); 9051da177e4SLinus Torvalds extern void efi_map_pal_code (void); 9061da177e4SLinus Torvalds extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg); 9071da177e4SLinus Torvalds extern void efi_gettimeofday (struct timespec *ts); 9081da177e4SLinus Torvalds extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */ 90978510792SJosh Triplett #ifdef CONFIG_X86 9102223af38SJosh Triplett extern void efi_late_init(void); 91178510792SJosh Triplett extern void efi_free_boot_services(void); 912ca0e30dcSArd Biesheuvel extern efi_status_t efi_query_variable_store(u32 attributes, 913ca0e30dcSArd Biesheuvel unsigned long size, 914ca0e30dcSArd Biesheuvel bool nonblocking); 915b05b9f5fSTony Luck extern void efi_find_mirror(void); 91678510792SJosh Triplett #else 9172223af38SJosh Triplett static inline void efi_late_init(void) {} 91878510792SJosh Triplett static inline void efi_free_boot_services(void) {} 919a6e4d5a0SMatt Fleming 920ca0e30dcSArd Biesheuvel static inline efi_status_t efi_query_variable_store(u32 attributes, 921ca0e30dcSArd Biesheuvel unsigned long size, 922ca0e30dcSArd Biesheuvel bool nonblocking) 923a6e4d5a0SMatt Fleming { 924a6e4d5a0SMatt Fleming return EFI_SUCCESS; 925a6e4d5a0SMatt Fleming } 92678510792SJosh Triplett #endif 9277bc90e01SJosh Triplett extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr); 928272686bfSLeif Lindholm extern int efi_config_init(efi_config_table_type_t *arch_tables); 9293846c158SPeter Jones #ifdef CONFIG_EFI_ESRT 9300bb54905SPeter Jones extern void __init efi_esrt_init(void); 9313846c158SPeter Jones #else 9323846c158SPeter Jones static inline void efi_esrt_init(void) { } 9333846c158SPeter Jones #endif 9347bb68410SArd Biesheuvel extern int efi_config_parse_tables(void *config_tables, int count, int sz, 9357bb68410SArd Biesheuvel efi_config_table_type_t *arch_tables); 9361da177e4SLinus Torvalds extern u64 efi_get_iobase (void); 9371da177e4SLinus Torvalds extern u32 efi_mem_type (unsigned long phys_addr); 9381da177e4SLinus Torvalds extern u64 efi_mem_attributes (unsigned long phys_addr); 93932e62c63SBjorn Helgaas extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size); 9401da177e4SLinus Torvalds extern int __init efi_uart_console_only (void); 9410bb54905SPeter Jones extern u64 efi_mem_desc_end(efi_memory_desc_t *md); 9420bb54905SPeter Jones extern int efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md); 9431da177e4SLinus Torvalds extern void efi_initialize_iomem_resources(struct resource *code_resource, 94400bf4098SBernhard Walle struct resource *data_resource, struct resource *bss_resource); 9453565184eSDavid Vrabel extern void efi_get_time(struct timespec *now); 946916f676fSMatthew Garrett extern void efi_reserve_boot_services(void); 9477968c0e3SLeif Lindholm extern int efi_get_fdt_params(struct efi_fdt_params *params); 9481da177e4SLinus Torvalds extern struct efi_memory_map memmap; 9490bb54905SPeter Jones extern struct kobject *efi_kobj; 9501da177e4SLinus Torvalds 95144be28e9SMatt Fleming extern int efi_reboot_quirk_mode; 9520c5ed61aSMatt Fleming extern bool efi_poweroff_required(void); 9530c5ed61aSMatt Fleming 9540f96a99dSTaku Izumi #ifdef CONFIG_EFI_FAKE_MEMMAP 9550f96a99dSTaku Izumi extern void __init efi_fake_memmap(void); 9560f96a99dSTaku Izumi #else 9570f96a99dSTaku Izumi static inline void efi_fake_memmap(void) { } 9580f96a99dSTaku Izumi #endif 9590f96a99dSTaku Izumi 960e885cd80SMark Salter /* Iterate through an efi_memory_map */ 961*78ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md) \ 962e885cd80SMark Salter for ((md) = (m)->map; \ 963e885cd80SMark Salter (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \ 964e885cd80SMark Salter (md) = (void *)(md) + (m)->desc_size) 965e885cd80SMark Salter 966*78ce248fSMatt Fleming /** 967*78ce248fSMatt Fleming * for_each_efi_memory_desc - iterate over descriptors in efi.memmap 968*78ce248fSMatt Fleming * @md: the efi_memory_desc_t * iterator 969*78ce248fSMatt Fleming * 970*78ce248fSMatt Fleming * Once the loop finishes @md must not be accessed. 971*78ce248fSMatt Fleming */ 972*78ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \ 973*78ce248fSMatt Fleming for_each_efi_memory_desc_in_map(efi.memmap, md) 974*78ce248fSMatt Fleming 97598d2a6caSLaszlo Ersek /* 97698d2a6caSLaszlo Ersek * Format an EFI memory descriptor's type and attributes to a user-provided 97798d2a6caSLaszlo Ersek * character buffer, as per snprintf(), and return the buffer. 97898d2a6caSLaszlo Ersek */ 97998d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size, 98098d2a6caSLaszlo Ersek const efi_memory_desc_t *md); 98198d2a6caSLaszlo Ersek 9821da177e4SLinus Torvalds /** 9831da177e4SLinus Torvalds * efi_range_is_wc - check the WC bit on an address range 9841da177e4SLinus Torvalds * @start: starting kvirt address 9851da177e4SLinus Torvalds * @len: length of range 9861da177e4SLinus Torvalds * 9871da177e4SLinus Torvalds * Consult the EFI memory map and make sure it's ok to set this range WC. 9881da177e4SLinus Torvalds * Returns true or false. 9891da177e4SLinus Torvalds */ 9901da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len) 9911da177e4SLinus Torvalds { 992986a80d5SJesper Juhl unsigned long i; 9931da177e4SLinus Torvalds 9941da177e4SLinus Torvalds for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) { 9951da177e4SLinus Torvalds unsigned long paddr = __pa(start + i); 9961da177e4SLinus Torvalds if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC)) 9971da177e4SLinus Torvalds return 0; 9981da177e4SLinus Torvalds } 9991da177e4SLinus Torvalds /* The range checked out */ 10001da177e4SLinus Torvalds return 1; 10011da177e4SLinus Torvalds } 10021da177e4SLinus Torvalds 10031da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP 10041da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *); 10051da177e4SLinus Torvalds #endif 10061da177e4SLinus Torvalds 10071da177e4SLinus Torvalds /* 100883e68189SMatt Fleming * We play games with efi_enabled so that the compiler will, if 100983e68189SMatt Fleming * possible, remove EFI-related code altogether. 10101da177e4SLinus Torvalds */ 101183e68189SMatt Fleming #define EFI_BOOT 0 /* Were we booted from EFI? */ 101283e68189SMatt Fleming #define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */ 101383e68189SMatt Fleming #define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */ 101483e68189SMatt Fleming #define EFI_MEMMAP 4 /* Can we use EFI memory map? */ 101583e68189SMatt Fleming #define EFI_64BIT 5 /* Is the firmware 64-bit? */ 10169f27bc54SDaniel Kiper #define EFI_PARAVIRT 6 /* Access is via a paravirt interface */ 10179f27bc54SDaniel Kiper #define EFI_ARCH_1 7 /* First arch-specific bit */ 1018fed6cefeSBorislav Petkov #define EFI_DBG 8 /* Print additional debug info at runtime */ 1019a1041713SArd Biesheuvel #define EFI_NX_PE_DATA 9 /* Can runtime data regions be mapped non-executable? */ 102083e68189SMatt Fleming 10211da177e4SLinus Torvalds #ifdef CONFIG_EFI 10223e909599SMatt Fleming /* 10233e909599SMatt Fleming * Test whether the above EFI_* bits are enabled. 10243e909599SMatt Fleming */ 10253e909599SMatt Fleming static inline bool efi_enabled(int feature) 102683e68189SMatt Fleming { 10273e909599SMatt Fleming return test_bit(feature, &efi.flags) != 0; 10283e909599SMatt Fleming } 10298562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); 10303e909599SMatt Fleming #else 10313e909599SMatt Fleming static inline bool efi_enabled(int feature) 10323e909599SMatt Fleming { 10333e909599SMatt Fleming return false; 103483e68189SMatt Fleming } 10358562c99cSMatt Fleming static inline void 10368562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {} 10371da177e4SLinus Torvalds #endif 10381da177e4SLinus Torvalds 10391da177e4SLinus Torvalds /* 10401da177e4SLinus Torvalds * Variable Attributes 10411da177e4SLinus Torvalds */ 10421da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001 10431da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002 10441da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004 104541b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008 104641b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010 104741b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020 104841b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE 0x0000000000000040 10491da177e4SLinus Torvalds 105041b3254cSMatthew Garrett #define EFI_VARIABLE_MASK (EFI_VARIABLE_NON_VOLATILE | \ 105141b3254cSMatthew Garrett EFI_VARIABLE_BOOTSERVICE_ACCESS | \ 105241b3254cSMatthew Garrett EFI_VARIABLE_RUNTIME_ACCESS | \ 105341b3254cSMatthew Garrett EFI_VARIABLE_HARDWARE_ERROR_RECORD | \ 105441b3254cSMatthew Garrett EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \ 105541b3254cSMatthew Garrett EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \ 105641b3254cSMatthew Garrett EFI_VARIABLE_APPEND_WRITE) 10571da177e4SLinus Torvalds /* 1058e14ab23dSMatt Fleming * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")) 1059e14ab23dSMatt Fleming * not including trailing NUL 1060e14ab23dSMatt Fleming */ 1061e14ab23dSMatt Fleming #define EFI_VARIABLE_GUID_LEN 36 1062e14ab23dSMatt Fleming 1063e14ab23dSMatt Fleming /* 1064e2527a7cSMatt Fleming * The type of search to perform when calling boottime->locate_handle 1065e2527a7cSMatt Fleming */ 1066e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES 0 1067e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY 1 1068e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL 2 1069e2527a7cSMatt Fleming 1070e2527a7cSMatt Fleming /* 10711da177e4SLinus Torvalds * EFI Device Path information 10721da177e4SLinus Torvalds */ 10731da177e4SLinus Torvalds #define EFI_DEV_HW 0x01 10741da177e4SLinus Torvalds #define EFI_DEV_PCI 1 10751da177e4SLinus Torvalds #define EFI_DEV_PCCARD 2 10761da177e4SLinus Torvalds #define EFI_DEV_MEM_MAPPED 3 10771da177e4SLinus Torvalds #define EFI_DEV_VENDOR 4 10781da177e4SLinus Torvalds #define EFI_DEV_CONTROLLER 5 10791da177e4SLinus Torvalds #define EFI_DEV_ACPI 0x02 10801da177e4SLinus Torvalds #define EFI_DEV_BASIC_ACPI 1 10811da177e4SLinus Torvalds #define EFI_DEV_EXPANDED_ACPI 2 10821da177e4SLinus Torvalds #define EFI_DEV_MSG 0x03 10831da177e4SLinus Torvalds #define EFI_DEV_MSG_ATAPI 1 10841da177e4SLinus Torvalds #define EFI_DEV_MSG_SCSI 2 10851da177e4SLinus Torvalds #define EFI_DEV_MSG_FC 3 10861da177e4SLinus Torvalds #define EFI_DEV_MSG_1394 4 10871da177e4SLinus Torvalds #define EFI_DEV_MSG_USB 5 10881da177e4SLinus Torvalds #define EFI_DEV_MSG_USB_CLASS 15 10891da177e4SLinus Torvalds #define EFI_DEV_MSG_I20 6 10901da177e4SLinus Torvalds #define EFI_DEV_MSG_MAC 11 10911da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV4 12 10921da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV6 13 10931da177e4SLinus Torvalds #define EFI_DEV_MSG_INFINIBAND 9 10941da177e4SLinus Torvalds #define EFI_DEV_MSG_UART 14 10951da177e4SLinus Torvalds #define EFI_DEV_MSG_VENDOR 10 10961da177e4SLinus Torvalds #define EFI_DEV_MEDIA 0x04 10971da177e4SLinus Torvalds #define EFI_DEV_MEDIA_HARD_DRIVE 1 10981da177e4SLinus Torvalds #define EFI_DEV_MEDIA_CDROM 2 10991da177e4SLinus Torvalds #define EFI_DEV_MEDIA_VENDOR 3 11001da177e4SLinus Torvalds #define EFI_DEV_MEDIA_FILE 4 11011da177e4SLinus Torvalds #define EFI_DEV_MEDIA_PROTOCOL 5 11021da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT 0x05 11031da177e4SLinus Torvalds #define EFI_DEV_END_PATH 0x7F 11041da177e4SLinus Torvalds #define EFI_DEV_END_PATH2 0xFF 11051da177e4SLinus Torvalds #define EFI_DEV_END_INSTANCE 0x01 11061da177e4SLinus Torvalds #define EFI_DEV_END_ENTIRE 0xFF 11071da177e4SLinus Torvalds 11081da177e4SLinus Torvalds struct efi_generic_dev_path { 11091da177e4SLinus Torvalds u8 type; 11101da177e4SLinus Torvalds u8 sub_type; 11111da177e4SLinus Torvalds u16 length; 11121da177e4SLinus Torvalds } __attribute ((packed)); 11131da177e4SLinus Torvalds 11144a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages) 11154a3575fdSHuang, Ying { 11164a3575fdSHuang, Ying *npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr); 11174a3575fdSHuang, Ying *addr &= PAGE_MASK; 11184a3575fdSHuang, Ying } 11194a3575fdSHuang, Ying 112004851772SMatt Fleming /* 11214fc756bdSMike Waychison * EFI Variable support. 11224fc756bdSMike Waychison * 11234fc756bdSMike Waychison * Different firmware drivers can expose their EFI-like variables using 11244fc756bdSMike Waychison * the following. 11254fc756bdSMike Waychison */ 11264fc756bdSMike Waychison 11274fc756bdSMike Waychison struct efivar_operations { 11284fc756bdSMike Waychison efi_get_variable_t *get_variable; 11294fc756bdSMike Waychison efi_get_next_variable_t *get_next_variable; 11304fc756bdSMike Waychison efi_set_variable_t *set_variable; 113170d2a3cfSArd Biesheuvel efi_set_variable_t *set_variable_nonblocking; 1132a6e4d5a0SMatt Fleming efi_query_variable_store_t *query_variable_store; 11334fc756bdSMike Waychison }; 11344fc756bdSMike Waychison 11354fc756bdSMike Waychison struct efivars { 11364fc756bdSMike Waychison /* 11374fc756bdSMike Waychison * ->lock protects two things: 113882f990a8SMatt Fleming * 1) efivarfs_list and efivars_sysfs_list 113982f990a8SMatt Fleming * 2) ->ops calls 11404fc756bdSMike Waychison */ 11414fc756bdSMike Waychison spinlock_t lock; 11424fc756bdSMike Waychison struct kset *kset; 1143605e70c7SLee, Chun-Yi struct kobject *kobject; 11444fc756bdSMike Waychison const struct efivar_operations *ops; 11454fc756bdSMike Waychison }; 11464fc756bdSMike Waychison 1147e14ab23dSMatt Fleming /* 1148e14ab23dSMatt Fleming * The maximum size of VariableName + Data = 1024 1149e14ab23dSMatt Fleming * Therefore, it's reasonable to save that much 1150e14ab23dSMatt Fleming * space in each part of the structure, 1151e14ab23dSMatt Fleming * and we use a page for reading/writing. 1152e14ab23dSMatt Fleming */ 1153e14ab23dSMatt Fleming 1154a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN 1024 1155a5d92ad3SMatt Fleming 1156e14ab23dSMatt Fleming struct efi_variable { 1157a5d92ad3SMatt Fleming efi_char16_t VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)]; 1158e14ab23dSMatt Fleming efi_guid_t VendorGuid; 1159e14ab23dSMatt Fleming unsigned long DataSize; 1160e14ab23dSMatt Fleming __u8 Data[1024]; 1161e14ab23dSMatt Fleming efi_status_t Status; 1162e14ab23dSMatt Fleming __u32 Attributes; 1163e14ab23dSMatt Fleming } __attribute__((packed)); 1164e14ab23dSMatt Fleming 1165e14ab23dSMatt Fleming struct efivar_entry { 1166e14ab23dSMatt Fleming struct efi_variable var; 1167e14ab23dSMatt Fleming struct list_head list; 1168e14ab23dSMatt Fleming struct kobject kobj; 1169e0d59733SSeiji Aguchi bool scanning; 1170e0d59733SSeiji Aguchi bool deleting; 1171e14ab23dSMatt Fleming }; 1172e14ab23dSMatt Fleming 1173677703ceSMatt Fleming struct efi_simple_text_output_protocol_32 { 1174677703ceSMatt Fleming u32 reset; 1175677703ceSMatt Fleming u32 output_string; 1176677703ceSMatt Fleming u32 test_string; 1177677703ceSMatt Fleming }; 1178677703ceSMatt Fleming 1179677703ceSMatt Fleming struct efi_simple_text_output_protocol_64 { 1180677703ceSMatt Fleming u64 reset; 1181677703ceSMatt Fleming u64 output_string; 1182677703ceSMatt Fleming u64 test_string; 1183677703ceSMatt Fleming }; 1184ed37ddffSRoy Franz 1185ed37ddffSRoy Franz struct efi_simple_text_output_protocol { 1186ed37ddffSRoy Franz void *reset; 1187ed37ddffSRoy Franz efi_status_t (*output_string)(void *, void *); 1188ed37ddffSRoy Franz void *test_string; 1189ed37ddffSRoy Franz }; 1190ed37ddffSRoy Franz 119104851772SMatt Fleming extern struct list_head efivar_sysfs_list; 119204851772SMatt Fleming 119304851772SMatt Fleming static inline void 119404851772SMatt Fleming efivar_unregister(struct efivar_entry *var) 119504851772SMatt Fleming { 119604851772SMatt Fleming kobject_put(&var->kobj); 119704851772SMatt Fleming } 119804851772SMatt Fleming 1199e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars, 12004fc756bdSMike Waychison const struct efivar_operations *ops, 1201e14ab23dSMatt Fleming struct kobject *kobject); 1202e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars); 1203e14ab23dSMatt Fleming struct kobject *efivars_kobject(void); 1204e14ab23dSMatt Fleming 1205e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *), 1206e14ab23dSMatt Fleming void *data, bool atomic, bool duplicates, 1207e14ab23dSMatt Fleming struct list_head *head); 1208e14ab23dSMatt Fleming 1209e14ab23dSMatt Fleming void efivar_entry_add(struct efivar_entry *entry, struct list_head *head); 1210e14ab23dSMatt Fleming void efivar_entry_remove(struct efivar_entry *entry); 1211e14ab23dSMatt Fleming 1212e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry); 1213e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry); 1214e14ab23dSMatt Fleming 1215e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size); 12168a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 12178a415b8cSMatt Fleming unsigned long *size, void *data); 1218e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 1219e14ab23dSMatt Fleming unsigned long *size, void *data); 1220e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes, 1221e14ab23dSMatt Fleming unsigned long size, void *data, struct list_head *head); 1222e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes, 1223e14ab23dSMatt Fleming unsigned long *size, void *data, bool *set); 1224e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, 1225e14ab23dSMatt Fleming bool block, unsigned long size, void *data); 1226e14ab23dSMatt Fleming 1227e14ab23dSMatt Fleming void efivar_entry_iter_begin(void); 1228e14ab23dSMatt Fleming void efivar_entry_iter_end(void); 1229e14ab23dSMatt Fleming 1230e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1231e14ab23dSMatt Fleming struct list_head *head, void *data, 1232e14ab23dSMatt Fleming struct efivar_entry **prev); 1233e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1234e14ab23dSMatt Fleming struct list_head *head, void *data); 1235e14ab23dSMatt Fleming 1236e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, 1237e14ab23dSMatt Fleming struct list_head *head, bool remove); 1238e14ab23dSMatt Fleming 12398282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data, 12408282f5d9SPeter Jones unsigned long data_size); 1241ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name, 1242ed8b0de5SPeter Jones size_t len); 1243e14ab23dSMatt Fleming 1244a9499fa7STom Gundersen extern struct work_struct efivar_work; 124504851772SMatt Fleming void efivar_run_worker(void); 124604851772SMatt Fleming 1247a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE) 1248e14ab23dSMatt Fleming int efivars_sysfs_init(void); 12494fc756bdSMike Waychison 1250e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024 1251e0d59733SSeiji Aguchi 12524fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */ 12534fc756bdSMike Waychison 1254926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP 1255926172d4SDave Young int efi_runtime_map_init(struct kobject *); 1256926172d4SDave Young void efi_runtime_map_setup(void *, int, u32); 12576a2c20e7SVivek Goyal int efi_get_runtime_map_size(void); 12586a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void); 12596a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz); 1260926172d4SDave Young #else 1261926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj) 1262926172d4SDave Young { 1263926172d4SDave Young return 0; 1264926172d4SDave Young } 1265926172d4SDave Young 1266926172d4SDave Young static inline void 1267926172d4SDave Young efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size) {} 12686a2c20e7SVivek Goyal 12696a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void) 12706a2c20e7SVivek Goyal { 12716a2c20e7SVivek Goyal return 0; 12726a2c20e7SVivek Goyal } 12736a2c20e7SVivek Goyal 12746a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void) 12756a2c20e7SVivek Goyal { 12766a2c20e7SVivek Goyal return 0; 12776a2c20e7SVivek Goyal } 12786a2c20e7SVivek Goyal 12796a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz) 12806a2c20e7SVivek Goyal { 12816a2c20e7SVivek Goyal return 0; 12826a2c20e7SVivek Goyal } 12836a2c20e7SVivek Goyal 1284926172d4SDave Young #endif 1285926172d4SDave Young 1286bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */ 1287bd669475SArd Biesheuvel 1288bd669475SArd Biesheuvel #define pr_efi(sys_table, msg) efi_printk(sys_table, "EFI stub: "msg) 1289bd669475SArd Biesheuvel #define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg) 1290bd669475SArd Biesheuvel 1291bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str); 1292bd669475SArd Biesheuvel 1293bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size, 1294bd669475SArd Biesheuvel unsigned long addr); 1295bd669475SArd Biesheuvel 1296bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg, 1297bd669475SArd Biesheuvel efi_loaded_image_t *image, int *cmd_line_len); 1298bd669475SArd Biesheuvel 1299bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg, 1300bd669475SArd Biesheuvel efi_memory_desc_t **map, 1301bd669475SArd Biesheuvel unsigned long *map_size, 1302bd669475SArd Biesheuvel unsigned long *desc_size, 1303bd669475SArd Biesheuvel u32 *desc_ver, 1304bd669475SArd Biesheuvel unsigned long *key_ptr); 1305bd669475SArd Biesheuvel 1306bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg, 1307bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1308bd669475SArd Biesheuvel unsigned long *addr); 1309bd669475SArd Biesheuvel 1310bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg, 1311bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1312bd669475SArd Biesheuvel unsigned long *addr, unsigned long max); 1313bd669475SArd Biesheuvel 1314bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg, 1315bd669475SArd Biesheuvel unsigned long *image_addr, 1316bd669475SArd Biesheuvel unsigned long image_size, 1317bd669475SArd Biesheuvel unsigned long alloc_size, 1318bd669475SArd Biesheuvel unsigned long preferred_addr, 1319bd669475SArd Biesheuvel unsigned long alignment); 1320bd669475SArd Biesheuvel 1321bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg, 1322bd669475SArd Biesheuvel efi_loaded_image_t *image, 1323bd669475SArd Biesheuvel char *cmd_line, char *option_string, 1324bd669475SArd Biesheuvel unsigned long max_addr, 1325bd669475SArd Biesheuvel unsigned long *load_addr, 1326bd669475SArd Biesheuvel unsigned long *load_size); 1327bd669475SArd Biesheuvel 13285a17dae4SMatt Fleming efi_status_t efi_parse_options(char *cmdline); 13295a17dae4SMatt Fleming 1330b2e0a54aSDave Young bool efi_runtime_disabled(void); 13311da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */ 1332