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),
> 

Reply via email to