]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/display/dp_mst: Don't open code modeset checks for releasing time slots
authorLyude Paul <lyude@redhat.com>
Wed, 17 Aug 2022 19:38:38 +0000 (15:38 -0400)
committerLyude Paul <lyude@redhat.com>
Tue, 23 Aug 2022 20:53:38 +0000 (16:53 -0400)
I'm not sure why, but at the time I originally wrote the find/release time
slot helpers I thought we should avoid keeping modeset tracking out of the
MST helpers. In retrospect though there's no actual good reason to do
this, and the logic has ended up being identical across all the drivers
using the helpers. Also, it needs to be fixed anyway so we don't break
things when going atomic-only with MST.

So, let's just move this code into drm_dp_atomic_release_time_slots() and
stop open coding it.

Signed-off-by: Lyude Paul <lyude@redhat.com>
Cc: Wayne Lin <Wayne.Lin@amd.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Fangzhi Zuo <Jerry.Zuo@amd.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Sean Paul <sean@poorly.run>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220817193847.557945-10-lyude@redhat.com
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
drivers/gpu/drm/display/drm_dp_mst_topology.c
drivers/gpu/drm/i915/display/intel_dp_mst.c
drivers/gpu/drm/nouveau/dispnv50/disp.c

index 655d63b20b334a74873289aacb7897b0b2015e80..7a0d6cfa77f5ac4f46ec6a39c92214d1521c2ac6 100644 (file)
@@ -447,34 +447,13 @@ dm_dp_mst_detect(struct drm_connector *connector,
 }
 
 static int dm_dp_mst_atomic_check(struct drm_connector *connector,
-                               struct drm_atomic_state *state)
+                                 struct drm_atomic_state *state)
 {
-       struct drm_connector_state *new_conn_state =
-                       drm_atomic_get_new_connector_state(state, connector);
-       struct drm_connector_state *old_conn_state =
-                       drm_atomic_get_old_connector_state(state, connector);
        struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
-       struct drm_crtc_state *new_crtc_state;
-       struct drm_dp_mst_topology_mgr *mst_mgr;
-       struct drm_dp_mst_port *mst_port;
+       struct drm_dp_mst_topology_mgr *mst_mgr = &aconnector->mst_port->mst_mgr;
+       struct drm_dp_mst_port *mst_port = aconnector->port;
 
-       mst_port = aconnector->port;
-       mst_mgr = &aconnector->mst_port->mst_mgr;
-
-       if (!old_conn_state->crtc)
-               return 0;
-
-       if (new_conn_state->crtc) {
-               new_crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
-               if (!new_crtc_state ||
-                   !drm_atomic_crtc_needs_modeset(new_crtc_state) ||
-                   new_crtc_state->enable)
-                       return 0;
-               }
-
-       return drm_dp_atomic_release_time_slots(state,
-                                               mst_mgr,
-                                               mst_port);
+       return drm_dp_atomic_release_time_slots(state, mst_mgr, mst_port);
 }
 
 static const struct drm_connector_helper_funcs dm_dp_mst_connector_helper_funcs = {
index d701e5b819b8c9d62f1402b71fc71bcf2d4d8b67..aa6dcd9ff6a5de76625f2f4477c410e8f70428de 100644 (file)
@@ -4473,14 +4473,29 @@ int drm_dp_atomic_release_time_slots(struct drm_atomic_state *state,
 {
        struct drm_dp_mst_topology_state *topology_state;
        struct drm_dp_mst_atomic_payload *payload;
-       struct drm_connector_state *conn_state;
+       struct drm_connector_state *old_conn_state, *new_conn_state;
+
+       old_conn_state = drm_atomic_get_old_connector_state(state, port->connector);
+       if (!old_conn_state->crtc)
+               return 0;
+
+       /* If the CRTC isn't disabled by this state, don't release it's payload */
+       new_conn_state = drm_atomic_get_new_connector_state(state, port->connector);
+       if (new_conn_state->crtc) {
+               struct drm_crtc_state *crtc_state =
+                       drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
+
+               if (!crtc_state ||
+                   !drm_atomic_crtc_needs_modeset(crtc_state) ||
+                   crtc_state->enable)
+                       return 0;
+       }
 
        topology_state = drm_atomic_get_mst_topology_state(state, mgr);
        if (IS_ERR(topology_state))
                return PTR_ERR(topology_state);
 
-       conn_state = drm_atomic_get_old_connector_state(state, port->connector);
-       topology_state->pending_crtc_mask |= drm_crtc_mask(conn_state->crtc);
+       topology_state->pending_crtc_mask |= drm_crtc_mask(old_conn_state->crtc);
 
        payload = drm_atomic_get_mst_payload_state(topology_state, port);
        if (WARN_ON(!payload)) {
index 1cebbc51d8fa1a38055698c8849ca94c58ac9475..1b067cd73261ca1b40f48c83639a99eb33a4b337 100644 (file)
@@ -308,13 +308,10 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
                          struct drm_atomic_state *_state)
 {
        struct intel_atomic_state *state = to_intel_atomic_state(_state);
-       struct drm_connector_state *new_conn_state =
-               drm_atomic_get_new_connector_state(&state->base, connector);
        struct drm_connector_state *old_conn_state =
                drm_atomic_get_old_connector_state(&state->base, connector);
        struct intel_connector *intel_connector =
                to_intel_connector(connector);
-       struct drm_crtc *new_crtc = new_conn_state->crtc;
        struct drm_dp_mst_topology_mgr *mgr;
        int ret;
 
@@ -326,27 +323,8 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
        if (ret)
                return ret;
 
-       if (!old_conn_state->crtc)
-               return 0;
-
-       /* We only want to free VCPI if this state disables the CRTC on this
-        * connector
-        */
-       if (new_crtc) {
-               struct intel_crtc *crtc = to_intel_crtc(new_crtc);
-               struct intel_crtc_state *crtc_state =
-                       intel_atomic_get_new_crtc_state(state, crtc);
-
-               if (!crtc_state ||
-                   !drm_atomic_crtc_needs_modeset(&crtc_state->uapi) ||
-                   crtc_state->uapi.enable)
-                       return 0;
-       }
-
        mgr = &enc_to_mst(to_intel_encoder(old_conn_state->best_encoder))->primary->dp.mst_mgr;
-       ret = drm_dp_atomic_release_time_slots(&state->base, mgr, intel_connector->port);
-
-       return ret;
+       return drm_dp_atomic_release_time_slots(&state->base, mgr, intel_connector->port);
 }
 
 static void clear_act_sent(struct intel_encoder *encoder,
index c55af5d78ea24b6d5eb8b34c763fcb4c181a3ca2..5669c8d747d7a746c30a02a6cfb4e5f6d82ebd2b 100644 (file)
@@ -1255,27 +1255,6 @@ nv50_mstc_atomic_check(struct drm_connector *connector,
 {
        struct nv50_mstc *mstc = nv50_mstc(connector);
        struct drm_dp_mst_topology_mgr *mgr = &mstc->mstm->mgr;
-       struct drm_connector_state *new_conn_state =
-               drm_atomic_get_new_connector_state(state, connector);
-       struct drm_connector_state *old_conn_state =
-               drm_atomic_get_old_connector_state(state, connector);
-       struct drm_crtc_state *crtc_state;
-       struct drm_crtc *new_crtc = new_conn_state->crtc;
-
-       if (!old_conn_state->crtc)
-               return 0;
-
-       /* We only want to free VCPI if this state disables the CRTC on this
-        * connector
-        */
-       if (new_crtc) {
-               crtc_state = drm_atomic_get_new_crtc_state(state, new_crtc);
-
-               if (!crtc_state ||
-                   !drm_atomic_crtc_needs_modeset(crtc_state) ||
-                   crtc_state->enable)
-                       return 0;
-       }
 
        return drm_dp_atomic_release_time_slots(state, mgr, mstc->port);
 }