diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3920-drm-amd-display-Retry-when-read-dpcd-caps-failed.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3920-drm-amd-display-Retry-when-read-dpcd-caps-failed.patch | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3920-drm-amd-display-Retry-when-read-dpcd-caps-failed.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3920-drm-amd-display-Retry-when-read-dpcd-caps-failed.patch new file mode 100644 index 00000000..207bbd9d --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3920-drm-amd-display-Retry-when-read-dpcd-caps-failed.patch @@ -0,0 +1,56 @@ +From 27fea314a44d74be59af60aecc13eb9bc6b66fcd Mon Sep 17 00:00:00 2001 +From: Yongqiang Sun <yongqiang.sun@amd.com> +Date: Wed, 7 Mar 2018 09:12:53 -0500 +Subject: [PATCH 3920/4131] drm/amd/display: Retry when read dpcd caps failed. + +Some DP panel not detected intermittently due to read dpcd +caps failed when doing hot plug. +[root cause] DC_HPD_CONNECT_INT_DELAY is set to 0, not delay +after HPD toggle and read dpcd data, while some panel need 4ms defer +to read. +[solution] Add a retry when read failed. + +Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 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 3b50535..b86325b 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 +@@ -2278,6 +2278,8 @@ static bool retrieve_link_cap(struct dc_link *link) + union edp_configuration_cap edp_config_cap; + union dp_downstream_port_present ds_port = { 0 }; + enum dc_status status = DC_ERROR_UNEXPECTED; ++ uint32_t read_dpcd_retry_cnt = 3; ++ int i; + + memset(dpcd_data, '\0', sizeof(dpcd_data)); + memset(&down_strm_port_count, +@@ -2285,11 +2287,15 @@ static bool retrieve_link_cap(struct dc_link *link) + memset(&edp_config_cap, '\0', + sizeof(union edp_configuration_cap)); + +- status = core_link_read_dpcd( +- link, +- DP_DPCD_REV, +- dpcd_data, +- sizeof(dpcd_data)); ++ for (i = 0; i < read_dpcd_retry_cnt; i++) { ++ status = core_link_read_dpcd( ++ link, ++ DP_DPCD_REV, ++ dpcd_data, ++ sizeof(dpcd_data)); ++ if (status == DC_OK) ++ break; ++ } + + if (status != DC_OK) { + dm_error("%s: Read dpcd data failed.\n", __func__); +-- +2.7.4 + |