return max_frl_rate;
 }
 
+static bool
+intel_dp_pcon_is_frl_trained(struct intel_dp *intel_dp,
+                            u8 max_frl_bw_mask, u8 *frl_trained_mask)
+{
+       if (drm_dp_pcon_hdmi_link_active(&intel_dp->aux) &&
+           drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, frl_trained_mask) == DP_PCON_HDMI_MODE_FRL &&
+           *frl_trained_mask >= max_frl_bw_mask)
+               return true;
+
+       return false;
+}
+
 static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)
 {
 #define TIMEOUT_FRL_READY_MS 500
        u8 max_frl_bw_mask = 0, frl_trained_mask;
        bool is_active;
 
-       ret = drm_dp_pcon_reset_frl_config(&intel_dp->aux);
-       if (ret < 0)
-               return ret;
-
        max_pcon_frl_bw = intel_dp->dfp.pcon_max_frl_bw;
        drm_dbg(&i915->drm, "PCON max rate = %d Gbps\n", max_pcon_frl_bw);
 
        if (max_frl_bw <= 0)
                return -EINVAL;
 
+       max_frl_bw_mask = intel_dp_pcon_set_frl_mask(max_frl_bw);
+       drm_dbg(&i915->drm, "MAX_FRL_BW_MASK = %u\n", max_frl_bw_mask);
+
+       if (intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask))
+               goto frl_trained;
+
        ret = drm_dp_pcon_frl_prepare(&intel_dp->aux, false);
        if (ret < 0)
                return ret;
        if (!is_active)
                return -ETIMEDOUT;
 
-       max_frl_bw_mask = intel_dp_pcon_set_frl_mask(max_frl_bw);
        ret = drm_dp_pcon_frl_configure_1(&intel_dp->aux, max_frl_bw,
                                          DP_PCON_ENABLE_SEQUENTIAL_LINK);
        if (ret < 0)
         * Wait for FRL to be completed
         * Check if the HDMI Link is up and active.
         */
-       wait_for(is_active = drm_dp_pcon_hdmi_link_active(&intel_dp->aux) == true, TIMEOUT_HDMI_LINK_ACTIVE_MS);
+       wait_for(is_active =
+                intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask),
+                TIMEOUT_HDMI_LINK_ACTIVE_MS);
 
        if (!is_active)
                return -ETIMEDOUT;
 
-       /* Verify HDMI Link configuration shows FRL Mode */
-       if (drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, &frl_trained_mask) !=
-           DP_PCON_HDMI_MODE_FRL) {
-               drm_dbg(&i915->drm, "HDMI couldn't be trained in FRL Mode\n");
-               return -EINVAL;
-       }
-       drm_dbg(&i915->drm, "MAX_FRL_MASK = %u, FRL_TRAINED_MASK = %u\n", max_frl_bw_mask, frl_trained_mask);
-
+frl_trained:
+       drm_dbg(&i915->drm, "FRL_TRAINED_MASK = %u\n", frl_trained_mask);
        intel_dp->frl.trained_rate_gbps = intel_dp_pcon_get_frl_mask(frl_trained_mask);
        intel_dp->frl.is_trained = true;
        drm_dbg(&i915->drm, "FRL trained with : %d Gbps\n", intel_dp->frl.trained_rate_gbps);