* [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:26 ` [PATCH 03/75] drm/amdgpu: vkms: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
` (5 more replies)
0 siblings, 6 replies; 11+ 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] 11+ messages in thread
* [PATCH 03/75] drm/amdgpu: vkms: 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:26 ` Maxime Ripard
2026-10-14 17:26 ` [PATCH 04/75] drm/amdgpu: dm: " Maxime Ripard
` (4 subsequent siblings)
5 siblings, 0 replies; 11+ 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, Christian König, Alex Deucher,
amd-gfx
The amdgpu: vkms 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: "Christian König" <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: amd-gfx@lists.freedesktop.org
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
index 5c5fdbec93c2..5c7e2172a372 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
@@ -84,11 +84,11 @@ static int amdgpu_vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
}
static const struct drm_connector_funcs amdgpu_vkms_connector_funcs = {
.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 int amdgpu_vkms_conn_get_modes(struct drm_connector *connector)
--
2.55.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 04/75] drm/amdgpu: dm: 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:26 ` [PATCH 03/75] drm/amdgpu: vkms: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
@ 2026-10-14 17:26 ` Maxime Ripard
2026-10-16 16:41 ` Leo Li
2026-10-14 17:27 ` [PATCH 66/75] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
` (3 subsequent siblings)
5 siblings, 1 reply; 11+ 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, Christian König, Alex Deucher,
Harry Wentland, Leo Li, Rodrigo Siqueira, amd-gfx
The amdgpu: dm 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: "Christian König" <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Leo Li <sunpeng.li@amd.com>
Cc: Rodrigo Siqueira <siqueira@igalia.com>
Cc: amd-gfx@lists.freedesktop.org
---
drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c | 2 +-
.../gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c | 2 +-
drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c | 7 ++++---
.../gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c | 2 +-
drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c | 2 +-
.../gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c | 4 ++--
drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c | 2 +-
7 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c
index 040a7a9c0335..9d83b7b1ca80 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c
@@ -25,11 +25,11 @@
#include "amdgpu_dm.h"
#include "amdgpu_dm_audio.h"
#include "amdgpu_dm_kunit_test_helpers.h"
static const struct drm_connector_funcs dm_test_audio_connector_funcs = {
- .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,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = drm_connector_cleanup,
};
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
index 5221050dec2f..6e9ee3c93943 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
@@ -30,11 +30,11 @@ struct dm_backlight_connector_fixture {
struct amdgpu_dm_connector *aconnector;
struct dc_link *link;
};
static const struct drm_connector_funcs dm_backlight_test_connector_funcs = {
- .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 setup_test_connector(struct kunit *test,
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c
index 29a513dab9cd..e47b4dd210b8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c
@@ -173,11 +173,11 @@ static struct amdgpu_crtc *dm_test_alloc_crc_crtc(struct kunit *test,
return acrtc;
}
static const struct drm_connector_funcs dm_test_crc_connector_funcs = {
- .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,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = drm_connector_cleanup,
};
@@ -652,12 +652,13 @@ static void dm_test_crtc_set_crc_source_dprx_no_connector(struct kunit *test)
KUNIT_ASSERT_EQ(test, drm_connector_init(&adev->ddev, wb_conn,
&dm_test_crc_connector_funcs,
DRM_MODE_CONNECTOR_WRITEBACK), 0);
KUNIT_ASSERT_EQ(test, kunit_add_action_or_reset(test,
dm_test_crc_connector_cleanup, wb_conn), 0);
- drm_atomic_helper_connector_reset(wb_conn);
- KUNIT_ASSERT_NOT_NULL(test, wb_conn->state);
+
+ wb_conn->state = drm_atomic_helper_connector_create_state(wb_conn);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, wb_conn->state);
wb_conn->state->crtc = &acrtc->base;
/*
* __drm_atomic_helper_connector_destroy_state() drops a connector
* reference when state->crtc is set. Balance it here since the CRTC is
* assigned directly rather than via drm_atomic_set_crtc_for_connector(),
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
index 51c3995de76d..a369a3cbd4af 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
@@ -4104,11 +4104,11 @@ static void dm_test_is_dp_sink_present_queries_link_service(struct kunit *test)
* drm_edid_connector_update(), which needs a fully initialised connector so the
* EDID property blob is published. dm_kunit_alloc_connector() only fills in the
* device pointer, so build a real one here.
*/
static const struct drm_connector_funcs dm_test_connector_funcs = {
- .reset = drm_atomic_helper_connector_reset,
+ .atomic_create_state = drm_atomic_helper_connector_create_state,
};
static struct amdgpu_dm_connector *dm_test_alloc_real_connector(struct kunit *test,
struct amdgpu_device *adev)
{
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c
index dc7d94f75ff4..3265b50abb46 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c
@@ -479,11 +479,11 @@ static void dm_test_destroy_hpd_rx_wq(void *data)
destroy_workqueue(ctx->wq[i].wq);
kfree(ctx->wq);
}
static const struct drm_connector_funcs dm_test_connector_funcs = {
- .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,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = drm_connector_cleanup,
};
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
index 382eafab2d43..10a213c36af4 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
@@ -1160,11 +1160,11 @@ static bool dm_mst_test_dp_get_max_link_enc_cap(const struct dc_link *link,
static void dm_mst_test_connector_destroy(struct drm_connector *connector)
{
}
static const struct drm_connector_funcs dm_mst_test_connector_funcs = {
- .reset = drm_atomic_helper_connector_reset,
+ .atomic_create_state = drm_atomic_helper_connector_create_state,
.destroy = dm_mst_test_connector_destroy,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
@@ -3698,11 +3698,11 @@ static void dm_mst_test_pre_compute_configs_no_recompute(struct kunit *test)
}
/* Tests for compute_mst_dsc_configs_for_link */
static const struct drm_connector_funcs dm_mst_test_dsc_link_conn_funcs = {
- .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 enum dp_link_encoding dm_mst_test_mst_encoding_format(const struct dc_link *link)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
index 03036f906385..e1e7d4c29966 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
@@ -385,11 +385,11 @@ static void dm_test_wb_atomic_check_invalid_format(struct kunit *test)
/* Tests for amdgpu_dm_wb_connector_get_modes using DRM mock */
static const struct drm_connector_funcs dm_wb_test_connector_funcs = {
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
- .reset = drm_atomic_helper_connector_reset,
+ .atomic_create_state = drm_atomic_helper_connector_create_state,
};
/**
* dm_test_wb_get_modes_returns_modes - Verify at least one mode is returned
* @test: KUnit test context
--
2.55.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 66/75] drm/amdgpu: dm: 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:26 ` [PATCH 03/75] drm/amdgpu: vkms: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
2026-10-14 17:26 ` [PATCH 04/75] drm/amdgpu: dm: " Maxime Ripard
@ 2026-10-14 17:27 ` Maxime Ripard
2026-10-19 16:38 ` Leo Li
2026-10-16 15:06 ` (subset) [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
` (2 subsequent siblings)
5 siblings, 1 reply; 11+ 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, Christian König, Alex Deucher,
Harry Wentland, Leo Li, Rodrigo Siqueira, amd-gfx
The amdgpu_dm connector reset implementation creates a custom state
subclass, but only initializes a pristine state without resetting any
hardware. This is equivalent to what atomic_create_state expects.
Convert to it.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: "Christian König" <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Leo Li <sunpeng.li@amd.com>
Cc: Rodrigo Siqueira <siqueira@igalia.com>
Cc: amd-gfx@lists.freedesktop.org
---
.../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 +++-
.../amdgpu_dm/tests/amdgpu_dm_connector_test.c | 90 ++++++++++++++--------
5 files changed, 91 insertions(+), 52 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index 3a4e98b08ac1..2c22f00f521c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -1939,26 +1939,20 @@ STATIC_IFN_KUNIT void amdgpu_dm_connector_destroy(struct drm_connector *connecto
kfree(connector);
}
EXPORT_IF_KUNIT(amdgpu_dm_connector_destroy);
-void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
+struct drm_connector_state *
+amdgpu_dm_connector_atomic_create_state(struct drm_connector *connector)
{
- struct dm_connector_state *old_state =
- to_dm_connector_state(connector->state);
struct dm_connector_state *state;
state = kzalloc_obj(*state);
if (!state)
- return;
+ return ERR_PTR(-ENOMEM);
- if (connector->state)
- __drm_atomic_helper_connector_destroy_state(connector->state);
-
- kfree(old_state);
-
- __drm_atomic_helper_connector_reset(connector, &state->base);
+ __drm_atomic_helper_connector_state_init(&state->base, connector);
state->scaling = RMX_OFF;
state->underscan_enable = false;
state->underscan_hborder = 0;
state->underscan_vborder = 0;
@@ -1970,12 +1964,14 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
if (amdgpu_dm_abm_level <= 0)
state->abm_level = ABM_LEVEL_IMMEDIATE_DISABLE;
else
state->abm_level = amdgpu_dm_abm_level;
}
+
+ return &state->base;
}
-EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_reset);
+EXPORT_IF_KUNIT(amdgpu_dm_connector_atomic_create_state);
struct drm_connector_state *
amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector)
{
struct dm_connector_state *state =
@@ -2070,11 +2066,11 @@ STATIC_IFN_KUNIT void amdgpu_dm_connector_funcs_force(struct drm_connector *conn
}
}
EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_force);
static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
- .reset = amdgpu_dm_connector_funcs_reset,
+ .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
.detect = amdgpu_dm_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = amdgpu_dm_connector_destroy,
.atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -3197,12 +3193,20 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
/*
* Some of the properties below require access to state, like bpc.
* Allocate some default initial connector state with our reset helper.
*/
- if (aconnector->base.funcs->reset)
- aconnector->base.funcs->reset(&aconnector->base);
+ if (!aconnector->base.state &&
+ aconnector->base.funcs->atomic_create_state) {
+ struct drm_connector_state *conn_state;
+
+ conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
+ if (IS_ERR(conn_state))
+ return;
+
+ aconnector->base.state = conn_state;
+ }
aconnector->connector_id = link_index;
aconnector->bl_idx = -1;
aconnector->dc_link = link;
aconnector->base.interlace_allowed = false;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h
index 79698deacf61..4a73fc607f38 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h
@@ -48,11 +48,12 @@ struct drm_crtc;
struct drm_device;
struct drm_display_mode;
struct drm_edid;
struct drm_property;
-void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector);
+struct drm_connector_state *
+amdgpu_dm_connector_atomic_create_state(struct drm_connector *connector);
struct drm_connector_state *
amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector);
int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index a5b15bef8aa0..cb189c098ec3 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -256,11 +256,11 @@ amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector)
EXPORT_IF_KUNIT(amdgpu_dm_mst_connector_early_unregister);
static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = dm_dp_mst_connector_destroy,
- .reset = amdgpu_dm_connector_funcs_reset,
+ .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
.atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
.atomic_set_property = amdgpu_dm_connector_atomic_set_property,
.atomic_get_property = amdgpu_dm_connector_atomic_get_property,
.late_register = amdgpu_dm_mst_connector_late_register,
@@ -736,11 +736,11 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
/*
* Initialize connector state before adding the connectror to drm and
* framebuffer lists
*/
- amdgpu_dm_connector_funcs_reset(connector);
+ connector->state = amdgpu_dm_connector_atomic_create_state(connector);
drm_dp_mst_get_port_malloc(port);
return connector;
}
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
index 6f91a992d43f..8181fcac299d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
@@ -223,11 +223,11 @@ static const struct drm_encoder_helper_funcs amdgpu_dm_wb_encoder_helper_funcs =
};
static const struct drm_connector_funcs amdgpu_dm_wb_connector_funcs = {
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = drm_connector_cleanup,
- .reset = amdgpu_dm_connector_funcs_reset,
+ .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
.atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
static const struct drm_connector_helper_funcs amdgpu_dm_wb_conn_helper_funcs = {
@@ -259,11 +259,19 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
return res;
/*
* Some of the properties below require access to state, like bpc.
* Allocate some default initial connector state with our reset helper.
*/
- if (wbcon->base.base.funcs->reset)
- wbcon->base.base.funcs->reset(&wbcon->base.base);
+ if (!wbcon->base.base.state &&
+ wbcon->base.base.funcs->atomic_create_state) {
+ struct drm_connector_state *conn_state;
+
+ conn_state = amdgpu_dm_connector_atomic_create_state(&wbcon->base.base);
+ if (IS_ERR(conn_state))
+ return PTR_ERR(conn_state);
+
+ wbcon->base.base.state = conn_state;
+ }
return 0;
}
EXPORT_IF_KUNIT(amdgpu_dm_wb_connector_init);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
index 8117aaf41f22..ebf8155326cb 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
@@ -1466,23 +1466,23 @@ static void dm_test_decide_crtc_timing_no_crtc_clock(struct kunit *test)
KUNIT_EXPECT_EQ(test, drm_mode.crtc_clock, 0);
KUNIT_EXPECT_EQ(test, drm_mode.crtc_hdisplay, 0);
}
-/* Tests for amdgpu_dm_connector_funcs_reset() */
+/* Tests for amdgpu_dm_connector_atomic_create_state() */
static const struct drm_connector_funcs dm_test_connector_funcs = {
- .reset = amdgpu_dm_connector_funcs_reset,
+ .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
.atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
/**
- * dm_test_funcs_reset_sets_defaults - Test funcs_reset sets defaults
+ * dm_test_atomic_create_sets_defaults - Test funcs_reset sets defaults
* @test: The KUnit test context
*/
-static void dm_test_funcs_reset_sets_defaults(struct kunit *test)
+static void dm_test_atomic_create_sets_defaults(struct kunit *test)
{
struct device *dev;
struct drm_device *drm;
struct drm_connector *connector;
struct dm_connector_state *dm_state;
@@ -1499,13 +1499,13 @@ static void dm_test_funcs_reset_sets_defaults(struct kunit *test)
KUNIT_ASSERT_NOT_NULL(test, connector);
drmm_connector_init(drm, connector, &dm_test_connector_funcs,
DRM_MODE_CONNECTOR_DisplayPort, NULL);
- amdgpu_dm_connector_funcs_reset(connector);
+ connector->state = amdgpu_dm_connector_atomic_create_state(connector);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
- KUNIT_ASSERT_NOT_NULL(test, connector->state);
dm_state = to_dm_connector_state(connector->state);
KUNIT_EXPECT_EQ(test, (int)dm_state->scaling, (int)RMX_OFF);
KUNIT_EXPECT_FALSE(test, dm_state->underscan_enable);
KUNIT_EXPECT_EQ(test, (int)dm_state->underscan_hborder, 0);
KUNIT_EXPECT_EQ(test, (int)dm_state->underscan_vborder, 0);
@@ -1513,14 +1513,14 @@ static void dm_test_funcs_reset_sets_defaults(struct kunit *test)
KUNIT_EXPECT_EQ(test, dm_state->vcpi_slots, 0);
KUNIT_EXPECT_EQ(test, (int)dm_state->pbn, 0);
}
/**
- * dm_test_funcs_reset_edp_abm_level - Test funcs_reset eDP sets ABM
+ * dm_test_atomic_create_edp_abm_level - Test funcs_reset eDP sets ABM
* @test: The KUnit test context
*/
-static void dm_test_funcs_reset_edp_abm_level(struct kunit *test)
+static void dm_test_atomic_create_edp_abm_level(struct kunit *test)
{
struct device *dev;
struct drm_device *drm;
struct drm_connector *connector;
struct dm_connector_state *dm_state;
@@ -1540,25 +1540,26 @@ static void dm_test_funcs_reset_edp_abm_level(struct kunit *test)
drmm_connector_init(drm, connector, &dm_test_connector_funcs,
DRM_MODE_CONNECTOR_eDP, NULL);
/* Test with abm_level > 0 */
amdgpu_dm_set_abm_level_param(3);
- amdgpu_dm_connector_funcs_reset(connector);
- KUNIT_ASSERT_NOT_NULL(test, connector->state);
+ connector->state = amdgpu_dm_connector_atomic_create_state(connector);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
+
dm_state = to_dm_connector_state(connector->state);
KUNIT_EXPECT_EQ(test, (int)dm_state->abm_level, 3);
amdgpu_dm_set_abm_level_param(saved_abm_level);
}
/**
- * dm_test_funcs_reset_edp_abm_disabled - Test funcs_reset eDP ABM
+ * dm_test_atomic_create_edp_abm_disabled - Test funcs_reset eDP ABM
* disabled
* @test: The KUnit test context
*/
-static void dm_test_funcs_reset_edp_abm_disabled(struct kunit *test)
+static void dm_test_atomic_create_edp_abm_disabled(struct kunit *test)
{
struct device *dev;
struct drm_device *drm;
struct drm_connector *connector;
struct dm_connector_state *dm_state;
@@ -1578,13 +1579,14 @@ static void dm_test_funcs_reset_edp_abm_disabled(struct kunit *test)
drmm_connector_init(drm, connector, &dm_test_connector_funcs,
DRM_MODE_CONNECTOR_eDP, NULL);
/* Test with abm_level <= 0 → immediate disable */
amdgpu_dm_set_abm_level_param(-1);
- amdgpu_dm_connector_funcs_reset(connector);
- KUNIT_ASSERT_NOT_NULL(test, connector->state);
+ connector->state = amdgpu_dm_connector_atomic_create_state(connector);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
+
dm_state = to_dm_connector_state(connector->state);
KUNIT_EXPECT_EQ(test, (int)dm_state->abm_level,
(int)ABM_LEVEL_IMMEDIATE_DISABLE);
amdgpu_dm_set_abm_level_param(saved_abm_level);
@@ -1618,12 +1620,12 @@ static void dm_test_atomic_dup_state_copies_fields(struct kunit *test)
KUNIT_ASSERT_NOT_NULL(test, connector);
drmm_connector_init(drm, connector, &dm_test_connector_funcs,
DRM_MODE_CONNECTOR_HDMIA, NULL);
- amdgpu_dm_connector_funcs_reset(connector);
- KUNIT_ASSERT_NOT_NULL(test, connector->state);
+ connector->state = amdgpu_dm_connector_atomic_create_state(connector);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
/* Modify original state fields */
dm_state = to_dm_connector_state(connector->state);
dm_state->scaling = RMX_CENTER;
dm_state->underscan_enable = true;
@@ -4884,11 +4886,11 @@ static struct dm_test_destroy_ctx *dm_test_destroy_ctx_alloc(struct kunit *test)
* drm_connector_init() requires funcs->destroy to be set, so a dedicated funcs
* table wires it to amdgpu_dm_connector_destroy() (the test invokes it
* directly; the connector is removed from the device before teardown).
*/
static const struct drm_connector_funcs dm_test_destroy_funcs = {
- .reset = amdgpu_dm_connector_funcs_reset,
+ .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
.atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
.destroy = amdgpu_dm_connector_destroy,
};
@@ -6251,17 +6253,21 @@ static void dm_test_restore_state_no_connector_state(struct kunit *test)
*/
static void dm_test_restore_state_no_encoder(struct kunit *test)
{
struct drm_device *drm = dm_test_alloc_drm(test);
struct amdgpu_dm_connector *aconnector;
+ struct drm_connector_state *conn_state;
aconnector = dm_test_add_connector(test, drm,
DRM_MODE_CONNECTOR_HDMIA);
aconnector->dc_sink = kunit_kzalloc(test, 1, GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, aconnector->dc_sink);
- aconnector->base.funcs->reset(&aconnector->base);
- KUNIT_ASSERT_NOT_NULL(test, aconnector->base.state);
+
+ conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
+
+ aconnector->base.state = conn_state;
/* connector->encoder left NULL. */
dm_restore_drm_connector_state(drm, &aconnector->base);
KUNIT_EXPECT_NULL(test, aconnector->base.encoder);
@@ -6275,20 +6281,25 @@ static void dm_test_restore_state_no_encoder(struct kunit *test)
* dc stream, so the function returns before comparing sinks.
*/
static void dm_test_restore_state_no_stream(struct kunit *test)
{
struct drm_device *drm = dm_test_alloc_drm(test);
+ struct drm_connector_state *conn_state;
struct amdgpu_dm_connector *aconnector;
struct dm_crtc_state *acrtc_state;
struct drm_encoder *enc;
struct drm_crtc *crtc;
aconnector = dm_test_add_connector(test, drm,
DRM_MODE_CONNECTOR_HDMIA);
aconnector->dc_sink = kunit_kzalloc(test, 1, GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, aconnector->dc_sink);
- aconnector->base.funcs->reset(&aconnector->base);
+
+ conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
+
+ aconnector->base.state = conn_state;
enc = kunit_kzalloc(test, sizeof(*enc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, enc);
crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, crtc);
@@ -6313,21 +6324,26 @@ static void dm_test_restore_state_no_stream(struct kunit *test)
* nothing to restore, so the forced atomic commit is not issued.
*/
static void dm_test_restore_state_same_sink(struct kunit *test)
{
struct drm_device *drm = dm_test_alloc_drm(test);
+ struct drm_connector_state *conn_state;
struct amdgpu_dm_connector *aconnector;
struct dm_crtc_state *acrtc_state;
struct dc_stream_state *stream;
struct drm_encoder *enc;
struct drm_crtc *crtc;
aconnector = dm_test_add_connector(test, drm,
DRM_MODE_CONNECTOR_HDMIA);
aconnector->dc_sink = kunit_kzalloc(test, 1, GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, aconnector->dc_sink);
- aconnector->base.funcs->reset(&aconnector->base);
+
+ conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
+
+ aconnector->base.state = conn_state;
enc = kunit_kzalloc(test, sizeof(*enc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, enc);
crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, crtc);
@@ -7030,10 +7046,11 @@ static void dm_test_mode_valid_no_dc_sink(struct kunit *test)
*/
static void dm_test_mode_valid_force_on_no_stream(struct kunit *test)
{
struct dm_test_cvs_ctx *ctx =
dm_test_cvs_ctx_alloc(test, DRM_MODE_CONNECTOR_DisplayPort);
+ struct drm_connector_state *conn_state;
struct dc_sink *em_sink;
em_sink = kunit_kzalloc(test, sizeof(*em_sink), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, em_sink);
@@ -7042,12 +7059,14 @@ static void dm_test_mode_valid_force_on_no_stream(struct kunit *test)
ctx->aconnector->base.force = DRM_FORCE_ON;
/* drm_connector_cleanup() kfree()s connector->state, so it must not
* point at KUnit-managed memory.
*/
- amdgpu_dm_connector_funcs_reset(&ctx->aconnector->base);
- KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector->base.state);
+ conn_state = amdgpu_dm_connector_atomic_create_state(&ctx->aconnector->base);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
+
+ ctx->aconnector->base.state = conn_state;
ctx->aconnector->base.state->max_requested_bpc = 4;
KUNIT_EXPECT_EQ(test,
amdgpu_dm_connector_mode_valid(&ctx->aconnector->base,
ctx->mode),
@@ -7557,10 +7576,11 @@ static void dm_test_update_after_detect_disconnect(struct kunit *test)
{
struct dm_test_uad_ctx *ctx =
dm_test_uad_ctx_alloc(test, DRM_MODE_CONNECTOR_HDMIA);
struct dc_sink *old_sink = dm_test_uad_owned_sink();
struct dc_crtc_timing *timing = kzalloc_obj(*timing, GFP_KERNEL);
+ struct drm_connector_state *conn_state;
KUNIT_ASSERT_NOT_NULL(test, old_sink);
KUNIT_ASSERT_NOT_NULL(test, timing);
mutex_init(&ctx->adev->dm.audio_lock);
@@ -7568,12 +7588,14 @@ static void dm_test_update_after_detect_disconnect(struct kunit *test)
ctx->aconnector->timing_requested = timing;
ctx->aconnector->num_modes = 3;
ctx->aconnector->audio_inst = 5;
ctx->link->local_sink = NULL;
- amdgpu_dm_connector_funcs_reset(&ctx->aconnector->base);
- KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector->base.state);
+ conn_state = amdgpu_dm_connector_atomic_create_state(&ctx->aconnector->base);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
+
+ ctx->aconnector->base.state = conn_state;
ctx->aconnector->base.state->content_protection =
DRM_MODE_CONTENT_PROTECTION_ENABLED;
amdgpu_dm_update_connector_after_detect(ctx->aconnector);
@@ -9197,10 +9219,11 @@ struct dm_test_fs_caps_ctx {
* parser to succeed install one.
*/
static struct dm_test_fs_caps_ctx *
dm_test_fs_caps_ctx_alloc(struct kunit *test, enum signal_type sink_signal)
{
+ struct drm_connector_state *conn_state;
struct dm_test_fs_caps_ctx *ctx;
struct dc_context *dc_ctx;
struct device *dev;
struct dc *dc;
@@ -9222,12 +9245,15 @@ dm_test_fs_caps_ctx_alloc(struct kunit *test, enum signal_type sink_signal)
KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector);
KUNIT_ASSERT_EQ(test,
drmm_connector_init(ctx->drm, &ctx->aconnector->base,
&dm_test_connector_funcs,
DRM_MODE_CONNECTOR_DisplayPort, NULL), 0);
- amdgpu_dm_connector_funcs_reset(&ctx->aconnector->base);
- KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector->base.state);
+
+ conn_state = amdgpu_dm_connector_atomic_create_state(&ctx->aconnector->base);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
+
+ ctx->aconnector->base.state = conn_state;
KUNIT_ASSERT_EQ(test,
drm_connector_attach_vrr_capable_property(&ctx->aconnector->base), 0);
dc_ctx = kunit_kzalloc(test, sizeof(*dc_ctx), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dc_ctx);
@@ -9628,11 +9654,11 @@ dm_test_force_dup_state_fail(struct drm_connector *connector)
{
return NULL;
}
static const struct drm_connector_funcs dm_test_force_fail_funcs = {
- .reset = amdgpu_dm_connector_funcs_reset,
+ .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
.atomic_duplicate_state = dm_test_force_dup_state_fail,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
/* The atomic modeset check dereferences the helper funcs unconditionally. */
@@ -9845,14 +9871,14 @@ static struct kunit_case amdgpu_dm_connector_tests[] = {
/* decide_crtc_timing_for_drm_display_mode */
KUNIT_CASE(dm_test_decide_crtc_timing_scale_enabled),
KUNIT_CASE(dm_test_decide_crtc_timing_matching_mode),
KUNIT_CASE(dm_test_decide_crtc_timing_no_copy),
KUNIT_CASE(dm_test_decide_crtc_timing_no_crtc_clock),
- /* amdgpu_dm_connector_funcs_reset */
- KUNIT_CASE(dm_test_funcs_reset_sets_defaults),
- KUNIT_CASE(dm_test_funcs_reset_edp_abm_level),
- KUNIT_CASE(dm_test_funcs_reset_edp_abm_disabled),
+ /* amdgpu_dm_connector_atomic_create_state */
+ KUNIT_CASE(dm_test_atomic_create_sets_defaults),
+ KUNIT_CASE(dm_test_atomic_create_edp_abm_level),
+ KUNIT_CASE(dm_test_atomic_create_edp_abm_disabled),
/* amdgpu_dm_connector_atomic_duplicate_state */
KUNIT_CASE(dm_test_atomic_dup_state_copies_fields),
/* amdgpu_dm_fill_hdr_info_packet */
KUNIT_CASE(dm_test_fill_hdr_null_metadata),
KUNIT_CASE(dm_test_fill_hdr_zeroes_output),
--
2.55.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: (subset) [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset
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 66/75] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
@ 2026-10-16 15:06 ` Maxime Ripard
2026-10-16 15:12 ` Maxime Ripard
2026-10-19 15:15 ` Maxime Ripard
5 siblings, 0 replies; 11+ messages in thread
From: Maxime Ripard @ 2026-10-16 15:06 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
Maxime Ripard
Cc: dri-devel, 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
On Wed, 14 Oct 2026 19:26:23 +0200, Maxime Ripard wrote:
> 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.
>
> [...]
Applied to misc/kernel.git (drm-misc-next)
[05/75] drm/arm: komeda: Switch to drm_atomic_helper_connector_create_state
commit: 849b1119cb1f429667bf3e79cba86ad397087ab7
[11/75] drm/bridge: lontium-lt8912b: Switch to drm_atomic_helper_connector_create_state
commit: 80512a4f295c52caf1394677d9c80738b68c8831
[12/75] drm/bridge: megachips: Switch to drm_atomic_helper_connector_create_state
commit: 9a4a55df74880acf7c2b954d6011aab579db5f5e
[24/75] drm/hyperv: Switch to drm_atomic_helper_connector_create_state
commit: 7b9c28149a291451ada4c3e9fc7fd2ae13f36bc5
[25/75] drm/imx: ipuv3: Switch to drm_atomic_helper_connector_create_state
commit: 75da1ba5a3c36dca76206ec8e90bebcfc3641c64
[35/75] drm/solomon: ssd130x: Switch to drm_atomic_helper_connector_create_state
commit: 9ec42580ccceb54bd8e0b044729a98e4f345b522
[39/75] drm/sysfb: Switch to drm_atomic_helper_connector_create_state
commit: af36b2313c54e10b832298033b8be2fd50746c96
[51/75] drm/vc4: Switch to drm_atomic_helper_connector_create_state
commit: c81e4d88c3ed73483a99a90f56cc80c80eebc863
[67/75] drm/malidp: Convert to atomic_create_state
commit: 8b32d0652db9bb6b01055311e1cce5e3c4b70137
Thanks!
Maxime
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: (subset) [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset
2026-10-14 17:26 [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
` (3 preceding siblings ...)
2026-10-16 15:06 ` (subset) [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
@ 2026-10-16 15:12 ` Maxime Ripard
2026-10-19 15:15 ` Maxime Ripard
5 siblings, 0 replies; 11+ messages in thread
From: Maxime Ripard @ 2026-10-16 15:12 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
Maxime Ripard
Cc: dri-devel, 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
On Wed, 14 Oct 2026 19:26:23 +0200, Maxime Ripard wrote:
> 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.
>
> [...]
Applied to misc/kernel.git (drm-misc-next)
[02/75] drm/adp: Switch to drm_atomic_helper_connector_create_state
commit: db1de27aca30ebaad04aea74ac21e4c4fb531a37
Thanks!
Maxime
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 04/75] drm/amdgpu: dm: Switch to drm_atomic_helper_connector_create_state
2026-10-14 17:26 ` [PATCH 04/75] drm/amdgpu: dm: " Maxime Ripard
@ 2026-10-16 16:41 ` Leo Li
0 siblings, 0 replies; 11+ messages in thread
From: Leo Li @ 2026-10-16 16:41 UTC (permalink / raw)
To: Maxime Ripard, Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, Christian König, Alex Deucher, Harry Wentland,
Rodrigo Siqueira, amd-gfx
On 2026-10-14 13:26, Maxime Ripard wrote:
> The amdgpu: dm 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>
Reviewed-by: Leo Li <sunpeng.li@amd.com>
> ---
> Cc: "Christian König" <christian.koenig@amd.com>
> Cc: Alex Deucher <alexander.deucher@amd.com>
> Cc: Harry Wentland <harry.wentland@amd.com>
> Cc: Leo Li <sunpeng.li@amd.com>
> Cc: Rodrigo Siqueira <siqueira@igalia.com>
> Cc: amd-gfx@lists.freedesktop.org
> ---
> drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c | 2 +-
> .../gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c | 2 +-
> drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c | 7 ++++---
> .../gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c | 2 +-
> drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c | 2 +-
> .../gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c | 4 ++--
> drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c | 2 +-
> 7 files changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c
> index 040a7a9c0335..9d83b7b1ca80 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_audio_test.c
> @@ -25,11 +25,11 @@
> #include "amdgpu_dm.h"
> #include "amdgpu_dm_audio.h"
> #include "amdgpu_dm_kunit_test_helpers.h"
>
> static const struct drm_connector_funcs dm_test_audio_connector_funcs = {
> - .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,
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = drm_connector_cleanup,
> };
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
> index 5221050dec2f..6e9ee3c93943 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
> @@ -30,11 +30,11 @@ struct dm_backlight_connector_fixture {
> struct amdgpu_dm_connector *aconnector;
> struct dc_link *link;
> };
>
> static const struct drm_connector_funcs dm_backlight_test_connector_funcs = {
> - .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 setup_test_connector(struct kunit *test,
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c
> index 29a513dab9cd..e47b4dd210b8 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crc_test.c
> @@ -173,11 +173,11 @@ static struct amdgpu_crtc *dm_test_alloc_crc_crtc(struct kunit *test,
>
> return acrtc;
> }
>
> static const struct drm_connector_funcs dm_test_crc_connector_funcs = {
> - .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,
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = drm_connector_cleanup,
> };
> @@ -652,12 +652,13 @@ static void dm_test_crtc_set_crc_source_dprx_no_connector(struct kunit *test)
> KUNIT_ASSERT_EQ(test, drm_connector_init(&adev->ddev, wb_conn,
> &dm_test_crc_connector_funcs,
> DRM_MODE_CONNECTOR_WRITEBACK), 0);
> KUNIT_ASSERT_EQ(test, kunit_add_action_or_reset(test,
> dm_test_crc_connector_cleanup, wb_conn), 0);
> - drm_atomic_helper_connector_reset(wb_conn);
> - KUNIT_ASSERT_NOT_NULL(test, wb_conn->state);
> +
> + wb_conn->state = drm_atomic_helper_connector_create_state(wb_conn);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, wb_conn->state);
> wb_conn->state->crtc = &acrtc->base;
> /*
> * __drm_atomic_helper_connector_destroy_state() drops a connector
> * reference when state->crtc is set. Balance it here since the CRTC is
> * assigned directly rather than via drm_atomic_set_crtc_for_connector(),
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
> index 51c3995de76d..a369a3cbd4af 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
> @@ -4104,11 +4104,11 @@ static void dm_test_is_dp_sink_present_queries_link_service(struct kunit *test)
> * drm_edid_connector_update(), which needs a fully initialised connector so the
> * EDID property blob is published. dm_kunit_alloc_connector() only fills in the
> * device pointer, so build a real one here.
> */
> static const struct drm_connector_funcs dm_test_connector_funcs = {
> - .reset = drm_atomic_helper_connector_reset,
> + .atomic_create_state = drm_atomic_helper_connector_create_state,
> };
>
> static struct amdgpu_dm_connector *dm_test_alloc_real_connector(struct kunit *test,
> struct amdgpu_device *adev)
> {
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c
> index dc7d94f75ff4..3265b50abb46 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_irq_test.c
> @@ -479,11 +479,11 @@ static void dm_test_destroy_hpd_rx_wq(void *data)
> destroy_workqueue(ctx->wq[i].wq);
> kfree(ctx->wq);
> }
>
> static const struct drm_connector_funcs dm_test_connector_funcs = {
> - .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,
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = drm_connector_cleanup,
> };
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
> index 382eafab2d43..10a213c36af4 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_mst_types_test.c
> @@ -1160,11 +1160,11 @@ static bool dm_mst_test_dp_get_max_link_enc_cap(const struct dc_link *link,
> static void dm_mst_test_connector_destroy(struct drm_connector *connector)
> {
> }
>
> static const struct drm_connector_funcs dm_mst_test_connector_funcs = {
> - .reset = drm_atomic_helper_connector_reset,
> + .atomic_create_state = drm_atomic_helper_connector_create_state,
> .destroy = dm_mst_test_connector_destroy,
> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> };
>
> @@ -3698,11 +3698,11 @@ static void dm_mst_test_pre_compute_configs_no_recompute(struct kunit *test)
> }
>
> /* Tests for compute_mst_dsc_configs_for_link */
>
> static const struct drm_connector_funcs dm_mst_test_dsc_link_conn_funcs = {
> - .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 enum dp_link_encoding dm_mst_test_mst_encoding_format(const struct dc_link *link)
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
> index 03036f906385..e1e7d4c29966 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
> @@ -385,11 +385,11 @@ static void dm_test_wb_atomic_check_invalid_format(struct kunit *test)
> /* Tests for amdgpu_dm_wb_connector_get_modes using DRM mock */
>
> static const struct drm_connector_funcs dm_wb_test_connector_funcs = {
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
> - .reset = drm_atomic_helper_connector_reset,
> + .atomic_create_state = drm_atomic_helper_connector_create_state,
> };
>
> /**
> * dm_test_wb_get_modes_returns_modes - Verify at least one mode is returned
> * @test: KUnit test context
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: (subset) [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset
2026-10-14 17:26 [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
` (4 preceding siblings ...)
2026-10-16 15:12 ` Maxime Ripard
@ 2026-10-19 15:15 ` Maxime Ripard
5 siblings, 0 replies; 11+ messages in thread
From: Maxime Ripard @ 2026-10-19 15:15 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
Maxime Ripard
Cc: dri-devel, 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
On Wed, 14 Oct 2026 19:26:23 +0200, Maxime Ripard wrote:
> 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.
>
> [...]
Applied to misc/kernel.git (drm-misc-next)
[73/75] drm/vmwgfx: Convert to atomic_create_state
commit: e6bb593b800813788dc16179d1305747ff974d00
Thanks!
Maxime
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 66/75] drm/amdgpu: dm: Convert to atomic_create_state
2026-10-14 17:27 ` [PATCH 66/75] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
@ 2026-10-19 16:38 ` Leo Li
2026-10-20 13:08 ` Maxime Ripard
0 siblings, 1 reply; 11+ messages in thread
From: Leo Li @ 2026-10-19 16:38 UTC (permalink / raw)
To: Maxime Ripard, Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, Christian König, Alex Deucher, Harry Wentland,
Rodrigo Siqueira, amd-gfx
On 2026-10-14 13:27, Maxime Ripard wrote:
> The amdgpu_dm connector reset implementation creates a custom state
> subclass, but only initializes a pristine state without resetting any
> hardware. This is equivalent to what atomic_create_state expects.
> Convert to it.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> ---
> Cc: "Christian König" <christian.koenig@amd.com>
> Cc: Alex Deucher <alexander.deucher@amd.com>
> Cc: Harry Wentland <harry.wentland@amd.com>
> Cc: Leo Li <sunpeng.li@amd.com>
> Cc: Rodrigo Siqueira <siqueira@igalia.com>
> Cc: amd-gfx@lists.freedesktop.org
> ---
> .../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 +++-
> .../amdgpu_dm/tests/amdgpu_dm_connector_test.c | 90 ++++++++++++++--------
> 5 files changed, 91 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> index 3a4e98b08ac1..2c22f00f521c 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> @@ -1939,26 +1939,20 @@ STATIC_IFN_KUNIT void amdgpu_dm_connector_destroy(struct drm_connector *connecto
>
> kfree(connector);
> }
> EXPORT_IF_KUNIT(amdgpu_dm_connector_destroy);
>
> -void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
> +struct drm_connector_state *
> +amdgpu_dm_connector_atomic_create_state(struct drm_connector *connector)
> {
> - struct dm_connector_state *old_state =
> - to_dm_connector_state(connector->state);
> struct dm_connector_state *state;
>
> state = kzalloc_obj(*state);
> if (!state)
> - return;
> + return ERR_PTR(-ENOMEM);
>
> - if (connector->state)
> - __drm_atomic_helper_connector_destroy_state(connector->state);
> -
> - kfree(old_state);
> -
> - __drm_atomic_helper_connector_reset(connector, &state->base);
> + __drm_atomic_helper_connector_state_init(&state->base, connector);
>
> state->scaling = RMX_OFF;
> state->underscan_enable = false;
> state->underscan_hborder = 0;
> state->underscan_vborder = 0;
> @@ -1970,12 +1964,14 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
> if (amdgpu_dm_abm_level <= 0)
> state->abm_level = ABM_LEVEL_IMMEDIATE_DISABLE;
> else
> state->abm_level = amdgpu_dm_abm_level;
> }
> +
> + return &state->base;
> }
> -EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_reset);
> +EXPORT_IF_KUNIT(amdgpu_dm_connector_atomic_create_state);
>
> struct drm_connector_state *
> amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector)
> {
> struct dm_connector_state *state =
> @@ -2070,11 +2066,11 @@ STATIC_IFN_KUNIT void amdgpu_dm_connector_funcs_force(struct drm_connector *conn
> }
> }
> EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_force);
>
> static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
> - .reset = amdgpu_dm_connector_funcs_reset,
> + .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
> .detect = amdgpu_dm_connector_detect,
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = amdgpu_dm_connector_destroy,
> .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> @@ -3197,12 +3193,20 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
>
> /*
> * Some of the properties below require access to state, like bpc.
> * Allocate some default initial connector state with our reset helper.
> */
> - if (aconnector->base.funcs->reset)
> - aconnector->base.funcs->reset(&aconnector->base);
> + if (!aconnector->base.state &&
> + aconnector->base.funcs->atomic_create_state) {
> + struct drm_connector_state *conn_state;
> +
> + conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
> + if (IS_ERR(conn_state))
> + return;
> +
> + aconnector->base.state = conn_state;
> + }
>
> aconnector->connector_id = link_index;
> aconnector->bl_idx = -1;
> aconnector->dc_link = link;
> aconnector->base.interlace_allowed = false;
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h
> index 79698deacf61..4a73fc607f38 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h
> @@ -48,11 +48,12 @@ struct drm_crtc;
> struct drm_device;
> struct drm_display_mode;
> struct drm_edid;
> struct drm_property;
>
> -void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector);
> +struct drm_connector_state *
> +amdgpu_dm_connector_atomic_create_state(struct drm_connector *connector);
>
> struct drm_connector_state *
> amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector);
>
> int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> index a5b15bef8aa0..cb189c098ec3 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> @@ -256,11 +256,11 @@ amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector)
> EXPORT_IF_KUNIT(amdgpu_dm_mst_connector_early_unregister);
>
> static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = dm_dp_mst_connector_destroy,
> - .reset = amdgpu_dm_connector_funcs_reset,
> + .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
> .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> .atomic_set_property = amdgpu_dm_connector_atomic_set_property,
> .atomic_get_property = amdgpu_dm_connector_atomic_get_property,
> .late_register = amdgpu_dm_mst_connector_late_register,
> @@ -736,11 +736,11 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
>
> /*
> * Initialize connector state before adding the connectror to drm and
> * framebuffer lists
> */
> - amdgpu_dm_connector_funcs_reset(connector);
I'm actually not sure why there was a state reset here. amdgpu_dm_connector_init_helper() is called earlier in this func and that already did a reset.
> + connector->state = amdgpu_dm_connector_atomic_create_state(connector);
That asside, looks like this can overwrite the alloc'd state from init_helper() without freeing. So to keep the previous behavior and avoid regressing, perhaps we can do this:
conn_state = amdgpu_dm_connector_atomic_create_state(connector);
if (!IS_ERR(conn_state)) {
if (connector->state)
connector->funcs->atomic_destroy_state(connector, connector->state);
connector->state = conn_state;
}
>
> drm_dp_mst_get_port_malloc(port);
>
> return connector;
> }
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> index 6f91a992d43f..8181fcac299d 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> @@ -223,11 +223,11 @@ static const struct drm_encoder_helper_funcs amdgpu_dm_wb_encoder_helper_funcs =
> };
>
> static const struct drm_connector_funcs amdgpu_dm_wb_connector_funcs = {
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = drm_connector_cleanup,
> - .reset = amdgpu_dm_connector_funcs_reset,
> + .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
> .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> };
>
> static const struct drm_connector_helper_funcs amdgpu_dm_wb_conn_helper_funcs = {
> @@ -259,11 +259,19 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
> return res;
> /*
> * Some of the properties below require access to state, like bpc.
> * Allocate some default initial connector state with our reset helper.
> */
> - if (wbcon->base.base.funcs->reset)
> - wbcon->base.base.funcs->reset(&wbcon->base.base);
> + if (!wbcon->base.base.state &&
> + wbcon->base.base.funcs->atomic_create_state) {
> + struct drm_connector_state *conn_state;
> +
> + conn_state = amdgpu_dm_connector_atomic_create_state(&wbcon->base.base);
Nit: functionally the same, but would `wbcon->base.base.funcs->atomic_create_state(&wbcon->base.base);` be clearer?
Thanks,
Leo
> + if (IS_ERR(conn_state))
> + return PTR_ERR(conn_state);
> +
> + wbcon->base.base.state = conn_state;
> + }
>
> return 0;
> }
> EXPORT_IF_KUNIT(amdgpu_dm_wb_connector_init);
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
> index 8117aaf41f22..ebf8155326cb 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
> @@ -1466,23 +1466,23 @@ static void dm_test_decide_crtc_timing_no_crtc_clock(struct kunit *test)
>
> KUNIT_EXPECT_EQ(test, drm_mode.crtc_clock, 0);
> KUNIT_EXPECT_EQ(test, drm_mode.crtc_hdisplay, 0);
> }
>
> -/* Tests for amdgpu_dm_connector_funcs_reset() */
> +/* Tests for amdgpu_dm_connector_atomic_create_state() */
>
> static const struct drm_connector_funcs dm_test_connector_funcs = {
> - .reset = amdgpu_dm_connector_funcs_reset,
> + .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
> .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> };
>
> /**
> - * dm_test_funcs_reset_sets_defaults - Test funcs_reset sets defaults
> + * dm_test_atomic_create_sets_defaults - Test funcs_reset sets defaults
> * @test: The KUnit test context
> */
> -static void dm_test_funcs_reset_sets_defaults(struct kunit *test)
> +static void dm_test_atomic_create_sets_defaults(struct kunit *test)
> {
> struct device *dev;
> struct drm_device *drm;
> struct drm_connector *connector;
> struct dm_connector_state *dm_state;
> @@ -1499,13 +1499,13 @@ static void dm_test_funcs_reset_sets_defaults(struct kunit *test)
> KUNIT_ASSERT_NOT_NULL(test, connector);
>
> drmm_connector_init(drm, connector, &dm_test_connector_funcs,
> DRM_MODE_CONNECTOR_DisplayPort, NULL);
>
> - amdgpu_dm_connector_funcs_reset(connector);
> + connector->state = amdgpu_dm_connector_atomic_create_state(connector);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
>
> - KUNIT_ASSERT_NOT_NULL(test, connector->state);
> dm_state = to_dm_connector_state(connector->state);
> KUNIT_EXPECT_EQ(test, (int)dm_state->scaling, (int)RMX_OFF);
> KUNIT_EXPECT_FALSE(test, dm_state->underscan_enable);
> KUNIT_EXPECT_EQ(test, (int)dm_state->underscan_hborder, 0);
> KUNIT_EXPECT_EQ(test, (int)dm_state->underscan_vborder, 0);
> @@ -1513,14 +1513,14 @@ static void dm_test_funcs_reset_sets_defaults(struct kunit *test)
> KUNIT_EXPECT_EQ(test, dm_state->vcpi_slots, 0);
> KUNIT_EXPECT_EQ(test, (int)dm_state->pbn, 0);
> }
>
> /**
> - * dm_test_funcs_reset_edp_abm_level - Test funcs_reset eDP sets ABM
> + * dm_test_atomic_create_edp_abm_level - Test funcs_reset eDP sets ABM
> * @test: The KUnit test context
> */
> -static void dm_test_funcs_reset_edp_abm_level(struct kunit *test)
> +static void dm_test_atomic_create_edp_abm_level(struct kunit *test)
> {
> struct device *dev;
> struct drm_device *drm;
> struct drm_connector *connector;
> struct dm_connector_state *dm_state;
> @@ -1540,25 +1540,26 @@ static void dm_test_funcs_reset_edp_abm_level(struct kunit *test)
> drmm_connector_init(drm, connector, &dm_test_connector_funcs,
> DRM_MODE_CONNECTOR_eDP, NULL);
>
> /* Test with abm_level > 0 */
> amdgpu_dm_set_abm_level_param(3);
> - amdgpu_dm_connector_funcs_reset(connector);
>
> - KUNIT_ASSERT_NOT_NULL(test, connector->state);
> + connector->state = amdgpu_dm_connector_atomic_create_state(connector);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
> +
> dm_state = to_dm_connector_state(connector->state);
> KUNIT_EXPECT_EQ(test, (int)dm_state->abm_level, 3);
>
> amdgpu_dm_set_abm_level_param(saved_abm_level);
> }
>
> /**
> - * dm_test_funcs_reset_edp_abm_disabled - Test funcs_reset eDP ABM
> + * dm_test_atomic_create_edp_abm_disabled - Test funcs_reset eDP ABM
> * disabled
> * @test: The KUnit test context
> */
> -static void dm_test_funcs_reset_edp_abm_disabled(struct kunit *test)
> +static void dm_test_atomic_create_edp_abm_disabled(struct kunit *test)
> {
> struct device *dev;
> struct drm_device *drm;
> struct drm_connector *connector;
> struct dm_connector_state *dm_state;
> @@ -1578,13 +1579,14 @@ static void dm_test_funcs_reset_edp_abm_disabled(struct kunit *test)
> drmm_connector_init(drm, connector, &dm_test_connector_funcs,
> DRM_MODE_CONNECTOR_eDP, NULL);
>
> /* Test with abm_level <= 0 → immediate disable */
> amdgpu_dm_set_abm_level_param(-1);
> - amdgpu_dm_connector_funcs_reset(connector);
>
> - KUNIT_ASSERT_NOT_NULL(test, connector->state);
> + connector->state = amdgpu_dm_connector_atomic_create_state(connector);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
> +
> dm_state = to_dm_connector_state(connector->state);
> KUNIT_EXPECT_EQ(test, (int)dm_state->abm_level,
> (int)ABM_LEVEL_IMMEDIATE_DISABLE);
>
> amdgpu_dm_set_abm_level_param(saved_abm_level);
> @@ -1618,12 +1620,12 @@ static void dm_test_atomic_dup_state_copies_fields(struct kunit *test)
> KUNIT_ASSERT_NOT_NULL(test, connector);
>
> drmm_connector_init(drm, connector, &dm_test_connector_funcs,
> DRM_MODE_CONNECTOR_HDMIA, NULL);
>
> - amdgpu_dm_connector_funcs_reset(connector);
> - KUNIT_ASSERT_NOT_NULL(test, connector->state);
> + connector->state = amdgpu_dm_connector_atomic_create_state(connector);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector->state);
>
> /* Modify original state fields */
> dm_state = to_dm_connector_state(connector->state);
> dm_state->scaling = RMX_CENTER;
> dm_state->underscan_enable = true;
> @@ -4884,11 +4886,11 @@ static struct dm_test_destroy_ctx *dm_test_destroy_ctx_alloc(struct kunit *test)
> * drm_connector_init() requires funcs->destroy to be set, so a dedicated funcs
> * table wires it to amdgpu_dm_connector_destroy() (the test invokes it
> * directly; the connector is removed from the device before teardown).
> */
> static const struct drm_connector_funcs dm_test_destroy_funcs = {
> - .reset = amdgpu_dm_connector_funcs_reset,
> + .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
> .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> .destroy = amdgpu_dm_connector_destroy,
> };
>
> @@ -6251,17 +6253,21 @@ static void dm_test_restore_state_no_connector_state(struct kunit *test)
> */
> static void dm_test_restore_state_no_encoder(struct kunit *test)
> {
> struct drm_device *drm = dm_test_alloc_drm(test);
> struct amdgpu_dm_connector *aconnector;
> + struct drm_connector_state *conn_state;
>
> aconnector = dm_test_add_connector(test, drm,
> DRM_MODE_CONNECTOR_HDMIA);
> aconnector->dc_sink = kunit_kzalloc(test, 1, GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, aconnector->dc_sink);
> - aconnector->base.funcs->reset(&aconnector->base);
> - KUNIT_ASSERT_NOT_NULL(test, aconnector->base.state);
> +
> + conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
> +
> + aconnector->base.state = conn_state;
> /* connector->encoder left NULL. */
>
> dm_restore_drm_connector_state(drm, &aconnector->base);
>
> KUNIT_EXPECT_NULL(test, aconnector->base.encoder);
> @@ -6275,20 +6281,25 @@ static void dm_test_restore_state_no_encoder(struct kunit *test)
> * dc stream, so the function returns before comparing sinks.
> */
> static void dm_test_restore_state_no_stream(struct kunit *test)
> {
> struct drm_device *drm = dm_test_alloc_drm(test);
> + struct drm_connector_state *conn_state;
> struct amdgpu_dm_connector *aconnector;
> struct dm_crtc_state *acrtc_state;
> struct drm_encoder *enc;
> struct drm_crtc *crtc;
>
> aconnector = dm_test_add_connector(test, drm,
> DRM_MODE_CONNECTOR_HDMIA);
> aconnector->dc_sink = kunit_kzalloc(test, 1, GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, aconnector->dc_sink);
> - aconnector->base.funcs->reset(&aconnector->base);
> +
> + conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
> +
> + aconnector->base.state = conn_state;
>
> enc = kunit_kzalloc(test, sizeof(*enc), GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, enc);
> crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, crtc);
> @@ -6313,21 +6324,26 @@ static void dm_test_restore_state_no_stream(struct kunit *test)
> * nothing to restore, so the forced atomic commit is not issued.
> */
> static void dm_test_restore_state_same_sink(struct kunit *test)
> {
> struct drm_device *drm = dm_test_alloc_drm(test);
> + struct drm_connector_state *conn_state;
> struct amdgpu_dm_connector *aconnector;
> struct dm_crtc_state *acrtc_state;
> struct dc_stream_state *stream;
> struct drm_encoder *enc;
> struct drm_crtc *crtc;
>
> aconnector = dm_test_add_connector(test, drm,
> DRM_MODE_CONNECTOR_HDMIA);
> aconnector->dc_sink = kunit_kzalloc(test, 1, GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, aconnector->dc_sink);
> - aconnector->base.funcs->reset(&aconnector->base);
> +
> + conn_state = aconnector->base.funcs->atomic_create_state(&aconnector->base);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
> +
> + aconnector->base.state = conn_state;
>
> enc = kunit_kzalloc(test, sizeof(*enc), GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, enc);
> crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, crtc);
> @@ -7030,10 +7046,11 @@ static void dm_test_mode_valid_no_dc_sink(struct kunit *test)
> */
> static void dm_test_mode_valid_force_on_no_stream(struct kunit *test)
> {
> struct dm_test_cvs_ctx *ctx =
> dm_test_cvs_ctx_alloc(test, DRM_MODE_CONNECTOR_DisplayPort);
> + struct drm_connector_state *conn_state;
> struct dc_sink *em_sink;
>
> em_sink = kunit_kzalloc(test, sizeof(*em_sink), GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, em_sink);
>
> @@ -7042,12 +7059,14 @@ static void dm_test_mode_valid_force_on_no_stream(struct kunit *test)
> ctx->aconnector->base.force = DRM_FORCE_ON;
>
> /* drm_connector_cleanup() kfree()s connector->state, so it must not
> * point at KUnit-managed memory.
> */
> - amdgpu_dm_connector_funcs_reset(&ctx->aconnector->base);
> - KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector->base.state);
> + conn_state = amdgpu_dm_connector_atomic_create_state(&ctx->aconnector->base);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
> +
> + ctx->aconnector->base.state = conn_state;
> ctx->aconnector->base.state->max_requested_bpc = 4;
>
> KUNIT_EXPECT_EQ(test,
> amdgpu_dm_connector_mode_valid(&ctx->aconnector->base,
> ctx->mode),
> @@ -7557,10 +7576,11 @@ static void dm_test_update_after_detect_disconnect(struct kunit *test)
> {
> struct dm_test_uad_ctx *ctx =
> dm_test_uad_ctx_alloc(test, DRM_MODE_CONNECTOR_HDMIA);
> struct dc_sink *old_sink = dm_test_uad_owned_sink();
> struct dc_crtc_timing *timing = kzalloc_obj(*timing, GFP_KERNEL);
> + struct drm_connector_state *conn_state;
>
> KUNIT_ASSERT_NOT_NULL(test, old_sink);
> KUNIT_ASSERT_NOT_NULL(test, timing);
>
> mutex_init(&ctx->adev->dm.audio_lock);
> @@ -7568,12 +7588,14 @@ static void dm_test_update_after_detect_disconnect(struct kunit *test)
> ctx->aconnector->timing_requested = timing;
> ctx->aconnector->num_modes = 3;
> ctx->aconnector->audio_inst = 5;
> ctx->link->local_sink = NULL;
>
> - amdgpu_dm_connector_funcs_reset(&ctx->aconnector->base);
> - KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector->base.state);
> + conn_state = amdgpu_dm_connector_atomic_create_state(&ctx->aconnector->base);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
> +
> + ctx->aconnector->base.state = conn_state;
> ctx->aconnector->base.state->content_protection =
> DRM_MODE_CONTENT_PROTECTION_ENABLED;
>
> amdgpu_dm_update_connector_after_detect(ctx->aconnector);
>
> @@ -9197,10 +9219,11 @@ struct dm_test_fs_caps_ctx {
> * parser to succeed install one.
> */
> static struct dm_test_fs_caps_ctx *
> dm_test_fs_caps_ctx_alloc(struct kunit *test, enum signal_type sink_signal)
> {
> + struct drm_connector_state *conn_state;
> struct dm_test_fs_caps_ctx *ctx;
> struct dc_context *dc_ctx;
> struct device *dev;
> struct dc *dc;
>
> @@ -9222,12 +9245,15 @@ dm_test_fs_caps_ctx_alloc(struct kunit *test, enum signal_type sink_signal)
> KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector);
> KUNIT_ASSERT_EQ(test,
> drmm_connector_init(ctx->drm, &ctx->aconnector->base,
> &dm_test_connector_funcs,
> DRM_MODE_CONNECTOR_DisplayPort, NULL), 0);
> - amdgpu_dm_connector_funcs_reset(&ctx->aconnector->base);
> - KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector->base.state);
> +
> + conn_state = amdgpu_dm_connector_atomic_create_state(&ctx->aconnector->base);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state);
> +
> + ctx->aconnector->base.state = conn_state;
> KUNIT_ASSERT_EQ(test,
> drm_connector_attach_vrr_capable_property(&ctx->aconnector->base), 0);
>
> dc_ctx = kunit_kzalloc(test, sizeof(*dc_ctx), GFP_KERNEL);
> KUNIT_ASSERT_NOT_NULL(test, dc_ctx);
> @@ -9628,11 +9654,11 @@ dm_test_force_dup_state_fail(struct drm_connector *connector)
> {
> return NULL;
> }
>
> static const struct drm_connector_funcs dm_test_force_fail_funcs = {
> - .reset = amdgpu_dm_connector_funcs_reset,
> + .atomic_create_state = amdgpu_dm_connector_atomic_create_state,
> .atomic_duplicate_state = dm_test_force_dup_state_fail,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> };
>
> /* The atomic modeset check dereferences the helper funcs unconditionally. */
> @@ -9845,14 +9871,14 @@ static struct kunit_case amdgpu_dm_connector_tests[] = {
> /* decide_crtc_timing_for_drm_display_mode */
> KUNIT_CASE(dm_test_decide_crtc_timing_scale_enabled),
> KUNIT_CASE(dm_test_decide_crtc_timing_matching_mode),
> KUNIT_CASE(dm_test_decide_crtc_timing_no_copy),
> KUNIT_CASE(dm_test_decide_crtc_timing_no_crtc_clock),
> - /* amdgpu_dm_connector_funcs_reset */
> - KUNIT_CASE(dm_test_funcs_reset_sets_defaults),
> - KUNIT_CASE(dm_test_funcs_reset_edp_abm_level),
> - KUNIT_CASE(dm_test_funcs_reset_edp_abm_disabled),
> + /* amdgpu_dm_connector_atomic_create_state */
> + KUNIT_CASE(dm_test_atomic_create_sets_defaults),
> + KUNIT_CASE(dm_test_atomic_create_edp_abm_level),
> + KUNIT_CASE(dm_test_atomic_create_edp_abm_disabled),
> /* amdgpu_dm_connector_atomic_duplicate_state */
> KUNIT_CASE(dm_test_atomic_dup_state_copies_fields),
> /* amdgpu_dm_fill_hdr_info_packet */
> KUNIT_CASE(dm_test_fill_hdr_null_metadata),
> KUNIT_CASE(dm_test_fill_hdr_zeroes_output),
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 66/75] drm/amdgpu: dm: Convert to atomic_create_state
2026-10-19 16:38 ` Leo Li
@ 2026-10-20 13:08 ` Maxime Ripard
2026-10-20 16:11 ` Leo Li
0 siblings, 1 reply; 11+ messages in thread
From: Maxime Ripard @ 2026-10-20 13:08 UTC (permalink / raw)
To: Leo Li
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel, Christian König, Alex Deucher, Harry Wentland,
Rodrigo Siqueira, amd-gfx
[-- Attachment #1: Type: text/plain, Size: 2336 bytes --]
Hi Leo,
Thanks for reviewing this
On Mon, Oct 19, 2026 at 12:38:47PM -0400, Leo Li wrote:
> > @@ -736,11 +736,11 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
> >
> > /*
> > * Initialize connector state before adding the connectror to drm and
> > * framebuffer lists
> > */
> > - amdgpu_dm_connector_funcs_reset(connector);
>
> I'm actually not sure why there was a state reset here.
> amdgpu_dm_connector_init_helper() is called earlier in this func and
> that already did a reset.
Yeah, it's something sashiko flagged too and I removed that call (and
updated the comment).
> > + connector->state = amdgpu_dm_connector_atomic_create_state(connector);
>
> That asside, looks like this can overwrite the alloc'd state from
> init_helper() without freeing. So to keep the previous behavior and
> avoid regressing, perhaps we can do this:
>
> conn_state = amdgpu_dm_connector_atomic_create_state(connector);
> if (!IS_ERR(conn_state)) {
> if (connector->state)
> connector->funcs->atomic_destroy_state(connector, connector->state);
> connector->state = conn_state;
> }
If we are to handle errors properly and remain equivalent, then
something like the following would be more accurate I guess?
if (connector->state) {
connector->funcs->atomic_destroy_state(connector, connector->state);
connector->state = NULL;
}
conn_state = amdgpu_dm_connector_atomic_create_state(connector);
if (IS_ERR(conn_state))
return NULL;
connector->state = conn_state;
Would you prefer that, or should I remove the call to create_state
entirely because it's redundant?
> > /*
> > * Some of the properties below require access to state, like bpc.
> > * Allocate some default initial connector state with our reset helper.
> > */
> > - if (wbcon->base.base.funcs->reset)
> > - wbcon->base.base.funcs->reset(&wbcon->base.base);
> > + if (!wbcon->base.base.state &&
> > + wbcon->base.base.funcs->atomic_create_state) {
> > + struct drm_connector_state *conn_state;
> > +
> > + conn_state = amdgpu_dm_connector_atomic_create_state(&wbcon->base.base);
>
> Nit: functionally the same, but would
> `wbcon->base.base.funcs->atomic_create_state(&wbcon->base.base);` be
> clearer?
Totally, I'll fix it
Thanks!
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 273 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 66/75] drm/amdgpu: dm: Convert to atomic_create_state
2026-10-20 13:08 ` Maxime Ripard
@ 2026-10-20 16:11 ` Leo Li
0 siblings, 0 replies; 11+ messages in thread
From: Leo Li @ 2026-10-20 16:11 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel, Christian König, Alex Deucher, Harry Wentland,
Rodrigo Siqueira, amd-gfx
On 2026-10-20 09:08, Maxime Ripard wrote:
> Hi Leo,
>
> Thanks for reviewing this
Hi Maxime,
Thanks for cleaning up all the drivers, are these all part of the
DRM_MODE_ATOMIC_RESET effort?
>
> On Mon, Oct 19, 2026 at 12:38:47PM -0400, Leo Li wrote:
>>> @@ -736,11 +736,11 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
>>>
>>> /*
>>> * Initialize connector state before adding the connectror to drm and
>>> * framebuffer lists
>>> */
>>> - amdgpu_dm_connector_funcs_reset(connector);
>>
>> I'm actually not sure why there was a state reset here.
>> amdgpu_dm_connector_init_helper() is called earlier in this func and
>> that already did a reset.
>
> Yeah, it's something sashiko flagged too and I removed that call (and
> updated the comment).
>
>>> + connector->state = amdgpu_dm_connector_atomic_create_state(connector);
>>
>> That asside, looks like this can overwrite the alloc'd state from
>> init_helper() without freeing. So to keep the previous behavior and
>> avoid regressing, perhaps we can do this:
>>
>> conn_state = amdgpu_dm_connector_atomic_create_state(connector);
>> if (!IS_ERR(conn_state)) {
>> if (connector->state)
>> connector->funcs->atomic_destroy_state(connector, connector->state);
>> connector->state = conn_state;
>> }
>
> If we are to handle errors properly and remain equivalent, then
> something like the following would be more accurate I guess?
>
> if (connector->state) {
> connector->funcs->atomic_destroy_state(connector, connector->state);
> connector->state = NULL;
> }
>
> conn_state = amdgpu_dm_connector_atomic_create_state(connector);
> if (IS_ERR(conn_state))
> return NULL;
>
> connector->state = conn_state;
>
> Would you prefer that, or should I remove the call to create_state
> entirely because it's redundant?
My preference would be to copy existing behavior, and keep the scope of this
series to just dropping the reset hook. Dropping the redundant create_state and
handling associated testing/regressions can be a followup.
In my parsing of the old reset behavior, we don't return a NULL connector on
error. Rather, we keep the existing connector->state and return the connector as
is. The rest of reset() only runs if state was alloc'd successfully. My previous
snippet should copy this.
Thanks,
Leo
>
>>> /*
>>> * Some of the properties below require access to state, like bpc.
>>> * Allocate some default initial connector state with our reset helper.
>>> */
>>> - if (wbcon->base.base.funcs->reset)
>>> - wbcon->base.base.funcs->reset(&wbcon->base.base);
>>> + if (!wbcon->base.base.state &&
>>> + wbcon->base.base.funcs->atomic_create_state) {
>>> + struct drm_connector_state *conn_state;
>>> +
>>> + conn_state = amdgpu_dm_connector_atomic_create_state(&wbcon->base.base);
>>
>> Nit: functionally the same, but would
>> `wbcon->base.base.funcs->atomic_create_state(&wbcon->base.base);` be
>> clearer?
>
> Totally, I'll fix it
> Thanks!
> Maxime
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-10-20 16:12 UTC | newest]
Thread overview: 11+ 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:26 ` [PATCH 03/75] drm/amdgpu: vkms: Switch to drm_atomic_helper_connector_create_state Maxime Ripard
2026-10-14 17:26 ` [PATCH 04/75] drm/amdgpu: dm: " Maxime Ripard
2026-10-16 16:41 ` Leo Li
2026-10-14 17:27 ` [PATCH 66/75] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
2026-10-19 16:38 ` Leo Li
2026-10-20 13:08 ` Maxime Ripard
2026-10-20 16:11 ` Leo Li
2026-10-16 15:06 ` (subset) [PATCH 00/75] drm/connector: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
2026-10-16 15:12 ` Maxime Ripard
2026-10-19 15:15 ` Maxime Ripard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox