The amdgpu display manager crtc implementation provides a custom reset
hook. However, this hook only allocates the state, initializes it with
__drm_atomic_helper_crtc_reset(), and frees the previous state. It
does not perform any hardware reset.

Since this is exactly what the atomic_create_state hook is meant to
do, minus the old state cleanup which the caller handles, convert the
implementation to use atomic_create_state with
__drm_atomic_helper_crtc_state_init() instead.

Reviewed-by: Thomas Zimmermann <[email protected]>
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]
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 28 ++++++++++++++--------
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h |  2 +-
 .../display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c  | 20 ++++++++--------
 3 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
index 62eac6e65334..cfe1fbfbab8e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
@@ -473,24 +473,23 @@ static void amdgpu_dm_crtc_destroy(struct drm_crtc *crtc)
 
        drm_crtc_cleanup(crtc);
        kfree(crtc);
 }
 
-STATIC_IFN_KUNIT void amdgpu_dm_crtc_reset_state(struct drm_crtc *crtc)
+STATIC_IFN_KUNIT struct drm_crtc_state *amdgpu_dm_crtc_create_state(struct 
drm_crtc *crtc)
 {
        struct dm_crtc_state *state;
 
        state = kzalloc_obj(*state);
        if (!state)
-               return;
+               return ERR_PTR(-ENOMEM);
 
-       if (crtc->state)
-               amdgpu_dm_crtc_destroy_state(crtc, crtc->state);
+       __drm_atomic_helper_crtc_state_init(&state->base, crtc);
 
-       __drm_atomic_helper_crtc_reset(crtc, &state->base);
+       return &state->base;
 }
