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 | 11 ++- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 17 +++- .../amdgpu_dm/tests/amdgpu_dm_connector_test.c | 102 ++++++++++++++------- 5 files changed, 113 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..8ebe37ec83bf 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,12 +1478,13 @@ 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; struct drm_device *drm; struct drm_connector *connector; + struct drm_connector_state *conn_state; struct dm_connector_state *dm_state; @@ -1502,7 +1503,9 @@ static void dm_test_funcs_reset_sets_defaults(struct kunit *test) DRM_MODE_CONNECTOR_DisplayPort, NULL); - amdgpu_dm_connector_funcs_reset(connector); + conn_state = amdgpu_dm_connector_atomic_create_state(connector); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + + connector->state = conn_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,12 +1519,13 @@ 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; struct drm_device *drm; struct drm_connector *connector; + struct drm_connector_state *conn_state; struct dm_connector_state *dm_state; int saved_abm_level = amdgpu_dm_get_abm_level_param(); @@ -1543,7 +1547,10 @@ 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); + conn_state = amdgpu_dm_connector_atomic_create_state(connector); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + + connector->state = conn_state; + dm_state = to_dm_connector_state(connector->state); KUNIT_EXPECT_EQ(test, (int)dm_state->abm_level, 3); @@ -1553,13 +1560,14 @@ 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; struct drm_device *drm; struct drm_connector *connector; + struct drm_connector_state *conn_state; struct dm_connector_state *dm_state; int saved_abm_level = amdgpu_dm_get_abm_level_param(); @@ -1581,7 +1589,10 @@ 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); + conn_state = amdgpu_dm_connector_atomic_create_state(connector); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + + connector->state = conn_state; + dm_state = to_dm_connector_state(connector->state); KUNIT_EXPECT_EQ(test, (int)dm_state->abm_level, @@ -1603,4 +1614,5 @@ static void dm_test_atomic_dup_state_copies_fields(struct kunit *test) struct drm_device *drm; struct drm_connector *connector; + struct drm_connector_state *conn_state; struct dm_connector_state *dm_state; struct dm_connector_state *new_dm_state; @@ -1621,6 +1633,8 @@ 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); + conn_state = amdgpu_dm_connector_atomic_create_state(connector); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + + connector->state = conn_state; /* Modify original state fields */ @@ -4887,5 +4901,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 +6268,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 +6274,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 +6296,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 +6306,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 +6339,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 +6350,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 +7061,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 +7074,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 +7591,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 +7603,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 +9234,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 +9260,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 +9669,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 +9886,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), -- 2.55.0
