drm/amd/display: doesn't reprogram AMD OUI
authorYu-ting Shen <Yu-ting.Shen@amd.com>
Tue, 24 Nov 2020 02:49:27 +0000 (10:49 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 14 Jan 2021 04:43:38 +0000 (23:43 -0500)
[Why]
1. the corrected timing to write DPCD 300h AMD signature is before
link training.
2. and VBIOS will writes correctted AMD signature by after AGESA 1.0.0,
so driver doesn't need to write DPCD 300h again to switch config.
3. there are some OLED panel will clean backlight level to 0 once
receive DPCD 300h, so we will see flicker issue at that time.

[How]
read DPCD 300h signature before write it to avoid reprogram again, if
AMD signature was writed corrected by VBIOS, driver will not reprogram
it again.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Yu-ting Shen <Yu-ting.Shen@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
drivers/gpu/drm/amd/display/dc/dc_dp_types.h

index 3cd84dc..b2d859f 100644 (file)
@@ -4407,24 +4407,39 @@ void dpcd_set_source_specific_data(struct dc_link *link)
 {
        if (!link->dc->vendor_signature.is_valid) {
                enum dc_status result_write_min_hblank = DC_NOT_SUPPORTED;
-               struct dpcd_amd_signature amd_signature;
-               amd_signature.AMD_IEEE_TxSignature_byte1 = 0x0;
-               amd_signature.AMD_IEEE_TxSignature_byte2 = 0x0;
-               amd_signature.AMD_IEEE_TxSignature_byte3 = 0x1A;
-               amd_signature.device_id_byte1 =
+               struct dpcd_amd_signature amd_signature = {0};
+               struct dpcd_amd_device_id amd_device_id = {0};
+
+               amd_device_id.device_id_byte1 =
                                (uint8_t)(link->ctx->asic_id.chip_id);
-               amd_signature.device_id_byte2 =
+               amd_device_id.device_id_byte2 =
                                (uint8_t)(link->ctx->asic_id.chip_id >> 8);
-               memset(&amd_signature.zero, 0, 4);
-               amd_signature.dce_version =
+               amd_device_id.dce_version =
                                (uint8_t)(link->ctx->dce_version);
-               amd_signature.dal_version_byte1 = 0x0; // needed? where to get?
-               amd_signature.dal_version_byte2 = 0x0; // needed? where to get?
+               amd_device_id.dal_version_byte1 = 0x0; // needed? where to get?
+               amd_device_id.dal_version_byte2 = 0x0; // needed? where to get?
 
-               core_link_write_dpcd(link, DP_SOURCE_OUI,
+               core_link_read_dpcd(link, DP_SOURCE_OUI,
                                (uint8_t *)(&amd_signature),
                                sizeof(amd_signature));
 
+               if (!((amd_signature.AMD_IEEE_TxSignature_byte1 == 0x0) &&
+                       (amd_signature.AMD_IEEE_TxSignature_byte2 == 0x0) &&
+                       (amd_signature.AMD_IEEE_TxSignature_byte3 == 0x1A))) {
+
+                       amd_signature.AMD_IEEE_TxSignature_byte1 = 0x0;
+                       amd_signature.AMD_IEEE_TxSignature_byte2 = 0x0;
+                       amd_signature.AMD_IEEE_TxSignature_byte3 = 0x1A;
+
+                       core_link_write_dpcd(link, DP_SOURCE_OUI,
+                               (uint8_t *)(&amd_signature),
+                               sizeof(amd_signature));
+               }
+
+               core_link_write_dpcd(link, DP_SOURCE_OUI+0x03,
+                               (uint8_t *)(&amd_device_id),
+                               sizeof(amd_device_id));
+
                if (link->ctx->dce_version >= DCN_VERSION_2_0 &&
                        link->dc->caps.min_horizontal_blanking_period != 0) {
 
index 80a2191..cc6fb83 100644 (file)
@@ -451,6 +451,9 @@ struct dpcd_amd_signature {
        uint8_t AMD_IEEE_TxSignature_byte1;
        uint8_t AMD_IEEE_TxSignature_byte2;
        uint8_t AMD_IEEE_TxSignature_byte3;
+};
+
+struct dpcd_amd_device_id {
        uint8_t device_id_byte1;
        uint8_t device_id_byte2;
        uint8_t zero[4];