EFI capsule update support for IOT2000 devices
Subsystems (3)
cover EFI capsule update support for IOT2000 devices
Last chunk: This backports EFI capsule updates, primarily for the use with the IOT2020 and IOT2040, the latter with Quark-proprietary security header format. The feature should also work for the Galileo Gen 2 and, at least conceptually, for any EFI capsule update compatible firmware.
Jan
Ard Biesheuvel (3):
efi/capsule-loader: Use a cached copy of the capsule header efi/capsule-loader: Redirect calls to efi_capsule_setup_info() via
weak alias
efi/capsule-loader: Use page addresses rather than struct page
pointers
Austin Christ (1):
efi/capsule: Allocate whole capsule into virtual memory
Jan Kiszka (5):
efi/capsule: Fix return code on failing kmap/vmap efi/capsule: Remove pr_debug() on ENOMEM or EFAULT efi/capsule: Clean up pr_err/_info() messages efi/capsule: Adjust return type of efi_capsule_setup_info() efi/capsule: Add support for Quark security header
Kweh, Hock Leong (1):
efi: Add misc char driver interface to update EFI firmware
Matt Fleming (4):
efi: Move efi_status_to_err() to drivers/firmware/efi/
efi: Add 'capsule' update support
x86/efi: Force EFI reboot to process pending capsules efi/capsule: Move 'capsule' to the stack in efi_capsule_supported()
arch/x86/kernel/reboot.c | 9 + arch/x86/platform/efi/quirks.c | 137 ++++++++++++++ drivers/firmware/efi/Kconfig | 19 ++ drivers/firmware/efi/Makefile | 2 + drivers/firmware/efi/capsule-loader.c | 330 ++++++++++++++++++++++++++++++++++ drivers/firmware/efi/capsule.c | 294 ++++++++++++++++++++++++++++++ drivers/firmware/efi/efi.c | 33 ++++ drivers/firmware/efi/reboot.c | 12 +- drivers/firmware/efi/vars.c | 33 ---- include/linux/efi.h | 34 ++++ 10 files changed, 869 insertions(+), 34 deletions(-) create mode 100644 drivers/firmware/efi/capsule-loader.c create mode 100644 drivers/firmware/efi/capsule.c
Signature · 1 line
2.12.3
PATCH 1/14 efi: Move efi_status_to_err() to drivers/firmware/efi/
From: Matt Fleming <[email protected]>
commit 806b0351c9ff9890c1ef0ba2c46237baef49ac79 upstream.
Move efi_status_to_err() to the architecture independent code as it's generally useful in all bits of EFI code where there is a need to convert an efi_status_t to a kernel error value.
--- drivers/firmware/efi/efi.c | 33 +++++++++++++++++++++++++++++++++ drivers/firmware/efi/vars.c | 33 --------------------------------- include/linux/efi.h | 2 ++ 3 files changed, 35 insertions(+), 33 deletions(-)
drivers/firmware/efi/efi.c +33 -0
@@ -663,3 +663,36 @@ u64 __weak efi_mem_attributes(unsigned long phys_addr) }return 0 ; } + +int efi_status_to_err (efi_status_t status) +{ +int err; + +switch (status) { +case EFI_SUCCESS : + err =0 ; +break ; +case EFI_INVALID_PARAMETER : + err = -EINVAL ; +break ; +case EFI_OUT_OF_RESOURCES : + err = -ENOSPC ; +break ; +case EFI_DEVICE_ERROR : + err = -EIO ; +break ; +case EFI_WRITE_PROTECTED : + err = -EROFS ; +break ; +case EFI_SECURITY_VIOLATION : + err = -EACCES ; +break ; +case EFI_NOT_FOUND : + err = -ENOENT ; +break ; +default : + err = -EINVAL ; + } + +return err; +}
drivers/firmware/efi/vars.c +0 -33
@@ -318,39 +318,6 @@ check_var_size(u32 attributes, unsigned long size)return fops->query_variable_store (attributes, size); } -static int efi_status_to_err (efi_status_t status) -{ -int err; - -switch (status) { -case EFI_SUCCESS : - err =0 ; -break ; -case EFI_INVALID_PARAMETER : - err = -EINVAL ; -break ; -case EFI_OUT_OF_RESOURCES : - err = -ENOSPC ; -break ; -case EFI_DEVICE_ERROR : - err = -EIO ; -break ; -case EFI_WRITE_PROTECTED : - err = -EROFS ; -break ; -case EFI_SECURITY_VIOLATION : - err = -EACCES ; -break ; -case EFI_NOT_FOUND : - err = -ENOENT ; -break ; -default : - err = -EINVAL ; - } - -return err; -} -static bool variable_is_present (efi_char16_t *variable_name,efi_guid_t *vendor,struct list_head *head) {
include/linux/efi.h +2 -0
@@ -999,6 +999,8 @@ static inline void efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}#endif +extern int efi_status_to_err (efi_status_t status); +/* * Variable Attributes */
Signature · 1 line
2.12.3
PATCH 2/14 efi: Add 'capsule' update support
In reply to Jan KiszkaFrom: Matt Fleming <[email protected]>
commit f0133f3c5b8bb34ec4dec50c27e7a655aeee8935 upstream.
The EFI capsule mechanism allows data blobs to be passed to the EFI firmware. A common use case is performing firmware updates. This patch just introduces the main infrastructure for interacting with the firmware, and a driver that allows users to upload capsules will come in a later patch.
Once a capsule has been passed to the firmware, the next reboot must be performed using the ResetSystem() EFI runtime service, which may involve overriding the reboot type specified by reboot=. This ensures the reset value returned by QueryCapsuleCapabilities() is used to reset the system, which is required for the capsule to be processed. efi_capsule_pending() is provided for this purpose.
At the moment we only allow a single capsule blob to be sent to the firmware despite the fact that UpdateCapsule() takes a 'CapsuleCount' parameter. This simplifies the API and shouldn't result in any downside since it is still possible to send multiple capsules by repeatedly calling UpdateCapsule().
--- drivers/firmware/efi/Makefile | 1 + drivers/firmware/efi/capsule.c | 300 +++++++++++++++++++++++++++++++++++++++++ drivers/firmware/efi/reboot.c | 12 +- include/linux/efi.h | 14 ++ 4 files changed, 326 insertions(+), 1 deletion(-) create mode 100644 drivers/firmware/efi/capsule.c
drivers/firmware/efi/Makefile +1 -0
@@ -10,6 +10,7 @@ KASAN_SANITIZE_runtime-wrappers.o := n obj-$(CONFIG_EFI) += efi.o vars.o reboot.o +obj-$(CONFIG_EFI) += capsule.o obj-$(CONFIG_EFI_VARS) += efivars.o obj-$(CONFIG_EFI_ESRT) += esrt.o obj-$(CONFIG_EFI_VARS_PSTORE) += efi-pstore.o
drivers/firmware/efi/capsule.c new file +300 -0
300 lines not on this page · raw message
drivers/firmware/efi/reboot.c +11 -1
@@ -9,7 +9,8 @@ int efi_reboot_quirk_mode = -1;void efi_reboot (enum reboot_mode reboot_mode,const char *__unused) { -int efi_mode; +const char *str[] = {"cold" ,"warm" ,"shutdown" ,"platform" }; +int efi_mode, cap_reset_mode;if (!efi_enabled (EFI_RUNTIME_SERVICES ))return ;
@@ -30,6 +31,15 @@ void efi_reboot(enum reboot_mode reboot_mode, const char *__unused)if (efi_reboot_quirk_mode !=-1 ) efi_mode = efi_reboot_quirk_mode; +if (efi_capsule_pending (&cap_reset_mode)) { +if (efi_mode != cap_reset_mode) +printk (KERN_CRIT "efi: %s reset requested but pending " +"capsule update requires %s reset... Performing " +"%s reset.\n" , str[efi_mode], str[cap_reset_mode], + str[cap_reset_mode]); + efi_mode = cap_reset_mode; + } + efi.reset_system (efi_mode,EFI_SUCCESS ,0 ,NULL ); }
include/linux/efi.h +14 -0
@@ -123,6 +123,13 @@ typedef struct { } 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. */ #define EFI_ALLOCATE_ANY_PAGES 0
@@ -1215,6 +1222,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 *);
Signature · 1 line
2.12.3
PATCH 3/14 x86/efi: Force EFI reboot to process pending capsules
In reply to Jan KiszkaFrom: Matt Fleming <[email protected]>
commit 87615a34d561ef59bd0cffc73256a21220dfdffd upstream.
If an EFI capsule has been sent to the firmware we must match the type of EFI reset against that required by the capsule to ensure it is processed correctly.
Force an EFI reboot if a capsule is pending for the next reset.
--- arch/x86/kernel/reboot.c | 9 +++++++++ include/linux/efi.h | 6 ++++++ 2 files changed, 15 insertions(+)
arch/x86/kernel/reboot.c +9 -0
@@ -535,6 +535,15 @@ static void native_machine_emergency_restart(void) mode = reboot_mode ==REBOOT_WARM ?0x1234 :0 ; *((unsigned short *)__va (0x472 )) = mode; +/* +* If an EFI capsule has been registered with the firmware then +* override the reboot= parameter. +*/ +if (efi_capsule_pending (NULL )) { +pr_info ("EFI capsule is pending, forcing EFI reboot.\n" ); + reboot_type =BOOT_EFI ; + } +for (;;) {/* Could also try the reset bit in the Hammer NB */ switch (reboot_type) {
include/linux/efi.h +6 -0
@@ -1004,6 +1004,12 @@ 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);
Signature · 1 line
2.12.3
PATCH 4/14 efi: Add misc char driver interface to update EFI firmware
In reply to Jan KiszkaFrom: Kweh, Hock Leong <[email protected]>
commit 65117f1aa1b2d145fd5ca376bde642794d0aae1b upstream.
This patch introduces a kernel module to expose a capsule loader interface (misc char device file note) for users to upload capsule binaries.
Example:
cat firmware.bin > /dev/efi_capsule_loader
Any upload error will be returned while doing "cat" through file operation write() function call.
--- drivers/firmware/efi/Kconfig | 10 + drivers/firmware/efi/Makefile | 1 + drivers/firmware/efi/capsule-loader.c | 343 ++++++++++++++++++++++++++++++++++ 3 files changed, 354 insertions(+) create mode 100644 drivers/firmware/efi/capsule-loader.c
drivers/firmware/efi/Kconfig +10 -0
@@ -87,6 +87,16 @@ config EFI_RUNTIME_WRAPPERS config EFI_ARMSTUB bool +config EFI_CAPSULE_LOADER + tristate "EFI capsule loader" + depends on EFI + help + This option exposes a loader interface "/dev/efi_capsule_loader" for + users to load EFI capsules. This driver requires working runtime + capsule support in the firmware, which many OEMs do not provide. + + Most users should say N. + endmenu config UEFI_CPER
drivers/firmware/efi/Makefile +1 -0
@@ -19,3 +19,4 @@ obj-$(CONFIG_EFI_RUNTIME_MAP) += runtime-map.o obj-$(CONFIG_EFI_RUNTIME_WRAPPERS) += runtime-wrappers.o obj-$(CONFIG_EFI_STUB) += libstub/ obj-$(CONFIG_EFI_FAKE_MEMMAP) += fake_mem.o +obj-$(CONFIG_EFI_CAPSULE_LOADER) += capsule-loader.o
drivers/firmware/efi/capsule-loader.c new file +343 -0
343 lines not on this page · raw message
Signature · 1 line
2.12.3
PATCH 5/14 efi/capsule: Move 'capsule' to the stack in efi_capsule_supported()
In reply to Jan KiszkaFrom: Matt Fleming <[email protected]>
commit fb7a84cac03541f4da18dfa25b3f4767d4efc6fc upstream.
Dan Carpenter reports that passing the address of the pointer to the kmalloc()'d memory for 'capsule' is dangerous:
"drivers/firmware/efi/capsule.c:109 efi_capsule_supported()
warn: did you mean to pass the address of 'capsule'
108
109 status = efi.query_capsule_caps(&capsule, 1, &max_size, reset);
^^^^^^^^If we modify capsule inside this function call then at the end of the function we aren't freeing the original pointer that we allocated."
Ard Biesheuvel noted that we don't even need to call kmalloc() since the object we allocate isn't very big and doesn't need to persist after the function returns.
Place 'capsule' on the stack instead.
--- drivers/firmware/efi/capsule.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-)
drivers/firmware/efi/capsule.c +11 -18
@@ -90,33 +90,26 @@ out:*/ int efi_capsule_supported (efi_guid_t guid,u32 flags,size_t size,int *reset) { -efi_capsule_header_t *capsule; +efi_capsule_header_t capsule; +efi_capsule_header_t *cap_list[] = { &capsule };efi_status_t status;u64 max_size; -int rv =0 ;if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK )return -EINVAL ; - capsule =kmalloc (sizeof (*capsule),GFP_KERNEL ); -if (!capsule) -return -ENOMEM ; - - capsule->headersize = capsule->imagesize =sizeof (*capsule); -memcpy (&capsule->guid, &guid,sizeof (efi_guid_t)); - capsule->flags = flags; + capsule.headersize = capsule.imagesize =sizeof (capsule); +memcpy (&capsule.guid, &guid,sizeof (efi_guid_t)); + capsule.flags = flags; - status = efi.query_capsule_caps (&capsule,1 , &max_size, reset); -if (status !=EFI_SUCCESS ) { - rv =efi_status_to_err (status); - goto out; - } + status = efi.query_capsule_caps (cap_list,1 , &max_size, reset); +if (status !=EFI_SUCCESS ) +return efi_status_to_err (status);if (size > max_size) - rv = -ENOSPC ; -out: -kfree (capsule); -return rv; +return -ENOSPC ; + +return 0 ; }EXPORT_SYMBOL_GPL (efi_capsule_supported);
Signature · 1 line
2.12.3
PATCH 6/14 efi/capsule: Allocate whole capsule into virtual memory
In reply to Jan KiszkaFrom: Austin Christ <[email protected]>
commit 6862e6ad95e984991a6ceec592cf67831658f928 upstream.
According to UEFI 2.6 section 7.5.3, the capsule should be in contiguous virtual memory and firmware may consume the capsule immediately. To correctly implement this functionality, the kernel driver needs to vmap the entire capsule at the time it is made available to firmware.
The virtual allocation of the capsule update has been changed from kmap, which was only allocating the first page of the update, to vmap, and allocates the entire data payload.
--- drivers/firmware/efi/capsule-loader.c | 8 +++++--- drivers/firmware/efi/capsule.c | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-)
drivers/firmware/efi/capsule-loader.c +5 -3
@@ -16,6 +16,7 @@#include <linux/slab.h> #include <linux/mutex.h> #include <linux/efi.h> +#include <linux/vmalloc.h> #define NO_FURTHER_WRITE_ACTION -1
@@ -108,14 +109,15 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)int ret;void *cap_hdr_temp; - cap_hdr_temp =kmap (cap_info->pages[0 ]); + cap_hdr_temp =vmap (cap_info->pages, cap_info->index, +VM_MAP ,PAGE_KERNEL );if (!cap_hdr_temp) { -pr_debug ("%s: kmap() failed\n" , __func__); +pr_debug ("%s: vmap() failed\n" , __func__);return -EFAULT ; } ret =efi_capsule_update (cap_hdr_temp, cap_info->pages); -kunmap (cap_info->pages[0 ]); +vunmap (cap_hdr_temp);if (ret) {pr_err ("%s: efi_capsule_update() failed\n" , __func__);return ret;
drivers/firmware/efi/capsule.c +3 -3
@@ -194,9 +194,9 @@ efi_capsule_update_locked(efi_capsule_header_t *capsule,* map the capsule described by @capsule with its data in @pages and * send it to the firmware via the UpdateCapsule() runtime service. * -* @capsule must be a virtual mapping of the first page in @pages -* (@pages[0]) in the kernel address space. That is, a -* capsule_header_t that describes the entire contents of the capsule +* @capsule must be a virtual mapping of the complete capsule update in the +* kernel address space, as the capsule can be consumed immediately. +* A capsule_header_t that describes the entire contents of the capsule * must be at the start of the first data page. * * Even though this function will validate that the firmware supports
Signature · 1 line
2.12.3
PATCH 7/14 efi/capsule: Fix return code on failing kmap/vmap
In reply to Jan KiszkaFrom: Jan Kiszka <[email protected]>
commit fb153dc53f0eb8e8ad6a69f773e44c2d12daa5d0 upstream.
If kmap or vmap fail, it means we ran out of memory. There are no user-provided addressed involved that would justify EFAULT.
--- drivers/firmware/efi/capsule-loader.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/firmware/efi/capsule-loader.c +2 -2
@@ -113,7 +113,7 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info) VM_MAP, PAGE_KERNEL);if (!cap_hdr_temp) {pr_debug ("%s: vmap() failed\n" , __func__); -return -EFAULT ; +return -ENOMEM ; } ret =efi_capsule_update (cap_hdr_temp, cap_info->pages);
@@ -185,7 +185,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff, kbuff =kmap (page);if (!kbuff) {pr_debug ("%s: kmap() failed\n" , __func__); - ret = -EFAULT ; + ret = -ENOMEM ; goto failed; } kbuff +=PAGE_SIZE - cap_info->page_bytes_remain;
Signature · 1 line
2.12.3
PATCH 8/14 efi/capsule: Remove pr_debug() on ENOMEM or EFAULT
In reply to Jan KiszkaFrom: Jan Kiszka <[email protected]>
commit 7367633f0bfd783ae5838141f3af88bba6c45eb9 upstream.
Both cases are not worth a debug log message - the error code is telling enough.
--- drivers/firmware/efi/capsule-loader.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
drivers/firmware/efi/capsule-loader.c +2 -9
@@ -88,10 +88,8 @@ static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info, temp_page =krealloc (cap_info->pages, pages_needed *sizeof (void *),GFP_KERNEL | __GFP_ZERO); -if (!temp_page) { -pr_debug ("%s: krealloc() failed\n" , __func__); +if (!temp_page)return -ENOMEM ; - } cap_info->pages = temp_page; cap_info->header_obtained = true;
@@ -111,10 +109,8 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info) cap_hdr_temp =vmap (cap_info->pages, cap_info->index,VM_MAP ,PAGE_KERNEL ); -if (!cap_hdr_temp) { -pr_debug ("%s: vmap() failed\n" , __func__); +if (!cap_hdr_temp)return -ENOMEM ; - } ret =efi_capsule_update (cap_hdr_temp, cap_info->pages);vunmap (cap_hdr_temp);
@@ -171,7 +167,6 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,if (!cap_info->page_bytes_remain) { page =alloc_page (GFP_KERNEL );if (!page) { -pr_debug ("%s: alloc_page() failed\n" , __func__); ret = -ENOMEM ; goto failed; }
@@ -184,7 +179,6 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff, kbuff =kmap (page);if (!kbuff) { -pr_debug ("%s: kmap() failed\n" , __func__); ret = -ENOMEM ; goto failed; }
@@ -193,7 +187,6 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,/* Copy capsule binary data from user space to kernel space buffer */ write_byte =min_t (size_t, count, cap_info->page_bytes_remain);if (copy_from_user (kbuff, buff, write_byte)) { -pr_debug ("%s: copy_from_user() failed\n" , __func__); ret = -EFAULT ; goto fail_unmap; }
Signature · 1 line
2.12.3
PATCH 9/14 efi/capsule: Clean up pr_err/_info() messages
In reply to Jan KiszkaFrom: Jan Kiszka <[email protected]>
commit 5dce14b9d1a29cf76331f0fe8eb7efd63e0fcb9a upstream.
Avoid __func__, improve the information provided by some of the messages.
--- drivers/firmware/efi/capsule-loader.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
drivers/firmware/efi/capsule-loader.c +8 -11
@@ -70,7 +70,7 @@ static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info, pages_needed =ALIGN (cap_hdr->imagesize,PAGE_SIZE ) >>PAGE_SHIFT ;if (pages_needed ==0 ) { -pr_err ("%s: pages count invalid\n" , __func__); +pr_err ("invalid capsule size" );return -EINVAL ; }
@@ -79,8 +79,7 @@ static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info, cap_hdr->imagesize, &cap_info->reset_type);if (ret) { -pr_err ("%s: efi_capsule_supported() failed\n" , - __func__); +pr_err ("capsule not supported\n" );return ret; }
@@ -115,14 +114,14 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info) ret =efi_capsule_update (cap_hdr_temp, cap_info->pages);vunmap (cap_hdr_temp);if (ret) { -pr_err ("%s: efi_capsule_update() failed\n" , __func__); +pr_err ("capsule update failed\n" );return ret; }/* Indicate capsule binary uploading is done */ cap_info->index =NO_FURTHER_WRITE_ACTION ; -pr_info ("%s: Successfully upload capsule file with reboot type '%s'\n" , - __func__, !cap_info->reset_type ?"RESET_COLD" : +pr_info ("Successfully upload capsule file with reboot type '%s'\n" , + !cap_info->reset_type ?"RESET_COLD" : cap_info->reset_type ==1 ?"RESET_WARM" :"RESET_SHUTDOWN" );return 0 ;
@@ -207,8 +206,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,if (cap_info->header_obtained && cap_info->count >= cap_info->total_size) {if (cap_info->count > cap_info->total_size) { -pr_err ("%s: upload size exceeded header defined size\n" , - __func__); +pr_err ("capsule upload size exceeded header defined size\n" ); ret = -EINVAL ; goto failed; }
@@ -242,7 +240,7 @@ static int efi_capsule_flush(struct file *file, fl_owner_t id)struct capsule_info *cap_info = file->private_data;if (cap_info->index >0 ) { -pr_err ("%s: capsule upload not complete\n" , __func__); +pr_err ("capsule upload not complete\n" );efi_free_all_buff_pages (cap_info); ret = -ECANCELED ; }
@@ -321,8 +319,7 @@ static int __init efi_capsule_loader_init(void) ret =misc_register (&efi_capsule_misc);if (ret) -pr_err ("%s: Failed to register misc char file note\n" , - __func__); +pr_err ("Unable to register capsule loader device\n" );return ret; }
Signature · 1 line
2.12.3
PATCH 10/14 efi/capsule: Adjust return type of efi_capsule_setup_info()
In reply to Jan KiszkaFrom: Jan Kiszka <[email protected]>
commit 41b0c376951417d1b37448957b30f766b10d3090 upstream.
We actually expect int at the caller and never return any size information.
--- drivers/firmware/efi/capsule-loader.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/firmware/efi/capsule-loader.c +2 -2
@@ -53,8 +53,8 @@ static void efi_free_all_buff_pages(struct capsule_info *cap_info)* @kbuff: a mapped first page buffer pointer * @hdr_bytes: the total received number of bytes for efi header **/ -static ssize_t efi_capsule_setup_info (struct capsule_info *cap_info, -void *kbuff,size_t hdr_bytes) +static int efi_capsule_setup_info (struct capsule_info *cap_info, +void *kbuff,size_t hdr_bytes) {efi_capsule_header_t *cap_hdr;size_t pages_needed;
Signature · 1 line
2.12.3
PATCH 11/14 efi/capsule-loader: Use a cached copy of the capsule header
In reply to Jan KiszkaFrom: Ard Biesheuvel <[email protected]>
commit 82c3768b8d68c40ecde92338899c838b7c674ffb upstream.
Instead of kmapping the capsule data twice, copy the capsule header into the capsule info struct we keep locally. This is an improvement by itself, but will also enable handling of non-standard header formats more easily.
--- drivers/firmware/efi/capsule-loader.c | 41 +++++++++++++++-------------------- 1 file changed, 17 insertions(+), 24 deletions(-)
drivers/firmware/efi/capsule-loader.c +17 -24
@@ -21,13 +21,13 @@#define NO_FURTHER_WRITE_ACTION -1struct capsule_info { -bool header_obtained; -int reset_type; -long index; -size_t count; -size_t total_size; -struct page **pages; -size_t page_bytes_remain; +efi_capsule_header_t header; +int reset_type; +long index; +size_t count; +size_t total_size; +struct page **pages; +size_t page_bytes_remain; };/**
@@ -56,7 +56,6 @@ static void efi_free_all_buff_pages(struct capsule_info *cap_info)static int efi_capsule_setup_info (struct capsule_info *cap_info,void *kbuff,size_t hdr_bytes) { -efi_capsule_header_t *cap_hdr;size_t pages_needed;int ret;void *temp_page;
@@ -66,8 +65,9 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,return 0 ;/* Reset back to the correct offset of header */ - cap_hdr = kbuff - cap_info->count; - pages_needed =ALIGN (cap_hdr->imagesize,PAGE_SIZE ) >>PAGE_SHIFT ; + kbuff -= cap_info->count; +memcpy (&cap_info->header, kbuff,sizeof (cap_info->header)); + pages_needed =ALIGN (cap_info->header.imagesize,PAGE_SIZE ) /PAGE_SIZE ;if (pages_needed ==0 ) {pr_err ("invalid capsule size" );
@@ -75,15 +75,16 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info, }/* Check if the capsule binary supported */ - ret =efi_capsule_supported (cap_hdr->guid, cap_hdr->flags, - cap_hdr->imagesize, + ret =efi_capsule_supported (cap_info->header.guid, + cap_info->header.flags, + cap_info->header.imagesize, &cap_info->reset_type);if (ret) {pr_err ("capsule not supported\n" );return ret; } - cap_info->total_size = cap_hdr->imagesize; + cap_info->total_size = cap_info->header.imagesize; temp_page =krealloc (cap_info->pages, pages_needed *sizeof (void *),GFP_KERNEL | __GFP_ZERO);
@@ -91,7 +92,6 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,return -ENOMEM ; cap_info->pages = temp_page; - cap_info->header_obtained = true;return 0 ; }
@@ -104,15 +104,8 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,static ssize_t efi_capsule_submit_update (struct capsule_info *cap_info) {int ret; -void *cap_hdr_temp; - cap_hdr_temp =vmap (cap_info->pages, cap_info->index, -VM_MAP ,PAGE_KERNEL ); -if (!cap_hdr_temp) -return -ENOMEM ; - - ret =efi_capsule_update (cap_hdr_temp, cap_info->pages); -vunmap (cap_hdr_temp); + ret =efi_capsule_update (&cap_info->header, cap_info->pages);if (ret) {pr_err ("capsule update failed\n" );return ret;
@@ -192,7 +185,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff, cap_info->page_bytes_remain -= write_byte;/* Setup capsule binary info structure */ -if (!cap_info->header_obtained) { +if (cap_info->header.headersize ==0 ) { ret =efi_capsule_setup_info (cap_info, kbuff, cap_info->count + write_byte);if (ret)
@@ -203,7 +196,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,kunmap (page);/* Submit the full binary to efi_capsule_update() API */ -if (cap_info->header_obtained && +if (cap_info->header.headersize >0 && cap_info->count >= cap_info->total_size) {if (cap_info->count > cap_info->total_size) {pr_err ("capsule upload size exceeded header defined size\n" );
Signature · 1 line
2.12.3
PATCH 12/14 efi/capsule-loader: Redirect calls to efi_capsule_setup_info() via weak alias
In reply to Jan KiszkaFrom: Ard Biesheuvel <[email protected]>
commit 3fabd628d5ea24b02ddb1230ffca1df0f779f84e upstream.
To allow platform specific code to hook into the capsule loading routines, indirect calls to efi_capsule_setup_info() via a weak alias of __efi_capsule_setup_info(), allowing platforms to redefine the former but still use the latter.
--- drivers/firmware/efi/capsule-loader.c | 56 +++++++++++++++++------------------ include/linux/efi.h | 12 ++++++++ 2 files changed, 39 insertions(+), 29 deletions(-)
drivers/firmware/efi/capsule-loader.c +27 -29
@@ -20,16 +20,6 @@#define NO_FURTHER_WRITE_ACTION -1 -struct capsule_info { -efi_capsule_header_t header; -int reset_type; -long index; -size_t count; -size_t total_size; -struct page **pages; -size_t page_bytes_remain; -}; -/** * efi_free_all_buff_pages - free all previous allocated buffer pages * @cap_info: pointer to current instance of capsule_info structure
@@ -46,28 +36,13 @@ static void efi_free_all_buff_pages(struct capsule_info *cap_info) cap_info->index =NO_FURTHER_WRITE_ACTION ; } -/** -* efi_capsule_setup_info - obtain the efi capsule header in the binary and -* setup capsule_info structure -* @cap_info: pointer to current instance of capsule_info structure -* @kbuff: a mapped first page buffer pointer -* @hdr_bytes: the total received number of bytes for efi header -**/ -static int efi_capsule_setup_info (struct capsule_info *cap_info, -void *kbuff,size_t hdr_bytes) +int __efi_capsule_setup_info (struct capsule_info *cap_info) {size_t pages_needed;int ret;void *temp_page; -/* Only process data block that is larger than efi header size */ -if (hdr_bytes <sizeof (efi_capsule_header_t)) -return 0 ; - -/* Reset back to the correct offset of header */ - kbuff -= cap_info->count; -memcpy (&cap_info->header, kbuff,sizeof (cap_info->header)); - pages_needed =ALIGN (cap_info->header.imagesize,PAGE_SIZE ) /PAGE_SIZE ; + pages_needed =ALIGN (cap_info->total_size,PAGE_SIZE ) /PAGE_SIZE ;if (pages_needed ==0 ) {pr_err ("invalid capsule size" );
@@ -84,7 +59,6 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,return ret; } - cap_info->total_size = cap_info->header.imagesize; temp_page =krealloc (cap_info->pages, pages_needed *sizeof (void *),GFP_KERNEL | __GFP_ZERO);
@@ -97,6 +71,30 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info, }/** +* efi_capsule_setup_info - obtain the efi capsule header in the binary and +* setup capsule_info structure +* @cap_info: pointer to current instance of capsule_info structure +* @kbuff: a mapped first page buffer pointer +* @hdr_bytes: the total received number of bytes for efi header +* +* Platforms with non-standard capsule update mechanisms can override +* this __weak function so they can perform any required capsule +* image munging. See quark_quirk_function() for an example. +**/ +int __weak efi_capsule_setup_info (struct capsule_info *cap_info,void *kbuff, +size_t hdr_bytes) +{ +/* Only process data block that is larger than efi header size */ +if (hdr_bytes <sizeof (efi_capsule_header_t)) +return 0 ; + +memcpy (&cap_info->header, kbuff,sizeof (cap_info->header)); + cap_info->total_size = cap_info->header.imagesize; + +return __efi_capsule_setup_info (cap_info); +} + +/** * efi_capsule_submit_update - invoke the efi_capsule_update API once binary * upload done * @cap_info: pointer to current instance of capsule_info structure
@@ -186,7 +184,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,/* Setup capsule binary info structure */ if (cap_info->header.headersize ==0 ) { - ret =efi_capsule_setup_info (cap_info, kbuff, + ret =efi_capsule_setup_info (cap_info, kbuff - cap_info->count, cap_info->count + write_byte);if (ret) goto fail_unmap;
include/linux/efi.h +12 -0
@@ -129,6 +129,18 @@ typedef struct {#define EFI_CAPSULE_POPULATE_SYSTEM_TABLE 0x00020000#define EFI_CAPSULE_INITIATE_RESET 0x00040000 +struct capsule_info { +efi_capsule_header_t header; +int reset_type; +long index; +size_t count; +size_t total_size; +struct page **pages; +size_t page_bytes_remain; +}; + +int __efi_capsule_setup_info (struct capsule_info *cap_info); +/* * Allocation types for calls to boottime->allocate_pages. */
Signature · 1 line
2.12.3
PATCH 13/14 efi/capsule-loader: Use page addresses rather than struct page pointers
In reply to Jan KiszkaFrom: Ard Biesheuvel <[email protected]>
commit 2a457fb31df62c6b482f78e4f74aaed99271f44d upstream.
To give some leeway to code that handles non-standard capsule headers, let's keep an array of page addresses rather than struct page pointers.
This gives special implementations of efi_capsule_setup_info() the opportunity to mangle the payload a bit before it is presented to the firmware, without putting any knowledge of the nature of such quirks into the generic code.
--- drivers/firmware/efi/capsule-loader.c | 12 ++++++++---- drivers/firmware/efi/capsule.c | 7 ++++--- include/linux/efi.h | 4 ++-- 3 files changed, 14 insertions(+), 9 deletions(-)
drivers/firmware/efi/capsule-loader.c +8 -4
@@ -20,6 +20,10 @@#define NO_FURTHER_WRITE_ACTION -1 +#ifndef phys_to_page +#define phys_to_page (x) pfn_to_page((x) >> PAGE_SHIFT) +#endif +/** * efi_free_all_buff_pages - free all previous allocated buffer pages * @cap_info: pointer to current instance of capsule_info structure
@@ -31,7 +35,7 @@static void efi_free_all_buff_pages (struct capsule_info *cap_info) {while (cap_info->index >0 ) -__free_page (cap_info->pages[--cap_info->index]); +__free_page (phys_to_page (cap_info->pages[--cap_info->index])); cap_info->index =NO_FURTHER_WRITE_ACTION ; }
@@ -161,12 +165,12 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff, goto failed; } - cap_info->pages[cap_info->index++] = page; + cap_info->pages[cap_info->index++] =page_to_phys (page); cap_info->page_bytes_remain =PAGE_SIZE ; + }else { + page =phys_to_page (cap_info->pages[cap_info->index -1 ]); } - page = cap_info->pages[cap_info->index -1 ]; - kbuff =kmap (page);if (!kbuff) { ret = -ENOMEM ;
drivers/firmware/efi/capsule.c +4 -3
@@ -218,7 +218,7 @@ efi_capsule_update_locked(efi_capsule_header_t *capsule,* * Return 0 on success, a converted EFI status code on failure. */ -int efi_capsule_update (efi_capsule_header_t *capsule,struct page **pages) +int efi_capsule_update (efi_capsule_header_t *capsule,phys_addr_t *pages) {u32 imagesize = capsule->imagesize;efi_guid_t guid = capsule->guid;
@@ -257,10 +257,11 @@ int efi_capsule_update(efi_capsule_header_t *capsule, struct page **pages) }for (j =0 ; j <SGLIST_PER_PAGE && count >0 ; j++) { -u64 sz =min_t (u64, imagesize,PAGE_SIZE ); +u64 sz =min_t (u64, imagesize, +PAGE_SIZE - (u64)*pages %PAGE_SIZE ); sglist[j].length = sz; - sglist[j].data =page_to_phys (*pages++); + sglist[j].data = *pages++; imagesize -= sz; count--;
include/linux/efi.h +2 -2
@@ -135,7 +135,7 @@ struct capsule_info {long index;size_t count;size_t total_size; -struct page **pages; +phys_addr_t *pages;size_t page_bytes_remain; };
@@ -1246,7 +1246,7 @@ 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); +phys_addr_t *pages);#ifdef CONFIG_EFI_RUNTIME_MAP int efi_runtime_map_init (struct kobject *);
Signature · 1 line
2.12.3
PATCH 14/14 efi/capsule: Add support for Quark security header
In reply to Jan KiszkaFrom: Jan Kiszka <[email protected]>
commit 2959c95d510cc45b246ba727eb8fdf8b601c6eec upstream.
The firmware for Quark X102x prepends a security header to the capsule which is needed to support the mandatory secure boot on this processor. The header can be detected by checking for the "_CSH" signature and - to avoid any GUID conflict - validating its size field to contain the expected value. Then we need to look for the EFI header right after the security header and pass the real header to __efi_capsule_setup_info.
To be minimal invasive and maximal safe, the quirk version of efi_capsule_setup_info() is only effective on Quark processors.
--- arch/x86/platform/efi/quirks.c | 137 +++++++++++++++++++++++++++++++++++++++++ drivers/firmware/efi/Kconfig | 9 +++ 2 files changed, 146 insertions(+)
arch/x86/platform/efi/quirks.c +137 -0
@@ -10,12 +10,66 @@#include <linux/acpi.h> #include <asm/efi.h> #include <asm/uv/uv.h> +#include <asm/cpu_device_id.h> #define EFI_MIN_RESERVE 5120#define EFI_DUMMY_GUID \ EFI_GUID(0x4424ac57, 0xbe4b, 0x47dd, 0x9e, 0x97, 0xed, 0x50, 0xf0, 0x9f, 0x92, 0xa9) +#define QUARK_CSH_SIGNATURE 0x5f435348/* _CSH */ +#define QUARK_SECURITY_HEADER_SIZE 0x400 + +/* +* Header prepended to the standard EFI capsule on Quark systems the are based +* on Intel firmware BSP. +* @csh_signature: Unique identifier to sanity check signed module +* presence ("_CSH"). +* @version: Current version of CSH used. Should be one for Quark A0. +* @modulesize: Size of the entire module including the module header +* and payload. +* @security_version_number_index: Index of SVN to use for validation of signed +* module. +* @security_version_number: Used to prevent against roll back of modules. +* @rsvd_module_id: Currently unused for Clanton (Quark). +* @rsvd_module_vendor: Vendor Identifier. For Intel products value is +* 0x00008086. +* @rsvd_date: BCD representation of build date as yyyymmdd, where +* yyyy=4 digit year, mm=1-12, dd=1-31. +* @headersize: Total length of the header including including any +* padding optionally added by the signing tool. +* @hash_algo: What Hash is used in the module signing. +* @cryp_algo: What Crypto is used in the module signing. +* @keysize: Total length of the key data including including any +* padding optionally added by the signing tool. +* @signaturesize: Total length of the signature including including any +* padding optionally added by the signing tool. +* @rsvd_next_header: 32-bit pointer to the next Secure Boot Module in the +* chain, if there is a next header. +* @rsvd: Reserved, padding structure to required size. +* +* See also QuartSecurityHeader_t in +* Quark_EDKII_v1.2.1.1/QuarkPlatformPkg/Include/QuarkBootRom.h +* from https://downloadcenter.intel.com/download/23197/Intel-Quark-SoC-X1000-Board-Support-Package-BSP +*/ +struct quark_security_header { +u32 csh_signature; +u32 version; +u32 modulesize; +u32 security_version_number_index; +u32 security_version_number; +u32 rsvd_module_id; +u32 rsvd_module_vendor; +u32 rsvd_date; +u32 headersize; +u32 hash_algo; +u32 cryp_algo; +u32 keysize; +u32 signaturesize; +u32 rsvd_next_header; +u32 rsvd[2 ]; +}; +static efi_char16_t efi_dummy_name[6 ] = {'D' ,'U' ,'M' ,'M' ,'Y' ,0 };static bool efi_no_storage_paranoia;
@@ -288,3 +342,86 @@ bool efi_poweroff_required(void) {return !!acpi_gbl_reduced_hardware; } + +#ifdef CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH + +static int qrk_capsule_setup_info (struct capsule_info *cap_info,void **pkbuff, +size_t hdr_bytes) +{ +struct quark_security_header *csh = *pkbuff; + +/* Only process data block that is larger than the security header */ +if (hdr_bytes <sizeof (struct quark_security_header )) +return 0 ; + +if (csh->csh_signature !=QUARK_CSH_SIGNATURE || + csh->headersize !=QUARK_SECURITY_HEADER_SIZE ) +return 1 ; + +/* Only process data block if EFI header is included */ +if (hdr_bytes <QUARK_SECURITY_HEADER_SIZE + +sizeof (efi_capsule_header_t)) +return 0 ; + +pr_debug ("Quark security header detected\n" ); + +if (csh->rsvd_next_header !=0 ) { +pr_err ("multiple Quark security headers not supported\n" ); +return -EINVAL ; + } + + *pkbuff += csh->headersize; + cap_info->total_size = csh->headersize; + +/* +* Update the first page pointer to skip over the CSH header. +*/ + cap_info->pages[0 ] += csh->headersize; + +return 1 ; +} + +#define ICPU (family, model, quirk_handler) \ + { X86_VENDOR_INTEL, family, model, X86_FEATURE_ANY, \ + (unsigned long)&quirk_handler } + +static const struct x86_cpu_id efi_capsule_quirk_ids[] = { +ICPU (5 ,9 , qrk_capsule_setup_info),/* Intel Quark X1000 */ + { } +}; + +int efi_capsule_setup_info (struct capsule_info *cap_info,void *kbuff, +size_t hdr_bytes) +{ +int (*quirk_handler)(struct capsule_info *,void **,size_t ); +const struct x86_cpu_id *id; +int ret; + +if (hdr_bytes <sizeof (efi_capsule_header_t)) +return 0 ; + + cap_info->total_size =0 ; + + id =x86_match_cpu (efi_capsule_quirk_ids); +if (id) { +/* +* The quirk handler is supposed to return +* - a value > 0 if the setup should continue, after advancing +* kbuff as needed +* - 0 if not enough hdr_bytes are available yet +* - a negative error code otherwise +*/ + quirk_handler = (typeof (quirk_handler ))id->driver_data; + ret =quirk_handler (cap_info, &kbuff, hdr_bytes); +if (ret <=0 ) +return ret; + } + +memcpy (&cap_info->header, kbuff,sizeof (cap_info->header)); + + cap_info->total_size += cap_info->header.imagesize; + +return __efi_capsule_setup_info (cap_info); +} + +#endif
drivers/firmware/efi/Kconfig +9 -0
@@ -97,6 +97,15 @@ config EFI_CAPSULE_LOADER Most users should say N. +config EFI_CAPSULE_QUIRK_QUARK_CSH + boolean "Add support for Quark capsules with non-standard headers" + depends on X86 && !64BIT + select EFI_CAPSULE_LOADER + default y + help + Add support for processing Quark X1000 EFI capsules, whose header + layout deviates from the layout mandated by the UEFI specification. + endmenu config UEFI_CPER
Signature · 1 line
2.12.3
cover EFI capsule update support for IOT2000 devices
In reply to Jan KiszkaHello Jan,
Quoted 5 lines · Jan Kiszka
Last chunk: This backports EFI capsule updates, primarily for the use with the IOT2020 and IOT2040, the latter with Quark-proprietary security header format. The feature should also work for the Galileo Gen 2 and, at least conceptually, for any EFI capsule update compatible firmware.
What is the purpose of this series? I hope you are not expecting this to be considered for -stable?
Please check Documentation/process/stable-kernel-rules.rst for guidelines on what is appropriate for -stable.
Quoted 41 lines
Cc Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Ard Biesheuvel <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Bryan O'Donoghue <[email protected]>Cc Denys Vlasenko <[email protected]>Cc H. Peter Anvin <[email protected]>Cc joeyli <[email protected]>Cc Josh Poimboeuf <[email protected]>Cc Kweh Hock Leong <[email protected]>Cc Linus Torvalds <[email protected]>Cc linux-efi at vger.kernel.orgCc Mark Salter <[email protected]>Cc Matt Fleming <[email protected]>Cc Peter Jones <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Sam Protsenko <[email protected]>Cc <[email protected]> # v4.7Cc Thomas Gleixner <[email protected]>Ard Biesheuvel (3):
efi/capsule-loader: Use a cached copy of the capsule header efi/capsule-loader: Redirect calls toefi_capsule_setup_info()via
weak alias
efi/capsule-loader: Use page addresses rather than struct page
pointersAustin Christ (1):
efi/capsule: Allocate whole capsule into virtual memoryJan Kiszka (5):
efi/capsule: Fix return code on failing kmap/vmap efi/capsule: Removepr_debug()on ENOMEM or EFAULT efi/capsule: Clean up pr_err/_info() messages efi/capsule: Adjust return type ofefi_capsule_setup_info()efi/capsule: Add support for Quark security headerKweh, Hock Leong (1):
efi: Add misc char driver interface to update EFI firmware
Quoted 7 lines
Matt Fleming (4):
efi: Moveefi_status_to_err()todrivers/firmware/efi/
efi: Add 'capsule' update support
x86/efi: Force EFI reboot to process pending capsules efi/capsule: Move 'capsule' to the stack inefi_capsule_supported()
arch/x86/k
ernel/reboot.c | 9 +
Quoted 16 lines
arch/x86/platform/efi/quirks.c | 137 ++++++++++++++ drivers/firmware/efi/Kconfig | 19 ++ drivers/firmware/efi/Makefile | 2 + drivers/firmware/efi/capsule-loader.c | 330 ++++++++++++++++++++++++++++++++++ drivers/firmware/efi/capsule.c | 294 ++++++++++++++++++++++++++++++ drivers/firmware/efi/efi.c | 33 ++++ drivers/firmware/efi/reboot.c | 12 +- drivers/firmware/efi/vars.c | 33 ---- include/linux/efi.h | 34 ++++ 10 files changed, 869 insertions(+), 34 deletions(-) create mode 100644 drivers/firmware/efi/capsule-loader.c create mode 100644 drivers/firmware/efi/capsule.c--
2.12.3
cover EFI capsule update support for IOT2000 devices
Quoted 9 lines · Ard Biesheuvel
Hello Jan,
Quoted 5 lines · Jan Kiszka
Last chunk: This backports EFI capsule updates, primarily for the use with the IOT2020 and IOT2040, the latter with Quark-proprietary security header format. The feature should also work for the Galileo Gen 2 and, at least conceptually, for any EFI capsule update compatible firmware.
Quoted 4 lines
What is the purpose of this series? I hope you are not expecting this to be considered for -stable?
Please checkDocumentation/process/stable-kernel-rules.rstfor guidelines on what is appropriate for -stable.
Argh, sorry. Missed that I didn't activate the CC filter for this one.
Everyone except for Ben and cip-dev, please ignore - this is just a backport to the CIP SLTS kernel.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT RDA ITP SES-DE Corporate Competence Center Embedded Linux
cover EFI capsule update support for IOT2000 devices
Quoted 15 lines · Jan Kiszka
Quoted 9 lines · Ard Biesheuvel
Hello Jan,
Quoted 5 lines · Jan Kiszka
Last chunk: This backports EFI capsule updates, primarily for the use with the IOT2020 and IOT2040, the latter with Quark-proprietary security header format. The feature should also work for the Galileo Gen 2 and, at least conceptually, for any EFI capsule update compatible firmware.
Quoted 4 lines
What is the purpose of this series? I hope you are not expecting this to be considered for -stable?
Please checkDocumentation/process/stable-kernel-rules.rstfor guidelines on what is appropriate for -stable.
Quoted 5 lines
Argh, sorry. Missed that I didn't activate the CC filter for this one.
Everyone except for Ben and cip-dev, please ignore - this is just a backport to the CIP SLTS kernel.
OK no worries
cover EFI capsule update support for IOT2000 devices
In reply to Jan KiszkaQuoted 4 lines · Jan Kiszka
Last chunk: This backports EFI capsule updates, primarily for the use with the IOT2020 and IOT2040, the latter with Quark-proprietary security header format. The feature should also work for the Galileo Gen 2 and, at least conceptually, for any EFI capsule update compatible firmware.
[...]
Applied these, but shouldn't I also apply:
commit 62075e581802ea1842d5d3c490a7e46330bdb9e1
Author: Matt Fleming <[email protected]> Date: Fri May 6 22:39:27 2016 +0100
efi/capsule: Make efi_capsule_pending() lockless
Ben.
Signature · 2 lines
Ben Hutchings Software Developer, Codethink Ltd.
cover EFI capsule update support for IOT2000 devices
Quoted 7 lines · Ben Hutchings
Quoted 4 lines · Jan Kiszka
Last chunk: This backports EFI capsule updates, primarily for the use with the IOT2020 and IOT2040, the latter with Quark-proprietary security header format. The feature should also work for the Galileo Gen 2 and, at least conceptually, for any EFI capsule update compatible firmware.
[...]
Quoted 8 lines
Applied these, but shouldn't I also apply:
commit
62075e581802ea1842d5d3c490a7e46330bdb9e1Author: Matt Fleming <[email protected]> Date: Fri May 6 22:39:27 2016 +0100efi/capsule: Make
efi_capsule_pending()lockless
Indeed - I should have read more than the subject line (which sounded like optimization).
Please add to the queue.
Jan
cover EFI capsule update support for IOT2000 devices
Quoted 14 lines · Jan Kiszka
Quoted 13 lines · Ben Hutchings
Quoted 4 lines · Jan Kiszka
Last chunk: This backports EFI capsule updates, primarily for the use with the IOT2020 and IOT2040, the latter with Quark-proprietary security header format. The feature should also work for the Galileo Gen 2 and, at least conceptually, for any EFI capsule update compatible firmware.
[...]
Applied these, but shouldn't I also apply:
commit
62075e581802ea1842d5d3c490a7e46330bdb9e1Author: Matt Fleming <[email protected]> Date: Fri May 6 22:39:27 2016 +0100
Quoted 7 lines
Quoted 2 lines
efi/capsule: Make
efi_capsule_pending()locklessIndeed - I should have read more than the subject line (which sounded like optimization).
Please add to the queue.
OK, will do.
Ben.
Signature · 2 lines
Ben Hutchings Software Developer, Codethink Ltd.