diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3423-drm-amd-display-Enable-type-C-hotplug.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3423-drm-amd-display-Enable-type-C-hotplug.patch | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3423-drm-amd-display-Enable-type-C-hotplug.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3423-drm-amd-display-Enable-type-C-hotplug.patch new file mode 100644 index 00000000..e24d7c73 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3423-drm-amd-display-Enable-type-C-hotplug.patch @@ -0,0 +1,123 @@ +From 2959d2e5b4477b563e879a75edd81e656603bf9c Mon Sep 17 00:00:00 2001 +From: Eric Yang <Eric.Yang2@amd.com> +Date: Wed, 10 Jul 2019 22:41:51 -0400 +Subject: [PATCH 3423/4256] drm/amd/display: Enable type C hotplug + +[Why and How] +We want to change where timing is done for alt mode. +Some of the commented out #ifs are needed for DCN20 +so we enable them for that case. + +Signed-off-by: Eric Yang <Eric.Yang2@amd.com> +Reviewed-by: Eric Yang <eric.yang2@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 59 +++++++++++++++++++ + .../amd/display/dc/dcn10/dcn10_link_encoder.h | 1 + + .../drm/amd/display/dc/inc/hw/link_encoder.h | 1 + + 3 files changed, 61 insertions(+) + +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 10b24af73c51..429c1ad59089 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -682,6 +682,56 @@ static bool is_same_edid(struct dc_edid *old_edid, struct dc_edid *new_edid) + return (memcmp(old_edid->raw_edid, new_edid->raw_edid, new_edid->length) == 0); + } + ++bool wait_for_alt_mode(struct dc_link *link) ++{ ++ ++ /** ++ * something is terribly wrong if time out is > 200ms. (5Hz) ++ * 500 microseconds * 400 tries us 200 ms ++ **/ ++ unsigned int sleep_time_in_microseconds = 500; ++ unsigned int tries_allowed = 400; ++ bool is_in_alt_mode; ++ unsigned long long enter_timestamp; ++ unsigned long long finish_timestamp; ++ unsigned long long time_taken_in_ns; ++ int tries_taken; ++ ++ DC_LOGGER_INIT(link->ctx->logger); ++ ++ if (link->link_enc->funcs->is_in_alt_mode == NULL) ++ return true; ++ ++ is_in_alt_mode = link->link_enc->funcs->is_in_alt_mode(link->link_enc); ++ DC_LOG_WARNING("DP Alt mode state on HPD: %d\n", is_in_alt_mode); ++ ++ if (is_in_alt_mode) ++ return true; ++ ++ enter_timestamp = dm_get_timestamp(link->ctx); ++ ++ for (tries_taken = 0; tries_taken < tries_allowed; tries_taken++) { ++ udelay(sleep_time_in_microseconds); ++ /* ask the link if alt mode is enabled, if so return ok */ ++ if (link->link_enc->funcs->is_in_alt_mode(link->link_enc)) { ++ ++ finish_timestamp = dm_get_timestamp(link->ctx); ++ time_taken_in_ns = dm_get_elapse_time_in_ns( ++ link->ctx, finish_timestamp, enter_timestamp); ++ DC_LOG_WARNING("Alt mode entered finished after %llu ms\n", ++ time_taken_in_ns / 1000000); ++ return true; ++ } ++ ++ } ++ finish_timestamp = dm_get_timestamp(link->ctx); ++ time_taken_in_ns = dm_get_elapse_time_in_ns(link->ctx, finish_timestamp, ++ enter_timestamp); ++ DC_LOG_WARNING("Alt mode has timed out after %llu ms\n", ++ time_taken_in_ns / 1000000); ++ return false; ++} ++ + /** + * dc_link_detect() - Detect if a sink is attached to a given link + * +@@ -770,6 +820,15 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) + } + + case SIGNAL_TYPE_DISPLAY_PORT: { ++ /* wa HPD high coming too early*/ ++ if (link->link_enc->features.flags.bits.DP_IS_USB_C == 1) { ++ ++ /* if alt mode times out, return false */ ++ if (wait_for_alt_mode(link) == false) { ++ return false; ++ } ++ } ++ + if (!detect_dp( + link, + &sink_caps, +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h +index 33b2af1a181c..f3e57343417c 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h +@@ -337,6 +337,7 @@ struct dcn10_link_enc_registers { + type RDPCS_TX_FIFO_ERROR_MASK;\ + type RDPCS_DPALT_DISABLE_TOGGLE_MASK;\ + type RDPCS_DPALT_4LANE_TOGGLE_MASK;\ ++ type RDPCS_PHY_DPALT_DISABLE;\ + type RDPCS_PHY_DPALT_DISABLE_ACK;\ + type RDPCS_PHY_DP_MPLLB_V2I;\ + type RDPCS_PHY_DP_MPLLB_FREQ_VCO;\ +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h +index e5e8640a9ef3..7001bfbd6681 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h +@@ -183,6 +183,7 @@ struct link_encoder_funcs { + + bool (*fec_is_active)(struct link_encoder *enc); + #endif ++ bool (*is_in_alt_mode) (struct link_encoder *enc); + }; + + #endif /* LINK_ENCODER_H_ */ +-- +2.17.1 + |