-EXPORT_IF_KUNIT(amdgpu_dm_crtc_reset_state);
+EXPORT_IF_KUNIT(amdgpu_dm_crtc_create_state);
 
 #ifdef CONFIG_DEBUG_FS
 static int amdgpu_dm_crtc_late_register(struct drm_crtc *crtc)
 {
        crtc_debugfs_init(crtc);
@@ -563,11 +562,11 @@ amdgpu_dm_atomic_crtc_get_property(struct drm_crtc *crtc,
 }
 #endif
 
 /* Implemented only the options currently available for the driver */
 static const struct drm_crtc_funcs amdgpu_dm_crtc_funcs = {
-       .reset = amdgpu_dm_crtc_reset_state,
+       .atomic_create_state = amdgpu_dm_crtc_create_state,
        .destroy = amdgpu_dm_crtc_destroy,
        .set_config = drm_atomic_helper_set_config,
        .page_flip = drm_atomic_helper_page_flip,
        .atomic_duplicate_state = amdgpu_dm_crtc_duplicate_state,
        .atomic_destroy_state = amdgpu_dm_crtc_destroy_state,
@@ -779,13 +778,22 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
 
        amdgpu_dm_ism_init(&acrtc->ism, &default_ism_config);
 
        drm_crtc_helper_add(&acrtc->base, &amdgpu_dm_crtc_helper_funcs);
 
-       /* Create (reset) the plane state */
-       if (acrtc->base.funcs->reset)
-               acrtc->base.funcs->reset(&acrtc->base);
+       /* Create the plane state */
+       if (acrtc->base.funcs->atomic_create_state) {
+               struct drm_crtc_state *crtc_state;
+
+               crtc_state = 
acrtc->base.funcs->atomic_create_state(&acrtc->base);
+               if (IS_ERR(crtc_state)) {
+                       res = PTR_ERR(crtc_state);
+                       goto fail;
+               }
+
+               acrtc->base.state = crtc_state;
+       }
 
        acrtc->max_cursor_width = dm->adev->dm.dc->caps.max_cursor_size;
        acrtc->max_cursor_height = dm->adev->dm.dc->caps.max_cursor_size;
 
        acrtc->crtc_id = crtc_index;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
index 93c6d0d8d7fd..ad516aeb9798 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
@@ -47,11 +47,11 @@ bool amdgpu_dm_crtc_helper_mode_fixup(struct drm_crtc *crtc,
                                      const struct drm_display_mode *mode,
                                      struct drm_display_mode *adjusted_mode);
 void amdgpu_dm_crtc_destroy_state(struct drm_crtc *crtc,
                                  struct drm_crtc_state *state);
 struct drm_crtc_state *amdgpu_dm_crtc_duplicate_state(struct drm_crtc *crtc);
-void amdgpu_dm_crtc_reset_state(struct drm_crtc *crtc);
+struct drm_crtc_state *amdgpu_dm_crtc_create_state(struct drm_crtc *crtc);
 int amdgpu_dm_crtc_count_crtc_active_planes(struct drm_crtc_state 
*new_crtc_state);
 void amdgpu_dm_crtc_update_crtc_active_planes(struct drm_crtc *crtc,
                                              struct drm_crtc_state 
*new_crtc_state);
 void amdgpu_dm_crtc_vblank_control_worker(struct work_struct *work);
 void amdgpu_dm_idle_worker(struct work_struct *work);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
index 4dacddd23878..13deafdefdcc 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
@@ -1402,35 +1402,35 @@ static void 
dm_test_crtc_duplicate_state_copies_fields(struct kunit *test)
        KUNIT_EXPECT_TRUE(test, dm_dup->mpo_requested);
 
        amdgpu_dm_crtc_destroy_state(crtc, dup);
 }
 
-/* Tests for amdgpu_dm_crtc_reset_state() */
+/* Tests for amdgpu_dm_crtc_create_state() */
 
 /**
- * dm_test_crtc_reset_state_allocates_state - Test reset installs a fresh state
+ * dm_test_crtc_create_state_allocates_state - Test reset installs a fresh 
state
  * @test: The KUnit test context
  *
  * Resetting a CRTC with no existing state must allocate and install a new
  * drm_crtc_state.
  */
-static void dm_test_crtc_reset_state_allocates_state(struct kunit *test)
+static void dm_test_crtc_create_state_allocates_state(struct kunit *test)
 {
        struct amdgpu_device *adev = dm_kunit_alloc_adev(test);
+       struct drm_crtc_state *crtc_state;
        struct drm_crtc *crtc;
 
        crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc);
        crtc->dev = &adev->ddev;
        crtc->state = NULL;
 
-       amdgpu_dm_crtc_reset_state(crtc);
+       crtc_state = amdgpu_dm_crtc_create_state(crtc);
+       KUNIT_EXPECT_NOT_ERR_OR_NULL(test, crtc_state);
 
-       KUNIT_EXPECT_NOT_NULL(test, crtc->state);
-
-       if (crtc->state)
-               amdgpu_dm_crtc_destroy_state(crtc, crtc->state);
+       if (!IS_ERR(crtc_state))
+               amdgpu_dm_crtc_destroy_state(crtc, crtc_state);
 }
 
 /* Tests for amdgpu_dm_crtc_destroy_state() */
 
 /**
@@ -1905,12 +1905,12 @@ static struct kunit_case amdgpu_dm_crtc_tests[] = {
        /* amdgpu_dm_crtc_count_crtc_active_planes */
        KUNIT_CASE(dm_test_count_crtc_active_planes_none),
        KUNIT_CASE(dm_test_count_crtc_active_planes_mixed),
        /* amdgpu_dm_crtc_duplicate_state */
        KUNIT_CASE(dm_test_crtc_duplicate_state_copies_fields),
-       /* amdgpu_dm_crtc_reset_state */
-       KUNIT_CASE(dm_test_crtc_reset_state_allocates_state),
+       /* amdgpu_dm_crtc_create_state */
+       KUNIT_CASE(dm_test_crtc_create_state_allocates_state),
        /* amdgpu_dm_crtc_destroy_state */
        KUNIT_CASE(dm_test_crtc_destroy_state_no_stream),
        KUNIT_CASE(dm_test_crtc_destroy_state_releases_stream),
        /* amdgpu_dm_crtc_handle_vblank */
        KUNIT_CASE(dm_test_crtc_handle_vblank_no_event),

-- 
2.55.0

Reply via email to