return bpp;
 }
 
+static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
+                                      struct drm_display_mode *m2)
+{
+       bool bres = false;
+
+       if (m1 && m2)
+               bres = (m1->hdisplay == m2->hdisplay &&
+                       m1->hsync_start == m2->hsync_start &&
+                       m1->hsync_end == m2->hsync_end &&
+                       m1->htotal == m2->htotal &&
+                       m1->vdisplay == m2->vdisplay &&
+                       m1->vsync_start == m2->vsync_start &&
+                       m1->vsync_end == m2->vsync_end &&
+                       m1->vtotal == m2->vtotal);
+       return bres;
+}
+
 bool
 intel_dp_compute_config(struct intel_encoder *encoder,
                        struct intel_crtc_state *pipe_config,
                pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
 
        if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
-               intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
-                                      adjusted_mode);
+               struct drm_display_mode *panel_mode =
+                       intel_connector->panel.alt_fixed_mode;
+               struct drm_display_mode *req_mode = &pipe_config->base.mode;
+
+               if (!intel_edp_compare_alt_mode(req_mode, panel_mode))
+                       panel_mode = intel_connector->panel.fixed_mode;
+
+               drm_mode_debug_printmodeline(panel_mode);
+
+               intel_fixed_panel_mode(panel_mode, adjusted_mode);
 
                if (INTEL_GEN(dev_priv) >= 9) {
                        int ret;
        struct drm_device *dev = intel_encoder->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct drm_display_mode *fixed_mode = NULL;
+       struct drm_display_mode *alt_fixed_mode = NULL;
        struct drm_display_mode *downclock_mode = NULL;
        bool has_dpcd;
        struct drm_display_mode *scan;
        }
        intel_connector->edid = edid;
 
-       /* prefer fixed mode from EDID if available */
+       /* prefer fixed mode from EDID if available, save an alt mode also */
        list_for_each_entry(scan, &connector->probed_modes, head) {
                if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
                        fixed_mode = drm_mode_duplicate(dev, scan);
                        downclock_mode = intel_dp_drrs_init(
                                                intel_connector, fixed_mode);
-                       break;
+               } else if (!alt_fixed_mode) {
+                       alt_fixed_mode = drm_mode_duplicate(dev, scan);
                }
        }
 
                              pipe_name(pipe));
        }
 
-       intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
+       intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode,
+                        downclock_mode);
        intel_connector->panel.backlight.power = intel_edp_backlight_power;
        intel_panel_setup_backlight(connector, pipe);
 
 
 
 struct intel_panel {
        struct drm_display_mode *fixed_mode;
+       struct drm_display_mode *alt_fixed_mode;
        struct drm_display_mode *downclock_mode;
 
        /* backlight */
 /* intel_panel.c */
 int intel_panel_init(struct intel_panel *panel,
                     struct drm_display_mode *fixed_mode,
+                    struct drm_display_mode *alt_fixed_mode,
                     struct drm_display_mode *downclock_mode);
 void intel_panel_fini(struct intel_panel *panel);
 void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
 
 
 int intel_panel_init(struct intel_panel *panel,
                     struct drm_display_mode *fixed_mode,
+                    struct drm_display_mode *alt_fixed_mode,
                     struct drm_display_mode *downclock_mode)
 {
        intel_panel_init_backlight_funcs(panel);
 
        panel->fixed_mode = fixed_mode;
+       panel->alt_fixed_mode = alt_fixed_mode;
        panel->downclock_mode = downclock_mode;
 
        return 0;
        if (panel->fixed_mode)
                drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
 
+       if (panel->alt_fixed_mode)
+               drm_mode_destroy(intel_connector->base.dev,
+                               panel->alt_fixed_mode);
+
        if (panel->downclock_mode)
                drm_mode_destroy(intel_connector->base.dev,
                                panel->downclock_mode);