]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.12-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 May 2025 10:33:35 +0000 (12:33 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 May 2025 10:33:35 +0000 (12:33 +0200)
added patches:
drm-fbdev-dma-support-struct-drm_driver.fbdev_probe.patch
drm-panel-mipi-dbi-run-drm-default-client-setup.patch
drm-tiny-panel-mipi-dbi-use-drm_client_setup_with_fourcc.patch

queue-6.12/drm-fbdev-dma-support-struct-drm_driver.fbdev_probe.patch [new file with mode: 0644]
queue-6.12/drm-panel-mipi-dbi-run-drm-default-client-setup.patch [new file with mode: 0644]
queue-6.12/drm-tiny-panel-mipi-dbi-use-drm_client_setup_with_fourcc.patch [new file with mode: 0644]
queue-6.12/series

diff --git a/queue-6.12/drm-fbdev-dma-support-struct-drm_driver.fbdev_probe.patch b/queue-6.12/drm-fbdev-dma-support-struct-drm_driver.fbdev_probe.patch
new file mode 100644 (file)
index 0000000..cb8a678
--- /dev/null
@@ -0,0 +1,140 @@
+From stable+bounces-144883-greg=kroah.com@vger.kernel.org Mon May 19 18:34:21 2025
+From: Fabio Estevam <festevam@gmail.com>
+Date: Mon, 19 May 2025 13:32:28 -0300
+Subject: drm/fbdev-dma: Support struct drm_driver.fbdev_probe
+To: stable@vger.kernel.org
+Cc: tzimmermann@suse.de, javierm@redhat.com, gregkh@linuxfoundation.org, Fabio Estevam <festevam@denx.de>
+Message-ID: <20250519163230.1303438-1-festevam@gmail.com>
+
+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>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/drm_fbdev_dma.c |   60 ++++++++++++++++++++++++----------------
+ include/drm/drm_fbdev_dma.h     |   12 ++++++++
+ 2 files changed, 48 insertions(+), 24 deletions(-)
+
+--- a/drivers/gpu/drm/drm_fbdev_dma.c
++++ b/drivers/gpu/drm/drm_fbdev_dma.c
+@@ -106,6 +106,40 @@ static const struct fb_ops drm_fbdev_dma
+ 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;
+       bool use_deferred_io = false;
+@@ -148,6 +182,7 @@ static int drm_fbdev_dma_helper_fb_probe
+               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 @@ err_drm_client_buffer_delete:
+       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
+--- 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
diff --git a/queue-6.12/drm-panel-mipi-dbi-run-drm-default-client-setup.patch b/queue-6.12/drm-panel-mipi-dbi-run-drm-default-client-setup.patch
new file mode 100644 (file)
index 0000000..c28804d
--- /dev/null
@@ -0,0 +1,67 @@
+From stable+bounces-144884-greg=kroah.com@vger.kernel.org Mon May 19 18:34:15 2025
+From: Fabio Estevam <festevam@gmail.com>
+Date: Mon, 19 May 2025 13:32:29 -0300
+Subject: drm/panel-mipi-dbi: Run DRM default client setup
+To: stable@vger.kernel.org
+Cc: tzimmermann@suse.de, javierm@redhat.com, gregkh@linuxfoundation.org, "Noralf Trønnes" <noralf@tronnes.org>, "Fabio Estevam" <festevam@denx.de>
+Message-ID: <20250519163230.1303438-2-festevam@gmail.com>
+
+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>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/tiny/Kconfig          |    1 +
+ drivers/gpu/drm/tiny/panel-mipi-dbi.c |    4 +++-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+--- 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
+--- 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_mip
+       .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(stru
+       spi_set_drvdata(spi, drm);
+-      drm_fbdev_dma_setup(drm, 0);
++      drm_client_setup(drm, NULL);
+       return 0;
+ }
diff --git a/queue-6.12/drm-tiny-panel-mipi-dbi-use-drm_client_setup_with_fourcc.patch b/queue-6.12/drm-tiny-panel-mipi-dbi-use-drm_client_setup_with_fourcc.patch
new file mode 100644 (file)
index 0000000..9f72f7d
--- /dev/null
@@ -0,0 +1,56 @@
+From stable+bounces-144885-greg=kroah.com@vger.kernel.org Mon May 19 18:34:26 2025
+From: Fabio Estevam <festevam@gmail.com>
+Date: Mon, 19 May 2025 13:32:30 -0300
+Subject: drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc()
+To: stable@vger.kernel.org
+Cc: tzimmermann@suse.de, javierm@redhat.com, gregkh@linuxfoundation.org, Fabio Estevam <festevam@denx.de>
+Message-ID: <20250519163230.1303438-3-festevam@gmail.com>
+
+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
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/tiny/panel-mipi-dbi.c |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- 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(stru
+       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;
+ }
index f2514c2d95ab9eb901a0691e88c1f9c633d8de84..8fe5755f20c70fca60cfc44f4cbcec9f0d74fd2a 100644 (file)
@@ -141,3 +141,6 @@ accel-ivpu-refactor-functions-in-ivpu_fw_log.c.patch
 accel-ivpu-fix-fw-log-printing.patch
 iio-light-opt3001-fix-deadlock-due-to-concurrent-flag-access.patch
 bluetooth-btnxpuart-fix-kernel-panic-during-fw-release.patch
+drm-fbdev-dma-support-struct-drm_driver.fbdev_probe.patch
+drm-panel-mipi-dbi-run-drm-default-client-setup.patch
+drm-tiny-panel-mipi-dbi-use-drm_client_setup_with_fourcc.patch