Commit 14e2739c authored by Wenjing Liu's avatar Wenjing Liu Committed by Alex Deucher
Browse files

drm/amd/display: refactor enable/disable audio stream hw sequence



[why]
1. As recommended by hardware team, don't enable APG when stream is not
   enabled.
2. Move audio stream encoder programming into link_hwss.

[how]
1. Merge dp_audio_enable into enable audio stream hw sequence.
2. Move stream encoder programming into link hwss level to unify stream
   encoder programming interface.

Tested-by: default avatarMark Broadworth <mark.broadworth@amd.com>
Reviewed-by: default avatarCharlene Liu <Charlene.Liu@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent bbfbf09d
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -4229,6 +4229,7 @@ static void fpga_dp_hpo_enable_link_and_stream(struct dc_state *state, struct pi
		link_hwss->ext.set_throttled_vcp_size(pipe_ctx, avg_time_slots_per_mtp);

	dc->hwss.unblank_stream(pipe_ctx, &stream->link->cur_link_settings);
	dc->hwss.enable_audio_stream(pipe_ctx);
}

void core_link_enable_stream(
@@ -4308,11 +4309,8 @@ void core_link_enable_stream(
			/* Still enable stream features & audio on seamless boot for DP external displays */
			if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT) {
				enable_stream_features(pipe_ctx);
				if (pipe_ctx->stream_res.audio != NULL) {
					pipe_ctx->stream_res.stream_enc->funcs->dp_audio_enable(pipe_ctx->stream_res.stream_enc);
				dc->hwss.enable_audio_stream(pipe_ctx);
			}
			}

#if defined(CONFIG_DRM_AMD_DC_HDCP)
			update_psp_stream_config(pipe_ctx, false);
+1 −13
Original line number Diff line number Diff line
@@ -7339,19 +7339,7 @@ void dp_retrain_link_dp_test(struct dc_link *link,
			link->dc->hwss.unblank_stream(&pipes[i],
					link_setting);

			if (pipes[i].stream_res.audio) {
				/* notify audio driver for
				 * audio modes of monitor */
				pipes[i].stream_res.audio->funcs->az_enable(
						pipes[i].stream_res.audio);

				/* un-mute audio */
				/* TODO: audio should be per stream rather than
				 * per link */
				pipes[i].stream_res.stream_enc->funcs->
				audio_mute_control(
					pipes[i].stream_res.stream_enc, false);
			}
			link->dc->hwss.enable_audio_stream(&pipes[i]);
		}
	}
}
+9 −41
Original line number Diff line number Diff line
@@ -688,16 +688,6 @@ void dce110_enable_stream(struct pipe_ctx *pipe_ctx)
		early_control = lane_count;

	tg->funcs->set_early_control(tg, early_control);

	/* enable audio only within mode set */
	if (pipe_ctx->stream_res.audio != NULL) {
		if (dc_is_dp_signal(pipe_ctx->stream->signal))
			pipe_ctx->stream_res.stream_enc->funcs->dp_audio_enable(pipe_ctx->stream_res.stream_enc);
	}




}

static enum bp_result link_transmitter_control(
@@ -1081,12 +1071,14 @@ void dce110_enable_audio_stream(struct pipe_ctx *pipe_ctx)
	struct dc *dc;
	struct clk_mgr *clk_mgr;
	unsigned int i, num_audio = 1;
	const struct link_hwss *link_hwss;

	if (!pipe_ctx->stream)
		return;

	dc = pipe_ctx->stream->ctx->dc;
	clk_mgr = dc->clk_mgr;
	link_hwss = get_link_hwss(pipe_ctx->stream->link, &pipe_ctx->link_res);

	if (pipe_ctx->stream_res.audio && pipe_ctx->stream_res.audio->enabled == true)
		return;
@@ -1103,56 +1095,35 @@ void dce110_enable_audio_stream(struct pipe_ctx *pipe_ctx)
		if (num_audio >= 1 && clk_mgr->funcs->enable_pme_wa)
			/*this is the first audio. apply the PME w/a in order to wake AZ from D3*/
			clk_mgr->funcs->enable_pme_wa(clk_mgr);
		/* un-mute audio */
		/* TODO: audio should be per stream rather than per link */
		if (is_dp_128b_132b_signal(pipe_ctx))
			pipe_ctx->stream_res.hpo_dp_stream_enc->funcs->audio_mute_control(
					pipe_ctx->stream_res.hpo_dp_stream_enc, false);
		else
			pipe_ctx->stream_res.stream_enc->funcs->audio_mute_control(
					pipe_ctx->stream_res.stream_enc, false);

		link_hwss->enable_audio_packet(pipe_ctx);

		if (pipe_ctx->stream_res.audio)
			pipe_ctx->stream_res.audio->enabled = true;
	}

	if (dc_is_dp_signal(pipe_ctx->stream->signal))
		dp_source_sequence_trace(pipe_ctx->stream->link, DPCD_SOURCE_SEQ_AFTER_ENABLE_AUDIO_STREAM);
}

