]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/amd/display: Reset fifo after enable otg
authorXu, Jinze <JinZe.Xu@amd.com>
Thu, 4 Nov 2021 05:47:35 +0000 (13:47 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 22 Nov 2021 19:45:01 +0000 (14:45 -0500)
[Why]
In fast boot sequence, when change dispclk, otg is disabled but digfe
is enabled. This may cause dig fifo error.

[How]
Reset dig fifo after enable otg.

Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Wayne Lin <wayne.lin@amd.com>
Signed-off-by: JinZe.Xu <JinZe.Xu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h

index e7e2aa46218d55551ad551443d77fcbcb1a82dd3..665cf58b07247ba6796d82d940dd35137600edc3 100644 (file)
@@ -1602,6 +1602,11 @@ static enum dc_status apply_single_controller_ctx_to_hw(
                        pipe_ctx->stream_res.stream_enc,
                        pipe_ctx->stream_res.tg->inst);
 
+       if (dc_is_dp_signal(pipe_ctx->stream->signal) &&
+               pipe_ctx->stream_res.stream_enc->funcs->reset_fifo)
+               pipe_ctx->stream_res.stream_enc->funcs->reset_fifo(
+                       pipe_ctx->stream_res.stream_enc);
+
        if (dc_is_dp_signal(pipe_ctx->stream->signal))
                dp_source_sequence_trace(link, DPCD_SOURCE_SEQ_AFTER_CONNECT_DIG_FE_OTG);
 
index b0c08ee6bc2cb316663bde8e5265a36a479785c9..bf4436d7aaab95e8c11c18fa9ca0cd817fa23633 100644 (file)
@@ -902,6 +902,19 @@ void enc1_stream_encoder_stop_dp_info_packets(
 
 }
 
+void enc1_stream_encoder_reset_fifo(
+       struct stream_encoder *enc)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       /* set DIG_START to 0x1 to reset FIFO */
+       REG_UPDATE(DIG_FE_CNTL, DIG_START, 1);
+       udelay(100);
+
+       /* write 0 to take the FIFO out of reset */
+       REG_UPDATE(DIG_FE_CNTL, DIG_START, 0);
+}
+
 void enc1_stream_encoder_dp_blank(
        struct dc_link *link,
        struct stream_encoder *enc)
@@ -1587,6 +1600,8 @@ static const struct stream_encoder_funcs dcn10_str_enc_funcs = {
                enc1_stream_encoder_send_immediate_sdp_message,
        .stop_dp_info_packets =
                enc1_stream_encoder_stop_dp_info_packets,
+       .reset_fifo =
+               enc1_stream_encoder_reset_fifo,
        .dp_blank =
                enc1_stream_encoder_dp_blank,
        .dp_unblank =
index 687d7e4bf7cadd2129b458aaabedaa4d70fbcaa7..a146a41f68e9ef786bbac83da31447d646043060 100644 (file)
@@ -626,6 +626,9 @@ void enc1_stream_encoder_send_immediate_sdp_message(
 void enc1_stream_encoder_stop_dp_info_packets(
        struct stream_encoder *enc);
 
+void enc1_stream_encoder_reset_fifo(
+       struct stream_encoder *enc);
+
 void enc1_stream_encoder_dp_blank(
        struct dc_link *link,
        struct stream_encoder *enc);
index aab25ca8343abe4275fc7aa379cf47210a08592f..8a70f92795c2aa80fbc9f33b13f1c561f1ff2575 100644 (file)
@@ -593,6 +593,8 @@ static const struct stream_encoder_funcs dcn20_str_enc_funcs = {
                enc1_stream_encoder_send_immediate_sdp_message,
        .stop_dp_info_packets =
                enc1_stream_encoder_stop_dp_info_packets,
+       .reset_fifo =
+               enc1_stream_encoder_reset_fifo,
        .dp_blank =
                enc1_stream_encoder_dp_blank,
        .dp_unblank =
index ebd9c35c914f26352e5fc522f972c6e5eed2dd13..7aa9aaf5db4cbb10788288b91fc4ed10f0ae3d3d 100644 (file)
@@ -805,6 +805,8 @@ static const struct stream_encoder_funcs dcn30_str_enc_funcs = {
                enc3_stream_encoder_update_dp_info_packets,
        .stop_dp_info_packets =
                enc1_stream_encoder_stop_dp_info_packets,
+       .reset_fifo =
+               enc1_stream_encoder_reset_fifo,
        .dp_blank =
                enc1_stream_encoder_dp_blank,
        .dp_unblank =
index c88e113b94d1204038b9680f17c35bb8bdfc6c19..073f8b667eff56ab3249d2214e94a9a88b25604c 100644 (file)
@@ -164,6 +164,10 @@ struct stream_encoder_funcs {
        void (*stop_dp_info_packets)(
                struct stream_encoder *enc);
 
+       void (*reset_fifo)(
+               struct stream_encoder *enc
+       );
+
        void (*dp_blank)(
                struct dc_link *link,
                struct stream_encoder *enc);