EFI fixes
Linus,
Please pull the latest efi-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git efi-urgent-for-linus
# HEAD: a470552ee8965da0fe6fd4df0aa39c4cda652c7c efi: Don't attempt to map RCI2 config table if it doesn't exist
Protect presistent EFI memory reservations from kexec, fix EFIFB early console, EFI stub graphics output fixes and other misc fixes.
Thanks,
Ingo
------------------>
Andy Shevchenko (1):
efi/earlycon: Remap entire framebuffer after page initialization
Ard Biesheuvel (2):
efi/memreserve: Register reservations as 'reserved' in /proc/iomem
efi: Don't attempt to map RCI2 config table if it doesn't exist
Arvind Sankar (4):
efi/gop: Return EFI_NOT_FOUND if there are no usable GOPs efi/gop: Return EFI_SUCCESS if a usable GOP was found efi/gop: Fix memory leak in __gop_query32/64()
efi: Fix efi_loaded_image_t::unload type
drivers/firmware/efi/earlycon.c | 40 +++++++++++++++++++ drivers/firmware/efi/efi.c | 28 ++++++++++++- drivers/firmware/efi/libstub/gop.c | 80 +++++++++----------------------------- drivers/firmware/efi/rci2-table.c | 3 ++ include/linux/efi.h | 10 ++--- 5 files changed, 93 insertions(+), 68 deletions(-)
drivers/firmware/efi/earlycon.c +40 -0
@@ -13,18 +13,57 @@#include <asm/early_ioremap.h> +static const struct console *earlycon_console__initdata ;static const struct font_desc *font;static u32 efi_x, efi_y;static u64 fb_base;static pgprot_t fb_prot; +static void *efi_fb; + +/* +* EFI earlycon needs to use early_memremap() to map the framebuffer. +* But early_memremap() is not usable for 'earlycon=efifb keep_bootcon', +* memremap() should be used instead. memremap() will be available after +* paging_init() which is earlier than initcall callbacks. Thus adding this +* early initcall function early_efi_map_fb() to map the whole EFI framebuffer. +*/ +static int __init efi_earlycon_remap_fb (void ) +{ +/* bail if there is no bootconsole or it has been disabled already */ +if (!earlycon_console || !(earlycon_console->flags &CON_ENABLED )) +return 0 ; + +if (pgprot_val (fb_prot) ==pgprot_val (PAGE_KERNEL )) + efi_fb =memremap (fb_base, screen_info.lfb_size,MEMREMAP_WB ); +else + efi_fb =memremap (fb_base, screen_info.lfb_size,MEMREMAP_WC ); + +return efi_fb ?0 : -ENOMEM ; +} +early_initcall (efi_earlycon_remap_fb); + +static int __init efi_earlycon_unmap_fb (void ) +{ +/* unmap the bootconsole fb unless keep_bootcon has left it enabled */ +if (efi_fb && !(earlycon_console->flags &CON_ENABLED )) +memunmap (efi_fb); +return 0 ; +} +late_initcall (efi_earlycon_unmap_fb);static __ref void *efi_earlycon_map (unsigned long start,unsigned long len) { +if (efi_fb) +return efi_fb + start; +return early_memremap_prot (fb_base + start, len,pgprot_val (fb_prot)); }static __ref void efi_earlycon_unmap (void *addr,unsigned long len) { +if (efi_fb) +return ; +early_memunmap (addr, len); }
@@ -201,6 +240,7 @@ static int __init efi_earlycon_setup(struct earlycon_device *device,efi_earlycon_scroll_up (); device->con->write = efi_earlycon_write; + earlycon_console = device->con;return 0 ; }EARLYCON_DECLARE (efifb, efi_earlycon_setup);
drivers/firmware/efi/efi.c +26 -2
@@ -979,6 +979,24 @@ static int __init efi_memreserve_map_root(void)return 0 ; } +static int efi_mem_reserve_iomem (phys_addr_t addr,u64 size) +{ +struct resource *res, *parent; + + res =kzalloc (sizeof (struct resource ),GFP_ATOMIC ); +if (!res) +return -ENOMEM ; + + res->name ="reserved" ; + res->flags =IORESOURCE_MEM ; + res->start = addr; + res->end = addr + size -1 ; + +/* we expect a conflict with a 'System RAM' region */ + parent =request_resource_conflict (&iomem_resource, res); +return parent ?request_resource (parent, res) :0 ; +} +int __ref efi_mem_reserve_persistent (phys_addr_t addr,u64 size) {struct linux_efi_memreserve *rsv;
@@ -1003,7 +1021,7 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) rsv->entry[index].size = size;memunmap (rsv); -return 0 ; +return efi_mem_reserve_iomem (addr, size); }memunmap (rsv); }
@@ -1013,6 +1031,12 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)if (!rsv)return -ENOMEM ; + rc =efi_mem_reserve_iomem (__pa (rsv),SZ_4K ); +if (rc) { +free_page ((unsigned long )rsv); +return rc; + } +/* * The memremap() call above assumes that a linux_efi_memreserve entry * never crosses a page boundary, so let's ensure that this remains true
@@ -1029,7 +1053,7 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) efi_memreserve_root->next =__pa (rsv);spin_unlock (&efi_mem_reserve_persistent_lock); -return 0 ; +return efi_mem_reserve_iomem (addr, size); }static int __init efi_memreserve_root_init (void )
drivers/firmware/efi/libstub/gop.c +19 -61
147 lines not on this page · raw message
drivers/firmware/efi/rci2-table.c +3 -0
@@ -81,6 +81,9 @@ static int __init efi_rci2_sysfs_init(void)struct kobject *tables_kobj;int ret = -ENOMEM ; +if (rci2_table_phys ==EFI_INVALID_TABLE_ADDR ) +return 0 ; + rci2_base =memremap (rci2_table_phys,sizeof (struct rci2_table_global_hdr ),MEMREMAP_WB );
include/linux/efi.h +5 -5
@@ -824,7 +824,7 @@ typedef struct {__aligned_u64 image_size;unsigned int image_code_type;unsigned int image_data_type; -unsigned long unload; +u32 unload; } efi_loaded_image_32_t; typedef struct {
@@ -840,14 +840,14 @@ typedef struct {__aligned_u64 image_size;unsigned int image_code_type;unsigned int image_data_type; -unsigned long unload; +u64 unload; } efi_loaded_image_64_t; typedef struct { u32 revision; - void *parent_handle; + efi_handle_t parent_handle; efi_system_table_t *system_table; - void *device_handle; + efi_handle_t device_handle; void *file_path; void *reserved; u32 load_options_size;
@@ -856,7 +856,7 @@ typedef struct {__aligned_u64 image_size;unsigned int image_code_type;unsigned int image_data_type; -unsigned long unload; +efi_status_t (*unload)(efi_handle_t image_handle); } efi_loaded_image_t;
The pull request you sent on Tue, 17 Dec 2019 12:09:42 +0100:
The pull request you sent on Tue, 17 Dec 2019 12:09:42 +0100:
Quoted 1 line
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.gitefi-urgent-for-linus
has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/a114a18c7dbc2b7ac5a1379a8dcced6095c52ead
Thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.wiki.kernel.org/userdoc/prtracker