Pass the supported link rates explicitly to intel_dp_link_caps_update().
This prepares for tracking these capabilities internally within the
link caps module.

Signed-off-by: Imre Deak <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dp.c       | 28 ++++---------------
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 28 +++++++++++++++----
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++-
 3 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 635e3ede0d41e..d2b9b6fce2b32 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -698,36 +698,20 @@ static void intel_dp_get_common_rates(struct intel_dp 
*intel_dp,
        }
 }
 
-static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
-{
-       int num_old_common_rates = intel_dp->num_common_rates;
-       int old_common_rates[DP_MAX_SUPPORTED_RATES];
-
-       /* TODO: Add a struct containing both rates and number of rates. */
-       static_assert(__same_type(old_common_rates[0], 
intel_dp->common_rates[0]) &&
-                     sizeof(old_common_rates) == 
sizeof(intel_dp->common_rates));
-       memcpy(old_common_rates, intel_dp->common_rates,
-              num_old_common_rates * sizeof(old_common_rates[0]));
-
-       intel_dp_get_common_rates(intel_dp, intel_dp->common_rates, 
&intel_dp->num_common_rates);
-
-       return num_old_common_rates != intel_dp->num_common_rates ||
-              memcmp(old_common_rates, intel_dp->common_rates,
-                     num_old_common_rates * sizeof(old_common_rates[0]));
-}
-
 /* Return %true if any common link param changed. */
 static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
 {
+       int num_common_rates;
+       int common_rates[DP_MAX_SUPPORTED_RATES];
        bool params_changed = false;
 
-       if (intel_dp_set_common_rates(intel_dp))
-               params_changed = true;
-
        if (intel_dp_set_max_common_lane_count(intel_dp))
                params_changed = true;
 
-       intel_dp_link_caps_update(intel_dp);
+       intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
+       if (intel_dp_link_caps_update(intel_dp,
+                                     common_rates, num_common_rates))
+               params_changed = true;
 
        return params_changed;
 }
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 2074952931738..679d59cc256c9 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -8,6 +8,7 @@
 #include <linux/log2.h>
 #include <linux/slab.h>
 #include <linux/sort.h>
+#include <linux/string.h>
 #include <linux/types.h>
 
 #include <drm/drm_print.h>
@@ -131,25 +132,39 @@ static int link_config_cmp_by_bw(const void *a, const 
void *b, const void *p)
               intel_dp_link_config_rate(intel_dp, lc_b);
 }
 
-void intel_dp_link_caps_update(struct intel_dp *intel_dp)
+/* Return %true if the supported link parameters have changed. */
+bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
+                              const int *rates, int num_rates)
 {
        struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
        struct intel_display *display = to_intel_display(intel_dp);
        struct intel_dp_link_config_entry *lc;
+       bool link_params_changed = false;
        int num_common_lane_configs;
        int i;
        int j;
 
        if (drm_WARN_ON(display->drm, 
!is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
-               return;
+               return false;
+
+       if (drm_WARN_ON(display->drm, num_rates > 
ARRAY_SIZE(intel_dp->common_rates)))
+               return false;
 
        num_common_lane_configs = 
ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
 
-       if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * 
num_common_lane_configs >
+       if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
                                    ARRAY_SIZE(link_caps->configs)))
-               return;
+               return false;
 
-       link_caps->num_configs = intel_dp->num_common_rates * 
num_common_lane_configs;
+       /* TODO: Add a struct containing both rates and number of rates. */
+       static_assert(__same_type(rates[0], intel_dp->common_rates[0]));
+       if (num_rates != intel_dp->num_common_rates ||
+           memcmp(rates, intel_dp->common_rates, num_rates * sizeof(rates[0])))
+               link_params_changed = true;
+
+       memcpy(intel_dp->common_rates, rates, num_rates * sizeof(rates[0]));
+       intel_dp->num_common_rates = num_rates;
+       link_caps->num_configs = num_rates * num_common_lane_configs;
 
        lc = &link_caps->configs[0];
        for (i = 0; i < intel_dp->num_common_rates; i++) {
@@ -165,6 +180,9 @@ void intel_dp_link_caps_update(struct intel_dp *intel_dp)
               sizeof(link_caps->configs[0]),
               link_config_cmp_by_bw, NULL,
               intel_dp);
+
+       /* TODO: Also detect a change in the max lane count. */
+       return link_params_changed;
 }
 
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int 
*link_rate, int *lane_count)
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 aed2122a05d24..09e580bc5c9b3 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -4,6 +4,8 @@
 #ifndef __INTEL_DP_LINK_CAPS_H__
 #define __INTEL_DP_LINK_CAPS_H__
 
+#include <linux/types.h>
+
 struct intel_connector;
 struct intel_dp;
 struct intel_dp_link_caps;
@@ -20,7 +22,8 @@ void intel_dp_link_caps_get_forced_params(struct 
intel_dp_link_caps *link_caps,
 int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int 
lane_count);
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int 
*link_rate, int *lane_count);
 
-void intel_dp_link_caps_update(struct intel_dp *intel_dp);
+bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
+                              const int *rates, int num_rates);
 
 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
 
-- 
2.49.1

Reply via email to