Commit 4bd8b5f8 authored by Timur Kristóf's avatar Timur Kristóf Committed by Alex Deucher
Browse files

drm/amd/display: Enable DAC in DCE link encoder



Ensure that the DAC output is enabled at the correct time by
moving it to the DCE link encoder similarly to how digital
outputs are enabled.

This also removes the call to DAC1EncoderControl from the DCE
HWSS, which always felt like it was a hacky solution.

Fixes: 0fbe321a ("drm/amd/display: Implement DCE analog link encoders (v2)")
Signed-off-by: default avatarTimur Kristóf <timur.kristof@gmail.com>
Tested-by: default avatarMauro Rossi <issor.oruam@gmail.com>
Reviewed-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent cbced938
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
	.enable_dp_output = dce110_link_encoder_enable_dp_output,
	.enable_dp_mst_output = dce110_link_encoder_enable_dp_mst_output,
	.enable_lvds_output = dce110_link_encoder_enable_lvds_output,
	.enable_analog_output = dce110_link_encoder_enable_analog_output,
	.disable_output = dce110_link_encoder_disable_output,
	.dp_set_lane_settings = dce110_link_encoder_dp_set_lane_settings,
	.dp_set_phy_pattern = dce110_link_encoder_dp_set_phy_pattern,
@@ -1200,6 +1201,22 @@ void dce110_link_encoder_enable_lvds_output(
	}
}

void dce110_link_encoder_enable_analog_output(
	struct link_encoder *enc,
	uint32_t pixel_clock)
{
	struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
	enum bp_result result;

	result = link_dac_encoder_control(enc110, ENCODER_CONTROL_ENABLE, pixel_clock);

	if (result != BP_RESULT_OK) {
		DC_LOG_ERROR("%s: Failed to execute VBIOS command table!\n",
			__func__);
		BREAK_TO_DEBUGGER();
	}
}

/* enables DP PHY output */
void dce110_link_encoder_enable_dp_output(
	struct link_encoder *enc,
@@ -1818,6 +1835,7 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
	.enable_dp_output = dce60_link_encoder_enable_dp_output,
	.enable_dp_mst_output = dce60_link_encoder_enable_dp_mst_output,
	.enable_lvds_output = dce110_link_encoder_enable_lvds_output,
	.enable_analog_output = dce110_link_encoder_enable_analog_output,
	.disable_output = dce110_link_encoder_disable_output,
	.dp_set_lane_settings = dce110_link_encoder_dp_set_lane_settings,
	.dp_set_phy_pattern = dce60_link_encoder_dp_set_phy_pattern,
+5 −0
Original line number Diff line number Diff line
@@ -268,6 +268,11 @@ void dce110_link_encoder_enable_lvds_output(
	enum clock_source_id clock_source,
	uint32_t pixel_clock);

/* enables analog output from the DAC */
void dce110_link_encoder_enable_analog_output(
	struct link_encoder *enc,
	uint32_t pixel_clock);

/* disable PHY output */
void dce110_link_encoder_disable_output(
	struct link_encoder *enc,
+10 −16
Original line number Diff line number Diff line
@@ -660,20 +660,6 @@ void dce110_update_info_frame(struct pipe_ctx *pipe_ctx)
	}
}

static void
dce110_dac_encoder_control(struct pipe_ctx *pipe_ctx, bool enable)
{
	struct dc_link *link = pipe_ctx->stream->link;
	struct dc_bios *bios = link->ctx->dc_bios;
	struct bp_encoder_control encoder_control = {0};

	encoder_control.action = enable ? ENCODER_CONTROL_ENABLE : ENCODER_CONTROL_DISABLE;
	encoder_control.engine_id = link->link_enc->analog_engine;
	encoder_control.pixel_clock = pipe_ctx->stream->timing.pix_clk_100hz / 10;

	bios->funcs->encoder_control(bios, &encoder_control);
}

void dce110_enable_stream(struct pipe_ctx *pipe_ctx)
{
	enum dc_lane_count lane_count =
@@ -704,8 +690,6 @@ void dce110_enable_stream(struct pipe_ctx *pipe_ctx)

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

	if (dc_is_rgb_signal(pipe_ctx->stream->signal))
		dce110_dac_encoder_control(pipe_ctx, true);
}

static enum bp_result link_transmitter_control(
@@ -3277,6 +3261,15 @@ void dce110_enable_tmds_link_output(struct dc_link *link,
	link->phy_state.symclk_state = SYMCLK_ON_TX_ON;
}

static void dce110_enable_analog_link_output(
		struct dc_link *link,
		uint32_t pix_clk_100hz)
{
	link->link_enc->funcs->enable_analog_output(
			link->link_enc,
			pix_clk_100hz);
}

void dce110_enable_dp_link_output(
		struct dc_link *link,
		const struct link_resource *link_res,
@@ -3414,6 +3407,7 @@ static const struct hw_sequencer_funcs dce110_funcs = {
	.enable_lvds_link_output = dce110_enable_lvds_link_output,
	.enable_tmds_link_output = dce110_enable_tmds_link_output,
	.enable_dp_link_output = dce110_enable_dp_link_output,
	.enable_analog_link_output = dce110_enable_analog_link_output,
	.disable_link_output = dce110_disable_link_output,
};

+2 −0
Original line number Diff line number Diff line
@@ -1184,6 +1184,8 @@ struct hw_sequencer_funcs {
			const struct link_resource *link_res,
			enum clock_source_id clock_source,
			uint32_t pixel_clock);
	void (*enable_analog_link_output)(struct dc_link *link,
			uint32_t pixel_clock);
	void (*disable_link_output)(struct dc_link *link,
			const struct link_resource *link_res,
			enum signal_type signal);
+2 −0
Original line number Diff line number Diff line
@@ -132,6 +132,8 @@ struct link_encoder_funcs {
	void (*enable_lvds_output)(struct link_encoder *enc,
		enum clock_source_id clock_source,
		uint32_t pixel_clock);
	void (*enable_analog_output)(struct link_encoder *enc,
		uint32_t pixel_clock);
	void (*disable_output)(struct link_encoder *link_enc,
		enum signal_type signal);
	void (*dp_set_lane_settings)(struct link_encoder *enc,
Loading