void dce110_disable_audio_stream(struct pipe_ctx *pipe_ctx)
{
	struct dc *dc;
	struct clk_mgr *clk_mgr;
	const struct link_hwss *link_hwss;

	if (!pipe_ctx || !pipe_ctx->stream)
		return;

	dc = pipe_ctx->stream->ctx->dc;
	clk_mgr = dc->clk_mgr;
	link_hwss = get_link_hwss(pipe_ctx->stream->link, &pipe_ctx->link_res);

	if (pipe_ctx->stream_res.audio && pipe_ctx->stream_res.audio->enabled == false)
		return;

	if (is_dp_128b_132b_signal(pipe_ctx))
		pipe_ctx->stream_res.hpo_dp_stream_enc->funcs->audio_mute_control(
				pipe_ctx->stream_res.hpo_dp_stream_enc, true);
	else
		pipe_ctx->stream_res.stream_enc->funcs->audio_mute_control(
				pipe_ctx->stream_res.stream_enc, true);
	link_hwss->disable_audio_packet(pipe_ctx);

	if (pipe_ctx->stream_res.audio) {
		pipe_ctx->stream_res.audio->enabled = false;

		if (dc_is_dp_signal(pipe_ctx->stream->signal))
			if (is_dp_128b_132b_signal(pipe_ctx))
				pipe_ctx->stream_res.hpo_dp_stream_enc->funcs->dp_audio_disable(
						pipe_ctx->stream_res.hpo_dp_stream_enc);
			else
				pipe_ctx->stream_res.stream_enc->funcs->dp_audio_disable(
						pipe_ctx->stream_res.stream_enc);
		else
			pipe_ctx->stream_res.stream_enc->funcs->hdmi_audio_disable(
					pipe_ctx->stream_res.stream_enc);

		if (clk_mgr->funcs->enable_pme_wa)
			/*this is the first audio. apply the PME w/a in order to wake AZ from D3*/
			clk_mgr->funcs->enable_pme_wa(clk_mgr);
@@ -1163,9 +1134,6 @@ void dce110_disable_audio_stream(struct pipe_ctx *pipe_ctx)
		 * stream->stream_engine_id);
		 */
	}

	if (dc_is_dp_signal(pipe_ctx->stream->signal))
		dp_source_sequence_trace(pipe_ctx->stream->link, DPCD_SOURCE_SEQ_AFTER_DISABLE_AUDIO_STREAM);
}

void dce110_disable_stream(struct pipe_ctx *pipe_ctx)
+0 −8
Original line number Diff line number Diff line
@@ -2601,14 +2601,6 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx)

	if (dc->hwseq->funcs.set_pixels_per_cycle)
		dc->hwseq->funcs.set_pixels_per_cycle(pipe_ctx);

	/* enable audio only within mode set */
	if (pipe_ctx->stream_res.audio != NULL) {
		if (is_dp_128b_132b_signal(pipe_ctx))
			pipe_ctx->stream_res.hpo_dp_stream_enc->funcs->dp_audio_enable(pipe_ctx->stream_res.hpo_dp_stream_enc);
		else if (dc_is_dp_signal(pipe_ctx->stream->signal))
			pipe_ctx->stream_res.stream_enc->funcs->dp_audio_enable(pipe_ctx->stream_res.stream_enc);
	}
}

void dcn20_program_dmdata_engine(struct pipe_ctx *pipe_ctx)
+0 −2
Original line number Diff line number Diff line
@@ -134,8 +134,6 @@ static void apg31_se_audio_setup(

	/* Disable forced mem power off */
	REG_UPDATE(APG_MEM_PWR, APG_MEM_PWR_FORCE, 0);

	apg31_enable(apg);
}

static void apg31_audio_mute_control(
Loading