Skip to content

Commit 37acc30

Browse files
Timur Kristófgregkh
authored andcommitted
drm/amd/display: Enable DAC in DCE link encoder
[ Upstream commit 4bd8b5f ] 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: 0fbe321 ("drm/amd/display: Implement DCE analog link encoders (v2)") Signed-off-by: Timur Kristóf <timur.kristof@gmail.com> Tested-by: Mauro Rossi <issor.oruam@gmail.com> Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 4f8c4b7 commit 37acc30

6 files changed

Lines changed: 50 additions & 17 deletions

File tree

drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
102102
.enable_dp_output = dce110_link_encoder_enable_dp_output,
103103
.enable_dp_mst_output = dce110_link_encoder_enable_dp_mst_output,
104104
.enable_lvds_output = dce110_link_encoder_enable_lvds_output,
105+
.enable_analog_output = dce110_link_encoder_enable_analog_output,
105106
.disable_output = dce110_link_encoder_disable_output,
106107
.dp_set_lane_settings = dce110_link_encoder_dp_set_lane_settings,
107108
.dp_set_phy_pattern = dce110_link_encoder_dp_set_phy_pattern,
@@ -1192,6 +1193,22 @@ void dce110_link_encoder_enable_lvds_output(
11921193
}
11931194
}
11941195

1196+
void dce110_link_encoder_enable_analog_output(
1197+
struct link_encoder *enc,
1198+
uint32_t pixel_clock)
1199+
{
1200+
struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
1201+
enum bp_result result;
1202+
1203+
result = link_dac_encoder_control(enc110, ENCODER_CONTROL_ENABLE, pixel_clock);
1204+
1205+
if (result != BP_RESULT_OK) {
1206+
DC_LOG_ERROR("%s: Failed to execute VBIOS command table!\n",
1207+
__func__);
1208+
BREAK_TO_DEBUGGER();
1209+
}
1210+
}
1211+
11951212
/* enables DP PHY output */
11961213
void dce110_link_encoder_enable_dp_output(
11971214
struct link_encoder *enc,
@@ -1776,6 +1793,7 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
17761793
.enable_dp_output = dce60_link_encoder_enable_dp_output,
17771794
.enable_dp_mst_output = dce60_link_encoder_enable_dp_mst_output,
17781795
.enable_lvds_output = dce110_link_encoder_enable_lvds_output,
1796+
.enable_analog_output = dce110_link_encoder_enable_analog_output,
17791797
.disable_output = dce110_link_encoder_disable_output,
17801798
.dp_set_lane_settings = dce110_link_encoder_dp_set_lane_settings,
17811799
.dp_set_phy_pattern = dce60_link_encoder_dp_set_phy_pattern,

drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ void dce110_link_encoder_enable_lvds_output(
273273
enum clock_source_id clock_source,
274274
uint32_t pixel_clock);
275275

276+
/* enables analog output from the DAC */
277+
void dce110_link_encoder_enable_analog_output(
278+
struct link_encoder *enc,
279+
uint32_t pixel_clock);
280+
276281
/* disable PHY output */
277282
void dce110_link_encoder_disable_output(
278283
struct link_encoder *enc,

drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -659,20 +659,6 @@ void dce110_update_info_frame(struct pipe_ctx *pipe_ctx)
659659
}
660660
}
661661

662-
static void
663-
dce110_dac_encoder_control(struct pipe_ctx *pipe_ctx, bool enable)
664-
{
665-
struct dc_link *link = pipe_ctx->stream->link;
666-
struct dc_bios *bios = link->ctx->dc_bios;
667-
struct bp_encoder_control encoder_control = {0};
668-
669-
encoder_control.action = enable ? ENCODER_CONTROL_ENABLE : ENCODER_CONTROL_DISABLE;
670-
encoder_control.engine_id = link->link_enc->analog_engine;
671-
encoder_control.pixel_clock = pipe_ctx->stream->timing.pix_clk_100hz / 10;
672-
673-
bios->funcs->encoder_control(bios, &encoder_control);
674-
}
675-
676662
void dce110_enable_stream(struct pipe_ctx *pipe_ctx)
677663
{
678664
enum dc_lane_count lane_count =
@@ -703,8 +689,6 @@ void dce110_enable_stream(struct pipe_ctx *pipe_ctx)
703689

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

706-
if (dc_is_rgb_signal(pipe_ctx->stream->signal))
707-
dce110_dac_encoder_control(pipe_ctx, true);
708692
}
709693

