The value preferred_bpp in struct intel_fbdev duplicates preferred_bpp
in struct drm_fb_helper. Remove the former.

Instead let intel_fbdev_init_bios() read the framebuffer from the
hardware. Then derive preferred_bpp from its format and initialize
struct drm_fb_helper with the value. The default is 32 (i.e., XRGB8888).

Also removes one of those deprecated references to the cpp field of
struct drm_format_info.

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
---
 drivers/gpu/drm/i915/display/intel_fbdev.c | 29 +++++++++++++++++-----
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c 
b/drivers/gpu/drm/i915/display/intel_fbdev.c
index 49338a547d37..7e935121c445 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -58,7 +58,6 @@ struct intel_fbdev {
        struct intel_framebuffer *fb;
        struct i915_vma *vma;
        unsigned long vma_flags;
-       int preferred_bpp;
 };
 
 static struct intel_fbdev *to_intel_fbdev(struct drm_fb_helper *fb_helper)
@@ -429,7 +428,6 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
                goto out;
        }
 
-       ifbdev->preferred_bpp = fb->base.format->cpp[0] * 8;
        ifbdev->fb = fb;
 
        drm_framebuffer_get(&ifbdev->fb->base);
@@ -460,6 +458,23 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
        return false;
 }
 
+static unsigned int intel_fbdev_color_mode(const struct drm_format_info *info)
+{
+       unsigned int bpp;
+
+       if (!info->depth || info->num_planes != 1 || info->has_alpha || 
info->is_yuv)
+               return 0;
+
+       bpp = drm_format_info_bpp(info, 0);
+
+       switch (bpp) {
+       case 16:
+               return info->depth; // 15 or 16
+       default:
+               return bpp;
+       }
+}
+
 static void intel_fbdev_suspend_worker(struct work_struct *work)
 {
        intel_fbdev_set_suspend(&container_of(work,
@@ -624,6 +639,7 @@ void intel_fbdev_setup(struct drm_i915_private *i915)
 {
        struct drm_device *dev = &i915->drm;
        struct intel_fbdev *ifbdev;
+       unsigned int preferred_bpp = 0;
        int ret;
 
        if (!HAS_DISPLAY(i915))
@@ -632,14 +648,15 @@ void intel_fbdev_setup(struct drm_i915_private *i915)
        ifbdev = kzalloc(sizeof(*ifbdev), GFP_KERNEL);
        if (!ifbdev)
                return;
-       drm_fb_helper_prepare(dev, &ifbdev->helper, 32, &intel_fb_helper_funcs);
 
        i915->display.fbdev.fbdev = ifbdev;
        INIT_WORK(&i915->display.fbdev.suspend_work, 
intel_fbdev_suspend_worker);
        if (intel_fbdev_init_bios(dev, ifbdev))
-               ifbdev->helper.preferred_bpp = ifbdev->preferred_bpp;
-       else
-               ifbdev->preferred_bpp = ifbdev->helper.preferred_bpp;
+               preferred_bpp = intel_fbdev_color_mode(ifbdev->fb->base.format);
+       if (!preferred_bpp)
+               preferred_bpp = 32;
+
+       drm_fb_helper_prepare(dev, &ifbdev->helper, preferred_bpp, 
&intel_fb_helper_funcs);
 
        ret = drm_client_init(dev, &ifbdev->helper.client, "intel-fbdev",
                              &intel_fbdev_client_funcs);
-- 
2.47.1

Reply via email to