OSDN Git Service

drm/amd/display: add helper for enabling mst stream features
authorBing Guo <bing.guo@amd.com>
Mon, 5 Apr 2021 20:51:24 +0000 (16:51 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 21 Apr 2021 01:42:53 +0000 (21:42 -0400)
[Why]
Some MST devices uses different method to enable mst
specific stream features.

[How]
Add dm_helpers_mst_enable_stream features. This can be
modified later when we are ready to implement those features.

Signed-off-by: Bing Guo <bing.guo@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/dm_helpers.h

index 103e299..e8b325a 100644 (file)
@@ -711,3 +711,28 @@ bool dm_helpers_dmub_outbox0_interrupt_control(struct dc_context *ctx, bool enab
                         enable ? "en" : "dis", ret);
        return ret;
 }
+
+void dm_helpers_mst_enable_stream_features(const struct dc_stream_state *stream)
+{
+       /* TODO: virtual DPCD */
+       struct dc_link *link = stream->link;
+       union down_spread_ctrl old_downspread;
+       union down_spread_ctrl new_downspread;
+
+       if (link->aux_access_disabled)
+               return;
+
+       if (!dm_helpers_dp_read_dpcd(link->ctx, link, DP_DOWNSPREAD_CTRL,
+                                    &old_downspread.raw,
+                                    sizeof(old_downspread)))
+               return;
+
+       new_downspread.raw = old_downspread.raw;
+       new_downspread.bits.IGNORE_MSA_TIMING_PARAM =
+               (stream->ignore_msa_timing_param) ? 1 : 0;
+
+       if (new_downspread.raw != old_downspread.raw)
+               dm_helpers_dp_write_dpcd(link->ctx, link, DP_DOWNSPREAD_CTRL,
+                                        &new_downspread.raw,
+                                        sizeof(new_downspread));
+}
index fa38492..f4374d8 100644 (file)
@@ -1679,21 +1679,27 @@ void link_destroy(struct dc_link **link)
 static void enable_stream_features(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->link;
-       union down_spread_ctrl old_downspread;
-       union down_spread_ctrl new_downspread;
 
-       core_link_read_dpcd(link, DP_DOWNSPREAD_CTRL,
-                       &old_downspread.raw, sizeof(old_downspread));
+       if (pipe_ctx->stream->signal != SIGNAL_TYPE_DISPLAY_PORT_MST) {
+               struct dc_link *link = stream->link;
+               union down_spread_ctrl old_downspread;
+               union down_spread_ctrl new_downspread;
+
+               core_link_read_dpcd(link, DP_DOWNSPREAD_CTRL,
+                               &old_downspread.raw, sizeof(old_downspread));
 
-       new_downspread.raw = old_downspread.raw;
+               new_downspread.raw = old_downspread.raw;
 
-       new_downspread.bits.IGNORE_MSA_TIMING_PARAM =
-                       (stream->ignore_msa_timing_param) ? 1 : 0;
+               new_downspread.bits.IGNORE_MSA_TIMING_PARAM =
+                               (stream->ignore_msa_timing_param) ? 1 : 0;
 
-       if (new_downspread.raw != old_downspread.raw) {
-               core_link_write_dpcd(link, DP_DOWNSPREAD_CTRL,
-                       &new_downspread.raw, sizeof(new_downspread));
+               if (new_downspread.raw != old_downspread.raw) {
+                       core_link_write_dpcd(link, DP_DOWNSPREAD_CTRL,
+                               &new_downspread.raw, sizeof(new_downspread));
+               }
+
+       } else {
+               dm_helpers_mst_enable_stream_features(stream);
        }
 }
 
index f41db27..7617fab 100644 (file)
@@ -147,6 +147,8 @@ bool dm_helpers_dp_write_dsc_enable(
 bool dm_helpers_is_dp_sink_present(
                struct dc_link *link);
 
+void dm_helpers_mst_enable_stream_features(const struct dc_stream_state *stream);
+
 enum dc_edid_status dm_helpers_read_local_edid(
                struct dc_context *ctx,
                struct dc_link *link,