aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0684-drm-amd-dal-Don-t-handle-DP-short-pulse-until-necess.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0684-drm-amd-dal-Don-t-handle-DP-short-pulse-until-necess.patch')
-rw-r--r--common/recipes-kernel/linux/files/0684-drm-amd-dal-Don-t-handle-DP-short-pulse-until-necess.patch168
1 files changed, 168 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0684-drm-amd-dal-Don-t-handle-DP-short-pulse-until-necess.patch b/common/recipes-kernel/linux/files/0684-drm-amd-dal-Don-t-handle-DP-short-pulse-until-necess.patch
new file mode 100644
index 00000000..8be2f454
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0684-drm-amd-dal-Don-t-handle-DP-short-pulse-until-necess.patch
@@ -0,0 +1,168 @@
+From 970cdba09cfb837d01232020b6e8381a6fe301c1 Mon Sep 17 00:00:00 2001
+From: Harry Wentland <harry.wentland@amd.com>
+Date: Mon, 11 Jan 2016 11:45:11 -0500
+Subject: [PATCH 0684/1110] drm/amd/dal: Don't handle DP short pulse until
+ necessary
+
+We shouldn't handle DP short pulse interrupts until one
+of the following is met
+1) The link is established (cur_link_settings != unknown)
+2) We kicked off MST detection
+3) We know we're dealing with an active dongle
+
+This works around an issue where the short pulse handler
+is trying to acquire the AUX line while EDID read is
+still happening. We still don't protect the AUX line
+properly in this case.
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Jordan Lazare <Jordan.Lazare@amd.com>
+---
+ drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 13 +++-------
+ drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c | 36 ++++++++++++++++++++++++++++
+ drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h | 7 +++++-
+ 3 files changed, 45 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+index c5ff145..e9e36c8 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+@@ -420,13 +420,6 @@ static enum signal_type dp_passive_dongle_detection(
+ audio_support);
+ }
+
+-static bool is_dp_active_dongle(enum display_dongle_type dongle_type)
+-{
+- return (dongle_type == DISPLAY_DONGLE_DP_VGA_CONVERTER ||
+- dongle_type == DISPLAY_DONGLE_DP_DVI_CONVERTER ||
+- dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER);
+-}
+-
+ static void link_disconnect_sink(struct core_link *link)
+ {
+ if (link->public.local_sink) {
+@@ -472,7 +465,7 @@ static enum dc_edid_status read_edid(
+ return edid_status;
+ }
+
+-static void dc_link_detect_dp(
++static void detect_dp(
+ struct core_link *link,
+ struct display_sink_capability *sink_caps,
+ bool *converter_disable_audio,
+@@ -487,7 +480,7 @@ static void dc_link_detect_dp(
+ detect_dp_sink_caps(link);
+
+ /* DP active dongles */
+- if (is_dp_active_dongle(link->dpcd_caps.dongle_type)) {
++ if (is_dp_active_dongle(link)) {
+ if (!link->dpcd_caps.sink_count.bits.SINK_COUNT) {
+ link->public.type = dc_connection_none;
+ /*
+@@ -608,7 +601,7 @@ void dc_link_detect(const struct dc_link *dc_link)
+ }
+
+ case SIGNAL_TYPE_DISPLAY_PORT: {
+- dc_link_detect_dp(
++ detect_dp(
+ link,
+ &sink_caps,
+ &converter_disable_audio,
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
+index 4c17ff1..eaea78e 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
+@@ -1,6 +1,7 @@
+ /* Copyright 2015 Advanced Micro Devices, Inc. */
+ #include "dc_services.h"
+ #include "dc.h"
++#include "dc_link_dp.h"
+ #include "dc_helpers.h"
+ #include "inc/core_types.h"
+ #include "link_hwss.h"
+@@ -1391,6 +1392,23 @@ static enum dc_status read_hpd_rx_irq_data(
+ sizeof(union hpd_irq_data));
+ }
+
++static bool allow_hpd_rx_irq(const struct core_link *link)
++{
++ /*
++ * Don't handle RX IRQ unless one of following is met:
++ * 1) The link is established (cur_link_settings != unknown)
++ * 2) We kicked off MST detection
++ * 3) We know we're dealing with an active dongle
++ */
++
++ if ((link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) ||
++ (link->public.type == dc_connection_mst_branch) ||
++ is_dp_active_dongle(link))
++ return true;
++
++ return false;
++}
++
+ bool dc_link_handle_hpd_rx_irq(const struct dc_link *dc_link)
+ {
+ struct core_link *link = DC_LINK_TO_LINK(dc_link);
+@@ -1407,6 +1425,15 @@ bool dc_link_handle_hpd_rx_irq(const struct dc_link *dc_link)
+ "%s: Got short pulse HPD on link %d\n",
+ __func__, link->public.link_index);
+
++ if (!allow_hpd_rx_irq(link)) {
++ dal_logger_write(link->ctx->logger,
++ LOG_MAJOR_HW_TRACE,
++ LOG_MINOR_HW_TRACE_HPD_IRQ,
++ "%s: skipping HPD handling on %d\n",
++ __func__, link->public.link_index);
++ return false;
++ }
++
+ /* All the "handle_hpd_irq_xxx()" methods
+ * should be called only after
+ * dal_dpsst_ls_read_hpd_irq_data
+@@ -1480,6 +1507,15 @@ bool is_mst_supported(struct core_link *link)
+
+ }
+
++bool is_dp_active_dongle(const struct core_link *link)
++{
++ enum display_dongle_type dongle_type = link->dpcd_caps.dongle_type;
++
++ return (dongle_type == DISPLAY_DONGLE_DP_VGA_CONVERTER) ||
++ (dongle_type == DISPLAY_DONGLE_DP_DVI_CONVERTER) ||
++ (dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER);
++}
++
+ static void get_active_converter_info(
+ uint8_t data, struct core_link *link)
+ {
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h b/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h
+index e3e4778..682c0b4 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h
+@@ -26,6 +26,10 @@
+ #ifndef __DC_LINK_DP_H__
+ #define __DC_LINK_DP_H__
+
++struct core_link;
++struct core_stream;
++struct link_settings;
++
+ bool dp_hbr_verify_link_cap(
+ struct core_link *link,
+ struct link_settings *known_limit_link_setting);
+@@ -43,9 +47,10 @@ bool perform_link_training(
+ const struct link_settings *link_setting,
+ bool skip_video_pattern);
+
+-/*dp mst functions*/
+ bool is_mst_supported(struct core_link *link);
+
+ void detect_dp_sink_caps(struct core_link *link);
+
++bool is_dp_active_dongle(const struct core_link *link);
++
+ #endif /* __DC_LINK_DP_H__ */
+--
+2.7.4
+