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 626*a604af07SArd Biesheuvel #define EFI_MEMORY_ATTRIBUTES_TABLE_GUID \ 627*a604af07SArd Biesheuvel EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, \ 628*a604af07SArd Biesheuvel 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20) 629*a604af07SArd 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 854*a604af07SArd Biesheuvel typedef struct { 855*a604af07SArd Biesheuvel u32 version; 856*a604af07SArd Biesheuvel u32 num_entries; 857*a604af07SArd Biesheuvel u32 desc_size; 858*a604af07SArd Biesheuvel u32 reserved; 859*a604af07SArd Biesheuvel efi_memory_desc_t entry[0]; 860*a604af07SArd Biesheuvel } efi_memory_attributes_table_t; 861*a604af07SArd 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 */ 883*a604af07SArd 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 972e885cd80SMark Salter /* Iterate through an efi_memory_map */ 97378ce248fSMatt Fleming #define for_each_efi_memory_desc_in_map(m, md) \ 974e885cd80SMark Salter for ((md) = (m)->map; \ 975e885cd80SMark Salter (md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \ 976e885cd80SMark Salter (md) = (void *)(md) + (m)->desc_size) 977e885cd80SMark Salter 97878ce248fSMatt Fleming /** 97978ce248fSMatt Fleming * for_each_efi_memory_desc - iterate over descriptors in efi.memmap 98078ce248fSMatt Fleming * @md: the efi_memory_desc_t * iterator 98178ce248fSMatt Fleming * 98278ce248fSMatt Fleming * Once the loop finishes @md must not be accessed. 98378ce248fSMatt Fleming */ 98478ce248fSMatt Fleming #define for_each_efi_memory_desc(md) \ 985884f4f66SMatt Fleming for_each_efi_memory_desc_in_map(&efi.memmap, md) 98678ce248fSMatt Fleming 98798d2a6caSLaszlo Ersek /* 98898d2a6caSLaszlo Ersek * Format an EFI memory descriptor's type and attributes to a user-provided 98998d2a6caSLaszlo Ersek * character buffer, as per snprintf(), and return the buffer. 99098d2a6caSLaszlo Ersek */ 99198d2a6caSLaszlo Ersek char * __init efi_md_typeattr_format(char *buf, size_t size, 99298d2a6caSLaszlo Ersek const efi_memory_desc_t *md); 99398d2a6caSLaszlo Ersek 9941da177e4SLinus Torvalds /** 9951da177e4SLinus Torvalds * efi_range_is_wc - check the WC bit on an address range 9961da177e4SLinus Torvalds * @start: starting kvirt address 9971da177e4SLinus Torvalds * @len: length of range 9981da177e4SLinus Torvalds * 9991da177e4SLinus Torvalds * Consult the EFI memory map and make sure it's ok to set this range WC. 10001da177e4SLinus Torvalds * Returns true or false. 10011da177e4SLinus Torvalds */ 10021da177e4SLinus Torvalds static inline int efi_range_is_wc(unsigned long start, unsigned long len) 10031da177e4SLinus Torvalds { 1004986a80d5SJesper Juhl unsigned long i; 10051da177e4SLinus Torvalds 10061da177e4SLinus Torvalds for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) { 10071da177e4SLinus Torvalds unsigned long paddr = __pa(start + i); 10081da177e4SLinus Torvalds if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC)) 10091da177e4SLinus Torvalds return 0; 10101da177e4SLinus Torvalds } 10111da177e4SLinus Torvalds /* The range checked out */ 10121da177e4SLinus Torvalds return 1; 10131da177e4SLinus Torvalds } 10141da177e4SLinus Torvalds 10151da177e4SLinus Torvalds #ifdef CONFIG_EFI_PCDP 10161da177e4SLinus Torvalds extern int __init efi_setup_pcdp_console(char *); 10171da177e4SLinus Torvalds #endif 10181da177e4SLinus Torvalds 10191da177e4SLinus Torvalds /* 102083e68189SMatt Fleming * We play games with efi_enabled so that the compiler will, if 102183e68189SMatt Fleming * possible, remove EFI-related code altogether. 10221da177e4SLinus Torvalds */ 102383e68189SMatt Fleming #define EFI_BOOT 0 /* Were we booted from EFI? */ 102483e68189SMatt Fleming #define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */ 102583e68189SMatt Fleming #define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */ 102683e68189SMatt Fleming #define EFI_MEMMAP 4 /* Can we use EFI memory map? */ 102783e68189SMatt Fleming #define EFI_64BIT 5 /* Is the firmware 64-bit? */ 10289f27bc54SDaniel Kiper #define EFI_PARAVIRT 6 /* Access is via a paravirt interface */ 10299f27bc54SDaniel Kiper #define EFI_ARCH_1 7 /* First arch-specific bit */ 1030fed6cefeSBorislav Petkov #define EFI_DBG 8 /* Print additional debug info at runtime */ 1031a1041713SArd Biesheuvel #define EFI_NX_PE_DATA 9 /* Can runtime data regions be mapped non-executable? */ 103283e68189SMatt Fleming 10331da177e4SLinus Torvalds #ifdef CONFIG_EFI 10343e909599SMatt Fleming /* 10353e909599SMatt Fleming * Test whether the above EFI_* bits are enabled. 10363e909599SMatt Fleming */ 10373e909599SMatt Fleming static inline bool efi_enabled(int feature) 103883e68189SMatt Fleming { 10393e909599SMatt Fleming return test_bit(feature, &efi.flags) != 0; 10403e909599SMatt Fleming } 10418562c99cSMatt Fleming extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); 10423e909599SMatt Fleming #else 10433e909599SMatt Fleming static inline bool efi_enabled(int feature) 10443e909599SMatt Fleming { 10453e909599SMatt Fleming return false; 104683e68189SMatt Fleming } 10478562c99cSMatt Fleming static inline void 10488562c99cSMatt Fleming efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {} 10491da177e4SLinus Torvalds #endif 10501da177e4SLinus Torvalds 10511da177e4SLinus Torvalds /* 10521da177e4SLinus Torvalds * Variable Attributes 10531da177e4SLinus Torvalds */ 10541da177e4SLinus Torvalds #define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001 10551da177e4SLinus Torvalds #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002 10561da177e4SLinus Torvalds #define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004 105741b3254cSMatthew Garrett #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008 105841b3254cSMatthew Garrett #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010 105941b3254cSMatthew Garrett #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020 106041b3254cSMatthew Garrett #define EFI_VARIABLE_APPEND_WRITE 0x0000000000000040 10611da177e4SLinus Torvalds 106241b3254cSMatthew Garrett #define EFI_VARIABLE_MASK (EFI_VARIABLE_NON_VOLATILE | \ 106341b3254cSMatthew Garrett EFI_VARIABLE_BOOTSERVICE_ACCESS | \ 106441b3254cSMatthew Garrett EFI_VARIABLE_RUNTIME_ACCESS | \ 106541b3254cSMatthew Garrett EFI_VARIABLE_HARDWARE_ERROR_RECORD | \ 106641b3254cSMatthew Garrett EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \ 106741b3254cSMatthew Garrett EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \ 106841b3254cSMatthew Garrett EFI_VARIABLE_APPEND_WRITE) 10691da177e4SLinus Torvalds /* 1070e14ab23dSMatt Fleming * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")) 1071e14ab23dSMatt Fleming * not including trailing NUL 1072e14ab23dSMatt Fleming */ 1073e14ab23dSMatt Fleming #define EFI_VARIABLE_GUID_LEN 36 1074e14ab23dSMatt Fleming 1075e14ab23dSMatt Fleming /* 1076e2527a7cSMatt Fleming * The type of search to perform when calling boottime->locate_handle 1077e2527a7cSMatt Fleming */ 1078e2527a7cSMatt Fleming #define EFI_LOCATE_ALL_HANDLES 0 1079e2527a7cSMatt Fleming #define EFI_LOCATE_BY_REGISTER_NOTIFY 1 1080e2527a7cSMatt Fleming #define EFI_LOCATE_BY_PROTOCOL 2 1081e2527a7cSMatt Fleming 1082e2527a7cSMatt Fleming /* 10831da177e4SLinus Torvalds * EFI Device Path information 10841da177e4SLinus Torvalds */ 10851da177e4SLinus Torvalds #define EFI_DEV_HW 0x01 10861da177e4SLinus Torvalds #define EFI_DEV_PCI 1 10871da177e4SLinus Torvalds #define EFI_DEV_PCCARD 2 10881da177e4SLinus Torvalds #define EFI_DEV_MEM_MAPPED 3 10891da177e4SLinus Torvalds #define EFI_DEV_VENDOR 4 10901da177e4SLinus Torvalds #define EFI_DEV_CONTROLLER 5 10911da177e4SLinus Torvalds #define EFI_DEV_ACPI 0x02 10921da177e4SLinus Torvalds #define EFI_DEV_BASIC_ACPI 1 10931da177e4SLinus Torvalds #define EFI_DEV_EXPANDED_ACPI 2 10941da177e4SLinus Torvalds #define EFI_DEV_MSG 0x03 10951da177e4SLinus Torvalds #define EFI_DEV_MSG_ATAPI 1 10961da177e4SLinus Torvalds #define EFI_DEV_MSG_SCSI 2 10971da177e4SLinus Torvalds #define EFI_DEV_MSG_FC 3 10981da177e4SLinus Torvalds #define EFI_DEV_MSG_1394 4 10991da177e4SLinus Torvalds #define EFI_DEV_MSG_USB 5 11001da177e4SLinus Torvalds #define EFI_DEV_MSG_USB_CLASS 15 11011da177e4SLinus Torvalds #define EFI_DEV_MSG_I20 6 11021da177e4SLinus Torvalds #define EFI_DEV_MSG_MAC 11 11031da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV4 12 11041da177e4SLinus Torvalds #define EFI_DEV_MSG_IPV6 13 11051da177e4SLinus Torvalds #define EFI_DEV_MSG_INFINIBAND 9 11061da177e4SLinus Torvalds #define EFI_DEV_MSG_UART 14 11071da177e4SLinus Torvalds #define EFI_DEV_MSG_VENDOR 10 11081da177e4SLinus Torvalds #define EFI_DEV_MEDIA 0x04 11091da177e4SLinus Torvalds #define EFI_DEV_MEDIA_HARD_DRIVE 1 11101da177e4SLinus Torvalds #define EFI_DEV_MEDIA_CDROM 2 11111da177e4SLinus Torvalds #define EFI_DEV_MEDIA_VENDOR 3 11121da177e4SLinus Torvalds #define EFI_DEV_MEDIA_FILE 4 11131da177e4SLinus Torvalds #define EFI_DEV_MEDIA_PROTOCOL 5 11141da177e4SLinus Torvalds #define EFI_DEV_BIOS_BOOT 0x05 11151da177e4SLinus Torvalds #define EFI_DEV_END_PATH 0x7F 11161da177e4SLinus Torvalds #define EFI_DEV_END_PATH2 0xFF 11171da177e4SLinus Torvalds #define EFI_DEV_END_INSTANCE 0x01 11181da177e4SLinus Torvalds #define EFI_DEV_END_ENTIRE 0xFF 11191da177e4SLinus Torvalds 11201da177e4SLinus Torvalds struct efi_generic_dev_path { 11211da177e4SLinus Torvalds u8 type; 11221da177e4SLinus Torvalds u8 sub_type; 11231da177e4SLinus Torvalds u16 length; 11241da177e4SLinus Torvalds } __attribute ((packed)); 11251da177e4SLinus Torvalds 11264a3575fdSHuang, Ying static inline void memrange_efi_to_native(u64 *addr, u64 *npages) 11274a3575fdSHuang, Ying { 11284a3575fdSHuang, Ying *npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr); 11294a3575fdSHuang, Ying *addr &= PAGE_MASK; 11304a3575fdSHuang, Ying } 11314a3575fdSHuang, Ying 113204851772SMatt Fleming /* 11334fc756bdSMike Waychison * EFI Variable support. 11344fc756bdSMike Waychison * 11354fc756bdSMike Waychison * Different firmware drivers can expose their EFI-like variables using 11364fc756bdSMike Waychison * the following. 11374fc756bdSMike Waychison */ 11384fc756bdSMike Waychison 11394fc756bdSMike Waychison struct efivar_operations { 11404fc756bdSMike Waychison efi_get_variable_t *get_variable; 11414fc756bdSMike Waychison efi_get_next_variable_t *get_next_variable; 11424fc756bdSMike Waychison efi_set_variable_t *set_variable; 114370d2a3cfSArd Biesheuvel efi_set_variable_t *set_variable_nonblocking; 1144a6e4d5a0SMatt Fleming efi_query_variable_store_t *query_variable_store; 11454fc756bdSMike Waychison }; 11464fc756bdSMike Waychison 11474fc756bdSMike Waychison struct efivars { 11484fc756bdSMike Waychison /* 11494fc756bdSMike Waychison * ->lock protects two things: 115082f990a8SMatt Fleming * 1) efivarfs_list and efivars_sysfs_list 115182f990a8SMatt Fleming * 2) ->ops calls 11524fc756bdSMike Waychison */ 11534fc756bdSMike Waychison spinlock_t lock; 11544fc756bdSMike Waychison struct kset *kset; 1155605e70c7SLee, Chun-Yi struct kobject *kobject; 11564fc756bdSMike Waychison const struct efivar_operations *ops; 11574fc756bdSMike Waychison }; 11584fc756bdSMike Waychison 1159e14ab23dSMatt Fleming /* 1160e14ab23dSMatt Fleming * The maximum size of VariableName + Data = 1024 1161e14ab23dSMatt Fleming * Therefore, it's reasonable to save that much 1162e14ab23dSMatt Fleming * space in each part of the structure, 1163e14ab23dSMatt Fleming * and we use a page for reading/writing. 1164e14ab23dSMatt Fleming */ 1165e14ab23dSMatt Fleming 1166a5d92ad3SMatt Fleming #define EFI_VAR_NAME_LEN 1024 1167a5d92ad3SMatt Fleming 1168e14ab23dSMatt Fleming struct efi_variable { 1169a5d92ad3SMatt Fleming efi_char16_t VariableName[EFI_VAR_NAME_LEN/sizeof(efi_char16_t)]; 1170e14ab23dSMatt Fleming efi_guid_t VendorGuid; 1171e14ab23dSMatt Fleming unsigned long DataSize; 1172e14ab23dSMatt Fleming __u8 Data[1024]; 1173e14ab23dSMatt Fleming efi_status_t Status; 1174e14ab23dSMatt Fleming __u32 Attributes; 1175e14ab23dSMatt Fleming } __attribute__((packed)); 1176e14ab23dSMatt Fleming 1177e14ab23dSMatt Fleming struct efivar_entry { 1178e14ab23dSMatt Fleming struct efi_variable var; 1179e14ab23dSMatt Fleming struct list_head list; 1180e14ab23dSMatt Fleming struct kobject kobj; 1181e0d59733SSeiji Aguchi bool scanning; 1182e0d59733SSeiji Aguchi bool deleting; 1183e14ab23dSMatt Fleming }; 1184e14ab23dSMatt Fleming 1185677703ceSMatt Fleming struct efi_simple_text_output_protocol_32 { 1186677703ceSMatt Fleming u32 reset; 1187677703ceSMatt Fleming u32 output_string; 1188677703ceSMatt Fleming u32 test_string; 1189677703ceSMatt Fleming }; 1190677703ceSMatt Fleming 1191677703ceSMatt Fleming struct efi_simple_text_output_protocol_64 { 1192677703ceSMatt Fleming u64 reset; 1193677703ceSMatt Fleming u64 output_string; 1194677703ceSMatt Fleming u64 test_string; 1195677703ceSMatt Fleming }; 1196ed37ddffSRoy Franz 1197ed37ddffSRoy Franz struct efi_simple_text_output_protocol { 1198ed37ddffSRoy Franz void *reset; 1199ed37ddffSRoy Franz efi_status_t (*output_string)(void *, void *); 1200ed37ddffSRoy Franz void *test_string; 1201ed37ddffSRoy Franz }; 1202ed37ddffSRoy Franz 120304851772SMatt Fleming extern struct list_head efivar_sysfs_list; 120404851772SMatt Fleming 120504851772SMatt Fleming static inline void 120604851772SMatt Fleming efivar_unregister(struct efivar_entry *var) 120704851772SMatt Fleming { 120804851772SMatt Fleming kobject_put(&var->kobj); 120904851772SMatt Fleming } 121004851772SMatt Fleming 1211e14ab23dSMatt Fleming int efivars_register(struct efivars *efivars, 12124fc756bdSMike Waychison const struct efivar_operations *ops, 1213e14ab23dSMatt Fleming struct kobject *kobject); 1214e14ab23dSMatt Fleming int efivars_unregister(struct efivars *efivars); 1215e14ab23dSMatt Fleming struct kobject *efivars_kobject(void); 1216e14ab23dSMatt Fleming 1217e14ab23dSMatt Fleming int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *), 1218e14ab23dSMatt Fleming void *data, bool atomic, bool duplicates, 1219e14ab23dSMatt Fleming struct list_head *head); 1220e14ab23dSMatt Fleming 1221e14ab23dSMatt Fleming void efivar_entry_add(struct efivar_entry *entry, struct list_head *head); 1222e14ab23dSMatt Fleming void efivar_entry_remove(struct efivar_entry *entry); 1223e14ab23dSMatt Fleming 1224e14ab23dSMatt Fleming int __efivar_entry_delete(struct efivar_entry *entry); 1225e14ab23dSMatt Fleming int efivar_entry_delete(struct efivar_entry *entry); 1226e14ab23dSMatt Fleming 1227e14ab23dSMatt Fleming int efivar_entry_size(struct efivar_entry *entry, unsigned long *size); 12288a415b8cSMatt Fleming int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 12298a415b8cSMatt Fleming unsigned long *size, void *data); 1230e14ab23dSMatt Fleming int efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 1231e14ab23dSMatt Fleming unsigned long *size, void *data); 1232e14ab23dSMatt Fleming int efivar_entry_set(struct efivar_entry *entry, u32 attributes, 1233e14ab23dSMatt Fleming unsigned long size, void *data, struct list_head *head); 1234e14ab23dSMatt Fleming int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes, 1235e14ab23dSMatt Fleming unsigned long *size, void *data, bool *set); 1236e14ab23dSMatt Fleming int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, 1237e14ab23dSMatt Fleming bool block, unsigned long size, void *data); 1238e14ab23dSMatt Fleming 1239e14ab23dSMatt Fleming void efivar_entry_iter_begin(void); 1240e14ab23dSMatt Fleming void efivar_entry_iter_end(void); 1241e14ab23dSMatt Fleming 1242e14ab23dSMatt Fleming int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1243e14ab23dSMatt Fleming struct list_head *head, void *data, 1244e14ab23dSMatt Fleming struct efivar_entry **prev); 1245e14ab23dSMatt Fleming int efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1246e14ab23dSMatt Fleming struct list_head *head, void *data); 1247e14ab23dSMatt Fleming 1248e14ab23dSMatt Fleming struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, 1249e14ab23dSMatt Fleming struct list_head *head, bool remove); 1250e14ab23dSMatt Fleming 12518282f5d9SPeter Jones bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data, 12528282f5d9SPeter Jones unsigned long data_size); 1253ed8b0de5SPeter Jones bool efivar_variable_is_removable(efi_guid_t vendor, const char *name, 1254ed8b0de5SPeter Jones size_t len); 1255e14ab23dSMatt Fleming 1256a9499fa7STom Gundersen extern struct work_struct efivar_work; 125704851772SMatt Fleming void efivar_run_worker(void); 125804851772SMatt Fleming 1259a9499fa7STom Gundersen #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE) 1260e14ab23dSMatt Fleming int efivars_sysfs_init(void); 12614fc756bdSMike Waychison 1262e0d59733SSeiji Aguchi #define EFIVARS_DATA_SIZE_MAX 1024 1263e0d59733SSeiji Aguchi 12644fc756bdSMike Waychison #endif /* CONFIG_EFI_VARS */ 12654fc756bdSMike Waychison 1266926172d4SDave Young #ifdef CONFIG_EFI_RUNTIME_MAP 1267926172d4SDave Young int efi_runtime_map_init(struct kobject *); 1268926172d4SDave Young void efi_runtime_map_setup(void *, int, u32); 12696a2c20e7SVivek Goyal int efi_get_runtime_map_size(void); 12706a2c20e7SVivek Goyal int efi_get_runtime_map_desc_size(void); 12716a2c20e7SVivek Goyal int efi_runtime_map_copy(void *buf, size_t bufsz); 1272926172d4SDave Young #else 1273926172d4SDave Young static inline int efi_runtime_map_init(struct kobject *kobj) 1274926172d4SDave Young { 1275926172d4SDave Young return 0; 1276926172d4SDave Young } 1277926172d4SDave Young 1278926172d4SDave Young static inline void 1279926172d4SDave Young efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size) {} 12806a2c20e7SVivek Goyal 12816a2c20e7SVivek Goyal static inline int efi_get_runtime_map_size(void) 12826a2c20e7SVivek Goyal { 12836a2c20e7SVivek Goyal return 0; 12846a2c20e7SVivek Goyal } 12856a2c20e7SVivek Goyal 12866a2c20e7SVivek Goyal static inline int efi_get_runtime_map_desc_size(void) 12876a2c20e7SVivek Goyal { 12886a2c20e7SVivek Goyal return 0; 12896a2c20e7SVivek Goyal } 12906a2c20e7SVivek Goyal 12916a2c20e7SVivek Goyal static inline int efi_runtime_map_copy(void *buf, size_t bufsz) 12926a2c20e7SVivek Goyal { 12936a2c20e7SVivek Goyal return 0; 12946a2c20e7SVivek Goyal } 12956a2c20e7SVivek Goyal 1296926172d4SDave Young #endif 1297926172d4SDave Young 1298bd669475SArd Biesheuvel /* prototypes shared between arch specific and generic stub code */ 1299bd669475SArd Biesheuvel 1300bd669475SArd Biesheuvel #define pr_efi(sys_table, msg) efi_printk(sys_table, "EFI stub: "msg) 1301bd669475SArd Biesheuvel #define pr_efi_err(sys_table, msg) efi_printk(sys_table, "EFI stub: ERROR: "msg) 1302bd669475SArd Biesheuvel 1303bd669475SArd Biesheuvel void efi_printk(efi_system_table_t *sys_table_arg, char *str); 1304bd669475SArd Biesheuvel 1305bd669475SArd Biesheuvel void efi_free(efi_system_table_t *sys_table_arg, unsigned long size, 1306bd669475SArd Biesheuvel unsigned long addr); 1307bd669475SArd Biesheuvel 1308bd669475SArd Biesheuvel char *efi_convert_cmdline(efi_system_table_t *sys_table_arg, 1309bd669475SArd Biesheuvel efi_loaded_image_t *image, int *cmd_line_len); 1310bd669475SArd Biesheuvel 1311bd669475SArd Biesheuvel efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg, 1312bd669475SArd Biesheuvel efi_memory_desc_t **map, 1313bd669475SArd Biesheuvel unsigned long *map_size, 1314bd669475SArd Biesheuvel unsigned long *desc_size, 1315bd669475SArd Biesheuvel u32 *desc_ver, 1316bd669475SArd Biesheuvel unsigned long *key_ptr); 1317bd669475SArd Biesheuvel 1318bd669475SArd Biesheuvel efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg, 1319bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1320bd669475SArd Biesheuvel unsigned long *addr); 1321bd669475SArd Biesheuvel 1322bd669475SArd Biesheuvel efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg, 1323bd669475SArd Biesheuvel unsigned long size, unsigned long align, 1324bd669475SArd Biesheuvel unsigned long *addr, unsigned long max); 1325bd669475SArd Biesheuvel 1326bd669475SArd Biesheuvel efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg, 1327bd669475SArd Biesheuvel unsigned long *image_addr, 1328bd669475SArd Biesheuvel unsigned long image_size, 1329bd669475SArd Biesheuvel unsigned long alloc_size, 1330bd669475SArd Biesheuvel unsigned long preferred_addr, 1331bd669475SArd Biesheuvel unsigned long alignment); 1332bd669475SArd Biesheuvel 1333bd669475SArd Biesheuvel efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg, 1334bd669475SArd Biesheuvel efi_loaded_image_t *image, 1335bd669475SArd Biesheuvel char *cmd_line, char *option_string, 1336bd669475SArd Biesheuvel unsigned long max_addr, 1337bd669475SArd Biesheuvel unsigned long *load_addr, 1338bd669475SArd Biesheuvel unsigned long *load_size); 1339bd669475SArd Biesheuvel 13405a17dae4SMatt Fleming efi_status_t efi_parse_options(char *cmdline); 13415a17dae4SMatt Fleming 1342b2e0a54aSDave Young bool efi_runtime_disabled(void); 13431da177e4SLinus Torvalds #endif /* _LINUX_EFI_H */ 1344