]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/dp_mst: Add the MST topology state for modesetted CRTCs
authorImre Deak <imre.deak@intel.com>
Mon, 6 Feb 2023 11:48:53 +0000 (13:48 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 11 Mar 2023 12:55:43 +0000 (13:55 +0100)
commit 8c68b6a69f6b4e4399145b768fe55b28ba05aa11 upstream.

Add the MST topology for a CRTC to the atomic state if the driver
needs to force a modeset on the CRTC after the encoder compute config
functions are called.

Later the MST encoder's disable hook also adds the state, but that isn't
guaranteed to work (since in that hook getting the state may fail, which
can't be handled there). This should fix that, while a later patch fixes
the use of the MST state in the disable hook.

v2: Add missing forward struct declartions, caught by hdrtest.
v3: Factor out intel_dp_mst_add_topology_state_for_connector() used
    later in the patchset.

Cc: Lyude Paul <lyude@redhat.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: stable@vger.kernel.org # 6.1
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> # v2
Reviewed-by: Lyude Paul <lyude@redhat.com>
Acked-by: Lyude Paul <lyude@redhat.com>
Acked-by: Daniel Vetter <daniel@ffwll.ch>
Acked-by: Wayne Lin <wayne.lin@amd.com>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230206114856.2665066-1-imre.deak@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_dp_mst.c
drivers/gpu/drm/i915/display/intel_dp_mst.h

index de77054195c6812652e5cad596af6cd9f6e63f45..4bbb84847ecb7e096de3dd753aeb470743de5afd 100644 (file)
@@ -5969,6 +5969,10 @@ int intel_modeset_all_pipes(struct intel_atomic_state *state)
                if (ret)
                        return ret;
 
+               ret = intel_dp_mst_add_topology_state_for_crtc(state, crtc);
+               if (ret)
+                       return ret;
+
                ret = intel_atomic_add_affected_planes(state, crtc);
                if (ret)
                        return ret;
index 03604a37931c68c79e9ec2e776ae884efb8501f7..27c2098dd7070e0742d18a87f0ce0eea3b4708db 100644 (file)
@@ -1003,3 +1003,64 @@ bool intel_dp_mst_is_slave_trans(const struct intel_crtc_state *crtc_state)
        return crtc_state->mst_master_transcoder != INVALID_TRANSCODER &&
               crtc_state->mst_master_transcoder != crtc_state->cpu_transcoder;
 }
+
+/**
+ * intel_dp_mst_add_topology_state_for_connector - add MST topology state for a connector
+ * @state: atomic state
+ * @connector: connector to add the state for
+ * @crtc: the CRTC @connector is attached to
+ *
+ * Add the MST topology state for @connector to @state.
+ *
+ * Returns 0 on success, negative error code on failure.
+ */
+static int
+intel_dp_mst_add_topology_state_for_connector(struct intel_atomic_state *state,
+                                             struct intel_connector *connector,
+                                             struct intel_crtc *crtc)
+{
+       struct drm_dp_mst_topology_state *mst_state;
+
+       if (!connector->mst_port)
+               return 0;
+
+       mst_state = drm_atomic_get_mst_topology_state(&state->base,
+                                                     &connector->mst_port->mst_mgr);
+       if (IS_ERR(mst_state))
+               return PTR_ERR(mst_state);
+
+       mst_state->pending_crtc_mask |= drm_crtc_mask(&crtc->base);
+
+       return 0;
+}
+
+/**
+ * intel_dp_mst_add_topology_state_for_crtc - add MST topology state for a CRTC
+ * @state: atomic state
+ * @crtc: CRTC to add the state for
+ *
+ * Add the MST topology state for @crtc to @state.
+ *
+ * Returns 0 on success, negative error code on failure.
+ */
+int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
+                                            struct intel_crtc *crtc)
+{
+       struct drm_connector *_connector;
+       struct drm_connector_state *conn_state;
+       int i;
+
+       for_each_new_connector_in_state(&state->base, _connector, conn_state, i) {
+               struct intel_connector *connector = to_intel_connector(_connector);
+               int ret;
+
+               if (conn_state->crtc != &crtc->base)
+                       continue;
+
+               ret = intel_dp_mst_add_topology_state_for_connector(state, connector, crtc);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
index f7301de6cdfb37e6bfa470c45d2b750513dc69ca..f1815bb722672dd88d4a0df7b9e4e896a3d762da 100644 (file)
@@ -8,6 +8,8 @@
 
 #include <linux/types.h>
 
+struct intel_atomic_state;
+struct intel_crtc;
 struct intel_crtc_state;
 struct intel_digital_port;
 struct intel_dp;
@@ -18,5 +20,7 @@ int intel_dp_mst_encoder_active_links(struct intel_digital_port *dig_port);
 bool intel_dp_mst_is_master_trans(const struct intel_crtc_state *crtc_state);
 bool intel_dp_mst_is_slave_trans(const struct intel_crtc_state *crtc_state);
 bool intel_dp_mst_source_support(struct intel_dp *intel_dp);
+int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
+                                            struct intel_crtc *crtc);
 
 #endif /* __INTEL_DP_MST_H__ */