On Mon, Dec 8, 2025 at 10:21 AM <[email protected]> wrote:
>
> On Sat, 2025-12-06 at 03:31 +0100, Timur Kristóf wrote:
> > Just like for other signal types, call the encoder control
> > command in the VBIOS to setup the DAC encoder.
> > The DAC doesn't work well without this on some GPUs,
> > for example the Radeon HD 7790 needs this.
> >
> > Fixes: 7d63519cd9ca ("drm/amd/display: Add concept of analog encoders
> > (v2)")
> > Signed-off-by: Timur Kristóf <[email protected]>
> > ---
> > .../amd/display/dc/dce/dce_stream_encoder.c | 25
> > ++++++++++++++++++-
> > .../amd/display/dc/inc/hw/stream_encoder.h | 4 +++
> > .../amd/display/dc/link/hwss/link_hwss_dio.c | 4 +++
> > 3 files changed, 32 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
> > b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
> > index 574618d5d4a4..1fbf6263c235 100644
> > --- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
> > +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
> > @@ -693,6 +693,24 @@ static void
> > dce110_stream_encoder_lvds_set_stream_attribute(
> > ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
> > }
> >
> > +static void dce110_stream_encoder_analog_set_stream_attribute(
> > + struct stream_encoder *enc,
> > + struct dc_crtc_timing *crtc_timing)
> > +{
> > + struct dce110_stream_encoder *enc110 =
> > DCE110STRENC_FROM_STRENC(enc);
> > + struct bp_encoder_control cntl = {0};
> > +
> > + cntl.action = ENCODER_CONTROL_SETUP;
> > + cntl.engine_id = enc110->base.id;
>
> Found a mistake here.
> This should use the analog_id added in the previous patch.
The series looks good to me. Do you want to resend with this fixed?
I'll apply it.
Thanks,
Alex
>
> > + cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
> > +
> > + if (enc110->base.bp->funcs->encoder_control(
> > + enc110->base.bp, &cntl) != BP_RESULT_OK)
> > + return;
> > +
> > + ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
> > +}
> > +
> > static void dce110_stream_encoder_set_throttled_vcp_size(
> > struct stream_encoder *enc,
> > struct fixed31_32 avg_time_slots_per_mtp)
> > @@ -1521,6 +1539,8 @@ static const struct stream_encoder_funcs
> > dce110_str_enc_funcs = {
> > dce110_stream_encoder_dvi_set_stream_attribute,
> > .lvds_set_stream_attribute =
> > dce110_stream_encoder_lvds_set_stream_attribute,
> > + .analog_set_stream_attribute =
> > + dce110_stream_encoder_analog_set_stream_attribute,
> > .set_throttled_vcp_size =
> > dce110_stream_encoder_set_throttled_vcp_size,
> > .update_hdmi_info_packets =
> > @@ -1568,7 +1588,10 @@ void dce110_stream_encoder_construct(
> > enc110->se_mask = se_mask;
> > }
> >
> > -static const struct stream_encoder_funcs dce110_an_str_enc_funcs =
> > {};
> > +static const struct stream_encoder_funcs dce110_an_str_enc_funcs = {
> > + .analog_set_stream_attribute =
> > + dce110_stream_encoder_analog_set_stream_attribute,
> > +};
> >
> > void dce110_analog_stream_encoder_construct(
> > struct dce110_stream_encoder *enc110,
> > diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
> > b/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
> > index 27f950ae45ee..9658b06f32f7 100644
> > --- a/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
> > +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
> > @@ -153,6 +153,10 @@ struct stream_encoder_funcs {
> > struct stream_encoder *enc,
> > struct dc_crtc_timing *crtc_timing);
> >
> > + void (*analog_set_stream_attribute)(
> > + struct stream_encoder *enc,
> > + struct dc_crtc_timing *crtc_timing);
> > +
> > void (*set_throttled_vcp_size)(
> > struct stream_encoder *enc,
> > struct fixed31_32 avg_time_slots_per_mtp);
> > diff --git a/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c
> > b/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c
> > index befa67b2b2ae..90ff4fdd79b7 100644
> > --- a/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c
> > +++ b/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c
> > @@ -148,6 +148,10 @@ void setup_dio_stream_attribute(struct pipe_ctx
> > *pipe_ctx)
> > stream_encoder->funcs->lvds_set_stream_attribute(
> > stream_encoder,
> > &stream->timing);
> > + else if (dc_is_rgb_signal(stream->signal))
> > + stream_encoder->funcs->analog_set_stream_attribute(
> > + stream_encoder,
> > + &stream->timing);
> >
> > if (dc_is_dp_signal(stream->signal))
> > link->dc->link_srv->dp_trace_source_sequence(link,