x86/efi changes for v3.7
Subsystems (4)
Linus,
Please pull the latest x86-efi-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-efi-for-linus
HEAD: 2223af389032425e3d1a70f9cb3a63feaa654ced efi: Fix the ACPI BGRT driver for images located in EFI boot services memory
EFI loader robustness enhancements plus smaller fixes.
out-of-topic modifications in x86-efi-for-linus:
------------------------------------------------
drivers/acpi/Kconfig # 2223af3: efi: Fix the ACPI BGRT driver for drivers/acpi/bgrt.c # 2223af3: efi: Fix the ACPI BGRT driver for drivers/video/efifb.c # f462ed9: efifb: Skip DMI checks if the boo include/linux/efi-bgrt.h # 2223af3: efi: Fix the ACPI BGRT driver for include/linux/screen_info.h # f462ed9: efifb: Skip DMI checks if the boo
Thanks,
Ingo
------------------>
Josh Triplett (3):
efi: Defer freeing boot services memory until after ACPI init
efi: Add a function to look up existing IO memory mappings
efi: Fix the ACPI BGRT driver for images located in EFI boot services memory
Matthew Garrett (4):
X86: Improve GOP detection in the EFI boot stub
efi: Build EFI stub with EFI-appropriate options
efifb: Skip DMI checks if the bootloader knows what it's doing x86, EFI: Calculate the EFI framebuffer size instead of trusting the firmware
Seiji Aguchi (1):
efi: initialize efi.runtime_version to make query_variable_info/update_capsule workable
arch/x86/boot/compressed/Makefile | 3 ++ arch/x86/boot/compressed/eboot.c | 34 ++++++++++-------- arch/x86/boot/compressed/eboot.h | 4 +++ arch/x86/platform/efi/Makefile | 1 + arch/x86/platform/efi/efi-bgrt.c | 76 +++++++++++++++++++++++++++++++++++++++ arch/x86/platform/efi/efi.c | 66 +++++++++++++++++++++++++++------- drivers/acpi/Kconfig | 4 +-- drivers/acpi/bgrt.c | 76 +++++---------------------------------- drivers/video/efifb.c | 4 ++- include/linux/efi-bgrt.h | 21 +++++++++++ include/linux/efi.h | 8 +++++ include/linux/screen_info.h | 2 ++ init/main.c | 5 +++ 13 files changed, 207 insertions(+), 97 deletions(-) create mode 100644 arch/x86/platform/efi/efi-bgrt.c create mode 100644 include/linux/efi-bgrt.h
arch/x86/boot/compressed/Makefile +3 -0
@@ -28,6 +28,9 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \ $(obj)/piggy.o +$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone +$(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone + ifeq ($(CONFIG_EFI_STUB), y) VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o endif
arch/x86/boot/compressed/eboot.c +20 -14
@@ -276,8 +276,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, nr_gops = size /sizeof (void *);for (i =0 ; i < nr_gops; i++) {struct efi_graphics_output_mode_info *info; -efi_guid_t pciio_proto =EFI_PCI_IO_PROTOCOL_GUID ; -void *pciio; +efi_guid_t conout_proto =EFI_CONSOLE_OUT_DEVICE_GUID ; +bool conout_found = false; +void *dummy;void *h = gop_handle[i]; status = efi_call_phys3(sys_table->boottime->handle_protocol,
@@ -285,19 +286,21 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,if (status !=EFI_SUCCESS )continue ; -efi_call_phys3 (sys_table->boottime->handle_protocol, - h, &pciio_proto, &pciio); + status =efi_call_phys3 (sys_table->boottime->handle_protocol, + h, &conout_proto, &dummy); + +if (status ==EFI_SUCCESS ) + conout_found = true; status =efi_call_phys4 (gop->query_mode, gop, gop->mode->mode, &size, &info); -if (status ==EFI_SUCCESS && (!first_gop || pciio)) { +if (status ==EFI_SUCCESS && (!first_gop || conout_found)) {/* -* Apple provide GOPs that are not backed by -* real hardware (they're used to handle -* multiple displays). The workaround is to -* search for a GOP implementing the PCIIO -* protocol, and if one isn't found, to just -* fallback to the first GOP. +* Systems that use the UEFI Console Splitter may +* provide multiple GOP devices, not all of which are +* backed by real hardware. The workaround is to search +* for a GOP implementing the ConOut protocol, and if +* one isn't found, to just fall back to the first GOP. */ width = info->horizontal_resolution; height = info->vertical_resolution;
@@ -308,10 +311,10 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, pixels_per_scan_line = info->pixels_per_scan_line;/* -* Once we've found a GOP supporting PCIIO, +* Once we've found a GOP supporting ConOut, * don't bother looking any further. */ -if (pciio) +if (conout_found)break ; first_gop = gop;
@@ -328,7 +331,6 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, si->lfb_width = width; si->lfb_height = height; si->lfb_base = fb_base; - si->lfb_size = fb_size; si->pages =1 ;if (pixel_format ==PIXEL_RGB_RESERVED_8BIT_PER_COLOR ) {
@@ -376,6 +378,10 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, si->rsvd_pos =0 ; } + si->lfb_size = si->lfb_linelength * si->lfb_height; + + si->capabilities |=VIDEO_CAPABILITY_SKIP_QUIRKS ; + free_handle:efi_call_phys1 (sys_table->boottime->free_pool, gop_handle);return status;
arch/x86/boot/compressed/eboot.h +4 -0
@@ -14,6 +14,10 @@#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT)#define EFI_READ_CHUNK_SIZE (1024 * 1024) +#define EFI_CONSOLE_OUT_DEVICE_GUID \ + EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x0, 0x90, 0x27, \ + 0x3f, 0xc1, 0x4d) +#define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0#define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1#define PIXEL_BIT_MASK 2
arch/x86/platform/efi/Makefile +1 -0
@@ -1 +1,2 @@ obj-$(CONFIG_EFI) += efi.o efi_$(BITS).o efi_stub_$(BITS).o +obj-$(CONFIG_ACPI_BGRT) += efi-bgrt.o
arch/x86/platform/efi/efi-bgrt.c new file +76 -0
76 lines not on this page · raw message
arch/x86/platform/efi/efi.c +53 -13
122 lines not on this page · raw message
drivers/acpi/Kconfig +2 -2
@@ -385,8 +385,8 @@ config ACPI_CUSTOM_METHOD to override that restriction). config ACPI_BGRT - tristate "Boottime Graphics Resource Table support" - default n + bool "Boottime Graphics Resource Table support" + depends on EFI help This driver adds support for exposing the ACPI Boottime Graphics Resource Table, which allows the operating system to obtain
drivers/acpi/bgrt.c +9 -67
119 lines not on this page · raw message
drivers/video/efifb.c +3 -1
@@ -553,7 +553,9 @@ static int __init efifb_init(void)int ret;char *option =NULL ; -dmi_check_system (dmi_system_table); +if (screen_info.orig_video_isVGA !=VIDEO_TYPE_EFI || + !(screen_info.capabilities &VIDEO_CAPABILITY_SKIP_QUIRKS )) +dmi_check_system (dmi_system_table);if (screen_info.orig_video_isVGA !=VIDEO_TYPE_EFI )return -ENODEV ;
include/linux/efi-bgrt.h new file +21 -0
@@ -0,0 +1,21 @@ +#ifndef _LINUX_EFI_BGRT_H +#define _LINUX_EFI_BGRT_H + +#ifdef CONFIG_ACPI_BGRT + +#include <linux/acpi.h> + +void efi_bgrt_init (void ); + +/* The BGRT data itself; only valid if bgrt_image != NULL. */ +extern void *bgrt_image; +extern size_t bgrt_image_size; +extern struct acpi_table_bgrt *bgrt_tab; + +#else /* !CONFIG_ACPI_BGRT */ + +static inline void efi_bgrt_init (void ) {} + +#endif /* !CONFIG_ACPI_BGRT */ + +#endif /* _LINUX_EFI_BGRT_H */
include/linux/efi.h +8 -0
@@ -496,6 +496,14 @@ extern void efi_map_pal_code (void);extern void efi_memmap_walk (efi_freemem_callback_t callback,void *arg);extern void efi_gettimeofday (struct timespec *ts);extern void efi_enter_virtual_mode (void );/* switch EFI to virtual mode, if possible */ +#ifdef CONFIG_X86 +extern void efi_late_init (void ); +extern void efi_free_boot_services (void ); +#else +static inline void efi_late_init (void ) {} +static inline void efi_free_boot_services (void ) {} +#endif +extern void __iomem *efi_lookup_mapped_addr (u64 phys_addr);extern u64 efi_get_iobase (void );extern u32 efi_mem_type (unsigned long phys_addr);extern u64 efi_mem_attributes (unsigned long phys_addr);
include/linux/screen_info.h +2 -0
@@ -68,6 +68,8 @@ struct screen_info {#define VIDEO_FLAGS_NOCURSOR (1 << 0)/* The video mode has no cursor set */ +#define VIDEO_CAPABILITY_SKIP_QUIRKS (1 << 0) +#ifdef __KERNEL__extern struct screen_info screen_info;
init/main.c +5 -0
@@ -631,6 +631,11 @@ asmlinkage void __init start_kernel(void)acpi_early_init ();/* before LAPIC and SMP init */ sfi_init_late (); +if (efi_enabled) { +efi_late_init (); +efi_free_boot_services (); + } +ftrace_init ();/* Do the rest non-__init'ed, we're now alive */