Add helper to select the link configuration iteration order for a
connector during state computation and fallback selection. This keeps
the connector-specific ordering policy in the link caps module.

v2: Add helper to get the order for fallback selection as well.

Signed-off-by: Imre Deak <[email protected]>
---
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 50 +++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 ++
 2 files changed, 55 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c 
b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index d46b9d505a847..36895dd9d6c81 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -160,6 +160,56 @@ static struct intel_dp_link_caps_order 
bw_desc_config_order(void)
        return order;
 }
 
+static enum intel_dp_link_caps_order_key
+connector_compute_order_key(bool is_mst)
+{
+       if (is_mst)
+               return INTEL_DP_LINK_CAPS_ORDER_KEY_BW;
+       else
+               return INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE;
+}
+
+static enum intel_dp_link_caps_order_key
+connector_fallback_order_key(bool is_mst)
+{
+       if (is_mst)
+               return INTEL_DP_LINK_CAPS_ORDER_KEY_BW;
+       else
+               return INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE;
+}
+
+static enum intel_dp_link_caps_order_direction
+connector_compute_order_dir(bool is_mst, bool use_max_params)
+{
+       if (is_mst || use_max_params)
+               return INTEL_DP_LINK_CAPS_ORDER_DIR_DESC;
+       else
+               return INTEL_DP_LINK_CAPS_ORDER_DIR_ASC;
+}
+
+struct intel_dp_link_caps_order
+intel_dp_link_caps_connector_compute_order(struct intel_connector *connector)
+{
+       struct intel_dp *intel_dp = intel_attached_dp(connector);
+       struct intel_dp_link_caps_order order = {
+               .key = connector_compute_order_key(connector->mst.dp),
+               .dir = connector_compute_order_dir(connector->mst.dp, 
intel_dp->use_max_params)
+       };
+
+       return order;
+}
+
+struct intel_dp_link_caps_order
+intel_dp_link_caps_connector_fallback_order(bool is_mst)
+{
+       struct intel_dp_link_caps_order order = {
+               .key = connector_fallback_order_key(is_mst),
+               .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
+       };
+
+       return order;
+}
+
 /* Get length of common rates array potentially limited by max_rate. */
 int intel_dp_common_len_rate_limit(struct intel_dp_link_caps *link_caps,
                                   int max_rate)
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h 
b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 5ea87f112c13a..79aca74ad9eee 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -113,6 +113,11 @@ void intel_dp_link_caps_iter_start(struct 
intel_dp_link_caps_iter *iter,
 
 void intel_dp_link_caps_iter_end(struct intel_dp_link_caps_iter *iter);
 
+struct intel_dp_link_caps_order
+intel_dp_link_caps_connector_compute_order(struct intel_connector *connector);
+struct intel_dp_link_caps_order
+intel_dp_link_caps_connector_fallback_order(bool is_mst);
+
 int intel_dp_common_len_rate_limit(struct intel_dp_link_caps *link_caps,
                                   int max_rate);
 int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int index);
-- 
2.49.1

Reply via email to