Merge branch 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI updates from Ingo Molnar:
"The main changes in this cycle were:
- Drop the unused EFI_SYSTEM_TABLES efi.flags bit and ensure the
ARM/arm64 EFI System Table mapping is read-only (Ard Biesheuvel)
- Add a comment to explain that one of the code paths in the x86/pat
code is only executed for EFI boot (Matt Fleming)
- Improve Secure Boot status checks on arm64 and handle unexpected
errors (Linn Crosetto)
- Remove the global EFI memory map variable 'memmap' as the same
information is already available in efi::memmap (Matt Fleming)
- Add EFI Memory Attribute table support for ARM/arm64 (Ard
Biesheuvel)
- Add EFI GOP framebuffer support for ARM/arm64 (Ard Biesheuvel)
- Add EFI Bootloader Control driver for storing reboot(2) data in EFI
variables for consumption by bootloaders (Jeremy Compostella)
- Add Core EFI capsule support (Matt Fleming)
- Add EFI capsule char driver (Kweh, Hock Leong)
- Unify EFI memory map code for ARM and arm64 (Ard Biesheuvel)
- Add generic EFI support for detecting when firmware corrupts CPU
status register bits (like IRQ flags) when performing EFI runtime
service calls (Mark Rutland)
... and other misc cleanups"
* 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (46 commits)
efivarfs: Make efivarfs_file_ioctl() static
efi: Merge boolean flag arguments
efi/capsule: Move 'capsule' to the stack in efi_capsule_supported()
efibc: Fix excessive stack footprint warning
efi/capsule: Make efi_capsule_pending() lockless
efi: Remove unnecessary (and buggy) .memmap initialization from the Xen EFI driver
efi/runtime-wrappers: Remove ARCH_EFI_IRQ_FLAGS_MASK #ifdef
x86/efi: Enable runtime call flag checking
arm/efi: Enable runtime call flag checking
arm64/efi: Enable runtime call flag checking
efi/runtime-wrappers: Detect firmware IRQ flag corruption
efi/runtime-wrappers: Remove redundant #ifdefs
x86/efi: Move to generic {__,}efi_call_virt()
arm/efi: Move to generic {__,}efi_call_virt()
arm64/efi: Move to generic {__,}efi_call_virt()
efi/runtime-wrappers: Add {__,}efi_call_virt() templates
efi/arm-init: Reserve rather than unmap the memory map for ARM as well
efi: Add misc char driver interface to update EFI firmware
x86/efi: Force EFI reboot to process pending capsules
efi: Add 'capsule' update support
...
This commit is contained in:
commit
49817c3343
41 changed files with 2097 additions and 713 deletions
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/pfn.h>
|
||||
#include <linux/pstore.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/screen_info.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
|
||||
|
|
@ -123,6 +124,13 @@ typedef struct {
|
|||
u32 imagesize;
|
||||
} efi_capsule_header_t;
|
||||
|
||||
/*
|
||||
* EFI capsule flags
|
||||
*/
|
||||
#define EFI_CAPSULE_PERSIST_ACROSS_RESET 0x00010000
|
||||
#define EFI_CAPSULE_POPULATE_SYSTEM_TABLE 0x00020000
|
||||
#define EFI_CAPSULE_INITIATE_RESET 0x00040000
|
||||
|
||||
/*
|
||||
* Allocation types for calls to boottime->allocate_pages.
|
||||
*/
|
||||
|
|
@ -282,9 +290,10 @@ typedef struct {
|
|||
efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **);
|
||||
void *__reserved;
|
||||
void *register_protocol_notify;
|
||||
void *locate_handle;
|
||||
efi_status_t (*locate_handle)(int, efi_guid_t *, void *,
|
||||
unsigned long *, efi_handle_t *);
|
||||
void *locate_device_path;
|
||||
void *install_configuration_table;
|
||||
efi_status_t (*install_configuration_table)(efi_guid_t *, void *);
|
||||
void *load_image;
|
||||
void *start_image;
|
||||
void *exit;
|
||||
|
|
@ -623,6 +632,27 @@ void efi_native_runtime_setup(void);
|
|||
EFI_GUID(0x3152bca5, 0xeade, 0x433d, \
|
||||
0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
|
||||
|
||||
#define EFI_MEMORY_ATTRIBUTES_TABLE_GUID \
|
||||
EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, \
|
||||
0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
|
||||
|
||||
#define EFI_CONSOLE_OUT_DEVICE_GUID \
|
||||
EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, \
|
||||
0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
|
||||
|
||||
/*
|
||||
* This GUID is used to pass to the kernel proper the struct screen_info
|
||||
* structure that was populated by the stub based on the GOP protocol instance
|
||||
* associated with ConOut
|
||||
*/
|
||||
#define LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID \
|
||||
EFI_GUID(0xe03fc20a, 0x85dc, 0x406e, \
|
||||
0xb9, 0xe, 0x4a, 0xb5, 0x02, 0x37, 0x1d, 0x95)
|
||||
|
||||
#define LINUX_EFI_LOADER_ENTRY_GUID \
|
||||
EFI_GUID(0x4a67b082, 0x0a4c, 0x41cf, \
|
||||
0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f)
|
||||
|
||||
typedef struct {
|
||||
efi_guid_t guid;
|
||||
u64 table;
|
||||
|
|
@ -847,6 +877,14 @@ typedef struct {
|
|||
|
||||
#define EFI_INVALID_TABLE_ADDR (~0UL)
|
||||
|
||||
typedef struct {
|
||||
u32 version;
|
||||
u32 num_entries;
|
||||
u32 desc_size;
|
||||
u32 reserved;
|
||||
efi_memory_desc_t entry[0];
|
||||
} efi_memory_attributes_table_t;
|
||||
|
||||
/*
|
||||
* All runtime access to EFI goes through this structure:
|
||||
*/
|
||||
|
|
@ -868,6 +906,7 @@ extern struct efi {
|
|||
unsigned long config_table; /* config tables */
|
||||
unsigned long esrt; /* ESRT table */
|
||||
unsigned long properties_table; /* properties table */
|
||||
unsigned long mem_attr_table; /* memory attributes table */
|
||||
efi_get_time_t *get_time;
|
||||
efi_set_time_t *set_time;
|
||||
efi_get_wakeup_time_t *get_wakeup_time;
|
||||
|
|
@ -883,7 +922,7 @@ extern struct efi {
|
|||
efi_get_next_high_mono_count_t *get_next_high_mono_count;
|
||||
efi_reset_system_t *reset_system;
|
||||
efi_set_virtual_address_map_t *set_virtual_address_map;
|
||||
struct efi_memory_map *memmap;
|
||||
struct efi_memory_map memmap;
|
||||
unsigned long flags;
|
||||
} efi;
|
||||
|
||||
|
|
@ -945,7 +984,6 @@ extern void efi_initialize_iomem_resources(struct resource *code_resource,
|
|||
extern void efi_get_time(struct timespec *now);
|
||||
extern void efi_reserve_boot_services(void);
|
||||
extern int efi_get_fdt_params(struct efi_fdt_params *params);
|
||||
extern struct efi_memory_map memmap;
|
||||
extern struct kobject *efi_kobj;
|
||||
|
||||
extern int efi_reboot_quirk_mode;
|
||||
|
|
@ -957,12 +995,34 @@ extern void __init efi_fake_memmap(void);
|
|||
static inline void efi_fake_memmap(void) { }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* efi_memattr_perm_setter - arch specific callback function passed into
|
||||
* efi_memattr_apply_permissions() that updates the
|
||||
* mapping permissions described by the second
|
||||
* argument in the page tables referred to by the
|
||||
* first argument.
|
||||
*/
|
||||
typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *);
|
||||
|
||||
extern int efi_memattr_init(void);
|
||||
extern int efi_memattr_apply_permissions(struct mm_struct *mm,
|
||||
efi_memattr_perm_setter fn);
|
||||
|
||||
/* Iterate through an efi_memory_map */
|
||||
#define for_each_efi_memory_desc(m, md) \
|
||||
#define for_each_efi_memory_desc_in_map(m, md) \
|
||||
for ((md) = (m)->map; \
|
||||
(md) <= (efi_memory_desc_t *)((m)->map_end - (m)->desc_size); \
|
||||
(md) = (void *)(md) + (m)->desc_size)
|
||||
|
||||
/**
|
||||
* for_each_efi_memory_desc - iterate over descriptors in efi.memmap
|
||||
* @md: the efi_memory_desc_t * iterator
|
||||
*
|
||||
* Once the loop finishes @md must not be accessed.
|
||||
*/
|
||||
#define for_each_efi_memory_desc(md) \
|
||||
for_each_efi_memory_desc_in_map(&efi.memmap, md)
|
||||
|
||||
/*
|
||||
* Format an EFI memory descriptor's type and attributes to a user-provided
|
||||
* character buffer, as per snprintf(), and return the buffer.
|
||||
|
|
@ -1000,7 +1060,6 @@ extern int __init efi_setup_pcdp_console(char *);
|
|||
* possible, remove EFI-related code altogether.
|
||||
*/
|
||||
#define EFI_BOOT 0 /* Were we booted from EFI? */
|
||||
#define EFI_SYSTEM_TABLES 1 /* Can we use EFI system tables? */
|
||||
#define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */
|
||||
#define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */
|
||||
#define EFI_MEMMAP 4 /* Can we use EFI memory map? */
|
||||
|
|
@ -1026,8 +1085,16 @@ static inline bool efi_enabled(int feature)
|
|||
}
|
||||
static inline void
|
||||
efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
|
||||
|
||||
static inline bool
|
||||
efi_capsule_pending(int *reset_type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int efi_status_to_err(efi_status_t status);
|
||||
|
||||
/*
|
||||
* Variable Attributes
|
||||
*/
|
||||
|
|
@ -1180,6 +1247,80 @@ struct efi_simple_text_output_protocol {
|
|||
void *test_string;
|
||||
};
|
||||
|
||||
#define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0
|
||||
#define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1
|
||||
#define PIXEL_BIT_MASK 2
|
||||
#define PIXEL_BLT_ONLY 3
|
||||
#define PIXEL_FORMAT_MAX 4
|
||||
|
||||
struct efi_pixel_bitmask {
|
||||
u32 red_mask;
|
||||
u32 green_mask;
|
||||
u32 blue_mask;
|
||||
u32 reserved_mask;
|
||||
};
|
||||
|
||||
struct efi_graphics_output_mode_info {
|
||||
u32 version;
|
||||
u32 horizontal_resolution;
|
||||
u32 vertical_resolution;
|
||||
int pixel_format;
|
||||
struct efi_pixel_bitmask pixel_information;
|
||||
u32 pixels_per_scan_line;
|
||||
} __packed;
|
||||
|
||||
struct efi_graphics_output_protocol_mode_32 {
|
||||
u32 max_mode;
|
||||
u32 mode;
|
||||
u32 info;
|
||||
u32 size_of_info;
|
||||
u64 frame_buffer_base;
|
||||
u32 frame_buffer_size;
|
||||
} __packed;
|
||||
|
||||
struct efi_graphics_output_protocol_mode_64 {
|
||||
u32 max_mode;
|
||||
u32 mode;
|
||||
u64 info;
|
||||
u64 size_of_info;
|
||||
u64 frame_buffer_base;
|
||||
u64 frame_buffer_size;
|
||||
} __packed;
|
||||
|
||||
struct efi_graphics_output_protocol_mode {
|
||||
u32 max_mode;
|
||||
u32 mode;
|
||||
unsigned long info;
|
||||
unsigned long size_of_info;
|
||||
u64 frame_buffer_base;
|
||||
unsigned long frame_buffer_size;
|
||||
} __packed;
|
||||
|
||||
struct efi_graphics_output_protocol_32 {
|
||||
u32 query_mode;
|
||||
u32 set_mode;
|
||||
u32 blt;
|
||||
u32 mode;
|
||||
};
|
||||
|
||||
struct efi_graphics_output_protocol_64 {
|
||||
u64 query_mode;
|
||||
u64 set_mode;
|
||||
u64 blt;
|
||||
u64 mode;
|
||||
};
|
||||
|
||||
struct efi_graphics_output_protocol {
|
||||
unsigned long query_mode;
|
||||
unsigned long set_mode;
|
||||
unsigned long blt;
|
||||
struct efi_graphics_output_protocol_mode *mode;
|
||||
};
|
||||
|
||||
typedef efi_status_t (*efi_graphics_output_protocol_query_mode)(
|
||||
struct efi_graphics_output_protocol *, u32, unsigned long *,
|
||||
struct efi_graphics_output_mode_info **);
|
||||
|
||||
extern struct list_head efivar_sysfs_list;
|
||||
|
||||
static inline void
|
||||
|
|
@ -1195,8 +1336,7 @@ int efivars_unregister(struct efivars *efivars);
|
|||
struct kobject *efivars_kobject(void);
|
||||
|
||||
int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
|
||||
void *data, bool atomic, bool duplicates,
|
||||
struct list_head *head);
|
||||
void *data, bool duplicates, struct list_head *head);
|
||||
|
||||
void efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
|
||||
void efivar_entry_remove(struct efivar_entry *entry);
|
||||
|
|
@ -1242,6 +1382,13 @@ int efivars_sysfs_init(void);
|
|||
#define EFIVARS_DATA_SIZE_MAX 1024
|
||||
|
||||
#endif /* CONFIG_EFI_VARS */
|
||||
extern bool efi_capsule_pending(int *reset_type);
|
||||
|
||||
extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
|
||||
size_t size, int *reset);
|
||||
|
||||
extern int efi_capsule_update(efi_capsule_header_t *capsule,
|
||||
struct page **pages);
|
||||
|
||||
#ifdef CONFIG_EFI_RUNTIME_MAP
|
||||
int efi_runtime_map_init(struct kobject *);
|
||||
|
|
@ -1319,5 +1466,9 @@ efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
|
|||
|
||||
efi_status_t efi_parse_options(char *cmdline);
|
||||
|
||||
efi_status_t efi_setup_gop(efi_system_table_t *sys_table_arg,
|
||||
struct screen_info *si, efi_guid_t *proto,
|
||||
unsigned long size);
|
||||
|
||||
bool efi_runtime_disabled(void);
|
||||
#endif /* _LINUX_EFI_H */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue