drm/amd/display: Add wrapper to call planes and stream update
authorRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Thu, 23 Feb 2023 18:36:08 +0000 (11:36 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Jun 2023 09:12:16 +0000 (11:12 +0200)
[ Upstream commit 81f743a08f3b214638aa389e252ae5e6c3592e7c ]

[Why & How]
This commit is part of a sequence of changes that replaces the commit
sequence used in the DC with a new one. As a result of this transition,
we moved some specific parts from the commit sequence and brought them
to amdgpu_dm. This commit adds a wrapper inside DM that enable our
drivers to do any necessary preparation or change before we offload the
plane/stream update to DC.

Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Stable-dep-of: ea2062dd1f03 ("drm/amd/display: fix the system hang while disable PSR")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index a7bc575..91f074f 100644 (file)
@@ -349,6 +349,35 @@ static inline bool is_dc_timing_adjust_needed(struct dm_crtc_state *old_state,
 }
 
 /**
+ * update_planes_and_stream_adapter() - Send planes to be updated in DC
+ *
+ * DC has a generic way to update planes and stream via
+ * dc_update_planes_and_stream function; however, DM might need some
+ * adjustments and preparation before calling it. This function is a wrapper
+ * for the dc_update_planes_and_stream that does any required configuration
+ * before passing control to DC.
+ */
+static inline bool update_planes_and_stream_adapter(struct dc *dc,
+                                                   int update_type,
+                                                   int planes_count,
+                                                   struct dc_stream_state *stream,
+                                                   struct dc_stream_update *stream_update,
+                                                   struct dc_surface_update *array_of_surface_update)
+{
+       /*
+        * Previous frame finished and HW is ready for optimization.
+        */
+       if (update_type == UPDATE_TYPE_FAST)
+               dc_post_update_surfaces_to_stream(dc);
+
+       return dc_update_planes_and_stream(dc,
+                                          array_of_surface_update,
+                                          planes_count,
+                                          stream,
+                                          stream_update);
+}
+
+/**
  * dm_pflip_high_irq() - Handle pageflip interrupt
  * @interrupt_params: ignored
  *
@@ -2633,11 +2662,12 @@ static void dm_gpureset_commit_state(struct dc_state *dc_state,
                                true;
                }
 
-               dc_update_planes_and_stream(dm->dc,
-                       bundle->surface_updates,
-                       dc_state->stream_status->plane_count,
-                       dc_state->streams[k],
-                       &bundle->stream_update);
+               update_planes_and_stream_adapter(dm->dc,
+                                        UPDATE_TYPE_FULL,
+                                        dc_state->stream_status->plane_count,
+                                        dc_state->streams[k],
+                                        &bundle->stream_update,
+                                        bundle->surface_updates);
        }
 
 cleanup:
@@ -7889,11 +7919,12 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
                                acrtc_state->stream->link->psr_settings.psr_allow_active)
                        amdgpu_dm_psr_disable(acrtc_state->stream);
 
-               dc_update_planes_and_stream(dm->dc,
-                                           bundle->surface_updates,
-                                           planes_count,
-                                           acrtc_state->stream,
-                                           &bundle->stream_update);
+               update_planes_and_stream_adapter(dm->dc,
+                                        acrtc_state->update_type,
+                                        planes_count,
+                                        acrtc_state->stream,
+                                        &bundle->stream_update,
+                                        bundle->surface_updates);
 
                /**
                 * Enable or disable the interrupts on the backend.