diff options
| -rw-r--r-- | arch/x86/boot/compressed/Makefile | 3 | ||||
| -rw-r--r-- | arch/x86/boot/compressed/eboot.c | 34 | ||||
| -rw-r--r-- | arch/x86/boot/compressed/eboot.h | 4 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi.c | 1 | ||||
| -rw-r--r-- | drivers/video/efifb.c | 4 | ||||
| -rw-r--r-- | include/linux/screen_info.h | 2 |
6 files changed, 33 insertions, 15 deletions
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index e398bb5d63bb..8a84501acb1b 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
| @@ -28,6 +28,9 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ | |||
| 28 | $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \ | 28 | $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \ |
| 29 | $(obj)/piggy.o | 29 | $(obj)/piggy.o |
| 30 | 30 | ||
| 31 | $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone | ||
| 32 | $(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone | ||
| 33 | |||
| 31 | ifeq ($(CONFIG_EFI_STUB), y) | 34 | ifeq ($(CONFIG_EFI_STUB), y) |
| 32 | VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o | 35 | VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o |
| 33 | endif | 36 | endif |
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index b3e0227df2c9..c760e073963e 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
| @@ -276,8 +276,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
| 276 | nr_gops = size / sizeof(void *); | 276 | nr_gops = size / sizeof(void *); |
| 277 | for (i = 0; i < nr_gops; i++) { | 277 | for (i = 0; i < nr_gops; i++) { |
| 278 | struct efi_graphics_output_mode_info *info; | 278 | struct efi_graphics_output_mode_info *info; |
| 279 | efi_guid_t pciio_proto = EFI_PCI_IO_PROTOCOL_GUID; | 279 | efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID; |
| 280 | void *pciio; | 280 | bool conout_found = false; |
| 281 | void *dummy; | ||
| 281 | void *h = gop_handle[i]; | 282 | void *h = gop_handle[i]; |
| 282 | 283 | ||
| 283 | status = efi_call_phys3(sys_table->boottime->handle_protocol, | 284 | 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, | |||
| 285 | if (status != EFI_SUCCESS) | 286 | if (status != EFI_SUCCESS) |
| 286 | continue; | 287 | continue; |
| 287 | 288 | ||
| 288 | efi_call_phys3(sys_table->boottime->handle_protocol, | 289 | status = efi_call_phys3(sys_table->boottime->handle_protocol, |
| 289 | h, &pciio_proto, &pciio); | 290 | h, &conout_proto, &dummy); |
| 291 | |||
| 292 | if (status == EFI_SUCCESS) | ||
| 293 | conout_found = true; | ||
| 290 | 294 | ||
| 291 | status = efi_call_phys4(gop->query_mode, gop, | 295 | status = efi_call_phys4(gop->query_mode, gop, |
| 292 | gop->mode->mode, &size, &info); | 296 | gop->mode->mode, &size, &info); |
| 293 | if (status == EFI_SUCCESS && (!first_gop || pciio)) { | 297 | if (status == EFI_SUCCESS && (!first_gop || conout_found)) { |
| 294 | /* | 298 | /* |
| 295 | * Apple provide GOPs that are not backed by | 299 | * Systems that use the UEFI Console Splitter may |
| 296 | * real hardware (they're used to handle | 300 | * provide multiple GOP devices, not all of which are |
| 297 | * multiple displays). The workaround is to | 301 | * backed by real hardware. The workaround is to search |
| 298 | * search for a GOP implementing the PCIIO | 302 | * for a GOP implementing the ConOut protocol, and if |
| 299 | * protocol, and if one isn't found, to just | 303 | * one isn't found, to just fall back to the first GOP. |
| 300 | * fallback to the first GOP. | ||
| 301 | */ | 304 | */ |
| 302 | width = info->horizontal_resolution; | 305 | width = info->horizontal_resolution; |
| 303 | height = info->vertical_resolution; | 306 | height = info->vertical_resolution; |
| @@ -308,10 +311,10 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
| 308 | pixels_per_scan_line = info->pixels_per_scan_line; | 311 | pixels_per_scan_line = info->pixels_per_scan_line; |
| 309 | 312 | ||
| 310 | /* | 313 | /* |
| 311 | * Once we've found a GOP supporting PCIIO, | 314 | * Once we've found a GOP supporting ConOut, |
| 312 | * don't bother looking any further. | 315 | * don't bother looking any further. |
| 313 | */ | 316 | */ |
| 314 | if (pciio) | 317 | if (conout_found) |
| 315 | break; | 318 | break; |
| 316 | 319 | ||
| 317 | first_gop = gop; | 320 | first_gop = gop; |
| @@ -328,7 +331,6 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | |||
| 328 | si->lfb_width = width; | 331 | si->lfb_width = width; |
| 329 | si->lfb_height = height; | 332 | si->lfb_height = height; |
| 330 | si->lfb_base = fb_base; | 333 | si->lfb_base = fb_base; |
| 331 | si->lfb_size = fb_size; | ||
| 332 | si->pages = 1; | 334 | si->pages = 1; |
| 333 | 335 | ||
| 334 | if (pixel_format == PIXEL_RGB_RESERVED_8BIT_PER_COLOR) { | 336 | 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, | |||
| 376 | si->rsvd_pos = 0; | 378 | si->rsvd_pos = 0; |
| 377 | } | 379 | } |
| 378 | 380 | ||
| 381 | si->lfb_size = si->lfb_linelength * si->lfb_height; | ||
| 382 | |||
| 383 | si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS; | ||
| 384 | |||
| 379 | free_handle: | 385 | free_handle: |
| 380 | efi_call_phys1(sys_table->boottime->free_pool, gop_handle); | 386 | efi_call_phys1(sys_table->boottime->free_pool, gop_handle); |
| 381 | return status; | 387 | return status; |
diff --git a/arch/x86/boot/compressed/eboot.h b/arch/x86/boot/compressed/eboot.h index 3b6e15627c55..e5b0a8f91c5f 100644 --- a/arch/x86/boot/compressed/eboot.h +++ b/arch/x86/boot/compressed/eboot.h | |||
| @@ -14,6 +14,10 @@ | |||
| 14 | #define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) | 14 | #define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) |
| 15 | #define EFI_READ_CHUNK_SIZE (1024 * 1024) | 15 | #define EFI_READ_CHUNK_SIZE (1024 * 1024) |
| 16 | 16 | ||
| 17 | #define EFI_CONSOLE_OUT_DEVICE_GUID \ | ||
| 18 | EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x0, 0x90, 0x27, \ | ||
| 19 | 0x3f, 0xc1, 0x4d) | ||
| 20 | |||
| 17 | #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0 | 21 | #define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0 |
| 18 | #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1 | 22 | #define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1 |
| 19 | #define PIXEL_BIT_MASK 2 | 23 | #define PIXEL_BIT_MASK 2 |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 92660edaa1e7..f55a4ce6dc49 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -890,6 +890,7 @@ void __init efi_enter_virtual_mode(void) | |||
| 890 | * | 890 | * |
| 891 | * Call EFI services through wrapper functions. | 891 | * Call EFI services through wrapper functions. |
| 892 | */ | 892 | */ |
| 893 | efi.runtime_version = efi_systab.fw_revision; | ||
| 893 | efi.get_time = virt_efi_get_time; | 894 | efi.get_time = virt_efi_get_time; |
| 894 | efi.set_time = virt_efi_set_time; | 895 | efi.set_time = virt_efi_set_time; |
| 895 | efi.get_wakeup_time = virt_efi_get_wakeup_time; | 896 | efi.get_wakeup_time = virt_efi_get_wakeup_time; |
diff --git a/drivers/video/efifb.c b/drivers/video/efifb.c index b4a632ada401..932abaa58a89 100644 --- a/drivers/video/efifb.c +++ b/drivers/video/efifb.c | |||
| @@ -553,7 +553,9 @@ static int __init efifb_init(void) | |||
| 553 | int ret; | 553 | int ret; |
| 554 | char *option = NULL; | 554 | char *option = NULL; |
| 555 | 555 | ||
| 556 | dmi_check_system(dmi_system_table); | 556 | if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || |
| 557 | !(screen_info.capabilities & VIDEO_CAPABILITY_SKIP_QUIRKS)) | ||
| 558 | dmi_check_system(dmi_system_table); | ||
| 557 | 559 | ||
| 558 | if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI) | 560 | if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI) |
| 559 | return -ENODEV; | 561 | return -ENODEV; |
diff --git a/include/linux/screen_info.h b/include/linux/screen_info.h index 899fbb487c94..fb3c5a8fef3d 100644 --- a/include/linux/screen_info.h +++ b/include/linux/screen_info.h | |||
| @@ -68,6 +68,8 @@ struct screen_info { | |||
| 68 | 68 | ||
| 69 | #define VIDEO_FLAGS_NOCURSOR (1 << 0) /* The video mode has no cursor set */ | 69 | #define VIDEO_FLAGS_NOCURSOR (1 << 0) /* The video mode has no cursor set */ |
| 70 | 70 | ||
| 71 | #define VIDEO_CAPABILITY_SKIP_QUIRKS (1 << 0) | ||
| 72 | |||
| 71 | #ifdef __KERNEL__ | 73 | #ifdef __KERNEL__ |
| 72 | extern struct screen_info screen_info; | 74 | extern struct screen_info screen_info; |
| 73 | 75 | ||
