Commit 14080973 authored by Linus Walleij's avatar Linus Walleij

drm/pl111: Fix FB depth on IMPD-1 framebuffer

The last argument to the function drm_fbdev_dma_setup() was
changed from desired BPP to desired depth.

In our case the desired depth was 15 but BPP was 16, so we
specified 16 as BPP and we relied on the FB emulation core to
select a format with a suitable depth for the limited bandwidth
and end up with e.g. XRGB1555 like in the past:

[drm] Initialized pl111 1.0.0 20170317 for c1000000.display on minor 0
drm-clcd-pl111 c1000000.display: [drm] requested bpp 16, scaled depth down to 15
drm-clcd-pl111 c1000000.display: enable IM-PD1 CLCD connectors
Console: switching to colour frame buffer device 80x30
drm-clcd-pl111 c1000000.display: [drm] fb0: pl111drmfb frame buffer device

However the current code will fail at that:

[drm] Initialized pl111 1.0.0 20170317 for c1000000.display on minor 0
drm-clcd-pl111 c1000000.display: [drm] bpp/depth value of 16/16 not supported
drm-clcd-pl111 c1000000.display: [drm] No compatible format found
drm-clcd-pl111 c1000000.display: [drm] *ERROR* fbdev: Failed to setup generic emulation (ret=-12)

Fix this by passing the desired depth of 15 for the IM/PD-1 display
instead of 16 to drm_fbdev_dma_setup().

The desired depth is however in turn used for bandwidth limiting
calculations and that was done with a simple / integer division,
whereas we now have to modify that to use DIV_ROUND_UP() so that
we get DIV_ROUND_UP(15, 2) = 2 not 15/2 = 1.

After this the display works again on the Integrator/AP IM/PD-1.

