diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0806-drm-amd-display-retry-3-times-before-successfully-re.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0806-drm-amd-display-retry-3-times-before-successfully-re.patch | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0806-drm-amd-display-retry-3-times-before-successfully-re.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0806-drm-amd-display-retry-3-times-before-successfully-re.patch new file mode 100644 index 00000000..9461b1b8 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0806-drm-amd-display-retry-3-times-before-successfully-re.patch @@ -0,0 +1,59 @@ +From b22141c0736ee943fc013f0f90a14c830875f192 Mon Sep 17 00:00:00 2001 +From: Xiaodong Yan <Xiaodong.Yan@amd.com> +Date: Wed, 24 Oct 2018 02:08:53 +0800 +Subject: [PATCH 0806/2940] drm/amd/display: retry 3 times before successfully + reading + +DPCD Extended Receiver Capability Field + +[Why] +1.dpcd extended receiver capability sometimes read fail, + and corrupted data leads to sink caps is not correct. +2.sometimes sink reply ack with fewer data + +[How] + check the return value of core_link_read_dpcd, + try to read again when failure happens + +Signed-off-by: Xiaodong Yan <Xiaodong.Yan@amd.com> +Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +Acked-by: Tony Cheng <Tony.Cheng@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +index d91df5ef0cb3..4d1f8ac069c1 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +@@ -2371,11 +2371,22 @@ static bool retrieve_link_cap(struct dc_link *link) + dpcd_data[DP_TRAINING_AUX_RD_INTERVAL]; + + if (aux_rd_interval.bits.EXT_RECIEVER_CAP_FIELD_PRESENT == 1) { +- core_link_read_dpcd( ++ uint8_t ext_cap_data[16]; ++ ++ memset(ext_cap_data, '\0', sizeof(ext_cap_data)); ++ for (i = 0; i < read_dpcd_retry_cnt; i++) { ++ status = core_link_read_dpcd( + link, + DP_DP13_DPCD_REV, +- dpcd_data, +- sizeof(dpcd_data)); ++ ext_cap_data, ++ sizeof(ext_cap_data)); ++ if (status == DC_OK) { ++ memcpy(dpcd_data, ext_cap_data, sizeof(dpcd_data)); ++ break; ++ } ++ } ++ if (status != DC_OK) ++ dm_error("%s: Read extend caps data failed, use cap from dpcd 0.\n", __func__); + } + } + +-- +2.17.1 + |