EFI changes for v4.10
Subsystems (9)
Linus,
Please pull the latest EFI tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git efi-core-for-linus
# HEAD: 018edcfac4c3b140366ad51b0907f3becb5bb624 efi/libstub: Make efi_random_alloc() allocate below 4 GB on 32-bit
The main changes in this development cycle were:
- Implement EFI dev path parser and other changes to fully support thunderbolt devices on Apple Macbooks (Lukas Wunner)
- Add RNG seeding via the EFI stub, on ARM/arm64 (Ard Biesheuvel)
- Expose EFI framebuffer configuration to user-space, to improve tooling (Peter Jones)
- Misc fixes and cleanups (Ivan Hu, Wei Yongjun, Yisheng Xie, Dan Carpenter, Roy Franz)
Thanks,
Ingo
------------------>
Dan Carpenter (1):
efi/efivar_ssdt_load: Don't return success on allocation failure
Ivan Hu (3):
efi/efi_test: Fix uninitialized variable 'datasize' efi/efi_test: Fix uninitialized variable 'rv' efi/efi_test: Use memdup_user() as a cleanup
Lukas Wunner (7):
efi: Add device path parser
efi: Allow bitness-agnostic protocol calls x86/efi: Retrieve and assign Apple device properties
thunderbolt: Use Device ROM retrieved from EFI thunderbolt, efi: Fix Kconfig dependencies thunderbolt, efi: Fix Kconfig dependencies harder
thunderbolt: Compile on x86 only
Peter Jones (1):
efifb: Show framebuffer layout as device attributes
Roy Franz (1):
efi/libstub: Fix allocation size calculations
Wei Yongjun (1):
efi: Remove unused include of <linux/version.h>
Yisheng Xie (1):
efi/arm*: Fix efi_init() error handling
Documentation/kernel-parameters.txt | 5 + MAINTAINERS | 6 +- arch/arm/include/asm/efi.h | 3 + arch/arm64/include/asm/efi.h | 3 + arch/x86/boot/compressed/eboot.c | 65 +++++++ arch/x86/include/asm/efi.h | 16 +- arch/x86/include/uapi/asm/bootparam.h | 1 + drivers/firmware/efi/Kconfig | 18 ++ drivers/firmware/efi/Makefile | 2 + drivers/firmware/efi/apple-properties.c | 248 +++++++++++++++++++++++++ drivers/firmware/efi/arm-init.c | 4 +- drivers/firmware/efi/dev-path-parser.c | 203 ++++++++++++++++++++ drivers/firmware/efi/efi.c | 76 +++++++- drivers/firmware/efi/libstub/Makefile | 4 +- drivers/firmware/efi/libstub/arm-stub.c | 2 + drivers/firmware/efi/libstub/efi-stub-helper.c | 33 ++-- drivers/firmware/efi/libstub/efistub.h | 11 ++ drivers/firmware/efi/libstub/random.c | 67 ++++++- drivers/firmware/efi/test/efi_test.c | 15 +- drivers/thunderbolt/Kconfig | 2 + drivers/thunderbolt/eeprom.c | 43 +++++ drivers/thunderbolt/switch.c | 2 +- drivers/video/fbdev/efifb.c | 59 ++++-- include/linux/efi.h | 46 +++++ 24 files changed, 872 insertions(+), 62 deletions(-) create mode 100644 drivers/firmware/efi/apple-properties.c create mode 100644 drivers/firmware/efi/dev-path-parser.c
Documentation/kernel-parameters.txt +5 -0
@@ -1062,6 +1062,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted. dscc4.setup= [NET] + dump_apple_properties [X86] + Dump name and content of EFI device properties on + x86 Macs. Useful for driver authors to determine + what data is available or for reverse-engineering. + dyndbg[="val"] [KNL,DYNAMIC_DEBUG] module.dyndbg[="val"] Enable debug messages at boot time. See
MAINTAINERS +4 -2
@@ -4631,12 +4631,14 @@ L: [email protected] T: git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git S: Maintained F: Documentation/efi-stub.txt -F: arch/ia64/kernel/efi.c +F: arch/*/kernel/efi.c F: arch/x86/boot/compressed/eboot.[ch] -F: arch/x86/include/asm/efi.h +F: arch/*/include/asm/efi.h F: arch/x86/platform/efi/ F: drivers/firmware/efi/ F: include/linux/efi*.h +F: arch/arm/boot/compressed/efi-header.S +F: arch/arm64/kernel/efi-entry.S EFI VARIABLE FILESYSTEM M: Matthew Garrett <[email protected]>
arch/arm/include/asm/efi.h +3 -0
@@ -57,6 +57,9 @@ void efi_virtmap_unload(void);#define __efi_call_early (f, ...) f(__VA_ARGS__)#define efi_is_64bit () (false) +#define efi_call_proto (protocol, f, instance, ...) \ + ((protocol##_t *)instance)->f(instance, ##__VA_ARGS__) +struct screen_info *alloc_screen_info (efi_system_table_t *sys_table_arg);void free_screen_info (efi_system_table_t *sys_table,struct screen_info *si);
arch/arm64/include/asm/efi.h +3 -0
@@ -51,6 +51,9 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md);#define __efi_call_early (f, ...) f(__VA_ARGS__)#define efi_is_64bit () (true) +#define efi_call_proto (protocol, f, instance, ...) \ + ((protocol##_t *)instance)->f(instance, ##__VA_ARGS__) + #define alloc_screen_info(x...) &screen_info #define free_screen_info(x...)
arch/x86/boot/compressed/eboot.c +65 -0
77 lines not on this page · raw message
arch/x86/include/asm/efi.h +11 -5
@@ -210,12 +210,18 @@ static inline bool efi_is_64bit(void)return __efi_early ()->is64; } +#define efi_table_attr (table, attr, instance) \ + (efi_is_64bit() ? \ + ((table##_64_t *)(unsigned long)instance)->attr : \ + ((table##_32_t *)(unsigned long)instance)->attr) + +#define efi_call_proto (protocol, f, instance, ...) \ + __efi_early()->call(efi_table_attr(protocol, f, instance), \ + instance, ##__VA_ARGS__) +#define efi_call_early (f, ...) \ - __efi_early()->call(efi_is_64bit() ? \ - ((efi_boot_services_64_t *)(unsigned long) \ - __efi_early()->boot_services)->f : \ - ((efi_boot_services_32_t *)(unsigned long) \ - __efi_early()->boot_services)->f, __VA_ARGS__) + __efi_early()->call(efi_table_attr(efi_boot_services, f, \ + __efi_early()->boot_services), __VA_ARGS__)#define __efi_call_early (f, ...) \ __efi_early()->call((unsigned long)f, __VA_ARGS__);
arch/x86/include/uapi/asm/bootparam.h +1 -0
@@ -7,6 +7,7 @@#define SETUP_DTB 2#define SETUP_PCI 3#define SETUP_EFI 4 +#define SETUP_APPLE_PROPERTIES 5/* ram_size flags */ #define RAMDISK_IMAGE_START_MASK 0x07FF
drivers/firmware/efi/Kconfig +18 -0
@@ -129,7 +129,25 @@ config EFI_TEST Say Y here to enable the runtime services support via /dev/efi_test. If unsure, say N. +config APPLE_PROPERTIES + bool "Apple Device Properties" + depends on EFI_STUB && X86 + select EFI_DEV_PATH_PARSER + select UCS2_STRING + help + Retrieve properties from EFI on Apple Macs and assign them to + devices, allowing for improved support of Apple hardware. + Properties that would otherwise be missing include the + Thunderbolt Device ROM and GPU configuration data. + + If unsure, say Y if you have a Mac. Otherwise N. + endmenu config UEFI_CPER bool + +config EFI_DEV_PATH_PARSER + bool + depends on ACPI + default n
drivers/firmware/efi/Makefile +2 -0
@@ -21,6 +21,8 @@ obj-$(CONFIG_EFI_STUB) += libstub/ obj-$(CONFIG_EFI_FAKE_MEMMAP) += fake_mem.o obj-$(CONFIG_EFI_BOOTLOADER_CONTROL) += efibc.o obj-$(CONFIG_EFI_TEST) += test/ +obj-$(CONFIG_EFI_DEV_PATH_PARSER) += dev-path-parser.o +obj-$(CONFIG_APPLE_PROPERTIES) += apple-properties.o arm-obj-$(CONFIG_EFI) := arm-init.o arm-runtime.o obj-$(CONFIG_ARM) += $(arm-obj-y)
drivers/firmware/efi/apple-properties.c new file +248 -0
248 lines not on this page · raw message
drivers/firmware/efi/arm-init.c +3 -1
@@ -244,8 +244,10 @@ void __init efi_init(void)"Unexpected EFI_MEMORY_DESCRIPTOR version %ld" , efi.memmap.desc_version); -if (uefi_init () <0 ) +if (uefi_init () <0 ) { +efi_memmap_unmap ();return ; + }reserve_regions ();efi_memattr_init ();
drivers/firmware/efi/dev-path-parser.c new file +203 -0
203 lines not on this page · raw message
drivers/firmware/efi/efi.c +75 -1
111 lines not on this page · raw message
drivers/firmware/efi/libstub/Makefile +2 -2
@@ -36,11 +36,11 @@ arm-deps := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c sort.c $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE $(call if_changed_rule,cc_o_c) -lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o string.o \ +lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o string.o random.o \ $(patsubst %.c,lib-%.o,$(arm-deps)) lib-$(CONFIG_ARM) += arm32-stub.o -lib-$(CONFIG_ARM64) += arm64-stub.o random.o +lib-$(CONFIG_ARM64) += arm64-stub.o CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET) #
drivers/firmware/efi/libstub/arm-stub.c +2 -0
@@ -340,6 +340,8 @@ unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,if (status !=EFI_SUCCESS )pr_efi_err (sys_table,"Failed initrd from command line!\n" ); +efi_random_get_seed (sys_table); + new_fdt_addr = fdt_addr; status = allocate_new_fdt_and_exit_boot(sys_table, handle, &new_fdt_addr, dram_base + MAX_FDT_OFFSET,
drivers/firmware/efi/libstub/efi-stub-helper.c +14 -19
@@ -32,15 +32,6 @@static unsigned long __chunk_size =EFI_READ_CHUNK_SIZE ; -/* -* Allow the platform to override the allocation granularity: this allows -* systems that have the capability to run with a larger page size to deal -* with the allocations for initrd and fdt more efficiently. -*/ -#ifndef EFI_ALLOC_ALIGN -#define EFI_ALLOC_ALIGN EFI_PAGE_SIZE -#endif -#define EFI_MMAP_NR_SLACK_SLOTS 8struct file_info {
@@ -186,14 +177,16 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg, goto fail;/* -* Enforce minimum alignment that EFI requires when requesting -* a specific address. We are doing page-based allocations, -* so we must be aligned to a page. +* Enforce minimum alignment that EFI or Linux requires when +* requesting a specific address. We are doing page-based (or +* larger) allocations, and both the address and size must meet +* alignment constraints. */ if (align <EFI_ALLOC_ALIGN ) align =EFI_ALLOC_ALIGN ; - nr_pages =round_up (size,EFI_ALLOC_ALIGN ) /EFI_PAGE_SIZE ; + size =round_up (size,EFI_ALLOC_ALIGN ); + nr_pages = size /EFI_PAGE_SIZE ; again:for (i =0 ; i < map_size / desc_size; i++) {efi_memory_desc_t *desc;
@@ -208,7 +201,7 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,continue ; start = desc->phys_addr; - end = start + desc->num_pages * (1UL <<EFI_PAGE_SHIFT ); + end = start + desc->num_pages *EFI_PAGE_SIZE ;if (end > max) end = max;
@@ -278,14 +271,16 @@ efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg, goto fail;/* -* Enforce minimum alignment that EFI requires when requesting -* a specific address. We are doing page-based allocations, -* so we must be aligned to a page. +* Enforce minimum alignment that EFI or Linux requires when +* requesting a specific address. We are doing page-based (or +* larger) allocations, and both the address and size must meet +* alignment constraints. */ if (align <EFI_ALLOC_ALIGN ) align =EFI_ALLOC_ALIGN ; - nr_pages =round_up (size,EFI_ALLOC_ALIGN ) /EFI_PAGE_SIZE ; + size =round_up (size,EFI_ALLOC_ALIGN ); + nr_pages = size /EFI_PAGE_SIZE ;for (i =0 ; i < map_size / desc_size; i++) {efi_memory_desc_t *desc;unsigned long m = (unsigned long )map;
@@ -300,7 +295,7 @@ efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,continue ; start = desc->phys_addr; - end = start + desc->num_pages * (1UL <<EFI_PAGE_SHIFT ); + end = start + desc->num_pages *EFI_PAGE_SIZE ;/* * Don't allocate at 0x0. It will confuse code that
drivers/firmware/efi/libstub/efistub.h +11 -0
@@ -15,6 +15,15 @@*/ #undef __init +/* +* Allow the platform to override the allocation granularity: this allows +* systems that have the capability to run with a larger page size to deal +* with the allocations for initrd and fdt more efficiently. +*/ +#ifndef EFI_ALLOC_ALIGN +#define EFI_ALLOC_ALIGN EFI_PAGE_SIZE +#endif +void efi_char16_printk (efi_system_table_t *,efi_char16_t *); efi_status_t efi_open_volume(efi_system_table_t *sys_table_arg, void *__image,
@@ -62,4 +71,6 @@ efi_status_t efi_random_alloc(efi_system_table_t *sys_table_arg,efi_status_t check_platform_features (efi_system_table_t *sys_table_arg); +efi_status_t efi_random_get_seed (efi_system_table_t *sys_table_arg); +#endif
drivers/firmware/efi/libstub/random.c +59 -8
96 lines not on this page · raw message
drivers/firmware/efi/test/efi_test.c +5 -10
@@ -8,7 +8,6 @@* */ -#include <linux/version.h> #include <linux/miscdevice.h> #include <linux/module.h> #include <linux/init.h>
@@ -156,7 +155,7 @@ static long efi_runtime_get_variable(unsigned long arg) {struct efi_getvariable __user *getvariable_user;struct efi_getvariable getvariable; -unsigned long datasize, prev_datasize, *dz; +unsigned long datasize =0 , prev_datasize, *dz;efi_guid_t vendor_guid, *vd =NULL ;efi_status_t status;efi_char16_t *name =NULL ;
@@ -266,14 +265,10 @@ static long efi_runtime_set_variable(unsigned long arg)return rv; } - data =kmalloc (setvariable.data_size,GFP_KERNEL ); -if (!data) { + data =memdup_user (setvariable.data, setvariable.data_size); +if (IS_ERR (data)) {kfree (name); -return -ENOMEM ; - } -if (copy_from_user (data, setvariable.data, setvariable.data_size)) { - rv = -EFAULT ; - goto out; +return PTR_ERR (data); } status = efi.set_variable(name, &vendor_guid,
@@ -429,7 +424,7 @@ static long efi_runtime_get_nextvariablename(unsigned long arg)efi_guid_t *vd =NULL ;efi_guid_t vendor_guid;efi_char16_t *name =NULL ; -int rv; +int rv =0 ; getnextvariablename_user = (struct efi_getnextvariablename __user *)arg;
drivers/thunderbolt/Kconfig +2 -0
@@ -1,6 +1,8 @@ menuconfig THUNDERBOLT tristate "Thunderbolt support for Apple devices" depends on PCI + depends on X86 || COMPILE_TEST + select APPLE_PROPERTIES if EFI_STUB && X86 select CRC32 help Cactus Ridge Thunderbolt Controller driver
drivers/thunderbolt/eeprom.c +43 -0
67 lines not on this page · raw message
drivers/thunderbolt/switch.c +1 -1
@@ -460,7 +460,7 @@ int tb_switch_resume(struct tb_switch *sw)tb_sw_warn (sw,"uid read failed\n" );return err; } -if (sw->uid != uid) { +if (sw != sw->tb->root_switch && sw->uid != uid) {tb_sw_info (sw,"changed while suspended (uid %#llx -> %#llx)\n" , sw->uid, uid);
drivers/video/fbdev/efifb.c +46 -13
120 lines not on this page · raw message
include/linux/efi.h +46 -0
82 lines not on this page · raw message