* [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe
@ 2025-05-19 16:32 Fabio Estevam
2025-05-19 16:32 ` [PATCH 6.12.y 2/3] drm/panel-mipi-dbi: Run DRM default client setup Fabio Estevam
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Fabio Estevam @ 2025-05-19 16:32 UTC (permalink / raw)
To: stable; +Cc: tzimmermann, javierm, gregkh, Fabio Estevam
From: Thomas Zimmermann <tzimmermann@suse.de>
commit 8998eedda2539d2528cfebdc7c17eed0ad35b714 upstream.
Rework fbdev probing to support fbdev_probe in struct drm_driver
and reimplement the old fb_probe callback on top of it. Provide an
initializer macro for struct drm_driver that sets the callback
according to the kernel configuration.
This change allows the common fbdev client to run on top of DMA-
based DRM drivers.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-6-tzimmermann@suse.de
Signed-off-by: Fabio Estevam <festevam@denx.de>
---
drivers/gpu/drm/drm_fbdev_dma.c | 60 ++++++++++++++++++++-------------
include/drm/drm_fbdev_dma.h | 12 +++++++
2 files changed, 48 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index 51c2d742d199..7c8287c18e38 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -105,6 +105,40 @@ static const struct fb_ops drm_fbdev_dma_deferred_fb_ops = {
static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
struct drm_fb_helper_surface_size *sizes)
+{
+ return drm_fbdev_dma_driver_fbdev_probe(fb_helper, sizes);
+}
+
+static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
+ struct drm_clip_rect *clip)
+{
+ struct drm_device *dev = helper->dev;
+ int ret;
+
+ /* Call damage handlers only if necessary */
+ if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+ return 0;
+
+ if (helper->fb->funcs->dirty) {
+ ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+ if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
+ .fb_probe = drm_fbdev_dma_helper_fb_probe,
+ .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
+};
+
+/*
+ * struct drm_fb_helper
+ */
+
+int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+ struct drm_fb_helper_surface_size *sizes)
{
struct drm_client_dev *client = &fb_helper->client;
struct drm_device *dev = fb_helper->dev;
@@ -148,6 +182,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
goto err_drm_client_buffer_delete;
}
+ fb_helper->funcs = &drm_fbdev_dma_helper_funcs;
fb_helper->buffer = buffer;
fb_helper->fb = fb;
@@ -211,30 +246,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
drm_client_framebuffer_delete(buffer);
return ret;
}
-
-static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
- struct drm_clip_rect *clip)
-{
- struct drm_device *dev = helper->dev;
- int ret;
-
- /* Call damage handlers only if necessary */
- if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
- return 0;
-
- if (helper->fb->funcs->dirty) {
- ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
- if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
- return ret;
- }
-
- return 0;
-}
-
-static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
- .fb_probe = drm_fbdev_dma_helper_fb_probe,
- .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
-};
+EXPORT_SYMBOL(drm_fbdev_dma_driver_fbdev_probe);
/*
* struct drm_client_funcs
diff --git a/include/drm/drm_fbdev_dma.h b/include/drm/drm_fbdev_dma.h
index 2da7ee784133..6ae4de46497c 100644
--- a/include/drm/drm_fbdev_dma.h
+++ b/include/drm/drm_fbdev_dma.h
@@ -4,12 +4,24 @@
#define DRM_FBDEV_DMA_H
struct drm_device;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
#ifdef CONFIG_DRM_FBDEV_EMULATION
+int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+ struct drm_fb_helper_surface_size *sizes);
+
+#define DRM_FBDEV_DMA_DRIVER_OPS \
+ .fbdev_probe = drm_fbdev_dma_driver_fbdev_probe
+
void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int preferred_bpp);
#else
static inline void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int preferred_bpp)
{ }
+
+#define DRM_FBDEV_DMA_DRIVER_OPS \
+ .fbdev_probe = NULL
+
#endif
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 6.12.y 2/3] drm/panel-mipi-dbi: Run DRM default client setup
2025-05-19 16:32 [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Fabio Estevam
@ 2025-05-19 16:32 ` Fabio Estevam
2025-05-20 8:19 ` Sasha Levin
2025-05-19 16:32 ` [PATCH 6.12.y 3/3] drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc() Fabio Estevam
2025-05-20 7:52 ` [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Sasha Levin
2 siblings, 1 reply; 6+ messages in thread
From: Fabio Estevam @ 2025-05-19 16:32 UTC (permalink / raw)
To: stable; +Cc: tzimmermann, javierm, gregkh, Noralf Trønnes, Fabio Estevam
From: Thomas Zimmermann <tzimmermann@suse.de>
commit 1b0caa5f5ac20bcaf82fc89a5c849b21ce3bfdf6 uptream.
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.
v5:
- select DRM_CLIENT_SELECTION
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-32-tzimmermann@suse.de
Signed-off-by: Fabio Estevam <festevam@denx.de>
---
drivers/gpu/drm/tiny/Kconfig | 1 +
drivers/gpu/drm/tiny/panel-mipi-dbi.c | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/tiny/Kconfig b/drivers/gpu/drm/tiny/Kconfig
index f6889f649bc1..ce17143d47a8 100644
--- a/drivers/gpu/drm/tiny/Kconfig
+++ b/drivers/gpu/drm/tiny/Kconfig
@@ -67,6 +67,7 @@ config DRM_OFDRM
config DRM_PANEL_MIPI_DBI
tristate "DRM support for MIPI DBI compatible panels"
depends on DRM && SPI
+ select DRM_CLIENT_SELECTION
select DRM_KMS_HELPER
select DRM_GEM_DMA_HELPER
select DRM_MIPI_DBI
diff --git a/drivers/gpu/drm/tiny/panel-mipi-dbi.c b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
index f753cdffe6f8..e66729b31bd6 100644
--- a/drivers/gpu/drm/tiny/panel-mipi-dbi.c
+++ b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
@@ -15,6 +15,7 @@
#include <linux/spi/spi.h>
#include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
#include <drm/drm_drv.h>
#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -264,6 +265,7 @@ static const struct drm_driver panel_mipi_dbi_driver = {
.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
.fops = &panel_mipi_dbi_fops,
DRM_GEM_DMA_DRIVER_OPS_VMAP,
+ DRM_FBDEV_DMA_DRIVER_OPS,
.debugfs_init = mipi_dbi_debugfs_init,
.name = "panel-mipi-dbi",
.desc = "MIPI DBI compatible display panel",
@@ -388,7 +390,7 @@ static int panel_mipi_dbi_spi_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_dma_setup(drm, 0);
+ drm_client_setup(drm, NULL);
return 0;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 6.12.y 3/3] drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc()
2025-05-19 16:32 [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Fabio Estevam
2025-05-19 16:32 ` [PATCH 6.12.y 2/3] drm/panel-mipi-dbi: Run DRM default client setup Fabio Estevam
@ 2025-05-19 16:32 ` Fabio Estevam
2025-05-20 8:19 ` Sasha Levin
2025-05-20 7:52 ` [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Sasha Levin
2 siblings, 1 reply; 6+ messages in thread
From: Fabio Estevam @ 2025-05-19 16:32 UTC (permalink / raw)
To: stable; +Cc: tzimmermann, javierm, gregkh, Fabio Estevam
From: Fabio Estevam <festevam@denx.de>
commit 9c1798259b9420f38f1fa1b83e3d864c3eb1a83e upstream.
Since commit 559358282e5b ("drm/fb-helper: Don't use the preferred depth
for the BPP default"), RGB565 displays such as the CFAF240320X no longer
render correctly: colors are distorted and the content is shown twice
horizontally.
This regression is due to the fbdev emulation layer defaulting to 32 bits
per pixel, whereas the display expects 16 bpp (RGB565). As a result, the
framebuffer data is incorrectly interpreted by the panel.
Fix the issue by calling drm_client_setup_with_fourcc() with a format
explicitly selected based on the display's bits-per-pixel value. For 16
bpp, use DRM_FORMAT_RGB565; for other values, fall back to the previous
behavior. This ensures that the allocated framebuffer format matches the
hardware expectations, avoiding color and layout corruption.
Tested on a CFAF240320X display with an RGB565 configuration, confirming
correct colors and layout after applying this patch.
Cc: stable@vger.kernel.org
Fixes: 559358282e5b ("drm/fb-helper: Don't use the preferred depth for the BPP default")
Signed-off-by: Fabio Estevam <festevam@denx.de>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://lore.kernel.org/r/20250417103458.2496790-1-festevam@gmail.com
---
drivers/gpu/drm/tiny/panel-mipi-dbi.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/tiny/panel-mipi-dbi.c b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
index e66729b31bd6..ac159e8127d5 100644
--- a/drivers/gpu/drm/tiny/panel-mipi-dbi.c
+++ b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
@@ -390,7 +390,10 @@ static int panel_mipi_dbi_spi_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_client_setup(drm, NULL);
+ if (bpp == 16)
+ drm_client_setup_with_fourcc(drm, DRM_FORMAT_RGB565);
+ else
+ drm_client_setup_with_fourcc(drm, DRM_FORMAT_RGB888);
return 0;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe
2025-05-19 16:32 [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Fabio Estevam
2025-05-19 16:32 ` [PATCH 6.12.y 2/3] drm/panel-mipi-dbi: Run DRM default client setup Fabio Estevam
2025-05-19 16:32 ` [PATCH 6.12.y 3/3] drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc() Fabio Estevam
@ 2025-05-20 7:52 ` Sasha Levin
2 siblings, 0 replies; 6+ messages in thread
From: Sasha Levin @ 2025-05-20 7:52 UTC (permalink / raw)
To: stable; +Cc: Fabio Estevam, Sasha Levin
[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected.
No action required from the submitter.
The upstream commit SHA1 provided is correct: 8998eedda2539d2528cfebdc7c17eed0ad35b714
WARNING: Author mismatch between patch and upstream commit:
Backport author: Fabio Estevam<festevam@gmail.com>
Commit author: Thomas Zimmermann<tzimmermann@suse.de>
Status in newer kernel trees:
6.14.y | Present (exact SHA1)
Note: The patch differs from the upstream commit:
---
1: 8998eedda2539 ! 1: 97d835de614c2 drm/fbdev-dma: Support struct drm_driver.fbdev_probe
@@ Metadata
## Commit message ##
drm/fbdev-dma: Support struct drm_driver.fbdev_probe
+ commit 8998eedda2539d2528cfebdc7c17eed0ad35b714 upstream.
+
Rework fbdev probing to support fbdev_probe in struct drm_driver
and reimplement the old fb_probe callback on top of it. Provide an
initializer macro for struct drm_driver that sets the callback
@@ Commit message
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-6-tzimmermann@suse.de
+ Signed-off-by: Fabio Estevam <festevam@denx.de>
## drivers/gpu/drm/drm_fbdev_dma.c ##
@@ drivers/gpu/drm/drm_fbdev_dma.c: static const struct fb_ops drm_fbdev_dma_deferred_fb_ops = {
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-6.12.y | Success | Success |
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 6.12.y 3/3] drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc()
2025-05-19 16:32 ` [PATCH 6.12.y 3/3] drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc() Fabio Estevam
@ 2025-05-20 8:19 ` Sasha Levin
0 siblings, 0 replies; 6+ messages in thread
From: Sasha Levin @ 2025-05-20 8:19 UTC (permalink / raw)
To: stable; +Cc: Fabio Estevam, Sasha Levin
[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected.
No action required from the submitter.
The upstream commit SHA1 provided is correct: 9c1798259b9420f38f1fa1b83e3d864c3eb1a83e
WARNING: Author mismatch between patch and upstream commit:
Backport author: Fabio Estevam<festevam@gmail.com>
Commit author: Fabio Estevam<festevam@denx.de>
Status in newer kernel trees:
6.14.y | Present (different SHA1: 4571715e9ba2)
Note: The patch differs from the upstream commit:
---
1: 9c1798259b942 ! 1: 3a93697d602a5 drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc()
@@ Metadata
## Commit message ##
drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc()
+ commit 9c1798259b9420f38f1fa1b83e3d864c3eb1a83e upstream.
+
Since commit 559358282e5b ("drm/fb-helper: Don't use the preferred depth
for the BPP default"), RGB565 displays such as the CFAF240320X no longer
render correctly: colors are distorted and the content is shown twice
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-6.14.y | Success | Success |
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 6.12.y 2/3] drm/panel-mipi-dbi: Run DRM default client setup
2025-05-19 16:32 ` [PATCH 6.12.y 2/3] drm/panel-mipi-dbi: Run DRM default client setup Fabio Estevam
@ 2025-05-20 8:19 ` Sasha Levin
0 siblings, 0 replies; 6+ messages in thread
From: Sasha Levin @ 2025-05-20 8:19 UTC (permalink / raw)
To: stable, festevam; +Cc: Sasha Levin
[ Sasha's backport helper bot ]
Hi,
Summary of potential issues:
ℹ️ This is part 2/3 of a series
⚠️ Found matching upstream commit but patch is missing proper reference to it
Found matching upstream commit: 1b0caa5f5ac20bcaf82fc89a5c849b21ce3bfdf6
WARNING: Author mismatch between patch and found commit:
Backport author: Fabio Estevam<festevam@gmail.com>
Commit author: Thomas Zimmermann<tzimmermann@suse.de>
Status in newer kernel trees:
6.14.y | Present (exact SHA1)
Note: The patch differs from the upstream commit:
---
1: 1b0caa5f5ac20 ! 1: bb5f954861543 drm/panel-mipi-dbi: Run DRM default client setup
@@ Metadata
## Commit message ##
drm/panel-mipi-dbi: Run DRM default client setup
+ commit 1b0caa5f5ac20bcaf82fc89a5c849b21ce3bfdf6 uptream.
+
Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.
@@ Commit message
Cc: "Noralf Trønnes" <noralf@tronnes.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-32-tzimmermann@suse.de
+ Signed-off-by: Fabio Estevam <festevam@denx.de>
## drivers/gpu/drm/tiny/Kconfig ##
@@ drivers/gpu/drm/tiny/Kconfig: config DRM_OFDRM
---
NOTE: These results are for this patch alone. Full series testing will be
performed when all parts are received.
Results of testing on various branches:
| Branch | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-6.14.y | Success | Success |
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-05-20 8:19 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-19 16:32 [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Fabio Estevam
2025-05-19 16:32 ` [PATCH 6.12.y 2/3] drm/panel-mipi-dbi: Run DRM default client setup Fabio Estevam
2025-05-20 8:19 ` Sasha Levin
2025-05-19 16:32 ` [PATCH 6.12.y 3/3] drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc() Fabio Estevam
2025-05-20 8:19 ` Sasha Levin
2025-05-20 7:52 ` [PATCH 6.12.y 1/3] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Sasha Levin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox