Skip to content

Commit 4bd8b5f

Browse files
Timur Kristófalexdeucher
authored andcommitted
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: 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>
1 parent cbced93 commit 4bd8b5f

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,
@@ -1200,6 +1201,22 @@ void dce110_link_encoder_enable_lvds_output(
12001201
}
12011202
}
12021203

1204+
void dce110_link_encoder_enable_analog_output(
1205+
struct link_encoder *enc,
1206+
uint32_t pixel_clock)
1207+
{
1208+
struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
1209+
enum bp_result result;
1210+
1211+
result = link_dac_encoder_control(enc110, ENCODER_CONTROL_ENABLE, pixel_clock);
1212+
1213+
if (result != BP_RESULT_OK) {
1214+
DC_LOG_ERROR("%s: Failed to execute VBIOS command table!\n",
1215+
__func__);
1216+
BREAK_TO_DEBUGGER();
1217+
}
1218+
}
1219+
12031220
/* enables DP PHY output */
12041221
void dce110_link_encoder_enable_dp_output(
12051222
struct link_encoder *enc,
@@ -1818,6 +1835,7 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
18181835
.enable_dp_output = dce60_link_encoder_enable_dp_output,
18191836
.enable_dp_mst_output = dce60_link_encoder_enable_dp_mst_output,
18201837
.enable_lvds_output = dce110_link_encoder_enable_lvds_output,
1838+
.enable_analog_output = dce110_link_encoder_enable_analog_output,
18211839
.disable_output = dce110_link_encoder_disable_output,
18221840
.dp_set_lane_settings = dce110_link_encoder_dp_set_lane_settings,
18231841
.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
@@ -268,6 +268,11 @@ void dce110_link_encoder_enable_lvds_output(
268268
enum clock_source_id clock_source,
269269
uint32_t pixel_clock);
270270

271+
/* enables analog output from the DAC */
272+
void dce110_link_encoder_enable_analog_output(
273+
struct link_encoder *enc,
274+
uint32_t pixel_clock);
275+
271276
/* disable PHY output */
272277
void dce110_link_encoder_disable_output(
273278
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
@@ -660,20 +660,6 @@ void dce110_update_info_frame(struct pipe_ctx *pipe_ctx)
660660
}
661661
}
662662

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

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

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

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

3264+
static void dce110_enable_analog_link_output(
3265+
struct dc_link *link,
3266+
uint32_t pix_clk_100hz)
3267+
{
3268+
link->link_enc->funcs->enable_analog_output(
3269+
link->link_enc,
3270+
pix_clk_100hz);
3271+
}
3272+
32803273
void dce110_enable_dp_link_output(
32813274
struct dc_link *link,
32823275
const struct link_resource *link_res,
@@ -3414,6 +3407,7 @@ static const struct hw_sequencer_funcs dce110_funcs = {
34143407
.enable_lvds_link_output = dce110_enable_lvds_link_output,
34153408
.enable_tmds_link_output = dce110_enable_tmds_link_output,
34163409
.enable_dp_link_output = dce110_enable_dp_link_output,
3410+
.enable_analog_link_output = dce110_enable_analog_link_output,
34173411
.disable_link_output = dce110_disable_link_output,
34183412
};
34193413

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
@@ -132,6 +132,8 @@ struct link_encoder_funcs {
132132
void (*enable_lvds_output)(struct link_encoder *enc,
133133
enum clock_source_id clock_source,
134134
uint32_t pixel_clock);
135+
void (*enable_analog_output)(struct link_encoder *enc,
136+
uint32_t pixel_clock);
135137
void (*disable_output)(struct link_encoder *link_enc,
136138
enum signal_type signal);
137139
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
@@ -2155,6 +2155,18 @@ static enum dc_status enable_link_dp_mst(
21552155
return enable_link_dp(state, pipe_ctx);
21562156
}
21572157

2158+
static enum dc_status enable_link_analog(
2159+
struct dc_state *state,
2160+
struct pipe_ctx *pipe_ctx)
2161+
{
2162+
struct dc_link *link = pipe_ctx->stream->link;
2163+
2164+
link->dc->hwss.enable_analog_link_output(
2165+
link, pipe_ctx->stream->timing.pix_clk_100hz);
2166+
2167+
return DC_OK;
2168+
}
2169+
21582170
static enum dc_status enable_link_virtual(struct pipe_ctx *pipe_ctx)
21592171
{
21602172
struct dc_link *link = pipe_ctx->stream->link;
@@ -2210,7 +2222,7 @@ static enum dc_status enable_link(
22102222
status = DC_OK;
22112223
break;
22122224
case SIGNAL_TYPE_RGB:
2213-
status = DC_OK;
2225+
status = enable_link_analog(state, pipe_ctx);
22142226
break;
22152227
case SIGNAL_TYPE_VIRTUAL:
22162228
status = enable_link_virtual(pipe_ctx);

0 commit comments

Comments
 (0)