drm/i915/dp_mst: Add the MST topology state for modesetted CRTCs
authorjsg <jsg@openbsd.org>
Mon, 27 Mar 2023 07:41:58 +0000 (07:41 +0000)
committerjsg <jsg@openbsd.org>
Mon, 27 Mar 2023 07:41:58 +0000 (07:41 +0000)
From Imre Deak
fb5f2b42650f60a06cfe794e40810c22083c171a in linux-6.1.y/6.1.18
326b1e792ff08b4d8ecb9605aec98e4e5feef56e in mainline linux

sys/dev/pci/drm/i915/display/intel_display.c
sys/dev/pci/drm/i915/display/intel_dp_mst.c
sys/dev/pci/drm/i915/display/intel_dp_mst.h

index e546982..7acf769 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 03604a3..27c2098 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 f7301de..f1815bb 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__ */