Commit c9beecc5 authored by Jimmy Kizito's avatar Jimmy Kizito Committed by Alex Deucher
Browse files

drm/amd/display: Add work around for tunneled MST.



[Why]
Certain USB4 docks do not seem to be able to handle disabling
DSC once it has been enabled on an MST stream. This can result
in blank displays.

[How]
As a work around, always enable DSC on docks exhibiting this issue. The
flag to indicate the use of DSC for MST streams on a USB4 dock is set
during detection of the dock and only cleared when the USB4 dock is
disconnected.

Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarJimmy Kizito <Jimmy.Kizito@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5ceaebcd
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -758,6 +758,18 @@ static bool detect_dp(struct dc_link *link,
			dal_ddc_service_set_transaction_type(link->ddc,
							     sink_caps->transaction_type);

#if defined(CONFIG_DRM_AMD_DC_DCN)
			/* Apply work around for tunneled MST on certain USB4 docks. Always use DSC if dock
			 * reports DSC support.
			 */
			if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA &&
					link->type == dc_connection_mst_branch &&
					link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 &&
					link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT &&
					!link->dc->debug.dpia_debug.bits.disable_mst_dsc_work_around)
				link->wa_flags.dpia_mst_dsc_always_on = true;
#endif

#if defined(CONFIG_DRM_AMD_DC_HDCP)
			/* In case of fallback to SST when topology discovery below fails
			 * HDCP caps will be querried again later by the upper layer (caller
@@ -1203,6 +1215,10 @@ static bool dc_link_detect_helper(struct dc_link *link,
			LINK_INFO("link=%d, mst branch is now Disconnected\n",
				  link->link_index);

			/* Disable work around which keeps DSC on for tunneled MST on certain USB4 docks. */
			if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA)
				link->wa_flags.dpia_mst_dsc_always_on = false;

			dm_helpers_dp_mst_stop_top_mgr(link->ctx, link);

			link->mst_stream_alloc_table.stream_count = 0;
+10 −10
Original line number Diff line number Diff line
@@ -2256,16 +2256,6 @@ enum dc_status dc_validate_global_state(

	if (!new_ctx)
		return DC_ERROR_UNEXPECTED;
#if defined(CONFIG_DRM_AMD_DC_DCN)

	/*
	 * Update link encoder to stream assignment.
	 * TODO: Split out reason allocation from validation.
	 */
	if (dc->res_pool->funcs->link_encs_assign && fast_validate == false)
		dc->res_pool->funcs->link_encs_assign(
			dc, new_ctx, new_ctx->streams, new_ctx->stream_count);
#endif

	if (dc->res_pool->funcs->validate_global) {
		result = dc->res_pool->funcs->validate_global(dc, new_ctx);
@@ -2317,6 +2307,16 @@ enum dc_status dc_validate_global_state(
		if (!dc->res_pool->funcs->validate_bandwidth(dc, new_ctx, fast_validate))
			result = DC_FAIL_BANDWIDTH_VALIDATE;

#if defined(CONFIG_DRM_AMD_DC_DCN)
	/*
	 * Only update link encoder to stream assignment after bandwidth validation passed.
	 * TODO: Split out assignment and validation.
	 */
	if (result == DC_OK && dc->res_pool->funcs->link_encs_assign && fast_validate == false)
		dc->res_pool->funcs->link_encs_assign(
			dc, new_ctx, new_ctx->streams, new_ctx->stream_count);
#endif

	return result;
}

+2 −1
Original line number Diff line number Diff line
@@ -508,7 +508,8 @@ union dpia_debug_options {
		uint32_t disable_dpia:1;
		uint32_t force_non_lttpr:1;
		uint32_t extend_aux_rd_interval:1;
		uint32_t reserved:29;
		uint32_t disable_mst_dsc_work_around:1;
		uint32_t reserved:28;
	} bits;
	uint32_t raw;
};
+2 −0
Original line number Diff line number Diff line
@@ -191,6 +191,8 @@ struct dc_link {
		bool dp_skip_DID2;
		bool dp_skip_reset_segment;
		bool dp_mot_reset_segment;
		/* Some USB4 docks do not handle turning off MST DSC once it has been enabled. */
		bool dpia_mst_dsc_always_on;
	} wa_flags;
	struct link_mst_stream_allocation_table mst_stream_alloc_table;