drm/tegra: fb: Force alpha formats
authorThierry Reding <treding@nvidia.com>
Tue, 14 Nov 2017 15:09:30 +0000 (16:09 +0100)
committerThierry Reding <treding@nvidia.com>
Wed, 13 Dec 2017 13:36:39 +0000 (14:36 +0100)
Tegra20 and Tegra30 don't actually support the 24-bit RGB formats that
don't have an alpha component. In order to allow the fbdev emulation to
run on those chips, force the 32-bit RGBA formats.

Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/fb.c

index 406e895d82cc73051276a503aa217250d2fa6cd0..1af4ef9241f1d3d6771669adc42b1bdbe68d62f6 100644 (file)
@@ -253,6 +253,19 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper,
        cmd.height = sizes->surface_height;
        cmd.pitches[0] = round_up(sizes->surface_width * bytes_per_pixel,
                                  tegra->pitch_align);
+
+       /*
+        * Early generations of Tegra (Tegra20 and Tegra30) do not support any
+        * of the X* or *X formats, only their A* or *A equivalents. Force the
+        * legacy framebuffer format to include an alpha component so that the
+        * framebuffer emulation can be supported on all generations.
+        */
+       if (sizes->surface_bpp == 32 && sizes->surface_depth == 24)
+               sizes->surface_depth = 32;
+
+       if (sizes->surface_bpp == 16 && sizes->surface_depth == 15)
+               sizes->surface_depth = 16;
+
        cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
                                                     sizes->surface_depth);