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;
+ 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,
--
2.52.0