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 <[email protected]>
> ---
> 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    |  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),
> 

Reply via email to