* [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset
@ 2026-10-14 17:26 Maxime Ripard
2026-10-14 17:27 ` [PATCH 38/75] drm/sun4i: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Maxime Ripard @ 2026-10-14 17:26 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Aun-Ali Zaidi, Christian König,
Alex Deucher, amd-gfx, Harry Wentland, Leo Li, Rodrigo Siqueira,
Liviu Dudau, Andrew Jeffery, Joel Stanley, Dave Airlie,
Jocelyn Falempe, Francesco Dolcini, Ian Ray, Martyn Welch,
Peter Senna Tschudin, Russell King, Alim Akhtar, Inki Dae,
Krzysztof Kozlowski, Kyungmin Park, Peter Griffin, Seung-Woo Kim,
linux-samsung-soc, Alison Wang, Stefan Agner, Tian Tao,
Xinwei Kong, Yongbang Shi, Dexuan Cui, Long Li, Saurabh Sengar,
linux-hyperv, Fabio Estevam, Frank Li, Pengutronix Kernel Team,
Philipp Zabel, Sascha Hauer, imx, Paul Kocialkowski, Huacai Chen,
Icenowy Zheng, Jianmin Lv, Mingcong Bai, Qianhai Wu, Xi Ruoyao,
Abhinav Kumar, Dmitry Baryshkov, Jessica Zhang, Marijn Suijten,
Rob Clark, Sean Paul, freedreno, linux-arm-msm, Gerd Hoffmann,
spice-devel, virtualization, Geert Uytterhoeven,
linux-renesas-soc, Marcus Folkesson, Iker Pedrosa,
Javier Martinez Canillas, Alain Volmat, Raphael Gallais-Pou,
Alexandre Torgue, Maxime Coquelin, Philippe Cornu,
Raphael Gallais-Pou, Yannick Fertre, Chen-Yu Tsai, Samuel Holland,
linux-sunxi, Jonathan Hunter, Mikko Perttunen, Thierry Reding,
linux-tegra, Alexey Brodkin, Hans de Goede, LiangCheng Wang,
Alex Lanzano, Maíra Canal, Dave Stevenson,
Raspberry Pi Kernel Maintenance, Chia-I Wu, Dmitry Osipenko,
Gurchetan Singh, Haneen Mohammed, Louis Chauvet, Melissa Wen,
Oleksandr Andrushchenko, Ruben Wauters, Jerome Brunet,
Kevin Hilman, Martin Blumenstingl, linux-amlogic, Jani Nikula,
Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, intel-gfx,
intel-xe, Danilo Krummrich, Lyude Paul, nouveau, Kieran Bingham,
Laurent Pinchart, Magnus Damm, Tomi Valkeinen,
Broadcom internal kernel review list, Zack Rusin, Aditya Garg
This is a follow-up to the plane and CRTC reset removal series, and
part of a larger effort to remove the reset hook from all KMS objects.
The connector reset hook is overloaded: it is called both at probe
time to create the initial software state and during suspend/resume to
reset hardware and software state. These two roles have different
requirements, and the reset hook is not fallible, making error
handling difficult for the initial state allocation path.
While reset has the semantics to reset both the software and hardware
state, the vast majority of implementations and all the helpers only
reset the software state, making them equivalent to
atomic_create_state in practice. The atomic_create_state hook makes
this explicit: it only allocates and initializes a pristine state
without any side effect, and returns the state pointer or an ERR_PTR
on failure.
This series converts all connector drivers tree-wide from the reset hook
to atomic_create_state, then removes the reset hook from struct
drm_connector_funcs entirely. The conversions were done using a
combination of Coccinelle semantic patches, mechanical one-line
replacements and manual adjustments.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Maxime Ripard (75):
drm/panel: Add atomic_create_state support
drm/adp: Switch to drm_atomic_helper_connector_create_state
drm/amdgpu: vkms: Switch to drm_atomic_helper_connector_create_state
drm/amdgpu: dm: Switch to drm_atomic_helper_connector_create_state
drm/arm: komeda: Switch to drm_atomic_helper_connector_create_state
drm/aspeed: Switch to drm_atomic_helper_connector_create_state
drm/ast: Switch to drm_atomic_helper_connector_create_state
drm/bridge: analogix-anx6345: Switch to drm_atomic_helper_connector_create_state
drm/bridge: analogix-anx78xx: Switch to drm_atomic_helper_connector_create_state
drm/bridge: chrontel-ch7033: Switch to drm_atomic_helper_connector_create_state
drm/bridge: lontium-lt8912b: Switch to drm_atomic_helper_connector_create_state
drm/bridge: megachips: Switch to drm_atomic_helper_connector_create_state
drm/bridge: nxp-ptn3460: Switch to drm_atomic_helper_connector_create_state
drm/panel: Switch to drm_atomic_helper_connector_create_state
drm/bridge: sii902x: Switch to drm_atomic_helper_connector_create_state
drm/bridge: simple-bridge: Switch to drm_atomic_helper_connector_create_state
drm/bridge: synopsys: dw-hdmi: Switch to drm_atomic_helper_connector_create_state
drm/bridge: tc358767: Switch to drm_atomic_helper_connector_create_state
drm/bridge: tda998x: Switch to drm_atomic_helper_connector_create_state
drm/bridge: ti-tfp410: Switch to drm_atomic_helper_connector_create_state
drm/exynos: Switch to drm_atomic_helper_connector_create_state
drm/fsl-dcu: Switch to drm_atomic_helper_connector_create_state
drm/hisilicon: hibmc: Switch to drm_atomic_helper_connector_create_state
drm/hyperv: Switch to drm_atomic_helper_connector_create_state
drm/imx: ipuv3: Switch to drm_atomic_helper_connector_create_state
drm/logicvc: Switch to drm_atomic_helper_connector_create_state
drm/loongson: Switch to drm_atomic_helper_connector_create_state
drm/mgag200: Switch to drm_atomic_helper_connector_create_state
drm/mipi-dbi: Switch to drm_atomic_helper_connector_create_state
drm/msm: dpu1: Switch to drm_atomic_helper_connector_create_state
drm/qxl: Switch to drm_atomic_helper_connector_create_state
drm/renesas: shmobile: Switch to drm_atomic_helper_connector_create_state
drm/sitronix: st7571: Switch to drm_atomic_helper_connector_create_state
drm/sitronix: st7920: Switch to drm_atomic_helper_connector_create_state
drm/solomon: ssd130x: Switch to drm_atomic_helper_connector_create_state
drm/sti: Switch to drm_atomic_helper_connector_create_state
drm/stm: Switch to drm_atomic_helper_connector_create_state
drm/sun4i: Switch to drm_atomic_helper_connector_create_state
drm/sysfb: Switch to drm_atomic_helper_connector_create_state
drm/tegra: Switch to drm_atomic_helper_connector_create_state
drm/tests: Switch to drm_atomic_helper_connector_create_state
drm/tiny: arcpgu: Switch to drm_atomic_helper_connector_create_state
drm/tiny: bochs: Switch to drm_atomic_helper_connector_create_state
drm/tiny: cirrus: Switch to drm_atomic_helper_connector_create_state
drm/tiny: gm12u320: Switch to drm_atomic_helper_connector_create_state
drm/tiny: pixpaper: Switch to drm_atomic_helper_connector_create_state
drm/tiny: repaper: Switch to drm_atomic_helper_connector_create_state
drm/tiny: sharp: Switch to drm_atomic_helper_connector_create_state
drm/udl: Switch to drm_atomic_helper_connector_create_state
drm/vboxvideo: Switch to drm_atomic_helper_connector_create_state
drm/vc4: Switch to drm_atomic_helper_connector_create_state
drm/virtio: Switch to drm_atomic_helper_connector_create_state
drm/vkms: Switch to drm_atomic_helper_connector_create_state
drm/xen: Switch to drm_atomic_helper_connector_create_state
drm/atomic-state-helper: Rename connector_tv_margins_reset to state_init
drm/atomic-state-helper: Rename connector_tv_reset to state_init
drm/bridge: synopsys: dw-hdmi: Convert to atomic_create_state
drm/meson: Convert to atomic_create_state
drm/gud: Convert to atomic_create_state
drm/sun4i: hdmi: Convert to atomic_create_state
drm/sun4i: tv: Convert to atomic_create_state
drm/tests: hdmi: Convert to atomic_create_state
drm/vc4: hdmi: Convert to atomic_create_state
drm/vc4: vec: Convert to atomic_create_state
drm/connector: Remove drm_atomic_helper_connector_reset()
drm/amdgpu: dm: Convert to atomic_create_state
drm/malidp: Convert to atomic_create_state
drm/ast: Convert to atomic_create_state
drm/i915: Convert to atomic_create_state
drm/nouveau: Convert to atomic_create_state
drm/rcar-du: Convert to atomic_create_state
drm/tegra: Convert to atomic_create_state
drm/vmwgfx: Convert to atomic_create_state
drm/connector: Remove __drm_atomic_helper_connector_reset()
drm/connector: Remove reset
drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 2 +-
.../amd/display/amdgpu_dm/amdgpu_dm_connector.c | 32 ++++----
.../amd/display/amdgpu_dm/amdgpu_dm_connector.h | 3 +-
.../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 4 +-
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 14 +++-
.../display/amdgpu_dm/tests/amdgpu_dm_audio_test.c | 2 +-
.../amdgpu_dm/tests/amdgpu_dm_backlight_test.c | 2 +-
.../amdgpu_dm/tests/amdgpu_dm_connector_test.c | 90 ++++++++++++++--------
.../display/amdgpu_dm/tests/amdgpu_dm_crc_test.c | 7 +-
.../amdgpu_dm/tests/amdgpu_dm_helpers_test.c | 2 +-
.../display/amdgpu_dm/tests/amdgpu_dm_irq_test.c | 2 +-
.../amdgpu_dm/tests/amdgpu_dm_mst_types_test.c | 4 +-
.../display/amdgpu_dm/tests/amdgpu_dm_wb_test.c | 2 +-
.../drm/arm/display/komeda/komeda_wb_connector.c | 2 +-
drivers/gpu/drm/arm/malidp_mw.c | 18 ++---
drivers/gpu/drm/aspeed/aspeed_gfx_out.c | 2 +-
drivers/gpu/drm/ast/ast_dp.c | 19 ++---
drivers/gpu/drm/ast/ast_dp501.c | 2 +-
drivers/gpu/drm/ast/ast_sil164.c | 2 +-
drivers/gpu/drm/ast/ast_vga.c | 2 +-
drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 2 +-
drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 2 +-
drivers/gpu/drm/bridge/chrontel-ch7033.c | 2 +-
drivers/gpu/drm/bridge/lontium-lt8912b.c | 2 +-
.../drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c | 2 +-
drivers/gpu/drm/bridge/nxp-ptn3460.c | 2 +-
drivers/gpu/drm/bridge/sii902x.c | 2 +-
drivers/gpu/drm/bridge/simple-bridge.c | 2 +-
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 12 ++-
drivers/gpu/drm/bridge/tc358767.c | 2 +-
drivers/gpu/drm/bridge/tda998x_drv.c | 2 +-
drivers/gpu/drm/bridge/ti-tfp410.c | 2 +-
drivers/gpu/drm/display/drm_hdmi_state_helper.c | 3 +-
drivers/gpu/drm/drm_atomic_state_helper.c | 68 ++++------------
drivers/gpu/drm/drm_connector.c | 8 --
drivers/gpu/drm/drm_mode_config.c | 4 +-
drivers/gpu/drm/drm_panel.c | 14 +++-
drivers/gpu/drm/exynos/exynos_drm_dpi.c | 2 +-
drivers/gpu/drm/exynos/exynos_drm_vidi.c | 2 +-
drivers/gpu/drm/exynos/exynos_hdmi.c | 2 +-
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 2 +-
drivers/gpu/drm/gud/gud_connector.c | 20 +++--
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 2 +-
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 2 +-
drivers/gpu/drm/hyperv/hyperv_drm_modeset.c | 2 +-
drivers/gpu/drm/i915/display/intel_connector.c | 6 +-
drivers/gpu/drm/i915/display/intel_sdvo.c | 6 +-
drivers/gpu/drm/imx/ipuv3/imx-tve.c | 2 +-
drivers/gpu/drm/logicvc/logicvc_interface.c | 2 +-
drivers/gpu/drm/loongson/lsdc_output_7a1000.c | 2 +-
drivers/gpu/drm/loongson/lsdc_output_7a2000.c | 4 +-
drivers/gpu/drm/meson/meson_encoder_hdmi.c | 12 ++-
drivers/gpu/drm/mgag200/mgag200_vga.c | 2 +-
drivers/gpu/drm/mgag200/mgag200_vga_bmc.c | 2 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 2 +-
drivers/gpu/drm/nouveau/dispnv50/disp.c | 9 ++-
drivers/gpu/drm/nouveau/nouveau_connector.c | 25 +++---
drivers/gpu/drm/nouveau/nouveau_connector.h | 3 +-
drivers/gpu/drm/qxl/qxl_display.c | 2 +-
.../gpu/drm/renesas/rcar-du/rcar_du_writeback.c | 15 ++--
drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c | 2 +-
drivers/gpu/drm/sitronix/st7571.c | 2 +-
drivers/gpu/drm/sitronix/st7920.c | 2 +-
drivers/gpu/drm/solomon/ssd130x.c | 2 +-
drivers/gpu/drm/sti/sti_dvo.c | 2 +-
drivers/gpu/drm/sti/sti_hda.c | 2 +-
drivers/gpu/drm/sti/sti_hdmi.c | 2 +-
drivers/gpu/drm/stm/lvds.c | 2 +-
drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 17 +++-
drivers/gpu/drm/sun4i/sun4i_lvds.c | 2 +-
drivers/gpu/drm/sun4i/sun4i_rgb.c | 2 +-
drivers/gpu/drm/sun4i/sun4i_tv.c | 16 +++-
drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 2 +-
drivers/gpu/drm/sysfb/drm_sysfb_helper.h | 2 +-
drivers/gpu/drm/tegra/dsi.c | 17 ++--
drivers/gpu/drm/tegra/hdmi.c | 2 +-
drivers/gpu/drm/tegra/sor.c | 13 ++--
drivers/gpu/drm/tests/drm_atomic_commit_test.c | 2 +-
drivers/gpu/drm/tests/drm_atomic_test.c | 2 +-
drivers/gpu/drm/tests/drm_connector_test.c | 4 +-
drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 17 +++-
drivers/gpu/drm/tests/drm_probe_helper_test.c | 2 +-
drivers/gpu/drm/tiny/appletbdrm.c | 2 +-
drivers/gpu/drm/tiny/arcpgu.c | 2 +-
drivers/gpu/drm/tiny/bochs.c | 2 +-
drivers/gpu/drm/tiny/cirrus-qemu.c | 2 +-
drivers/gpu/drm/tiny/gm12u320.c | 2 +-
drivers/gpu/drm/tiny/pixpaper.c | 2 +-
drivers/gpu/drm/tiny/repaper.c | 2 +-
drivers/gpu/drm/tiny/sharp-memory.c | 2 +-
drivers/gpu/drm/udl/udl_modeset.c | 2 +-
drivers/gpu/drm/vboxvideo/vbox_mode.c | 2 +-
drivers/gpu/drm/vc4/tests/vc4_mock_output.c | 2 +-
drivers/gpu/drm/vc4/vc4_hdmi.c | 32 ++++++--
drivers/gpu/drm/vc4/vc4_txp.c | 2 +-
drivers/gpu/drm/vc4/vc4_vec.c | 16 +++-
drivers/gpu/drm/virtio/virtgpu_display.c | 2 +-
drivers/gpu/drm/vkms/vkms_connector.c | 2 +-
drivers/gpu/drm/vkms/vkms_writeback.c | 2 +-
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 23 ++----
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 3 +-
drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c | 2 +-
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 2 +-
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 +-
drivers/gpu/drm/xen/xen_drm_front_conn.c | 2 +-
include/drm/drm_atomic_state_helper.h | 9 +--
include/drm/drm_connector.h | 12 ---
include/drm/drm_mipi_dbi.h | 2 +-
108 files changed, 392 insertions(+), 331 deletions(-)
---
base-commit: 91f52e99824b0beebb48cad51bbda81437af8664
change-id: 20260709-drm-no-more-connector-reset-45ee14d7c62c
Best regards,
--
Maxime Ripard <mripard@kernel.org>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 38/75] drm/sun4i: Switch to drm_atomic_helper_connector_create_state
2026-10-14 17:26 [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
@ 2026-10-14 17:27 ` Maxime Ripard
2026-10-14 17:27 ` [PATCH 56/75] drm/atomic-state-helper: Rename connector_tv_reset to state_init Maxime Ripard
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Maxime Ripard @ 2026-10-14 17:27 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Chen-Yu Tsai, Samuel Holland,
linux-sunxi
The sun4i connector implementation uses the deprecated
drm_atomic_helper_connector_reset() as its reset hook.
Switch to drm_atomic_helper_connector_create_state() instead.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Chen-Yu Tsai <wens@kernel.org>
Cc: Samuel Holland <samuel@sholland.org>
Cc: linux-sunxi@lists.linux.dev
---
drivers/gpu/drm/sun4i/sun4i_lvds.c | 2 +-
drivers/gpu/drm/sun4i/sun4i_rgb.c | 2 +-
drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/sun4i/sun4i_lvds.c b/drivers/gpu/drm/sun4i/sun4i_lvds.c
index 6b98d20a8890..f3f035c9260f 100644
--- a/drivers/gpu/drm/sun4i/sun4i_lvds.c
+++ b/drivers/gpu/drm/sun4i/sun4i_lvds.c
@@ -63,11 +63,11 @@ sun4i_lvds_connector_destroy(struct drm_connector *connector)
}
static const struct drm_connector_funcs sun4i_lvds_con_funcs = {
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = sun4i_lvds_connector_destroy,
- .reset = drm_atomic_helper_connector_reset,
+ .atomic_create_state = drm_atomic_helper_connector_create_state,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
static void sun4i_lvds_encoder_enable(struct drm_encoder *encoder)
diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
index 3da9a9283c6e..c930dd899875 100644
--- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
+++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
@@ -154,11 +154,11 @@ sun4i_rgb_connector_destroy(struct drm_connector *connector)
}
static const struct drm_connector_funcs sun4i_rgb_con_funcs = {
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = sun4i_rgb_connector_destroy,
- .reset = drm_atomic_helper_connector_reset,
+ .atomic_create_state = drm_atomic_helper_connector_create_state,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
index d504ae583294..1b7ae9b327c1 100644
--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
@@ -835,11 +835,11 @@ sun6i_dsi_connector_detect(struct drm_connector *connector, bool force)
static const struct drm_connector_funcs sun6i_dsi_connector_funcs = {
.detect = sun6i_dsi_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = drm_connector_cleanup,
- .reset = drm_atomic_helper_connector_reset,
+ .atomic_create_state = drm_atomic_helper_connector_create_state,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
static const struct drm_encoder_funcs sun6i_dsi_enc_funcs = {
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 56/75] drm/atomic-state-helper: Rename connector_tv_reset to state_init
2026-10-14 17:26 [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
2026-10-14 17:27 ` [PATCH 38/75] drm/sun4i: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
@ 2026-10-14 17:27 ` Maxime Ripard
2026-10-14 18:03 ` sashiko-bot
2026-10-14 17:27 ` [PATCH 60/75] drm/sun4i: hdmi: Convert to atomic_create_state Maxime Ripard
2026-10-14 17:27 ` [PATCH 61/75] drm/sun4i: tv: " Maxime Ripard
3 siblings, 1 reply; 7+ messages in thread
From: Maxime Ripard @ 2026-10-14 17:27 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Maíra Canal, Chen-Yu Tsai,
Dave Stevenson, Raspberry Pi Kernel Maintenance, Samuel Holland,
linux-sunxi
Recent commits renamed other reset helpers to use the state_init
suffix when they only initialize properties rather than allocate or
update the object state itself.
drm_atomic_helper_connector_tv_reset() falls in the same category:
it initializes the analog TV properties from the kernel command line
defaults without allocating any state. It also reads the connector
state through connector->state, coupling it to the reset path.
Rename it to drm_atomic_helper_connector_tv_state_init() and pass
the connector state explicitly as a parameter. This decouples it
from the reset hook and prepares for the conversion to
atomic_create_state where connector->state is not yet assigned.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: "Maíra Canal" <mcanal@igalia.com>
Cc: Chen-Yu Tsai <wens@kernel.org>
Cc: Dave Stevenson <dave.stevenson@raspberrypi.com>
Cc: Raspberry Pi Kernel Maintenance <kernel-list@raspberrypi.com>
Cc: Samuel Holland <samuel@sholland.org>
Cc: linux-sunxi@lists.linux.dev
---
drivers/gpu/drm/drm_atomic_state_helper.c | 11 ++++++-----
drivers/gpu/drm/sun4i/sun4i_tv.c | 2 +-
drivers/gpu/drm/vc4/vc4_vec.c | 2 +-
include/drm/drm_atomic_state_helper.h | 3 ++-
4 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
index 6238066fd5d6..1424c4873251 100644
--- a/drivers/gpu/drm/drm_atomic_state_helper.c
+++ b/drivers/gpu/drm/drm_atomic_state_helper.c
@@ -499,20 +499,21 @@ void drm_atomic_helper_connector_tv_margins_state_init(struct drm_connector_stat
state->tv.margins.bottom = cmdline->tv_margins.bottom;
}
EXPORT_SYMBOL(drm_atomic_helper_connector_tv_margins_state_init);
/**
- * drm_atomic_helper_connector_tv_reset - Resets Analog TV connector properties
+ * drm_atomic_helper_connector_tv_state_init - Initializes Analog TV connector properties
+ * @state: the DRM State object
* @connector: DRM connector
*
- * Resets the analog TV properties attached to a connector
+ * Initializes the analog TV properties attached to a connector
*/
-void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector)
+void drm_atomic_helper_connector_tv_state_init(struct drm_connector_state *state,
+ struct drm_connector *connector)
{
struct drm_device *dev = connector->dev;
struct drm_cmdline_mode *cmdline = &connector->cmdline_mode;
- struct drm_connector_state *state = connector->state;
struct drm_property *prop;
uint64_t val;
prop = dev->mode_config.tv_mode_property;
if (prop)
@@ -572,11 +573,11 @@ void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector)
state->tv.hue = val;
drm_atomic_helper_connector_tv_margins_state_init(connector->state,
connector);
}
-EXPORT_SYMBOL(drm_atomic_helper_connector_tv_reset);
+EXPORT_SYMBOL(drm_atomic_helper_connector_tv_state_init);
/**
* drm_atomic_helper_connector_tv_check - Validate an analog TV connector state
* @connector: DRM Connector
* @state: the DRM State object
diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c b/drivers/gpu/drm/sun4i/sun4i_tv.c
index ce22f1662c0c..ea86f8a6a35e 100644
--- a/drivers/gpu/drm/sun4i/sun4i_tv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_tv.c
@@ -406,11 +406,11 @@ static const struct drm_connector_helper_funcs sun4i_tv_comp_connector_helper_fu
};
static void sun4i_tv_connector_reset(struct drm_connector *connector)
{
drm_atomic_helper_connector_reset(connector);
- drm_atomic_helper_connector_tv_reset(connector);
+ drm_atomic_helper_connector_tv_state_init(connector->state, connector);
}
static const struct drm_connector_funcs sun4i_tv_comp_connector_funcs = {
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = drm_connector_cleanup,
diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c
index 792b7b39be59..98cece1e48d8 100644
--- a/drivers/gpu/drm/vc4/vc4_vec.c
+++ b/drivers/gpu/drm/vc4/vc4_vec.c
@@ -379,11 +379,11 @@ vc4_vec_connector_detect(struct drm_connector *connector, bool force)
}
static void vc4_vec_connector_reset(struct drm_connector *connector)
{
drm_atomic_helper_connector_reset(connector);
- drm_atomic_helper_connector_tv_reset(connector);
+ drm_atomic_helper_connector_tv_state_init(connector->state, connector);
}
static int
vc4_vec_connector_set_property(struct drm_connector *connector,
struct drm_connector_state *state,
diff --git a/include/drm/drm_atomic_state_helper.h b/include/drm/drm_atomic_state_helper.h
index 4dac741af22c..5e8619aeef21 100644
--- a/include/drm/drm_atomic_state_helper.h
+++ b/include/drm/drm_atomic_state_helper.h
@@ -69,11 +69,12 @@ void __drm_atomic_helper_connector_state_init(struct drm_connector_state *conn_s
void __drm_atomic_helper_connector_reset(struct drm_connector *connector,
struct drm_connector_state *conn_state);
void drm_atomic_helper_connector_reset(struct drm_connector *connector);
struct drm_connector_state *
drm_atomic_helper_connector_create_state(struct drm_connector *connector);
-void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector);
+void drm_atomic_helper_connector_tv_state_init(struct drm_connector_state *state,
+ struct drm_connector *connector);
int drm_atomic_helper_connector_tv_check(struct drm_connector *connector,
struct drm_atomic_commit *state);
void drm_atomic_helper_connector_tv_margins_state_init(struct drm_connector_state *state,
struct drm_connector *connector);
void
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 60/75] drm/sun4i: hdmi: Convert to atomic_create_state
2026-10-14 17:26 [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
2026-10-14 17:27 ` [PATCH 38/75] drm/sun4i: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
2026-10-14 17:27 ` [PATCH 56/75] drm/atomic-state-helper: Rename connector_tv_reset to state_init Maxime Ripard
@ 2026-10-14 17:27 ` Maxime Ripard
2026-10-14 17:27 ` [PATCH 61/75] drm/sun4i: tv: " Maxime Ripard
3 siblings, 0 replies; 7+ messages in thread
From: Maxime Ripard @ 2026-10-14 17:27 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Chen-Yu Tsai, Samuel Holland,
linux-sunxi
The sun4i HDMI connector reset implementation creates a pristine
state and initializes the HDMI state. It does not perform any
hardware reset.
Since this is equivalent to what atomic_create_state expects, convert
the reset function to an atomic_create_state hook that returns the
initialized state.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Chen-Yu Tsai <wens@kernel.org>
Cc: Samuel Holland <samuel@sholland.org>
Cc: linux-sunxi@lists.linux.dev
---
drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
index d98b6f12a7bc..1226228c2ab3 100644
--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
+++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
@@ -283,21 +283,30 @@ sun4i_hdmi_connector_detect(struct drm_connector *connector, bool force)
}
return connector_status_connected;
}
-static void sun4i_hdmi_connector_reset(struct drm_connector *connector)
+static struct drm_connector_state *
+sun4i_hdmi_connector_create_state(struct drm_connector *connector)
{
- drm_atomic_helper_connector_reset(connector);
- __drm_atomic_helper_connector_hdmi_state_init(connector, connector->state);
+ struct drm_connector_state *connector_state;
+
+ connector_state = drm_atomic_helper_connector_create_state(connector);
+ if (IS_ERR(connector_state))
+ return connector_state;
+
+ __drm_atomic_helper_connector_hdmi_state_init(connector,
+ connector_state);
+
+ return connector_state;
}
static const struct drm_connector_funcs sun4i_hdmi_connector_funcs = {
.debugfs_init = drm_hdmi_connector_debugfs_init,
.detect = sun4i_hdmi_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
- .reset = sun4i_hdmi_connector_reset,
+ .atomic_create_state = sun4i_hdmi_connector_create_state,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
#ifdef CONFIG_DRM_SUN4I_HDMI_CEC
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 61/75] drm/sun4i: tv: Convert to atomic_create_state
2026-10-14 17:26 [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
` (2 preceding siblings ...)
2026-10-14 17:27 ` [PATCH 60/75] drm/sun4i: hdmi: Convert to atomic_create_state Maxime Ripard
@ 2026-10-14 17:27 ` Maxime Ripard
2026-10-14 18:08 ` sashiko-bot
3 siblings, 1 reply; 7+ messages in thread
From: Maxime Ripard @ 2026-10-14 17:27 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Chen-Yu Tsai, Samuel Holland,
linux-sunxi
The sun4i TV connector reset implementation creates a pristine state
and initializes the analog TV properties. It does not perform any
hardware reset.
Since this is equivalent to what atomic_create_state expects, convert
the reset function to an atomic_create_state hook that returns the
initialized state.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Chen-Yu Tsai <wens@kernel.org>
Cc: Samuel Holland <samuel@sholland.org>
Cc: linux-sunxi@lists.linux.dev
---
drivers/gpu/drm/sun4i/sun4i_tv.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c b/drivers/gpu/drm/sun4i/sun4i_tv.c
index ea86f8a6a35e..a68e5f7a03d2 100644
--- a/drivers/gpu/drm/sun4i/sun4i_tv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_tv.c
@@ -403,20 +403,28 @@ static const struct drm_encoder_helper_funcs sun4i_tv_helper_funcs = {
static const struct drm_connector_helper_funcs sun4i_tv_comp_connector_helper_funcs = {
.atomic_check = drm_atomic_helper_connector_tv_check,
.get_modes = drm_connector_helper_tv_get_modes,
};
-static void sun4i_tv_connector_reset(struct drm_connector *connector)
+static struct drm_connector_state *
+sun4i_tv_connector_create_state(struct drm_connector *connector)
{
- drm_atomic_helper_connector_reset(connector);
- drm_atomic_helper_connector_tv_state_init(connector->state, connector);
+ struct drm_connector_state *connector_state;
+
+ connector_state = drm_atomic_helper_connector_create_state(connector);
+ if (IS_ERR(connector_state))
+ return connector_state;
+
+ drm_atomic_helper_connector_tv_state_init(connector_state, connector);
+
+ return connector_state;
}
static const struct drm_connector_funcs sun4i_tv_comp_connector_funcs = {
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = drm_connector_cleanup,
- .reset = sun4i_tv_connector_reset,
+ .atomic_create_state = sun4i_tv_connector_create_state,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
static const struct regmap_config sun4i_tv_regmap_config = {
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 56/75] drm/atomic-state-helper: Rename connector_tv_reset to state_init
2026-10-14 17:27 ` [PATCH 56/75] drm/atomic-state-helper: Rename connector_tv_reset to state_init Maxime Ripard
@ 2026-10-14 18:03 ` sashiko-bot
0 siblings, 0 replies; 7+ messages in thread
From: sashiko-bot @ 2026-10-14 18:03 UTC (permalink / raw)
To: Maxime Ripard; +Cc: dri-devel, linux-sunxi
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] drm: Incomplete state decoupling causes NULL deref in tv_margins_state_init
--
commit 44e808ff1921e4945725ba2420217e2015fc2db5
Author: Maxime Ripard <mripard@kernel.org>
drm/atomic-state-helper: Rename connector_tv_reset to state_init
This commit renames drm_atomic_helper_connector_tv_reset to
drm_atomic_helper_connector_tv_state_init. It adds a connector state
parameter to decouple the initialization from the reset hook, preparing it
for contexts like atomic_create_state where the connector state isn't
assigned yet.
> diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
> index 6238066fd5d60..1424c4873251c 100644
> --- a/drivers/gpu/drm/drm_atomic_state_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_state_helper.c
[ ... ]
> @@ -501,16 +501,17 @@ void drm_atomic_helper_connector_tv_margins_state_init(struct drm_connector_stat
> EXPORT_SYMBOL(drm_atomic_helper_connector_tv_margins_state_init);
>
> /**
> - * drm_atomic_helper_connector_tv_reset - Resets Analog TV connector properties
> + * drm_atomic_helper_connector_tv_state_init - Initializes Analog TV connector properties
> + * @state: the DRM State object
> * @connector: DRM connector
> *
> - * Resets the analog TV properties attached to a connector
> + * Initializes the analog TV properties attached to a connector
> */
> -void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector)
> +void drm_atomic_helper_connector_tv_state_init(struct drm_connector_state *state,
> + struct drm_connector *connector)
> {
> struct drm_device *dev = connector->dev;
> struct drm_cmdline_mode *cmdline = &connector->cmdline_mode;
> - struct drm_connector_state *state = connector->state;
> struct drm_property *prop;
> uint64_t val;
>
[ ... ]
> @@ -574,7 +575,7 @@ void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector)
> drm_atomic_helper_connector_tv_margins_state_init(connector->state,
> connector);
[Severity: High]
Since the new state parameter is added to decouple this function from
the reset hook, should this call pass the newly provided state instead of
connector->state?
When a driver like vc4_vec calls this via its atomic_create_state hook,
connector->state is not yet assigned and is NULL.
Passing connector->state here forwards a NULL pointer to
drm_atomic_helper_connector_tv_margins_state_init(), which then writes
directly to state->tv.margins.left, leading to a NULL pointer dereference
during device probe:
void drm_atomic_helper_connector_tv_margins_state_init(struct drm_connector_state *state,
struct drm_connector *connector)
{
struct drm_cmdline_mode *cmdline = &connector->cmdline_mode;
state->tv.margins.left = cmdline->tv_margins.left;
> }
> -EXPORT_SYMBOL(drm_atomic_helper_connector_tv_reset);
> +EXPORT_SYMBOL(drm_atomic_helper_connector_tv_state_init);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014-drm-no-more-connector-reset-v1-0-586c9c026823@kernel.org?part=56
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 61/75] drm/sun4i: tv: Convert to atomic_create_state
2026-10-14 17:27 ` [PATCH 61/75] drm/sun4i: tv: " Maxime Ripard
@ 2026-10-14 18:08 ` sashiko-bot
0 siblings, 0 replies; 7+ messages in thread
From: sashiko-bot @ 2026-10-14 18:08 UTC (permalink / raw)
To: Maxime Ripard; +Cc: dri-devel, linux-sunxi
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] drm: NULL pointer dereference when initializing TV connector state
--
commit a85a6a0ad13c063d072cdcda87267ea8867cafa3
Author: Maxime Ripard <mripard@kernel.org>
drm/sun4i: tv: Convert to atomic_create_state
The sun4i TV connector reset implementation is converted to an
atomic_create_state hook. It creates the pristine state and initializes
the analog TV properties.
> diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c b/drivers/gpu/drm/sun4i/sun4i_tv.c
> index ea86f8a6a35e7..a68e5f7a03d2c 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_tv.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_tv.c
[ ... ]
> -static void sun4i_tv_connector_reset(struct drm_connector *connector)
> +static struct drm_connector_state *
> +sun4i_tv_connector_create_state(struct drm_connector *connector)
> {
> - drm_atomic_helper_connector_reset(connector);
> - drm_atomic_helper_connector_tv_state_init(connector->state, connector);
> + struct drm_connector_state *connector_state;
> +
> + connector_state = drm_atomic_helper_connector_create_state(connector);
> + if (IS_ERR(connector_state))
> + return connector_state;
> +
> + drm_atomic_helper_connector_tv_state_init(connector_state, connector);
[Severity: High]
Does this trigger a NULL pointer dereference during initialization?
When the DRM core resets the connector state, it explicitly clears the old
state before invoking the .atomic_create_state hook:
drm_mode_config_connector_reset_with_create_state() {
...
if (connector->state) {
...
connector->state = NULL;
}
return drm_mode_config_connector_create_state(connector);
}
The core helper drm_atomic_helper_connector_tv_state_init() then mistakenly
passes the unassigned connector->state down to the margins initialization
instead of the newly allocated state:
drm_atomic_helper_connector_tv_state_init() {
...
drm_atomic_helper_connector_tv_margins_state_init(connector->state,
connector);
}
This causes drm_atomic_helper_connector_tv_margins_state_init() to
unconditionally dereference the NULL state pointer:
drm_atomic_helper_connector_tv_margins_state_init(state, ...) {
...
state->tv.margins.left = cmdline->tv_margins.left;
...
}
The previous .reset hook implementation masked this core helper bug because
it assigned connector->state prior to calling the TV state initialization
helper.
Could we fix the core helper to pass the correct state pointer, or should
this driver handle the initialization differently to avoid the crash?
> +
> + return connector_state;
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014-drm-no-more-connector-reset-v1-0-586c9c026823@kernel.org?part=61
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-10-14 18:08 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-14 17:26 [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
2026-10-14 17:27 ` [PATCH 38/75] drm/sun4i: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
2026-10-14 17:27 ` [PATCH 56/75] drm/atomic-state-helper: Rename connector_tv_reset to state_init Maxime Ripard
2026-10-14 18:03 ` sashiko-bot
2026-10-14 17:27 ` [PATCH 60/75] drm/sun4i: hdmi: Convert to atomic_create_state Maxime Ripard
2026-10-14 17:27 ` [PATCH 61/75] drm/sun4i: tv: " Maxime Ripard
2026-10-14 18:08 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox