Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/86] drm: Provide client setup helper and convert drivers
@ 2024-08-16 12:22 Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper Thomas Zimmermann
                   ` (88 more replies)
  0 siblings, 89 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

Provide drm_client_setup() to initialize in-kernel DRM clients. Then
convert all drivers to the new interface. Remove old interfaces for
the fbdev client.

So far, the only supported DRM client in the kernel is for fbdev
emulation with its fbcon support. Long term, we want to move away
from fbcon. Possible replacements are DRM-based loggers, boot-up
logos or maybe even a console. The exact kind of client should be
configurable by the user. You can find examples of such clients at
[1] and [2].

To do this, we need one single interface for drivers to initialize
the configured in-kernel clients, replacing the current call to
initialize fbdev emulation. The fbdev emulation also depends on the
DRM driver's management, so drivers differ in what fbdev code they
run. We need to abstract this as well.

This patchset addresses these topics. While there are many patches,
most of them are small, straight-forward changes to drivers or
rearrange existing code.

Patches 1 to 3 add a driver-neutral setup function for the fbdev
client. The new callback fbdev_probe in struct drm_driver creates
the GEM buffer for fbdev output. It replaces the existing callback
fb_probe from struct drm_fb_helper_funcs, which currently does the
same. The client code is equal to code in exisisting fbdev emulation,
except for its use of fbdev_probe.

Patch 4 adds drm_client_setup(), a client-agnostic interface to
initialize the in-kernel DRM clients. It only supports the new fbdev
emulation setup, but additional clients will be added here. Hopefully
this will hide future changes to DRM client initialization from
drivers.

Patches 5 to 49 rework all drivers with GEM memory management based
on DMA helpers. This is fairly straigh-forward. The fbdev-dma helpers
provide an implementation of the fbdev_probe helpers. Each driver
sets the new callback in its instance of struct drm_driver and calls
drm_client_setup(). Then the old fbdev-dma client goes away.

Patches 50 to 63 do the same for drivers with SHMEM-based GEM memory
management. The fbdev client code is again the same as before, except
for the fbdev_probe callback.

Patches 64 to 73 do the same for drivers with TTM-based GEM memory
management.

Patches 74 to 85 do the same for the remaining drivers with custom
fbdev emulation. As before, the new fbdev client code is mostly the
same the old one; except for the fbdev_probe function. The changes
for i915/xe and omapdrm are a bit mor einvolved, but nothing too
complicated.

Patch 86 removes the obsolete fb_probe callback from struct
drm_fb_helper_funcs.

This patchset has been tested on various hardware with the various
memory managers involved.

[1] https://lore.kernel.org/dri-devel/20240801100640.462606-4-jfalempe@redhat.com/
[2] https://lists.freedesktop.org/archives/dri-devel/2019-March/212113.html

Thomas Zimmermann (86):
  drm/fbdev-helper: Move color-mode lookup into 4CC format helper
  drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info
  drm/fbdev: Add memory-agnostic fbdev client
  drm: Add client-agnostic setup helper
  drm/fbdev-dma: Support struct drm_driver.fbdev_probe
  drm/arcgpu: Run DRM default client setup
  drm/arm/komeda: Run DRM default client setup
  drm/arm/hdlcd: Run DRM default client setup
  drm/arm/malidp: Run DRM default client setup
  drm/aspeed: Run DRM default client setup
  drm/atmel-hdlcd: Run DRM default client setup
  drm/fsl-dcu: Run DRM default client setup
  drm/hisilicon/kirin: Run DRM default client setup
  drm/hx8357d: Run DRM default client setup
  drm/ili9163: Run DRM default client setup
  drm/ili9225: Run DRM default client setup
  drm/ili9341: Run DRM default client setup
  drm/ili9486: Run DRM default client setup
  drm/imx/dcss: Run DRM default client setup
  drm/imx/ipuv3: Run DRM default client setup
  drm/imx/lcdc: Run DRM default client setup
  drm/ingenic: Run DRM default client setup
  drm/kmb: Run DRM default client setup
  drm/logicvc: Run DRM default client setup
  drm/mcde: Run DRM default client setup
  drm/mediatek: Run DRM default client setup
  drm/meson: Run DRM default client setup
  drm/mi0283qt: Run DRM default client setup
  drm/mxsfb/lcdif: Run DRM default client setup
  drm/msxfb: Run DRM default client setup
  drm/panel/ili9341: Run DRM default client setup
  drm/panel-mipi-dbi: Run DRM default client setup
  drm/pl111: Run DRM default client setup
  drm/renesas/rcar-du: Run DRM default client setup
  drm/renesas/rz-du: Run DRM default client setup
  drm/renesas/shmobile: Run DRM default client setup
  drm/repaper: Run DRM default client setup
  drm/rockchip: Run DRM default client setup
  drm/sti: Run DRM default client setup
  drm/stm: Run DRM default client setup
  drm/sun4i: Run DRM default client setup
  drm/tidss: Run DRM default client setup
  drm/tilcdc: Run DRM default client setup
  drm/st7586: Run DRM default client setup
  drm/st7735r: Run DRM default client setup
  drm/tve200: Run DRM default client setup
  drm/vc4: Run DRM default client setup
  drm/xlnx: Run DRM default client setup
  drm/fbdev-dma: Remove obsolete setup function
  drm/fbdev-shmem: Support struct drm_driver.fbdev_probe
  drm/ast: Run DRM default client setup
  drm/cirrus: Run DRM default client setup
  drm/gm12u320: Run DRM default client setup
  drm/gud: Run DRM default client setup
  drm/hyperv_drm: Run DRM default client setup
  drm/mgag200: Run DRM default client setup
  drm/ofdrm: Use DRM default client setup
  drm/simpledrm: Run DRM default client setup
  drm/solomon: Run DRM default client setup
  drm/udl: Run DRM default client setup
  drm/virtgpu: Run DRM default client setup
  drm/vkms: Run DRM default client setup
  drm/fbdev-shmem: Remove obsolete setup function
  drm/fbdev-ttm: Support struct drm_driver.fbdev_probe
  drm/amdgpu: Run DRM default client setup
  drm/bochs: Run DRM default client setup
  drm/hisilicon/hibmc: Run DRM default client setup
  drm/loongson: Run DRM default client setup
  drm/nouveau: Run DRM default client setup
  drm/qxl: Run DRM default client setup
  drm/vboxvideo: Run DRM default client setup
  drm/vmwgfx: Run DRM default client setup
  drm/fbdev-ttm: Remove obsolete setup function
  drm/armada: Run DRM default client setup
  drm/exynos-drm: Run DRM default client setup
  drm/gma500: Run DRM default client setup
  drm/msm: Run DRM default client setup
  drm/radeon: Run DRM default client setup
  drm/tegra: Run DRM default client setup
  drm/i915: Remove struct drm_fb_helper from struct intel_fbdev
  drm/i915: Move custom restore code into separate callback
  drm/i915: Move custom hotplug code into separate callback
  drm/{i915,xe}: Run DRM default client setup
  drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev.
  drm/omapdrm: Run DRM default client setup
  drm/fb-helper: Remove struct drm_fb_helper.fb_probe

 drivers/gpu/drm/Makefile                      |   5 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c       |   7 +-
 .../gpu/drm/arm/display/komeda/komeda_drv.c   |   4 +-
 .../gpu/drm/arm/display/komeda/komeda_kms.c   |   2 +
 drivers/gpu/drm/arm/hdlcd_drv.c               |   4 +-
 drivers/gpu/drm/arm/malidp_drv.c              |   4 +-
 drivers/gpu/drm/armada/armada_drm.h           |  11 +-
 drivers/gpu/drm/armada/armada_drv.c           |   4 +-
 drivers/gpu/drm/armada/armada_fbdev.c         | 115 +-------
 drivers/gpu/drm/aspeed/aspeed_gfx_drv.c       |   3 +-
 drivers/gpu/drm/ast/ast_drv.c                 |   6 +-
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c  |   4 +-
 drivers/gpu/drm/drm_client_setup.c            |  55 ++++
 drivers/gpu/drm/drm_fb_helper.c               | 109 +++-----
 drivers/gpu/drm/drm_fbdev_client.c            | 132 +++++++++
 drivers/gpu/drm/drm_fbdev_dma.c               | 170 +++--------
 drivers/gpu/drm/drm_fbdev_shmem.c             | 170 +++--------
 drivers/gpu/drm/drm_fbdev_ttm.c               | 225 ++++-----------
 drivers/gpu/drm/drm_fourcc.c                  |  30 +-
 drivers/gpu/drm/exynos/exynos_drm_drv.c       |   4 +-
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c     | 101 +------
 drivers/gpu/drm/exynos/exynos_drm_fbdev.h     |  15 +-
 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c     |   4 +-
 drivers/gpu/drm/gma500/fbdev.c                | 100 +------
 drivers/gpu/drm/gma500/psb_drv.c              |   4 +-
 drivers/gpu/drm/gma500/psb_drv.h              |  12 +-
 drivers/gpu/drm/gud/gud_drv.c                 |   4 +-
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c   |   4 +-
 .../gpu/drm/hisilicon/kirin/kirin_drm_ade.c   |   2 +
 .../gpu/drm/hisilicon/kirin/kirin_drm_drv.c   |   4 +-
 drivers/gpu/drm/hyperv/hyperv_drm_drv.c       |   4 +-
 drivers/gpu/drm/i915/display/intel_fbdev.c    | 263 ++++++------------
 drivers/gpu/drm/i915/display/intel_fbdev.h    |   8 +
 drivers/gpu/drm/i915/i915_driver.c            |   2 +
 drivers/gpu/drm/imx/dcss/dcss-kms.c           |   4 +-
 drivers/gpu/drm/imx/ipuv3/imx-drm-core.c      |   4 +-
 drivers/gpu/drm/imx/lcdc/imx-lcdc.c           |   4 +-
 drivers/gpu/drm/ingenic/ingenic-drm-drv.c     |   4 +-
 drivers/gpu/drm/kmb/kmb_drv.c                 |   4 +-
 drivers/gpu/drm/logicvc/logicvc_drm.c         |  11 +-
 drivers/gpu/drm/loongson/lsdc_drv.c           |   4 +-
 drivers/gpu/drm/mcde/mcde_drv.c               |   4 +-
 drivers/gpu/drm/mediatek/mtk_drm_drv.c        |   4 +-
 drivers/gpu/drm/meson/meson_drv.c             |   4 +-
 drivers/gpu/drm/mgag200/mgag200_drv.c         |   5 +-
 drivers/gpu/drm/msm/msm_drv.c                 |   4 +-
 drivers/gpu/drm/msm/msm_drv.h                 |  13 +-
 drivers/gpu/drm/msm/msm_fbdev.c               | 144 ++--------
 drivers/gpu/drm/mxsfb/lcdif_drv.c             |   4 +-
 drivers/gpu/drm/mxsfb/mxsfb_drv.c             |   4 +-
 drivers/gpu/drm/nouveau/nouveau_drm.c         |   7 +-
 drivers/gpu/drm/omapdrm/omap_drv.c            |   1 +
 drivers/gpu/drm/omapdrm/omap_drv.h            |   3 +
 drivers/gpu/drm/omapdrm/omap_fbdev.c          | 161 +++--------
 drivers/gpu/drm/omapdrm/omap_fbdev.h          |   8 +
 drivers/gpu/drm/panel/panel-ilitek-ili9341.c  |   4 +-
 drivers/gpu/drm/pl111/pl111_drv.c             |   4 +-
 drivers/gpu/drm/qxl/qxl_drv.c                 |   4 +-
 drivers/gpu/drm/radeon/radeon_drv.c           |  13 +-
 drivers/gpu/drm/radeon/radeon_fbdev.c         | 114 +-------
 drivers/gpu/drm/radeon/radeon_mode.h          |  12 +-
 drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c |   4 +-
 drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c  |   4 +-
 .../gpu/drm/renesas/shmobile/shmob_drm_drv.c  |   5 +-
 drivers/gpu/drm/rockchip/rockchip_drm_drv.c   |   4 +-
 drivers/gpu/drm/solomon/ssd130x.c             |   4 +-
 drivers/gpu/drm/sti/sti_drv.c                 |   4 +-
 drivers/gpu/drm/stm/drv.c                     |   5 +-
 drivers/gpu/drm/sun4i/sun4i_drv.c             |   4 +-
 drivers/gpu/drm/tegra/drm.c                   |   5 +-
 drivers/gpu/drm/tegra/drm.h                   |  12 +-
 drivers/gpu/drm/tegra/fbdev.c                 |  98 +------
 drivers/gpu/drm/tidss/tidss_drv.c             |   4 +-
 drivers/gpu/drm/tilcdc/tilcdc_drv.c           |   4 +-
 drivers/gpu/drm/tiny/arcpgu.c                 |   4 +-
 drivers/gpu/drm/tiny/bochs.c                  |   4 +-
 drivers/gpu/drm/tiny/cirrus.c                 |   4 +-
 drivers/gpu/drm/tiny/gm12u320.c               |   4 +-
 drivers/gpu/drm/tiny/hx8357d.c                |   4 +-
 drivers/gpu/drm/tiny/ili9163.c                |   4 +-
 drivers/gpu/drm/tiny/ili9225.c                |   4 +-
 drivers/gpu/drm/tiny/ili9341.c                |   4 +-
 drivers/gpu/drm/tiny/ili9486.c                |   4 +-
 drivers/gpu/drm/tiny/mi0283qt.c               |   4 +-
 drivers/gpu/drm/tiny/ofdrm.c                  |   9 +-
 drivers/gpu/drm/tiny/panel-mipi-dbi.c         |   4 +-
 drivers/gpu/drm/tiny/repaper.c                |   4 +-
 drivers/gpu/drm/tiny/simpledrm.c              |   9 +-
 drivers/gpu/drm/tiny/st7586.c                 |   4 +-
 drivers/gpu/drm/tiny/st7735r.c                |   4 +-
 drivers/gpu/drm/tve200/tve200_drv.c           |   9 +-
 drivers/gpu/drm/udl/udl_drv.c                 |   4 +-
 drivers/gpu/drm/vboxvideo/vbox_drv.c          |   4 +-
 drivers/gpu/drm/vc4/vc4_drv.c                 |   5 +-
 drivers/gpu/drm/virtio/virtgpu_drv.c          |   6 +-
 drivers/gpu/drm/vkms/vkms_drv.c               |   4 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c           |   5 +-
 drivers/gpu/drm/xe/xe_device.c                |   3 +
 drivers/gpu/drm/xlnx/zynqmp_kms.c             |   4 +-
 include/drm/drm_client_setup.h                |  12 +
 include/drm/drm_drv.h                         |  18 ++
 include/drm/drm_fb_helper.h                   |  43 +--
 include/drm/drm_fbdev_client.h                |  19 ++
 include/drm/drm_fbdev_dma.h                   |  13 +-
 include/drm/drm_fbdev_shmem.h                 |  13 +-
 include/drm/drm_fbdev_ttm.h                   |  15 +-
 include/drm/drm_fourcc.h                      |   1 +
 107 files changed, 994 insertions(+), 1558 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_client_setup.c
 create mode 100644 drivers/gpu/drm/drm_fbdev_client.c
 create mode 100644 include/drm/drm_client_setup.h
 create mode 100644 include/drm/drm_fbdev_client.h


base-commit: 70d6d55dea574b7b78ccf714699cc5d8d62fcc2c
-- 
2.46.0


^ permalink raw reply	[flat|nested] 131+ messages in thread

* [PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-18 19:22   ` Laurent Pinchart
  2024-08-16 12:22 ` [PATCH 02/86] drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info Thomas Zimmermann
                   ` (87 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

The color mode specified on the kernel command line gives the user's
preferred color depth and number of bits per pixel. Move the
color-mode-to-format conversion form fbdev helpers into a 4CC helper,
so that is can be shared among DRM clients.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fb_helper.c | 70 +++++++--------------------------
 drivers/gpu/drm/drm_fourcc.c    | 30 +++++++++++++-
 include/drm/drm_fourcc.h        |  1 +
 3 files changed, 45 insertions(+), 56 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 29c53f9f449c..af1fe79c701d 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1441,67 +1441,27 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
 EXPORT_SYMBOL(drm_fb_helper_pan_display);
 
 static uint32_t drm_fb_helper_find_format(struct drm_fb_helper *fb_helper, const uint32_t *formats,
-					  size_t format_count, uint32_t bpp, uint32_t depth)
+					  size_t format_count, unsigned int color_mode)
 {
 	struct drm_device *dev = fb_helper->dev;
 	uint32_t format;
 	size_t i;
 
-	/*
-	 * Do not consider YUV or other complicated formats
-	 * for framebuffers. This means only legacy formats
-	 * are supported (fmt->depth is a legacy field), but
-	 * the framebuffer emulation can only deal with such
-	 * formats, specifically RGB/BGA formats.
-	 */
-	format = drm_mode_legacy_fb_format(bpp, depth);
-	if (!format)
-		goto err;
+	format = drm_driver_color_mode_format(dev, color_mode);
+	if (!format) {
+		drm_info(dev, "unsupported color mode of %d\n", color_mode);
+		return DRM_FORMAT_INVALID;
+	}
 
 	for (i = 0; i < format_count; ++i) {
 		if (formats[i] == format)
 			return format;
 	}
-
-err:
-	/* We found nothing. */
-	drm_warn(dev, "bpp/depth value of %u/%u not supported\n", bpp, depth);
+	drm_warn(dev, "format %p4cc not supported\n", &format);
 
 	return DRM_FORMAT_INVALID;
 }
 
-static uint32_t drm_fb_helper_find_color_mode_format(struct drm_fb_helper *fb_helper,
-						     const uint32_t *formats, size_t format_count,
-						     unsigned int color_mode)
-{
-	struct drm_device *dev = fb_helper->dev;
-	uint32_t bpp, depth;
-
-	switch (color_mode) {
-	case 1:
-	case 2:
-	case 4:
-	case 8:
-	case 16:
-	case 24:
-		bpp = depth = color_mode;
-		break;
-	case 15:
-		bpp = 16;
-		depth = 15;
-		break;
-	case 32:
-		bpp = 32;
-		depth = 24;
-		break;
-	default:
-		drm_info(dev, "unsupported color mode of %d\n", color_mode);
-		return DRM_FORMAT_INVALID;
-	}
-
-	return drm_fb_helper_find_format(fb_helper, formats, format_count, bpp, depth);
-}
-
 static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
 				      struct drm_fb_helper_surface_size *sizes)
 {
@@ -1531,10 +1491,10 @@ static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
 			if (!cmdline_mode->bpp_specified)
 				continue;
 
-			surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
-									      plane->format_types,
-									      plane->format_count,
-									      cmdline_mode->bpp);
+			surface_format = drm_fb_helper_find_format(fb_helper,
+								   plane->format_types,
+								   plane->format_count,
+								   cmdline_mode->bpp);
 			if (surface_format != DRM_FORMAT_INVALID)
 				break; /* found supported format */
 		}
@@ -1544,10 +1504,10 @@ static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
 			break; /* found supported format */
 
 		/* try preferred color mode */
-		surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
-								      plane->format_types,
-								      plane->format_count,
-								      fb_helper->preferred_bpp);
+		surface_format = drm_fb_helper_find_format(fb_helper,
+							   plane->format_types,
+							   plane->format_count,
+							   fb_helper->preferred_bpp);
 		if (surface_format != DRM_FORMAT_INVALID)
 			break; /* found supported format */
 	}
diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
index 193cf8ed7912..3a94ca211f9c 100644
--- a/drivers/gpu/drm/drm_fourcc.c
+++ b/drivers/gpu/drm/drm_fourcc.c
@@ -36,7 +36,6 @@
  * @depth: bit depth per pixel
  *
  * Computes a drm fourcc pixel format code for the given @bpp/@depth values.
- * Useful in fbdev emulation code, since that deals in those values.
  */
 uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
 {
@@ -140,6 +139,35 @@ uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_driver_legacy_fb_format);
 
+/**
+ * drm_driver_color_mode_format - Compute DRM 4CC code from color mode
+ * @dev: DRM device
+ * @color_mode: command-line color mode
+ *
+ * Computes a DRM 4CC pixel format code for the given color mode using
+ * drm_driver_color_mode(). The color mode is in the format used and the
+ * kernel command line. It specifies the number of bits per pixel
+ * and color depth in a single value.
+ *
+ * Useful in fbdev emulation code, since that deals in those values. The
+ * helper does not consider YUV or other complicated formats. This means
+ * only legacy formats are supported (fmt->depth is a legacy field), but
+ * the framebuffer emulation can only deal with such formats, specifically
+ * RGB/BGA formats.
+ */
+uint32_t drm_driver_color_mode_format(struct drm_device *dev, unsigned int color_mode)
+{
+	switch (color_mode) {
+	case 15:
+		return drm_driver_legacy_fb_format(dev, 16, 15);
+	case 32:
+		return drm_driver_legacy_fb_format(dev, 32, 24);
+	default:
+		return drm_driver_legacy_fb_format(dev, color_mode, color_mode);
+	}
+}
+EXPORT_SYMBOL(drm_driver_color_mode_format);
+
 /*
  * Internal function to query information for a given format. See
  * drm_format_info() for the public API.
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
index ccf91daa4307..c3f4405d6662 100644
--- a/include/drm/drm_fourcc.h
+++ b/include/drm/drm_fourcc.h
@@ -313,6 +313,7 @@ drm_get_format_info(struct drm_device *dev,
 uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
 uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
 				     uint32_t bpp, uint32_t depth);
+uint32_t drm_driver_color_mode_format(struct drm_device *dev, unsigned int color_mode);
 unsigned int drm_format_info_block_width(const struct drm_format_info *info,
 					 int plane);
 unsigned int drm_format_info_block_height(const struct drm_format_info *info,
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 02/86] drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 03/86] drm/fbdev: Add memory-agnostic fbdev client Thomas Zimmermann
                   ` (86 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

Call vga_switcheroo_client_fb_set() with the PCI device from the
instance of struct fb_info. All fbdev clients now run these calls.
For non-PCI devices or drivers without vga-switcheroo, this does
nothing. For i915 and radeon, it allows these drivers to use a
common fbdev client.

The device is the same as the one stored in struct drm_client and
struct drm_fb_helper, so there is no difference in behavior. Some
NULL-pointer checks are being removed, where those pointers cannot
be NULL.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fb_helper.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index af1fe79c701d..13095d38aa42 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -562,8 +562,12 @@ EXPORT_SYMBOL(drm_fb_helper_release_info);
  */
 void drm_fb_helper_unregister_info(struct drm_fb_helper *fb_helper)
 {
-	if (fb_helper && fb_helper->info)
-		unregister_framebuffer(fb_helper->info);
+	struct fb_info *info = fb_helper->info;
+	struct device *dev = info->device;
+
+	if (dev_is_pci(dev))
+		vga_switcheroo_client_fb_set(to_pci_dev(dev), NULL);
+	unregister_framebuffer(fb_helper->info);
 }
 EXPORT_SYMBOL(drm_fb_helper_unregister_info);
 
@@ -1615,6 +1619,7 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 	struct drm_client_dev *client = &fb_helper->client;
 	struct drm_device *dev = fb_helper->dev;
 	struct drm_fb_helper_surface_size sizes;
+	struct fb_info *info;
 	int ret;
 
 	ret = drm_fb_helper_find_sizes(fb_helper, &sizes);
@@ -1632,9 +1637,11 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 
 	strcpy(fb_helper->fb->comm, "[fbcon]");
 
+	info = fb_helper->info;
+
 	/* Set the fb info for vgaswitcheroo clients. Does nothing otherwise. */
-	if (dev_is_pci(dev->dev))
-		vga_switcheroo_client_fb_set(to_pci_dev(dev->dev), fb_helper->info);
+	if (dev_is_pci(info->device))
+		vga_switcheroo_client_fb_set(to_pci_dev(info->device), info);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 03/86] drm/fbdev: Add memory-agnostic fbdev client
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 02/86] drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 04/86] drm: Add client-agnostic setup helper Thomas Zimmermann
                   ` (85 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

Add an fbdev client that can work with any memory manager. The
client implementation is ther same as existing code in fbdev-dma or
fbdev-shmem.

Provide struct drm_driver.fbdev_probe for the new client to allocate
the surface GEM buffer. The new callback replaces fb_probe of struct
drm_fb_helper_funcs, which does the same.

To use the new client, DRM drivers set fbdev_probe in their struct
drm_driver instance and call drm_fbdev_client_setup(). Probing and
creating the fbdev surface buffer is now independent from the other
operations in struct drm_fb_helper.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/Makefile           |   4 +-
 drivers/gpu/drm/drm_fb_helper.c    |  15 ++--
 drivers/gpu/drm/drm_fbdev_client.c | 132 +++++++++++++++++++++++++++++
 include/drm/drm_drv.h              |  18 ++++
 include/drm/drm_fbdev_client.h     |  19 +++++
 5 files changed, 181 insertions(+), 7 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_fbdev_client.c
 create mode 100644 include/drm/drm_fbdev_client.h

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 68cc9258ffc4..0beb55d028a8 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -144,7 +144,9 @@ drm_kms_helper-y := \
 	drm_self_refresh_helper.o \
 	drm_simple_kms_helper.o
 drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
-drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
+drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
+	drm_fbdev_client.o \
+	drm_fb_helper.o
 obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
 
 #
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 13095d38aa42..31e255c2b04a 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -492,8 +492,8 @@ EXPORT_SYMBOL(drm_fb_helper_init);
  * @fb_helper: driver-allocated fbdev helper
  *
  * A helper to alloc fb_info and the member cmap. Called by the driver
- * within the fb_probe fb_helper callback function. Drivers do not
- * need to release the allocated fb_info structure themselves, this is
+ * within the struct &drm_driver.fbdev_probe callback function. Drivers do
+ * not need to release the allocated fb_info structure themselves, this is
  * automatically done when calling drm_fb_helper_fini().
  *
  * RETURNS:
@@ -1612,7 +1612,7 @@ static int drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
 
 /*
  * Allocates the backing storage and sets up the fbdev info structure through
- * the ->fb_probe callback.
+ * the ->fbdev_probe callback.
  */
 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 {
@@ -1631,7 +1631,10 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 	}
 
 	/* push down into drivers */
-	ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);
+	if (dev->driver->fbdev_probe)
+		ret = dev->driver->fbdev_probe(fb_helper, &sizes);
+	else
+		ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);
 	if (ret < 0)
 		return ret;
 
@@ -1705,7 +1708,7 @@ static void drm_fb_helper_fill_var(struct fb_info *info,
  * instance and the drm framebuffer allocated in &drm_fb_helper.fb.
  *
  * Drivers should call this (or their equivalent setup code) from their
- * &drm_fb_helper_funcs.fb_probe callback after having allocated the fbdev
+ * &drm_driver.fbdev_probe callback after having allocated the fbdev
  * backing storage framebuffer.
  */
 void drm_fb_helper_fill_info(struct fb_info *info,
@@ -1861,7 +1864,7 @@ __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper)
  * Note that this also registers the fbdev and so allows userspace to call into
  * the driver through the fbdev interfaces.
  *
- * This function will call down into the &drm_fb_helper_funcs.fb_probe callback
+ * This function will call down into the &drm_driver.fbdev_probe callback
  * to let the driver allocate and initialize the fbdev info structure and the
  * drm framebuffer used to back the fbdev. drm_fb_helper_fill_info() is provided
  * as a helper to setup simple default values for the fbdev info structure.
diff --git a/drivers/gpu/drm/drm_fbdev_client.c b/drivers/gpu/drm/drm_fbdev_client.c
new file mode 100644
index 000000000000..5fd07539c382
--- /dev/null
+++ b/drivers/gpu/drm/drm_fbdev_client.c
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: MIT
+
+#include <drm/drm_client.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fbdev_client.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_print.h>
+
+/*
+ * struct drm_client_funcs
+ */
+
+static void drm_fbdev_client_unregister(struct drm_client_dev *client)
+{
+	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+	if (fb_helper->info) {
+		drm_fb_helper_unregister_info(fb_helper);
+	} else {
+		drm_client_release(&fb_helper->client);
+		drm_fb_helper_unprepare(fb_helper);
+		kfree(fb_helper);
+	}
+}
+
+static int drm_fbdev_client_restore(struct drm_client_dev *client)
+{
+	drm_fb_helper_lastclose(client->dev);
+
+	return 0;
+}
+
+static int drm_fbdev_client_hotplug(struct drm_client_dev *client)
+{
+	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+	struct drm_device *dev = client->dev;
+	int ret;
+
+	if (dev->fb_helper)
+		return drm_fb_helper_hotplug_event(dev->fb_helper);
+
+	ret = drm_fb_helper_init(dev, fb_helper);
+	if (ret)
+		goto err_drm_err;
+
+	if (!drm_drv_uses_atomic_modeset(dev))
+		drm_helper_disable_unused_functions(dev);
+
+	ret = drm_fb_helper_initial_config(fb_helper);
+	if (ret)
+		goto err_drm_fb_helper_fini;
+
+	return 0;
+
+err_drm_fb_helper_fini:
+	drm_fb_helper_fini(fb_helper);
+err_drm_err:
+	drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
+	return ret;
+}
+
+static const struct drm_client_funcs drm_fbdev_client_funcs = {
+	.owner		= THIS_MODULE,
+	.unregister	= drm_fbdev_client_unregister,
+	.restore	= drm_fbdev_client_restore,
+	.hotplug	= drm_fbdev_client_hotplug,
+};
+
+/**
+ * drm_fbdev_client_setup() - Setup fbdev emulation
+ * @dev: DRM device
+ * @format: Preferred color format for the device. DRM_FORMAT_XRGB8888
+ *          is used if this is zero.
+ *
+ * This function sets up fbdev emulation. Restore, hotplug events and
+ * teardown are all taken care of. Drivers that do suspend/resume need
+ * to call drm_fb_helper_set_suspend_unlocked() themselves. Simple
+ * drivers might use drm_mode_config_helper_suspend().
+ *
+ * This function is safe to call even when there are no connectors present.
+ * Setup will be retried on the next hotplug event.
+ *
+ * The fbdev client is destroyed by drm_dev_unregister().
+ *
+ * Returns:
+ * 0 on success, or a negative errno code otherwise.
+ */
+int drm_fbdev_client_setup(struct drm_device *dev, const struct drm_format_info *format)
+{
+	struct drm_fb_helper *fb_helper;
+	unsigned int color_mode = 32;
+	int ret;
+
+	/* TODO: Use format info througout DRM */
+	if (format) {
+		unsigned int bpp = drm_format_info_bpp(format, 0);
+
+		switch (bpp) {
+		case 16:
+			color_mode = format->depth; // could also be 15
+			break;
+		default:
+			color_mode = bpp;
+		}
+	}
+
+	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
+	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
+
+	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
+	if (!fb_helper)
+		return -ENOMEM;
+	drm_fb_helper_prepare(dev, fb_helper, color_mode, NULL);
+
+	ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs);
+	if (ret) {
+		drm_err(dev, "Failed to register client: %d\n", ret);
+		goto err_drm_client_init;
+	}
+
+	drm_client_register(&fb_helper->client);
+
+	return 0;
+
+err_drm_client_init:
+	drm_fb_helper_unprepare(fb_helper);
+	kfree(fb_helper);
+	return ret;
+}
+EXPORT_SYMBOL(drm_fbdev_client_setup);
diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
index 02ea4e3248fd..36a606af4ba1 100644
--- a/include/drm/drm_drv.h
+++ b/include/drm/drm_drv.h
@@ -34,6 +34,8 @@
 
 #include <drm/drm_device.h>
 
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 struct drm_file;
 struct drm_gem_object;
 struct drm_master;
@@ -366,6 +368,22 @@ struct drm_driver {
 			       struct drm_device *dev, uint32_t handle,
 			       uint64_t *offset);
 
+	/**
+	 * @fbdev_probe
+	 *
+	 * Allocates and initialize the fb_info structure for fbdev emulation.
+	 * Furthermore it also needs to allocate the DRM framebuffer used to
+	 * back the fbdev.
+	 *
+	 * This callback is mandatory for fbdev support.
+	 *
+	 * Returns:
+	 *
+	 * 0 on success ot a negative error code otherwise.
+	 */
+	int (*fbdev_probe)(struct drm_fb_helper *fbdev_helper,
+			   struct drm_fb_helper_surface_size *sizes);
+
 	/**
 	 * @show_fdinfo:
 	 *
diff --git a/include/drm/drm_fbdev_client.h b/include/drm/drm_fbdev_client.h
new file mode 100644
index 000000000000..e11a5614f127
--- /dev/null
+++ b/include/drm/drm_fbdev_client.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef DRM_FBDEV_CLIENT_H
+#define DRM_FBDEV_CLIENT_H
+
+struct drm_device;
+struct drm_format_info;
+
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+int drm_fbdev_client_setup(struct drm_device *dev, const struct drm_format_info *format);
+#else
+static inline int drm_fbdev_client_setup(struct drm_device *dev,
+					 const struct drm_format_info *format)
+{
+	return 0;
+}
+#endif
+
+#endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 04/86] drm: Add client-agnostic setup helper
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (2 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 03/86] drm/fbdev: Add memory-agnostic fbdev client Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-18 20:07   ` Laurent Pinchart
  2024-08-16 12:22 ` [PATCH 05/86] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Thomas Zimmermann
                   ` (84 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

DRM may support multiple in-kernel clients that run as soon as a DRM
driver has been registered. To select the client(s) in a single place,
introduce drm_client_setup().

Drivers that call the new helper automatically instantiate the kernel's
configured default clients. Only fbdev emulation is currently supported.
Later versions can add support for DRM-based logging, a boot logo or even
a console.

Some drivers handle the color mode for clients internally. Provide the
helper drm_client_setup_with_color_mode() for them.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/Makefile           |  1 +
 drivers/gpu/drm/drm_client_setup.c | 55 ++++++++++++++++++++++++++++++
 include/drm/drm_client_setup.h     | 12 +++++++
 3 files changed, 68 insertions(+)
 create mode 100644 drivers/gpu/drm/drm_client_setup.c
 create mode 100644 include/drm/drm_client_setup.h

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 0beb55d028a8..e7fc77d1d573 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -129,6 +129,7 @@ drm_kms_helper-y := \
 	drm_atomic_helper.o \
 	drm_atomic_state_helper.o \
 	drm_bridge_connector.o \
+	drm_client_setup.o \
 	drm_crtc_helper.o \
 	drm_damage_helper.o \
 	drm_encoder_slave.o \
diff --git a/drivers/gpu/drm/drm_client_setup.c b/drivers/gpu/drm/drm_client_setup.c
new file mode 100644
index 000000000000..2e3315f5c3e2
--- /dev/null
+++ b/drivers/gpu/drm/drm_client_setup.c
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: MIT
+
+#include <drm/drm_client_setup.h>
+#include <drm/drm_device.h>
+#include <drm/drm_fbdev_client.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_print.h>
+
+/**
+ * drm_client_setup() - Setup in-kernel DRM clients
+ * @dev: DRM device
+ * @format: Preferred color format for the device. Use NULL, unless
+ *          there is clearly a driver-preferred format.
+ *
+ * This function sets up the in-kernel DRM clients. Restore, hotplug
+ * events and teardown are all taken care of.
+ *
+ * Drivers should call drm_client_setup() after registering the new
+ * DRM device with drm_dev_register(). This function is safe to call
+ * even when there are no connectors present. Setup will be retried
+ * on the next hotplug event.
+ *
+ * The clients are destroyed by drm_dev_unregister().
+ */
+void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
+{
+	int ret;
+
+	if (!format)
+		format = drm_format_info(DRM_FORMAT_XRGB8888);
+
+	ret = drm_fbdev_client_setup(dev, format);
+	if (ret)
+		drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
+}
+EXPORT_SYMBOL(drm_client_setup);
+
+/**
+ * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
+ * @dev: DRM device
+ * @color_mode: Preferred color mode for the device
+ *
+ * This function sets up the in-kernel DRM clients. It is equivalent
+ * to drm_client_setup(), but expects a color mode as second argument.
+ *
+ * Do not use this function in new drivers. Prefer drm_client_setup() with a
+ * format of NULL.
+ */
+void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
+{
+	uint32_t fmt = drm_driver_color_mode_format(dev, color_mode);
+
+	drm_client_setup(dev, drm_format_info(fmt));
+}
+EXPORT_SYMBOL(drm_client_setup_with_color_mode);
diff --git a/include/drm/drm_client_setup.h b/include/drm/drm_client_setup.h
new file mode 100644
index 000000000000..f5fd1fabd4b1
--- /dev/null
+++ b/include/drm/drm_client_setup.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef DRM_CLIENT_SETUP_H
+#define DRM_CLIENT_SETUP_H
+
+struct drm_device;
+struct drm_format_info;
+
+void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format);
+void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode);
+
+#endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 05/86] drm/fbdev-dma: Support struct drm_driver.fbdev_probe
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (3 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 04/86] drm: Add client-agnostic setup helper Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 06/86] drm/arcgpu: Run DRM default client setup Thomas Zimmermann
                   ` (83 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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>
---
 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 7ef5a48c8029..aeccf7f7a522 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -86,6 +86,40 @@ static const struct fb_ops drm_fbdev_dma_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;
@@ -119,6 +153,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;
 
@@ -165,30 +200,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.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 06/86] drm/arcgpu: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (4 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 05/86] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 07/86] drm/arm/komeda: " Thomas Zimmermann
                   ` (82 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Alexey Brodkin

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Alexey Brodkin <abrodkin@synopsys.com>
---
 drivers/gpu/drm/tiny/arcpgu.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/arcpgu.c b/drivers/gpu/drm/tiny/arcpgu.c
index 4f8f3172379e..5f74b4576522 100644
--- a/drivers/gpu/drm/tiny/arcpgu.c
+++ b/drivers/gpu/drm/tiny/arcpgu.c
@@ -7,6 +7,7 @@
 
 #include <linux/clk.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
@@ -371,6 +372,7 @@ static const struct drm_driver arcpgu_drm_driver = {
 	.patchlevel = 0,
 	.fops = &arcpgu_drm_ops,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 #ifdef CONFIG_DEBUG_FS
 	.debugfs_init = arcpgu_debugfs_init,
 #endif
@@ -394,7 +396,7 @@ static int arcpgu_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_unload;
 
-	drm_fbdev_dma_setup(&arcpgu->drm, 16);
+	drm_client_setup(&arcpgu->drm, drm_format_info(DRM_FORMAT_RGB565));
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 07/86] drm/arm/komeda: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (5 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 06/86] drm/arcgpu: Run DRM default client setup Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 14:15   ` Liviu Dudau
  2024-08-16 12:22 ` [PATCH 08/86] drm/arm/hdlcd: " Thomas Zimmermann
                   ` (81 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Liviu Dudau

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.

The komeda driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Liviu Dudau <liviu.dudau@arm.com>
---
 drivers/gpu/drm/arm/display/komeda/komeda_drv.c | 4 ++--
 drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index 55c3773befde..6d475bb34002 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -9,7 +9,7 @@
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
-#include <drm/drm_fbdev_dma.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_module.h>
 #include <drm/drm_of.h>
 #include "komeda_dev.h"
@@ -84,7 +84,7 @@ static int komeda_platform_probe(struct platform_device *pdev)
 	}
 
 	dev_set_drvdata(dev, mdrv);
-	drm_fbdev_dma_setup(&mdrv->kms->base, 32);
+	drm_client_setup(&mdrv->kms->base, NULL);
 
 	return 0;
 
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
index fe46b0ebefea..f3314261925c 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
@@ -9,6 +9,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_dma.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_managed.h>
@@ -58,6 +59,7 @@ static irqreturn_t komeda_kms_irq_handler(int irq, void *data)
 static const struct drm_driver komeda_kms_driver = {
 	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(komeda_gem_dma_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops = &komeda_cma_fops,
 	.name = "komeda",
 	.desc = "Arm Komeda Display Processor driver",
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 08/86] drm/arm/hdlcd: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (6 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 07/86] drm/arm/komeda: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 14:15   ` Liviu Dudau
  2024-08-16 12:22 ` [PATCH 09/86] drm/arm/malidp: " Thomas Zimmermann
                   ` (80 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Liviu Dudau

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.

The hdlcd driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Liviu Dudau <liviu.dudau@arm.com>
---
 drivers/gpu/drm/arm/hdlcd_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
index 32be9e370049..f5d358f3893b 100644
--- a/drivers/gpu/drm/arm/hdlcd_drv.c
+++ b/drivers/gpu/drm/arm/hdlcd_drv.c
@@ -23,6 +23,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
@@ -228,6 +229,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
 static const struct drm_driver hdlcd_driver = {
 	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops = &fops,
 	.name = "hdlcd",
 	.desc = "ARM HDLCD Controller DRM",
@@ -299,7 +301,7 @@ static int hdlcd_drm_bind(struct device *dev)
 	if (ret)
 		goto err_register;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 09/86] drm/arm/malidp: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (7 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 08/86] drm/arm/hdlcd: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 14:16   ` Liviu Dudau
  2024-08-16 12:22 ` [PATCH 10/86] drm/aspeed: " Thomas Zimmermann
                   ` (79 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Liviu Dudau

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.

The malidp driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Liviu Dudau <liviu.dudau@arm.com>
---
 drivers/gpu/drm/arm/malidp_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/arm/malidp_drv.c b/drivers/gpu/drm/arm/malidp_drv.c
index 6682131d2910..4cb25004b84f 100644
--- a/drivers/gpu/drm/arm/malidp_drv.c
+++ b/drivers/gpu/drm/arm/malidp_drv.c
@@ -18,6 +18,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
@@ -562,6 +563,7 @@ static void malidp_debugfs_init(struct drm_minor *minor)
 static const struct drm_driver malidp_driver = {
 	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(malidp_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 #ifdef CONFIG_DEBUG_FS
 	.debugfs_init = malidp_debugfs_init,
 #endif
@@ -852,7 +854,7 @@ static int malidp_bind(struct device *dev)
 	if (ret)
 		goto register_fail;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 10/86] drm/aspeed: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (8 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 09/86] drm/arm/malidp: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 11/86] drm/atmel-hdlcd: " Thomas Zimmermann
                   ` (78 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Joel Stanley, Andrew Jeffery

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.

The aspeed driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
index a7a6b70220eb..e1efe08fdfad 100644
--- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
+++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
@@ -14,6 +14,7 @@
 #include <linux/reset.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_device.h>
 #include <drm/drm_fbdev_dma.h>
 #include <drm/drm_gem_dma_helper.h>
@@ -339,7 +340,7 @@ static int aspeed_gfx_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_unload;
 
-	drm_fbdev_dma_setup(&priv->drm, 32);
+	drm_client_setup(&priv->drm, NULL);
 	return 0;
 
 err_unload:
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 11/86] drm/atmel-hdlcd: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (9 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 10/86] drm/aspeed: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 12/86] drm/fsl-dcu: " Thomas Zimmermann
                   ` (77 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Sam Ravnborg, Boris Brezillon, Nicolas Ferre,
	Alexandre Belloni, Claudiu Beznea

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Boris Brezillon <bbrezillon@kernel.org>
Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: Claudiu Beznea <claudiu.beznea@tuxon.dev>
---
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 9ce429f889ca..f529352d4bb2 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -18,8 +18,10 @@
 
 #include <drm/drm_atomic.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_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
@@ -865,7 +867,7 @@ static int atmel_hlcdc_dc_drm_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_unload;
 
-	drm_fbdev_dma_setup(ddev, 24);
+	drm_client_setup(ddev, drm_format_info(DRM_FORMAT_RGB888));
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 12/86] drm/fsl-dcu: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (10 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 11/86] drm/atmel-hdlcd: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 13/86] drm/hisilicon/kirin: " Thomas Zimmermann
                   ` (76 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Stefan Agner, Alison Wang

Call drm_client_setup_with_color_mode() 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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Stefan Agner <stefan@agner.ch>
Cc: Alison Wang <alison.wang@nxp.com>
---
 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
index ab6c0c6cd0e2..2b3f15f0dc56 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
@@ -19,6 +19,7 @@
 #include <linux/regmap.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_dma_helper.h>
@@ -156,6 +157,7 @@ static const struct drm_driver fsl_dcu_drm_driver = {
 	.load			= fsl_dcu_load,
 	.unload			= fsl_dcu_unload,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops			= &fsl_dcu_drm_fops,
 	.name			= "fsl-dcu-drm",
 	.desc			= "Freescale DCU DRM",
@@ -333,7 +335,7 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
 	if (ret < 0)
 		goto put;
 
-	drm_fbdev_dma_setup(drm, legacyfb_depth);
+	drm_client_setup_with_color_mode(drm, legacyfb_depth);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 13/86] drm/hisilicon/kirin: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (11 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 12/86] drm/fsl-dcu: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 14/86] drm/hx8357d: " Thomas Zimmermann
                   ` (75 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Xinliang Liu, Tian Tao, Xinwei Kong,
	Sumit Semwal, Yongqin Liu, John Stultz

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.

The kirin driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Xinliang Liu <xinliang.liu@linaro.org>
Cc: Tian Tao <tiantao6@hisilicon.com>
Cc: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Yongqin Liu <yongqin.liu@linaro.org>
Cc: John Stultz <jstultz@google.com>
---
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c | 2 ++
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 4 ++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
index 871f79a6b17e..5616c3917c03 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
@@ -25,6 +25,7 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
+#include <drm/drm_fbdev_dma.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_dma_helper.h>
@@ -925,6 +926,7 @@ static const struct drm_driver ade_driver = {
 	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops = &ade_fops,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.name = "kirin",
 	.desc = "Hisilicon Kirin620 SoC DRM Driver",
 	.date = "20150718",
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
index 12666985686b..86a3a1faff49 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
@@ -18,8 +18,8 @@
 #include <linux/platform_device.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_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
@@ -237,7 +237,7 @@ static int kirin_drm_bind(struct device *dev)
 	if (ret)
 		goto err_kms_cleanup;
 
-	drm_fbdev_dma_setup(drm_dev, 32);
+	drm_client_setup(drm_dev, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 14/86] drm/hx8357d: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (12 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 13/86] drm/hisilicon/kirin: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 15/86] drm/ili9163: " Thomas Zimmermann
                   ` (74 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/tiny/hx8357d.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/hx8357d.c b/drivers/gpu/drm/tiny/hx8357d.c
index 2e631282edeb..6b0d1846cfcf 100644
--- a/drivers/gpu/drm/tiny/hx8357d.c
+++ b/drivers/gpu/drm/tiny/hx8357d.c
@@ -17,6 +17,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>
@@ -194,6 +195,7 @@ static const struct drm_driver hx8357d_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &hx8357d_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "hx8357d",
 	.desc			= "HX8357D",
@@ -256,7 +258,7 @@ static int hx8357d_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 15/86] drm/ili9163: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (13 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 14/86] drm/hx8357d: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 16/86] drm/ili9225: " Thomas Zimmermann
                   ` (73 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/tiny/ili9163.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9163.c b/drivers/gpu/drm/tiny/ili9163.c
index 86f9d8834901..5eb39ca1a855 100644
--- a/drivers/gpu/drm/tiny/ili9163.c
+++ b/drivers/gpu/drm/tiny/ili9163.c
@@ -8,6 +8,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>
@@ -113,6 +114,7 @@ static struct drm_driver ili9163_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &ili9163_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "ili9163",
 	.desc			= "Ilitek ILI9163",
@@ -185,7 +187,7 @@ static int ili9163_probe(struct spi_device *spi)
 	if (ret)
 		return ret;
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 16/86] drm/ili9225: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (14 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 15/86] drm/ili9163: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 17/86] drm/ili9341: " Thomas Zimmermann
                   ` (72 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, David Lechner

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Lechner <david@lechnology.com>
---
 drivers/gpu/drm/tiny/ili9225.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9225.c b/drivers/gpu/drm/tiny/ili9225.c
index b6b7a49147bf..875e2d09729a 100644
--- a/drivers/gpu/drm/tiny/ili9225.c
+++ b/drivers/gpu/drm/tiny/ili9225.c
@@ -17,6 +17,7 @@
 #include <video/mipi_display.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
@@ -360,6 +361,7 @@ static const struct drm_driver ili9225_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &ili9225_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.name			= "ili9225",
 	.desc			= "Ilitek ILI9225",
 	.date			= "20171106",
@@ -426,7 +428,7 @@ static int ili9225_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 17/86] drm/ili9341: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (15 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 16/86] drm/ili9225: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 18/86] drm/ili9486: " Thomas Zimmermann
                   ` (71 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/tiny/ili9341.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9341.c b/drivers/gpu/drm/tiny/ili9341.c
index 8bcada30af71..c1dfdfbbd30c 100644
--- a/drivers/gpu/drm/tiny/ili9341.c
+++ b/drivers/gpu/drm/tiny/ili9341.c
@@ -16,6 +16,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>
@@ -150,6 +151,7 @@ static const struct drm_driver ili9341_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &ili9341_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "ili9341",
 	.desc			= "Ilitek ILI9341",
@@ -218,7 +220,7 @@ static int ili9341_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 18/86] drm/ili9486: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (16 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 17/86] drm/ili9341: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 19/86] drm/imx/dcss: " Thomas Zimmermann
                   ` (70 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Kamlesh Gurudasani

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
---
 drivers/gpu/drm/tiny/ili9486.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/ili9486.c b/drivers/gpu/drm/tiny/ili9486.c
index 70d366260041..7e46a720d5e2 100644
--- a/drivers/gpu/drm/tiny/ili9486.c
+++ b/drivers/gpu/drm/tiny/ili9486.c
@@ -15,6 +15,7 @@
 #include <video/mipi_display.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>
@@ -172,6 +173,7 @@ static const struct drm_driver ili9486_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &ili9486_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "ili9486",
 	.desc			= "Ilitek ILI9486",
@@ -247,7 +249,7 @@ static int ili9486_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 19/86] drm/imx/dcss: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (17 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 18/86] drm/ili9486: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 20/86] drm/imx/ipuv3: " Thomas Zimmermann
                   ` (69 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Laurentiu Palcu, Lucas Stach, Shawn Guo,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam

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.

The dcss driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
Cc: Fabio Estevam <festevam@gmail.com>
---
 drivers/gpu/drm/imx/dcss/dcss-kms.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/imx/dcss/dcss-kms.c b/drivers/gpu/drm/imx/dcss/dcss-kms.c
index d0ea4e97cded..3ec721afc30c 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-kms.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-kms.c
@@ -6,6 +6,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge_connector.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
 #include <drm/drm_gem_dma_helper.h>
@@ -28,6 +29,7 @@ static const struct drm_mode_config_funcs dcss_drm_mode_config_funcs = {
 static const struct drm_driver dcss_kms_driver = {
 	.driver_features	= DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops			= &dcss_cma_fops,
 	.name			= "imx-dcss",
 	.desc			= "i.MX8MQ Display Subsystem",
@@ -145,7 +147,7 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss)
 	if (ret)
 		goto cleanup_crtc;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return kms;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 20/86] drm/imx/ipuv3: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (18 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 19/86] drm/imx/dcss: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 21/86] drm/imx/lcdc: " Thomas Zimmermann
                   ` (68 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Philipp Zabel, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam

Call drm_client_setup_with_color_mode() 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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
Cc: Fabio Estevam <festevam@gmail.com>
---
 drivers/gpu/drm/imx/ipuv3/imx-drm-core.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c b/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c
index 4cfabcf7375a..30299f423d62 100644
--- a/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c
+++ b/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c
@@ -15,6 +15,7 @@
 
 #include <drm/drm_atomic.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_dma_helper.h>
@@ -163,6 +164,7 @@ static int imx_drm_dumb_create(struct drm_file *file_priv,
 static const struct drm_driver imx_drm_driver = {
 	.driver_features	= DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(imx_drm_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.ioctls			= imx_drm_ioctls,
 	.num_ioctls		= ARRAY_SIZE(imx_drm_ioctls),
 	.fops			= &imx_drm_driver_fops,
@@ -249,7 +251,7 @@ static int imx_drm_bind(struct device *dev)
 	if (ret)
 		goto err_poll_fini;
 
-	drm_fbdev_dma_setup(drm, legacyfb_depth);
+	drm_client_setup_with_color_mode(drm, legacyfb_depth);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 21/86] drm/imx/lcdc: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (19 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 20/86] drm/imx/ipuv3: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 22/86] drm/ingenic: " Thomas Zimmermann
                   ` (67 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
Cc: Fabio Estevam <festevam@gmail.com>
---
 drivers/gpu/drm/imx/lcdc/imx-lcdc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
index 36668455aee8..3215c4acd675 100644
--- a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
+++ b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
@@ -3,6 +3,7 @@
 
 #include <drm/drm_bridge.h>
 #include <drm/drm_bridge_connector.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
@@ -348,6 +349,7 @@ static struct drm_driver imx_lcdc_drm_driver = {
 	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops = &imx_lcdc_drm_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.name = "imx-lcdc",
 	.desc = "i.MX LCDC driver",
 	.date = "20200716",
@@ -501,7 +503,7 @@ static int imx_lcdc_probe(struct platform_device *pdev)
 	if (ret)
 		return dev_err_probe(dev, ret, "Cannot register device\n");
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 22/86] drm/ingenic: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (20 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 21/86] drm/imx/lcdc: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-17 20:54   ` Paul Cercueil
  2024-08-16 12:22 ` [PATCH 23/86] drm/kmb: " Thomas Zimmermann
                   ` (66 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Paul Cercueil

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.

The ingenic driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Paul Cercueil <paul@crapouillou.net>
---
 drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index 39fa291f43dd..056b70b63554 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -24,6 +24,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_bridge_connector.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_color_mgmt.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_damage_helper.h>
@@ -960,6 +961,7 @@ static const struct drm_driver ingenic_drm_driver_data = {
 	.fops			= &ingenic_drm_fops,
 	.gem_create_object	= ingenic_drm_gem_create_object,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static const struct drm_plane_funcs ingenic_drm_primary_plane_funcs = {
@@ -1399,7 +1401,7 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
 		goto err_clk_notifier_unregister;
 	}
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 23/86] drm/kmb: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (21 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 22/86] drm/ingenic: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 24/86] drm/logicvc: " Thomas Zimmermann
                   ` (65 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Anitha Chrisanthus, Edmund Dea

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Anitha Chrisanthus <anitha.chrisanthus@intel.com>
Cc: Edmund Dea <edmund.j.dea@intel.com>
---
 drivers/gpu/drm/kmb/kmb_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c
index 169b83987ce2..0274ab9caa85 100644
--- a/drivers/gpu/drm/kmb/kmb_drv.c
+++ b/drivers/gpu/drm/kmb/kmb_drv.c
@@ -14,6 +14,7 @@
 #include <linux/regmap.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_dma_helper.h>
@@ -441,6 +442,7 @@ static const struct drm_driver kmb_driver = {
 	/* GEM Operations */
 	.fops = &fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.name = "kmb-drm",
 	.desc = "KEEMBAY DISPLAY DRIVER",
 	.date = DRIVER_DATE,
@@ -561,7 +563,7 @@ static int kmb_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_register;
 
-	drm_fbdev_dma_setup(&kmb->drm, 0);
+	drm_client_setup(&kmb->drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 24/86] drm/logicvc: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (22 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 23/86] drm/kmb: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 25/86] drm/mcde: " Thomas Zimmermann
                   ` (64 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Paul Kocialkowski

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.

The logicvc driver specifies a preferred color mode from the value
in struct drm_mode_config. Use it to select the default format.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
---
 drivers/gpu/drm/logicvc/logicvc_drm.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/logicvc/logicvc_drm.c b/drivers/gpu/drm/logicvc/logicvc_drm.c
index 01a37e28c080..88a978f3f088 100644
--- a/drivers/gpu/drm/logicvc/logicvc_drm.c
+++ b/drivers/gpu/drm/logicvc/logicvc_drm.c
@@ -16,8 +16,10 @@
 #include <linux/types.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_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_print.h>
 
@@ -55,6 +57,7 @@ static struct drm_driver logicvc_drm_driver = {
 	.minor				= 0,
 
 	DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(logicvc_drm_gem_dma_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static struct regmap_config logicvc_drm_regmap_config = {
@@ -301,7 +304,6 @@ static int logicvc_drm_probe(struct platform_device *pdev)
 	struct regmap *regmap = NULL;
 	struct resource res;
 	void __iomem *base;
-	unsigned int preferred_bpp;
 	int irq;
 	int ret;
 
@@ -441,15 +443,12 @@ static int logicvc_drm_probe(struct platform_device *pdev)
 
 	switch (drm_dev->mode_config.preferred_depth) {
 	case 16:
-		preferred_bpp = 16;
+		drm_client_setup(drm_dev, drm_format_info(DRM_FORMAT_RGB565));
 		break;
-	case 24:
-	case 32:
 	default:
-		preferred_bpp = 32;
+		drm_client_setup(drm_dev, NULL);
 		break;
 	}
-	drm_fbdev_dma_setup(drm_dev, preferred_bpp);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 25/86] drm/mcde: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (23 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 24/86] drm/logicvc: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-18  8:51   ` Linus Walleij
  2024-08-16 12:22 ` [PATCH 26/86] drm/mediatek: " Thomas Zimmermann
                   ` (63 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Linus Walleij

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.

The mcde driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpu/drm/mcde/mcde_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c
index 10c06440c7e7..6f4e0f3bf532 100644
--- a/drivers/gpu/drm/mcde/mcde_drv.c
+++ b/drivers/gpu/drm/mcde/mcde_drv.c
@@ -67,6 +67,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_fbdev_dma.h>
@@ -212,6 +213,7 @@ static const struct drm_driver mcde_drm_driver = {
 	.minor = 0,
 	.patchlevel = 0,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int mcde_drm_bind(struct device *dev)
@@ -237,7 +239,7 @@ static int mcde_drm_bind(struct device *dev)
 	if (ret < 0)
 		goto unbind;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 26/86] drm/mediatek: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (24 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 25/86] drm/mcde: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 27/86] drm/meson: " Thomas Zimmermann
                   ` (62 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Chun-KuaIng Hu, Philipp Zabel,
	Matthias Brugger, AngeloGioacchino Del Regno

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.

The mediatek driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Chun-KuaIng Hu <chunkuang.hu@kernel.org>
Cc: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
---
 drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 77b50c56c124..b1309a70fdcd 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -14,6 +14,7 @@
 
 #include <drm/drm_atomic.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_fourcc.h>
@@ -610,6 +611,7 @@ static const struct drm_driver mtk_drm_driver = {
 	.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 
 	.dumb_create = mtk_gem_dumb_create,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 
 	.gem_prime_import = mtk_gem_prime_import,
 	.gem_prime_import_sg_table = mtk_gem_prime_import_sg_table,
@@ -666,7 +668,7 @@ static int mtk_drm_bind(struct device *dev)
 	if (ret < 0)
 		goto err_deinit;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 27/86] drm/meson: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (25 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 26/86] drm/mediatek: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 28/86] drm/mi0283qt: " Thomas Zimmermann
                   ` (61 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Neil Armstrong, Kevin Hilman, Jerome Brunet,
	Martin Blumenstingl

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.

The meson driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Neil Armstrong <neil.armstrong@linaro.org>
Cc: Kevin Hilman <khilman@baylibre.com>
Cc: Jerome Brunet <jbrunet@baylibre.com>
Cc: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
---
 drivers/gpu/drm/meson/meson_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c
index 4bd0baa2a4f5..2f76f48da38d 100644
--- a/drivers/gpu/drm/meson/meson_drv.c
+++ b/drivers/gpu/drm/meson/meson_drv.c
@@ -17,6 +17,7 @@
 
 #include <drm/drm_aperture.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_dma_helper.h>
@@ -98,6 +99,7 @@ static const struct drm_driver meson_driver = {
 
 	/* DMA Ops */
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(meson_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 
 	/* Misc */
 	.fops			= &fops,
@@ -353,7 +355,7 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
 	if (ret)
 		goto uninstall_irq;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 28/86] drm/mi0283qt: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (26 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 27/86] drm/meson: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 16:01   ` Noralf Trønnes
  2024-08-20  8:25   ` Noralf Trønnes
  2024-08-16 12:22 ` [PATCH 29/86] drm/mxsfb/lcdif: " Thomas Zimmermann
                   ` (60 subsequent siblings)
  88 siblings, 2 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Noralf Trønnes

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
---
 drivers/gpu/drm/tiny/mi0283qt.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/mi0283qt.c b/drivers/gpu/drm/tiny/mi0283qt.c
index cdc5423990ca..f1461c55dba6 100644
--- a/drivers/gpu/drm/tiny/mi0283qt.c
+++ b/drivers/gpu/drm/tiny/mi0283qt.c
@@ -14,6 +14,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>
@@ -154,6 +155,7 @@ static const struct drm_driver mi0283qt_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &mi0283qt_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "mi0283qt",
 	.desc			= "Multi-Inno MI0283QT",
@@ -226,7 +228,7 @@ static int mi0283qt_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 29/86] drm/mxsfb/lcdif: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (27 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 28/86] drm/mi0283qt: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 30/86] drm/msxfb: " Thomas Zimmermann
                   ` (59 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Marek Vasut, Stefan Agner, Shawn Guo,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam

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.

The lcdif driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Marek Vasut <marex@denx.de>
Cc: Stefan Agner <stefan@agner.ch>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
Cc: Fabio Estevam <festevam@gmail.com>
---
 drivers/gpu/drm/mxsfb/lcdif_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c
index 0f895b8a99d6..58ccad9c425d 100644
--- a/drivers/gpu/drm/mxsfb/lcdif_drv.c
+++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c
@@ -16,6 +16,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_fbdev_dma.h>
@@ -243,6 +244,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
 static const struct drm_driver lcdif_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops	= &fops,
 	.name	= "imx-lcdif",
 	.desc	= "i.MX LCDIF Controller DRM",
@@ -275,7 +277,7 @@ static int lcdif_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_unload;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 30/86] drm/msxfb: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (28 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 29/86] drm/mxsfb/lcdif: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:22 ` [PATCH 31/86] drm/panel/ili9341: " Thomas Zimmermann
                   ` (58 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Marek Vasut, Stefan Agner, Shawn Guo,
	Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam

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.

The msxfb driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Marek Vasut <marex@denx.de>
Cc: Stefan Agner <stefan@agner.ch>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
Cc: Fabio Estevam <festevam@gmail.com>
---
 drivers/gpu/drm/mxsfb/mxsfb_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
index cb5ce4e81fc7..34a98717b72c 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
@@ -19,6 +19,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
@@ -331,6 +332,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
 static const struct drm_driver mxsfb_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops	= &fops,
 	.name	= "mxsfb-drm",
 	.desc	= "MXSFB Controller DRM",
@@ -364,7 +366,7 @@ static int mxsfb_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_unload;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 31/86] drm/panel/ili9341: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (29 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 30/86] drm/msxfb: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-19 15:37   ` Neil Armstrong
  2024-08-19 15:39   ` Neil Armstrong
  2024-08-16 12:22 ` [PATCH 32/86] drm/panel-mipi-dbi: " Thomas Zimmermann
                   ` (57 subsequent siblings)
  88 siblings, 2 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Neil Armstrong, Jessica Zhang

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Neil Armstrong <neil.armstrong@linaro.org>
Cc: Jessica Zhang <quic_jesszhan@quicinc.com>
---
 drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
index 775d5d5e828c..0ef9f7b59ccb 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
@@ -31,6 +31,7 @@
 #include <video/mipi_display.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>
@@ -591,6 +592,7 @@ static struct drm_driver ili9341_dbi_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &ili9341_dbi_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "ili9341",
 	.desc			= "Ilitek ILI9341",
@@ -651,7 +653,7 @@ static int ili9341_dbi_probe(struct spi_device *spi, struct gpio_desc *dc,
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 32/86] drm/panel-mipi-dbi: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (30 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 31/86] drm/panel/ili9341: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-20  8:26   ` Noralf Trønnes
  2024-08-16 12:22 ` [PATCH 33/86] drm/pl111: " Thomas Zimmermann
                   ` (56 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Noralf Trønnes

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
---
 drivers/gpu/drm/tiny/panel-mipi-dbi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

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.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 33/86] drm/pl111: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (31 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 32/86] drm/panel-mipi-dbi: " Thomas Zimmermann
@ 2024-08-16 12:22 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 34/86] drm/renesas/rcar-du: " Thomas Zimmermann
                   ` (55 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:22 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

Call drm_client_setup_with_color_mode() 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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/pl111/pl111_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/pl111/pl111_drv.c b/drivers/gpu/drm/pl111/pl111_drv.c
index 02e6b74d5016..13362150b9c6 100644
--- a/drivers/gpu/drm/pl111/pl111_drv.c
+++ b/drivers/gpu/drm/pl111/pl111_drv.c
@@ -47,6 +47,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
 #include <drm/drm_fourcc.h>
@@ -225,6 +226,7 @@ static const struct drm_driver pl111_drm_driver = {
 	.patchlevel = 0,
 	.dumb_create = drm_gem_dma_dumb_create,
 	.gem_prime_import_sg_table = pl111_gem_import_sg_table,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 
 #if defined(CONFIG_DEBUG_FS)
 	.debugfs_init = pl111_debugfs_init,
@@ -305,7 +307,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
 	if (ret < 0)
 		goto dev_put;
 
-	drm_fbdev_dma_setup(drm, priv->variant->fb_depth);
+	drm_client_setup_with_color_mode(drm, priv->variant->fb_depth);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 34/86] drm/renesas/rcar-du: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (32 preceding siblings ...)
  2024-08-16 12:22 ` [PATCH 33/86] drm/pl111: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-18 20:12   ` Laurent Pinchart
  2024-08-16 12:23 ` [PATCH 35/86] drm/renesas/rz-du: " Thomas Zimmermann
                   ` (54 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Laurent Pinchart, Kieran Bingham

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.

The rcar-du driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
---
 drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
index fb719d9aff10..4e0bafc86f50 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
@@ -19,6 +19,7 @@
 #include <linux/wait.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_dma_helper.h>
@@ -606,6 +607,7 @@ static const struct drm_driver rcar_du_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.dumb_create		= rcar_du_dumb_create,
 	.gem_prime_import_sg_table = rcar_du_gem_prime_import_sg_table,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops			= &rcar_du_fops,
 	.name			= "rcar-du",
 	.desc			= "Renesas R-Car Display Unit",
@@ -716,7 +718,7 @@ static int rcar_du_probe(struct platform_device *pdev)
 
 	drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
 
-	drm_fbdev_dma_setup(&rcdu->ddev, 32);
+	drm_client_setup(&rcdu->ddev, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 35/86] drm/renesas/rz-du: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (33 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 34/86] drm/renesas/rcar-du: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-19  9:50   ` Biju Das
  2024-08-16 12:23 ` [PATCH 36/86] drm/renesas/shmobile: " Thomas Zimmermann
                   ` (53 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Biju Das

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.

The rz-du driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
index e5eca8691a33..53f9e1b7fa87 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
@@ -13,6 +13,7 @@
 #include <linux/platform_device.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_dma_helper.h>
@@ -68,6 +69,7 @@ DEFINE_DRM_GEM_DMA_FOPS(rzg2l_du_fops);
 static const struct drm_driver rzg2l_du_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.dumb_create		= rzg2l_du_dumb_create,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops			= &rzg2l_du_fops,
 	.name			= "rzg2l-du",
 	.desc			= "Renesas RZ/G2L Display Unit",
@@ -149,7 +151,7 @@ static int rzg2l_du_probe(struct platform_device *pdev)
 
 	drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
 
-	drm_fbdev_dma_setup(&rcdu->ddev, 32);
+	drm_client_setup(&rcdu->ddev, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 36/86] drm/renesas/shmobile: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (34 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 35/86] drm/renesas/rz-du: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-18 20:17   ` Laurent Pinchart
  2024-08-16 12:23 ` [PATCH 37/86] drm/repaper: " Thomas Zimmermann
                   ` (52 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Laurent Pinchart, Geert Uytterhoeven

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Geert Uytterhoeven <geert+renesas@glider.be>
---
 drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
index ff2883c7fd46..e82624836c97 100644
--- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
+++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
@@ -18,8 +18,10 @@
 #include <linux/slab.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_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_modeset_helper.h>
 #include <drm/drm_module.h>
@@ -101,6 +103,7 @@ DEFINE_DRM_GEM_DMA_FOPS(shmob_drm_fops);
 static const struct drm_driver shmob_drm_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops			= &shmob_drm_fops,
 	.name			= "shmob-drm",
 	.desc			= "Renesas SH Mobile DRM",
@@ -257,7 +260,7 @@ static int shmob_drm_probe(struct platform_device *pdev)
 	if (ret < 0)
 		goto err_modeset_cleanup;
 
-	drm_fbdev_dma_setup(ddev, 16);
+	drm_client_setup(ddev, drm_format_info(DRM_FORMAT_RGB565));
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 37/86] drm/repaper: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (35 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 36/86] drm/renesas/shmobile: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-20  8:26   ` Noralf Trønnes
  2024-08-16 12:23 ` [PATCH 38/86] drm/rockchip: " Thomas Zimmermann
                   ` (51 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Noralf Trønnes

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
---
 drivers/gpu/drm/tiny/repaper.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/repaper.c b/drivers/gpu/drm/tiny/repaper.c
index 1f78aa3d26bb..77944eb17b3c 100644
--- a/drivers/gpu/drm/tiny/repaper.c
+++ b/drivers/gpu/drm/tiny/repaper.c
@@ -22,6 +22,7 @@
 #include <linux/thermal.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
@@ -913,6 +914,7 @@ static const struct drm_driver repaper_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &repaper_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.name			= "repaper",
 	.desc			= "Pervasive Displays RePaper e-ink panels",
 	.date			= "20170405",
@@ -1118,7 +1120,7 @@ static int repaper_probe(struct spi_device *spi)
 
 	DRM_DEBUG_DRIVER("SPI speed: %uMHz\n", spi->max_speed_hz / 1000000);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 38/86] drm/rockchip: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (36 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 37/86] drm/repaper: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 13:34   ` Heiko Stübner
  2024-08-16 12:23 ` [PATCH 39/86] drm/sti: " Thomas Zimmermann
                   ` (50 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Sandy Huang, Heiko Stübner, Andy Yan

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Sandy Huang <hjc@rock-chips.com>
Cc: "Heiko Stübner" <heiko@sntech.de>
Cc: Andy Yan <andy.yan@rock-chips.com>
---
 drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 44d769d9234d..83ea6cc8cd21 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -17,6 +17,7 @@
 #include <linux/iommu.h>
 
 #include <drm/drm_aperture.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
 #include <drm/drm_gem_dma_helper.h>
@@ -191,7 +192,7 @@ static int rockchip_drm_bind(struct device *dev)
 	if (ret)
 		goto err_kms_helper_poll_fini;
 
-	drm_fbdev_dma_setup(drm_dev, 0);
+	drm_client_setup(drm_dev, NULL);
 
 	return 0;
 err_kms_helper_poll_fini:
@@ -226,6 +227,7 @@ static const struct drm_driver rockchip_drm_driver = {
 	.driver_features	= DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 	.dumb_create		= rockchip_gem_dumb_create,
 	.gem_prime_import_sg_table	= rockchip_gem_prime_import_sg_table,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.fops			= &rockchip_drm_driver_fops,
 	.name	= DRIVER_NAME,
 	.desc	= DRIVER_DESC,
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 39/86] drm/sti: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (37 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 38/86] drm/rockchip: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 40/86] drm/stm: " Thomas Zimmermann
                   ` (49 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Alain Volmat

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.

The sti driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Alain Volmat <alain.volmat@foss.st.com>
---
 drivers/gpu/drm/sti/sti_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/sti/sti_drv.c b/drivers/gpu/drm/sti/sti_drv.c
index 1799c12babf5..65f180c8e8e2 100644
--- a/drivers/gpu/drm/sti/sti_drv.c
+++ b/drivers/gpu/drm/sti/sti_drv.c
@@ -15,6 +15,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
@@ -136,6 +137,7 @@ static const struct drm_driver sti_driver = {
 	.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 	.fops = &sti_driver_fops,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 
 	.debugfs_init = sti_drm_dbg_init,
 
@@ -203,7 +205,7 @@ static int sti_bind(struct device *dev)
 
 	drm_mode_config_reset(ddev);
 
-	drm_fbdev_dma_setup(ddev, 32);
+	drm_client_setup(ddev, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 40/86] drm/stm: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (38 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 39/86] drm/sti: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-20 11:57   ` Raphael Gallais-Pou
  2024-08-16 12:23 ` [PATCH 41/86] drm/sun4i: " Thomas Zimmermann
                   ` (48 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Yannick Fertre, Raphael Gallais-Pou,
	Philippe Cornu, Maxime Coquelin, Alexandre Torgue

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Yannick Fertre <yannick.fertre@foss.st.com>
Cc: Raphael Gallais-Pou <raphael.gallais-pou@foss.st.com>
Cc: Philippe Cornu <philippe.cornu@foss.st.com>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>
---
 drivers/gpu/drm/stm/drv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/stm/drv.c b/drivers/gpu/drm/stm/drv.c
index e1232f74dfa5..569d7d654965 100644
--- a/drivers/gpu/drm/stm/drv.c
+++ b/drivers/gpu/drm/stm/drv.c
@@ -18,8 +18,10 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic.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_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
@@ -66,6 +68,7 @@ static const struct drm_driver drv_driver = {
 	.patchlevel = 0,
 	.fops = &drv_driver_fops,
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(stm_gem_dma_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int drv_load(struct drm_device *ddev)
@@ -206,7 +209,7 @@ static int stm_drm_platform_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_unload;
 
-	drm_fbdev_dma_setup(ddev, 16);
+	drm_client_setup(ddev, drm_format_info(DRM_FORMAT_RGB565));
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 41/86] drm/sun4i: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (39 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 40/86] drm/stm: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 42/86] drm/tidss: " Thomas Zimmermann
                   ` (47 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec,
	Samuel Holland

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.

The sun4i driver specifies as preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: Samuel Holland <samuel@sholland.org>
---
 drivers/gpu/drm/sun4i/sun4i_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
index 35d7a7ffd208..c3342789e3b0 100644
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
@@ -16,6 +16,7 @@
 
 #include <drm/drm_aperture.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_dma_helper.h>
@@ -55,6 +56,7 @@ static const struct drm_driver sun4i_drv_driver = {
 
 	/* GEM Operations */
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(drm_sun4i_gem_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int sun4i_drv_bind(struct device *dev)
@@ -111,7 +113,7 @@ static int sun4i_drv_bind(struct device *dev)
 	if (ret)
 		goto finish_poll;
 
-	drm_fbdev_dma_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	dev_set_drvdata(dev, drm);
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 42/86] drm/tidss: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (40 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 41/86] drm/sun4i: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 43/86] drm/tilcdc: " Thomas Zimmermann
                   ` (46 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Jyri Sarha, Tomi Valkeinen

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.

The tidss driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jyri Sarha <jyri.sarha@iki.fi>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
 drivers/gpu/drm/tidss/tidss_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tidss/tidss_drv.c b/drivers/gpu/drm/tidss/tidss_drv.c
index d15f836dca95..2428b9aaa003 100644
--- a/drivers/gpu/drm/tidss/tidss_drv.c
+++ b/drivers/gpu/drm/tidss/tidss_drv.c
@@ -11,6 +11,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
@@ -109,6 +110,7 @@ static const struct drm_driver tidss_driver = {
 	.fops			= &tidss_fops,
 	.release		= tidss_release,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.name			= "tidss",
 	.desc			= "TI Keystone DSS",
 	.date			= "20180215",
@@ -186,7 +188,7 @@ static int tidss_probe(struct platform_device *pdev)
 		goto err_irq_uninstall;
 	}
 
-	drm_fbdev_dma_setup(ddev, 32);
+	drm_client_setup(ddev, NULL);
 
 	dev_dbg(dev, "%s done\n", __func__);
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 43/86] drm/tilcdc: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (41 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 42/86] drm/tidss: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 44/86] drm/st7586: " Thomas Zimmermann
                   ` (45 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Jyri Sarha, Tomi Valkeinen

Call drm_client_setup_with_color_mode() 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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jyri Sarha <jyri.sarha@iki.fi>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
 drivers/gpu/drm/tilcdc/tilcdc_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index cd5eefa06060..3ee9fc3bf84a 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -14,6 +14,7 @@
 #include <linux/pm_runtime.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
@@ -374,7 +375,8 @@ static int tilcdc_init(const struct drm_driver *ddrv, struct device *dev)
 		goto init_failed;
 	priv->is_registered = true;
 
-	drm_fbdev_dma_setup(ddev, bpp);
+	drm_client_setup_with_color_mode(ddev, bpp);
+
 	return 0;
 
 init_failed:
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 44/86] drm/st7586: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (42 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 43/86] drm/tilcdc: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 45/86] drm/st7735r: " Thomas Zimmermann
                   ` (44 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, David Lechner

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Lechner <david@lechnology.com>
---
 drivers/gpu/drm/tiny/st7586.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/st7586.c b/drivers/gpu/drm/tiny/st7586.c
index b9c6ed352182..97013685c62f 100644
--- a/drivers/gpu/drm/tiny/st7586.c
+++ b/drivers/gpu/drm/tiny/st7586.c
@@ -13,6 +13,7 @@
 #include <video/mipi_display.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
@@ -290,6 +291,7 @@ static const struct drm_driver st7586_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &st7586_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "st7586",
 	.desc			= "Sitronix ST7586",
@@ -371,7 +373,7 @@ static int st7586_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 45/86] drm/st7735r: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (43 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 44/86] drm/st7586: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 46/86] drm/tve200: " Thomas Zimmermann
                   ` (43 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, David Lechner

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Lechner <david@lechnology.com>
---
 drivers/gpu/drm/tiny/st7735r.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/st7735r.c b/drivers/gpu/drm/tiny/st7735r.c
index 1676da00883d..0747ebd999cc 100644
--- a/drivers/gpu/drm/tiny/st7735r.c
+++ b/drivers/gpu/drm/tiny/st7735r.c
@@ -17,6 +17,7 @@
 #include <video/mipi_display.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>
@@ -155,6 +156,7 @@ static const struct drm_driver st7735r_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
 	.fops			= &st7735r_fops,
 	DRM_GEM_DMA_DRIVER_OPS_VMAP,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 	.debugfs_init		= mipi_dbi_debugfs_init,
 	.name			= "st7735r",
 	.desc			= "Sitronix ST7735R",
@@ -241,7 +243,7 @@ static int st7735r_probe(struct spi_device *spi)
 
 	spi_set_drvdata(spi, drm);
 
-	drm_fbdev_dma_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 46/86] drm/tve200: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (44 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 45/86] drm/st7735r: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-18  8:51   ` Linus Walleij
  2024-08-16 12:23 ` [PATCH 47/86] drm/vc4: " Thomas Zimmermann
                   ` (42 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Linus Walleij

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpu/drm/tve200/tve200_drv.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/tve200/tve200_drv.c b/drivers/gpu/drm/tve200/tve200_drv.c
index acce210e2554..b84f0abfdcc7 100644
--- a/drivers/gpu/drm/tve200/tve200_drv.c
+++ b/drivers/gpu/drm/tve200/tve200_drv.c
@@ -39,8 +39,10 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_dma.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
@@ -149,6 +151,7 @@ static const struct drm_driver tve200_drm_driver = {
 	.minor = 0,
 	.patchlevel = 0,
 	DRM_GEM_DMA_DRIVER_OPS,
+	DRM_FBDEV_DMA_DRIVER_OPS,
 };
 
 static int tve200_probe(struct platform_device *pdev)
@@ -221,11 +224,7 @@ static int tve200_probe(struct platform_device *pdev)
 	if (ret < 0)
 		goto clk_disable;
 
-	/*
-	 * Passing in 16 here will make the RGB565 mode the default
-	 * Passing in 32 will use XRGB8888 mode
-	 */
-	drm_fbdev_dma_setup(drm, 16);
+	drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB565));
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 47/86] drm/vc4: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (45 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 46/86] drm/tve200: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 48/86] drm/xlnx: " Thomas Zimmermann
                   ` (41 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Maxime Ripard, Dave Stevenson,
	Raspberry Pi Kernel Maintenance

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Dave Stevenson <dave.stevenson@raspberrypi.com>
Cc: Raspberry Pi Kernel Maintenance <kernel-list@raspberrypi.com>
---
 drivers/gpu/drm/vc4/vc4_drv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index c133e96b8aca..f83eea9af105 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -32,8 +32,10 @@
 
 #include <drm/drm_aperture.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_fourcc.h>
 #include <drm/drm_vblank.h>
 
 #include <soc/bcm2835/raspberrypi-firmware.h>
@@ -212,6 +214,7 @@ const struct drm_driver vc4_drm_driver = {
 	.gem_create_object = vc4_create_object,
 
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(vc4_bo_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 
 	.ioctls = vc4_drm_ioctls,
 	.num_ioctls = ARRAY_SIZE(vc4_drm_ioctls),
@@ -389,7 +392,7 @@ static int vc4_drm_bind(struct device *dev)
 	if (ret < 0)
 		goto err;
 
-	drm_fbdev_dma_setup(drm, 16);
+	drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB565));
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 48/86] drm/xlnx: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (46 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 47/86] drm/vc4: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-18 20:19   ` Laurent Pinchart
  2024-08-16 12:23 ` [PATCH 49/86] drm/fbdev-dma: Remove obsolete setup function Thomas Zimmermann
                   ` (40 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Laurent Pinchart, Tomi Valkeinen, Michal Simek

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Cc: Michal Simek <michal.simek@amd.com>
---
 drivers/gpu/drm/xlnx/zynqmp_kms.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xlnx/zynqmp_kms.c b/drivers/gpu/drm/xlnx/zynqmp_kms.c
index bd1368df7870..f26b119322d5 100644
--- a/drivers/gpu/drm/xlnx/zynqmp_kms.c
+++ b/drivers/gpu/drm/xlnx/zynqmp_kms.c
@@ -14,6 +14,7 @@
 #include <drm/drm_blend.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_bridge_connector.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_device.h>
@@ -402,6 +403,7 @@ static const struct drm_driver zynqmp_dpsub_drm_driver = {
 					  DRIVER_ATOMIC,
 
 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(zynqmp_dpsub_dumb_create),
+	DRM_FBDEV_DMA_DRIVER_OPS,
 
 	.fops				= &zynqmp_dpsub_drm_fops,
 
@@ -523,7 +525,7 @@ int zynqmp_dpsub_drm_init(struct zynqmp_dpsub *dpsub)
 		goto err_poll_fini;
 
 	/* Initialize fbdev generic emulation. */
-	drm_fbdev_dma_setup(drm, 24);
+	drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB888));
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 49/86] drm/fbdev-dma: Remove obsolete setup function
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (47 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 48/86] drm/xlnx: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 50/86] drm/fbdev-shmem: Support struct drm_driver.fbdev_probe Thomas Zimmermann
                   ` (39 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

The old setup function drm_fbdev_dma_setup() is unused. Remove it and
its internal callbacks. New drivers should call drm_client_setup()
instead.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fbdev_dma.c | 120 +-------------------------------
 include/drm/drm_fbdev_dma.h     |   7 --
 2 files changed, 1 insertion(+), 126 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index aeccf7f7a522..f3611a1f2191 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -2,15 +2,13 @@
 
 #include <linux/fb.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_dma.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_dma_helper.h>
 
-#include <drm/drm_fbdev_dma.h>
-
 /*
  * struct fb_ops
  */
@@ -84,12 +82,6 @@ static const struct fb_ops drm_fbdev_dma_fb_ops = {
  * struct drm_fb_helper
  */
 
-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)
 {
@@ -110,7 +102,6 @@ static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
 }
 
 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,
 };
 
@@ -201,112 +192,3 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 	return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_dma_driver_fbdev_probe);
-
-/*
- * struct drm_client_funcs
- */
-
-static void drm_fbdev_dma_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int drm_fbdev_dma_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int drm_fbdev_dma_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "fbdev-dma: Failed to setup generic emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs drm_fbdev_dma_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= drm_fbdev_dma_client_unregister,
-	.restore	= drm_fbdev_dma_client_restore,
-	.hotplug	= drm_fbdev_dma_client_hotplug,
-};
-
-/**
- * drm_fbdev_dma_setup() - Setup fbdev emulation for GEM DMA helpers
- * @dev: DRM device
- * @preferred_bpp: Preferred bits per pixel for the device.
- *                 32 is used if this is zero.
- *
- * This function sets up fbdev emulation for GEM DMA drivers that support
- * dumb buffers with a virtual address and that can be mmap'ed.
- * drm_fbdev_dma_setup() shall be called after the DRM driver registered
- * the new DRM device with drm_dev_register().
- *
- * Restore, hotplug events and teardown are all taken care of. Drivers that do
- * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
- * Simple drivers might use drm_mode_config_helper_suspend().
- *
- * This function is safe to call even when there are no connectors present.
- * Setup will be retried on the next hotplug event.
- *
- * The fbdev is destroyed by drm_dev_unregister().
- */
-void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{
-	struct drm_fb_helper *fb_helper;
-	int ret;
-
-	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-	if (!fb_helper)
-		return;
-	drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_dma_helper_funcs);
-
-	ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_dma_client_funcs);
-	if (ret) {
-		drm_err(dev, "Failed to register client: %d\n", ret);
-		goto err_drm_client_init;
-	}
-
-	drm_client_register(&fb_helper->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(fb_helper);
-	kfree(fb_helper);
-}
-EXPORT_SYMBOL(drm_fbdev_dma_setup);
diff --git a/include/drm/drm_fbdev_dma.h b/include/drm/drm_fbdev_dma.h
index 6ae4de46497c..fb3f2a9aa01a 100644
--- a/include/drm/drm_fbdev_dma.h
+++ b/include/drm/drm_fbdev_dma.h
@@ -3,7 +3,6 @@
 #ifndef DRM_FBDEV_DMA_H
 #define DRM_FBDEV_DMA_H
 
-struct drm_device;
 struct drm_fb_helper;
 struct drm_fb_helper_surface_size;
 
@@ -13,15 +12,9 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 
 #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.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 50/86] drm/fbdev-shmem: Support struct drm_driver.fbdev_probe
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (48 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 49/86] drm/fbdev-dma: Remove obsolete setup function Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 51/86] drm/ast: Run DRM default client setup Thomas Zimmermann
                   ` (38 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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 SHMEM-
based DRM drivers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fbdev_shmem.c | 60 ++++++++++++++++++-------------
 include/drm/drm_fbdev_shmem.h     | 11 ++++++
 2 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c b/drivers/gpu/drm/drm_fbdev_shmem.c
index 0c785007f11b..3bca333917d1 100644
--- a/drivers/gpu/drm/drm_fbdev_shmem.c
+++ b/drivers/gpu/drm/drm_fbdev_shmem.c
@@ -107,6 +107,40 @@ static struct page *drm_fbdev_shmem_get_page(struct fb_info *info, unsigned long
 
 static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
 					   struct drm_fb_helper_surface_size *sizes)
+{
+	return drm_fbdev_shmem_driver_fbdev_probe(fb_helper, sizes);
+}
+
+static int drm_fbdev_shmem_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_shmem_helper_funcs = {
+	.fb_probe = drm_fbdev_shmem_helper_fb_probe,
+	.fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
+};
+
+/*
+ * struct drm_driver
+ */
+
+int drm_fbdev_shmem_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;
@@ -139,6 +173,7 @@ static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
 		goto err_drm_client_buffer_delete;
 	}
 
+	fb_helper->funcs = &drm_fbdev_shmem_helper_funcs;
 	fb_helper->buffer = buffer;
 	fb_helper->fb = fb;
 
@@ -182,30 +217,7 @@ static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
 	drm_client_framebuffer_delete(buffer);
 	return ret;
 }
-
-static int drm_fbdev_shmem_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_shmem_helper_funcs = {
-	.fb_probe = drm_fbdev_shmem_helper_fb_probe,
-	.fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
-};
+EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe);
 
 /*
  * struct drm_client_funcs
diff --git a/include/drm/drm_fbdev_shmem.h b/include/drm/drm_fbdev_shmem.h
index fb43cadd1950..3a5d1efa9d55 100644
--- a/include/drm/drm_fbdev_shmem.h
+++ b/include/drm/drm_fbdev_shmem.h
@@ -4,12 +4,23 @@
 #define DRM_FBDEV_SHMEM_H
 
 struct drm_device;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
+int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+				       struct drm_fb_helper_surface_size *sizes);
+
+#define DRM_FBDEV_SHMEM_DRIVER_OPS \
+	.fbdev_probe = drm_fbdev_shmem_driver_fbdev_probe
+
 void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp);
 #else
 static inline void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
 { }
+
+#define DRM_FBDEV_SHMEM_DRIVER_OPS \
+	.fbdev_probe = NULL
 #endif
 
 #endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 51/86] drm/ast: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (49 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 50/86] drm/fbdev-shmem: Support struct drm_driver.fbdev_probe Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 52/86] drm/cirrus: " Thomas Zimmermann
                   ` (37 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Dave Airlie

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.

The ast driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jocelyn Falempe <jfalempe@redhat.com>
---
 drivers/gpu/drm/ast/ast_drv.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c
index 225817087b4d..debdfd0e197e 100644
--- a/drivers/gpu/drm/ast/ast_drv.c
+++ b/drivers/gpu/drm/ast/ast_drv.c
@@ -32,6 +32,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_gem_shmem_helper.h>
@@ -64,7 +65,8 @@ static const struct drm_driver ast_driver = {
 	.minor = DRIVER_MINOR,
 	.patchlevel = DRIVER_PATCHLEVEL,
 
-	DRM_GEM_SHMEM_DRIVER_OPS
+	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 /*
@@ -360,7 +362,7 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		return ret;
 
-	drm_fbdev_shmem_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 52/86] drm/cirrus: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (50 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 51/86] drm/ast: Run DRM default client setup Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 53/86] drm/gm12u320: " Thomas Zimmermann
                   ` (36 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Dave Airlie, Gerd Hoffmann

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
---
 drivers/gpu/drm/tiny/cirrus.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/cirrus.c b/drivers/gpu/drm/tiny/cirrus.c
index 751326e3d9c3..a9003c0fd2d9 100644
--- a/drivers/gpu/drm/tiny/cirrus.c
+++ b/drivers/gpu/drm/tiny/cirrus.c
@@ -27,6 +27,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_atomic_state_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
@@ -662,6 +663,7 @@ static const struct drm_driver cirrus_driver = {
 
 	.fops		 = &cirrus_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 static int cirrus_pci_probe(struct pci_dev *pdev,
@@ -716,7 +718,7 @@ static int cirrus_pci_probe(struct pci_dev *pdev,
 	if (ret)
 		return ret;
 
-	drm_fbdev_shmem_setup(dev, 16);
+	drm_client_setup(dev, drm_format_info(DRM_FORMAT_RGB565));
 	return 0;
 }
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 53/86] drm/gm12u320: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (51 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 52/86] drm/cirrus: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 54/86] drm/gud: " Thomas Zimmermann
                   ` (35 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Hans de Goede

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Hans de Goede <hdegoede@redhat.com>
---
 drivers/gpu/drm/tiny/gm12u320.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/gm12u320.c b/drivers/gpu/drm/tiny/gm12u320.c
index e0defb1d134f..ade312fde803 100644
--- a/drivers/gpu/drm/tiny/gm12u320.c
+++ b/drivers/gpu/drm/tiny/gm12u320.c
@@ -9,6 +9,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_atomic_state_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
@@ -625,6 +626,7 @@ static const struct drm_driver gm12u320_drm_driver = {
 	.fops		 = &gm12u320_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
 	.gem_prime_import = gm12u320_gem_prime_import,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 static const struct drm_mode_config_funcs gm12u320_mode_config_funcs = {
@@ -699,7 +701,7 @@ static int gm12u320_usb_probe(struct usb_interface *interface,
 	if (ret)
 		goto err_put_device;
 
-	drm_fbdev_shmem_setup(dev, 0);
+	drm_client_setup(dev, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 54/86] drm/gud: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (52 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 53/86] drm/gm12u320: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-20  8:27   ` Noralf Trønnes
  2024-08-16 12:23 ` [PATCH 55/86] drm/hyperv_drm: " Thomas Zimmermann
                   ` (34 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Noralf Trønnes

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
---
 drivers/gpu/drm/gud/gud_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/gud/gud_drv.c b/drivers/gpu/drm/gud/gud_drv.c
index ac6bbf920c72..09ccdc1dc1a2 100644
--- a/drivers/gpu/drm/gud/gud_drv.c
+++ b/drivers/gpu/drm/gud/gud_drv.c
@@ -15,6 +15,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_blend.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
@@ -376,6 +377,7 @@ static const struct drm_driver gud_drm_driver = {
 	.fops			= &gud_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
 	.gem_prime_import	= gud_gem_prime_import,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 
 	.name			= "gud",
 	.desc			= "Generic USB Display",
@@ -622,7 +624,7 @@ static int gud_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
 	drm_kms_helper_poll_init(drm);
 
-	drm_fbdev_shmem_setup(drm, 0);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 55/86] drm/hyperv_drm: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (53 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 54/86] drm/gud: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 15:36   ` Deepak Rawat
  2024-08-16 12:23 ` [PATCH 56/86] drm/mgag200: " Thomas Zimmermann
                   ` (33 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Deepak Rawat

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Deepak Rawat <drawat.floss@gmail.com>
---
 drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
index ff93e08d5036..3077ce5470f6 100644
--- a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
+++ b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
@@ -10,6 +10,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_gem_shmem_helper.h>
@@ -36,6 +37,7 @@ static struct drm_driver hyperv_driver = {
 
 	.fops		 = &hv_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 static int hyperv_pci_probe(struct pci_dev *pdev,
@@ -149,7 +151,7 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
 		goto err_free_mmio;
 	}
 
-	drm_fbdev_shmem_setup(dev, 0);
+	drm_client_setup(dev, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 56/86] drm/mgag200: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (54 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 55/86] drm/hyperv_drm: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 57/86] drm/ofdrm: Use " Thomas Zimmermann
                   ` (32 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Dave Airlie

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>i
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jocelyn Falempe <jfalempe@redhat.com>
---
 drivers/gpu/drm/mgag200/mgag200_drv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 6623ee4e3277..96a06c59edad 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -11,9 +11,11 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_file.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
 #include <drm/drm_module.h>
@@ -129,6 +131,7 @@ static const struct drm_driver mgag200_driver = {
 	.minor = DRIVER_MINOR,
 	.patchlevel = DRIVER_PATCHLEVEL,
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 };
 
 /*
@@ -314,7 +317,7 @@ mgag200_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	 * FIXME: A 24-bit color depth does not work with 24 bpp on
 	 * G200ER. Force 32 bpp.
 	 */
-	drm_fbdev_shmem_setup(dev, 32);
+	drm_client_setup(dev, drm_format_info(DRM_FORMAT_XRGB8888));
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 57/86] drm/ofdrm: Use DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (55 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 56/86] drm/mgag200: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-19 16:40   ` Javier Martinez Canillas
  2024-08-16 12:23 ` [PATCH 58/86] drm/simpledrm: Run " Thomas Zimmermann
                   ` (31 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
---
 drivers/gpu/drm/tiny/ofdrm.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/tiny/ofdrm.c b/drivers/gpu/drm/tiny/ofdrm.c
index 35996f7eedac..04ffa93de44a 100644
--- a/drivers/gpu/drm/tiny/ofdrm.c
+++ b/drivers/gpu/drm/tiny/ofdrm.c
@@ -7,6 +7,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_state_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_device.h>
@@ -1344,6 +1345,7 @@ DEFINE_DRM_GEM_FOPS(ofdrm_fops);
 
 static struct drm_driver ofdrm_driver = {
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 	.name			= DRIVER_NAME,
 	.desc			= DRIVER_DESC,
 	.date			= DRIVER_DATE,
@@ -1361,7 +1363,6 @@ static int ofdrm_probe(struct platform_device *pdev)
 {
 	struct ofdrm_device *odev;
 	struct drm_device *dev;
-	unsigned int color_mode;
 	int ret;
 
 	odev = ofdrm_device_create(&ofdrm_driver, pdev);
@@ -1373,11 +1374,7 @@ static int ofdrm_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	color_mode = drm_format_info_bpp(odev->format, 0);
-	if (color_mode == 16)
-		color_mode = odev->format->depth; // can be 15 or 16
-
-	drm_fbdev_shmem_setup(dev, color_mode);
+	drm_client_setup(dev, odev->format);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 58/86] drm/simpledrm: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (56 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 57/86] drm/ofdrm: Use " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-19 16:41   ` Javier Martinez Canillas
  2024-08-16 12:23 ` [PATCH 59/86] drm/solomon: " Thomas Zimmermann
                   ` (30 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
---
 drivers/gpu/drm/tiny/simpledrm.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
index d19e10289428..484901e5e2f4 100644
--- a/drivers/gpu/drm/tiny/simpledrm.c
+++ b/drivers/gpu/drm/tiny/simpledrm.c
@@ -12,6 +12,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_state_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
@@ -1009,6 +1010,7 @@ DEFINE_DRM_GEM_FOPS(simpledrm_fops);
 
 static struct drm_driver simpledrm_driver = {
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 	.name			= DRIVER_NAME,
 	.desc			= DRIVER_DESC,
 	.date			= DRIVER_DATE,
@@ -1026,7 +1028,6 @@ static int simpledrm_probe(struct platform_device *pdev)
 {
 	struct simpledrm_device *sdev;
 	struct drm_device *dev;
-	unsigned int color_mode;
 	int ret;
 
 	sdev = simpledrm_device_create(&simpledrm_driver, pdev);
@@ -1038,11 +1039,7 @@ static int simpledrm_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	color_mode = drm_format_info_bpp(sdev->format, 0);
-	if (color_mode == 16)
-		color_mode = sdev->format->depth; // can be 15 or 16
-
-	drm_fbdev_shmem_setup(dev, color_mode);
+	drm_client_setup(dev, sdev->format);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 59/86] drm/solomon: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (57 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 58/86] drm/simpledrm: Run " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-19 16:42   ` Javier Martinez Canillas
  2024-08-16 12:23 ` [PATCH 60/86] drm/udl: " Thomas Zimmermann
                   ` (29 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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.

The solomon driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
---
 drivers/gpu/drm/solomon/ssd130x.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c
index 6f51bcf774e2..29b2f82d81f8 100644
--- a/drivers/gpu/drm/solomon/ssd130x.c
+++ b/drivers/gpu/drm/solomon/ssd130x.c
@@ -20,6 +20,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_edid.h>
@@ -1780,6 +1781,7 @@ DEFINE_DRM_GEM_FOPS(ssd130x_fops);
 
 static const struct drm_driver ssd130x_drm_driver = {
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 	.name			= DRIVER_NAME,
 	.desc			= DRIVER_DESC,
 	.date			= DRIVER_DATE,
@@ -2029,7 +2031,7 @@ struct ssd130x_device *ssd130x_probe(struct device *dev, struct regmap *regmap)
 	if (ret)
 		return ERR_PTR(dev_err_probe(dev, ret, "DRM device register failed\n"));
 
-	drm_fbdev_shmem_setup(drm, 32);
+	drm_client_setup(drm, NULL);
 
 	return ssd130x;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 60/86] drm/udl: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (58 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 59/86] drm/solomon: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 61/86] drm/virtgpu: " Thomas Zimmermann
                   ` (28 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Dave Airlie, Sean Paul

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Sean Paul <sean@poorly.run>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/udl/udl_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
index 280a09a6e2ad..8d8ae40f945c 100644
--- a/drivers/gpu/drm/udl/udl_drv.c
+++ b/drivers/gpu/drm/udl/udl_drv.c
@@ -6,6 +6,7 @@
 #include <linux/module.h>
 
 #include <drm/drm_drv.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem_shmem_helper.h>
@@ -73,6 +74,7 @@ static const struct drm_driver driver = {
 	.fops = &udl_driver_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
 	.gem_prime_import = udl_driver_gem_prime_import,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 
 	.name = DRIVER_NAME,
 	.desc = DRIVER_DESC,
@@ -117,7 +119,7 @@ static int udl_usb_probe(struct usb_interface *interface,
 
 	DRM_INFO("Initialized udl on minor %d\n", udl->drm.primary->index);
 
-	drm_fbdev_shmem_setup(&udl->drm, 0);
+	drm_client_setup(&udl->drm, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 61/86] drm/virtgpu: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (59 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 60/86] drm/udl: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 62/86] drm/vkms: " Thomas Zimmermann
                   ` (27 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, David Airlie, Gerd Hoffmann, Gurchetan Singh,
	Chia-I Wu

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.

The virtgpu driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Chia-I Wu <olvaffe@gmail.com>
---
 drivers/gpu/drm/virtio/virtgpu_drv.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c
index e5a2665e50ea..1e08d91a4d17 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
@@ -34,6 +34,7 @@
 #include <drm/drm.h>
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_file.h>
@@ -103,7 +104,8 @@ static int virtio_gpu_probe(struct virtio_device *vdev)
 	if (ret)
 		goto err_deinit;
 
-	drm_fbdev_shmem_setup(vdev->priv, 32);
+	drm_client_setup(vdev->priv, NULL);
+
 	return 0;
 
 err_deinit:
@@ -184,6 +186,8 @@ static const struct drm_driver driver = {
 	.dumb_create = virtio_gpu_mode_dumb_create,
 	.dumb_map_offset = virtio_gpu_mode_dumb_mmap,
 
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
+
 #if defined(CONFIG_DEBUG_FS)
 	.debugfs_init = virtio_gpu_debugfs_init,
 #endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 62/86] drm/vkms: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (60 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 61/86] drm/virtgpu: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 63/86] drm/fbdev-shmem: Remove obsolete setup function Thomas Zimmermann
                   ` (26 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Rodrigo Siqueira, Melissa Wen,
	Maíra Canal, Haneen Mohammed

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
Cc: Melissa Wen <melissa.srw@gmail.com>
Cc: "Maíra Canal" <mairacanal@riseup.net>
Cc: Haneen Mohammed <hamohammed.sa@gmail.com>
---
 drivers/gpu/drm/vkms/vkms_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 0c1a713b7b7b..2d1e95cb66e5 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -16,6 +16,7 @@
 #include <drm/drm_gem.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_file.h>
@@ -112,6 +113,7 @@ static const struct drm_driver vkms_driver = {
 	.release		= vkms_release,
 	.fops			= &vkms_driver_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	DRM_FBDEV_SHMEM_DRIVER_OPS,
 
 	.name			= DRIVER_NAME,
 	.desc			= DRIVER_DESC,
@@ -225,7 +227,7 @@ static int vkms_create(struct vkms_config *config)
 	if (ret)
 		goto out_devres;
 
-	drm_fbdev_shmem_setup(&vkms_device->drm, 0);
+	drm_client_setup(&vkms_device->drm, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 63/86] drm/fbdev-shmem: Remove obsolete setup function
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (61 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 62/86] drm/vkms: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 64/86] drm/fbdev-ttm: Support struct drm_driver.fbdev_probe Thomas Zimmermann
                   ` (25 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

The old setup function drm_fbdev_shmem_setup() is unused. Remove it
and its internal callbacks. New drivers should call drm_client_setup()
instead.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fbdev_shmem.c | 120 +-----------------------------
 include/drm/drm_fbdev_shmem.h     |   6 --
 2 files changed, 1 insertion(+), 125 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c b/drivers/gpu/drm/drm_fbdev_shmem.c
index 3bca333917d1..f824369baacd 100644
--- a/drivers/gpu/drm/drm_fbdev_shmem.c
+++ b/drivers/gpu/drm/drm_fbdev_shmem.c
@@ -2,15 +2,13 @@
 
 #include <linux/fb.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_gem_shmem_helper.h>
 
-#include <drm/drm_fbdev_shmem.h>
-
 /*
  * struct fb_ops
  */
@@ -105,12 +103,6 @@ static struct page *drm_fbdev_shmem_get_page(struct fb_info *info, unsigned long
  * struct drm_fb_helper
  */
 
-static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
-					   struct drm_fb_helper_surface_size *sizes)
-{
-	return drm_fbdev_shmem_driver_fbdev_probe(fb_helper, sizes);
-}
-
 static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
 					   struct drm_clip_rect *clip)
 {
@@ -131,7 +123,6 @@ static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
 }
 
 static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
-	.fb_probe = drm_fbdev_shmem_helper_fb_probe,
 	.fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
 };
 
@@ -218,112 +209,3 @@ int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 	return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe);
-
-/*
- * struct drm_client_funcs
- */
-
-static void drm_fbdev_shmem_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int drm_fbdev_shmem_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int drm_fbdev_shmem_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "fbdev-shmem: Failed to setup emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs drm_fbdev_shmem_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= drm_fbdev_shmem_client_unregister,
-	.restore	= drm_fbdev_shmem_client_restore,
-	.hotplug	= drm_fbdev_shmem_client_hotplug,
-};
-
-/**
- * drm_fbdev_shmem_setup() - Setup fbdev emulation for GEM SHMEM helpers
- * @dev: DRM device
- * @preferred_bpp: Preferred bits per pixel for the device.
- *                 32 is used if this is zero.
- *
- * This function sets up fbdev emulation for GEM DMA drivers that support
- * dumb buffers with a virtual address and that can be mmap'ed.
- * drm_fbdev_shmem_setup() shall be called after the DRM driver registered
- * the new DRM device with drm_dev_register().
- *
- * Restore, hotplug events and teardown are all taken care of. Drivers that do
- * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
- * Simple drivers might use drm_mode_config_helper_suspend().
- *
- * This function is safe to call even when there are no connectors present.
- * Setup will be retried on the next hotplug event.
- *
- * The fbdev is destroyed by drm_dev_unregister().
- */
-void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{
-	struct drm_fb_helper *fb_helper;
-	int ret;
-
-	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-	if (!fb_helper)
-		return;
-	drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_shmem_helper_funcs);
-
-	ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_shmem_client_funcs);
-	if (ret) {
-		drm_err(dev, "Failed to register client: %d\n", ret);
-		goto err_drm_client_init;
-	}
-
-	drm_client_register(&fb_helper->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(fb_helper);
-	kfree(fb_helper);
-}
-EXPORT_SYMBOL(drm_fbdev_shmem_setup);
diff --git a/include/drm/drm_fbdev_shmem.h b/include/drm/drm_fbdev_shmem.h
index 3a5d1efa9d55..2fc708964d75 100644
--- a/include/drm/drm_fbdev_shmem.h
+++ b/include/drm/drm_fbdev_shmem.h
@@ -3,7 +3,6 @@
 #ifndef DRM_FBDEV_SHMEM_H
 #define DRM_FBDEV_SHMEM_H
 
-struct drm_device;
 struct drm_fb_helper;
 struct drm_fb_helper_surface_size;
 
@@ -13,12 +12,7 @@ int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 
 #define DRM_FBDEV_SHMEM_DRIVER_OPS \
 	.fbdev_probe = drm_fbdev_shmem_driver_fbdev_probe
-
-void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp);
 #else
-static inline void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{ }
-
 #define DRM_FBDEV_SHMEM_DRIVER_OPS \
 	.fbdev_probe = NULL
 #endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 64/86] drm/fbdev-ttm: Support struct drm_driver.fbdev_probe
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (62 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 63/86] drm/fbdev-shmem: Remove obsolete setup function Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 65/86] drm/amdgpu: Run DRM default client setup Thomas Zimmermann
                   ` (24 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

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 TTM-
based DRM drivers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fbdev_ttm.c | 142 +++++++++++++++++---------------
 include/drm/drm_fbdev_ttm.h     |  13 +++
 2 files changed, 90 insertions(+), 65 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_ttm.c b/drivers/gpu/drm/drm_fbdev_ttm.c
index 119ffb28aaf9..d799cbe944cd 100644
--- a/drivers/gpu/drm/drm_fbdev_ttm.c
+++ b/drivers/gpu/drm/drm_fbdev_ttm.c
@@ -71,71 +71,7 @@ static const struct fb_ops drm_fbdev_ttm_fb_ops = {
 static int drm_fbdev_ttm_helper_fb_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;
-	struct drm_client_buffer *buffer;
-	struct fb_info *info;
-	size_t screen_size;
-	void *screen_buffer;
-	u32 format;
-	int ret;
-
-	drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
-		    sizes->surface_width, sizes->surface_height,
-		    sizes->surface_bpp);
-
-	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
-					     sizes->surface_depth);
-	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
-					       sizes->surface_height, format);
-	if (IS_ERR(buffer))
-		return PTR_ERR(buffer);
-
-	fb_helper->buffer = buffer;
-	fb_helper->fb = buffer->fb;
-
-	screen_size = buffer->gem->size;
-	screen_buffer = vzalloc(screen_size);
-	if (!screen_buffer) {
-		ret = -ENOMEM;
-		goto err_drm_client_framebuffer_delete;
-	}
-
-	info = drm_fb_helper_alloc_info(fb_helper);
-	if (IS_ERR(info)) {
-		ret = PTR_ERR(info);
-		goto err_vfree;
-	}
-
-	drm_fb_helper_fill_info(info, fb_helper, sizes);
-
-	info->fbops = &drm_fbdev_ttm_fb_ops;
-
-	/* screen */
-	info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
-	info->screen_buffer = screen_buffer;
-	info->fix.smem_len = screen_size;
-
-	/* deferred I/O */
-	fb_helper->fbdefio.delay = HZ / 20;
-	fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
-
-	info->fbdefio = &fb_helper->fbdefio;
-	ret = fb_deferred_io_init(info);
-	if (ret)
-		goto err_drm_fb_helper_release_info;
-
-	return 0;
-
-err_drm_fb_helper_release_info:
-	drm_fb_helper_release_info(fb_helper);
-err_vfree:
-	vfree(screen_buffer);
-err_drm_client_framebuffer_delete:
-	fb_helper->fb = NULL;
-	fb_helper->buffer = NULL;
-	drm_client_framebuffer_delete(buffer);
-	return ret;
+	return drm_fbdev_ttm_driver_fbdev_probe(fb_helper, sizes);
 }
 
 static void drm_fbdev_ttm_damage_blit_real(struct drm_fb_helper *fb_helper,
@@ -240,6 +176,82 @@ static const struct drm_fb_helper_funcs drm_fbdev_ttm_helper_funcs = {
 	.fb_dirty = drm_fbdev_ttm_helper_fb_dirty,
 };
 
+/*
+ * struct drm_driver
+ */
+
+int drm_fbdev_ttm_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;
+	struct drm_client_buffer *buffer;
+	struct fb_info *info;
+	size_t screen_size;
+	void *screen_buffer;
+	u32 format;
+	int ret;
+
+	drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
+		    sizes->surface_width, sizes->surface_height,
+		    sizes->surface_bpp);
+
+	format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp,
+					     sizes->surface_depth);
+	buffer = drm_client_framebuffer_create(client, sizes->surface_width,
+					       sizes->surface_height, format);
+	if (IS_ERR(buffer))
+		return PTR_ERR(buffer);
+
+	fb_helper->funcs = &drm_fbdev_ttm_helper_funcs;
+	fb_helper->buffer = buffer;
+	fb_helper->fb = buffer->fb;
+
+	screen_size = buffer->gem->size;
+	screen_buffer = vzalloc(screen_size);
+	if (!screen_buffer) {
+		ret = -ENOMEM;
+		goto err_drm_client_framebuffer_delete;
+	}
+
+	info = drm_fb_helper_alloc_info(fb_helper);
+	if (IS_ERR(info)) {
+		ret = PTR_ERR(info);
+		goto err_vfree;
+	}
+
+	drm_fb_helper_fill_info(info, fb_helper, sizes);
+
+	info->fbops = &drm_fbdev_ttm_fb_ops;
+
+	/* screen */
+	info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
+	info->screen_buffer = screen_buffer;
+	info->fix.smem_len = screen_size;
+
+	/* deferred I/O */
+	fb_helper->fbdefio.delay = HZ / 20;
+	fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
+
+	info->fbdefio = &fb_helper->fbdefio;
+	ret = fb_deferred_io_init(info);
+	if (ret)
+		goto err_drm_fb_helper_release_info;
+
+	return 0;
+
+err_drm_fb_helper_release_info:
+	drm_fb_helper_release_info(fb_helper);
+err_vfree:
+	vfree(screen_buffer);
+err_drm_client_framebuffer_delete:
+	fb_helper->fb = NULL;
+	fb_helper->buffer = NULL;
+	drm_client_framebuffer_delete(buffer);
+	return ret;
+}
+EXPORT_SYMBOL(drm_fbdev_ttm_driver_fbdev_probe);
+
 static void drm_fbdev_ttm_client_unregister(struct drm_client_dev *client)
 {
 	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
diff --git a/include/drm/drm_fbdev_ttm.h b/include/drm/drm_fbdev_ttm.h
index 9e6c3bdf3537..243685d02eb1 100644
--- a/include/drm/drm_fbdev_ttm.h
+++ b/include/drm/drm_fbdev_ttm.h
@@ -3,11 +3,24 @@
 #ifndef DRM_FBDEV_TTM_H
 #define DRM_FBDEV_TTM_H
 
+#include <linux/stddef.h>
+
 struct drm_device;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
+int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+				     struct drm_fb_helper_surface_size *sizes);
+
+#define DRM_FBDEV_TTM_DRIVER_OPS \
+	.fbdev_probe = drm_fbdev_ttm_driver_fbdev_probe
+
 void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp);
 #else
+#define DRM_FBDEV_TTM_DRIVER_OPS \
+	.fbdev_probe = NULL
+
 static inline void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
 { }
 #endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 65/86] drm/amdgpu: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (63 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 64/86] drm/fbdev-ttm: Support struct drm_driver.fbdev_probe Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 66/86] drm/bochs: " Thomas Zimmermann
                   ` (23 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Alex Deucher, Christian König, Xinhui Pan

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.

The amdgpu driver specifies a preferred color mode depending on
the available video memory, with a default of 32. Adapt this for
the new client interface.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: Xinhui Pan <Xinhui.Pan@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 5dd39e6c6223..7bf488708727 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -23,6 +23,7 @@
  */
 
 #include <drm/amdgpu_drm.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_ttm.h>
 #include <drm/drm_gem.h>
@@ -2343,9 +2344,9 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
 	    !list_empty(&adev_to_drm(adev)->mode_config.connector_list)) {
 		/* select 8 bpp console on low vram cards */
 		if (adev->gmc.real_vram_size <= (32*1024*1024))
-			drm_fbdev_ttm_setup(adev_to_drm(adev), 8);
+			drm_client_setup(adev_to_drm(adev), drm_format_info(DRM_FORMAT_C8));
 		else
-			drm_fbdev_ttm_setup(adev_to_drm(adev), 32);
+			drm_client_setup(adev_to_drm(adev), NULL);
 	}
 
 	ret = amdgpu_debugfs_init(adev);
@@ -2957,6 +2958,7 @@ static const struct drm_driver amdgpu_kms_driver = {
 	.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
 	.dumb_create = amdgpu_mode_dumb_create,
 	.dumb_map_offset = amdgpu_mode_dumb_mmap,
+	DRM_FBDEV_TTM_DRIVER_OPS,
 	.fops = &amdgpu_driver_kms_fops,
 	.release = &amdgpu_driver_release_kms,
 #ifdef CONFIG_PROC_FS
@@ -2983,6 +2985,7 @@ const struct drm_driver amdgpu_partition_driver = {
 	.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
 	.dumb_create = amdgpu_mode_dumb_create,
 	.dumb_map_offset = amdgpu_mode_dumb_mmap,
+	DRM_FBDEV_TTM_DRIVER_OPS,
 	.fops = &amdgpu_driver_kms_fops,
 	.release = &amdgpu_driver_release_kms,
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 66/86] drm/bochs: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (64 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 65/86] drm/amdgpu: Run DRM default client setup Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 67/86] drm/hisilicon/hibmc: " Thomas Zimmermann
                   ` (22 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Gerd Hoffmann

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.

The bochs driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Gerd Hoffmann <kraxel@redhat.com>
---
 drivers/gpu/drm/tiny/bochs.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tiny/bochs.c b/drivers/gpu/drm/tiny/bochs.c
index 31fc5d839e10..fb69f70043d5 100644
--- a/drivers/gpu/drm/tiny/bochs.c
+++ b/drivers/gpu/drm/tiny/bochs.c
@@ -5,6 +5,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_fbdev_ttm.h>
@@ -604,6 +605,7 @@ static const struct drm_driver bochs_driver = {
 	.major			= 1,
 	.minor			= 0,
 	DRM_GEM_VRAM_DRIVER,
+	DRM_FBDEV_TTM_DRIVER_OPS,
 };
 
 /* ---------------------------------------------------------------------- */
@@ -667,7 +669,7 @@ static int bochs_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent
 	if (ret)
 		goto err_hw_fini;
 
-	drm_fbdev_ttm_setup(dev, 32);
+	drm_client_setup(dev, NULL);
 	return ret;
 
 err_hw_fini:
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 67/86] drm/hisilicon/hibmc: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (65 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 66/86] drm/bochs: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 68/86] drm/loongson: " Thomas Zimmermann
                   ` (21 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Xinliang Liu, Tian Tao, Xinwei Kong,
	Sumit Semwal, Yongqin Liu, John Stultz

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.

The hibmc driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Xinliang Liu <xinliang.liu@linaro.org>
Cc: Tian Tao <tiantao6@hisilicon.com>
Cc: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Yongqin Liu <yongqin.liu@linaro.org>
Cc: John Stultz <jstultz@google.com>
---
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 9f9b19ea0587..866a9ecaf8b9 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -16,6 +16,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_ttm.h>
 #include <drm/drm_gem_framebuffer_helper.h>
@@ -63,6 +64,7 @@ static const struct drm_driver hibmc_driver = {
 	.debugfs_init		= drm_vram_mm_debugfs_init,
 	.dumb_create            = hibmc_dumb_create,
 	.dumb_map_offset        = drm_gem_ttm_dumb_map_offset,
+	DRM_FBDEV_TTM_DRIVER_OPS,
 };
 
 static int __maybe_unused hibmc_pm_suspend(struct device *dev)
@@ -339,7 +341,7 @@ static int hibmc_pci_probe(struct pci_dev *pdev,
 		goto err_unload;
 	}
 
-	drm_fbdev_ttm_setup(dev, 32);
+	drm_client_setup(dev, NULL);
 
 	return 0;
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 68/86] drm/loongson: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (66 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 67/86] drm/hisilicon/hibmc: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-19  9:00   ` [68/86] " Sui Jingfeng
  2024-08-16 12:23 ` [PATCH 69/86] drm/nouveau: " Thomas Zimmermann
                   ` (20 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Sui Jingfeng

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.

The loongson driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Sui Jingfeng <suijingfeng@loongson.cn>
---
 drivers/gpu/drm/loongson/lsdc_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/loongson/lsdc_drv.c b/drivers/gpu/drm/loongson/lsdc_drv.c
index adc7344d2f80..a19dce35c839 100644
--- a/drivers/gpu/drm/loongson/lsdc_drv.c
+++ b/drivers/gpu/drm/loongson/lsdc_drv.c
@@ -9,6 +9,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_ttm.h>
 #include <drm/drm_gem_framebuffer_helper.h>
@@ -47,6 +48,7 @@ static const struct drm_driver lsdc_drm_driver = {
 	.dumb_create = lsdc_dumb_create,
 	.dumb_map_offset = lsdc_dumb_map_offset,
 	.gem_prime_import_sg_table = lsdc_prime_import_sg_table,
+	DRM_FBDEV_TTM_DRIVER_OPS,
 };
 
 static const struct drm_mode_config_funcs lsdc_mode_config_funcs = {
@@ -314,7 +316,7 @@ static int lsdc_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		return ret;
 
-	drm_fbdev_ttm_setup(ddev, 32);
+	drm_client_setup(ddev, NULL);
 
 	return 0;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 69/86] drm/nouveau: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (67 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 68/86] drm/loongson: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 13:59   ` Danilo Krummrich
  2024-08-16 12:23 ` [PATCH 70/86] drm/qxl: " Thomas Zimmermann
                   ` (19 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Karol Herbst, Lyude Paul, Danilo Krummrich

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.

The nouveau driver specifies a preferred color mode depending on
the available video memory, with a default of 32. Adapt this for
the new client interface.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Karol Herbst <kherbst@redhat.com>
Cc: Lyude Paul <lyude@redhat.com>
Cc: Danilo Krummrich <dakr@redhat.com>
---
 drivers/gpu/drm/nouveau/nouveau_drm.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 4a9a9b9c3935..445ebedf70d6 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -31,6 +31,7 @@
 #include <linux/dynamic_debug.h>
 
 #include <drm/drm_aperture.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_ttm.h>
 #include <drm/drm_gem_ttm_helper.h>
@@ -873,9 +874,9 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
 		goto fail_pci;
 
 	if (drm->client.device.info.ram_size <= 32 * 1024 * 1024)
-		drm_fbdev_ttm_setup(drm->dev, 8);
+		drm_client_setup(drm->dev, drm_format_info(DRM_FORMAT_C8));
 	else
-		drm_fbdev_ttm_setup(drm->dev, 32);
+		drm_client_setup(drm->dev, NULL);
 
 	quirk_broken_nv_runpm(pdev);
 	return 0;
@@ -1317,6 +1318,8 @@ driver_stub = {
 	.dumb_create = nouveau_display_dumb_create,
 	.dumb_map_offset = drm_gem_ttm_dumb_map_offset,
 
+	DRM_FBDEV_TTM_DRIVER_OPS,
+
 	.name = DRIVER_NAME,
 	.desc = DRIVER_DESC,
 #ifdef GIT_REVISION
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 70/86] drm/qxl: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (68 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 69/86] drm/nouveau: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 71/86] drm/vboxvideo: " Thomas Zimmermann
                   ` (18 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Dave Airlie, Gerd Hoffmann

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.

The qxl driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
---
 drivers/gpu/drm/qxl/qxl_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index 5eb3f5719fdf..4ef1c134d6dd 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -36,6 +36,7 @@
 #include <drm/drm.h>
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_ttm.h>
 #include <drm/drm_file.h>
@@ -118,7 +119,7 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		goto modeset_cleanup;
 
-	drm_fbdev_ttm_setup(&qdev->ddev, 32);
+	drm_client_setup(&qdev->ddev, NULL);
 	return 0;
 
 modeset_cleanup:
@@ -293,6 +294,7 @@ static struct drm_driver qxl_driver = {
 	.debugfs_init = qxl_debugfs_init,
 #endif
 	.gem_prime_import_sg_table = qxl_gem_prime_import_sg_table,
+	DRM_FBDEV_TTM_DRIVER_OPS,
 	.fops = &qxl_fops,
 	.ioctls = qxl_ioctls,
 	.num_ioctls = ARRAY_SIZE(qxl_ioctls),
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 71/86] drm/vboxvideo: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (69 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 70/86] drm/qxl: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 72/86] drm/vmwgfx: " Thomas Zimmermann
                   ` (17 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Hans de Goede

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.

The vboxvideo driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Hans de Goede <hdegoede@redhat.com>
---
 drivers/gpu/drm/vboxvideo/vbox_drv.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vboxvideo/vbox_drv.c b/drivers/gpu/drm/vboxvideo/vbox_drv.c
index ef36834c8673..49dc337b3e01 100644
--- a/drivers/gpu/drm/vboxvideo/vbox_drv.c
+++ b/drivers/gpu/drm/vboxvideo/vbox_drv.c
@@ -13,6 +13,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_ttm.h>
 #include <drm/drm_file.h>
@@ -80,7 +81,7 @@ static int vbox_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		goto err_irq_fini;
 
-	drm_fbdev_ttm_setup(&vbox->ddev, 32);
+	drm_client_setup(&vbox->ddev, NULL);
 
 	return 0;
 
@@ -193,6 +194,7 @@ static const struct drm_driver driver = {
 	.patchlevel = DRIVER_PATCHLEVEL,
 
 	DRM_GEM_VRAM_DRIVER,
+	DRM_FBDEV_TTM_DRIVER_OPS,
 };
 
 drm_module_pci_driver_if_modeset(vbox_pci_driver, vbox_modeset);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 72/86] drm/vmwgfx: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (70 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 71/86] drm/vboxvideo: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 73/86] drm/fbdev-ttm: Remove obsolete setup function Thomas Zimmermann
                   ` (16 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Zack Rusin,
	Broadcom internal kernel review list

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Zack Rusin <zack.rusin@broadcom.com>
Cc: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 50ad3105c16e..f9009f5a5aef 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -36,6 +36,7 @@
 #include "ttm_object.h"
 
 #include <drm/drm_aperture.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_ttm.h>
 #include <drm/drm_gem_ttm_helper.h>
@@ -1628,6 +1629,8 @@ static const struct drm_driver driver = {
 	.prime_handle_to_fd = vmw_prime_handle_to_fd,
 	.gem_prime_import_sg_table = vmw_prime_import_sg_table,
 
+	DRM_FBDEV_TTM_DRIVER_OPS,
+
 	.fops = &vmwgfx_driver_fops,
 	.name = VMWGFX_DRIVER_NAME,
 	.desc = VMWGFX_DRIVER_DESC,
@@ -1679,7 +1682,7 @@ static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	vmw_fifo_resource_inc(vmw);
 	vmw_svga_enable(vmw);
-	drm_fbdev_ttm_setup(&vmw->drm,  0);
+	drm_client_setup(&vmw->drm, NULL);
 
 	vmw_debugfs_gem_init(vmw);
 	vmw_debugfs_resource_managers_init(vmw);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 73/86] drm/fbdev-ttm: Remove obsolete setup function
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (71 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 72/86] drm/vmwgfx: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 74/86] drm/armada: Run DRM default client setup Thomas Zimmermann
                   ` (15 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

The old setup function drm_fbdev_ttm_setup() is unused. Remove it and
its internal callbacks. New drivers should call drm_client_setup()
instead.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fbdev_ttm.c | 119 --------------------------------
 include/drm/drm_fbdev_ttm.h     |   6 --
 2 files changed, 125 deletions(-)

diff --git a/drivers/gpu/drm/drm_fbdev_ttm.c b/drivers/gpu/drm/drm_fbdev_ttm.c
index d799cbe944cd..73d35d59590c 100644
--- a/drivers/gpu/drm/drm_fbdev_ttm.c
+++ b/drivers/gpu/drm/drm_fbdev_ttm.c
@@ -65,15 +65,6 @@ static const struct fb_ops drm_fbdev_ttm_fb_ops = {
 	.fb_destroy	= drm_fbdev_ttm_fb_destroy,
 };
 
-/*
- * This function uses the client API to create a framebuffer backed by a dumb buffer.
- */
-static int drm_fbdev_ttm_helper_fb_probe(struct drm_fb_helper *fb_helper,
-					     struct drm_fb_helper_surface_size *sizes)
-{
-	return drm_fbdev_ttm_driver_fbdev_probe(fb_helper, sizes);
-}
-
 static void drm_fbdev_ttm_damage_blit_real(struct drm_fb_helper *fb_helper,
 					   struct drm_clip_rect *clip,
 					   struct iosys_map *dst)
@@ -172,7 +163,6 @@ static int drm_fbdev_ttm_helper_fb_dirty(struct drm_fb_helper *helper,
 }
 
 static const struct drm_fb_helper_funcs drm_fbdev_ttm_helper_funcs = {
-	.fb_probe = drm_fbdev_ttm_helper_fb_probe,
 	.fb_dirty = drm_fbdev_ttm_helper_fb_dirty,
 };
 
@@ -251,112 +241,3 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 	return ret;
 }
 EXPORT_SYMBOL(drm_fbdev_ttm_driver_fbdev_probe);
-
-static void drm_fbdev_ttm_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int drm_fbdev_ttm_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int drm_fbdev_ttm_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs drm_fbdev_ttm_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= drm_fbdev_ttm_client_unregister,
-	.restore	= drm_fbdev_ttm_client_restore,
-	.hotplug	= drm_fbdev_ttm_client_hotplug,
-};
-
-/**
- * drm_fbdev_ttm_setup() - Setup fbdev emulation for TTM-based drivers
- * @dev: DRM device
- * @preferred_bpp: Preferred bits per pixel for the device.
- *
- * This function sets up fbdev emulation for TTM-based drivers that support
- * dumb buffers with a virtual address and that can be mmap'ed.
- * drm_fbdev_ttm_setup() shall be called after the DRM driver registered
- * the new DRM device with drm_dev_register().
- *
- * Restore, hotplug events and teardown are all taken care of. Drivers that do
- * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
- * Simple drivers might use drm_mode_config_helper_suspend().
- *
- * In order to provide fixed mmap-able memory ranges, fbdev emulation
- * uses a shadow buffer in system memory. The implementation blits the shadow
- * fbdev buffer onto the real buffer in regular intervals.
- *
- * This function is safe to call even when there are no connectors present.
- * Setup will be retried on the next hotplug event.
- *
- * The fbdev is destroyed by drm_dev_unregister().
- */
-void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{
-	struct drm_fb_helper *fb_helper;
-	int ret;
-
-	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-	if (!fb_helper)
-		return;
-	drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_ttm_helper_funcs);
-
-	ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_ttm_client_funcs);
-	if (ret) {
-		drm_err(dev, "Failed to register client: %d\n", ret);
-		goto err_drm_client_init;
-	}
-
-	drm_client_register(&fb_helper->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(fb_helper);
-	kfree(fb_helper);
-	return;
-}
-EXPORT_SYMBOL(drm_fbdev_ttm_setup);
diff --git a/include/drm/drm_fbdev_ttm.h b/include/drm/drm_fbdev_ttm.h
index 243685d02eb1..ad4a10bb4c78 100644
--- a/include/drm/drm_fbdev_ttm.h
+++ b/include/drm/drm_fbdev_ttm.h
@@ -5,7 +5,6 @@
 
 #include <linux/stddef.h>
 
-struct drm_device;
 struct drm_fb_helper;
 struct drm_fb_helper_surface_size;
 
@@ -15,14 +14,9 @@ int drm_fbdev_ttm_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
 
 #define DRM_FBDEV_TTM_DRIVER_OPS \
 	.fbdev_probe = drm_fbdev_ttm_driver_fbdev_probe
-
-void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp);
 #else
 #define DRM_FBDEV_TTM_DRIVER_OPS \
 	.fbdev_probe = NULL
-
-static inline void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{ }
 #endif
 
 #endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 74/86] drm/armada: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (72 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 73/86] drm/fbdev-ttm: Remove obsolete setup function Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 75/86] drm/exynos-drm: " Thomas Zimmermann
                   ` (14 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Russell King

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

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.

The armada driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Russell King <linux@armlinux.org.uk>
---
 drivers/gpu/drm/armada/armada_drm.h   |  11 ++-
 drivers/gpu/drm/armada/armada_drv.c   |   4 +-
 drivers/gpu/drm/armada/armada_fbdev.c | 115 ++------------------------
 3 files changed, 17 insertions(+), 113 deletions(-)

diff --git a/drivers/gpu/drm/armada/armada_drm.h b/drivers/gpu/drm/armada/armada_drm.h
index c303e8c7ff6c..3c0ff221a43b 100644
--- a/drivers/gpu/drm/armada/armada_drm.h
+++ b/drivers/gpu/drm/armada/armada_drm.h
@@ -16,6 +16,8 @@ struct armada_crtc;
 struct armada_gem_object;
 struct clk;
 struct drm_display_mode;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 
 static inline void
 armada_updatel(uint32_t val, uint32_t mask, void __iomem *ptr)
@@ -74,10 +76,13 @@ struct armada_private {
 #define drm_to_armada_dev(dev) container_of(dev, struct armada_private, drm)
 
 #if defined(CONFIG_DRM_FBDEV_EMULATION)
-void armada_fbdev_setup(struct drm_device *dev);
+int armada_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,
+				    struct drm_fb_helper_surface_size *sizes);
+#define ARMADA_FBDEV_DRIVER_OPS \
+	.fbdev_probe = armada_fbdev_driver_fbdev_probe
 #else
-static inline void armada_fbdev_setup(struct drm_device *dev)
-{ }
+#define ARMADA_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 #endif
 
 int armada_overlay_plane_create(struct drm_device *, unsigned long);
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c
index e51ecc4f7ef4..3dc5f0499e4c 100644
--- a/drivers/gpu/drm/armada/armada_drv.c
+++ b/drivers/gpu/drm/armada/armada_drv.c
@@ -12,6 +12,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
@@ -39,6 +40,7 @@ DEFINE_DRM_GEM_FOPS(armada_drm_fops);
 static const struct drm_driver armada_drm_driver = {
 	.gem_prime_import	= armada_gem_prime_import,
 	.dumb_create		= armada_gem_dumb_create,
+	ARMADA_FBDEV_DRIVER_OPS,
 	.major			= 1,
 	.minor			= 0,
 	.name			= "armada-drm",
@@ -137,7 +139,7 @@ static int armada_drm_bind(struct device *dev)
 	armada_drm_debugfs_init(priv->drm.primary);
 #endif
 
-	armada_fbdev_setup(&priv->drm);
+	drm_client_setup(&priv->drm, NULL);
 
 	return 0;
 
diff --git a/drivers/gpu/drm/armada/armada_fbdev.c b/drivers/gpu/drm/armada/armada_fbdev.c
index d223176912b6..1ad87bb0bad9 100644
--- a/drivers/gpu/drm/armada/armada_fbdev.c
+++ b/drivers/gpu/drm/armada/armada_fbdev.c
@@ -39,8 +39,10 @@ static const struct fb_ops armada_fb_ops = {
 	.fb_destroy	= armada_fbdev_fb_destroy,
 };
 
-static int armada_fbdev_create(struct drm_fb_helper *fbh,
-	struct drm_fb_helper_surface_size *sizes)
+static const struct drm_fb_helper_funcs armada_fbdev_helper_funcs;
+
+int armada_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,
+				    struct drm_fb_helper_surface_size *sizes)
 {
 	struct drm_device *dev = fbh->dev;
 	struct drm_mode_fb_cmd2 mode;
@@ -98,6 +100,7 @@ static int armada_fbdev_create(struct drm_fb_helper *fbh,
 	info->fix.smem_len = obj->obj.size;
 	info->screen_size = obj->obj.size;
 	info->screen_base = ptr;
+	fbh->funcs = &armada_fbdev_helper_funcs;
 	fbh->fb = &dfb->fb;
 
 	drm_fb_helper_fill_info(info, fbh, sizes);
@@ -108,113 +111,7 @@ static int armada_fbdev_create(struct drm_fb_helper *fbh,
 
 	return 0;
 
- err_fballoc:
+err_fballoc:
 	dfb->fb.funcs->destroy(&dfb->fb);
 	return ret;
 }
-
-static int armada_fb_probe(struct drm_fb_helper *fbh,
-	struct drm_fb_helper_surface_size *sizes)
-{
-	int ret = 0;
-
-	if (!fbh->fb) {
-		ret = armada_fbdev_create(fbh, sizes);
-		if (ret == 0)
-			ret = 1;
-	}
-	return ret;
-}
-
-static const struct drm_fb_helper_funcs armada_fb_helper_funcs = {
-	.fb_probe	= armada_fb_probe,
-};
-
-/*
- * Fbdev client and struct drm_client_funcs
- */
-
-static void armada_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fbh = drm_fb_helper_from_client(client);
-
-	if (fbh->info) {
-		drm_fb_helper_unregister_info(fbh);
-	} else {
-		drm_client_release(&fbh->client);
-		drm_fb_helper_unprepare(fbh);
-		kfree(fbh);
-	}
-}
-
-static int armada_fbdev_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int armada_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fbh = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fbh);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fbh);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fbh);
-err_drm_err:
-	drm_err(dev, "armada: Failed to setup fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs armada_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= armada_fbdev_client_unregister,
-	.restore	= armada_fbdev_client_restore,
-	.hotplug	= armada_fbdev_client_hotplug,
-};
-
-void armada_fbdev_setup(struct drm_device *dev)
-{
-	struct drm_fb_helper *fbh;
-	int ret;
-
-	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-	fbh = kzalloc(sizeof(*fbh), GFP_KERNEL);
-	if (!fbh)
-		return;
-	drm_fb_helper_prepare(dev, fbh, 32, &armada_fb_helper_funcs);
-
-	ret = drm_client_init(dev, &fbh->client, "fbdev", &armada_fbdev_client_funcs);
-	if (ret) {
-		drm_err(dev, "Failed to register client: %d\n", ret);
-		goto err_drm_client_init;
-	}
-
-	drm_client_register(&fbh->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(fbh);
-	kfree(fbh);
-	return;
-}
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 75/86] drm/exynos-drm: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (73 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 74/86] drm/armada: Run DRM default client setup Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 76/86] drm/gma500: " Thomas Zimmermann
                   ` (13 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Inki Dae, Seung-Woo Kim, Kyungmin Park

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

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.

The exynos-drm driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Inki Dae <inki.dae@samsung.com>
Cc: Seung-Woo Kim <sw0312.kim@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_drv.c   |   4 +-
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 101 ++--------------------
 drivers/gpu/drm/exynos/exynos_drm_fbdev.h |  15 ++--
 3 files changed, 19 insertions(+), 101 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 7c59e1164a48..2a466d8179f4 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -15,6 +15,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_fourcc.h>
@@ -111,6 +112,7 @@ static const struct drm_driver exynos_drm_driver = {
 	.dumb_create		= exynos_drm_gem_dumb_create,
 	.gem_prime_import	= exynos_drm_gem_prime_import,
 	.gem_prime_import_sg_table	= exynos_drm_gem_prime_import_sg_table,
+	EXYNOS_DRM_FBDEV_DRIVER_OPS,
 	.ioctls			= exynos_ioctls,
 	.num_ioctls		= ARRAY_SIZE(exynos_ioctls),
 	.fops			= &exynos_drm_driver_fops,
@@ -288,7 +290,7 @@ static int exynos_drm_bind(struct device *dev)
 	if (ret < 0)
 		goto err_cleanup_poll;
 
-	exynos_drm_fbdev_setup(drm);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index a379c8ca435a..73fa7b77d8d0 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -22,9 +22,6 @@
 #include "exynos_drm_fb.h"
 #include "exynos_drm_fbdev.h"
 
-#define MAX_CONNECTOR		4
-#define PREFERRED_BPP		32
-
 static int exynos_drm_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
 	struct drm_fb_helper *helper = info->par;
@@ -87,8 +84,11 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
 	return 0;
 }
 
-static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
-				    struct drm_fb_helper_surface_size *sizes)
+static const struct drm_fb_helper_funcs exynos_drm_fbdev_helper_funcs = {
+};
+
+int exynos_drm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+					struct drm_fb_helper_surface_size *sizes)
 {
 	struct exynos_drm_gem *exynos_gem;
 	struct drm_device *dev = helper->dev;
@@ -120,6 +120,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
 		ret = PTR_ERR(helper->fb);
 		goto err_destroy_gem;
 	}
+	helper->funcs = &exynos_drm_fbdev_helper_funcs;
 
 	ret = exynos_drm_fbdev_update(helper, sizes, exynos_gem);
 	if (ret < 0)
@@ -134,93 +135,3 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
 	exynos_drm_gem_destroy(exynos_gem);
 	return ret;
 }
-
-static const struct drm_fb_helper_funcs exynos_drm_fb_helper_funcs = {
-	.fb_probe =	exynos_drm_fbdev_create,
-};
-
-/*
- * struct drm_client
- */
-
-static void exynos_drm_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int exynos_drm_fbdev_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int exynos_drm_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs exynos_drm_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= exynos_drm_fbdev_client_unregister,
-	.restore	= exynos_drm_fbdev_client_restore,
-	.hotplug	= exynos_drm_fbdev_client_hotplug,
-};
-
-void exynos_drm_fbdev_setup(struct drm_device *dev)
-{
-	struct drm_fb_helper *fb_helper;
-	int ret;
-
-	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-	if (!fb_helper)
-		return;
-	drm_fb_helper_prepare(dev, fb_helper, PREFERRED_BPP, &exynos_drm_fb_helper_funcs);
-
-	ret = drm_client_init(dev, &fb_helper->client, "fbdev", &exynos_drm_fbdev_client_funcs);
-	if (ret)
-		goto err_drm_client_init;
-
-	drm_client_register(&fb_helper->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(fb_helper);
-	kfree(fb_helper);
-}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h
index 1e1dea627cd9..02a9201abea3 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h
@@ -11,12 +11,17 @@
 #ifndef _EXYNOS_DRM_FBDEV_H_
 #define _EXYNOS_DRM_FBDEV_H_
 
-#ifdef CONFIG_DRM_FBDEV_EMULATION
-void exynos_drm_fbdev_setup(struct drm_device *dev);
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
+
+#if defined(CONFIG_DRM_FBDEV_EMULATION)
+int exynos_drm_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,
+					struct drm_fb_helper_surface_size *sizes);
+#define EXYNOS_DRM_FBDEV_DRIVER_OPS \
+	.fbdev_probe = exynos_drm_fbdev_driver_fbdev_probe
 #else
-static inline void exynos_drm_fbdev_setup(struct drm_device *dev)
-{
-}
+#define EXYNOS_DRM_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 #endif
 
 #endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 76/86] drm/gma500: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (74 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 75/86] drm/exynos-drm: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 77/86] drm/msm: " Thomas Zimmermann
                   ` (12 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Patrik Jakobsson

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
---
 drivers/gpu/drm/gma500/fbdev.c   | 100 +++----------------------------
 drivers/gpu/drm/gma500/psb_drv.c |   4 +-
 drivers/gpu/drm/gma500/psb_drv.h |  12 +++-
 3 files changed, 19 insertions(+), 97 deletions(-)

diff --git a/drivers/gpu/drm/gma500/fbdev.c b/drivers/gpu/drm/gma500/fbdev.c
index 98b44974d42d..8edefea2ef59 100644
--- a/drivers/gpu/drm/gma500/fbdev.c
+++ b/drivers/gpu/drm/gma500/fbdev.c
@@ -143,12 +143,15 @@ static const struct fb_ops psb_fbdev_fb_ops = {
 	.fb_destroy = psb_fbdev_fb_destroy,
 };
 
+static const struct drm_fb_helper_funcs psb_fbdev_fb_helper_funcs = {
+};
+
 /*
- * struct drm_fb_helper_funcs
+ * struct drm_driver
  */
 
-static int psb_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
-			      struct drm_fb_helper_surface_size *sizes)
+int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+				 struct drm_fb_helper_surface_size *sizes)
 {
 	struct drm_device *dev = fb_helper->dev;
 	struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
@@ -206,6 +209,7 @@ static int psb_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
 		goto err_drm_gem_object_put;
 	}
 
+	fb_helper->funcs = &psb_fbdev_fb_helper_funcs;
 	fb_helper->fb = fb;
 
 	info = drm_fb_helper_alloc_info(fb_helper);
@@ -246,93 +250,3 @@ static int psb_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
 	drm_gem_object_put(obj);
 	return ret;
 }
-
-static const struct drm_fb_helper_funcs psb_fbdev_fb_helper_funcs = {
-	.fb_probe = psb_fbdev_fb_probe,
-};
-
-/*
- * struct drm_client_funcs and setup code
- */
-
-static void psb_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_fb_helper_unprepare(fb_helper);
-		drm_client_release(&fb_helper->client);
-		kfree(fb_helper);
-	}
-}
-
-static int psb_fbdev_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int psb_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "Failed to setup gma500 fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs psb_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= psb_fbdev_client_unregister,
-	.restore	= psb_fbdev_client_restore,
-	.hotplug	= psb_fbdev_client_hotplug,
-};
-
-void psb_fbdev_setup(struct drm_psb_private *dev_priv)
-{
-	struct drm_device *dev = &dev_priv->dev;
-	struct drm_fb_helper *fb_helper;
-	int ret;
-
-	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-	if (!fb_helper)
-		return;
-	drm_fb_helper_prepare(dev, fb_helper, 32, &psb_fbdev_fb_helper_funcs);
-
-	ret = drm_client_init(dev, &fb_helper->client, "fbdev-gma500", &psb_fbdev_client_funcs);
-	if (ret) {
-		drm_err(dev, "Failed to register client: %d\n", ret);
-		goto err_drm_fb_helper_unprepare;
-	}
-
-	drm_client_register(&fb_helper->client);
-
-	return;
-
-err_drm_fb_helper_unprepare:
-	drm_fb_helper_unprepare(fb_helper);
-	kfree(fb_helper);
-}
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index 8b64f61ffaf9..43deefef6ad2 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -20,6 +20,7 @@
 #include <acpi/video.h>
 
 #include <drm/drm.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
@@ -475,7 +476,7 @@ static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		return ret;
 
-	psb_fbdev_setup(dev_priv);
+	drm_client_setup(dev, NULL);
 
 	return 0;
 }
@@ -506,6 +507,7 @@ static const struct drm_driver driver = {
 	.num_ioctls = ARRAY_SIZE(psb_ioctls),
 
 	.dumb_create = psb_gem_dumb_create,
+	PSB_FBDEV_DRIVER_OPS,
 	.ioctls = psb_ioctls,
 	.fops = &psb_gem_fops,
 	.name = DRIVER_NAME,
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
index bddf89b82fec..de62cbfcdc72 100644
--- a/drivers/gpu/drm/gma500/psb_drv.h
+++ b/drivers/gpu/drm/gma500/psb_drv.h
@@ -184,6 +184,9 @@
 #define KSEL_BYPASS_25 6
 #define KSEL_BYPASS_83_100 7
 
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
+
 struct opregion_header;
 struct opregion_acpi;
 struct opregion_swsci;
@@ -597,10 +600,13 @@ struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
 
 /* fbdev */
 #if defined(CONFIG_DRM_FBDEV_EMULATION)
-void psb_fbdev_setup(struct drm_psb_private *dev_priv);
+int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+				 struct drm_fb_helper_surface_size *sizes);
+#define PSB_FBDEV_DRIVER_OPS \
+	.fbdev_probe = psb_fbdev_driver_fbdev_probe
 #else
-static inline void psb_fbdev_setup(struct drm_psb_private *dev_priv)
-{ }
+#define PSB_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 #endif
 
 /* backlight.c */
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 77/86] drm/msm: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (75 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 76/86] drm/gma500: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 78/86] drm/radeon: " Thomas Zimmermann
                   ` (11 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Rob Clark, Abhinav Kumar, Dmitry Baryshkov,
	Sean Paul, Marijn Suijten

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

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.

The msm driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Abhinav Kumar <quic_abhinavk@quicinc.com>
Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Sean Paul <sean@poorly.run>
Cc: Marijn Suijten <marijn.suijten@somainline.org>
---
 drivers/gpu/drm/msm/msm_drv.c   |   4 +-
 drivers/gpu/drm/msm/msm_drv.h   |  13 ++-
 drivers/gpu/drm/msm/msm_fbdev.c | 144 ++++++--------------------------
 3 files changed, 38 insertions(+), 123 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 9c33f4e3f822..22fe0716d18b 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -10,6 +10,7 @@
 #include <linux/of_address.h>
 #include <linux/uaccess.h>
 
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
@@ -292,7 +293,7 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
 
 	if (priv->kms_init) {
 		drm_kms_helper_poll_init(ddev);
-		msm_fbdev_setup(ddev);
+		drm_client_setup(ddev, NULL);
 	}
 
 	return 0;
@@ -903,6 +904,7 @@ static const struct drm_driver msm_driver = {
 #ifdef CONFIG_DEBUG_FS
 	.debugfs_init       = msm_debugfs_init,
 #endif
+	MSM_FBDEV_DRIVER_OPS,
 	.show_fdinfo        = msm_show_fdinfo,
 	.ioctls             = msm_ioctls,
 	.num_ioctls         = ARRAY_SIZE(msm_ioctls),
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index be016d7b4ef1..63675a3b7097 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -40,6 +40,9 @@ extern struct fault_attr fail_gem_iova;
 #  define should_fail(attr, size) 0
 #endif
 
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
+
 struct msm_kms;
 struct msm_gpu;
 struct msm_mmu;
@@ -298,11 +301,13 @@ struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev,
 		int w, int h, int p, uint32_t format);
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
-void msm_fbdev_setup(struct drm_device *dev);
+int msm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				 struct drm_fb_helper_surface_size *sizes);
+#define MSM_FBDEV_DRIVER_OPS \
+	.fbdev_probe = msm_fbdev_driver_fbdev_probe
 #else
-static inline void msm_fbdev_setup(struct drm_device *dev)
-{
-}
+#define MSM_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 #endif
 
 struct hdmi;
diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c
index 030bedac632d..c62249b1ab3d 100644
--- a/drivers/gpu/drm/msm/msm_fbdev.c
+++ b/drivers/gpu/drm/msm/msm_fbdev.c
@@ -65,8 +65,31 @@ static const struct fb_ops msm_fb_ops = {
 	.fb_destroy = msm_fbdev_fb_destroy,
 };
 
-static int msm_fbdev_create(struct drm_fb_helper *helper,
-		struct drm_fb_helper_surface_size *sizes)
+static int msm_fbdev_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 msm_fbdev_helper_funcs = {
+	.fb_dirty = msm_fbdev_fb_dirty,
+};
+
+int msm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				 struct drm_fb_helper_surface_size *sizes)
 {
 	struct drm_device *dev = helper->dev;
 	struct msm_drm_private *priv = dev->dev_private;
@@ -114,6 +137,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
 
 	DBG("fbi=%p, dev=%p", fbi, dev);
 
+	helper->funcs = &msm_fbdev_helper_funcs;
 	helper->fb = fb;
 
 	fbi->fbops = &msm_fb_ops;
@@ -138,119 +162,3 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
 	drm_framebuffer_remove(fb);
 	return ret;
 }
-
-static int msm_fbdev_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 msm_fb_helper_funcs = {
-	.fb_probe = msm_fbdev_create,
-	.fb_dirty = msm_fbdev_fb_dirty,
-};
-
-/*
- * struct drm_client
- */
-
-static void msm_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int msm_fbdev_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int msm_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs msm_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= msm_fbdev_client_unregister,
-	.restore	= msm_fbdev_client_restore,
-	.hotplug	= msm_fbdev_client_hotplug,
-};
-
-/* initialize fbdev helper */
-void msm_fbdev_setup(struct drm_device *dev)
-{
-	struct drm_fb_helper *helper;
-	int ret;
-
-	if (!fbdev)
-		return;
-
-	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-	helper = kzalloc(sizeof(*helper), GFP_KERNEL);
-	if (!helper)
-		return;
-	drm_fb_helper_prepare(dev, helper, 32, &msm_fb_helper_funcs);
-
-	ret = drm_client_init(dev, &helper->client, "fbdev", &msm_fbdev_client_funcs);
-	if (ret) {
-		drm_err(dev, "Failed to register client: %d\n", ret);
-		goto err_drm_fb_helper_unprepare;
-	}
-
-	drm_client_register(&helper->client);
-
-	return;
-
-err_drm_fb_helper_unprepare:
-	drm_fb_helper_unprepare(helper);
-	kfree(helper);
-}
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 78/86] drm/radeon: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (76 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 77/86] drm/msm: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 79/86] drm/tegra: " Thomas Zimmermann
                   ` (10 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Alex Deucher, Christian König, Xinhui Pan

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

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.

The radeon driver specifies a preferred color mode depending on
the available video memory, with a default of 32. Adapt this for
the new client interface.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: Xinhui Pan <Xinhui.Pan@amd.com>
---
 drivers/gpu/drm/radeon/radeon_drv.c   |  13 ++-
 drivers/gpu/drm/radeon/radeon_fbdev.c | 114 ++------------------------
 drivers/gpu/drm/radeon/radeon_mode.h  |  12 ++-
 3 files changed, 26 insertions(+), 113 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index 7bf08164140e..08ccfec6f6ec 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -38,8 +38,10 @@
 #include <linux/pci.h>
 
 #include <drm/drm_aperture.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
+#include <drm/drm_fourcc.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_pciids.h>
@@ -260,6 +262,7 @@ static int radeon_pci_probe(struct pci_dev *pdev,
 {
 	unsigned long flags = 0;
 	struct drm_device *dev;
+	struct radeon_device *rdev;
 	int ret;
 
 	if (!ent)
@@ -314,7 +317,13 @@ static int radeon_pci_probe(struct pci_dev *pdev,
 	if (ret)
 		goto err_agp;
 
-	radeon_fbdev_setup(dev->dev_private);
+	rdev = dev->dev_private;
+	if (rdev->mc.real_vram_size <= (8 * 1024 * 1024))
+		drm_client_setup(dev, drm_format_info(DRM_FORMAT_C8));
+	else if (ASIC_IS_RN50(rdev) || rdev->mc.real_vram_size <= (32 * 1024 * 1024))
+		drm_client_setup(dev, drm_format_info(DRM_FORMAT_RGB565));
+	else
+		drm_client_setup(dev, NULL);
 
 	return 0;
 
@@ -581,6 +590,8 @@ static const struct drm_driver kms_driver = {
 
 	.gem_prime_import_sg_table = radeon_gem_prime_import_sg_table,
 
+	RADEON_FBDEV_DRIVER_OPS,
+
 	.name = DRIVER_NAME,
 	.desc = DRIVER_DESC,
 	.date = DRIVER_DATE,
diff --git a/drivers/gpu/drm/radeon/radeon_fbdev.c b/drivers/gpu/drm/radeon/radeon_fbdev.c
index 02bf25759059..4c81f9a87c16 100644
--- a/drivers/gpu/drm/radeon/radeon_fbdev.c
+++ b/drivers/gpu/drm/radeon/radeon_fbdev.c
@@ -198,12 +198,11 @@ static const struct fb_ops radeon_fbdev_fb_ops = {
 	.fb_destroy = radeon_fbdev_fb_destroy,
 };
 
-/*
- * Fbdev helpers and struct drm_fb_helper_funcs
- */
+static const struct drm_fb_helper_funcs radeon_fbdev_fb_helper_funcs = {
+};
 
-static int radeon_fbdev_fb_helper_fb_probe(struct drm_fb_helper *fb_helper,
-					   struct drm_fb_helper_surface_size *sizes)
+int radeon_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+				    struct drm_fb_helper_surface_size *sizes)
 {
 	struct radeon_device *rdev = fb_helper->dev->dev_private;
 	struct drm_mode_fb_cmd2 mode_cmd = { };
@@ -243,6 +242,7 @@ static int radeon_fbdev_fb_helper_fb_probe(struct drm_fb_helper *fb_helper,
 	}
 
 	/* setup helper */
+	fb_helper->funcs = &radeon_fbdev_fb_helper_funcs;
 	fb_helper->fb = fb;
 
 	/* okay we have an object now allocate the framebuffer */
@@ -288,110 +288,6 @@ static int radeon_fbdev_fb_helper_fb_probe(struct drm_fb_helper *fb_helper,
 	return ret;
 }
 
-static const struct drm_fb_helper_funcs radeon_fbdev_fb_helper_funcs = {
-	.fb_probe = radeon_fbdev_fb_helper_fb_probe,
-};
-
-/*
- * Fbdev client and struct drm_client_funcs
- */
-
-static void radeon_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = fb_helper->dev;
-	struct radeon_device *rdev = dev->dev_private;
-
-	if (fb_helper->info) {
-		vga_switcheroo_client_fb_set(rdev->pdev, NULL);
-		drm_helper_force_disable_all(dev);
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int radeon_fbdev_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-	vga_switcheroo_process_delayed_switch();
-
-	return 0;
-}
-
-static int radeon_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	struct radeon_device *rdev = dev->dev_private;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	vga_switcheroo_client_fb_set(rdev->pdev, fb_helper->info);
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "Failed to setup radeon fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs radeon_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= radeon_fbdev_client_unregister,
-	.restore	= radeon_fbdev_client_restore,
-	.hotplug	= radeon_fbdev_client_hotplug,
-};
-
-void radeon_fbdev_setup(struct radeon_device *rdev)
-{
-	struct drm_fb_helper *fb_helper;
-	int bpp_sel = 32;
-	int ret;
-
-	if (rdev->mc.real_vram_size <= (8 * 1024 * 1024))
-		bpp_sel = 8;
-	else if (ASIC_IS_RN50(rdev) || rdev->mc.real_vram_size <= (32 * 1024 * 1024))
-		bpp_sel = 16;
-
-	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-	if (!fb_helper)
-		return;
-	drm_fb_helper_prepare(rdev->ddev, fb_helper, bpp_sel, &radeon_fbdev_fb_helper_funcs);
-
-	ret = drm_client_init(rdev->ddev, &fb_helper->client, "radeon-fbdev",
-			      &radeon_fbdev_client_funcs);
-	if (ret) {
-		drm_err(rdev->ddev, "Failed to register client: %d\n", ret);
-		goto err_drm_client_init;
-	}
-
-	drm_client_register(&fb_helper->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(fb_helper);
-	kfree(fb_helper);
-}
-
 void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state)
 {
 	if (rdev->ddev->fb_helper)
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index e0a5af180801..8e916729f393 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -38,6 +38,9 @@
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
 
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
+
 struct edid;
 struct radeon_bo;
 struct radeon_device;
@@ -935,12 +938,15 @@ void dce8_program_fmt(struct drm_encoder *encoder);
 
 /* fbdev layer */
 #if defined(CONFIG_DRM_FBDEV_EMULATION)
-void radeon_fbdev_setup(struct radeon_device *rdev);
+int radeon_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
+				    struct drm_fb_helper_surface_size *sizes);
+#define RADEON_FBDEV_DRIVER_OPS \
+	.fbdev_probe = radeon_fbdev_driver_fbdev_probe
 void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state);
 bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj);
 #else
-static inline void radeon_fbdev_setup(struct radeon_device *rdev)
-{ }
+#define RADEON_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 static inline void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state)
 { }
 static inline bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 79/86] drm/tegra: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (77 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 78/86] drm/radeon: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 80/86] drm/i915: Remove struct drm_fb_helper from struct intel_fbdev Thomas Zimmermann
                   ` (9 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Thierry Reding, Mikko Perttunen,
	Jonathan Hunter

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

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.

The tegra driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Mikko Perttunen <mperttunen@nvidia.com>
Cc: Jonathan Hunter <jonathanh@nvidia.com>
---
 drivers/gpu/drm/tegra/drm.c   |  5 +-
 drivers/gpu/drm/tegra/drm.h   | 12 +++--
 drivers/gpu/drm/tegra/fbdev.c | 98 +++--------------------------------
 3 files changed, 19 insertions(+), 96 deletions(-)

diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index d9f0728c3afd..6186524cf1a4 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -15,6 +15,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_client_setup.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fourcc.h>
@@ -891,6 +892,8 @@ static const struct drm_driver tegra_drm_driver = {
 
 	.dumb_create = tegra_bo_dumb_create,
 
+	TEGRA_FBDEV_DRIVER_OPS,
+
 	.ioctls = tegra_drm_ioctls,
 	.num_ioctls = ARRAY_SIZE(tegra_drm_ioctls),
 	.fops = &tegra_drm_fops,
@@ -1268,7 +1271,7 @@ static int host1x_drm_probe(struct host1x_device *dev)
 	if (err < 0)
 		goto hub;
 
-	tegra_fbdev_setup(drm);
+	drm_client_setup(drm, NULL);
 
 	return 0;
 
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 682011166a8f..0bc8d6625aef 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -25,6 +25,9 @@
 /* XXX move to include/uapi/drm/drm_fourcc.h? */
 #define DRM_FORMAT_MOD_NVIDIA_SECTOR_LAYOUT BIT_ULL(22)
 
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
+
 struct edid;
 struct reset_control;
 
@@ -190,10 +193,13 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
 					const struct drm_mode_fb_cmd2 *cmd);
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
-void tegra_fbdev_setup(struct drm_device *drm);
+int tegra_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				   struct drm_fb_helper_surface_size *sizes);
+#define TEGRA_FBDEV_DRIVER_OPS \
+	.fbdev_probe = tegra_fbdev_driver_fbdev_probe
 #else
-static inline void tegra_fbdev_setup(struct drm_device *drm)
-{ }
+#define TEGRA_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 #endif
 
 extern struct platform_driver tegra_display_hub_driver;
diff --git a/drivers/gpu/drm/tegra/fbdev.c b/drivers/gpu/drm/tegra/fbdev.c
index db6eaac3d30e..cd9d798f8870 100644
--- a/drivers/gpu/drm/tegra/fbdev.c
+++ b/drivers/gpu/drm/tegra/fbdev.c
@@ -66,8 +66,11 @@ static const struct fb_ops tegra_fb_ops = {
 	.fb_destroy = tegra_fbdev_fb_destroy,
 };
 
-static int tegra_fbdev_probe(struct drm_fb_helper *helper,
-			     struct drm_fb_helper_surface_size *sizes)
+static const struct drm_fb_helper_funcs tegra_fbdev_helper_funcs = {
+};
+
+int tegra_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				   struct drm_fb_helper_surface_size *sizes)
 {
 	struct tegra_drm *tegra = helper->dev->dev_private;
 	struct drm_device *drm = helper->dev;
@@ -112,6 +115,7 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper,
 		return PTR_ERR(fb);
 	}
 
+	helper->funcs = &tegra_fbdev_helper_funcs;
 	helper->fb = fb;
 	helper->info = info;
 
@@ -144,93 +148,3 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper,
 	drm_framebuffer_remove(fb);
 	return err;
 }
-
-static const struct drm_fb_helper_funcs tegra_fb_helper_funcs = {
-	.fb_probe = tegra_fbdev_probe,
-};
-
-/*
- * struct drm_client
- */
-
-static void tegra_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int tegra_fbdev_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int tegra_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	if (!drm_drv_uses_atomic_modeset(dev))
-		drm_helper_disable_unused_functions(dev);
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs tegra_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= tegra_fbdev_client_unregister,
-	.restore	= tegra_fbdev_client_restore,
-	.hotplug	= tegra_fbdev_client_hotplug,
-};
-
-void tegra_fbdev_setup(struct drm_device *dev)
-{
-	struct drm_fb_helper *helper;
-	int ret;
-
-	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-	helper = kzalloc(sizeof(*helper), GFP_KERNEL);
-	if (!helper)
-		return;
-	drm_fb_helper_prepare(dev, helper, 32, &tegra_fb_helper_funcs);
-
-	ret = drm_client_init(dev, &helper->client, "fbdev", &tegra_fbdev_client_funcs);
-	if (ret)
-		goto err_drm_client_init;
-
-	drm_client_register(&helper->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(helper);
-	kfree(helper);
-}
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 80/86] drm/i915: Remove struct drm_fb_helper from struct intel_fbdev
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (78 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 79/86] drm/tegra: " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 81/86] drm/i915: Move custom restore code into separate callback Thomas Zimmermann
                   ` (8 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Jani Nikula, Rodrigo Vivi, Joonas Lahtinen,
	Tvrtko Ursulin, Lucas De Marchi, Thomas Hellström

Store instances of drm_fb_helper and struct intel_fbdev separately.
This will allow i915 to use the common fbdev client, which allocates
its own instance of struct drm_fb_helper.

There is at most one instance of each per DRM device, so both can be
referenced directly from the i915 and DRM device structures. A later
patchset might rework the common fbdev client to allow for storing
both, drm_fb_helper and intel_fbdev, together in the same place.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tursulin@ursulin.net>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_fbdev.c | 86 ++++++++++++----------
 1 file changed, 47 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index 49a1ac4f5491..9ece62783ce1 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -42,6 +42,7 @@
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_managed.h>
 
 #include "gem/i915_gem_mman.h"
 #include "gem/i915_gem_object.h"
@@ -55,7 +56,6 @@
 #include "intel_frontbuffer.h"
 
 struct intel_fbdev {
-	struct drm_fb_helper helper;
 	struct intel_framebuffer *fb;
 	struct i915_vma *vma;
 	unsigned long vma_flags;
@@ -70,11 +70,6 @@ struct intel_fbdev {
 	struct mutex hpd_lock;
 };
 
-static struct intel_fbdev *to_intel_fbdev(struct drm_fb_helper *fb_helper)
-{
-	return container_of(fb_helper, struct intel_fbdev, helper);
-}
-
 static struct intel_frontbuffer *to_frontbuffer(struct intel_fbdev *ifbdev)
 {
 	return ifbdev->fb->frontbuffer;
@@ -91,7 +86,9 @@ FB_GEN_DEFAULT_DEFERRED_IOMEM_OPS(intel_fbdev,
 
 static int intel_fbdev_set_par(struct fb_info *info)
 {
-	struct intel_fbdev *ifbdev = to_intel_fbdev(info->par);
+	struct drm_fb_helper *fb_helper = info->par;
+	struct drm_i915_private *i915 = to_i915(fb_helper->client.dev);
+	struct intel_fbdev *ifbdev = i915->display.fbdev.fbdev;
 	int ret;
 
 	ret = drm_fb_helper_set_par(info);
@@ -103,7 +100,9 @@ static int intel_fbdev_set_par(struct fb_info *info)
 
 static int intel_fbdev_blank(int blank, struct fb_info *info)
 {
-	struct intel_fbdev *ifbdev = to_intel_fbdev(info->par);
+	struct drm_fb_helper *fb_helper = info->par;
+	struct drm_i915_private *i915 = to_i915(fb_helper->client.dev);
+	struct intel_fbdev *ifbdev = i915->display.fbdev.fbdev;
 	int ret;
 
 	ret = drm_fb_helper_blank(blank, info);
@@ -116,7 +115,9 @@ static int intel_fbdev_blank(int blank, struct fb_info *info)
 static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
 				   struct fb_info *info)
 {
-	struct intel_fbdev *ifbdev = to_intel_fbdev(info->par);
+	struct drm_fb_helper *fb_helper = info->par;
+	struct drm_i915_private *i915 = to_i915(fb_helper->client.dev);
+	struct intel_fbdev *ifbdev = i915->display.fbdev.fbdev;
 	int ret;
 
 	ret = drm_fb_helper_pan_display(var, info);
@@ -128,8 +129,8 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
 
 static int intel_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
-	struct intel_fbdev *fbdev = to_intel_fbdev(info->par);
-	struct drm_gem_object *bo = drm_gem_fb_get_obj(&fbdev->fb->base, 0);
+	struct drm_fb_helper *fb_helper = info->par;
+	struct drm_gem_object *bo = drm_gem_fb_get_obj(fb_helper->fb, 0);
 	struct drm_i915_gem_object *obj = to_intel_bo(bo);
 
 	return i915_gem_fb_mmap(obj, vma);
@@ -138,9 +139,11 @@ static int intel_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
 static void intel_fbdev_fb_destroy(struct fb_info *info)
 {
 	struct drm_fb_helper *fb_helper = info->par;
-	struct intel_fbdev *ifbdev = container_of(fb_helper, struct intel_fbdev, helper);
+	struct drm_device *dev = fb_helper->client.dev;
+	struct drm_i915_private *i915 = to_i915(dev);
+	struct intel_fbdev *ifbdev = i915->display.fbdev.fbdev;
 
-	drm_fb_helper_fini(&ifbdev->helper);
+	drm_fb_helper_fini(fb_helper);
 
 	/*
 	 * We rely on the object-free to release the VMA pinning for
@@ -148,11 +151,11 @@ static void intel_fbdev_fb_destroy(struct fb_info *info)
 	 * trying to rectify all the possible error paths leading here.
 	 */
 	intel_fb_unpin_vma(ifbdev->vma, ifbdev->vma_flags);
-	drm_framebuffer_remove(&ifbdev->fb->base);
+	drm_framebuffer_remove(fb_helper->fb);
 
 	drm_client_release(&fb_helper->client);
-	drm_fb_helper_unprepare(&ifbdev->helper);
-	kfree(ifbdev);
+	drm_fb_helper_unprepare(fb_helper);
+	kfree(fb_helper);
 }
 
 __diag_push();
@@ -175,10 +178,10 @@ __diag_pop();
 static int intelfb_create(struct drm_fb_helper *helper,
 			  struct drm_fb_helper_surface_size *sizes)
 {
-	struct intel_fbdev *ifbdev = to_intel_fbdev(helper);
-	struct intel_framebuffer *fb = ifbdev->fb;
-	struct drm_device *dev = helper->dev;
+	struct drm_device *dev = helper->client.dev;
 	struct drm_i915_private *dev_priv = to_i915(dev);
+	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
+	struct intel_framebuffer *fb = ifbdev->fb;
 	const struct i915_gtt_view view = {
 		.type = I915_GTT_VIEW_NORMAL,
 	};
@@ -243,7 +246,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
 		goto out_unpin;
 	}
 
-	ifbdev->helper.fb = &fb->base;
+	helper->fb = &fb->base;
 
 	info->fbops = &intelfb_ops;
 
@@ -253,7 +256,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
 	if (ret)
 		goto out_unpin;
 
-	drm_fb_helper_fill_info(info, &ifbdev->helper, sizes);
+	drm_fb_helper_fill_info(info, dev->fb_helper, sizes);
 
 	/* If the object is shmemfs backed, it will have given us zeroed pages.
 	 * If the object is stolen however, it will be full of whatever
@@ -468,6 +471,7 @@ static void intel_fbdev_suspend_worker(struct work_struct *work)
 static void intel_fbdev_hpd_set_suspend(struct drm_i915_private *i915, int state)
 {
 	struct intel_fbdev *ifbdev = i915->display.fbdev.fbdev;
+	struct drm_device *dev = &i915->drm;
 	bool send_hpd = false;
 
 	mutex_lock(&ifbdev->hpd_lock);
@@ -478,7 +482,7 @@ static void intel_fbdev_hpd_set_suspend(struct drm_i915_private *i915, int state
 
 	if (send_hpd) {
 		drm_dbg_kms(&i915->drm, "Handling delayed fbcon HPD event\n");
-		drm_fb_helper_hotplug_event(&ifbdev->helper);
+		drm_fb_helper_hotplug_event(dev->fb_helper);
 	}
 }
 
@@ -497,7 +501,7 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
 	if (!ifbdev->vma)
 		goto set_suspend;
 
-	info = ifbdev->helper.info;
+	info = dev->fb_helper->info;
 
 	if (synchronous) {
 		/* Flush any pending work to turn the console on, and then
@@ -536,7 +540,7 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
 	    !i915_gem_object_is_shmem(intel_fb_obj(&ifbdev->fb->base)))
 		memset_io(info->screen_base, 0, info->screen_size);
 
-	drm_fb_helper_set_suspend(&ifbdev->helper, state);
+	drm_fb_helper_set_suspend(dev->fb_helper, state);
 	console_unlock();
 
 set_suspend:
@@ -556,8 +560,8 @@ static int intel_fbdev_output_poll_changed(struct drm_device *dev)
 	ifbdev->hpd_waiting = true;
 	mutex_unlock(&ifbdev->hpd_lock);
 
-	if (send_hpd && (ifbdev->vma || ifbdev->helper.deferred_setup))
-		drm_fb_helper_hotplug_event(&ifbdev->helper);
+	if (send_hpd && (ifbdev->vma || dev->fb_helper->deferred_setup))
+		drm_fb_helper_hotplug_event(dev->fb_helper);
 
 	return 0;
 }
@@ -565,6 +569,7 @@ static int intel_fbdev_output_poll_changed(struct drm_device *dev)
 static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
 {
 	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
+	struct drm_device *dev = &dev_priv->drm;
 	int ret;
 
 	if (!ifbdev)
@@ -573,7 +578,7 @@ static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
 	if (!ifbdev->vma)
 		return -ENOMEM;
 
-	ret = drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper);
+	ret = drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper);
 	if (ret)
 		return ret;
 
@@ -656,45 +661,48 @@ void intel_fbdev_setup(struct drm_i915_private *i915)
 {
 	struct drm_device *dev = &i915->drm;
 	struct intel_fbdev *ifbdev;
+	struct drm_fb_helper *fb_helper;
 	int ret;
 
 	if (!HAS_DISPLAY(i915))
 		return;
 
-	ifbdev = kzalloc(sizeof(*ifbdev), GFP_KERNEL);
+	ifbdev = drmm_kzalloc(dev, 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);
 	mutex_init(&ifbdev->hpd_lock);
-	if (intel_fbdev_init_bios(dev, ifbdev))
-		ifbdev->helper.preferred_bpp = ifbdev->preferred_bpp;
-	else
-		ifbdev->preferred_bpp = ifbdev->helper.preferred_bpp;
+	if (!intel_fbdev_init_bios(dev, ifbdev))
+		ifbdev->preferred_bpp = 32;
+
+	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
+	if (!fb_helper)
+		return;
+	drm_fb_helper_prepare(dev, fb_helper, ifbdev->preferred_bpp, &intel_fb_helper_funcs);
 
-	ret = drm_client_init(dev, &ifbdev->helper.client, "intel-fbdev",
+	ret = drm_client_init(dev, &fb_helper->client, "intel-fbdev",
 			      &intel_fbdev_client_funcs);
 	if (ret) {
 		drm_err(dev, "Failed to register client: %d\n", ret);
 		goto err_drm_fb_helper_unprepare;
 	}
 
-	drm_client_register(&ifbdev->helper.client);
+	drm_client_register(&fb_helper->client);
 
 	return;
 
 err_drm_fb_helper_unprepare:
-	drm_fb_helper_unprepare(&ifbdev->helper);
+	drm_fb_helper_unprepare(dev->fb_helper);
 	mutex_destroy(&ifbdev->hpd_lock);
-	kfree(ifbdev);
+	kfree(fb_helper);
 }
 
 struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev)
 {
-	if (!fbdev || !fbdev->helper.fb)
+	if (!fbdev)
 		return NULL;
 
-	return to_intel_framebuffer(fbdev->helper.fb);
+	return fbdev->fb;
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 81/86] drm/i915: Move custom restore code into separate callback
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (79 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 80/86] drm/i915: Remove struct drm_fb_helper from struct intel_fbdev Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 82/86] drm/i915: Move custom hotplug " Thomas Zimmermann
                   ` (7 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Jani Nikula, Rodrigo Vivi, Joonas Lahtinen,
	Tvrtko Ursulin, Lucas De Marchi, Thomas Hellström

i915's fbdev contains additional code for restoring the client that
cannot be ported to the common fbdev client. Introduce the callback
struct drm_fb_helper.fb_restore and implement it for i915. The fbdev
helpers invoke the callback after restoring the fbdev client.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tursulin@ursulin.net>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/drm_fb_helper.c            |  3 +++
 drivers/gpu/drm/i915/display/intel_fbdev.c | 12 ++++++++++--
 include/drm/drm_fb_helper.h                | 13 +++++++++++++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 31e255c2b04a..d9e539b0fd1a 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -245,6 +245,9 @@ __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
 	if (do_delayed)
 		drm_fb_helper_hotplug_event(fb_helper);
 
+	if (fb_helper->funcs->fb_restore)
+		fb_helper->funcs->fb_restore(fb_helper);
+
 	return ret;
 }
 
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index 9ece62783ce1..c03fb00002a4 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -296,9 +296,19 @@ static int intelfb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *cli
 	return 0;
 }
 
+static void intelfb_restore(struct drm_fb_helper *fb_helper)
+{
+	struct drm_device *dev = fb_helper->client.dev;
+	struct drm_i915_private *dev_priv = to_i915(dev);
+	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
+
+	intel_fbdev_invalidate(ifbdev);
+}
+
 static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
 	.fb_probe = intelfb_create,
 	.fb_dirty = intelfb_dirty,
+	.fb_restore = intelfb_restore,
 };
 
 /*
@@ -582,8 +592,6 @@ static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
 	if (ret)
 		return ret;
 
-	intel_fbdev_invalidate(ifbdev);
-
 	return 0;
 }
 
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
index 699f2790b9ac..34eb77c18a13 100644
--- a/include/drm/drm_fb_helper.h
+++ b/include/drm/drm_fb_helper.h
@@ -99,6 +99,19 @@ struct drm_fb_helper_funcs {
 	 * 0 on success, or an error code otherwise.
 	 */
 	int (*fb_dirty)(struct drm_fb_helper *helper, struct drm_clip_rect *clip);
+
+	/**
+	 * @fb_restore:
+	 *
+	 * Driver callback to restore internal fbdev state. If set, fbdev
+	 * emulation will invoke this callback after restoring the display
+	 * mode.
+	 *
+	 * Only for i915. Do not use in new code.
+	 *
+	 * TODO: Fix i915 to not require this callback.
+	 */
+	void (*fb_restore)(struct drm_fb_helper *helper);
 };
 
 /**
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 82/86] drm/i915: Move custom hotplug code into separate callback
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (80 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 81/86] drm/i915: Move custom restore code into separate callback Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-19  8:52   ` [82/86] " Sui Jingfeng
  2024-08-16 12:23 ` [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup Thomas Zimmermann
                   ` (6 subsequent siblings)
  88 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Jani Nikula, Rodrigo Vivi, Joonas Lahtinen,
	Tvrtko Ursulin, Lucas De Marchi, Thomas Hellström

i915's fbdev contains additional code for hotplugging a display that
cannot be ported to the common fbdev client. Introduce the callback
struct drm_fb_helper.fb_hotplug and implement it for i915. The fbdev
helpers invoke the callback before handing the hotplug event.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tursulin@ursulin.net>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/drm_fb_helper.c            |  6 +++
 drivers/gpu/drm/i915/display/intel_fbdev.c | 43 ++++++++++++----------
 include/drm/drm_fb_helper.h                | 13 +++++++
 3 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index d9e539b0fd1a..92926cb02dfb 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1938,6 +1938,12 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
 	if (!drm_fbdev_emulation || !fb_helper)
 		return 0;
 
+	if (fb_helper->funcs->fb_hotplug) {
+		err = fb_helper->funcs->fb_hotplug(fb_helper);
+		if (err)
+			return err;
+	}
+
 	mutex_lock(&fb_helper->lock);
 	if (fb_helper->deferred_setup) {
 		err = __drm_fb_helper_initial_config_and_unlock(fb_helper);
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index c03fb00002a4..abe77ef0bd84 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -305,10 +305,32 @@ static void intelfb_restore(struct drm_fb_helper *fb_helper)
 	intel_fbdev_invalidate(ifbdev);
 }
 
+static int intelfb_hotplug(struct drm_fb_helper *fb_helper)
+{
+	struct drm_device *dev = fb_helper->client.dev;
+	struct drm_i915_private *dev_priv = to_i915(dev);
+	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
+	bool send_hpd;
+
+	if (!ifbdev)
+		return -EINVAL;
+
+	mutex_lock(&ifbdev->hpd_lock);
+	send_hpd = !ifbdev->hpd_suspended;
+	ifbdev->hpd_waiting = true;
+	mutex_unlock(&ifbdev->hpd_lock);
+
+	if (!send_hpd || !(ifbdev->vma || dev->fb_helper->deferred_setup))
+		return -EAGAIN;
+
+	return 0;
+}
+
 static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
 	.fb_probe = intelfb_create,
 	.fb_dirty = intelfb_dirty,
 	.fb_restore = intelfb_restore,
+	.fb_hotplug = intelfb_hotplug,
 };
 
 /*
@@ -557,25 +579,6 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
 	intel_fbdev_hpd_set_suspend(dev_priv, state);
 }
 
-static int intel_fbdev_output_poll_changed(struct drm_device *dev)
-{
-	struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev;
-	bool send_hpd;
-
-	if (!ifbdev)
-		return -EINVAL;
-
-	mutex_lock(&ifbdev->hpd_lock);
-	send_hpd = !ifbdev->hpd_suspended;
-	ifbdev->hpd_waiting = true;
-	mutex_unlock(&ifbdev->hpd_lock);
-
-	if (send_hpd && (ifbdev->vma || dev->fb_helper->deferred_setup))
-		drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	return 0;
-}
-
 static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
 {
 	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
@@ -637,7 +640,7 @@ static int intel_fbdev_client_hotplug(struct drm_client_dev *client)
 	int ret;
 
 	if (dev->fb_helper)
-		return intel_fbdev_output_poll_changed(dev);
+		return drm_fb_helper_hotplug_event(fb_helper);
 
 	ret = drm_fb_helper_init(dev, fb_helper);
 	if (ret)
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
index 34eb77c18a13..3dcb9a60e408 100644
--- a/include/drm/drm_fb_helper.h
+++ b/include/drm/drm_fb_helper.h
@@ -112,6 +112,19 @@ struct drm_fb_helper_funcs {
 	 * TODO: Fix i915 to not require this callback.
 	 */
 	void (*fb_restore)(struct drm_fb_helper *helper);
+
+	/**
+	 * @fb_hotplug:
+	 *
+	 * Driver callback to prepare hotplug event. If set, fbdev
+	 * emulation will invoke this callback before sending a hotplug
+	 * event.
+	 *
+	 * Only for i915. Do not use in new code.
+	 *
+	 * TODO: Fix i915 to not require this callback.
+	 */
+	int (*fb_hotplug)(struct drm_fb_helper *helper);
 };
 
 /**
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (81 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 82/86] drm/i915: Move custom hotplug " Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 13:18   ` Jani Nikula
                     ` (2 more replies)
  2024-08-16 12:23 ` [PATCH 84/86] drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev Thomas Zimmermann
                   ` (5 subsequent siblings)
  88 siblings, 3 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Jani Nikula, Rodrigo Vivi, Joonas Lahtinen,
	Tvrtko Ursulin, Lucas De Marchi, Thomas Hellström

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

Call drm_client_setup_with_color_mode() 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.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tursulin@ursulin.net>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_fbdev.c | 216 ++++++---------------
 drivers/gpu/drm/i915/display/intel_fbdev.h |   8 +
 drivers/gpu/drm/i915/i915_driver.c         |   2 +
 drivers/gpu/drm/xe/xe_device.c             |   3 +
 4 files changed, 68 insertions(+), 161 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index abe77ef0bd84..50b8657e55d7 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -37,6 +37,7 @@
 #include <linux/tty.h>
 #include <linux/vga_switcheroo.h>
 
+#include <drm/drm_client_setup.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
@@ -175,8 +176,55 @@ static const struct fb_ops intelfb_ops = {
 
 __diag_pop();
 
-static int intelfb_create(struct drm_fb_helper *helper,
-			  struct drm_fb_helper_surface_size *sizes)
+static int intelfb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
+{
+	if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+		return 0;
+
+	if (helper->fb->funcs->dirty)
+		return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+
+	return 0;
+}
+
+static void intelfb_restore(struct drm_fb_helper *fb_helper)
+{
+	struct drm_device *dev = fb_helper->client.dev;
+	struct drm_i915_private *dev_priv = to_i915(dev);
+	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
+
+	intel_fbdev_invalidate(ifbdev);
+}
+
+static int intelfb_hotplug(struct drm_fb_helper *fb_helper)
+{
+	struct drm_device *dev = fb_helper->client.dev;
+	struct drm_i915_private *dev_priv = to_i915(dev);
+	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
+	bool send_hpd;
+
+	if (!ifbdev)
+		return -EINVAL;
+
+	mutex_lock(&ifbdev->hpd_lock);
+	send_hpd = !ifbdev->hpd_suspended;
+	ifbdev->hpd_waiting = true;
+	mutex_unlock(&ifbdev->hpd_lock);
+
+	if (!send_hpd || !(ifbdev->vma || dev->fb_helper->deferred_setup))
+		return -EAGAIN;
+
+	return 0;
+}
+
+static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
+	.fb_dirty = intelfb_dirty,
+	.fb_restore = intelfb_restore,
+	.fb_hotplug = intelfb_hotplug,
+};
+
+int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				   struct drm_fb_helper_surface_size *sizes)
 {
 	struct drm_device *dev = helper->client.dev;
 	struct drm_i915_private *dev_priv = to_i915(dev);
@@ -246,6 +294,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
 		goto out_unpin;
 	}
 
+	helper->funcs = &intel_fb_helper_funcs;
 	helper->fb = &fb->base;
 
 	info->fbops = &intelfb_ops;
@@ -285,54 +334,6 @@ static int intelfb_create(struct drm_fb_helper *helper,
 	return ret;
 }
 
-static int intelfb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
-{
-	if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
-		return 0;
-
-	if (helper->fb->funcs->dirty)
-		return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
-
-	return 0;
-}
-
-static void intelfb_restore(struct drm_fb_helper *fb_helper)
-{
-	struct drm_device *dev = fb_helper->client.dev;
-	struct drm_i915_private *dev_priv = to_i915(dev);
-	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
-
-	intel_fbdev_invalidate(ifbdev);
-}
-
-static int intelfb_hotplug(struct drm_fb_helper *fb_helper)
-{
-	struct drm_device *dev = fb_helper->client.dev;
-	struct drm_i915_private *dev_priv = to_i915(dev);
-	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
-	bool send_hpd;
-
-	if (!ifbdev)
-		return -EINVAL;
-
-	mutex_lock(&ifbdev->hpd_lock);
-	send_hpd = !ifbdev->hpd_suspended;
-	ifbdev->hpd_waiting = true;
-	mutex_unlock(&ifbdev->hpd_lock);
-
-	if (!send_hpd || !(ifbdev->vma || dev->fb_helper->deferred_setup))
-		return -EAGAIN;
-
-	return 0;
-}
-
-static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
-	.fb_probe = intelfb_create,
-	.fb_dirty = intelfb_dirty,
-	.fb_restore = intelfb_restore,
-	.fb_hotplug = intelfb_hotplug,
-};
-
 /*
  * Build an intel_fbdev struct using a BIOS allocated framebuffer, if possible.
  * The core display code will have read out the current plane configuration,
@@ -579,100 +580,10 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
 	intel_fbdev_hpd_set_suspend(dev_priv, state);
 }
 
-static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
-{
-	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
-	struct drm_device *dev = &dev_priv->drm;
-	int ret;
-
-	if (!ifbdev)
-		return -EINVAL;
-
-	if (!ifbdev->vma)
-		return -ENOMEM;
-
-	ret = drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper);
-	if (ret)
-		return ret;
-
-	return 0;
-}
-
-/*
- * Fbdev client and struct drm_client_funcs
- */
-
-static void intel_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = fb_helper->dev;
-	struct pci_dev *pdev = to_pci_dev(dev->dev);
-
-	if (fb_helper->info) {
-		vga_switcheroo_client_fb_set(pdev, NULL);
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_fb_helper_unprepare(fb_helper);
-		drm_client_release(&fb_helper->client);
-		kfree(fb_helper);
-	}
-}
-
-static int intel_fbdev_client_restore(struct drm_client_dev *client)
-{
-	struct drm_i915_private *dev_priv = to_i915(client->dev);
-	int ret;
-
-	ret = intel_fbdev_restore_mode(dev_priv);
-	if (ret)
-		return ret;
-
-	vga_switcheroo_process_delayed_switch();
-
-	return 0;
-}
-
-static int intel_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	struct pci_dev *pdev = to_pci_dev(dev->dev);
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	vga_switcheroo_client_fb_set(pdev, fb_helper->info);
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "Failed to setup i915 fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs intel_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= intel_fbdev_client_unregister,
-	.restore	= intel_fbdev_client_restore,
-	.hotplug	= intel_fbdev_client_hotplug,
-};
-
 void intel_fbdev_setup(struct drm_i915_private *i915)
 {
 	struct drm_device *dev = &i915->drm;
 	struct intel_fbdev *ifbdev;
-	struct drm_fb_helper *fb_helper;
 	int ret;
 
 	if (!HAS_DISPLAY(i915))
@@ -684,30 +595,13 @@ void intel_fbdev_setup(struct drm_i915_private *i915)
 
 	i915->display.fbdev.fbdev = ifbdev;
 	INIT_WORK(&i915->display.fbdev.suspend_work, intel_fbdev_suspend_worker);
-	mutex_init(&ifbdev->hpd_lock);
+	ret = drmm_mutex_init(dev, &ifbdev->hpd_lock);
+	if (ret)
+		return;
 	if (!intel_fbdev_init_bios(dev, ifbdev))
 		ifbdev->preferred_bpp = 32;
 
-	fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-	if (!fb_helper)
-		return;
-	drm_fb_helper_prepare(dev, fb_helper, ifbdev->preferred_bpp, &intel_fb_helper_funcs);
-
-	ret = drm_client_init(dev, &fb_helper->client, "intel-fbdev",
-			      &intel_fbdev_client_funcs);
-	if (ret) {
-		drm_err(dev, "Failed to register client: %d\n", ret);
-		goto err_drm_fb_helper_unprepare;
-	}
-
-	drm_client_register(&fb_helper->client);
-
-	return;
-
-err_drm_fb_helper_unprepare:
-	drm_fb_helper_unprepare(dev->fb_helper);
-	mutex_destroy(&ifbdev->hpd_lock);
-	kfree(fb_helper);
+	drm_client_setup_with_color_mode(dev, ifbdev->preferred_bpp);
 }
 
 struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev)
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.h b/drivers/gpu/drm/i915/display/intel_fbdev.h
index 08de2d5b3433..b4184a679595 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.h
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.h
@@ -9,15 +9,23 @@
 #include <linux/types.h>
 
 struct drm_device;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 struct drm_i915_private;
 struct intel_fbdev;
 struct intel_framebuffer;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
+int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				   struct drm_fb_helper_surface_size *sizes);
+#define INTEL_FBDEV_DRIVER_OPS \
+	.fbdev_probe = intel_fbdev_driver_fbdev_probe
 void intel_fbdev_setup(struct drm_i915_private *dev_priv);
 void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous);
 struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
 #else
+#define INTEL_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 static inline void intel_fbdev_setup(struct drm_i915_private *dev_priv)
 {
 }
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index e32766286369..d7c38e8facd2 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1781,6 +1781,8 @@ static const struct drm_driver i915_drm_driver = {
 	.dumb_create = i915_gem_dumb_create,
 	.dumb_map_offset = i915_gem_dumb_mmap_offset,
 
+	INTEL_FBDEV_DRIVER_OPS,
+
 	.ioctls = i915_ioctls,
 	.num_ioctls = ARRAY_SIZE(i915_ioctls),
 	.fops = &i915_driver_fops,
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 206328387150..7a28396abb25 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -17,6 +17,8 @@
 #include <drm/drm_print.h>
 #include <drm/xe_drm.h>
 
+#include "intel_fbdev.h"
+
 #include "display/xe_display.h"
 #include "instructions/xe_gpu_commands.h"
 #include "regs/xe_gt_regs.h"
@@ -267,6 +269,7 @@ static struct drm_driver driver = {
 
 	.dumb_create = xe_bo_dumb_create,
 	.dumb_map_offset = drm_gem_ttm_dumb_map_offset,
+	INTEL_FBDEV_DRIVER_OPS,
 #ifdef CONFIG_PROC_FS
 	.show_fdinfo = xe_drm_client_fdinfo,
 #endif
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 84/86] drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev.
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (82 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 85/86] drm/omapdrm: Run DRM default client setup Thomas Zimmermann
                   ` (4 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Tomi Valkeinen

Store instances of drm_fb_helper and struct omap_fbdev separately.
This will allow omapdrm to use the common fbdev client, which allocates
its own instance of struct drm_fb_helper.

There is at most one instance of each per DRM device, so both can be
referenced directly from the omap and DRM device structures. A later
patchset might rework the common fbdev client to allow for storing
both, drm_fb_helper and omap_fbdev, together in the same place.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_drv.h   |  3 ++
 drivers/gpu/drm/omapdrm/omap_fbdev.c | 42 +++++++++++++++-------------
 2 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 4c7217b35f6b..d903568fd8cc 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -32,6 +32,7 @@
 #define MODULE_NAME     "omapdrm"
 
 struct omap_drm_usergart;
+struct omap_fbdev;
 
 struct omap_drm_pipeline {
 	struct drm_crtc *crtc;
@@ -97,6 +98,8 @@ struct omap_drm_private {
 
 	/* memory bandwidth limit if it is needed on the platform */
 	unsigned int max_bandwidth;
+
+	struct omap_fbdev *fbdev;
 };
 
 
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c
index 523be34682ca..044e80403c3b 100644
--- a/drivers/gpu/drm/omapdrm/omap_fbdev.c
+++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c
@@ -13,6 +13,7 @@
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_managed.h>
 #include <drm/drm_util.h>
 
 #include "omap_drv.h"
@@ -26,10 +27,8 @@ module_param_named(ywrap, ywrap_enabled, bool, 0644);
  * fbdev funcs, to implement legacy fbdev interface on top of drm driver
  */
 
-#define to_omap_fbdev(x) container_of(x, struct omap_fbdev, base)
-
 struct omap_fbdev {
-	struct drm_fb_helper base;
+	struct drm_device *dev;
 	bool ywrap_enabled;
 
 	/* for deferred dmm roll when getting called in atomic ctx */
@@ -41,7 +40,7 @@ static struct drm_fb_helper *get_fb(struct fb_info *fbi);
 static void pan_worker(struct work_struct *work)
 {
 	struct omap_fbdev *fbdev = container_of(work, struct omap_fbdev, work);
-	struct drm_fb_helper *helper = &fbdev->base;
+	struct drm_fb_helper *helper = fbdev->dev->fb_helper;
 	struct fb_info *fbi = helper->info;
 	struct drm_gem_object *bo = drm_gem_fb_get_obj(helper->fb, 0);
 	int npages;
@@ -55,24 +54,25 @@ FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(omap_fbdev,
 				   drm_fb_helper_damage_range,
 				   drm_fb_helper_damage_area)
 
-static int omap_fbdev_pan_display(struct fb_var_screeninfo *var,
-		struct fb_info *fbi)
+static int omap_fbdev_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi)
 {
 	struct drm_fb_helper *helper = get_fb(fbi);
-	struct omap_fbdev *fbdev = to_omap_fbdev(helper);
+	struct omap_drm_private *priv;
+	struct omap_fbdev *fbdev;
 
 	if (!helper)
 		goto fallback;
 
+	priv = helper->dev->dev_private;
+	fbdev = priv->fbdev;
+
 	if (!fbdev->ywrap_enabled)
 		goto fallback;
 
-	if (drm_can_sleep()) {
+	if (drm_can_sleep())
 		pan_worker(&fbdev->work);
-	} else {
-		struct omap_drm_private *priv = helper->dev->dev_private;
+	else
 		queue_work(priv->wq, &fbdev->work);
-	}
 
 	return 0;
 
@@ -92,7 +92,6 @@ static void omap_fbdev_fb_destroy(struct fb_info *info)
 	struct drm_fb_helper *helper = info->par;
 	struct drm_framebuffer *fb = helper->fb;
 	struct drm_gem_object *bo = drm_gem_fb_get_obj(fb, 0);
-	struct omap_fbdev *fbdev = to_omap_fbdev(helper);
 
 	DBG();
 
@@ -104,7 +103,7 @@ static void omap_fbdev_fb_destroy(struct fb_info *info)
 
 	drm_client_release(&helper->client);
 	drm_fb_helper_unprepare(helper);
-	kfree(fbdev);
+	kfree(helper);
 }
 
 /*
@@ -128,9 +127,9 @@ static const struct fb_ops omap_fb_ops = {
 static int omap_fbdev_create(struct drm_fb_helper *helper,
 		struct drm_fb_helper_surface_size *sizes)
 {
-	struct omap_fbdev *fbdev = to_omap_fbdev(helper);
 	struct drm_device *dev = helper->dev;
 	struct omap_drm_private *priv = dev->dev_private;
+	struct omap_fbdev *fbdev = priv->fbdev;
 	struct drm_framebuffer *fb = NULL;
 	union omap_gem_size gsize;
 	struct fb_info *fbi = NULL;
@@ -338,6 +337,7 @@ static const struct drm_client_funcs omap_fbdev_client_funcs = {
 
 void omap_fbdev_setup(struct drm_device *dev)
 {
+	struct omap_drm_private *priv = dev->dev_private;
 	struct omap_fbdev *fbdev;
 	struct drm_fb_helper *helper;
 	int ret;
@@ -345,24 +345,28 @@ void omap_fbdev_setup(struct drm_device *dev)
 	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
 	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
 
-	fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
+	fbdev = drmm_kzalloc(dev, sizeof(*fbdev), GFP_KERNEL);
 	if (!fbdev)
 		return;
-	helper = &fbdev->base;
+	fbdev->dev = dev;
+	INIT_WORK(&fbdev->work, pan_worker);
+
+	priv->fbdev = fbdev;
 
+	helper = kzalloc(sizeof(*helper), GFP_KERNEL);
+	if (!helper)
+		return;
 	drm_fb_helper_prepare(dev, helper, 32, &omap_fb_helper_funcs);
 
 	ret = drm_client_init(dev, &helper->client, "fbdev", &omap_fbdev_client_funcs);
 	if (ret)
 		goto err_drm_client_init;
 
-	INIT_WORK(&fbdev->work, pan_worker);
-
 	drm_client_register(&helper->client);
 
 	return;
 
 err_drm_client_init:
 	drm_fb_helper_unprepare(helper);
-	kfree(fbdev);
+	kfree(helper);
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 85/86] drm/omapdrm: Run DRM default client setup
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (83 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 84/86] drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 12:23 ` [PATCH 86/86] drm/fb-helper: Remove struct drm_fb_helper.fb_probe Thomas Zimmermann
                   ` (3 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Tomi Valkeinen

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

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.

The omapdrm driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_drv.c   |   1 +
 drivers/gpu/drm/omapdrm/omap_fbdev.c | 131 ++++++---------------------
 drivers/gpu/drm/omapdrm/omap_fbdev.h |   8 ++
 3 files changed, 38 insertions(+), 102 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 6598c9c08ba1..d6b368fa1722 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -647,6 +647,7 @@ static const struct drm_driver omap_drm_driver = {
 	.gem_prime_import = omap_gem_prime_import,
 	.dumb_create = omap_gem_dumb_create,
 	.dumb_map_offset = omap_gem_dumb_map_offset,
+	OMAP_FBDEV_DRIVER_OPS,
 	.ioctls = ioctls,
 	.num_ioctls = DRM_OMAP_NUM_IOCTLS,
 	.fops = &omapdriver_fops,
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c
index 044e80403c3b..f4bd0c6e3f34 100644
--- a/drivers/gpu/drm/omapdrm/omap_fbdev.c
+++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c
@@ -6,6 +6,7 @@
 
 #include <linux/fb.h>
 
+#include <drm/drm_client_setup.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
@@ -124,8 +125,32 @@ static const struct fb_ops omap_fb_ops = {
 	.fb_destroy	= omap_fbdev_fb_destroy,
 };
 
-static int omap_fbdev_create(struct drm_fb_helper *helper,
-		struct drm_fb_helper_surface_size *sizes)
+static int omap_fbdev_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
+{
+	if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+		return 0;
+
+	if (helper->fb->funcs->dirty)
+		return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+
+	return 0;
+}
+
+static const struct drm_fb_helper_funcs omap_fbdev_helper_funcs = {
+	.fb_dirty = omap_fbdev_dirty,
+};
+
+static struct drm_fb_helper *get_fb(struct fb_info *fbi)
+{
+	if (!fbi || strcmp(fbi->fix.id, MODULE_NAME)) {
+		/* these are not the fb's you're looking for */
+		return NULL;
+	}
+	return fbi->par;
+}
+
+int omap_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				  struct drm_fb_helper_surface_size *sizes)
 {
 	struct drm_device *dev = helper->dev;
 	struct omap_drm_private *priv = dev->dev_private;
@@ -207,6 +232,7 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
 
 	DBG("fbi=%p, dev=%p", fbi, dev);
 
+	helper->funcs = &omap_fbdev_helper_funcs;
 	helper->fb = fb;
 
 	fbi->fbops = &omap_fb_ops;
@@ -253,94 +279,10 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
 	return ret;
 }
 
-static int omap_fbdev_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
-{
-	if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
-		return 0;
-
-	if (helper->fb->funcs->dirty)
-		return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
-
-	return 0;
-}
-
-static const struct drm_fb_helper_funcs omap_fb_helper_funcs = {
-	.fb_probe = omap_fbdev_create,
-	.fb_dirty = omap_fbdev_dirty,
-};
-
-static struct drm_fb_helper *get_fb(struct fb_info *fbi)
-{
-	if (!fbi || strcmp(fbi->fix.id, MODULE_NAME)) {
-		/* these are not the fb's you're looking for */
-		return NULL;
-	}
-	return fbi->par;
-}
-
-/*
- * struct drm_client
- */
-
-static void omap_fbdev_client_unregister(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-	if (fb_helper->info) {
-		drm_fb_helper_unregister_info(fb_helper);
-	} else {
-		drm_client_release(&fb_helper->client);
-		drm_fb_helper_unprepare(fb_helper);
-		kfree(fb_helper);
-	}
-}
-
-static int omap_fbdev_client_restore(struct drm_client_dev *client)
-{
-	drm_fb_helper_lastclose(client->dev);
-
-	return 0;
-}
-
-static int omap_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-	struct drm_device *dev = client->dev;
-	int ret;
-
-	if (dev->fb_helper)
-		return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-	ret = drm_fb_helper_init(dev, fb_helper);
-	if (ret)
-		goto err_drm_err;
-
-	ret = drm_fb_helper_initial_config(fb_helper);
-	if (ret)
-		goto err_drm_fb_helper_fini;
-
-	return 0;
-
-err_drm_fb_helper_fini:
-	drm_fb_helper_fini(fb_helper);
-err_drm_err:
-	drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret);
-	return ret;
-}
-
-static const struct drm_client_funcs omap_fbdev_client_funcs = {
-	.owner		= THIS_MODULE,
-	.unregister	= omap_fbdev_client_unregister,
-	.restore	= omap_fbdev_client_restore,
-	.hotplug	= omap_fbdev_client_hotplug,
-};
-
 void omap_fbdev_setup(struct drm_device *dev)
 {
 	struct omap_drm_private *priv = dev->dev_private;
 	struct omap_fbdev *fbdev;
-	struct drm_fb_helper *helper;
-	int ret;
 
 	drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
 	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
@@ -353,20 +295,5 @@ void omap_fbdev_setup(struct drm_device *dev)
 
 	priv->fbdev = fbdev;
 
-	helper = kzalloc(sizeof(*helper), GFP_KERNEL);
-	if (!helper)
-		return;
-	drm_fb_helper_prepare(dev, helper, 32, &omap_fb_helper_funcs);
-
-	ret = drm_client_init(dev, &helper->client, "fbdev", &omap_fbdev_client_funcs);
-	if (ret)
-		goto err_drm_client_init;
-
-	drm_client_register(&helper->client);
-
-	return;
-
-err_drm_client_init:
-	drm_fb_helper_unprepare(helper);
-	kfree(helper);
+	drm_client_setup(dev, NULL);
 }
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.h b/drivers/gpu/drm/omapdrm/omap_fbdev.h
index 74c691a8d45f..283e35b42ada 100644
--- a/drivers/gpu/drm/omapdrm/omap_fbdev.h
+++ b/drivers/gpu/drm/omapdrm/omap_fbdev.h
@@ -10,10 +10,18 @@
 #define __OMAPDRM_FBDEV_H__
 
 struct drm_device;
+struct drm_fb_helper;
+struct drm_fb_helper_surface_size;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
+int omap_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
+				  struct drm_fb_helper_surface_size *sizes);
+#define OMAP_FBDEV_DRIVER_OPS \
+	.fbdev_probe = omap_fbdev_driver_fbdev_probe
 void omap_fbdev_setup(struct drm_device *dev);
 #else
+#define OMAP_FBDEV_DRIVER_OPS \
+	.fbdev_probe = NULL
 static inline void omap_fbdev_setup(struct drm_device *dev)
 {
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* [PATCH 86/86] drm/fb-helper: Remove struct drm_fb_helper.fb_probe
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (84 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 85/86] drm/omapdrm: Run DRM default client setup Thomas Zimmermann
@ 2024-08-16 12:23 ` Thomas Zimmermann
  2024-08-16 13:02 ` ✓ CI.Patch_applied: success for drm: Provide client setup helper and convert drivers Patchwork
                   ` (2 subsequent siblings)
  88 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 12:23 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

The callback fb_probe in struct drm_fb_helper is unused. Remove it.
New drivers should set struct drm_driver.fbdev_probe instead and call
drm_client_setup() to instantiate in-kernel DRM clients.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/drm_fb_helper.c |  8 ++++----
 include/drm/drm_fb_helper.h     | 17 -----------------
 2 files changed, 4 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 92926cb02dfb..4968676a88a9 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1625,6 +1625,9 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 	struct fb_info *info;
 	int ret;
 
+	if (drm_WARN_ON(dev, !dev->driver->fbdev_probe))
+		return -EINVAL;
+
 	ret = drm_fb_helper_find_sizes(fb_helper, &sizes);
 	if (ret) {
 		/* First time: disable all crtc's.. */
@@ -1634,10 +1637,7 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)
 	}
 
 	/* push down into drivers */
-	if (dev->driver->fbdev_probe)
-		ret = dev->driver->fbdev_probe(fb_helper, &sizes);
-	else
-		ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);
+	ret = dev->driver->fbdev_probe(fb_helper, &sizes);
 	if (ret < 0)
 		return ret;
 
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
index 3dcb9a60e408..56cf0cae3321 100644
--- a/include/drm/drm_fb_helper.h
+++ b/include/drm/drm_fb_helper.h
@@ -69,23 +69,6 @@ struct drm_fb_helper_surface_size {
  * Driver callbacks used by the fbdev emulation helper library.
  */
 struct drm_fb_helper_funcs {
-	/**
-	 * @fb_probe:
-	 *
-	 * Driver callback to allocate and initialize the fbdev info structure.
-	 * Furthermore it also needs to allocate the DRM framebuffer used to
-	 * back the fbdev.
-	 *
-	 * This callback is mandatory.
-	 *
-	 * RETURNS:
-	 *
-	 * The driver should return 0 on success and a negative error code on
-	 * failure.
-	 */
-	int (*fb_probe)(struct drm_fb_helper *helper,
-			struct drm_fb_helper_surface_size *sizes);
-
 	/**
 	 * @fb_dirty:
 	 *
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 131+ messages in thread

* ✓ CI.Patch_applied: success for drm: Provide client setup helper and convert drivers
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (85 preceding siblings ...)
  2024-08-16 12:23 ` [PATCH 86/86] drm/fb-helper: Remove struct drm_fb_helper.fb_probe Thomas Zimmermann
@ 2024-08-16 13:02 ` Patchwork
  2024-08-16 13:04 ` ✗ CI.checkpatch: warning " Patchwork
  2024-08-16 13:04 ` ✗ CI.KUnit: failure " Patchwork
  88 siblings, 0 replies; 131+ messages in thread
From: Patchwork @ 2024-08-16 13:02 UTC (permalink / raw)
  To: Thomas Zimmermann; +Cc: intel-xe

== Series Details ==

Series: drm: Provide client setup helper and convert drivers
URL   : https://patchwork.freedesktop.org/series/137387/
State : success

== Summary ==

=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: 70d6d55dea57 drm-tip: 2024y-08m-16d-08h-43m-44s UTC integration manifest
=== git am output follows ===
Applying: drm/fbdev-helper: Move color-mode lookup into 4CC format helper
Applying: drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info
Applying: drm/fbdev: Add memory-agnostic fbdev client
Applying: drm: Add client-agnostic setup helper
Applying: drm/fbdev-dma: Support struct drm_driver.fbdev_probe
Applying: drm/arcgpu: Run DRM default client setup
Applying: drm/arm/komeda: Run DRM default client setup
Applying: drm/arm/hdlcd: Run DRM default client setup
Applying: drm/arm/malidp: Run DRM default client setup
Applying: drm/aspeed: Run DRM default client setup
Applying: drm/atmel-hdlcd: Run DRM default client setup
Applying: drm/fsl-dcu: Run DRM default client setup
Applying: drm/hisilicon/kirin: Run DRM default client setup
Applying: drm/hx8357d: Run DRM default client setup
Applying: drm/ili9163: Run DRM default client setup
Applying: drm/ili9225: Run DRM default client setup
Applying: drm/ili9341: Run DRM default client setup
Applying: drm/ili9486: Run DRM default client setup
Applying: drm/imx/dcss: Run DRM default client setup
Applying: drm/imx/ipuv3: Run DRM default client setup
Applying: drm/imx/lcdc: Run DRM default client setup
Applying: drm/ingenic: Run DRM default client setup
Applying: drm/kmb: Run DRM default client setup
Applying: drm/logicvc: Run DRM default client setup
Applying: drm/mcde: Run DRM default client setup
Applying: drm/mediatek: Run DRM default client setup
Applying: drm/meson: Run DRM default client setup
Applying: drm/mi0283qt: Run DRM default client setup
Applying: drm/mxsfb/lcdif: Run DRM default client setup
Applying: drm/msxfb: Run DRM default client setup
Applying: drm/panel/ili9341: Run DRM default client setup
Applying: drm/panel-mipi-dbi: Run DRM default client setup
Applying: drm/pl111: Run DRM default client setup
Applying: drm/renesas/rcar-du: Run DRM default client setup
Applying: drm/renesas/rz-du: Run DRM default client setup
Applying: drm/renesas/shmobile: Run DRM default client setup
Applying: drm/repaper: Run DRM default client setup
Applying: drm/rockchip: Run DRM default client setup
Applying: drm/sti: Run DRM default client setup
Applying: drm/stm: Run DRM default client setup
Applying: drm/sun4i: Run DRM default client setup
Applying: drm/tidss: Run DRM default client setup
Applying: drm/tilcdc: Run DRM default client setup
Applying: drm/st7586: Run DRM default client setup
Applying: drm/st7735r: Run DRM default client setup
Applying: drm/tve200: Run DRM default client setup
Applying: drm/vc4: Run DRM default client setup
Applying: drm/xlnx: Run DRM default client setup
Applying: drm/fbdev-dma: Remove obsolete setup function
Applying: drm/fbdev-shmem: Support struct drm_driver.fbdev_probe
Applying: drm/ast: Run DRM default client setup
Applying: drm/cirrus: Run DRM default client setup
Applying: drm/gm12u320: Run DRM default client setup
Applying: drm/gud: Run DRM default client setup
Applying: drm/hyperv_drm: Run DRM default client setup
Applying: drm/mgag200: Run DRM default client setup
Applying: drm/ofdrm: Use DRM default client setup
Applying: drm/simpledrm: Run DRM default client setup
Applying: drm/solomon: Run DRM default client setup
Applying: drm/udl: Run DRM default client setup
Applying: drm/virtgpu: Run DRM default client setup
Applying: drm/vkms: Run DRM default client setup
Applying: drm/fbdev-shmem: Remove obsolete setup function
Applying: drm/fbdev-ttm: Support struct drm_driver.fbdev_probe
Applying: drm/amdgpu: Run DRM default client setup
Applying: drm/bochs: Run DRM default client setup
Applying: drm/hisilicon/hibmc: Run DRM default client setup
Applying: drm/loongson: Run DRM default client setup
Applying: drm/nouveau: Run DRM default client setup
Applying: drm/qxl: Run DRM default client setup
Applying: drm/vboxvideo: Run DRM default client setup
Applying: drm/vmwgfx: Run DRM default client setup
Applying: drm/fbdev-ttm: Remove obsolete setup function
Applying: drm/armada: Run DRM default client setup
Applying: drm/exynos-drm: Run DRM default client setup
Applying: drm/gma500: Run DRM default client setup
Applying: drm/msm: Run DRM default client setup
Applying: drm/radeon: Run DRM default client setup
Applying: drm/tegra: Run DRM default client setup
Applying: drm/i915: Remove struct drm_fb_helper from struct intel_fbdev
Applying: drm/i915: Move custom restore code into separate callback
Applying: drm/i915: Move custom hotplug code into separate callback
Applying: drm/{i915,xe}: Run DRM default client setup
Applying: drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev.
Applying: drm/omapdrm: Run DRM default client setup
Applying: drm/fb-helper: Remove struct drm_fb_helper.fb_probe



^ permalink raw reply	[flat|nested] 131+ messages in thread

* ✗ CI.checkpatch: warning for drm: Provide client setup helper and convert drivers
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (86 preceding siblings ...)
  2024-08-16 13:02 ` ✓ CI.Patch_applied: success for drm: Provide client setup helper and convert drivers Patchwork
@ 2024-08-16 13:04 ` Patchwork
  2024-08-16 13:04 ` ✗ CI.KUnit: failure " Patchwork
  88 siblings, 0 replies; 131+ messages in thread
From: Patchwork @ 2024-08-16 13:04 UTC (permalink / raw)
  To: Thomas Zimmermann; +Cc: intel-xe

== Series Details ==

Series: drm: Provide client setup helper and convert drivers
URL   : https://patchwork.freedesktop.org/series/137387/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
9fe5037901cabbcdf27a6fe0dfb047ca1474d363
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit bc2e6acf0b21b2c317d386cd0d7dea4bdc43e304
Author: Thomas Zimmermann <tzimmermann@suse.de>
Date:   Fri Aug 16 14:23:52 2024 +0200

    drm/fb-helper: Remove struct drm_fb_helper.fb_probe
    
    The callback fb_probe in struct drm_fb_helper is unused. Remove it.
    New drivers should set struct drm_driver.fbdev_probe instead and call
    drm_client_setup() to instantiate in-kernel DRM clients.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+ /mt/dim checkpatch 70d6d55dea574b7b78ccf714699cc5d8d62fcc2c drm-intel
dbbe77e43aae drm/fbdev-helper: Move color-mode lookup into 4CC format helper
ffb255019bb2 drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info
7087b5d41bf6 drm/fbdev: Add memory-agnostic fbdev client
-:91: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#91: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 236 lines checked
771e6926ae8c drm: Add client-agnostic setup helper
-:33: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#33: 
new file mode 100644

-:88: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t'
#88: FILE: drivers/gpu/drm/drm_client_setup.c:51:
+	uint32_t fmt = drm_driver_color_mode_format(dev, color_mode);

total: 0 errors, 1 warnings, 1 checks, 74 lines checked
583e54980030 drm/fbdev-dma: Support struct drm_driver.fbdev_probe
7fd3f3c41621 drm/arcgpu: Run DRM default client setup
c02dde30b20e drm/arm/komeda: Run DRM default client setup
a43996abc768 drm/arm/hdlcd: Run DRM default client setup
aefeb24af9b6 drm/arm/malidp: Run DRM default client setup
8f2ba9ac84fe drm/aspeed: Run DRM default client setup
c0bd38753793 drm/atmel-hdlcd: Run DRM default client setup
6e389ec3af77 drm/fsl-dcu: Run DRM default client setup
17903ccf1bc5 drm/hisilicon/kirin: Run DRM default client setup
5ea18cea7053 drm/hx8357d: Run DRM default client setup
63f681ffa23b drm/ili9163: Run DRM default client setup
7899f4a28eb1 drm/ili9225: Run DRM default client setup
6eb5df084d1a drm/ili9341: Run DRM default client setup
4b9aa1c5f028 drm/ili9486: Run DRM default client setup
11d52d5c8394 drm/imx/dcss: Run DRM default client setup
2fcfa2c18df4 drm/imx/ipuv3: Run DRM default client setup
7a45a413b7ad drm/imx/lcdc: Run DRM default client setup
ec058833e2e3 drm/ingenic: Run DRM default client setup
e5caa29ce062 drm/kmb: Run DRM default client setup
b12f7ed8b393 drm/logicvc: Run DRM default client setup
24f9d3affacc drm/mcde: Run DRM default client setup
5244eab58bc9 drm/mediatek: Run DRM default client setup
d78200a66bd2 drm/meson: Run DRM default client setup
ab56a5ea72ab drm/mi0283qt: Run DRM default client setup
9e7871057e48 drm/mxsfb/lcdif: Run DRM default client setup
934fa3c8188e drm/msxfb: Run DRM default client setup
daced4593542 drm/panel/ili9341: Run DRM default client setup
bd50c122d8a0 drm/panel-mipi-dbi: Run DRM default client setup
5933f72d063c drm/pl111: Run DRM default client setup
a337b73ec24f drm/renesas/rcar-du: Run DRM default client setup
22dbe6e2ebf6 drm/renesas/rz-du: Run DRM default client setup
acd2b0a52626 drm/renesas/shmobile: Run DRM default client setup
6f43b9a3913c drm/repaper: Run DRM default client setup
1076fdfef342 drm/rockchip: Run DRM default client setup
3683afa0790a drm/sti: Run DRM default client setup
54fab82ed61f drm/stm: Run DRM default client setup
43cdf7378776 drm/sun4i: Run DRM default client setup
66374919ebe0 drm/tidss: Run DRM default client setup
021fa1b61d72 drm/tilcdc: Run DRM default client setup
f713bd8a3b2a drm/st7586: Run DRM default client setup
ee24930b3cb8 drm/st7735r: Run DRM default client setup
ce58cfe659ee drm/tve200: Run DRM default client setup
468714d0ea71 drm/vc4: Run DRM default client setup
c8effee76eff drm/xlnx: Run DRM default client setup
391c0e8a99db drm/fbdev-dma: Remove obsolete setup function
8442e8acabe5 drm/fbdev-shmem: Support struct drm_driver.fbdev_probe
96b62c445df9 drm/ast: Run DRM default client setup
df903cdd8223 drm/cirrus: Run DRM default client setup
-:14: WARNING:OBSOLETE: drivers/gpu/drm/tiny/cirrus.c is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.

-:17: WARNING:OBSOLETE: drivers/gpu/drm/tiny/cirrus.c is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.

total: 0 errors, 2 warnings, 0 checks, 22 lines checked
95fb9e3b25df drm/gm12u320: Run DRM default client setup
9b3a4f251bbf drm/gud: Run DRM default client setup
1a068a584971 drm/hyperv_drm: Run DRM default client setup
351e33650c94 drm/mgag200: Run DRM default client setup
-:11: WARNING:BAD_SIGN_OFF: Unexpected content after email: 'Dave Airlie <airlied@redhat.com>i', should be: 'Dave Airlie <airlied@redhat.com> (i)'
#11: 
Cc: Dave Airlie <airlied@redhat.com>i

total: 0 errors, 1 warnings, 0 checks, 26 lines checked
e95cd30e0d7d drm/ofdrm: Use DRM default client setup
47e6aa7c3f91 drm/simpledrm: Run DRM default client setup
056cf3290b0f drm/solomon: Run DRM default client setup
6c7a736467ca drm/udl: Run DRM default client setup
658ef1942b6f drm/virtgpu: Run DRM default client setup
58e7053be64b drm/vkms: Run DRM default client setup
32baba39fab1 drm/fbdev-shmem: Remove obsolete setup function
8b09ac708491 drm/fbdev-ttm: Support struct drm_driver.fbdev_probe
1ed15f91d832 drm/amdgpu: Run DRM default client setup
c8ff49a15c36 drm/bochs: Run DRM default client setup
9510ebcf0f2b drm/hisilicon/hibmc: Run DRM default client setup
1ffc796b420e drm/loongson: Run DRM default client setup
4e1a08dc41d0 drm/nouveau: Run DRM default client setup
fd55ab97914a drm/qxl: Run DRM default client setup
1e2fc1ad8dc3 drm/vboxvideo: Run DRM default client setup
1d132a14ac42 drm/vmwgfx: Run DRM default client setup
0dae2236b45e drm/fbdev-ttm: Remove obsolete setup function
d7c84f493c4a drm/armada: Run DRM default client setup
5e4b1403c0be drm/exynos-drm: Run DRM default client setup
d3b4c45a25c4 drm/gma500: Run DRM default client setup
4cacef18386d drm/msm: Run DRM default client setup
fe7063f9bd0b drm/radeon: Run DRM default client setup
3af6ff5c95e1 drm/tegra: Run DRM default client setup
a6a36c949951 drm/i915: Remove struct drm_fb_helper from struct intel_fbdev
56a17e40ea0e drm/i915: Move custom restore code into separate callback
6613c0d1379d drm/i915: Move custom hotplug code into separate callback
7f6e9f3ee45a drm/{i915,xe}: Run DRM default client setup
1ed62e940865 drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev.
eb772971d08c drm/omapdrm: Run DRM default client setup
bc2e6acf0b21 drm/fb-helper: Remove struct drm_fb_helper.fb_probe



^ permalink raw reply	[flat|nested] 131+ messages in thread

* ✗ CI.KUnit: failure for drm: Provide client setup helper and convert drivers
  2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
                   ` (87 preceding siblings ...)
  2024-08-16 13:04 ` ✗ CI.checkpatch: warning " Patchwork
@ 2024-08-16 13:04 ` Patchwork
  88 siblings, 0 replies; 131+ messages in thread
From: Patchwork @ 2024-08-16 13:04 UTC (permalink / raw)
  To: Thomas Zimmermann; +Cc: intel-xe

== Series Details ==

Series: drm: Provide client setup helper and convert drivers
URL   : https://patchwork.freedesktop.org/series/137387/
State : failure

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
ERROR:root:../drivers/gpu/drm/xe/xe_device.c:20:10: fatal error: intel_fbdev.h: No such file or directory
   20 | #include "intel_fbdev.h"
      |          ^~~~~~~~~~~~~~~
compilation terminated.
make[7]: *** [../scripts/Makefile.build:244: drivers/gpu/drm/xe/xe_device.o] Error 1
make[7]: *** Waiting for unfinished jobs....
make[6]: *** [../scripts/Makefile.build:485: drivers/gpu/drm/xe] Error 2
make[6]: *** Waiting for unfinished jobs....
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
make[5]: *** [../scripts/Makefile.build:485: drivers/gpu/drm] Error 2
make[4]: *** [../scripts/Makefile.build:485: drivers/gpu] Error 2
make[3]: *** [../scripts/Makefile.build:485: drivers] Error 2
make[2]: *** [/kernel/Makefile:1925: .] Error 2
make[1]: *** [/kernel/Makefile:224: __sub-make] Error 2
make: *** [Makefile:224: __sub-make] Error 2

[13:04:03] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:04:07] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make ARCH=um O=.kunit --jobs=48
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup Thomas Zimmermann
@ 2024-08-16 13:18   ` Jani Nikula
  2024-08-16 13:34     ` Thomas Zimmermann
  2024-08-17 10:14   ` kernel test robot
  2024-08-17 12:07   ` kernel test robot
  2 siblings, 1 reply; 131+ messages in thread
From: Jani Nikula @ 2024-08-16 13:18 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Rodrigo Vivi, Joonas Lahtinen, Tvrtko Ursulin,
	Lucas De Marchi, Thomas Hellström

On Fri, 16 Aug 2024, Thomas Zimmermann <tzimmermann@suse.de> wrote:
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 206328387150..7a28396abb25 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -17,6 +17,8 @@
>  #include <drm/drm_print.h>
>  #include <drm/xe_drm.h>
>  
> +#include "intel_fbdev.h"
> +
>  #include "display/xe_display.h"
>  #include "instructions/xe_gpu_commands.h"
>  #include "regs/xe_gt_regs.h"
> @@ -267,6 +269,7 @@ static struct drm_driver driver = {
>  
>  	.dumb_create = xe_bo_dumb_create,
>  	.dumb_map_offset = drm_gem_ttm_dumb_map_offset,
> +	INTEL_FBDEV_DRIVER_OPS,
>  #ifdef CONFIG_PROC_FS
>  	.show_fdinfo = xe_drm_client_fdinfo,
>  #endif

Basically xe_device.c should have close to zero idea about display
details, and should not include intel_fbdev.h directly.

There's a xe_display_driver_set_hooks() call that is the right place to
set the driver->fbdev_probe hook.

It's a bit of a bummer in the sense that this prevents struct drm_driver
from being const, but that's how it already is for xe.


BR,
Jani.


-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup
  2024-08-16 13:18   ` Jani Nikula
@ 2024-08-16 13:34     ` Thomas Zimmermann
  0 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-16 13:34 UTC (permalink / raw)
  To: Jani Nikula, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Rodrigo Vivi,
	Joonas Lahtinen, Tvrtko Ursulin, Lucas De Marchi,
	Thomas Hellström

Hi

Am 16.08.24 um 15:18 schrieb Jani Nikula:
> On Fri, 16 Aug 2024, Thomas Zimmermann <tzimmermann@suse.de> wrote:
>> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
>> index 206328387150..7a28396abb25 100644
>> --- a/drivers/gpu/drm/xe/xe_device.c
>> +++ b/drivers/gpu/drm/xe/xe_device.c
>> @@ -17,6 +17,8 @@
>>   #include <drm/drm_print.h>
>>   #include <drm/xe_drm.h>
>>   
>> +#include "intel_fbdev.h"
>> +
>>   #include "display/xe_display.h"
>>   #include "instructions/xe_gpu_commands.h"
>>   #include "regs/xe_gt_regs.h"
>> @@ -267,6 +269,7 @@ static struct drm_driver driver = {
>>   
>>   	.dumb_create = xe_bo_dumb_create,
>>   	.dumb_map_offset = drm_gem_ttm_dumb_map_offset,
>> +	INTEL_FBDEV_DRIVER_OPS,
>>   #ifdef CONFIG_PROC_FS
>>   	.show_fdinfo = xe_drm_client_fdinfo,
>>   #endif
> Basically xe_device.c should have close to zero idea about display
> details, and should not include intel_fbdev.h directly.
>
> There's a xe_display_driver_set_hooks() call that is the right place to
> set the driver->fbdev_probe hook.
>
> It's a bit of a bummer in the sense that this prevents struct drm_driver
> from being const, but that's how it already is for xe.

Thanks, I'll look into this. The was another automatic reply about a 
compile error in xe wrt this callback. I guess that set_hooks helper 
would fix that as well.

Best regards
Thomas

>
>
> BR,
> Jani.
>
>

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 38/86] drm/rockchip: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 38/86] drm/rockchip: " Thomas Zimmermann
@ 2024-08-16 13:34   ` Heiko Stübner
  0 siblings, 0 replies; 131+ messages in thread
From: Heiko Stübner @ 2024-08-16 13:34 UTC (permalink / raw)
  To: daniel, airlied, jfalempe, javierm, Thomas Zimmermann
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Sandy Huang, Andy Yan

Am Freitag, 16. August 2024, 14:23:04 CEST schrieb Thomas Zimmermann:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Sandy Huang <hjc@rock-chips.com>
> Cc: "Heiko Stübner" <heiko@sntech.de>
> Cc: Andy Yan <andy.yan@rock-chips.com>

I've looked up the whole patchseries and while I can't say overly much
about the core changes, at least for the Rockchip driver, things look
like they'll stay the same even after those changes are applied, so

Acked-by: Heiko Stuebner <heiko@sntech.de>

> ---
>  drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
> index 44d769d9234d..83ea6cc8cd21 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
> @@ -17,6 +17,7 @@
>  #include <linux/iommu.h>
>  
>  #include <drm/drm_aperture.h>
> +#include <drm/drm_client_setup.h>
>  #include <drm/drm_drv.h>
>  #include <drm/drm_fbdev_dma.h>
>  #include <drm/drm_gem_dma_helper.h>
> @@ -191,7 +192,7 @@ static int rockchip_drm_bind(struct device *dev)
>  	if (ret)
>  		goto err_kms_helper_poll_fini;
>  
> -	drm_fbdev_dma_setup(drm_dev, 0);
> +	drm_client_setup(drm_dev, NULL);
>  
>  	return 0;
>  err_kms_helper_poll_fini:
> @@ -226,6 +227,7 @@ static const struct drm_driver rockchip_drm_driver = {
>  	.driver_features	= DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
>  	.dumb_create		= rockchip_gem_dumb_create,
>  	.gem_prime_import_sg_table	= rockchip_gem_prime_import_sg_table,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  	.fops			= &rockchip_drm_driver_fops,
>  	.name	= DRIVER_NAME,
>  	.desc	= DRIVER_DESC,
> 





^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 69/86] drm/nouveau: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 69/86] drm/nouveau: " Thomas Zimmermann
@ 2024-08-16 13:59   ` Danilo Krummrich
  0 siblings, 0 replies; 131+ messages in thread
From: Danilo Krummrich @ 2024-08-16 13:59 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau, Karol Herbst, Lyude Paul

On 8/16/24 2:23 PM, Thomas Zimmermann wrote:
> 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.
> 
> The nouveau driver specifies a preferred color mode depending on
> the available video memory, with a default of 32. Adapt this for
> the new client interface.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>

Acked-by: Danilo Krummrich <dakr@kernel.org>

> Cc: Karol Herbst <kherbst@redhat.com>
> Cc: Lyude Paul <lyude@redhat.com>
> Cc: Danilo Krummrich <dakr@redhat.com>
> ---
>   drivers/gpu/drm/nouveau/nouveau_drm.c | 7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
> index 4a9a9b9c3935..445ebedf70d6 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_drm.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
> @@ -31,6 +31,7 @@
>   #include <linux/dynamic_debug.h>
>   
>   #include <drm/drm_aperture.h>
> +#include <drm/drm_client_setup.h>
>   #include <drm/drm_drv.h>
>   #include <drm/drm_fbdev_ttm.h>
>   #include <drm/drm_gem_ttm_helper.h>
> @@ -873,9 +874,9 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
>   		goto fail_pci;
>   
>   	if (drm->client.device.info.ram_size <= 32 * 1024 * 1024)
> -		drm_fbdev_ttm_setup(drm->dev, 8);
> +		drm_client_setup(drm->dev, drm_format_info(DRM_FORMAT_C8));
>   	else
> -		drm_fbdev_ttm_setup(drm->dev, 32);
> +		drm_client_setup(drm->dev, NULL);
>   
>   	quirk_broken_nv_runpm(pdev);
>   	return 0;
> @@ -1317,6 +1318,8 @@ driver_stub = {
>   	.dumb_create = nouveau_display_dumb_create,
>   	.dumb_map_offset = drm_gem_ttm_dumb_map_offset,
>   
> +	DRM_FBDEV_TTM_DRIVER_OPS,
> +
>   	.name = DRIVER_NAME,
>   	.desc = DRIVER_DESC,
>   #ifdef GIT_REVISION

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 07/86] drm/arm/komeda: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 07/86] drm/arm/komeda: " Thomas Zimmermann
@ 2024-08-16 14:15   ` Liviu Dudau
  0 siblings, 0 replies; 131+ messages in thread
From: Liviu Dudau @ 2024-08-16 14:15 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

On Fri, Aug 16, 2024 at 02:22:33PM +0200, Thomas Zimmermann wrote:
> 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.
> 
> The komeda driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Liviu Dudau <liviu.dudau@arm.com>

Acked-by: Liviu Dudau <liviu.dudau@arm.com>

> ---
>  drivers/gpu/drm/arm/display/komeda/komeda_drv.c | 4 ++--
>  drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 2 ++
>  2 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> index 55c3773befde..6d475bb34002 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> @@ -9,7 +9,7 @@
>  #include <linux/of.h>
>  #include <linux/platform_device.h>
>  #include <linux/pm_runtime.h>
> -#include <drm/drm_fbdev_dma.h>
> +#include <drm/drm_client_setup.h>
>  #include <drm/drm_module.h>
>  #include <drm/drm_of.h>
>  #include "komeda_dev.h"
> @@ -84,7 +84,7 @@ static int komeda_platform_probe(struct platform_device *pdev)
>  	}
>  
>  	dev_set_drvdata(dev, mdrv);
> -	drm_fbdev_dma_setup(&mdrv->kms->base, 32);
> +	drm_client_setup(&mdrv->kms->base, NULL);
>  
>  	return 0;
>  
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> index fe46b0ebefea..f3314261925c 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> @@ -9,6 +9,7 @@
>  #include <drm/drm_atomic.h>
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/drm_drv.h>
> +#include <drm/drm_fbdev_dma.h>
>  #include <drm/drm_gem_dma_helper.h>
>  #include <drm/drm_gem_framebuffer_helper.h>
>  #include <drm/drm_managed.h>
> @@ -58,6 +59,7 @@ static irqreturn_t komeda_kms_irq_handler(int irq, void *data)
>  static const struct drm_driver komeda_kms_driver = {
>  	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>  	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(komeda_gem_dma_dumb_create),
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  	.fops = &komeda_cma_fops,
>  	.name = "komeda",
>  	.desc = "Arm Komeda Display Processor driver",
> -- 
> 2.46.0
> 

-- 
====================
| I would like to |
| fix the world,  |
| but they're not |
| giving me the   |
 \ source code!  /
  ---------------
    ¯\_(ツ)_/¯

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 08/86] drm/arm/hdlcd: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 08/86] drm/arm/hdlcd: " Thomas Zimmermann
@ 2024-08-16 14:15   ` Liviu Dudau
  0 siblings, 0 replies; 131+ messages in thread
From: Liviu Dudau @ 2024-08-16 14:15 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

On Fri, Aug 16, 2024 at 02:22:34PM +0200, Thomas Zimmermann wrote:
> 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.
> 
> The hdlcd driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Liviu Dudau <liviu.dudau@arm.com>

Acked-by: Liviu Dudau <liviu.dudau@arm.com>

> ---
>  drivers/gpu/drm/arm/hdlcd_drv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
> index 32be9e370049..f5d358f3893b 100644
> --- a/drivers/gpu/drm/arm/hdlcd_drv.c
> +++ b/drivers/gpu/drm/arm/hdlcd_drv.c
> @@ -23,6 +23,7 @@
>  
>  #include <drm/drm_aperture.h>
>  #include <drm/drm_atomic_helper.h>
> +#include <drm/drm_client_setup.h>
>  #include <drm/drm_crtc.h>
>  #include <drm/drm_debugfs.h>
>  #include <drm/drm_drv.h>
> @@ -228,6 +229,7 @@ DEFINE_DRM_GEM_DMA_FOPS(fops);
>  static const struct drm_driver hdlcd_driver = {
>  	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>  	DRM_GEM_DMA_DRIVER_OPS,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  	.fops = &fops,
>  	.name = "hdlcd",
>  	.desc = "ARM HDLCD Controller DRM",
> @@ -299,7 +301,7 @@ static int hdlcd_drm_bind(struct device *dev)
>  	if (ret)
>  		goto err_register;
>  
> -	drm_fbdev_dma_setup(drm, 32);
> +	drm_client_setup(drm, NULL);
>  
>  	return 0;
>  
> -- 
> 2.46.0
> 

-- 
====================
| I would like to |
| fix the world,  |
| but they're not |
| giving me the   |
 \ source code!  /
  ---------------
    ¯\_(ツ)_/¯

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 09/86] drm/arm/malidp: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 09/86] drm/arm/malidp: " Thomas Zimmermann
@ 2024-08-16 14:16   ` Liviu Dudau
  0 siblings, 0 replies; 131+ messages in thread
From: Liviu Dudau @ 2024-08-16 14:16 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

On Fri, Aug 16, 2024 at 02:22:35PM +0200, Thomas Zimmermann wrote:
> 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.
> 
> The malidp driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Liviu Dudau <liviu.dudau@arm.com>

Acked-by: Liviu Dudau <liviu.dudau@arm.com>

Best regards,
Liviu

> ---
>  drivers/gpu/drm/arm/malidp_drv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/arm/malidp_drv.c b/drivers/gpu/drm/arm/malidp_drv.c
> index 6682131d2910..4cb25004b84f 100644
> --- a/drivers/gpu/drm/arm/malidp_drv.c
> +++ b/drivers/gpu/drm/arm/malidp_drv.c
> @@ -18,6 +18,7 @@
>  
>  #include <drm/drm_atomic.h>
>  #include <drm/drm_atomic_helper.h>
> +#include <drm/drm_client_setup.h>
>  #include <drm/drm_crtc.h>
>  #include <drm/drm_drv.h>
>  #include <drm/drm_fbdev_dma.h>
> @@ -562,6 +563,7 @@ static void malidp_debugfs_init(struct drm_minor *minor)
>  static const struct drm_driver malidp_driver = {
>  	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>  	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(malidp_dumb_create),
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  #ifdef CONFIG_DEBUG_FS
>  	.debugfs_init = malidp_debugfs_init,
>  #endif
> @@ -852,7 +854,7 @@ static int malidp_bind(struct device *dev)
>  	if (ret)
>  		goto register_fail;
>  
> -	drm_fbdev_dma_setup(drm, 32);
> +	drm_client_setup(drm, NULL);
>  
>  	return 0;
>  
> -- 
> 2.46.0
> 

-- 
====================
| I would like to |
| fix the world,  |
| but they're not |
| giving me the   |
 \ source code!  /
  ---------------
    ¯\_(ツ)_/¯

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 55/86] drm/hyperv_drm: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 55/86] drm/hyperv_drm: " Thomas Zimmermann
@ 2024-08-16 15:36   ` Deepak Rawat
  0 siblings, 0 replies; 131+ messages in thread
From: Deepak Rawat @ 2024-08-16 15:36 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

Reviewed-by: Deepak Rawat <drawat.floss@gmail.com>

On Fri, Aug 16, 2024 at 5:54 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
>
> 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.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Deepak Rawat <drawat.floss@gmail.com>
> ---
>  drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
> index ff93e08d5036..3077ce5470f6 100644
> --- a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
> +++ b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
> @@ -10,6 +10,7 @@
>
>  #include <drm/drm_aperture.h>
>  #include <drm/drm_atomic_helper.h>
> +#include <drm/drm_client_setup.h>
>  #include <drm/drm_drv.h>
>  #include <drm/drm_fbdev_shmem.h>
>  #include <drm/drm_gem_shmem_helper.h>
> @@ -36,6 +37,7 @@ static struct drm_driver hyperv_driver = {
>
>         .fops            = &hv_fops,
>         DRM_GEM_SHMEM_DRIVER_OPS,
> +       DRM_FBDEV_SHMEM_DRIVER_OPS,
>  };
>
>  static int hyperv_pci_probe(struct pci_dev *pdev,
> @@ -149,7 +151,7 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
>                 goto err_free_mmio;
>         }
>
> -       drm_fbdev_shmem_setup(dev, 0);
> +       drm_client_setup(dev, NULL);
>
>         return 0;
>
> --
> 2.46.0
>

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 28/86] drm/mi0283qt: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 28/86] drm/mi0283qt: " Thomas Zimmermann
@ 2024-08-16 16:01   ` Noralf Trønnes
  2024-08-20  7:30     ` Thomas Zimmermann
  2024-08-20  8:25   ` Noralf Trønnes
  1 sibling, 1 reply; 131+ messages in thread
From: Noralf Trønnes @ 2024-08-16 16:01 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau



On 8/16/24 14:22, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: "Noralf Trønnes" <noralf@tronnes.org>
> ---
>  drivers/gpu/drm/tiny/mi0283qt.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/tiny/mi0283qt.c b/drivers/gpu/drm/tiny/mi0283qt.c
> index cdc5423990ca..f1461c55dba6 100644
> --- a/drivers/gpu/drm/tiny/mi0283qt.c
> +++ b/drivers/gpu/drm/tiny/mi0283qt.c

<snip>

> @@ -226,7 +228,7 @@ static int mi0283qt_probe(struct spi_device *spi)
>  
>  	spi_set_drvdata(spi, drm);
>  
> -	drm_fbdev_dma_setup(drm, 0);
> +	drm_client_setup(drm, NULL);

Would it be possible for drm_dev_register() to handle the client setup
so drivers won't have to? struct drm_driver could have a field for
drivers that want a different color format.

Noralf.

>  
>  	return 0;
>  }

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup Thomas Zimmermann
  2024-08-16 13:18   ` Jani Nikula
@ 2024-08-17 10:14   ` kernel test robot
  2024-08-17 12:07   ` kernel test robot
  2 siblings, 0 replies; 131+ messages in thread
From: kernel test robot @ 2024-08-17 10:14 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: oe-kbuild-all, dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann, Jani Nikula, Rodrigo Vivi, Joonas Lahtinen,
	Tvrtko Ursulin, Lucas De Marchi, Thomas Hellström

Hi Thomas,

kernel test robot noticed the following build errors:

[auto build test ERROR on 70d6d55dea574b7b78ccf714699cc5d8d62fcc2c]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/drm-fbdev-helper-Move-color-mode-lookup-into-4CC-format-helper/20240816-210651
base:   70d6d55dea574b7b78ccf714699cc5d8d62fcc2c
patch link:    https://lore.kernel.org/r/20240816125408.310253-84-tzimmermann%40suse.de
patch subject: [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup
config: openrisc-allyesconfig (https://download.01.org/0day-ci/archive/20240817/202408171746.ju5Kg2D3-lkp@intel.com/config)
compiler: or1k-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240817/202408171746.ju5Kg2D3-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408171746.ju5Kg2D3-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/gpu/drm/xe/xe_device.c:20:10: fatal error: intel_fbdev.h: No such file or directory
      20 | #include "intel_fbdev.h"
         |          ^~~~~~~~~~~~~~~
   compilation terminated.


vim +20 drivers/gpu/drm/xe/xe_device.c

    19	
  > 20	#include "intel_fbdev.h"
    21	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup Thomas Zimmermann
  2024-08-16 13:18   ` Jani Nikula
  2024-08-17 10:14   ` kernel test robot
@ 2024-08-17 12:07   ` kernel test robot
  2 siblings, 0 replies; 131+ messages in thread
From: kernel test robot @ 2024-08-17 12:07 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: llvm, oe-kbuild-all, dri-devel, amd-gfx, intel-gfx, intel-xe,
	nouveau, Thomas Zimmermann, Jani Nikula, Rodrigo Vivi,
	Joonas Lahtinen, Tvrtko Ursulin, Lucas De Marchi,
	Thomas Hellström

Hi Thomas,

kernel test robot noticed the following build errors:

[auto build test ERROR on 70d6d55dea574b7b78ccf714699cc5d8d62fcc2c]

url:    https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/drm-fbdev-helper-Move-color-mode-lookup-into-4CC-format-helper/20240816-210651
base:   70d6d55dea574b7b78ccf714699cc5d8d62fcc2c
patch link:    https://lore.kernel.org/r/20240816125408.310253-84-tzimmermann%40suse.de
patch subject: [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup
config: riscv-allyesconfig (https://download.01.org/0day-ci/archive/20240817/202408171913.L3jTjYJX-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 26670e7fa4f032a019d23d56c6a02926e854e8af)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240817/202408171913.L3jTjYJX-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408171913.L3jTjYJX-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/gpu/drm/xe/xe_device.c:6:
   In file included from drivers/gpu/drm/xe/xe_device.h:9:
   In file included from include/drm/drm_util.h:35:
   In file included from include/linux/interrupt.h:22:
   In file included from arch/riscv/include/asm/sections.h:9:
   In file included from include/linux/mm.h:2228:
   include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     500 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     501 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     507 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     508 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     514 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     519 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     520 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:528:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     528 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     529 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/xe/xe_device.c:20:10: fatal error: 'intel_fbdev.h' file not found
      20 | #include "intel_fbdev.h"
         |          ^~~~~~~~~~~~~~~
   5 warnings and 1 error generated.


vim +20 drivers/gpu/drm/xe/xe_device.c

    19	
  > 20	#include "intel_fbdev.h"
    21	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 22/86] drm/ingenic: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 22/86] drm/ingenic: " Thomas Zimmermann
@ 2024-08-17 20:54   ` Paul Cercueil
  0 siblings, 0 replies; 131+ messages in thread
From: Paul Cercueil @ 2024-08-17 20:54 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau

Hi Thomas,

Le vendredi 16 août 2024 à 14:22 +0200, Thomas Zimmermann a écrit :
> 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.
> 
> The ingenic driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Paul Cercueil <paul@crapouillou.net>

Acked-by: Paul Cercueil <paul@crapouillou.net>

Cheers,
-Paul

> ---
>  drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> index 39fa291f43dd..056b70b63554 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> @@ -24,6 +24,7 @@
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/drm_bridge.h>
>  #include <drm/drm_bridge_connector.h>
> +#include <drm/drm_client_setup.h>
>  #include <drm/drm_color_mgmt.h>
>  #include <drm/drm_crtc.h>
>  #include <drm/drm_damage_helper.h>
> @@ -960,6 +961,7 @@ static const struct drm_driver
> ingenic_drm_driver_data = {
>  	.fops			= &ingenic_drm_fops,
>  	.gem_create_object	= ingenic_drm_gem_create_object,
>  	DRM_GEM_DMA_DRIVER_OPS,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  };
>  
>  static const struct drm_plane_funcs ingenic_drm_primary_plane_funcs
> = {
> @@ -1399,7 +1401,7 @@ static int ingenic_drm_bind(struct device *dev,
> bool has_components)
>  		goto err_clk_notifier_unregister;
>  	}
>  
> -	drm_fbdev_dma_setup(drm, 32);
> +	drm_client_setup(drm, NULL);
>  
>  	return 0;
>  


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 46/86] drm/tve200: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 46/86] drm/tve200: " Thomas Zimmermann
@ 2024-08-18  8:51   ` Linus Walleij
  0 siblings, 0 replies; 131+ messages in thread
From: Linus Walleij @ 2024-08-18  8:51 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

On Fri, Aug 16, 2024 at 2:54 PM Thomas Zimmermann <tzimmermann@suse.de> wrote:

> 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.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Linus Walleij <linus.walleij@linaro.org>

This way of passing a mode is definitely an improvement.
Acked-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 25/86] drm/mcde: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 25/86] drm/mcde: " Thomas Zimmermann
@ 2024-08-18  8:51   ` Linus Walleij
  0 siblings, 0 replies; 131+ messages in thread
From: Linus Walleij @ 2024-08-18  8:51 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

On Fri, Aug 16, 2024 at 2:54 PM Thomas Zimmermann <tzimmermann@suse.de> wrote:

> 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.
>
> The mcde driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Linus Walleij <linus.walleij@linaro.org>

Acked-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper
  2024-08-16 12:22 ` [PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper Thomas Zimmermann
@ 2024-08-18 19:22   ` Laurent Pinchart
  0 siblings, 0 replies; 131+ messages in thread
From: Laurent Pinchart @ 2024-08-18 19:22 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

Hi Thomas,

Thank you for the patch.

On Fri, Aug 16, 2024 at 02:22:27PM +0200, Thomas Zimmermann wrote:
> The color mode specified on the kernel command line gives the user's
> preferred color depth and number of bits per pixel. Move the
> color-mode-to-format conversion form fbdev helpers into a 4CC helper,

s/form/from/

> so that is can be shared among DRM clients.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> ---
>  drivers/gpu/drm/drm_fb_helper.c | 70 +++++++--------------------------
>  drivers/gpu/drm/drm_fourcc.c    | 30 +++++++++++++-
>  include/drm/drm_fourcc.h        |  1 +
>  3 files changed, 45 insertions(+), 56 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 29c53f9f449c..af1fe79c701d 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -1441,67 +1441,27 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
>  EXPORT_SYMBOL(drm_fb_helper_pan_display);
>  
>  static uint32_t drm_fb_helper_find_format(struct drm_fb_helper *fb_helper, const uint32_t *formats,
> -					  size_t format_count, uint32_t bpp, uint32_t depth)
> +					  size_t format_count, unsigned int color_mode)
>  {
>  	struct drm_device *dev = fb_helper->dev;
>  	uint32_t format;
>  	size_t i;
>  
> -	/*
> -	 * Do not consider YUV or other complicated formats
> -	 * for framebuffers. This means only legacy formats
> -	 * are supported (fmt->depth is a legacy field), but
> -	 * the framebuffer emulation can only deal with such
> -	 * formats, specifically RGB/BGA formats.
> -	 */
> -	format = drm_mode_legacy_fb_format(bpp, depth);
> -	if (!format)
> -		goto err;
> +	format = drm_driver_color_mode_format(dev, color_mode);
> +	if (!format) {
> +		drm_info(dev, "unsupported color mode of %d\n", color_mode);
> +		return DRM_FORMAT_INVALID;
> +	}
>  
>  	for (i = 0; i < format_count; ++i) {
>  		if (formats[i] == format)
>  			return format;
>  	}
> -
> -err:
> -	/* We found nothing. */
> -	drm_warn(dev, "bpp/depth value of %u/%u not supported\n", bpp, depth);
> +	drm_warn(dev, "format %p4cc not supported\n", &format);
>  
>  	return DRM_FORMAT_INVALID;
>  }
>  
> -static uint32_t drm_fb_helper_find_color_mode_format(struct drm_fb_helper *fb_helper,
> -						     const uint32_t *formats, size_t format_count,
> -						     unsigned int color_mode)
> -{
> -	struct drm_device *dev = fb_helper->dev;
> -	uint32_t bpp, depth;
> -
> -	switch (color_mode) {
> -	case 1:
> -	case 2:
> -	case 4:
> -	case 8:
> -	case 16:
> -	case 24:
> -		bpp = depth = color_mode;
> -		break;
> -	case 15:
> -		bpp = 16;
> -		depth = 15;
> -		break;
> -	case 32:
> -		bpp = 32;
> -		depth = 24;
> -		break;
> -	default:
> -		drm_info(dev, "unsupported color mode of %d\n", color_mode);
> -		return DRM_FORMAT_INVALID;
> -	}
> -
> -	return drm_fb_helper_find_format(fb_helper, formats, format_count, bpp, depth);
> -}
> -
>  static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
>  				      struct drm_fb_helper_surface_size *sizes)
>  {
> @@ -1531,10 +1491,10 @@ static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
>  			if (!cmdline_mode->bpp_specified)
>  				continue;
>  
> -			surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
> -									      plane->format_types,
> -									      plane->format_count,
> -									      cmdline_mode->bpp);
> +			surface_format = drm_fb_helper_find_format(fb_helper,
> +								   plane->format_types,
> +								   plane->format_count,
> +								   cmdline_mode->bpp);
>  			if (surface_format != DRM_FORMAT_INVALID)
>  				break; /* found supported format */
>  		}
> @@ -1544,10 +1504,10 @@ static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
>  			break; /* found supported format */
>  
>  		/* try preferred color mode */
> -		surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
> -								      plane->format_types,
> -								      plane->format_count,
> -								      fb_helper->preferred_bpp);
> +		surface_format = drm_fb_helper_find_format(fb_helper,
> +							   plane->format_types,
> +							   plane->format_count,
> +							   fb_helper->preferred_bpp);
>  		if (surface_format != DRM_FORMAT_INVALID)
>  			break; /* found supported format */
>  	}
> diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
> index 193cf8ed7912..3a94ca211f9c 100644
> --- a/drivers/gpu/drm/drm_fourcc.c
> +++ b/drivers/gpu/drm/drm_fourcc.c
> @@ -36,7 +36,6 @@
>   * @depth: bit depth per pixel
>   *
>   * Computes a drm fourcc pixel format code for the given @bpp/@depth values.
> - * Useful in fbdev emulation code, since that deals in those values.
>   */
>  uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
>  {
> @@ -140,6 +139,35 @@ uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
>  }
>  EXPORT_SYMBOL(drm_driver_legacy_fb_format);
>  
> +/**
> + * drm_driver_color_mode_format - Compute DRM 4CC code from color mode
> + * @dev: DRM device
> + * @color_mode: command-line color mode
> + *
> + * Computes a DRM 4CC pixel format code for the given color mode using
> + * drm_driver_color_mode(). The color mode is in the format used and the
> + * kernel command line. It specifies the number of bits per pixel
> + * and color depth in a single value.
> + *
> + * Useful in fbdev emulation code, since that deals in those values. The
> + * helper does not consider YUV or other complicated formats. This means
> + * only legacy formats are supported (fmt->depth is a legacy field), but
> + * the framebuffer emulation can only deal with such formats, specifically
> + * RGB/BGA formats.
> + */
> +uint32_t drm_driver_color_mode_format(struct drm_device *dev, unsigned int color_mode)
> +{
> +	switch (color_mode) {
> +	case 15:
> +		return drm_driver_legacy_fb_format(dev, 16, 15);
> +	case 32:
> +		return drm_driver_legacy_fb_format(dev, 32, 24);
> +	default:
> +		return drm_driver_legacy_fb_format(dev, color_mode, color_mode);
> +	}
> +}
> +EXPORT_SYMBOL(drm_driver_color_mode_format);
> +
>  /*
>   * Internal function to query information for a given format. See
>   * drm_format_info() for the public API.
> diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
> index ccf91daa4307..c3f4405d6662 100644
> --- a/include/drm/drm_fourcc.h
> +++ b/include/drm/drm_fourcc.h
> @@ -313,6 +313,7 @@ drm_get_format_info(struct drm_device *dev,
>  uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
>  uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
>  				     uint32_t bpp, uint32_t depth);
> +uint32_t drm_driver_color_mode_format(struct drm_device *dev, unsigned int color_mode);
>  unsigned int drm_format_info_block_width(const struct drm_format_info *info,
>  					 int plane);
>  unsigned int drm_format_info_block_height(const struct drm_format_info *info,
> -- 
> 2.46.0
> 

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 04/86] drm: Add client-agnostic setup helper
  2024-08-16 12:22 ` [PATCH 04/86] drm: Add client-agnostic setup helper Thomas Zimmermann
@ 2024-08-18 20:07   ` Laurent Pinchart
  2024-08-20  7:22     ` Thomas Zimmermann
  0 siblings, 1 reply; 131+ messages in thread
From: Laurent Pinchart @ 2024-08-18 20:07 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

Hi Thomas,

Thank you for the patch.

On Fri, Aug 16, 2024 at 02:22:30PM +0200, Thomas Zimmermann wrote:
> DRM may support multiple in-kernel clients that run as soon as a DRM
> driver has been registered. To select the client(s) in a single place,
> introduce drm_client_setup().
> 
> Drivers that call the new helper automatically instantiate the kernel's
> configured default clients. Only fbdev emulation is currently supported.
> Later versions can add support for DRM-based logging, a boot logo or even
> a console.

I really like the direction this is taking :-)

> Some drivers handle the color mode for clients internally. Provide the
> helper drm_client_setup_with_color_mode() for them.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>  drivers/gpu/drm/Makefile           |  1 +
>  drivers/gpu/drm/drm_client_setup.c | 55 ++++++++++++++++++++++++++++++
>  include/drm/drm_client_setup.h     | 12 +++++++
>  3 files changed, 68 insertions(+)
>  create mode 100644 drivers/gpu/drm/drm_client_setup.c
>  create mode 100644 include/drm/drm_client_setup.h
> 
> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> index 0beb55d028a8..e7fc77d1d573 100644
> --- a/drivers/gpu/drm/Makefile
> +++ b/drivers/gpu/drm/Makefile
> @@ -129,6 +129,7 @@ drm_kms_helper-y := \
>  	drm_atomic_helper.o \
>  	drm_atomic_state_helper.o \
>  	drm_bridge_connector.o \
> +	drm_client_setup.o \
>  	drm_crtc_helper.o \
>  	drm_damage_helper.o \
>  	drm_encoder_slave.o \
> diff --git a/drivers/gpu/drm/drm_client_setup.c b/drivers/gpu/drm/drm_client_setup.c
> new file mode 100644
> index 000000000000..2e3315f5c3e2
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_client_setup.c
> @@ -0,0 +1,55 @@
> +// SPDX-License-Identifier: MIT
> +
> +#include <drm/drm_client_setup.h>
> +#include <drm/drm_device.h>
> +#include <drm/drm_fbdev_client.h>
> +#include <drm/drm_fourcc.h>
> +#include <drm/drm_print.h>
> +
> +/**
> + * drm_client_setup() - Setup in-kernel DRM clients
> + * @dev: DRM device
> + * @format: Preferred color format for the device. Use NULL, unless

s/color format/pixel format/

> + *          there is clearly a driver-preferred format.
> + *
> + * This function sets up the in-kernel DRM clients. Restore, hotplug
> + * events and teardown are all taken care of.
> + *
> + * Drivers should call drm_client_setup() after registering the new
> + * DRM device with drm_dev_register(). This function is safe to call
> + * even when there are no connectors present. Setup will be retried
> + * on the next hotplug event.
> + *
> + * The clients are destroyed by drm_dev_unregister().
> + */
> +void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
> +{
> +	int ret;
> +
> +	if (!format)
> +		format = drm_format_info(DRM_FORMAT_XRGB8888);
> +
> +	ret = drm_fbdev_client_setup(dev, format);
> +	if (ret)
> +		drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
> +}
> +EXPORT_SYMBOL(drm_client_setup);
> +
> +/**
> + * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
> + * @dev: DRM device
> + * @color_mode: Preferred color mode for the device
> + *
> + * This function sets up the in-kernel DRM clients. It is equivalent
> + * to drm_client_setup(), but expects a color mode as second argument.
> + *
> + * Do not use this function in new drivers. Prefer drm_client_setup() with a
> + * format of NULL.
> + */
> +void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
> +{
> +	uint32_t fmt = drm_driver_color_mode_format(dev, color_mode);
> +
> +	drm_client_setup(dev, drm_format_info(fmt));
> +}
> +EXPORT_SYMBOL(drm_client_setup_with_color_mode);
> diff --git a/include/drm/drm_client_setup.h b/include/drm/drm_client_setup.h
> new file mode 100644
> index 000000000000..f5fd1fabd4b1
> --- /dev/null
> +++ b/include/drm/drm_client_setup.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: MIT */
> +
> +#ifndef DRM_CLIENT_SETUP_H
> +#define DRM_CLIENT_SETUP_H
> +
> +struct drm_device;
> +struct drm_format_info;
> +
> +void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format);
> +void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode);

This is not common in DRM, so we may not want to introduce it here, but
_Generic() gives a nice function overloading syntax:

void drm_client_setup_with_format(struct drm_device *dev, const struct drm_format_info *format);
void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode);

#define drm_client_setup_(dev, format_or_color_mode)							 \
	_Generic(format_or_color_mode,									 \
		const struct drm_format_info *: drm_client_setup_with_format(dev, format_or_color_mode), \
		unsigned int: drm_client_setup_with_color_mode(dev, format_or_color_mode)		 \
	)

Up to you.

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> +
> +#endif

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 34/86] drm/renesas/rcar-du: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 34/86] drm/renesas/rcar-du: " Thomas Zimmermann
@ 2024-08-18 20:12   ` Laurent Pinchart
  0 siblings, 0 replies; 131+ messages in thread
From: Laurent Pinchart @ 2024-08-18 20:12 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau, Kieran Bingham

Hi Thomas,

Thank you for the patch.

On Fri, Aug 16, 2024 at 02:23:00PM +0200, Thomas Zimmermann wrote:
> 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.
> 
> The rcar-du driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> ---
>  drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
> index fb719d9aff10..4e0bafc86f50 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
> @@ -19,6 +19,7 @@
>  #include <linux/wait.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_dma_helper.h>
> @@ -606,6 +607,7 @@ static const struct drm_driver rcar_du_driver = {
>  	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>  	.dumb_create		= rcar_du_dumb_create,
>  	.gem_prime_import_sg_table = rcar_du_gem_prime_import_sg_table,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  	.fops			= &rcar_du_fops,
>  	.name			= "rcar-du",
>  	.desc			= "Renesas R-Car Display Unit",
> @@ -716,7 +718,7 @@ static int rcar_du_probe(struct platform_device *pdev)
>  
>  	drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
>  
> -	drm_fbdev_dma_setup(&rcdu->ddev, 32);
> +	drm_client_setup(&rcdu->ddev, NULL);
>  
>  	return 0;
>  

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 36/86] drm/renesas/shmobile: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 36/86] drm/renesas/shmobile: " Thomas Zimmermann
@ 2024-08-18 20:17   ` Laurent Pinchart
  0 siblings, 0 replies; 131+ messages in thread
From: Laurent Pinchart @ 2024-08-18 20:17 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau, Geert Uytterhoeven

Hi Thomas,

Thank you for the patch.

On Fri, Aug 16, 2024 at 02:23:02PM +0200, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> ---
>  drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
> index ff2883c7fd46..e82624836c97 100644
> --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
> +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
> @@ -18,8 +18,10 @@
>  #include <linux/slab.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_fourcc.h>
>  #include <drm/drm_gem_dma_helper.h>
>  #include <drm/drm_modeset_helper.h>
>  #include <drm/drm_module.h>
> @@ -101,6 +103,7 @@ DEFINE_DRM_GEM_DMA_FOPS(shmob_drm_fops);
>  static const struct drm_driver shmob_drm_driver = {
>  	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>  	DRM_GEM_DMA_DRIVER_OPS,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  	.fops			= &shmob_drm_fops,
>  	.name			= "shmob-drm",
>  	.desc			= "Renesas SH Mobile DRM",
> @@ -257,7 +260,7 @@ static int shmob_drm_probe(struct platform_device *pdev)
>  	if (ret < 0)
>  		goto err_modeset_cleanup;
>  
> -	drm_fbdev_dma_setup(ddev, 16);
> +	drm_client_setup(ddev, drm_format_info(DRM_FORMAT_RGB565));
>  
>  	return 0;
>  

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 48/86] drm/xlnx: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 48/86] drm/xlnx: " Thomas Zimmermann
@ 2024-08-18 20:19   ` Laurent Pinchart
  2024-08-20  7:52     ` Thomas Zimmermann
  0 siblings, 1 reply; 131+ messages in thread
From: Laurent Pinchart @ 2024-08-18 20:19 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau, Tomi Valkeinen, Michal Simek

Hi Thomas,

Thank you for the patch.

On Fri, Aug 16, 2024 at 02:23:14PM +0200, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> Cc: Michal Simek <michal.simek@amd.com>
> ---
>  drivers/gpu/drm/xlnx/zynqmp_kms.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xlnx/zynqmp_kms.c b/drivers/gpu/drm/xlnx/zynqmp_kms.c
> index bd1368df7870..f26b119322d5 100644
> --- a/drivers/gpu/drm/xlnx/zynqmp_kms.c
> +++ b/drivers/gpu/drm/xlnx/zynqmp_kms.c
> @@ -14,6 +14,7 @@
>  #include <drm/drm_blend.h>
>  #include <drm/drm_bridge.h>
>  #include <drm/drm_bridge_connector.h>
> +#include <drm/drm_client_setup.h>
>  #include <drm/drm_connector.h>
>  #include <drm/drm_crtc.h>
>  #include <drm/drm_device.h>
> @@ -402,6 +403,7 @@ static const struct drm_driver zynqmp_dpsub_drm_driver = {
>  					  DRIVER_ATOMIC,
>  
>  	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(zynqmp_dpsub_dumb_create),
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  
>  	.fops				= &zynqmp_dpsub_drm_fops,
>  
> @@ -523,7 +525,7 @@ int zynqmp_dpsub_drm_init(struct zynqmp_dpsub *dpsub)
>  		goto err_poll_fini;
>  
>  	/* Initialize fbdev generic emulation. */
> -	drm_fbdev_dma_setup(drm, 24);
> +	drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB888));

I know this would be a hassle to change, but do the majority of the
callers of drm_client_setup() have a drm_format_info * already, or do
they need to call drm_format_info() on a 4CC ? In the latter case, would
it be better to pass the 4CC to drm_client_setup() ?

As far as this patch goes,

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

>  
>  	return 0;
>  

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [82/86] drm/i915: Move custom hotplug code into separate callback
  2024-08-16 12:23 ` [PATCH 82/86] drm/i915: Move custom hotplug " Thomas Zimmermann
@ 2024-08-19  8:52   ` Sui Jingfeng
  2024-08-20  7:39     ` Thomas Zimmermann
  0 siblings, 1 reply; 131+ messages in thread
From: Sui Jingfeng @ 2024-08-19  8:52 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Jani Nikula,
	Rodrigo Vivi, Joonas Lahtinen, Tvrtko Ursulin, Lucas De Marchi,
	Thomas Hellström

Hi, Thomas


I love your patch, yet ...


On 2024/8/16 20:23, Thomas Zimmermann wrote:
> i915's fbdev contains additional code for hotplugging a display that
> cannot be ported to the common fbdev client. Introduce the callback
> struct drm_fb_helper.fb_hotplug and implement it for i915. The fbdev
> helpers invoke the callback before handing the hotplug event.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Jani Nikula <jani.nikula@linux.intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Cc: Tvrtko Ursulin <tursulin@ursulin.net>
> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
> Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
> ---
>   drivers/gpu/drm/drm_fb_helper.c            |  6 +++
>   drivers/gpu/drm/i915/display/intel_fbdev.c | 43 ++++++++++++----------
>   include/drm/drm_fb_helper.h                | 13 +++++++
>   3 files changed, 42 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index d9e539b0fd1a..92926cb02dfb 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -1938,6 +1938,12 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
>   	if (!drm_fbdev_emulation || !fb_helper)
>   		return 0;
>   
> +	if (fb_helper->funcs->fb_hotplug) {

We seems need to check the existence on the 'fb_helper->funcs' here,

For example:


if (fb_helper->funcs && fb_helper->funcs->fb_hotplug) {

Otherwise, it will de-reference NULL pointer.
Can be observed on a trivial driver though,
with no monitor(display) connected.


> +		err = fb_helper->funcs->fb_hotplug(fb_helper);
> +		if (err)
> +			return err;
> +	}
> +
>   	mutex_lock(&fb_helper->lock);
>   	if (fb_helper->deferred_setup) {
>   		err = __drm_fb_helper_initial_config_and_unlock(fb_helper);
> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
> index c03fb00002a4..abe77ef0bd84 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
> @@ -305,10 +305,32 @@ static void intelfb_restore(struct drm_fb_helper *fb_helper)
>   	intel_fbdev_invalidate(ifbdev);
>   }
>   
> +static int intelfb_hotplug(struct drm_fb_helper *fb_helper)
> +{
> +	struct drm_device *dev = fb_helper->client.dev;
> +	struct drm_i915_private *dev_priv = to_i915(dev);
> +	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
> +	bool send_hpd;
> +
> +	if (!ifbdev)
> +		return -EINVAL;
> +
> +	mutex_lock(&ifbdev->hpd_lock);
> +	send_hpd = !ifbdev->hpd_suspended;
> +	ifbdev->hpd_waiting = true;
> +	mutex_unlock(&ifbdev->hpd_lock);
> +
> +	if (!send_hpd || !(ifbdev->vma || dev->fb_helper->deferred_setup))
> +		return -EAGAIN;
> +
> +	return 0;
> +}
> +
>   static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
>   	.fb_probe = intelfb_create,
>   	.fb_dirty = intelfb_dirty,
>   	.fb_restore = intelfb_restore,
> +	.fb_hotplug = intelfb_hotplug,
>   };
>   
>   /*
> @@ -557,25 +579,6 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
>   	intel_fbdev_hpd_set_suspend(dev_priv, state);
>   }
>   
> -static int intel_fbdev_output_poll_changed(struct drm_device *dev)
> -{
> -	struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev;
> -	bool send_hpd;
> -
> -	if (!ifbdev)
> -		return -EINVAL;
> -
> -	mutex_lock(&ifbdev->hpd_lock);
> -	send_hpd = !ifbdev->hpd_suspended;
> -	ifbdev->hpd_waiting = true;
> -	mutex_unlock(&ifbdev->hpd_lock);
> -
> -	if (send_hpd && (ifbdev->vma || dev->fb_helper->deferred_setup))
> -		drm_fb_helper_hotplug_event(dev->fb_helper);
> -
> -	return 0;
> -}
> -
>   static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
>   {
>   	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
> @@ -637,7 +640,7 @@ static int intel_fbdev_client_hotplug(struct drm_client_dev *client)
>   	int ret;
>   
>   	if (dev->fb_helper)
> -		return intel_fbdev_output_poll_changed(dev);
> +		return drm_fb_helper_hotplug_event(fb_helper);
>   
>   	ret = drm_fb_helper_init(dev, fb_helper);
>   	if (ret)
> diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
> index 34eb77c18a13..3dcb9a60e408 100644
> --- a/include/drm/drm_fb_helper.h
> +++ b/include/drm/drm_fb_helper.h
> @@ -112,6 +112,19 @@ struct drm_fb_helper_funcs {
>   	 * TODO: Fix i915 to not require this callback.
>   	 */
>   	void (*fb_restore)(struct drm_fb_helper *helper);
> +
> +	/**
> +	 * @fb_hotplug:
> +	 *
> +	 * Driver callback to prepare hotplug event. If set, fbdev
> +	 * emulation will invoke this callback before sending a hotplug
> +	 * event.
> +	 *
> +	 * Only for i915. Do not use in new code.
> +	 *
> +	 * TODO: Fix i915 to not require this callback.
> +	 */
> +	int (*fb_hotplug)(struct drm_fb_helper *helper);
>   };
>   
>   /**

-- 
Best regards,
Sui


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [68/86] drm/loongson: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 68/86] drm/loongson: " Thomas Zimmermann
@ 2024-08-19  9:00   ` Sui Jingfeng
  0 siblings, 0 replies; 131+ messages in thread
From: Sui Jingfeng @ 2024-08-19  9:00 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau

Hi,


On 2024/8/16 20:23, Thomas Zimmermann wrote:
> 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.
>
> The loongson driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>


Thanks,


Acked-by: Sui Jingfeng <sui.jingfeng@linux.dev>

-- 
Best regards,
Sui


^ permalink raw reply	[flat|nested] 131+ messages in thread

* RE: [PATCH 35/86] drm/renesas/rz-du: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 35/86] drm/renesas/rz-du: " Thomas Zimmermann
@ 2024-08-19  9:50   ` Biju Das
  0 siblings, 0 replies; 131+ messages in thread
From: Biju Das @ 2024-08-19  9:50 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel@ffwll.ch, airlied@gmail.com,
	jfalempe@redhat.com, javierm@redhat.com
  Cc: dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org,
	intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
	nouveau@lists.freedesktop.org

Hi Thomas Zimmermann,

> -----Original Message-----
> From: Thomas Zimmermann <tzimmermann@suse.de>
> Sent: Friday, August 16, 2024 1:23 PM
> Subject: [PATCH 35/86] drm/renesas/rz-du: Run DRM default client setup
> 
> 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.
> 
> The rz-du driver specifies a preferred color mode of 32. As this is the default if no format has been
> given, leave it out entirely.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Biju Das <biju.das.jz@bp.renesas.com>

Tested-by: Biju Das <biju.das.jz@bp.renesas.com>

Cheers,
Biju

> ---
>  drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c b/drivers/gpu/drm/renesas/rz-
> du/rzg2l_du_drv.c
> index e5eca8691a33..53f9e1b7fa87 100644
> --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> @@ -13,6 +13,7 @@
>  #include <linux/platform_device.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_dma_helper.h>
> @@ -68,6 +69,7 @@ DEFINE_DRM_GEM_DMA_FOPS(rzg2l_du_fops);
>  static const struct drm_driver rzg2l_du_driver = {
>  	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>  	.dumb_create		= rzg2l_du_dumb_create,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>  	.fops			= &rzg2l_du_fops,
>  	.name			= "rzg2l-du",
>  	.desc			= "Renesas RZ/G2L Display Unit",
> @@ -149,7 +151,7 @@ static int rzg2l_du_probe(struct platform_device *pdev)
> 
>  	drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
> 
> -	drm_fbdev_dma_setup(&rcdu->ddev, 32);
> +	drm_client_setup(&rcdu->ddev, NULL);
> 
>  	return 0;
> 
> --
> 2.46.0


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 31/86] drm/panel/ili9341: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 31/86] drm/panel/ili9341: " Thomas Zimmermann
@ 2024-08-19 15:37   ` Neil Armstrong
  2024-08-19 15:39   ` Neil Armstrong
  1 sibling, 0 replies; 131+ messages in thread
From: Neil Armstrong @ 2024-08-19 15:37 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Jessica Zhang

On 16/08/2024 14:22, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Neil Armstrong <neil.armstrong@linaro.org>
> Cc: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
>   drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
> index 775d5d5e828c..0ef9f7b59ccb 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
> @@ -31,6 +31,7 @@
>   #include <video/mipi_display.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>
> @@ -591,6 +592,7 @@ static struct drm_driver ili9341_dbi_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>   	.fops			= &ili9341_dbi_fops,
>   	DRM_GEM_DMA_DRIVER_OPS_VMAP,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>   	.debugfs_init		= mipi_dbi_debugfs_init,
>   	.name			= "ili9341",
>   	.desc			= "Ilitek ILI9341",
> @@ -651,7 +653,7 @@ static int ili9341_dbi_probe(struct spi_device *spi, struct gpio_desc *dc,
>   
>   	spi_set_drvdata(spi, drm);
>   
> -	drm_fbdev_dma_setup(drm, 0);
> +	drm_client_setup(drm, NULL);
>   
>   	return 0;
>   }

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 31/86] drm/panel/ili9341: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 31/86] drm/panel/ili9341: " Thomas Zimmermann
  2024-08-19 15:37   ` Neil Armstrong
@ 2024-08-19 15:39   ` Neil Armstrong
  2024-08-20  7:33     ` Thomas Zimmermann
  1 sibling, 1 reply; 131+ messages in thread
From: Neil Armstrong @ 2024-08-19 15:39 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Jessica Zhang

On 16/08/2024 14:22, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Neil Armstrong <neil.armstrong@linaro.org>
> Cc: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
>   drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
> index 775d5d5e828c..0ef9f7b59ccb 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
> @@ -31,6 +31,7 @@
>   #include <video/mipi_display.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>
> @@ -591,6 +592,7 @@ static struct drm_driver ili9341_dbi_driver = {
>   	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>   	.fops			= &ili9341_dbi_fops,
>   	DRM_GEM_DMA_DRIVER_OPS_VMAP,
> +	DRM_FBDEV_DMA_DRIVER_OPS,
>   	.debugfs_init		= mipi_dbi_debugfs_init,
>   	.name			= "ili9341",
>   	.desc			= "Ilitek ILI9341",
> @@ -651,7 +653,7 @@ static int ili9341_dbi_probe(struct spi_device *spi, struct gpio_desc *dc,
>   
>   	spi_set_drvdata(spi, drm);
>   
> -	drm_fbdev_dma_setup(drm, 0);
> +	drm_client_setup(drm, NULL);
>   
>   	return 0;
>   }

So which one is right, this one or :
https://lore.kernel.org/all/20240813091258.1625646-1-andriy.shevchenko@linux.intel.com/
?

Neil

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 57/86] drm/ofdrm: Use DRM default client setup
  2024-08-16 12:23 ` [PATCH 57/86] drm/ofdrm: Use " Thomas Zimmermann
@ 2024-08-19 16:40   ` Javier Martinez Canillas
  0 siblings, 0 replies; 131+ messages in thread
From: Javier Martinez Canillas @ 2024-08-19 16:40 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

Thomas Zimmermann <tzimmermann@suse.de> writes:

Hello Thomas,

> 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.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Javier Martinez Canillas <javierm@redhat.com>
> ---
>  drivers/gpu/drm/tiny/ofdrm.c | 9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)

Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>

-- 
Best regards,

Javier Martinez Canillas
Core Platforms
Red Hat


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 58/86] drm/simpledrm: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 58/86] drm/simpledrm: Run " Thomas Zimmermann
@ 2024-08-19 16:41   ` Javier Martinez Canillas
  0 siblings, 0 replies; 131+ messages in thread
From: Javier Martinez Canillas @ 2024-08-19 16:41 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

Thomas Zimmermann <tzimmermann@suse.de> writes:

> 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.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Javier Martinez Canillas <javierm@redhat.com>
> ---
>  drivers/gpu/drm/tiny/simpledrm.c | 9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
>

Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>

-- 
Best regards,

Javier Martinez Canillas
Core Platforms
Red Hat


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 59/86] drm/solomon: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 59/86] drm/solomon: " Thomas Zimmermann
@ 2024-08-19 16:42   ` Javier Martinez Canillas
  0 siblings, 0 replies; 131+ messages in thread
From: Javier Martinez Canillas @ 2024-08-19 16:42 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau,
	Thomas Zimmermann

Thomas Zimmermann <tzimmermann@suse.de> writes:

> 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.
>
> The solomon driver specifies a preferred color mode of 32. As this
> is the default if no format has been given, leave it out entirely.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Javier Martinez Canillas <javierm@redhat.com>
> ---
>  drivers/gpu/drm/solomon/ssd130x.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>

Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>

-- 
Best regards,

Javier Martinez Canillas
Core Platforms
Red Hat


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 04/86] drm: Add client-agnostic setup helper
  2024-08-18 20:07   ` Laurent Pinchart
@ 2024-08-20  7:22     ` Thomas Zimmermann
  2024-08-20  7:40       ` Laurent Pinchart
  0 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-20  7:22 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

Hi

Am 18.08.24 um 22:07 schrieb Laurent Pinchart:
> Hi Thomas,
>
> Thank you for the patch.
>
> On Fri, Aug 16, 2024 at 02:22:30PM +0200, Thomas Zimmermann wrote:
>> DRM may support multiple in-kernel clients that run as soon as a DRM
>> driver has been registered. To select the client(s) in a single place,
>> introduce drm_client_setup().
>>
>> Drivers that call the new helper automatically instantiate the kernel's
>> configured default clients. Only fbdev emulation is currently supported.
>> Later versions can add support for DRM-based logging, a boot logo or even
>> a console.
> I really like the direction this is taking :-)
>
>> Some drivers handle the color mode for clients internally. Provide the
>> helper drm_client_setup_with_color_mode() for them.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> ---
>>   drivers/gpu/drm/Makefile           |  1 +
>>   drivers/gpu/drm/drm_client_setup.c | 55 ++++++++++++++++++++++++++++++
>>   include/drm/drm_client_setup.h     | 12 +++++++
>>   3 files changed, 68 insertions(+)
>>   create mode 100644 drivers/gpu/drm/drm_client_setup.c
>>   create mode 100644 include/drm/drm_client_setup.h
>>
>> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
>> index 0beb55d028a8..e7fc77d1d573 100644
>> --- a/drivers/gpu/drm/Makefile
>> +++ b/drivers/gpu/drm/Makefile
>> @@ -129,6 +129,7 @@ drm_kms_helper-y := \
>>   	drm_atomic_helper.o \
>>   	drm_atomic_state_helper.o \
>>   	drm_bridge_connector.o \
>> +	drm_client_setup.o \
>>   	drm_crtc_helper.o \
>>   	drm_damage_helper.o \
>>   	drm_encoder_slave.o \
>> diff --git a/drivers/gpu/drm/drm_client_setup.c b/drivers/gpu/drm/drm_client_setup.c
>> new file mode 100644
>> index 000000000000..2e3315f5c3e2
>> --- /dev/null
>> +++ b/drivers/gpu/drm/drm_client_setup.c
>> @@ -0,0 +1,55 @@
>> +// SPDX-License-Identifier: MIT
>> +
>> +#include <drm/drm_client_setup.h>
>> +#include <drm/drm_device.h>
>> +#include <drm/drm_fbdev_client.h>
>> +#include <drm/drm_fourcc.h>
>> +#include <drm/drm_print.h>
>> +
>> +/**
>> + * drm_client_setup() - Setup in-kernel DRM clients
>> + * @dev: DRM device
>> + * @format: Preferred color format for the device. Use NULL, unless
> s/color format/pixel format/

Ah, ok.

>
>> + *          there is clearly a driver-preferred format.
>> + *
>> + * This function sets up the in-kernel DRM clients. Restore, hotplug
>> + * events and teardown are all taken care of.
>> + *
>> + * Drivers should call drm_client_setup() after registering the new
>> + * DRM device with drm_dev_register(). This function is safe to call
>> + * even when there are no connectors present. Setup will be retried
>> + * on the next hotplug event.
>> + *
>> + * The clients are destroyed by drm_dev_unregister().
>> + */
>> +void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
>> +{
>> +	int ret;
>> +
>> +	if (!format)
>> +		format = drm_format_info(DRM_FORMAT_XRGB8888);
>> +
>> +	ret = drm_fbdev_client_setup(dev, format);
>> +	if (ret)
>> +		drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
>> +}
>> +EXPORT_SYMBOL(drm_client_setup);
>> +
>> +/**
>> + * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
>> + * @dev: DRM device
>> + * @color_mode: Preferred color mode for the device
>> + *
>> + * This function sets up the in-kernel DRM clients. It is equivalent
>> + * to drm_client_setup(), but expects a color mode as second argument.
>> + *
>> + * Do not use this function in new drivers. Prefer drm_client_setup() with a
>> + * format of NULL.
>> + */
>> +void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
>> +{
>> +	uint32_t fmt = drm_driver_color_mode_format(dev, color_mode);
>> +
>> +	drm_client_setup(dev, drm_format_info(fmt));
>> +}
>> +EXPORT_SYMBOL(drm_client_setup_with_color_mode);
>> diff --git a/include/drm/drm_client_setup.h b/include/drm/drm_client_setup.h
>> new file mode 100644
>> index 000000000000..f5fd1fabd4b1
>> --- /dev/null
>> +++ b/include/drm/drm_client_setup.h
>> @@ -0,0 +1,12 @@
>> +/* SPDX-License-Identifier: MIT */
>> +
>> +#ifndef DRM_CLIENT_SETUP_H
>> +#define DRM_CLIENT_SETUP_H
>> +
>> +struct drm_device;
>> +struct drm_format_info;
>> +
>> +void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format);
>> +void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode);
> This is not common in DRM, so we may not want to introduce it here, but
> _Generic() gives a nice function overloading syntax:
>
> void drm_client_setup_with_format(struct drm_device *dev, const struct drm_format_info *format);
> void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode);
>
> #define drm_client_setup_(dev, format_or_color_mode)							 \
> 	_Generic(format_or_color_mode,									 \
> 		const struct drm_format_info *: drm_client_setup_with_format(dev, format_or_color_mode), \
> 		unsigned int: drm_client_setup_with_color_mode(dev, format_or_color_mode)		 \
> 	)
>
> Up to you.

The color format is really a user interface. I'd rather like to remove 
it from the implementation where possible.

Best regards
Thomas

>
> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
>
>> +
>> +#endif

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 28/86] drm/mi0283qt: Run DRM default client setup
  2024-08-16 16:01   ` Noralf Trønnes
@ 2024-08-20  7:30     ` Thomas Zimmermann
  0 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-20  7:30 UTC (permalink / raw)
  To: Noralf Trønnes, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau

Hi

Am 16.08.24 um 18:01 schrieb Noralf Trønnes:
>
> On 8/16/24 14:22, Thomas Zimmermann wrote:
>> 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.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> Cc: "Noralf Trønnes" <noralf@tronnes.org>
>> ---
>>   drivers/gpu/drm/tiny/mi0283qt.c | 4 +++-
>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/tiny/mi0283qt.c b/drivers/gpu/drm/tiny/mi0283qt.c
>> index cdc5423990ca..f1461c55dba6 100644
>> --- a/drivers/gpu/drm/tiny/mi0283qt.c
>> +++ b/drivers/gpu/drm/tiny/mi0283qt.c
> <snip>
>
>> @@ -226,7 +228,7 @@ static int mi0283qt_probe(struct spi_device *spi)
>>   
>>   	spi_set_drvdata(spi, drm);
>>   
>> -	drm_fbdev_dma_setup(drm, 0);
>> +	drm_client_setup(drm, NULL);
> Would it be possible for drm_dev_register() to handle the client setup
> so drivers won't have to? struct drm_driver could have a field for
> drivers that want a different color format.

There's drm_mode_config.preferred_depth, which at least serves this 
purpose to some extend.

I briefly considered using drm_dev_register() while making the patches, 
but then decided against it. In terms of design, functions should only 
do one thing. In practical terms, there is at least one driver author 
that explicitly decided against instantiating clients in the driver 
(sprd IIRC). And there is at least one driver where client format and 
preferred_depth are different (vc4).

But hopefully this series is the final major interface rework of this 
kind and later changes can be done within drm_client_setup() or 
incrementally.

Best regards
Thomas

>
> Noralf.
>
>>   
>>   	return 0;
>>   }

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 31/86] drm/panel/ili9341: Run DRM default client setup
  2024-08-19 15:39   ` Neil Armstrong
@ 2024-08-20  7:33     ` Thomas Zimmermann
  0 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-20  7:33 UTC (permalink / raw)
  To: neil.armstrong, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Jessica Zhang

Hi

Am 19.08.24 um 17:39 schrieb Neil Armstrong:
> On 16/08/2024 14:22, Thomas Zimmermann wrote:
>> 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.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> Cc: Neil Armstrong <neil.armstrong@linaro.org>
>> Cc: Jessica Zhang <quic_jesszhan@quicinc.com>
>> ---
>>   drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 4 +++-
>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c 
>> b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
>> index 775d5d5e828c..0ef9f7b59ccb 100644
>> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
>> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
>> @@ -31,6 +31,7 @@
>>   #include <video/mipi_display.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>
>> @@ -591,6 +592,7 @@ static struct drm_driver ili9341_dbi_driver = {
>>       .driver_features    = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
>>       .fops            = &ili9341_dbi_fops,
>>       DRM_GEM_DMA_DRIVER_OPS_VMAP,
>> +    DRM_FBDEV_DMA_DRIVER_OPS,
>>       .debugfs_init        = mipi_dbi_debugfs_init,
>>       .name            = "ili9341",
>>       .desc            = "Ilitek ILI9341",
>> @@ -651,7 +653,7 @@ static int ili9341_dbi_probe(struct spi_device 
>> *spi, struct gpio_desc *dc,
>>         spi_set_drvdata(spi, drm);
>>   -    drm_fbdev_dma_setup(drm, 0);
>> +    drm_client_setup(drm, NULL);
>>         return 0;
>>   }
>
> So which one is right, this one or :
> https://lore.kernel.org/all/20240813091258.1625646-1-andriy.shevchenko@linux.intel.com/ 
>
> ?

There's long been talk about removing some duplicated drivers. IDK which 
is the correct or best one. I'll patch the panel driver if it will still 
be there.

Best regards
Thomas

>
> Neil

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [82/86] drm/i915: Move custom hotplug code into separate callback
  2024-08-19  8:52   ` [82/86] " Sui Jingfeng
@ 2024-08-20  7:39     ` Thomas Zimmermann
  2024-08-20 10:39       ` Sui Jingfeng
  0 siblings, 1 reply; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-20  7:39 UTC (permalink / raw)
  To: Sui Jingfeng, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Jani Nikula,
	Rodrigo Vivi, Joonas Lahtinen, Tvrtko Ursulin, Lucas De Marchi,
	Thomas Hellström

Hi

Am 19.08.24 um 10:52 schrieb Sui Jingfeng:
> Hi, Thomas
>
>
> I love your patch, yet ...
>
>
> On 2024/8/16 20:23, Thomas Zimmermann wrote:
>> i915's fbdev contains additional code for hotplugging a display that
>> cannot be ported to the common fbdev client. Introduce the callback
>> struct drm_fb_helper.fb_hotplug and implement it for i915. The fbdev
>> helpers invoke the callback before handing the hotplug event.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> Cc: Jani Nikula <jani.nikula@linux.intel.com>
>> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
>> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>> Cc: Tvrtko Ursulin <tursulin@ursulin.net>
>> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>> Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
>> ---
>>   drivers/gpu/drm/drm_fb_helper.c            |  6 +++
>>   drivers/gpu/drm/i915/display/intel_fbdev.c | 43 ++++++++++++----------
>>   include/drm/drm_fb_helper.h                | 13 +++++++
>>   3 files changed, 42 insertions(+), 20 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_fb_helper.c 
>> b/drivers/gpu/drm/drm_fb_helper.c
>> index d9e539b0fd1a..92926cb02dfb 100644
>> --- a/drivers/gpu/drm/drm_fb_helper.c
>> +++ b/drivers/gpu/drm/drm_fb_helper.c
>> @@ -1938,6 +1938,12 @@ int drm_fb_helper_hotplug_event(struct 
>> drm_fb_helper *fb_helper)
>>       if (!drm_fbdev_emulation || !fb_helper)
>>           return 0;
>>   +    if (fb_helper->funcs->fb_hotplug) {
>
> We seems need to check the existence on the 'fb_helper->funcs' here,
>
> For example:
>
>
> if (fb_helper->funcs && fb_helper->funcs->fb_hotplug) {
>
> Otherwise, it will de-reference NULL pointer.
> Can be observed on a trivial driver though,
> with no monitor(display) connected.

Indeed. That needs to be fixed. Thank you for noting.

To give some context:  I was hoping to remove drm_fb_helper_funcs at 
some point. fb_probe is now gone with these patches and fb_dirty can 
certainly be replaced as well. (I once had prototype patches to do 
that). This leaves the new callbacks for 915, for which I don't have a 
good alternative solution. So it seems that drm_fb_helper_funcs will 
only be used by i915/xe in the long term.

Best regards
Thomas

>
>
>> +        err = fb_helper->funcs->fb_hotplug(fb_helper);
>> +        if (err)
>> +            return err;
>> +    }
>> +
>>       mutex_lock(&fb_helper->lock);
>>       if (fb_helper->deferred_setup) {
>>           err = __drm_fb_helper_initial_config_and_unlock(fb_helper);
>> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c 
>> b/drivers/gpu/drm/i915/display/intel_fbdev.c
>> index c03fb00002a4..abe77ef0bd84 100644
>> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c
>> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
>> @@ -305,10 +305,32 @@ static void intelfb_restore(struct 
>> drm_fb_helper *fb_helper)
>>       intel_fbdev_invalidate(ifbdev);
>>   }
>>   +static int intelfb_hotplug(struct drm_fb_helper *fb_helper)
>> +{
>> +    struct drm_device *dev = fb_helper->client.dev;
>> +    struct drm_i915_private *dev_priv = to_i915(dev);
>> +    struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
>> +    bool send_hpd;
>> +
>> +    if (!ifbdev)
>> +        return -EINVAL;
>> +
>> +    mutex_lock(&ifbdev->hpd_lock);
>> +    send_hpd = !ifbdev->hpd_suspended;
>> +    ifbdev->hpd_waiting = true;
>> +    mutex_unlock(&ifbdev->hpd_lock);
>> +
>> +    if (!send_hpd || !(ifbdev->vma || dev->fb_helper->deferred_setup))
>> +        return -EAGAIN;
>> +
>> +    return 0;
>> +}
>> +
>>   static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
>>       .fb_probe = intelfb_create,
>>       .fb_dirty = intelfb_dirty,
>>       .fb_restore = intelfb_restore,
>> +    .fb_hotplug = intelfb_hotplug,
>>   };
>>     /*
>> @@ -557,25 +579,6 @@ void intel_fbdev_set_suspend(struct drm_device 
>> *dev, int state, bool synchronous
>>       intel_fbdev_hpd_set_suspend(dev_priv, state);
>>   }
>>   -static int intel_fbdev_output_poll_changed(struct drm_device *dev)
>> -{
>> -    struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev;
>> -    bool send_hpd;
>> -
>> -    if (!ifbdev)
>> -        return -EINVAL;
>> -
>> -    mutex_lock(&ifbdev->hpd_lock);
>> -    send_hpd = !ifbdev->hpd_suspended;
>> -    ifbdev->hpd_waiting = true;
>> -    mutex_unlock(&ifbdev->hpd_lock);
>> -
>> -    if (send_hpd && (ifbdev->vma || dev->fb_helper->deferred_setup))
>> -        drm_fb_helper_hotplug_event(dev->fb_helper);
>> -
>> -    return 0;
>> -}
>> -
>>   static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
>>   {
>>       struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
>> @@ -637,7 +640,7 @@ static int intel_fbdev_client_hotplug(struct 
>> drm_client_dev *client)
>>       int ret;
>>         if (dev->fb_helper)
>> -        return intel_fbdev_output_poll_changed(dev);
>> +        return drm_fb_helper_hotplug_event(fb_helper);
>>         ret = drm_fb_helper_init(dev, fb_helper);
>>       if (ret)
>> diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
>> index 34eb77c18a13..3dcb9a60e408 100644
>> --- a/include/drm/drm_fb_helper.h
>> +++ b/include/drm/drm_fb_helper.h
>> @@ -112,6 +112,19 @@ struct drm_fb_helper_funcs {
>>        * TODO: Fix i915 to not require this callback.
>>        */
>>       void (*fb_restore)(struct drm_fb_helper *helper);
>> +
>> +    /**
>> +     * @fb_hotplug:
>> +     *
>> +     * Driver callback to prepare hotplug event. If set, fbdev
>> +     * emulation will invoke this callback before sending a hotplug
>> +     * event.
>> +     *
>> +     * Only for i915. Do not use in new code.
>> +     *
>> +     * TODO: Fix i915 to not require this callback.
>> +     */
>> +    int (*fb_hotplug)(struct drm_fb_helper *helper);
>>   };
>>     /**
>

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 04/86] drm: Add client-agnostic setup helper
  2024-08-20  7:22     ` Thomas Zimmermann
@ 2024-08-20  7:40       ` Laurent Pinchart
  2024-08-20  7:53         ` Thomas Zimmermann
  0 siblings, 1 reply; 131+ messages in thread
From: Laurent Pinchart @ 2024-08-20  7:40 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

Hi Thomas,

On Tue, Aug 20, 2024 at 09:22:36AM +0200, Thomas Zimmermann wrote:
> Am 18.08.24 um 22:07 schrieb Laurent Pinchart:
> > On Fri, Aug 16, 2024 at 02:22:30PM +0200, Thomas Zimmermann wrote:
> >> DRM may support multiple in-kernel clients that run as soon as a DRM
> >> driver has been registered. To select the client(s) in a single place,
> >> introduce drm_client_setup().
> >>
> >> Drivers that call the new helper automatically instantiate the kernel's
> >> configured default clients. Only fbdev emulation is currently supported.
> >> Later versions can add support for DRM-based logging, a boot logo or even
> >> a console.
> > I really like the direction this is taking :-)
> >
> >> Some drivers handle the color mode for clients internally. Provide the
> >> helper drm_client_setup_with_color_mode() for them.
> >>
> >> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> >> ---
> >>   drivers/gpu/drm/Makefile           |  1 +
> >>   drivers/gpu/drm/drm_client_setup.c | 55 ++++++++++++++++++++++++++++++
> >>   include/drm/drm_client_setup.h     | 12 +++++++
> >>   3 files changed, 68 insertions(+)
> >>   create mode 100644 drivers/gpu/drm/drm_client_setup.c
> >>   create mode 100644 include/drm/drm_client_setup.h
> >>
> >> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> >> index 0beb55d028a8..e7fc77d1d573 100644
> >> --- a/drivers/gpu/drm/Makefile
> >> +++ b/drivers/gpu/drm/Makefile
> >> @@ -129,6 +129,7 @@ drm_kms_helper-y := \
> >>   	drm_atomic_helper.o \
> >>   	drm_atomic_state_helper.o \
> >>   	drm_bridge_connector.o \
> >> +	drm_client_setup.o \
> >>   	drm_crtc_helper.o \
> >>   	drm_damage_helper.o \
> >>   	drm_encoder_slave.o \
> >> diff --git a/drivers/gpu/drm/drm_client_setup.c b/drivers/gpu/drm/drm_client_setup.c
> >> new file mode 100644
> >> index 000000000000..2e3315f5c3e2
> >> --- /dev/null
> >> +++ b/drivers/gpu/drm/drm_client_setup.c
> >> @@ -0,0 +1,55 @@
> >> +// SPDX-License-Identifier: MIT
> >> +
> >> +#include <drm/drm_client_setup.h>
> >> +#include <drm/drm_device.h>
> >> +#include <drm/drm_fbdev_client.h>
> >> +#include <drm/drm_fourcc.h>
> >> +#include <drm/drm_print.h>
> >> +
> >> +/**
> >> + * drm_client_setup() - Setup in-kernel DRM clients
> >> + * @dev: DRM device
> >> + * @format: Preferred color format for the device. Use NULL, unless
> >>
> > s/color format/pixel format/
> 
> Ah, ok.
> 
> >> + *          there is clearly a driver-preferred format.
> >> + *
> >> + * This function sets up the in-kernel DRM clients. Restore, hotplug
> >> + * events and teardown are all taken care of.
> >> + *
> >> + * Drivers should call drm_client_setup() after registering the new
> >> + * DRM device with drm_dev_register(). This function is safe to call
> >> + * even when there are no connectors present. Setup will be retried
> >> + * on the next hotplug event.
> >> + *
> >> + * The clients are destroyed by drm_dev_unregister().
> >> + */
> >> +void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
> >> +{
> >> +	int ret;
> >> +
> >> +	if (!format)
> >> +		format = drm_format_info(DRM_FORMAT_XRGB8888);
> >> +
> >> +	ret = drm_fbdev_client_setup(dev, format);
> >> +	if (ret)
> >> +		drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
> >> +}
> >> +EXPORT_SYMBOL(drm_client_setup);
> >> +
> >> +/**
> >> + * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
> >> + * @dev: DRM device
> >> + * @color_mode: Preferred color mode for the device
> >> + *
> >> + * This function sets up the in-kernel DRM clients. It is equivalent
> >> + * to drm_client_setup(), but expects a color mode as second argument.
> >> + *
> >> + * Do not use this function in new drivers. Prefer drm_client_setup() with a
> >> + * format of NULL.
> >> + */
> >> +void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
> >> +{
> >> +	uint32_t fmt = drm_driver_color_mode_format(dev, color_mode);
> >> +
> >> +	drm_client_setup(dev, drm_format_info(fmt));
> >> +}
> >> +EXPORT_SYMBOL(drm_client_setup_with_color_mode);
> >> diff --git a/include/drm/drm_client_setup.h b/include/drm/drm_client_setup.h
> >> new file mode 100644
> >> index 000000000000..f5fd1fabd4b1
> >> --- /dev/null
> >> +++ b/include/drm/drm_client_setup.h
> >> @@ -0,0 +1,12 @@
> >> +/* SPDX-License-Identifier: MIT */
> >> +
> >> +#ifndef DRM_CLIENT_SETUP_H
> >> +#define DRM_CLIENT_SETUP_H
> >> +
> >> +struct drm_device;
> >> +struct drm_format_info;
> >> +
> >> +void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format);
> >> +void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode);
> > This is not common in DRM, so we may not want to introduce it here, but
> > _Generic() gives a nice function overloading syntax:
> >
> > void drm_client_setup_with_format(struct drm_device *dev, const struct drm_format_info *format);
> > void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode);
> >
> > #define drm_client_setup_(dev, format_or_color_mode)							 \
> > 	_Generic(format_or_color_mode,									 \
> > 		const struct drm_format_info *: drm_client_setup_with_format(dev, format_or_color_mode), \
> > 		unsigned int: drm_client_setup_with_color_mode(dev, format_or_color_mode)		 \
> > 	)
> >
> > Up to you.
> 
> The color format is really a user interface. I'd rather like to remove 
> it from the implementation where possible.

Do you mean the color mode ? If so I agree.

> > Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> >
> >> +
> >> +#endif

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 48/86] drm/xlnx: Run DRM default client setup
  2024-08-18 20:19   ` Laurent Pinchart
@ 2024-08-20  7:52     ` Thomas Zimmermann
  0 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-20  7:52 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau, Tomi Valkeinen, Michal Simek

Hi

Am 18.08.24 um 22:19 schrieb Laurent Pinchart:
> Hi Thomas,
>
> Thank you for the patch.
>
> On Fri, Aug 16, 2024 at 02:23:14PM +0200, Thomas Zimmermann wrote:
>> 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.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>> Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
>> Cc: Michal Simek <michal.simek@amd.com>
>> ---
>>   drivers/gpu/drm/xlnx/zynqmp_kms.c | 4 +++-
>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/xlnx/zynqmp_kms.c b/drivers/gpu/drm/xlnx/zynqmp_kms.c
>> index bd1368df7870..f26b119322d5 100644
>> --- a/drivers/gpu/drm/xlnx/zynqmp_kms.c
>> +++ b/drivers/gpu/drm/xlnx/zynqmp_kms.c
>> @@ -14,6 +14,7 @@
>>   #include <drm/drm_blend.h>
>>   #include <drm/drm_bridge.h>
>>   #include <drm/drm_bridge_connector.h>
>> +#include <drm/drm_client_setup.h>
>>   #include <drm/drm_connector.h>
>>   #include <drm/drm_crtc.h>
>>   #include <drm/drm_device.h>
>> @@ -402,6 +403,7 @@ static const struct drm_driver zynqmp_dpsub_drm_driver = {
>>   					  DRIVER_ATOMIC,
>>   
>>   	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(zynqmp_dpsub_dumb_create),
>> +	DRM_FBDEV_DMA_DRIVER_OPS,
>>   
>>   	.fops				= &zynqmp_dpsub_drm_fops,
>>   
>> @@ -523,7 +525,7 @@ int zynqmp_dpsub_drm_init(struct zynqmp_dpsub *dpsub)
>>   		goto err_poll_fini;
>>   
>>   	/* Initialize fbdev generic emulation. */
>> -	drm_fbdev_dma_setup(drm, 24);
>> +	drm_client_setup(drm, drm_format_info(DRM_FORMAT_RGB888));
> I know this would be a hassle to change, but do the majority of the
> callers of drm_client_setup() have a drm_format_info * already, or do
> they need to call drm_format_info() on a 4CC ? In the latter case, would
> it be better to pass the 4CC to drm_client_setup() ?

Good idea. Most of the drivers have a 4cc code, but no format-info 
pointer. I think there are enough instances that it makes sense to add a 
little helper, drm_client_setup_with_fourcc(), for these drivers.

There's also preferred_depth from drm_mode_config. It's already used in 
the client mode-setting code. That means that in some drivers, the 
format parameter to drm_client_setup() could likely be dropped.

Best regards
Thomas

>
> As far as this patch goes,
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
>
>>   
>>   	return 0;
>>   

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 04/86] drm: Add client-agnostic setup helper
  2024-08-20  7:40       ` Laurent Pinchart
@ 2024-08-20  7:53         ` Thomas Zimmermann
  0 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-20  7:53 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: daniel, airlied, jfalempe, javierm, dri-devel, amd-gfx, intel-gfx,
	intel-xe, nouveau

Hi

Am 20.08.24 um 09:40 schrieb Laurent Pinchart:
>> The color format is really a user interface. I'd rather like to remove
>> it from the implementation where possible.
> Do you mean the color mode ? If so I agree.

Yeah, the "color mode". This number with inconsistent semantics.

Best regards
Thomas

>
>>> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
>>>
>>>> +
>>>> +#endif

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 28/86] drm/mi0283qt: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 28/86] drm/mi0283qt: " Thomas Zimmermann
  2024-08-16 16:01   ` Noralf Trønnes
@ 2024-08-20  8:25   ` Noralf Trønnes
  1 sibling, 0 replies; 131+ messages in thread
From: Noralf Trønnes @ 2024-08-20  8:25 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, noralf



On 8/16/24 14:22, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: "Noralf Trønnes" <noralf@tronnes.org>
> ---

Acked-by: Noralf Trønnes <noralf@tronnes.org>

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 32/86] drm/panel-mipi-dbi: Run DRM default client setup
  2024-08-16 12:22 ` [PATCH 32/86] drm/panel-mipi-dbi: " Thomas Zimmermann
@ 2024-08-20  8:26   ` Noralf Trønnes
  0 siblings, 0 replies; 131+ messages in thread
From: Noralf Trønnes @ 2024-08-20  8:26 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, noralf



On 8/16/24 14:22, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: "Noralf Trønnes" <noralf@tronnes.org>
> ---

Acked-by: Noralf Trønnes <noralf@tronnes.org>

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 37/86] drm/repaper: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 37/86] drm/repaper: " Thomas Zimmermann
@ 2024-08-20  8:26   ` Noralf Trønnes
  0 siblings, 0 replies; 131+ messages in thread
From: Noralf Trønnes @ 2024-08-20  8:26 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau



On 8/16/24 14:23, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: "Noralf Trønnes" <noralf@tronnes.org>
> ---

Acked-by: Noralf Trønnes <noralf@tronnes.org>

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 54/86] drm/gud: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 54/86] drm/gud: " Thomas Zimmermann
@ 2024-08-20  8:27   ` Noralf Trønnes
  0 siblings, 0 replies; 131+ messages in thread
From: Noralf Trønnes @ 2024-08-20  8:27 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, noralf



On 8/16/24 14:23, Thomas Zimmermann wrote:
> 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.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: "Noralf Trønnes" <noralf@tronnes.org>
> ---

Acked-by: Noralf Trønnes <noralf@tronnes.org>

^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [82/86] drm/i915: Move custom hotplug code into separate callback
  2024-08-20  7:39     ` Thomas Zimmermann
@ 2024-08-20 10:39       ` Sui Jingfeng
  2024-08-20 12:42         ` Thomas Zimmermann
  0 siblings, 1 reply; 131+ messages in thread
From: Sui Jingfeng @ 2024-08-20 10:39 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Jani Nikula,
	Rodrigo Vivi, Joonas Lahtinen, Tvrtko Ursulin, Lucas De Marchi,
	Thomas Hellström

Hi,


On 2024/8/20 15:39, Thomas Zimmermann wrote:
> Hi
>
> Am 19.08.24 um 10:52 schrieb Sui Jingfeng:
>> Hi, Thomas
>>
>>
>> I love your patch, yet ...
>>
>>
>> On 2024/8/16 20:23, Thomas Zimmermann wrote:
>>> i915's fbdev contains additional code for hotplugging a display that
>>> cannot be ported to the common fbdev client. Introduce the callback
>>> struct drm_fb_helper.fb_hotplug and implement it for i915. The fbdev
>>> helpers invoke the callback before handing the hotplug event.
>>>
>>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>>> Cc: Jani Nikula <jani.nikula@linux.intel.com>
>>> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
>>> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>>> Cc: Tvrtko Ursulin <tursulin@ursulin.net>
>>> Cc: Lucas De Marchi <lucas.demarchi@intel.com>
>>> Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
>>> ---
>>>   drivers/gpu/drm/drm_fb_helper.c            |  6 +++
>>>   drivers/gpu/drm/i915/display/intel_fbdev.c | 43 
>>> ++++++++++++----------
>>>   include/drm/drm_fb_helper.h                | 13 +++++++
>>>   3 files changed, 42 insertions(+), 20 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/drm_fb_helper.c 
>>> b/drivers/gpu/drm/drm_fb_helper.c
>>> index d9e539b0fd1a..92926cb02dfb 100644
>>> --- a/drivers/gpu/drm/drm_fb_helper.c
>>> +++ b/drivers/gpu/drm/drm_fb_helper.c
>>> @@ -1938,6 +1938,12 @@ int drm_fb_helper_hotplug_event(struct 
>>> drm_fb_helper *fb_helper)
>>>       if (!drm_fbdev_emulation || !fb_helper)
>>>           return 0;
>>>   +    if (fb_helper->funcs->fb_hotplug) {
>>
>> We seems need to check the existence on the 'fb_helper->funcs' here,
>>
>> For example:
>>
>>
>> if (fb_helper->funcs && fb_helper->funcs->fb_hotplug) {
>>
>> Otherwise, it will de-reference NULL pointer.
>> Can be observed on a trivial driver though,
>> with no monitor(display) connected.
>
> Indeed. That needs to be fixed. Thank you for noting.
>

Thanks for you efforts then.


> To give some context:  I was hoping to remove drm_fb_helper_funcs at 
> some point. 


Yeah, too many helper functions may make peoples daze.


> fb_probe is now gone with these patches and fb_dirty can certainly be 
> replaced as well. (I once had prototype patches to do that). 


Well, the grammar of "ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);" looks strange, 
It's lengthy and I observed you have cleaned it up at the last patch. 
Which also eliminates one pair "if and else" clause, the codes looks 
more fluent now.


> This leaves the new callbacks for 915, for which I don't have a good 
> alternative solution. So it seems that drm_fb_helper_funcs will only 
> be used by i915/xe in the long term.
>

Well, since it is a DRM client now, maybe we could try to drop it into struct drm_driver.
Just like the '.fbdev_probe' callback, this may help to achieve a 100% DRM-based console/logger IMO.

Besides, a lot of DRM driver instances has the DMA/2D acceleration hardware, promote it
into drm_driver structure may has the potential to utilize hardware acceleration. Drivers
will more easily to have custom implementation. I'm not 100% sure if it will only be used
by i915 in the future.

Best regards,
Sui


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [PATCH 40/86] drm/stm: Run DRM default client setup
  2024-08-16 12:23 ` [PATCH 40/86] drm/stm: " Thomas Zimmermann
@ 2024-08-20 11:57   ` Raphael Gallais-Pou
  0 siblings, 0 replies; 131+ messages in thread
From: Raphael Gallais-Pou @ 2024-08-20 11:57 UTC (permalink / raw)
  To: Thomas Zimmermann, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Yannick Fertre,
	Philippe Cornu, Maxime Coquelin, Alexandre Torgue


On 8/16/24 14:23, Thomas Zimmermann wrote:
> 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.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Yannick Fertre <yannick.fertre@foss.st.com>
> Cc: Raphael Gallais-Pou <raphael.gallais-pou@foss.st.com>
> Cc: Philippe Cornu <philippe.cornu@foss.st.com>
> Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
> Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>

Hi Thomas,

Thanks,

Acked-by: Raphael Gallais-Pou <raphael.gallais-pou@foss.st.com>

Regards,
Raphaël


^ permalink raw reply	[flat|nested] 131+ messages in thread

* Re: [82/86] drm/i915: Move custom hotplug code into separate callback
  2024-08-20 10:39       ` Sui Jingfeng
@ 2024-08-20 12:42         ` Thomas Zimmermann
  0 siblings, 0 replies; 131+ messages in thread
From: Thomas Zimmermann @ 2024-08-20 12:42 UTC (permalink / raw)
  To: Sui Jingfeng, daniel, airlied, jfalempe, javierm
  Cc: dri-devel, amd-gfx, intel-gfx, intel-xe, nouveau, Jani Nikula,
	Rodrigo Vivi, Joonas Lahtinen, Tvrtko Ursulin, Lucas De Marchi,
	Thomas Hellström

Hi

Am 20.08.24 um 12:39 schrieb Sui Jingfeng:
>
>
> Besides, a lot of DRM driver instances has the DMA/2D acceleration 
> hardware, promote it
> into drm_driver structure may has the potential to utilize hardware 
> acceleration. Drivers
> will more easily to have custom implementation. I'm not 100% sure if 
> it will only be used
> by i915 in the future.

The correct place to do acceleration would be in the blit helpers in 
drm_format_helper.c. But no one bothered so far. For fbdev-only 
acceleration, DRM drivers could have custom fb_ops for accelerated 
drawing, copying, etc. Few cared and almost all removed that code at 
some point. The latest consent was that the complexity of the 
implementation outweights the performance gains. Even the few devs who 
actually asked for it didn't bother in the end.

Best regards
Thomas

>
> Best regards,
> Sui
>

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 131+ messages in thread

end of thread, other threads:[~2024-08-20 21:50 UTC | newest]

Thread overview: 131+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-16 12:22 [PATCH 00/86] drm: Provide client setup helper and convert drivers Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 01/86] drm/fbdev-helper: Move color-mode lookup into 4CC format helper Thomas Zimmermann
2024-08-18 19:22   ` Laurent Pinchart
2024-08-16 12:22 ` [PATCH 02/86] drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 03/86] drm/fbdev: Add memory-agnostic fbdev client Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 04/86] drm: Add client-agnostic setup helper Thomas Zimmermann
2024-08-18 20:07   ` Laurent Pinchart
2024-08-20  7:22     ` Thomas Zimmermann
2024-08-20  7:40       ` Laurent Pinchart
2024-08-20  7:53         ` Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 05/86] drm/fbdev-dma: Support struct drm_driver.fbdev_probe Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 06/86] drm/arcgpu: Run DRM default client setup Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 07/86] drm/arm/komeda: " Thomas Zimmermann
2024-08-16 14:15   ` Liviu Dudau
2024-08-16 12:22 ` [PATCH 08/86] drm/arm/hdlcd: " Thomas Zimmermann
2024-08-16 14:15   ` Liviu Dudau
2024-08-16 12:22 ` [PATCH 09/86] drm/arm/malidp: " Thomas Zimmermann
2024-08-16 14:16   ` Liviu Dudau
2024-08-16 12:22 ` [PATCH 10/86] drm/aspeed: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 11/86] drm/atmel-hdlcd: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 12/86] drm/fsl-dcu: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 13/86] drm/hisilicon/kirin: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 14/86] drm/hx8357d: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 15/86] drm/ili9163: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 16/86] drm/ili9225: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 17/86] drm/ili9341: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 18/86] drm/ili9486: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 19/86] drm/imx/dcss: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 20/86] drm/imx/ipuv3: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 21/86] drm/imx/lcdc: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 22/86] drm/ingenic: " Thomas Zimmermann
2024-08-17 20:54   ` Paul Cercueil
2024-08-16 12:22 ` [PATCH 23/86] drm/kmb: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 24/86] drm/logicvc: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 25/86] drm/mcde: " Thomas Zimmermann
2024-08-18  8:51   ` Linus Walleij
2024-08-16 12:22 ` [PATCH 26/86] drm/mediatek: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 27/86] drm/meson: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 28/86] drm/mi0283qt: " Thomas Zimmermann
2024-08-16 16:01   ` Noralf Trønnes
2024-08-20  7:30     ` Thomas Zimmermann
2024-08-20  8:25   ` Noralf Trønnes
2024-08-16 12:22 ` [PATCH 29/86] drm/mxsfb/lcdif: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 30/86] drm/msxfb: " Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 31/86] drm/panel/ili9341: " Thomas Zimmermann
2024-08-19 15:37   ` Neil Armstrong
2024-08-19 15:39   ` Neil Armstrong
2024-08-20  7:33     ` Thomas Zimmermann
2024-08-16 12:22 ` [PATCH 32/86] drm/panel-mipi-dbi: " Thomas Zimmermann
2024-08-20  8:26   ` Noralf Trønnes
2024-08-16 12:22 ` [PATCH 33/86] drm/pl111: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 34/86] drm/renesas/rcar-du: " Thomas Zimmermann
2024-08-18 20:12   ` Laurent Pinchart
2024-08-16 12:23 ` [PATCH 35/86] drm/renesas/rz-du: " Thomas Zimmermann
2024-08-19  9:50   ` Biju Das
2024-08-16 12:23 ` [PATCH 36/86] drm/renesas/shmobile: " Thomas Zimmermann
2024-08-18 20:17   ` Laurent Pinchart
2024-08-16 12:23 ` [PATCH 37/86] drm/repaper: " Thomas Zimmermann
2024-08-20  8:26   ` Noralf Trønnes
2024-08-16 12:23 ` [PATCH 38/86] drm/rockchip: " Thomas Zimmermann
2024-08-16 13:34   ` Heiko Stübner
2024-08-16 12:23 ` [PATCH 39/86] drm/sti: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 40/86] drm/stm: " Thomas Zimmermann
2024-08-20 11:57   ` Raphael Gallais-Pou
2024-08-16 12:23 ` [PATCH 41/86] drm/sun4i: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 42/86] drm/tidss: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 43/86] drm/tilcdc: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 44/86] drm/st7586: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 45/86] drm/st7735r: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 46/86] drm/tve200: " Thomas Zimmermann
2024-08-18  8:51   ` Linus Walleij
2024-08-16 12:23 ` [PATCH 47/86] drm/vc4: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 48/86] drm/xlnx: " Thomas Zimmermann
2024-08-18 20:19   ` Laurent Pinchart
2024-08-20  7:52     ` Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 49/86] drm/fbdev-dma: Remove obsolete setup function Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 50/86] drm/fbdev-shmem: Support struct drm_driver.fbdev_probe Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 51/86] drm/ast: Run DRM default client setup Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 52/86] drm/cirrus: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 53/86] drm/gm12u320: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 54/86] drm/gud: " Thomas Zimmermann
2024-08-20  8:27   ` Noralf Trønnes
2024-08-16 12:23 ` [PATCH 55/86] drm/hyperv_drm: " Thomas Zimmermann
2024-08-16 15:36   ` Deepak Rawat
2024-08-16 12:23 ` [PATCH 56/86] drm/mgag200: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 57/86] drm/ofdrm: Use " Thomas Zimmermann
2024-08-19 16:40   ` Javier Martinez Canillas
2024-08-16 12:23 ` [PATCH 58/86] drm/simpledrm: Run " Thomas Zimmermann
2024-08-19 16:41   ` Javier Martinez Canillas
2024-08-16 12:23 ` [PATCH 59/86] drm/solomon: " Thomas Zimmermann
2024-08-19 16:42   ` Javier Martinez Canillas
2024-08-16 12:23 ` [PATCH 60/86] drm/udl: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 61/86] drm/virtgpu: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 62/86] drm/vkms: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 63/86] drm/fbdev-shmem: Remove obsolete setup function Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 64/86] drm/fbdev-ttm: Support struct drm_driver.fbdev_probe Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 65/86] drm/amdgpu: Run DRM default client setup Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 66/86] drm/bochs: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 67/86] drm/hisilicon/hibmc: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 68/86] drm/loongson: " Thomas Zimmermann
2024-08-19  9:00   ` [68/86] " Sui Jingfeng
2024-08-16 12:23 ` [PATCH 69/86] drm/nouveau: " Thomas Zimmermann
2024-08-16 13:59   ` Danilo Krummrich
2024-08-16 12:23 ` [PATCH 70/86] drm/qxl: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 71/86] drm/vboxvideo: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 72/86] drm/vmwgfx: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 73/86] drm/fbdev-ttm: Remove obsolete setup function Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 74/86] drm/armada: Run DRM default client setup Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 75/86] drm/exynos-drm: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 76/86] drm/gma500: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 77/86] drm/msm: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 78/86] drm/radeon: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 79/86] drm/tegra: " Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 80/86] drm/i915: Remove struct drm_fb_helper from struct intel_fbdev Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 81/86] drm/i915: Move custom restore code into separate callback Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 82/86] drm/i915: Move custom hotplug " Thomas Zimmermann
2024-08-19  8:52   ` [82/86] " Sui Jingfeng
2024-08-20  7:39     ` Thomas Zimmermann
2024-08-20 10:39       ` Sui Jingfeng
2024-08-20 12:42         ` Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 83/86] drm/{i915,xe}: Run DRM default client setup Thomas Zimmermann
2024-08-16 13:18   ` Jani Nikula
2024-08-16 13:34     ` Thomas Zimmermann
2024-08-17 10:14   ` kernel test robot
2024-08-17 12:07   ` kernel test robot
2024-08-16 12:23 ` [PATCH 84/86] drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 85/86] drm/omapdrm: Run DRM default client setup Thomas Zimmermann
2024-08-16 12:23 ` [PATCH 86/86] drm/fb-helper: Remove struct drm_fb_helper.fb_probe Thomas Zimmermann
2024-08-16 13:02 ` ✓ CI.Patch_applied: success for drm: Provide client setup helper and convert drivers Patchwork
2024-08-16 13:04 ` ✗ CI.checkpatch: warning " Patchwork
2024-08-16 13:04 ` ✗ CI.KUnit: failure " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox