Commit ab8812a3 authored by Hersen Wu's avatar Hersen Wu Committed by Alex Deucher
Browse files

drm/amd/display: Audio is not switching to DP when HDMI/DP hot plug/unplug

parent 871ffb60
Loading
Loading
Loading
Loading
+75 −25
Original line number Diff line number Diff line
@@ -1732,7 +1732,6 @@ enum dc_status dce110_apply_ctx_to_hw(
	struct dc_bios *dcb = dc->ctx->dc_bios;
	enum dc_status status;
	int i;
	bool programmed_audio_dto = false;
	enum dm_pp_clocks_state clocks_state = DM_PP_CLOCKS_STATE_INVALID;

	/* Reset old context */
@@ -1782,21 +1781,10 @@ enum dc_status dce110_apply_ctx_to_hw(
				context->res_ctx.pool->display_clock,
				context->dispclk_khz * 115 / 100);

	for (i = 0; i < context->res_ctx.pool->pipe_count; i++) {
		struct pipe_ctx *pipe_ctx_old =
					&dc->current_context->res_ctx.pipe_ctx[i];
		struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];

		if (pipe_ctx->stream == NULL)
			continue;

		if (pipe_ctx->stream == pipe_ctx_old->stream)
			continue;

		if (pipe_ctx->top_pipe)
			continue;

		if (context->res_ctx.pipe_ctx[i].audio != NULL) {
	/* program audio wall clock. use HDMI as clock source if HDMI
	 * audio active. Otherwise, use DP as clock source
	 * first, loop to find any HDMI audio, if not, loop find DP audio
	 */
	/* Setup audio rate clock source */
	/* Issue:
	* Audio lag happened on DP monitor when unplug a HDMI monitor
@@ -1812,6 +1800,77 @@ enum dc_status dce110_apply_ctx_to_hw(
	* find first available pipe with audio, setup audio wall DTO per topology
	* instead of per pipe.
	*/
	for (i = 0; i < context->res_ctx.pool->pipe_count; i++) {
		struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];

		if (pipe_ctx->stream == NULL)
			continue;

		if (pipe_ctx->top_pipe)
			continue;

		if (pipe_ctx->stream->signal != SIGNAL_TYPE_HDMI_TYPE_A)
			continue;

		if (pipe_ctx->audio != NULL) {
			struct audio_output audio_output;

			build_audio_output(pipe_ctx, &audio_output);

			pipe_ctx->audio->funcs->wall_dto_setup(
				pipe_ctx->audio,
				pipe_ctx->stream->signal,
				&audio_output.crtc_info,
				&audio_output.pll_info);
			break;
		}
	}

	/* no HDMI audio is found, try DP audio */
	if (i == context->res_ctx.pool->pipe_count) {
		for (i = 0; i < context->res_ctx.pool->pipe_count; i++) {
			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];

			if (pipe_ctx->stream == NULL)
				continue;

			if (pipe_ctx->top_pipe)
				continue;

			if (!dc_is_dp_signal(pipe_ctx->stream->signal))
				continue;

			if (pipe_ctx->audio != NULL) {
				struct audio_output audio_output;

				build_audio_output(pipe_ctx, &audio_output);

				pipe_ctx->audio->funcs->wall_dto_setup(
					pipe_ctx->audio,
					pipe_ctx->stream->signal,
					&audio_output.crtc_info,
					&audio_output.pll_info);
				break;
			}
		}
	}

	for (i = 0; i < context->res_ctx.pool->pipe_count; i++) {
		struct pipe_ctx *pipe_ctx_old =
					&dc->current_context->res_ctx.pipe_ctx[i];
		struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];

		if (pipe_ctx->stream == NULL)
			continue;

		if (pipe_ctx->stream == pipe_ctx_old->stream)
			continue;

		if (pipe_ctx->top_pipe)
			continue;

		if (context->res_ctx.pipe_ctx[i].audio != NULL) {

			struct audio_output audio_output;

			build_audio_output(pipe_ctx, &audio_output);
@@ -1833,15 +1892,6 @@ enum dc_status dce110_apply_ctx_to_hw(
					pipe_ctx->stream->signal,
					&audio_output.crtc_info,
					&pipe_ctx->stream->public.audio_info);

			if (!programmed_audio_dto) {
				pipe_ctx->audio->funcs->wall_dto_setup(
					pipe_ctx->audio,
					pipe_ctx->stream->signal,
					&audio_output.crtc_info,
					&audio_output.pll_info);
				programmed_audio_dto = true;
			}
		}

		status = apply_single_controller_ctx_to_hw(