On 2026-10-22 08:31, 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 <[email protected]>
Reviewed-by: Leo Li <[email protected]>
Thanks!
> ---
> Cc: "Christian König" <[email protected]>
> Cc: Alex Deucher <[email protected]>
> Cc: Harry Wentland <[email protected]>
> Cc: Leo Li <[email protected]>
> Cc: Rodrigo Siqueira <[email protected]>
> Cc: [email protected]
> ---
> .../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 | 11 ++-
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 17 +++-
> .../amdgpu_dm/tests/amdgpu_dm_connector_test.c | 90
> ++++++++++++++--------
> 5 files changed, 101 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..e59595b5e39b 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
> @@ -1942,20 +1942,14 @@ STATIC_IFN_KUNIT void
> amdgpu_dm_connector_destroy(struct drm_connector *connecto
> 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;
> @@ -1973,6 +1967,8 @@ void amdgpu_dm_connector_funcs_reset(struct
> drm_connector *connector)
> 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 *
> @@ -2073,8 +2069,8 @@ EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_force);
>
> static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
> - .reset = amdgpu_dm_connector_funcs_reset,
> .detect = amdgpu_dm_connector_detect,
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = amdgpu_dm_connector_destroy,
> + .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,
> @@ -3200,6 +3196,14 @@ void amdgpu_dm_connector_init_helper(struct
> amdgpu_display_manager *dm,
> * 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;
> 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
> @@ -51,5 +51,6 @@ 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 *
> 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..e28fbd1b6790 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
> @@ -259,5 +259,5 @@ 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,
> @@ -672,4 +672,5 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr
> *mgr,
> struct amdgpu_device *adev = drm_to_adev(dev);
> struct amdgpu_dm_connector *aconnector;
> + struct drm_connector_state *conn_state;
> struct drm_connector *connector;
> int i;
> @@ -739,5 +740,11 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr
> *mgr,
> * framebuffer lists
> */
> - amdgpu_dm_connector_funcs_reset(connector);
> + 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);
> 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..39b7b3e49f6b 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
> @@ -226,5 +226,5 @@ 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,
> @@ -241,4 +241,5 @@ int amdgpu_dm_wb_connector_init(struct
> amdgpu_display_manager *dm,
> uint32_t link_index)
> {
> + struct drm_connector *connector;
> struct dc *dc = dm->dc;
> struct dc_link *link = dc_get_link_at_index(dc, link_index);
> @@ -262,6 +263,16 @@ int amdgpu_dm_wb_connector_init(struct
> amdgpu_display_manager *dm,
> * Allocate some default initial connector state with our reset helper.
> */
> - if (wbcon->base.base.funcs->reset)
> - wbcon->base.base.funcs->reset(&wbcon->base.base);
> + connector = &wbcon->base.base;
> + if (connector->funcs->atomic_create_state) {
> + struct drm_connector_state *conn_state;
> +
> + 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;
> + }
> + }
>
> return 0;
> 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
> @@ -1469,8 +1469,8 @@ static void
> dm_test_decide_crtc_timing_no_crtc_clock(struct kunit *test)
> }
>
> -/* 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,
> @@ -1478,8 +1478,8 @@ static const struct drm_connector_funcs
> dm_test_connector_funcs = {
>
> /**
> - * 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;
> @@ -1502,7 +1502,7 @@ static void dm_test_funcs_reset_sets_defaults(struct
> kunit *test)
> 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);
> @@ -1516,8 +1516,8 @@ static void dm_test_funcs_reset_sets_defaults(struct
> kunit *test)
>
> /**
> - * 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;
> @@ -1543,7 +1543,8 @@ static void dm_test_funcs_reset_edp_abm_level(struct
> kunit *test)
> /* 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);
> @@ -1553,9 +1554,9 @@ static void dm_test_funcs_reset_edp_abm_level(struct
> kunit *test)
>
> /**
> - * 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;
> @@ -1581,7 +1582,8 @@ static void dm_test_funcs_reset_edp_abm_disabled(struct
> kunit *test)
> /* 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,
> @@ -1621,6 +1623,6 @@ static void
> dm_test_atomic_dup_state_copies_fields(struct kunit *test)
> 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 */
> @@ -4887,5 +4889,5 @@ static struct dm_test_destroy_ctx
> *dm_test_destroy_ctx_alloc(struct kunit *test)
> */
> 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,
> @@ -6254,4 +6256,5 @@ 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,
> @@ -6259,6 +6262,9 @@ static void dm_test_restore_state_no_encoder(struct
> kunit *test)
> 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. */
>
> @@ -6278,4 +6284,5 @@ 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;
> @@ -6287,5 +6294,9 @@ static void dm_test_restore_state_no_stream(struct
> kunit *test)
> 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);
> @@ -6316,4 +6327,5 @@ 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;
> @@ -6326,5 +6338,9 @@ static void dm_test_restore_state_same_sink(struct
> kunit *test)
> 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);
> @@ -7033,4 +7049,5 @@ 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;
>
> @@ -7045,6 +7062,8 @@ static void
> dm_test_mode_valid_force_on_no_stream(struct kunit *test)
> * 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;
>
> @@ -7560,4 +7579,5 @@ static void
> dm_test_update_after_detect_disconnect(struct kunit *test)
> 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);
> @@ -7571,6 +7591,8 @@ static void
> dm_test_update_after_detect_disconnect(struct kunit *test)
> 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;
> @@ -9200,4 +9222,5 @@ 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;
> @@ -9225,6 +9248,9 @@ dm_test_fs_caps_ctx_alloc(struct kunit *test, enum
> signal_type sink_signal)
> &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);
> @@ -9631,5 +9657,5 @@ dm_test_force_dup_state_fail(struct drm_connector
> *connector)
>
> 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,
> @@ -9848,8 +9874,8 @@ static struct kunit_case amdgpu_dm_connector_tests[] = {
> 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),
>