drm/amd/display: Add dm support for DP 1.4 Compliance edid corruption test
authorJerry (Fangzhi) Zuo <Jerry.Zuo@amd.com>
Wed, 29 Apr 2020 17:42:16 +0000 (13:42 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 May 2020 20:50:25 +0000 (16:50 -0400)
It works together with drm framework
"drm: Add support for DP 1.4 Compliance edid corruption test"

Add the edid validity check scenario when edid base block is read back
with error. Send back real edid checksum and enable fail-safe mode in DC.

Signed-off-by: Jerry (Fangzhi) Zuo <Jerry.Zuo@amd.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c

index c407f06..b086d5c 100644 (file)
@@ -554,6 +554,7 @@ enum dc_edid_status dm_helpers_read_local_edid(
                struct dc_sink *sink)
 {
        struct amdgpu_dm_connector *aconnector = link->priv;
+       struct drm_connector *connector = &aconnector->base;
        struct i2c_adapter *ddc;
        int retry = 3;
        enum dc_edid_status edid_status;
@@ -571,6 +572,15 @@ enum dc_edid_status dm_helpers_read_local_edid(
 
                edid = drm_get_edid(&aconnector->base, ddc);
 
+               /* DP Compliance Test 4.2.2.6 */
+               if (link->aux_mode && connector->edid_corrupt)
+                       drm_dp_send_real_edid_checksum(&aconnector->dm_dp_aux.aux, connector->real_edid_checksum);
+
+               if (!edid && connector->edid_corrupt) {
+                       connector->edid_corrupt = false;
+                       return EDID_BAD_CHECKSUM;
+               }
+
                if (!edid)
                        return EDID_NO_RESPONSE;
 
@@ -605,34 +615,10 @@ enum dc_edid_status dm_helpers_read_local_edid(
                DRM_ERROR("EDID err: %d, on connector: %s",
                                edid_status,
                                aconnector->base.name);
-       if (link->aux_mode) {
-               union test_request test_request = { {0} };
-               union test_response test_response = { {0} };
-
-               dm_helpers_dp_read_dpcd(ctx,
-                                       link,
-                                       DP_TEST_REQUEST,
-                                       &test_request.raw,
-                                       sizeof(union test_request));
-
-               if (!test_request.bits.EDID_READ)
-                       return edid_status;
 
-               test_response.bits.EDID_CHECKSUM_WRITE = 1;
-
-               dm_helpers_dp_write_dpcd(ctx,
-                                       link,
-                                       DP_TEST_EDID_CHECKSUM,
-                                       &sink->dc_edid.raw_edid[sink->dc_edid.length-1],
-                                       1);
-
-               dm_helpers_dp_write_dpcd(ctx,
-                                       link,
-                                       DP_TEST_RESPONSE,
-                                       &test_response.raw,
-                                       sizeof(test_response));
-
-       }
+       /* DP Compliance Test 4.2.2.3 */
+       if (link->aux_mode)
+               drm_dp_send_real_edid_checksum(&aconnector->dm_dp_aux.aux, sink->dc_edid.raw_edid[sink->dc_edid.length-1]);
 
        return edid_status;
 }