drm/i915: Add intel_panel_highest_mode()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 7 Sep 2022 09:10:54 +0000 (12:10 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 8 Sep 2022 11:21:46 +0000 (14:21 +0300)
Add a function to get the fixed_mode with the highest clock.
The plan is to use this for the link bw calculation on seamless
DRRS panels so that we alwasy end up with the same link params
regardless of the requested refresh rate. This will allow fastset
to do seamless refresh rate changes based on userspace request
instead of having to go for a full modeset.

TODO: the function name isn't great

Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220907091057.11572-15-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_panel.c
drivers/gpu/drm/i915/display/intel_panel.h

index d27a220def0024d9c12c62b515ba27454e23b767..a3a3f9fe4342f476e35dda69bc0eefdce1409cfd 100644 (file)
@@ -114,6 +114,21 @@ intel_panel_downclock_mode(struct intel_connector *connector,
        return best_mode;
 }
 
+const struct drm_display_mode *
+intel_panel_highest_mode(struct intel_connector *connector,
+                        const struct drm_display_mode *adjusted_mode)
+{
+       const struct drm_display_mode *fixed_mode, *best_mode = adjusted_mode;
+
+       /* pick the fixed_mode that has the highest clock */
+       list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) {
+               if (fixed_mode->clock > best_mode->clock)
+                       best_mode = fixed_mode;
+       }
+
+       return best_mode;
+}
+
 int intel_panel_get_modes(struct intel_connector *connector)
 {
        const struct drm_display_mode *fixed_mode;
index b087c0c3cc6db54610f2241f50c5896ed34e6986..eff3ffd3d08255af6b29660038395fd5437e015e 100644 (file)
@@ -31,6 +31,9 @@ intel_panel_fixed_mode(struct intel_connector *connector,
 const struct drm_display_mode *
 intel_panel_downclock_mode(struct intel_connector *connector,
                           const struct drm_display_mode *adjusted_mode);
+const struct drm_display_mode *
+intel_panel_highest_mode(struct intel_connector *connector,
+                        const struct drm_display_mode *adjusted_mode);
 int intel_panel_get_modes(struct intel_connector *connector);
 enum drrs_type intel_panel_drrs_type(struct intel_connector *connector);
 enum drm_mode_status