diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3505-drm-amd-display-Add-return-value-for-detect-dp.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3505-drm-amd-display-Add-return-value-for-detect-dp.patch | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3505-drm-amd-display-Add-return-value-for-detect-dp.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3505-drm-amd-display-Add-return-value-for-detect-dp.patch new file mode 100644 index 00000000..d4a9e5f8 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3505-drm-amd-display-Add-return-value-for-detect-dp.patch @@ -0,0 +1,152 @@ +From 04000632793850569544ee394bfcddec10c1bcfe Mon Sep 17 00:00:00 2001 +From: Yongqiang Sun <yongqiang.sun@amd.com> +Date: Tue, 23 Jan 2018 11:39:09 -0500 +Subject: [PATCH 3505/4131] drm/amd/display: Add return value for detect dp. + +System soft hang when hotplug specific 4K DP panel +due to link caps read error and incorrect link setting +parmas to enable dp. +Add status check for DPCD read and add return value +for detect dp, in case of false, return from caller, +avoid further false operation. + +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> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 14 +++++++++----- + drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 24 ++++++++++++++++-------- + drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h | 2 +- + 3 files changed, 26 insertions(+), 14 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index a678fc0..629aa04 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -465,7 +465,7 @@ static void link_disconnect_sink(struct dc_link *link) + link->dpcd_sink_count = 0; + } + +-static void detect_dp( ++static bool detect_dp( + struct dc_link *link, + struct display_sink_capability *sink_caps, + bool *converter_disable_audio, +@@ -479,7 +479,8 @@ static void detect_dp( + + if (sink_caps->transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX) { + sink_caps->signal = SIGNAL_TYPE_DISPLAY_PORT; +- detect_dp_sink_caps(link); ++ if (!detect_dp_sink_caps(link)) ++ return false; + + if (is_mst_supported(link)) { + sink_caps->signal = SIGNAL_TYPE_DISPLAY_PORT_MST; +@@ -530,7 +531,7 @@ static void detect_dp( + * active dongle unplug processing for short irq + */ + link_disconnect_sink(link); +- return; ++ return true; + } + + if (link->dpcd_caps.dongle_type != DISPLAY_DONGLE_DP_HDMI_CONVERTER) +@@ -542,6 +543,8 @@ static void detect_dp( + sink_caps, + audio_support); + } ++ ++ return true; + } + + bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) +@@ -605,11 +608,12 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) + } + + case SIGNAL_TYPE_DISPLAY_PORT: { +- detect_dp( ++ if (!detect_dp( + link, + &sink_caps, + &converter_disable_audio, +- aud_support, reason); ++ aud_support, reason)) ++ return false; + + /* Active dongle downstream unplug */ + if (link->type == dc_connection_active_dongle +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 33d91e4..4ee4c03 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 +@@ -2235,13 +2235,14 @@ static void dp_wa_power_up_0010FA(struct dc_link *link, uint8_t *dpcd_data, + link->wa_flags.dp_keep_receiver_powered = false; + } + +-static void retrieve_link_cap(struct dc_link *link) ++static bool retrieve_link_cap(struct dc_link *link) + { + uint8_t dpcd_data[DP_TRAINING_AUX_RD_INTERVAL - DP_DPCD_REV + 1]; + + union down_stream_port_count down_strm_port_count; + union edp_configuration_cap edp_config_cap; + union dp_downstream_port_present ds_port = { 0 }; ++ enum dc_status status = DC_ERROR_UNEXPECTED; + + memset(dpcd_data, '\0', sizeof(dpcd_data)); + memset(&down_strm_port_count, +@@ -2249,11 +2250,16 @@ static void retrieve_link_cap(struct dc_link *link) + memset(&edp_config_cap, '\0', + sizeof(union edp_configuration_cap)); + +- core_link_read_dpcd( +- link, +- DP_DPCD_REV, +- dpcd_data, +- sizeof(dpcd_data)); ++ status = core_link_read_dpcd( ++ link, ++ DP_DPCD_REV, ++ dpcd_data, ++ sizeof(dpcd_data)); ++ ++ if (status != DC_OK) { ++ dm_error("%s: Read dpcd data failed.\n", __func__); ++ return false; ++ } + + { + union training_aux_rd_interval aux_rd_interval; +@@ -2315,11 +2321,13 @@ static void retrieve_link_cap(struct dc_link *link) + + /* Connectivity log: detection */ + CONN_DATA_DETECT(link, dpcd_data, sizeof(dpcd_data), "Rx Caps: "); ++ ++ return true; + } + +-void detect_dp_sink_caps(struct dc_link *link) ++bool detect_dp_sink_caps(struct dc_link *link) + { +- retrieve_link_cap(link); ++ return retrieve_link_cap(link); + + /* dc init_hw has power encoder using default + * signal for connector. For native DP, no +diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h +index 616c73e..2f783c6 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h +@@ -53,7 +53,7 @@ bool perform_link_training_with_retries( + + bool is_mst_supported(struct dc_link *link); + +-void detect_dp_sink_caps(struct dc_link *link); ++bool detect_dp_sink_caps(struct dc_link *link); + + void detect_edp_sink_caps(struct dc_link *link); + +-- +2.7.4 + |