lkml.org 
[lkml]   [2019]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 262/313] efifb: BGRT: Improve efifb_bgrt_sanity_check
    Date
    From: Hans de Goede <hdegoede@redhat.com>

    commit 51677dfcc17f88ed754143df670ff064eae67f84 upstream.

    For various reasons, at least with x86 EFI firmwares, the xoffset and
    yoffset in the BGRT info are not always reliable.

    Extensive testing has shown that when the info is correct, the
    BGRT image is always exactly centered horizontally (the yoffset variable
    is more variable and not always predictable).

    This commit simplifies / improves the bgrt_sanity_check to simply
    check that the BGRT image is exactly centered horizontally and skips
    (re)drawing it when it is not.

    This fixes the BGRT image sometimes being drawn in the wrong place.

    Cc: stable@vger.kernel.org
    Fixes: 88fe4ceb2447 ("efifb: BGRT: Do not copy the boot graphics for non native resolutions")
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Cc: Peter Jones <pjones@redhat.com>,
    Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190721131918.10115-1-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/video/fbdev/efifb.c | 27 ++++++---------------------
    1 file changed, 6 insertions(+), 21 deletions(-)

    --- a/drivers/video/fbdev/efifb.c
    +++ b/drivers/video/fbdev/efifb.c
    @@ -122,28 +122,13 @@ static void efifb_copy_bmp(u8 *src, u32
    */
    static bool efifb_bgrt_sanity_check(struct screen_info *si, u32 bmp_width)
    {
    - static const int default_resolutions[][2] = {
    - { 800, 600 },
    - { 1024, 768 },
    - { 1280, 1024 },
    - };
    - u32 i, right_margin;
    + /*
    + * All x86 firmwares horizontally center the image (the yoffset
    + * calculations differ between boards, but xoffset is predictable).
    + */
    + u32 expected_xoffset = (si->lfb_width - bmp_width) / 2;

    - for (i = 0; i < ARRAY_SIZE(default_resolutions); i++) {
    - if (default_resolutions[i][0] == si->lfb_width &&
    - default_resolutions[i][1] == si->lfb_height)
    - break;
    - }
    - /* If not a default resolution used for textmode, this should be fine */
    - if (i >= ARRAY_SIZE(default_resolutions))
    - return true;
    -
    - /* If the right margin is 5 times smaller then the left one, reject */
    - right_margin = si->lfb_width - (bgrt_tab.image_offset_x + bmp_width);
    - if (right_margin < (bgrt_tab.image_offset_x / 5))
    - return false;
    -
    - return true;
    + return bgrt_tab.image_offset_x == expected_xoffset;
    }
    #else
    static bool efifb_bgrt_sanity_check(struct screen_info *si, u32 bmp_width)

    \
     
     \ /
      Last update: 2019-10-03 19:08    [W:2.409 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site