lkml.org 
[lkml]   [2015]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 51/94] x86/efi: Fix multiple GOP device support
    Date
    3.16.7-ckt20 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: =?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?=

    commit 8a53554e12e98d1759205afd7b8e9e2ea0936f48 upstream.

    When multiple GOP devices exists, but none of them implements
    ConOut, the code should just choose the first GOP (according to
    the comments). But currently 'fb_base' will refer to the last GOP,
    while other parameters to the first GOP, which will likely
    result in a garbled display.

    I can reliably reproduce this bug using my ASRock Z87M Extreme4
    motherboard with CSM and integrated GPU disabled, and two PCIe
    video cards (NVidia GT640 and GTX980), booting from efi-stub
    (booting from grub works fine). On the primary display the
    ASRock logo remains and on the secondary screen it is garbled
    up completely.

    Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
    Signed-off-by: Matt Fleming <matt.fleming@intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Matthew Garrett <mjg59@srcf.ucam.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1444659236-24837-2-git-send-email-matt@codeblueprint.co.uk
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    arch/x86/boot/compressed/eboot.c | 8 ++++++--
    1 file changed, 6 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
    index c4784a052461..b77310833b03 100644
    --- a/arch/x86/boot/compressed/eboot.c
    +++ b/arch/x86/boot/compressed/eboot.c
    @@ -649,6 +649,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
    bool conout_found = false;
    void *dummy = NULL;
    u32 h = handles[i];
    + u32 current_fb_base;

    status = efi_call_early(handle_protocol, h,
    proto, (void **)&gop32);
    @@ -660,7 +661,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
    if (status == EFI_SUCCESS)
    conout_found = true;

    - status = __gop_query32(gop32, &info, &size, &fb_base);
    + status = __gop_query32(gop32, &info, &size, &current_fb_base);
    if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
    /*
    * Systems that use the UEFI Console Splitter may
    @@ -674,6 +675,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
    pixel_format = info->pixel_format;
    pixel_info = info->pixel_information;
    pixels_per_scan_line = info->pixels_per_scan_line;
    + fb_base = current_fb_base;

    /*
    * Once we've found a GOP supporting ConOut,
    @@ -752,6 +754,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
    bool conout_found = false;
    void *dummy = NULL;
    u64 h = handles[i];
    + u32 current_fb_base;

    status = efi_call_early(handle_protocol, h,
    proto, (void **)&gop64);
    @@ -763,7 +766,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
    if (status == EFI_SUCCESS)
    conout_found = true;

    - status = __gop_query64(gop64, &info, &size, &fb_base);
    + status = __gop_query64(gop64, &info, &size, &current_fb_base);
    if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
    /*
    * Systems that use the UEFI Console Splitter may
    @@ -777,6 +780,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
    pixel_format = info->pixel_format;
    pixel_info = info->pixel_information;
    pixels_per_scan_line = info->pixels_per_scan_line;
    + fb_base = current_fb_base;

    /*
    * Once we've found a GOP supporting ConOut,

    \
     
     \ /
      Last update: 2015-11-13 12:01    [W:4.410 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site