Commit 4df6960e authored by Shubhangi Shrivastava's avatar Shubhangi Shrivastava Committed by Daniel Vetter

drm/i915: Cleanup test data during long/short hotplug

Automated test data that is updated when a test is requested is not cleared
till next automated test request is recevied which can cause various
problems. This patch fixes this by clearing this during the next
short pulse and on hot unplug.

For example, when TEST_LINK_TRAINING is requested it is updated
to appropriate variable inside intel_dp_handle_test_request
but is also cleared only inside the same function. if the next
short pulse does not have the AUTOMATED_TEST_REQUEST bits set
the variable will not be cleared resulting in carrying incorrect
test status in local variables.

v2: Added comments and moved nack and defer variables before set_edid
(Sonika)
Signed-off-by: default avatarSivakumar Thulasimani <sivakumar.thulasimani@intel.com>
Signed-off-by: default avatarShubhangi Shrivastava <shubhangi.shrivastava@intel.com>
Reviewed-by: Sonika Jindal <sonika.jindal@intel.com
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent e6d90023
...@@ -4163,13 +4163,6 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp) ...@@ -4163,13 +4163,6 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
uint8_t rxdata = 0; uint8_t rxdata = 0;
int status = 0; int status = 0;
intel_dp->compliance_test_active = 0;
intel_dp->compliance_test_type = 0;
intel_dp->compliance_test_data = 0;
intel_dp->aux.i2c_nack_count = 0;
intel_dp->aux.i2c_defer_count = 0;
status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_REQUEST, &rxdata, 1); status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_REQUEST, &rxdata, 1);
if (status <= 0) { if (status <= 0) {
DRM_DEBUG_KMS("Could not read test request from sink\n"); DRM_DEBUG_KMS("Could not read test request from sink\n");
...@@ -4285,6 +4278,14 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) ...@@ -4285,6 +4278,14 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
/*
* Clearing compliance test variables to allow capturing
* of values for next automated test request.
*/
intel_dp->compliance_test_active = 0;
intel_dp->compliance_test_type = 0;
intel_dp->compliance_test_data = 0;
if (!intel_encoder->base.crtc) if (!intel_encoder->base.crtc)
return; return;
...@@ -4663,8 +4664,13 @@ intel_dp_detect(struct drm_connector *connector, bool force) ...@@ -4663,8 +4664,13 @@ intel_dp_detect(struct drm_connector *connector, bool force)
status = ironlake_dp_detect(intel_dp); status = ironlake_dp_detect(intel_dp);
else else
status = g4x_dp_detect(intel_dp); status = g4x_dp_detect(intel_dp);
if (status != connector_status_connected) if (status != connector_status_connected) {
intel_dp->compliance_test_active = 0;
intel_dp->compliance_test_type = 0;
intel_dp->compliance_test_data = 0;
goto out; goto out;
}
intel_dp_probe_oui(intel_dp); intel_dp_probe_oui(intel_dp);
...@@ -4678,6 +4684,14 @@ intel_dp_detect(struct drm_connector *connector, bool force) ...@@ -4678,6 +4684,14 @@ intel_dp_detect(struct drm_connector *connector, bool force)
goto out; goto out;
} }
/*
* Clearing NACK and defer counts to get their exact values
* while reading EDID which are required by Compliance tests
* 4.2.2.4 and 4.2.2.5
*/
intel_dp->aux.i2c_nack_count = 0;
intel_dp->aux.i2c_defer_count = 0;
intel_dp_set_edid(intel_dp); intel_dp_set_edid(intel_dp);
if (intel_encoder->type != INTEL_OUTPUT_EDP) if (intel_encoder->type != INTEL_OUTPUT_EDP)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment