From: Jun Lei <jun....@amd.com>

[why]
dc_stream_state containing a pointer to sink is poor design.
Sink describes the display, and the specifications or capabilities
it has.  That information is irrelevant for dc_stream_state, which describes
hardware state, and is generally used for hardware programming.  It
could further be argued that dc_sink itself is just a convenience dc
provides, and DC should be perfectly capable of programming hardware
without any dc_sinks (for example, emulated sinks).

[how]
Phase 1:
Deprecate use of dc_sink pointer in dc_stream.  Most references are trivial
to remove, but some call sites are risky (such as is_timing_changed) with
no obvious logical replacement.  These will be removed in follow up change.

Add dc_link pointer to dc_stream.  This is the typical reason DC really needed
sink pointer, and most call sites are replaced with this.

DMs also need minor updates, as all 3 DMs leverage stream->sink for
some functionality.  this is replaced instead by a pointer to private data
inside dc_stream_state, which is used by DMs as a quality of life improvment
for some key functionality.  it allows DMs to set pointers have to their own 
objects
which associate OS objects to dc_stream_states (such as DisplayTarget
and amdgpu_dm_connector).  Without the private pointer, DMs would be
forced to perform a lookup for callbacks.

Signed-off-by: Jun Lei <jun....@amd.com>
Reviewed-by: Aric Cyr <aric....@amd.com>
Acked-by: David Francis <david.fran...@amd.com>
Acked-by: Leo Li <sunpeng...@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  | 10 ++--
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c  |  6 +--
 drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c   |  2 +-
 drivers/gpu/drm/amd/display/dc/core/dc.c           | 11 ++---
 drivers/gpu/drm/amd/display/dc/core/dc_link.c      | 54 +++++++++++-----------
 drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c   |  6 +--
 drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c |  9 ++--
 drivers/gpu/drm/amd/display/dc/core/dc_resource.c  | 14 +++---
 drivers/gpu/drm/amd/display/dc/core/dc_stream.c    | 30 ++++++------
 drivers/gpu/drm/amd/display/dc/dc_link.h           |  1 +
 drivers/gpu/drm/amd/display/dc/dc_stream.h         | 13 +++++-
 drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c   | 10 ++--
 .../gpu/drm/amd/display/dc/dce/dce_link_encoder.c  |  2 +-
 .../amd/display/dc/dce110/dce110_hw_sequencer.c    | 26 ++++-------
 .../drm/amd/display/dc/dce110/dce110_resource.c    |  2 +-
 .../drm/amd/display/dc/dce112/dce112_resource.c    |  2 +-
 .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c  |  2 +-
 .../drm/amd/display/dc/dcn10/dcn10_link_encoder.c  |  2 +-
 .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.c  |  2 +-
 19 files changed, 103 insertions(+), 101 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 23d6157..5486958 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2640,10 +2640,10 @@ fill_stream_properties_from_drm_display_mode(struct 
dc_stream_state *stream,
        timing_out->v_border_bottom = 0;
        /* TODO: un-hardcode */
        if (drm_mode_is_420_only(info, mode_in)
-                       && stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
+                       && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
                timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
        else if ((connector->display_info.color_formats & 
DRM_COLOR_FORMAT_YCRCB444)
-                       && stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
+                       && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
                timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444;
        else
                timing_out->pixel_encoding = PIXEL_ENCODING_RGB;
@@ -2685,7 +2685,7 @@ fill_stream_properties_from_drm_display_mode(struct 
dc_stream_state *stream,
 
        stream->out_transfer_func->type = TF_TYPE_PREDEFINED;
        stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB;
-       if (stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
+       if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
                adjust_colour_depth_from_display_info(timing_out, info);
 }
 
@@ -2879,6 +2879,8 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
                goto finish;
        }
 
+       stream->dm_stream_context = aconnector;
+
        list_for_each_entry(preferred_mode, &aconnector->base.modes, head) {
                /* Search for preferred mode */
                if (preferred_mode->type & DRM_MODE_TYPE_PREFERRED) {
@@ -2930,7 +2932,7 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
                drm_connector,
                sink);
 
-       update_stream_signal(stream);
+       update_stream_signal(stream, sink);
 
        if (dm_state && dm_state->freesync_capable)
                stream->ignore_msa_timing_param = true;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index 39997d9..b0bc831 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -192,7 +192,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
        int bpp = 0;
        int pbn = 0;
 
-       aconnector = stream->sink->priv;
+       aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
 
        if (!aconnector || !aconnector->mst_port)
                return false;
@@ -284,7 +284,7 @@ bool dm_helpers_dp_mst_poll_for_allocation_change_trigger(
        struct drm_dp_mst_topology_mgr *mst_mgr;
        int ret;
 
-       aconnector = stream->sink->priv;
+       aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
 
        if (!aconnector || !aconnector->mst_port)
                return false;
@@ -312,7 +312,7 @@ bool dm_helpers_dp_mst_send_payload_allocation(
        struct drm_dp_mst_port *mst_port;
        int ret;
 
-       aconnector = stream->sink->priv;
+       aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
 
        if (!aconnector || !aconnector->mst_port)
                return false;
diff --git a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c 
b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
index 43e4a2b..cd88cec 100644
--- a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
+++ b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
@@ -961,7 +961,7 @@ bool dcn_validate_bandwidth(
                v->dcc_rate[input_idx] = 1; /*TODO: Worst case? does this 
change?*/
                v->output_format[input_idx] = 
pipe->stream->timing.pixel_encoding ==
                                PIXEL_ENCODING_YCBCR420 ? dcn_bw_420 : 
dcn_bw_444;
-               v->output[input_idx] = pipe->stream->sink->sink_signal ==
+               v->output[input_idx] = pipe->stream->signal ==
                                SIGNAL_TYPE_HDMI_TYPE_A ? dcn_bw_hdmi : 
dcn_bw_dp;
                v->output_deep_color[input_idx] = dcn_bw_encoder_8bpc;
                if (v->output[input_idx] == dcn_bw_hdmi) {
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 16b1dc6..231a4a4 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -388,7 +388,7 @@ void dc_stream_set_dither_option(struct dc_stream_state 
*stream,
                enum dc_dither_option option)
 {
        struct bit_depth_reduction_params params;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        struct pipe_ctx *pipes = NULL;
        int i;
 
@@ -530,9 +530,8 @@ void dc_link_set_preferred_link_settings(struct dc *dc,
 
        for (i = 0; i < MAX_PIPES; i++) {
                pipe = &dc->current_state->res_ctx.pipe_ctx[i];
-               if (pipe->stream && pipe->stream->sink
-                       && pipe->stream->sink->link) {
-                       if (pipe->stream->sink->link == link)
+               if (pipe->stream && pipe->stream->link) {
+                       if (pipe->stream->link == link)
                                break;
                }
        }
@@ -1049,7 +1048,7 @@ static enum dc_status dc_commit_state_no_check(struct dc 
*dc, struct dc_state *c
 
        /* Program all planes within new context*/
        for (i = 0; i < context->stream_count; i++) {
-               const struct dc_sink *sink = context->streams[i]->sink;
+               const struct dc_link *link = context->streams[i]->link;
 
                if (!context->streams[i]->mode_changed)
                        continue;
@@ -1074,7 +1073,7 @@ static enum dc_status dc_commit_state_no_check(struct dc 
*dc, struct dc_state *c
                        }
                }
 
-               CONN_MSG_MODE(sink->link, "{%dx%d, %dx%d@%dKhz}",
+               CONN_MSG_MODE(link, "{%dx%d, %dx%d@%dKhz}",
                                context->streams[i]->timing.h_addressable,
                                context->streams[i]->timing.v_addressable,
                                context->streams[i]->timing.h_total,
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index 4dc5846..28efd91 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -761,7 +761,7 @@ bool dc_link_detect(struct dc_link *link, enum 
dc_detect_reason reason)
                        return false;
                }
 
-               sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock;
+               sink->link->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock;
                sink->converter_disable_audio = converter_disable_audio;
 
                link->local_sink = sink;
@@ -1344,7 +1344,7 @@ static void dpcd_configure_panel_mode(
 static void enable_stream_features(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        union down_spread_ctrl old_downspread;
        union down_spread_ctrl new_downspread;
 
@@ -1369,7 +1369,7 @@ static enum dc_status enable_link_dp(
        struct dc_stream_state *stream = pipe_ctx->stream;
        enum dc_status status;
        bool skip_video_pattern;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        struct dc_link_settings link_settings = {0};
        enum dp_panel_mode panel_mode;
 
@@ -1386,8 +1386,8 @@ static enum dc_status enable_link_dp(
                pipe_ctx->clock_source->id,
                &link_settings);
 
-       if (stream->sink->edid_caps.panel_patch.dppowerup_delay > 0) {
-               int delay_dp_power_up_in_ms = 
stream->sink->edid_caps.panel_patch.dppowerup_delay;
+       if (stream->sink_patches.dppowerup_delay > 0) {
+               int delay_dp_power_up_in_ms = 
stream->sink_patches.dppowerup_delay;
 
                msleep(delay_dp_power_up_in_ms);
        }
@@ -1420,7 +1420,7 @@ static enum dc_status enable_link_edp(
 {
        enum dc_status status;
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        /*in case it is not on*/
        link->dc->hwss.edp_power_control(link, true);
        link->dc->hwss.edp_wait_for_hpd_ready(link, true);
@@ -1435,7 +1435,7 @@ static enum dc_status enable_link_dp_mst(
                struct dc_state *state,
                struct pipe_ctx *pipe_ctx)
 {
-       struct dc_link *link = pipe_ctx->stream->sink->link;
+       struct dc_link *link = pipe_ctx->stream->link;
 
        /* sink signal type after MST branch is MST. Multiple MST sinks
         * share one link. Link DP PHY is enable or training only once.
@@ -1569,7 +1569,7 @@ static bool i2c_write(struct pipe_ctx *pipe_ctx,
        cmd.payloads = &payload;
 
        if (dm_helpers_submit_i2c(pipe_ctx->stream->ctx,
-                       pipe_ctx->stream->sink->link, &cmd))
+                       pipe_ctx->stream->link, &cmd))
                return true;
 
        return false;
@@ -1623,7 +1623,7 @@ static void write_i2c_retimer_setting(
                                else {
                                        i2c_success =
                                                dal_ddc_service_query_ddc_data(
-                                               
pipe_ctx->stream->sink->link->ddc,
+                                               pipe_ctx->stream->link->ddc,
                                                slave_address, &offset, 1, 
&value, 1);
                                        if (!i2c_success)
                                                /* Write failure */
@@ -1676,7 +1676,7 @@ static void write_i2c_retimer_setting(
                                        else {
                                                i2c_success =
                                                                
dal_ddc_service_query_ddc_data(
-                                                               
pipe_ctx->stream->sink->link->ddc,
+                                                               
pipe_ctx->stream->link->ddc,
                                                                slave_address, 
&offset, 1, &value, 1);
                                                if (!i2c_success)
                                                        /* Write failure */
@@ -1901,7 +1901,7 @@ static void write_i2c_redriver_setting(
 static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        enum dc_color_depth display_color_depth;
        enum engine_id eng_id;
        struct ext_hdmi_settings settings = {0};
@@ -1915,7 +1915,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
                is_over_340mhz = true;
 
        if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) {
-               unsigned short masked_chip_caps = 
pipe_ctx->stream->sink->link->chip_caps &
+               unsigned short masked_chip_caps = 
pipe_ctx->stream->link->chip_caps &
                                EXT_DISPLAY_PATH_CAPS__EXT_CHIP_MASK;
                if (masked_chip_caps == 
EXT_DISPLAY_PATH_CAPS__HDMI20_TISN65DP159RSBT) {
                        /* DP159, Retimer settings */
@@ -1936,11 +1936,11 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
 
        if (dc_is_hdmi_signal(pipe_ctx->stream->signal))
                dal_ddc_service_write_scdc_data(
-                       stream->sink->link->ddc,
+                       stream->link->ddc,
                        stream->phy_pix_clk,
                        stream->timing.flags.LTE_340MCSC_SCRAMBLE);
 
-       memset(&stream->sink->link->cur_link_settings, 0,
+       memset(&stream->link->cur_link_settings, 0,
                        sizeof(struct dc_link_settings));
 
        display_color_depth = stream->timing.display_color_depth;
@@ -1961,12 +1961,12 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
 static void enable_link_lvds(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
 
        if (stream->phy_pix_clk == 0)
                stream->phy_pix_clk = stream->timing.pix_clk_khz;
 
-       memset(&stream->sink->link->cur_link_settings, 0,
+       memset(&stream->link->cur_link_settings, 0,
                        sizeof(struct dc_link_settings));
 
        link->link_enc->funcs->enable_lvds_output(
@@ -2117,7 +2117,7 @@ enum dc_status dc_link_validate_mode_timing(
                struct dc_link *link,
                const struct dc_crtc_timing *timing)
 {
-       uint32_t max_pix_clk = stream->sink->dongle_max_pix_clk;
+       uint32_t max_pix_clk = stream->link->dongle_max_pix_clk;
        struct dpcd_caps *dpcd_caps = &link->dpcd_caps;
 
        /* A hack to avoid failing any modes for EDID override feature on
@@ -2191,7 +2191,7 @@ bool dc_link_set_backlight_level(const struct dc_link 
*link,
                for (i = 0; i < MAX_PIPES; i++) {
                        if (core_dc->current_state->res_ctx.pipe_ctx[i].stream) 
{
                                if (core_dc->current_state->res_ctx.
-                                               pipe_ctx[i].stream->sink->link
+                                               pipe_ctx[i].stream->link
                                                == link)
                                        /* DMCU -1 for all controller id values,
                                         * therefore +1 here
@@ -2251,7 +2251,7 @@ void core_link_resume(struct dc_link *link)
 static struct fixed31_32 get_pbn_per_slot(struct dc_stream_state *stream)
 {
        struct dc_link_settings *link_settings =
-                       &stream->sink->link->cur_link_settings;
+                       &stream->link->cur_link_settings;
        uint32_t link_rate_in_mbps =
                        link_settings->link_rate * LINK_RATE_REF_FREQ_IN_MHZ;
        struct fixed31_32 mbps = dc_fixpt_from_int(
@@ -2358,7 +2358,7 @@ static void update_mst_stream_alloc_table(
 static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        struct link_encoder *link_encoder = link->link_enc;
        struct stream_encoder *stream_encoder = pipe_ctx->stream_res.stream_enc;
        struct dp_mst_stream_allocation_table proposed_table = {0};
@@ -2438,7 +2438,7 @@ static enum dc_status allocate_mst_payload(struct 
pipe_ctx *pipe_ctx)
 static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        struct link_encoder *link_encoder = link->link_enc;
        struct stream_encoder *stream_encoder = pipe_ctx->stream_res.stream_enc;
        struct dp_mst_stream_allocation_table proposed_table = {0};
@@ -2523,8 +2523,8 @@ void core_link_enable_stream(
        DC_LOGGER_INIT(pipe_ctx->stream->ctx->logger);
 
        if (pipe_ctx->stream->signal != SIGNAL_TYPE_VIRTUAL) {
-               stream->sink->link->link_enc->funcs->setup(
-                       stream->sink->link->link_enc,
+               stream->link->link_enc->funcs->setup(
+                       stream->link->link_enc,
                        pipe_ctx->stream->signal);
                pipe_ctx->stream_res.stream_enc->funcs->setup_stereo_sync(
                        pipe_ctx->stream_res.stream_enc,
@@ -2576,7 +2576,7 @@ void core_link_enable_stream(
 
                if (status != DC_OK) {
                        DC_LOG_WARNING("enabling link %u failed: %d\n",
-                       pipe_ctx->stream->sink->link->link_index,
+                       pipe_ctx->stream->link->link_index,
                        status);
 
                        /* Abort stream enable *unless* the failure was due to
@@ -2605,12 +2605,12 @@ void core_link_enable_stream(
                        allocate_mst_payload(pipe_ctx);
 
                core_dc->hwss.unblank_stream(pipe_ctx,
-                       &pipe_ctx->stream->sink->link->cur_link_settings);
+                       &pipe_ctx->stream->link->cur_link_settings);
 
                if (dc_is_dp_signal(pipe_ctx->stream->signal))
                        enable_stream_features(pipe_ctx);
 
-               dc_link_set_backlight_level(pipe_ctx->stream->sink->link,
+               dc_link_set_backlight_level(pipe_ctx->stream->link,
                                pipe_ctx->stream->bl_pwm_level,
                                0,
                                pipe_ctx->stream);
@@ -2629,7 +2629,7 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx, 
int option)
 
        core_dc->hwss.disable_stream(pipe_ctx, option);
 
-       disable_link(pipe_ctx->stream->sink->link, pipe_ctx->stream->signal);
+       disable_link(pipe_ctx->stream->link, pipe_ctx->stream->signal);
 }
 
 void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable)
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
index 849a3a3..f40271e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
@@ -1511,7 +1511,7 @@ void decide_link_settings(struct dc_stream_state *stream,
 
        req_bw = bandwidth_in_kbps_from_timing(&stream->timing);
 
-       link = stream->sink->link;
+       link = stream->link;
 
        /* if preferred is specified through AMDDP, use it, if it's enough
         * to drive the mode
@@ -1533,7 +1533,7 @@ void decide_link_settings(struct dc_stream_state *stream,
        }
 
        /* EDP use the link cap setting */
-       if (stream->sink->sink_signal == SIGNAL_TYPE_EDP) {
+       if (link->connector_signal == SIGNAL_TYPE_EDP) {
                *link_setting = link->verified_link_cap;
                return;
        }
@@ -2613,7 +2613,7 @@ bool dc_link_dp_set_test_pattern(
        memset(&training_pattern, 0, sizeof(training_pattern));
 
        for (i = 0; i < MAX_PIPES; i++) {
-               if (pipes[i].stream->sink->link == link) {
+               if (pipes[i].stream->link == link) {
                        pipe_ctx = &pipes[i];
                        break;
                }
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
index 82cd1d6..f8af776 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
@@ -70,8 +70,7 @@ void dp_enable_link_phy(
         */
        for (i = 0; i < MAX_PIPES; i++) {
                if (pipes[i].stream != NULL &&
-                       pipes[i].stream->sink != NULL &&
-                       pipes[i].stream->sink->link == link) {
+                       pipes[i].stream->link == link) {
                        if (pipes[i].clock_source != NULL &&
                                        pipes[i].clock_source->id != 
CLOCK_SOURCE_ID_DP_DTO) {
                                pipes[i].clock_source = dp_cs;
@@ -278,10 +277,8 @@ void dp_retrain_link_dp_test(struct dc_link *link,
        for (i = 0; i < MAX_PIPES; i++) {
                if (pipes[i].stream != NULL &&
                        !pipes[i].top_pipe &&
-                       pipes[i].stream->sink != NULL &&
-                       pipes[i].stream->sink->link != NULL &&
-                       pipes[i].stream_res.stream_enc != NULL &&
-                       pipes[i].stream->sink->link == link) {
+                       pipes[i].stream->link != NULL &&
+                       pipes[i].stream_res.stream_enc != NULL) {
                        udelay(100);
 
                        pipes[i].stream_res.stream_enc->funcs->dp_blank(
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index c347afd..cee712a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1555,7 +1555,7 @@ static struct stream_encoder 
*find_first_free_match_stream_enc_for_link(
 {
        int i;
        int j = -1;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
 
        for (i = 0; i < pool->stream_enc_count; i++) {
                if (!res_ctx->is_stream_enc_acquired[i] &&
@@ -1744,7 +1744,7 @@ static struct dc_stream_state *find_pll_sharable_stream(
                if (resource_are_streams_timing_synchronizable(
                        stream_needs_pll, stream_has_pll)
                        && !dc_is_dp_signal(stream_has_pll->signal)
-                       && stream_has_pll->sink->link->connector_signal
+                       && stream_has_pll->link->connector_signal
                        != SIGNAL_TYPE_VIRTUAL)
                        return stream_has_pll;
 
@@ -1846,7 +1846,7 @@ enum dc_status resource_map_pool_resources(
                true);
 
        /* TODO: Add check if ASIC support and EDID audio */
-       if (!stream->sink->converter_disable_audio &&
+       if (!stream->converter_disable_audio &&
            dc_is_audio_capable_signal(pipe_ctx->stream->signal) &&
            stream->audio_info.mode_count) {
                pipe_ctx->stream_res.audio = find_first_free_audio(
@@ -2108,7 +2108,7 @@ static void set_avi_info_frame(
        itc = true;
        itc_value = 1;
 
-       support = stream->sink->edid_caps.content_support;
+       support = stream->content_support;
 
        if (itc) {
                if (!support.bits.valid_content_type) {
@@ -2147,8 +2147,8 @@ static void set_avi_info_frame(
 
        /* TODO : We should handle YCC quantization */
        /* but we do not have matrix calculation */
-       if (stream->sink->edid_caps.qs_bit == 1 &&
-                       stream->sink->edid_caps.qy_bit == 1) {
+       if (stream->qs_bit == 1 &&
+                       stream->qy_bit == 1) {
                if (color_space == COLOR_SPACE_SRGB ||
                        color_space == COLOR_SPACE_2020_RGB_FULLRANGE) {
                        hdmi_info.bits.Q0_Q1   = RGB_QUANTIZATION_FULL_RANGE;
@@ -2592,7 +2592,7 @@ void resource_build_bit_depth_reduction_params(struct 
dc_stream_state *stream,
 enum dc_status dc_validate_stream(struct dc *dc, struct dc_stream_state 
*stream)
 {
        struct dc  *core_dc = dc;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        struct timing_generator *tg = core_dc->res_pool->timing_generators[0];
        enum dc_status res = DC_OK;
 
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index 66e5c46..8f9dc6f 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -35,20 +35,17 @@
 
/*******************************************************************************
  * Private functions
  
******************************************************************************/
-void update_stream_signal(struct dc_stream_state *stream)
+void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink)
 {
-
-       struct dc_sink *dc_sink = stream->sink;
-
-       if (dc_sink->sink_signal == SIGNAL_TYPE_NONE)
-               stream->signal = stream->sink->link->connector_signal;
+       if (sink->sink_signal == SIGNAL_TYPE_NONE)
+               stream->signal = stream->link->connector_signal;
        else
-               stream->signal = dc_sink->sink_signal;
+               stream->signal = sink->sink_signal;
 
        if (dc_is_dvi_signal(stream->signal)) {
                if (stream->ctx->dc->caps.dual_link_dvi &&
                    stream->timing.pix_clk_khz > TMDS_MAX_PIXEL_CLOCK &&
-                   stream->sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK)
+                   sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK)
                        stream->signal = SIGNAL_TYPE_DVI_DUAL_LINK;
                else
                        stream->signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
@@ -61,10 +58,15 @@ static void construct(struct dc_stream_state *stream,
        uint32_t i = 0;
 
        stream->sink = dc_sink_data;
-       stream->ctx = stream->sink->ctx;
-
        dc_sink_retain(dc_sink_data);
 
+       stream->ctx = dc_sink_data->ctx;
+       stream->link = dc_sink_data->link;
+       stream->sink_patches = dc_sink_data->edid_caps.panel_patch;
+       stream->converter_disable_audio = dc_sink_data->converter_disable_audio;
+       stream->qs_bit = dc_sink_data->edid_caps.qs_bit;
+       stream->qy_bit = dc_sink_data->edid_caps.qy_bit;
+
        /* Copy audio modes */
        /* TODO - Remove this translation */
        for (i = 0; i < (dc_sink_data->edid_caps.audio_mode_count); i++)
@@ -100,7 +102,7 @@ static void construct(struct dc_stream_state *stream,
        /* EDID CAP translation for HDMI 2.0 */
        stream->timing.flags.LTE_340MCSC_SCRAMBLE = 
dc_sink_data->edid_caps.lte_340mcsc_scramble;
 
-       update_stream_signal(stream);
+       update_stream_signal(stream, dc_sink_data);
 
        stream->out_transfer_func = dc_create_transfer_func();
        stream->out_transfer_func->type = TF_TYPE_BYPASS;
@@ -340,10 +342,6 @@ void dc_stream_log(const struct dc *dc, const struct 
dc_stream_state *stream)
                        stream->timing.pixel_encoding,
                        stream->timing.display_color_depth);
        DC_LOG_DC(
-                       "\tsink name: %s, serial: %d\n",
-                       stream->sink->edid_caps.display_name,
-                       stream->sink->edid_caps.serial_number);
-       DC_LOG_DC(
                        "\tlink: %d\n",
-                       stream->sink->link->link_index);
+                       stream->link->link_index);
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h 
b/drivers/gpu/drm/amd/display/dc/dc_link.h
index 29f19d5..8a0e576 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -110,6 +110,7 @@ struct dc_link {
        union ddi_channel_mapping ddi_channel_mapping;
        struct connector_device_tag_info device_tag;
        struct dpcd_caps dpcd_caps;
+       uint32_t dongle_max_pix_clk;
        unsigned short chip_caps;
        unsigned int dpcd_sink_count;
        enum edp_revision edp_revision;
diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h 
b/drivers/gpu/drm/amd/display/dc/dc_stream.h
index be34d63..39b3016f 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
@@ -51,7 +51,13 @@ struct freesync_context {
 };
 
 struct dc_stream_state {
+       // sink is deprecated, new code should not reference
+       // this pointer
        struct dc_sink *sink;
+
+       struct dc_link *link;
+       struct dc_panel_patch sink_patches;
+       union display_content_support content_support;
        struct dc_crtc_timing timing;
        struct dc_crtc_timing_adjust adjust;
        struct dc_info_packet vrr_infopacket;
@@ -80,6 +86,9 @@ struct dc_stream_state {
        enum view_3d_format view_format;
 
        bool ignore_msa_timing_param;
+       bool converter_disable_audio;
+       uint8_t qs_bit;
+       uint8_t qy_bit;
 
        unsigned long long periodic_fn_vsync_delta;
 
@@ -105,6 +114,8 @@ struct dc_stream_state {
        bool dpms_off;
        bool apply_edp_fast_boot_optimization;
 
+       void *dm_stream_context;
+
        struct dc_cursor_attributes cursor_attributes;
        struct dc_cursor_position cursor_position;
        uint32_t sdr_white_level; // for boosting (SDR) cursor in HDR mode
@@ -256,7 +267,7 @@ enum surface_update_type 
dc_check_update_surfaces_for_stream(
  */
 struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink);
 
-void update_stream_signal(struct dc_stream_state *stream);
+void update_stream_signal(struct dc_stream_state *stream, struct dc_sink 
*sink);
 
 void dc_stream_retain(struct dc_stream_state *dc_stream);
 void dc_stream_release(struct dc_stream_state *dc_stream);
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c
index bd22f51..6c09c3a 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c
@@ -483,15 +483,15 @@ void dce110_fill_display_configs(
                cfg->src_height = stream->src.height;
                cfg->src_width = stream->src.width;
                cfg->ddi_channel_mapping =
-                       stream->sink->link->ddi_channel_mapping.raw;
+                       stream->link->ddi_channel_mapping.raw;
                cfg->transmitter =
-                       stream->sink->link->link_enc->transmitter;
+                       stream->link->link_enc->transmitter;
                cfg->link_settings.lane_count =
-                       stream->sink->link->cur_link_settings.lane_count;
+                       stream->link->cur_link_settings.lane_count;
                cfg->link_settings.link_rate =
-                       stream->sink->link->cur_link_settings.link_rate;
+                       stream->link->cur_link_settings.link_rate;
                cfg->link_settings.link_spread =
-                       stream->sink->link->cur_link_settings.link_spread;
+                       stream->link->cur_link_settings.link_spread;
                cfg->sym_clock = stream->phy_pix_clk;
                /* Round v_refresh*/
                cfg->v_refresh = stream->timing.pix_clk_khz * 1000;
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c 
b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
index 3e18ea8..1d794c6 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
@@ -788,7 +788,7 @@ bool dce110_link_encoder_validate_output_with_stream(
        case SIGNAL_TYPE_DVI_DUAL_LINK:
                is_valid = dce110_link_encoder_validate_dvi_output(
                        enc110,
-                       stream->sink->link->connector_signal,
+                       stream->link->connector_signal,
                        stream->signal,
                        &stream->timing);
        break;
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
index 6349ba7..8ac54bc 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
@@ -617,12 +617,11 @@ dce110_set_output_transfer_func(struct pipe_ctx *pipe_ctx,
 static enum dc_status bios_parser_crtc_source_select(
                struct pipe_ctx *pipe_ctx)
 {
-       struct dc_bios *dcb;
+       struct dc_bios *dcb = pipe_ctx->stream->ctx->dc_bios;
        /* call VBIOS table to set CRTC source for the HW
         * encoder block
         * note: video bios clears all FMT setting here. */
        struct bp_crtc_source_select crtc_source_select = {0};
-       const struct dc_sink *sink = pipe_ctx->stream->sink;
 
        crtc_source_select.engine_id = pipe_ctx->stream_res.stream_enc->id;
        crtc_source_select.controller_id = pipe_ctx->stream_res.tg->inst + 1;
@@ -652,8 +651,6 @@ static enum dc_status bios_parser_crtc_source_select(
                break;
        }
 
-       dcb = sink->ctx->dc_bios;
-
        if (BP_RESULT_OK != dcb->funcs->crtc_source_select(
                dcb,
                &crtc_source_select)) {
@@ -692,10 +689,10 @@ void dce110_update_info_frame(struct pipe_ctx *pipe_ctx)
 void dce110_enable_stream(struct pipe_ctx *pipe_ctx)
 {
        enum dc_lane_count lane_count =
-               pipe_ctx->stream->sink->link->cur_link_settings.lane_count;
+               pipe_ctx->stream->link->cur_link_settings.lane_count;
 
        struct dc_crtc_timing *timing = &pipe_ctx->stream->timing;
-       struct dc_link *link = pipe_ctx->stream->sink->link;
+       struct dc_link *link = pipe_ctx->stream->link;
 
 
        uint32_t active_total_with_borders;
@@ -1048,7 +1045,7 @@ void dce110_disable_audio_stream(struct pipe_ctx 
*pipe_ctx, int option)
 void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
        struct dc *dc = pipe_ctx->stream->ctx->dc;
 
        if (dc_is_hdmi_signal(pipe_ctx->stream->signal))
@@ -1073,7 +1070,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx,
 {
        struct encoder_unblank_param params = { { 0 } };
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
 
        /* only 3 items below are used by unblank */
        params.pixel_clk_khz =
@@ -1090,7 +1087,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx,
 void dce110_blank_stream(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->sink->link;
+       struct dc_link *link = stream->link;
 
        if (link->local_sink && link->local_sink->sink_signal == 
SIGNAL_TYPE_EDP) {
                link->dc->hwss.edp_backlight_control(link, false);
@@ -1399,7 +1396,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(
 
        pipe_ctx->plane_res.scl_data.lb_params.alpha_en = pipe_ctx->bottom_pipe 
!= 0;
 
-       pipe_ctx->stream->sink->link->psr_enabled = false;
+       pipe_ctx->stream->link->psr_enabled = false;
 
        return DC_OK;
 }
@@ -1804,18 +1801,15 @@ static bool should_enable_fbc(struct dc *dc,
        if (i == dc->res_pool->pipe_count)
                return false;
 
-       if (!pipe_ctx->stream->sink)
-               return false;
-
-       if (!pipe_ctx->stream->sink->link)
+       if (!pipe_ctx->stream->link)
                return false;
 
        /* Only supports eDP */
-       if (pipe_ctx->stream->sink->link->connector_signal != SIGNAL_TYPE_EDP)
+       if (pipe_ctx->stream->link->connector_signal != SIGNAL_TYPE_EDP)
                return false;
 
        /* PSR should not be enabled */
-       if (pipe_ctx->stream->sink->link->psr_enabled)
+       if (pipe_ctx->stream->link->psr_enabled)
                return false;
 
        /* Nothing to compress */
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c 
b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
index e33d117..3c989b8 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
@@ -780,7 +780,7 @@ static void get_pixel_clock_parameters(
         * in pll_adjust_pix_clk
         */
        pixel_clk_params->requested_pix_clk = stream->timing.pix_clk_khz;
-       pixel_clk_params->encoder_object_id = stream->sink->link->link_enc->id;
+       pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
        pixel_clk_params->signal_type = pipe_ctx->stream->signal;
        pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
        /* TODO: un-hardcode*/
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c 
b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
index 969d4e7..c2a7133 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
@@ -763,7 +763,7 @@ static struct clock_source *find_matching_pll(
                const struct resource_pool *pool,
                const struct dc_stream_state *const stream)
 {
-       switch (stream->sink->link->link_enc->transmitter) {
+       switch (stream->link->link_enc->transmitter) {
        case TRANSMITTER_UNIPHY_A:
                return pool->clock_sources[DCE112_CLK_SRC_PLL0];
        case TRANSMITTER_UNIPHY_B:
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 75d0e53..2432a5d 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -2515,7 +2515,7 @@ static void dcn10_config_stereo_parameters(
                        timing_3d_format == TIMING_3D_FORMAT_DP_HDMI_INBAND_FA 
||
                        timing_3d_format == TIMING_3D_FORMAT_SIDEBAND_FA) {
                        enum display_dongle_type dongle = \
-                                       stream->sink->link->ddc->dongle_type;
+                                       stream->link->ddc->dongle_type;
                        if (dongle == DISPLAY_DONGLE_DP_VGA_CONVERTER ||
                                dongle == DISPLAY_DONGLE_DP_DVI_CONVERTER ||
                                dongle == DISPLAY_DONGLE_DP_HDMI_CONVERTER)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
index 477ab92..aefe897 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
@@ -738,7 +738,7 @@ bool dcn10_link_encoder_validate_output_with_stream(
        case SIGNAL_TYPE_DVI_DUAL_LINK:
                is_valid = dcn10_link_encoder_validate_dvi_output(
                        enc10,
-                       stream->sink->link->connector_signal,
+                       stream->link->connector_signal,
                        stream->signal,
                        &stream->timing);
        break;
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
index 5d4772d..6ab1ca2 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
@@ -975,7 +975,7 @@ static void get_pixel_clock_parameters(
 {
        const struct dc_stream_state *stream = pipe_ctx->stream;
        pixel_clk_params->requested_pix_clk = stream->timing.pix_clk_khz;
-       pixel_clk_params->encoder_object_id = stream->sink->link->link_enc->id;
+       pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
        pixel_clk_params->signal_type = pipe_ctx->stream->signal;
        pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
        /* TODO: un-hardcode*/
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to