return true;
 
        /* Retrain if link not ok */
-       return !intel_dp_link_ok(intel_dp, link_status);
+       return !intel_dp_link_ok(intel_dp, link_status) &&
+               !intel_psr_link_ok(intel_dp);
 }
 
 bool intel_dp_has_connector(struct intel_dp *intel_dp,
 
        intel_dp->psr.enabled = true;
        intel_dp->psr.paused = false;
 
+       /*
+        * Link_ok is sticky and set here on PSR enable. We can assume link
+        * training is complete as we never continue to PSR enable with
+        * untrained link. Link_ok is kept as set until first short pulse
+        * interrupt. This is targeted to workaround panels stating bad link
+        * after PSR is enabled.
+        */
+       intel_dp->psr.link_ok = true;
+
        intel_psr_activate(intel_dp);
 }
 
 
        intel_psr_disable_locked(intel_dp);
 
+       intel_dp->psr.link_ok = false;
+
        mutex_unlock(&intel_dp->psr.lock);
        cancel_work_sync(&intel_dp->psr.work);
        cancel_delayed_work_sync(&intel_dp->psr.dc3co_work);
 
        mutex_lock(&psr->lock);
 
+       psr->link_ok = false;
+
        if (!psr->enabled)
                goto exit;
 
        return ret;
 }
 
+/**
+ * intel_psr_link_ok - return psr->link_ok
+ * @intel_dp: struct intel_dp
+ *
+ * We are seeing unexpected link re-trainings with some panels. This is caused
+ * by panel stating bad link status after PSR is enabled. Code checking link
+ * status can call this to ensure it can ignore bad link status stated by the
+ * panel I.e. if panel is stating bad link and intel_psr_link_ok is stating link
+ * is ok caller should rely on latter.
+ *
+ * Return value of link_ok
+ */
+bool intel_psr_link_ok(struct intel_dp *intel_dp)
+{
+       bool ret;
+
+       if ((!CAN_PSR(intel_dp) && !CAN_PANEL_REPLAY(intel_dp)) ||
+           !intel_dp_is_edp(intel_dp))
+               return false;
+
+       mutex_lock(&intel_dp->psr.lock);
+       ret = intel_dp->psr.link_ok;
+       mutex_unlock(&intel_dp->psr.lock);
+
+       return ret;
+}
+
 /**
  * intel_psr_lock - grab PSR lock
  * @crtc_state: the crtc state
 
 void intel_psr_pause(struct intel_dp *intel_dp);
 void intel_psr_resume(struct intel_dp *intel_dp);
 bool intel_psr_needs_block_dc_vblank(const struct intel_crtc_state *crtc_state);
+bool intel_psr_link_ok(struct intel_dp *intel_dp);
 
 void intel_psr_lock(const struct intel_crtc_state *crtc_state);
 void intel_psr_unlock(const struct intel_crtc_state *crtc_state);