Patch "fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     fbdev-vesafb-detect-vga-compatibility-from-screen-in.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e1d2254b288296e8238741fd68a211f3887f7e12
Author: Thomas Zimmermann <tzimmermann@xxxxxxx>
Date:   Mon Jun 17 13:06:27 2024 +0200

    fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes
    
    [ Upstream commit c2bc958b2b03e361f14df99983bc64a39a7323a3 ]
    
    Test the vesa_attributes field in struct screen_info for compatibility
    with VGA hardware. Vesafb currently tests bit 1 in screen_info's
    capabilities field which indicates a 64-bit lfb address and is
    unrelated to VGA compatibility.
    
    Section 4.4 of the Vesa VBE 2.0 specifications defines that bit 5 in
    the mode's attributes field signals VGA compatibility. The mode is
    compatible with VGA hardware if the bit is clear. In that case, the
    driver can access VGA state of the VBE's underlying hardware. The
    vesafb driver uses this feature to program the color LUT in palette
    modes. Without, colors might be incorrect.
    
    The problem got introduced in commit 89ec4c238e7a ("[PATCH] vesafb: Fix
    incorrect logo colors in x86_64"). It incorrectly stores the mode
    attributes in the screen_info's capabilities field and updates vesafb
    accordingly. Later, commit 5e8ddcbe8692 ("Video mode probing support for
    the new x86 setup code") fixed the screen_info, but did not update vesafb.
    Color output still tends to work, because bit 1 in capabilities is
    usually 0.
    
    Besides fixing the bug in vesafb, this commit introduces a helper that
    reads the correct bit from screen_info.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx>
    Fixes: 5e8ddcbe8692 ("Video mode probing support for the new x86 setup code")
    Reviewed-by: Javier Martinez Canillas <javierm@xxxxxxxxxx>
    Cc: <stable@xxxxxxxxxxxxxxx> # v2.6.23+
    Signed-off-by: Helge Deller <deller@xxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/video/fbdev/vesafb.c b/drivers/video/fbdev/vesafb.c
index ea89accbec385..a21581b40256c 100644
--- a/drivers/video/fbdev/vesafb.c
+++ b/drivers/video/fbdev/vesafb.c
@@ -259,7 +259,7 @@ static int vesafb_probe(struct platform_device *dev)
 	if (si->orig_video_isVGA != VIDEO_TYPE_VLFB)
 		return -ENODEV;
 
-	vga_compat = (si->capabilities & 2) ? 0 : 1;
+	vga_compat = !__screen_info_vbe_mode_nonvga(si);
 	vesafb_fix.smem_start = si->lfb_base;
 	vesafb_defined.bits_per_pixel = si->lfb_depth;
 	if (15 == vesafb_defined.bits_per_pixel)
diff --git a/include/linux/screen_info.h b/include/linux/screen_info.h
index 75303c126285a..6a4a3cec4638b 100644
--- a/include/linux/screen_info.h
+++ b/include/linux/screen_info.h
@@ -49,6 +49,16 @@ static inline u64 __screen_info_lfb_size(const struct screen_info *si, unsigned
 	return lfb_size;
 }
 
+static inline bool __screen_info_vbe_mode_nonvga(const struct screen_info *si)
+{
+	/*
+	 * VESA modes typically run on VGA hardware. Set bit 5 signals that this
+	 * is not the case. Drivers can then not make use of VGA resources. See
+	 * Sec 4.4 of the VBE 2.0 spec.
+	 */
+	return si->vesa_attributes & BIT(5);
+}
+
 static inline unsigned int __screen_info_video_type(unsigned int type)
 {
 	switch (type) {




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux