]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
firmware: sysfb: Move bpp-depth calculation into screen_info helper
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 1 Apr 2025 09:37:16 +0000 (11:37 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 7 Apr 2025 09:02:07 +0000 (11:02 +0200)
Move the calculation of the bits per pixels for screen_info into a
helper function. This will make it available to other callers besides
the firmware code.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://lore.kernel.org/r/20250401094056.32904-14-tzimmermann@suse.de
drivers/firmware/sysfb_simplefb.c
drivers/video/screen_info_generic.c
include/linux/screen_info.h

index 75a186bf8f8ec20ba19e864b05082832aa850d18..592d8a6446192dbe96f7aefc25123aad1d17b999 100644 (file)
@@ -35,36 +35,7 @@ __init bool sysfb_parse_mode(const struct screen_info *si,
        if (type != VIDEO_TYPE_VLFB && type != VIDEO_TYPE_EFI)
                return false;
 
-       /*
-        * The meaning of depth and bpp for direct-color formats is
-        * inconsistent:
-        *
-        *  - DRM format info specifies depth as the number of color
-        *    bits; including alpha, but not including filler bits.
-        *  - Linux' EFI platform code computes lfb_depth from the
-        *    individual color channels, including the reserved bits.
-        *  - VBE 1.1 defines lfb_depth for XRGB1555 as 16, but later
-        *    versions use 15.
-        *  - On the kernel command line, 'bpp' of 32 is usually
-        *    XRGB8888 including the filler bits, but 15 is XRGB1555
-        *    not including the filler bit.
-        *
-        * It's not easily possible to fix this in struct screen_info,
-        * as this could break UAPI. The best solution is to compute
-        * bits_per_pixel from the color bits, reserved bits and
-        * reported lfb_depth, whichever is highest.  In the loop below,
-        * ignore simplefb formats with alpha bits, as EFI and VESA
-        * don't specify alpha channels.
-        */
-       if (si->lfb_depth > 8) {
-               bits_per_pixel = max(max3(si->red_size + si->red_pos,
-                                         si->green_size + si->green_pos,
-                                         si->blue_size + si->blue_pos),
-                                    si->rsvd_size + si->rsvd_pos);
-               bits_per_pixel = max_t(u32, bits_per_pixel, si->lfb_depth);
-       } else {
-               bits_per_pixel = si->lfb_depth;
-       }
+       bits_per_pixel = __screen_info_lfb_bits_per_pixel(si);
 
        for (i = 0; i < ARRAY_SIZE(formats); ++i) {
                const struct simplefb_format *f = &formats[i];
index 64117c6367abbeff11065e40b9ce20c5f9f707e2..900e9386ecebdb92a5a8dd9190156529fa68f9c2 100644 (file)
@@ -144,3 +144,39 @@ ssize_t screen_info_resources(const struct screen_info *si, struct resource *r,
        return pos - r;
 }
 EXPORT_SYMBOL(screen_info_resources);
+
+/*
+ * The meaning of depth and bpp for direct-color formats is
+ * inconsistent:
+ *
+ *  - DRM format info specifies depth as the number of color
+ *    bits; including alpha, but not including filler bits.
+ *  - Linux' EFI platform code computes lfb_depth from the
+ *    individual color channels, including the reserved bits.
+ *  - VBE 1.1 defines lfb_depth for XRGB1555 as 16, but later
+ *    versions use 15.
+ *  - On the kernel command line, 'bpp' of 32 is usually
+ *    XRGB8888 including the filler bits, but 15 is XRGB1555
+ *    not including the filler bit.
+ *
+ * It is not easily possible to fix this in struct screen_info,
+ * as this could break UAPI. The best solution is to compute
+ * bits_per_pixel from the color bits, reserved bits and
+ * reported lfb_depth, whichever is highest.
+ */
+
+u32 __screen_info_lfb_bits_per_pixel(const struct screen_info *si)
+{
+       u32 bits_per_pixel = si->lfb_depth;
+
+       if (bits_per_pixel > 8) {
+               bits_per_pixel = max(max3(si->red_size + si->red_pos,
+                                         si->green_size + si->green_pos,
+                                         si->blue_size + si->blue_pos),
+                                    si->rsvd_size + si->rsvd_pos);
+               bits_per_pixel = max_t(u32, bits_per_pixel, si->lfb_depth);
+       }
+
+       return bits_per_pixel;
+}
+EXPORT_SYMBOL(__screen_info_lfb_bits_per_pixel);
index 6a4a3cec4638be31d6a15379185629d1b41c1843..ab3cffbb58b7fb02aaa283cfdd7a6da7dccc9e1b 100644 (file)
@@ -128,6 +128,8 @@ static inline unsigned int screen_info_video_type(const struct screen_info *si)
 
 ssize_t screen_info_resources(const struct screen_info *si, struct resource *r, size_t num);
 
+u32 __screen_info_lfb_bits_per_pixel(const struct screen_info *si);
+
 #if defined(CONFIG_PCI)
 void screen_info_apply_fixups(void);
 struct pci_dev *screen_info_pci_dev(const struct screen_info *si);