@@ -4252,19 +4252,32 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
}
static void
+intel_edp_wait_link_train_complete(struct intel_dp *intel_dp)
+{
+ struct drm_device *dev = intel_dp_to_dev(intel_dp);
+ struct drm_i915_private *dev_priv = to_i915(dev);
+
+ if (!intel_wait_for_register(dev_priv,
+ EDP_PSR_STATUS_CTL,
+ (EDP_PSR_STATUS_SENDING_TP1 |
+ EDP_PSR_STATUS_SENDING_TP2_TP3 |
+ EDP_PSR_STATUS_SENDING_IDLE |
+ EDP_PSR_STATUS_AUX_SENDING),
+ 0,
+ 100))
+ return;
+}
+
+static void
intel_dp_check_link_status(struct intel_dp *intel_dp)
{
struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
struct drm_device *dev = intel_dp_to_dev(intel_dp);
+ struct drm_i915_private *dev_priv = to_i915(dev);
u8 link_status[DP_LINK_STATUS_SIZE];
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
- if (!intel_dp_get_link_status(intel_dp, link_status)) {
- DRM_ERROR("Failed to get link status\n");
- return;
- }
-
if (!intel_encoder->base.crtc)
return;
@@ -4278,6 +4291,14 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
if (!intel_dp_link_params_valid(intel_dp))
return;
+ if (is_edp(intel_dp) && dev_priv->psr.enabled)
+ intel_edp_wait_link_train_complete(intel_dp);
+
+ if (!intel_dp_get_link_status(intel_dp, link_status)) {
+ DRM_ERROR("Failed to get link status\n");
+ return;
+ }
+
/* Retrain if Channel EQ or CR not ok */
if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) {
DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",