OSDN Git Service

drm/amd/display: pull commit_surfaces out of atomic_commit into helper function
authorHarry Wentland <harry.wentland@amd.com>
Thu, 6 Apr 2017 20:22:33 +0000 (16:22 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 26 Sep 2017 21:24:13 +0000 (17:24 -0400)
This should make things simpler when we try to rework this later when we
pass validate_context from atomic_check to atomic_commit.

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c

index 57560a8..d8718e2 100644 (file)
@@ -2350,6 +2350,67 @@ static void amdgpu_dm_do_flip(
                                                 acrtc->crtc_id);
 }
 
+void dc_commit_surfaces(struct drm_atomic_state *state,
+       struct drm_device *dev, struct amdgpu_display_manager *dm)
+{
+       uint32_t i;
+       struct drm_plane *plane;
+       struct drm_plane_state *old_plane_state;
+
+       /* update planes when needed */
+       for_each_plane_in_state(state, plane, old_plane_state, i) {
+               struct drm_plane_state *plane_state = plane->state;
+               struct drm_crtc *crtc = plane_state->crtc;
+               struct drm_framebuffer *fb = plane_state->fb;
+               struct drm_connector *connector;
+               struct dm_connector_state *dm_state = NULL;
+               enum dm_commit_action action;
+               bool pflip_needed;
+
+               if (!fb || !crtc || !crtc->state->active)
+                       continue;
+
+               action = get_dm_commit_action(crtc->state);
+
+               /* Surfaces are created under two scenarios:
+                * 1. This commit is not a page flip.
+                * 2. This commit is a page flip, and streams are created.
+                */
+               pflip_needed = !state->allow_modeset;
+               if (!pflip_needed || action == DM_COMMIT_ACTION_DPMS_ON
+                               || action == DM_COMMIT_ACTION_SET) {
+                       list_for_each_entry(connector,
+                                           &dev->mode_config.connector_list,
+                                           head) {
+                               if (connector->state->crtc == crtc) {
+                                       dm_state = to_dm_connector_state(
+                                                       connector->state);
+                                       break;
+                               }
+                       }
+
+                       /*
+                        * This situation happens in the following case:
+                        * we are about to get set mode for connector who's only
+                        * possible crtc (in encoder crtc mask) is used by
+                        * another connector, that is why it will try to
+                        * re-assing crtcs in order to make configuration
+                        * supported. For our implementation we need to make all
+                        * encoders support all crtcs, then this issue will
+                        * never arise again. But to guard code from this issue
+                        * check is left.
+                        *
+                        * Also it should be needed when used with actual
+                        * drm_atomic_commit ioctl in future
+                        */
+                       if (!dm_state)
+                               continue;
+
+                       dm_dc_surface_commit(dm->dc, crtc);
+               }
+       }
+}
+
 void amdgpu_dm_atomic_commit_tail(
        struct drm_atomic_state *state)
 {
@@ -2521,57 +2582,7 @@ void amdgpu_dm_atomic_commit_tail(
        }
 
        /* update planes when needed */
-       for_each_plane_in_state(state, plane, old_plane_state, i) {
-               struct drm_plane_state *plane_state = plane->state;
-               struct drm_crtc *crtc = plane_state->crtc;
-               struct drm_framebuffer *fb = plane_state->fb;
-               struct drm_connector *connector;
-               struct dm_connector_state *dm_state = NULL;
-               enum dm_commit_action action;
-               bool pflip_needed;
-
-               if (!fb || !crtc || !crtc->state->active)
-                       continue;
-
-               action = get_dm_commit_action(crtc->state);
-
-               /* Surfaces are created under two scenarios:
-                * 1. This commit is not a page flip.
-                * 2. This commit is a page flip, and streams are created.
-                */
-               pflip_needed = !state->allow_modeset;
-               if (!pflip_needed ||
-                    action == DM_COMMIT_ACTION_DPMS_ON ||
-                    action == DM_COMMIT_ACTION_SET) {
-                       list_for_each_entry(connector,
-                               &dev->mode_config.connector_list, head) {
-                               if (connector->state->crtc == crtc) {
-                                       dm_state = to_dm_connector_state(
-                                               connector->state);
-                                       break;
-                               }
-                       }
-
-                       /*
-                        * This situation happens in the following case:
-                        * we are about to get set mode for connector who's only
-                        * possible crtc (in encoder crtc mask) is used by
-                        * another connector, that is why it will try to
-                        * re-assing crtcs in order to make configuration
-                        * supported. For our implementation we need to make all
-                        * encoders support all crtcs, then this issue will
-                        * never arise again. But to guard code from this issue
-                        * check is left.
-                        *
-                        * Also it should be needed when used with actual
-                        * drm_atomic_commit ioctl in future
-                        */
-                       if (!dm_state)
-                               continue;
-
-                       dm_dc_surface_commit(dm->dc, crtc);
-               }
-       }
+       dc_commit_surfaces(state, dev, dm);
 
        for (i = 0; i < new_crtcs_count; i++) {
                /*