diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0691-drm-amd-dal-Defer-MST-start-to-after-HPD_RX-enabled-.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0691-drm-amd-dal-Defer-MST-start-to-after-HPD_RX-enabled-.patch | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0691-drm-amd-dal-Defer-MST-start-to-after-HPD_RX-enabled-.patch b/common/recipes-kernel/linux/files/0691-drm-amd-dal-Defer-MST-start-to-after-HPD_RX-enabled-.patch new file mode 100644 index 00000000..7e769f78 --- /dev/null +++ b/common/recipes-kernel/linux/files/0691-drm-amd-dal-Defer-MST-start-to-after-HPD_RX-enabled-.patch @@ -0,0 +1,207 @@ +From 067bb023f9fef32a30c1ca1974a38f97ab4ea338 Mon Sep 17 00:00:00 2001 +From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> +Date: Wed, 13 Jan 2016 14:49:57 -0500 +Subject: [PATCH 0691/1110] drm/amd/dal: Defer MST start to after HPD_RX + enabled on boot. + +Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> +Acked-by: Jordan Lazare <Jordan.Lazare@amd.com> +--- + .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c | 13 +++++--- + drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c | 37 +++++++++++++++++++--- + drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 9 +++--- + drivers/gpu/drm/amd/dal/dc/dc.h | 3 +- + drivers/gpu/drm/amd/dal/dc/dc_helpers.h | 3 +- + 5 files changed, 51 insertions(+), 14 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c +index ff9b5c1..855f9f9 100644 +--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c ++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c +@@ -431,18 +431,23 @@ void dc_helpers_dp_mst_handle_mst_hpd_rx_irq(void *param) + + bool dc_helpers_dp_mst_start_top_mgr( + struct dc_context *ctx, +- const struct dc_link *link) ++ const struct dc_link *link, ++ bool boot) + { + struct amdgpu_device *adev = ctx->driver_context; + struct drm_device *dev = adev->ddev; + struct amdgpu_connector *aconnector = get_connector_for_link(dev, link); + ++ if (boot) { ++ DRM_INFO("DM_MST: Differing MST start on aconnector: %p [id: %d]\n", ++ aconnector, aconnector->base.base.id); ++ return true; ++ } ++ + DRM_INFO("DM_MST: starting TM on aconnector: %p [id: %d]\n", + aconnector, aconnector->base.base.id); + +- drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true); +- +- return true; ++ return (drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true) == 0); + } + + void dc_helpers_dp_mst_stop_top_mgr( +diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c +index cee507c..0f281b6 100644 +--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c +@@ -461,7 +461,7 @@ static void detect_on_all_dc_links(struct amdgpu_display_manager *dm) + + for (i = 0; i < caps.max_links; i++) { + dc_link = dc_get_link_at_index(dm->dc, i); +- dc_link_detect(dc_link); ++ dc_link_detect(dc_link, false); + } + } + +@@ -612,6 +612,31 @@ static int dm_sw_fini(void *handle) + return 0; + } + ++ ++static void detect_link_for_all_connectors(struct drm_device *dev) ++{ ++ struct amdgpu_connector *aconnector; ++ struct drm_connector *connector; ++ ++ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); ++ ++ drm_for_each_connector(connector, dev) { ++ aconnector = to_amdgpu_connector(connector); ++ if (aconnector->dc_link->type == dc_connection_mst_branch) { ++ DRM_INFO("DM_MST: starting TM on aconnector: %p [id: %d]\n", ++ aconnector, aconnector->base.base.id); ++ ++ if (drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true) < 0) { ++ DRM_ERROR("DM_MST: Failed to start MST\n"); ++ ((struct dc_link *)aconnector->dc_link)->type = dc_connection_single; ++ } ++ } ++ } ++ ++ drm_modeset_unlock(&dev->mode_config.connection_mutex); ++} ++ ++ + static int dm_hw_init(void *handle) + { + struct amdgpu_device *adev = (struct amdgpu_device *)handle; +@@ -620,6 +645,10 @@ static int dm_hw_init(void *handle) + + amdgpu_dm_hpd_init(adev); + ++ detect_link_for_all_connectors(adev->ddev); ++ ++ ++ + return 0; + } + +@@ -765,7 +794,7 @@ static void handle_hpd_irq(void *param) + /* In case of failure or MST no need to update connector status or notify the OS + * since (for MST case) MST does this in it's own context. + */ +- if (dc_link_detect(aconnector->dc_link)) { ++ if (dc_link_detect(aconnector->dc_link, false)) { + amdgpu_dm_update_connector_after_detect(aconnector); + drm_kms_helper_hotplug_event(dev); + } +@@ -781,7 +810,7 @@ static void handle_hpd_rx_irq(void *param) + if (dc_link_handle_hpd_rx_irq(aconnector->dc_link) && + !is_mst_root_connector) { + /* Downstream Port status changed. */ +- if (dc_link_detect(aconnector->dc_link)) { ++ if (dc_link_detect(aconnector->dc_link, false)) { + amdgpu_dm_update_connector_after_detect(aconnector); + drm_kms_helper_hotplug_event(dev); + } +@@ -1057,7 +1086,7 @@ int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) + goto fail_free_connector; + } + +- if (dc_link_detect(dc_get_link_at_index(dm->dc, i))) ++ if (dc_link_detect(dc_get_link_at_index(dm->dc, i), true)) + amdgpu_dm_update_connector_after_detect( + aconnector); + } +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 a994a4c..b034c2f 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +@@ -469,7 +469,8 @@ static void detect_dp( + struct core_link *link, + struct display_sink_capability *sink_caps, + bool *converter_disable_audio, +- union audio_support *audio_support) ++ union audio_support *audio_support, ++ bool boot) + { + sink_caps->signal = link_detect_sink(link); + sink_caps->transaction_type = +@@ -525,7 +526,7 @@ static void detect_dp( + + if (dc_helpers_dp_mst_start_top_mgr( + link->ctx, +- &link->public)) { ++ &link->public, boot)) { + link->public.type = dc_connection_mst_branch; + } else { + /* MST not supported */ +@@ -540,7 +541,7 @@ static void detect_dp( + } + } + +-bool dc_link_detect(const struct dc_link *dc_link) ++bool dc_link_detect(const struct dc_link *dc_link, bool boot) + { + struct core_link *link = DC_LINK_TO_LINK(dc_link); + struct dc_sink_init_data sink_init_data = { 0 }; +@@ -605,7 +606,7 @@ bool dc_link_detect(const struct dc_link *dc_link) + link, + &sink_caps, + &converter_disable_audio, +- &audio_support); ++ &audio_support, boot); + + if (link->public.type == dc_connection_mst_branch) + return false; +diff --git a/drivers/gpu/drm/amd/dal/dc/dc.h b/drivers/gpu/drm/amd/dal/dc/dc.h +index a2f26cb..f86ddb0 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dc.h ++++ b/drivers/gpu/drm/amd/dal/dc/dc.h +@@ -297,11 +297,12 @@ const struct graphics_object_id dc_get_link_id_at_index( + bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level); + + /* Request DC to detect if there is a Panel connected. ++ * boot - If this call is during initial boot. + * Return false for any type of detection failure or MST detection + * true otherwise. True meaning further action is required (status update + * and OS notification). + */ +-bool dc_link_detect(const struct dc_link *dc_link); ++bool dc_link_detect(const struct dc_link *dc_link, bool boot); + + /* Notify DC about DP RX Interrupt (aka Short Pulse Interrupt). + * Return: +diff --git a/drivers/gpu/drm/amd/dal/dc/dc_helpers.h b/drivers/gpu/drm/amd/dal/dc/dc_helpers.h +index b4c338a..7a14300 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dc_helpers.h ++++ b/drivers/gpu/drm/amd/dal/dc/dc_helpers.h +@@ -67,7 +67,8 @@ void dc_helpers_dp_mst_handle_mst_hpd_rx_irq( + + bool dc_helpers_dp_mst_start_top_mgr( + struct dc_context *ctx, +- const struct dc_link *link); ++ const struct dc_link *link, ++ bool boot); + + void dc_helpers_dp_mst_stop_top_mgr( + struct dc_context *ctx, +-- +2.7.4 + |