Cc: Emma Anholt <emma@anholt.net>
Cc: stable@vger.kernel.org
Suggested-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Fixes: 37c90d58 ("drm/fb-helper: Fix single-probe color-format selection")
Link: https://lore.kernel.org/dri-devel/20230102112927.26565-1-tzimmermann@suse.de/Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230515092943.1401558-1-linus.walleij@linaro.org
parent 50282fd5
...@@ -53,7 +53,7 @@ pl111_mode_valid(struct drm_simple_display_pipe *pipe, ...@@ -53,7 +53,7 @@ pl111_mode_valid(struct drm_simple_display_pipe *pipe,
{ {
struct drm_device *drm = pipe->crtc.dev; struct drm_device *drm = pipe->crtc.dev;
struct pl111_drm_dev_private *priv = drm->dev_private; struct pl111_drm_dev_private *priv = drm->dev_private;
u32 cpp = priv->variant->fb_bpp / 8; u32 cpp = DIV_ROUND_UP(priv->variant->fb_depth, 8);
u64 bw; u64 bw;
/* /*
......
...@@ -114,7 +114,7 @@ struct drm_minor; ...@@ -114,7 +114,7 @@ struct drm_minor;
* extensions to the control register * extensions to the control register
* @formats: array of supported pixel formats on this variant * @formats: array of supported pixel formats on this variant
* @nformats: the length of the array of supported pixel formats * @nformats: the length of the array of supported pixel formats
* @fb_bpp: desired bits per pixel on the default framebuffer * @fb_depth: desired depth per pixel on the default framebuffer
*/ */
struct pl111_variant_data { struct pl111_variant_data {
const char *name; const char *name;
...@@ -126,7 +126,7 @@ struct pl111_variant_data { ...@@ -126,7 +126,7 @@ struct pl111_variant_data {
bool st_bitmux_control; bool st_bitmux_control;
const u32 *formats; const u32 *formats;
unsigned int nformats; unsigned int nformats;
unsigned int fb_bpp; unsigned int fb_depth;
}; };
struct pl111_drm_dev_private { struct pl111_drm_dev_private {
......
...@@ -308,7 +308,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev, ...@@ -308,7 +308,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
if (ret < 0) if (ret < 0)
goto dev_put; goto dev_put;
drm_fbdev_dma_setup(drm, priv->variant->fb_bpp); drm_fbdev_dma_setup(drm, priv->variant->fb_depth);
return 0; return 0;
...@@ -351,7 +351,7 @@ static const struct pl111_variant_data pl110_variant = { ...@@ -351,7 +351,7 @@ static const struct pl111_variant_data pl110_variant = {
.is_pl110 = true, .is_pl110 = true,
.formats = pl110_pixel_formats, .formats = pl110_pixel_formats,
.nformats = ARRAY_SIZE(pl110_pixel_formats), .nformats = ARRAY_SIZE(pl110_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* RealView, Versatile Express etc use this modern variant */ /* RealView, Versatile Express etc use this modern variant */
...@@ -376,7 +376,7 @@ static const struct pl111_variant_data pl111_variant = { ...@@ -376,7 +376,7 @@ static const struct pl111_variant_data pl111_variant = {
.name = "PL111", .name = "PL111",
.formats = pl111_pixel_formats, .formats = pl111_pixel_formats,
.nformats = ARRAY_SIZE(pl111_pixel_formats), .nformats = ARRAY_SIZE(pl111_pixel_formats),
.fb_bpp = 32, .fb_depth = 32,
}; };
static const u32 pl110_nomadik_pixel_formats[] = { static const u32 pl110_nomadik_pixel_formats[] = {
...@@ -405,7 +405,7 @@ static const struct pl111_variant_data pl110_nomadik_variant = { ...@@ -405,7 +405,7 @@ static const struct pl111_variant_data pl110_nomadik_variant = {
.is_lcdc = true, .is_lcdc = true,
.st_bitmux_control = true, .st_bitmux_control = true,
.broken_vblank = true, .broken_vblank = true,
.fb_bpp = 16, .fb_depth = 16,
}; };
static const struct amba_id pl111_id_table[] = { static const struct amba_id pl111_id_table[] = {
......
...@@ -316,7 +316,7 @@ static const struct pl111_variant_data pl110_integrator = { ...@@ -316,7 +316,7 @@ static const struct pl111_variant_data pl110_integrator = {
.broken_vblank = true, .broken_vblank = true,
.formats = pl110_integrator_pixel_formats, .formats = pl110_integrator_pixel_formats,
.nformats = ARRAY_SIZE(pl110_integrator_pixel_formats), .nformats = ARRAY_SIZE(pl110_integrator_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* /*
...@@ -330,7 +330,7 @@ static const struct pl111_variant_data pl110_impd1 = { ...@@ -330,7 +330,7 @@ static const struct pl111_variant_data pl110_impd1 = {
.broken_vblank = true, .broken_vblank = true,
.formats = pl110_integrator_pixel_formats, .formats = pl110_integrator_pixel_formats,
.nformats = ARRAY_SIZE(pl110_integrator_pixel_formats), .nformats = ARRAY_SIZE(pl110_integrator_pixel_formats),
.fb_bpp = 16, .fb_depth = 15,
}; };
/* /*
...@@ -343,7 +343,7 @@ static const struct pl111_variant_data pl110_versatile = { ...@@ -343,7 +343,7 @@ static const struct pl111_variant_data pl110_versatile = {
.external_bgr = true, .external_bgr = true,
.formats = pl110_versatile_pixel_formats, .formats = pl110_versatile_pixel_formats,
.nformats = ARRAY_SIZE(pl110_versatile_pixel_formats), .nformats = ARRAY_SIZE(pl110_versatile_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* /*
...@@ -355,7 +355,7 @@ static const struct pl111_variant_data pl111_realview = { ...@@ -355,7 +355,7 @@ static const struct pl111_variant_data pl111_realview = {
.name = "PL111 RealView", .name = "PL111 RealView",
.formats = pl111_realview_pixel_formats, .formats = pl111_realview_pixel_formats,
.nformats = ARRAY_SIZE(pl111_realview_pixel_formats), .nformats = ARRAY_SIZE(pl111_realview_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
}; };
/* /*
...@@ -367,7 +367,7 @@ static const struct pl111_variant_data pl111_vexpress = { ...@@ -367,7 +367,7 @@ static const struct pl111_variant_data pl111_vexpress = {
.name = "PL111 Versatile Express", .name = "PL111 Versatile Express",
.formats = pl111_realview_pixel_formats, .formats = pl111_realview_pixel_formats,
.nformats = ARRAY_SIZE(pl111_realview_pixel_formats), .nformats = ARRAY_SIZE(pl111_realview_pixel_formats),
.fb_bpp = 16, .fb_depth = 16,
.broken_clockdivider = true, .broken_clockdivider = true,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment