summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHersen Wu <hersenxs.wu@amd.com>2017-09-11 23:42:14 +0300
committerAlex Deucher <alexander.deucher@amd.com>2017-09-27 01:17:29 +0300
commit8f38b66c82618854d019f9df8ff4cd8dd796da10 (patch)
tree7dce69481c95c2536fb3c4ea77933ffbb6cb87e4
parent4451a2551dcac9ea8c90829e0fcc798b834deb6b (diff)
downloadlinux-8f38b66c82618854d019f9df8ff4cd8dd796da10.tar.xz
drm/amd/display: USB-C to HDMI dongle not light
RV1 support only USB-C active DP-2-HDMI dongle. HPD short pulse is generated only for DP signal. When processing HPD short pulse, it must be DP active dongle. No need for I2C-Over-AUX detection. v2: Add description Signed-off-by: Hersen Wu <hersenxs.wu@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>
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c9
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link.c32
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc.h8
3 files changed, 33 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 4c7515d9c811..febfff2225d9 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -639,7 +639,7 @@ int amdgpu_dm_display_resume(struct amdgpu_device *adev )
continue;
mutex_lock(&aconnector->hpd_lock);
- dc_link_detect(aconnector->dc_link, false);
+ dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD);
aconnector->dc_sink = NULL;
amdgpu_dm_update_connector_after_detect(aconnector);
mutex_unlock(&aconnector->hpd_lock);
@@ -855,7 +855,7 @@ static void handle_hpd_irq(void *param)
* since (for MST case) MST does this in it's own context.
*/
mutex_lock(&aconnector->hpd_lock);
- if (dc_link_detect(aconnector->dc_link, false)) {
+ if (dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD)) {
amdgpu_dm_update_connector_after_detect(aconnector);
@@ -965,7 +965,7 @@ static void handle_hpd_rx_irq(void *param)
if (dc_link_handle_hpd_rx_irq(aconnector->dc_link, NULL) &&
!is_mst_root_connector) {
/* Downstream Port status changed. */
- if (dc_link_detect(aconnector->dc_link, false)) {
+ if (dc_link_detect(aconnector->dc_link, DETECT_REASON_HPDRX)) {
amdgpu_dm_update_connector_after_detect(aconnector);
@@ -1353,7 +1353,8 @@ int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
goto fail_free_encoder;
}
- if (dc_link_detect(dc_get_link_at_index(dm->dc, i), true))
+ if (dc_link_detect(dc_get_link_at_index(dm->dc, i),
+ DETECT_REASON_BOOT))
amdgpu_dm_update_connector_after_detect(aconnector);
}
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 cea8dafd2edc..845ec421d861 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -355,7 +355,9 @@ static bool is_dp_sink_present(struct dc_link *link)
* @brief
* Detect output sink type
*/
-static enum signal_type link_detect_sink(struct dc_link *link)
+static enum signal_type link_detect_sink(
+ struct dc_link *link,
+ enum dc_detect_reason reason)
{
enum signal_type result = get_basic_signal_type(
link->link_enc->id, link->link_id);
@@ -388,12 +390,17 @@ static enum signal_type link_detect_sink(struct dc_link *link)
}
break;
case CONNECTOR_ID_DISPLAY_PORT: {
-
- /* Check whether DP signal detected: if not -
- * we assume signal is DVI; it could be corrected
- * to HDMI after dongle detection */
- if (!is_dp_sink_present(link))
- result = SIGNAL_TYPE_DVI_SINGLE_LINK;
+ /* DP HPD short pulse. Passive DP dongle will not
+ * have short pulse
+ */
+ if (reason != DETECT_REASON_HPDRX) {
+ /* Check whether DP signal detected: if not -
+ * we assume signal is DVI; it could be corrected
+ * to HDMI after dongle detection
+ */
+ if (!is_dp_sink_present(link))
+ result = SIGNAL_TYPE_DVI_SINGLE_LINK;
+ }
}
break;
default:
@@ -460,9 +467,10 @@ static void detect_dp(
struct display_sink_capability *sink_caps,
bool *converter_disable_audio,
struct audio_support *audio_support,
- bool boot)
+ enum dc_detect_reason reason)
{
- sink_caps->signal = link_detect_sink(link);
+ bool boot = false;
+ sink_caps->signal = link_detect_sink(link, reason);
sink_caps->transaction_type =
get_ddc_transaction_type(sink_caps->signal);
@@ -513,6 +521,8 @@ static void detect_dp(
* Need check ->sink usages in case ->sink = NULL
* TODO: s3 resume check
*/
+ if (reason == DETECT_REASON_BOOT)
+ boot = true;
if (dm_helpers_dp_mst_start_top_mgr(
link->ctx,
@@ -531,7 +541,7 @@ static void detect_dp(
}
}
-bool dc_link_detect(struct dc_link *link, bool boot)
+bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
{
struct dc_sink_init_data sink_init_data = { 0 };
struct display_sink_capability sink_caps = { 0 };
@@ -596,7 +606,7 @@ bool dc_link_detect(struct dc_link *link, bool boot)
link,
&sink_caps,
&converter_disable_audio,
- aud_support, boot);
+ aud_support, reason);
/* Active dongle downstream unplug */
if (link->type == dc_connection_active_dongle
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
index 2316a6060b2c..1f0521ff4614 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -885,7 +885,13 @@ bool dc_link_setup_psr(struct dc_link *dc_link,
* true otherwise. True meaning further action is required (status update
* and OS notification).
*/
-bool dc_link_detect(struct dc_link *dc_link, bool boot);
+enum dc_detect_reason {
+ DETECT_REASON_BOOT,
+ DETECT_REASON_HPD,
+ DETECT_REASON_HPDRX,
+};
+
+bool dc_link_detect(struct dc_link *dc_link, enum dc_detect_reason reason);
/* Notify DC about DP RX Interrupt (aka Short Pulse Interrupt).
* Return: