]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
drm/amd/display: Enable DAC in DCE link encoder
authorTimur Kristóf <timur.kristof@gmail.com>
Mon, 2 Feb 2026 11:25:07 +0000 (12:25 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 19 Feb 2026 17:16:12 +0000 (12:16 -0500)
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: 0fbe321a93ce ("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>
drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
drivers/gpu/drm/amd/display/dc/link/link_dpms.c

index 8903bdb89c661eac02cf6e92b026a638375ccd32..2ba3d3a3aac5811f3dbc4e0f8ac35cab661a8e9e 100644 (file)
@@ -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,
index 9ba533aa6f88cf23f1c90762db38aa0cd131ab7b..f853e3c3fc755677d66dc9e371be6621a8125e06 100644 (file)
@@ -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,
index b4a7e2fc7c2b093bc98bfc9cc54002d482cc00bc..699a756bbc40512aee3bf5d4dec541f2d2c7966d 100644 (file)
@@ -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,
 };
 
index 51b0f0fd8fcdf207e81db6e6bcffb3849158e8f0..4632a5761b169de842dadf4f2e43242e6897becb 100644 (file)
@@ -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);
index d795fc43dc9d9c7068898301213aa56aa062c94f..5abbf485d273ec7ae3e24ed460eaedb7cc469efd 100644 (file)
@@ -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,
index 91742bde4dc28813a4abda12dfc9148d324d42e5..9b1d34c3438b2fe5017fbcbab75352a02044e209 100644 (file)
@@ -2155,6 +2155,18 @@ static enum dc_status enable_link_dp_mst(
        return enable_link_dp(state, pipe_ctx);
 }
 
+static enum dc_status enable_link_analog(
+               struct dc_state *state,
+               struct pipe_ctx *pipe_ctx)
+{
+       struct dc_link *link = pipe_ctx->stream->link;
+
+       link->dc->hwss.enable_analog_link_output(
+               link, pipe_ctx->stream->timing.pix_clk_100hz);
+
+       return DC_OK;
+}
+
 static enum dc_status enable_link_virtual(struct pipe_ctx *pipe_ctx)
 {
        struct dc_link *link = pipe_ctx->stream->link;
@@ -2210,7 +2222,7 @@ static enum dc_status enable_link(
                status = DC_OK;
                break;
        case SIGNAL_TYPE_RGB:
-               status = DC_OK;
+               status = enable_link_analog(state, pipe_ctx);
                break;
        case SIGNAL_TYPE_VIRTUAL:
                status = enable_link_virtual(pipe_ctx);