710694
static enum bp_result link_transmitter_control(
@@ -3285,6 +3269,15 @@ void dce110_enable_tmds_link_output(struct dc_link *link,
32853269
link->phy_state.symclk_state = SYMCLK_ON_TX_ON;
32863270
}
32873271

3272+
static void dce110_enable_analog_link_output(
3273+
struct dc_link *link,
3274+
uint32_t pix_clk_100hz)
3275+
{
3276+
link->link_enc->funcs->enable_analog_output(
3277+
link->link_enc,
3278+
pix_clk_100hz);
3279+
}
3280+
32883281
void dce110_enable_dp_link_output(
32893282
struct dc_link *link,
32903283
const struct link_resource *link_res,
@@ -3422,6 +3415,7 @@ static const struct hw_sequencer_funcs dce110_funcs = {
34223415
.enable_lvds_link_output = dce110_enable_lvds_link_output,
34233416
.enable_tmds_link_output = dce110_enable_tmds_link_output,
34243417
.enable_dp_link_output = dce110_enable_dp_link_output,
3418+
.enable_analog_link_output = dce110_enable_analog_link_output,
34253419
.disable_link_output = dce110_disable_link_output,
34263420
};
34273421

drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,8 @@ struct hw_sequencer_funcs {
11841184
const struct link_resource *link_res,
11851185
enum clock_source_id clock_source,
11861186
uint32_t pixel_clock);
1187+
void (*enable_analog_link_output)(struct dc_link *link,
1188+
uint32_t pixel_clock);
11871189
void (*disable_link_output)(struct dc_link *link,
11881190
const struct link_resource *link_res,
11891191
enum signal_type signal);

drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ struct link_encoder_funcs {
130130
void (*enable_lvds_output)(struct link_encoder *enc,
131131
enum clock_source_id clock_source,
132132
uint32_t pixel_clock);
133+
void (*enable_analog_output)(struct link_encoder *enc,
134+
uint32_t pixel_clock);
133135
void (*disable_output)(struct link_encoder *link_enc,
134136
enum signal_type signal);
135137
void (*dp_set_lane_settings)(struct link_encoder *enc,

drivers/gpu/drm/amd/display/dc/link/link_dpms.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2208,6 +2208,18 @@ static enum dc_status enable_link_dp_mst(
22082208
return enable_link_dp(state, pipe_ctx);
22092209
}
22102210

2211+
static enum dc_status enable_link_analog(
2212+
struct dc_state *state,
2213+
struct pipe_ctx *pipe_ctx)
2214+
{
2215+
struct dc_link *link = pipe_ctx->stream->link;
2216+
2217+
link->dc->hwss.enable_analog_link_output(
2218+
link, pipe_ctx->stream->timing.pix_clk_100hz);
2219+
2220+
return DC_OK;
2221+
}
2222+
22112223
static enum dc_status enable_link_virtual(struct pipe_ctx *pipe_ctx)
22122224
{
22132225
struct dc_link *link = pipe_ctx->stream->link;
@@ -2263,7 +2275,7 @@ static enum dc_status enable_link(
22632275
status = DC_OK;
22642276
break;
22652277
case SIGNAL_TYPE_RGB:
2266-
status = DC_OK;
2278+
status = enable_link_analog(state, pipe_ctx);
22672279
break;
22682280
case SIGNAL_TYPE_VIRTUAL:
22692281
status = enable_link_virtual(pipe_ctx);

0 commit comments

Comments
 (0)