drm/amd/display: extract update stream allocation to link_hwss
authorWenjing Liu <wenjing.liu@amd.com>
Fri, 25 Mar 2022 20:12:14 +0000 (16:12 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 13 Apr 2022 13:14:22 +0000 (09:14 -0400)
[why]
Extract update stream allocation table into link hwss as part of the
link hwss refactor work.

Reviewed-by: George Shen <George.Shen@amd.com>
Reviewed-by: Fangzhi Zuo <Jerry.Zuo@amd.com>
Acked-by: Pavle Kotarac <Pavle.Kotarac@amd.com>
Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/inc/link_hwss.h
drivers/gpu/drm/amd/display/dc/link/link_hwss_dio.c
drivers/gpu/drm/amd/display/dc/link/link_hwss_dpia.c
drivers/gpu/drm/amd/display/dc/link/link_hwss_hpo_dp.c

index b625b46..faab146 100644 (file)
@@ -3487,8 +3487,6 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx,
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
        struct dc_link *link = stream->link;
-       struct hpo_dp_link_encoder *hpo_dp_link_encoder = pipe_ctx->link_res.hpo_dp_link_enc;
-       struct hpo_dp_stream_encoder *hpo_dp_stream_encoder = pipe_ctx->stream_res.hpo_dp_stream_enc;
        struct link_mst_stream_allocation_table proposed_table = {0};
        struct fixed31_32 avg_time_slots_per_mtp;
        const struct dc_link_settings empty_link_settings = {0};
@@ -3522,7 +3520,7 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx,
                                                pipe_ctx->pipe_idx);
        }
 
-       proposed_table.stream_allocations[0].hpo_dp_stream_enc = hpo_dp_stream_encoder;
+       proposed_table.stream_allocations[0].hpo_dp_stream_enc = pipe_ctx->stream_res.hpo_dp_stream_enc;
 
        ASSERT(proposed_table.stream_count == 1);
 
@@ -3535,8 +3533,7 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx,
                proposed_table.stream_allocations[0].slot_count);
 
        /* program DP source TX for payload */
-       hpo_dp_link_encoder->funcs->update_stream_allocation_table(
-                       hpo_dp_link_encoder,
+       link_hwss->ext.update_stream_allocation_table(link, &pipe_ctx->link_res,
                        &proposed_table);
 
        /* poll for ACT handled */
@@ -3573,8 +3570,6 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
        struct dc_link *link = stream->link;
-       struct link_encoder *link_encoder = NULL;
-       struct hpo_dp_link_encoder *hpo_dp_link_encoder = pipe_ctx->link_res.hpo_dp_link_enc;
        struct dp_mst_stream_allocation_table proposed_table = {0};
        struct fixed31_32 avg_time_slots_per_mtp;
        struct fixed31_32 pbn;
@@ -3584,9 +3579,6 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx)
        const struct link_hwss *link_hwss = get_link_hwss(link, &pipe_ctx->link_res);
        DC_LOGGER_INIT(link->ctx->logger);
 
-       link_encoder = link_enc_cfg_get_link_enc(link);
-       ASSERT(link_encoder);
-
        /* enable_link_dp_mst already check link->enabled_stream_count
         * and stream is in link->stream[]. This is called during set mode,
         * stream_enc is available.
@@ -3631,37 +3623,17 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx)
 
        ASSERT(proposed_table.stream_count > 0);
 
-       if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) {
-               static enum dc_status status;
-               uint8_t mst_alloc_slots = 0, prev_mst_slots_in_use = 0xFF;
-
-               for (i = 0; i < link->mst_stream_alloc_table.stream_count; i++)
-                       mst_alloc_slots += link->mst_stream_alloc_table.stream_allocations[i].slot_count;
-
-               status = dc_process_dmub_set_mst_slots(link->dc, link->link_index,
-                       mst_alloc_slots, &prev_mst_slots_in_use);
-               ASSERT(status == DC_OK);
-               DC_LOG_MST("dpia : status[%d]: alloc_slots[%d]: used_slots[%d]\n",
-                               status, mst_alloc_slots, prev_mst_slots_in_use);
-       }
-
        /* program DP source TX for payload */
-       switch (dp_get_link_encoding_format(&link->cur_link_settings)) {
-       case DP_8b_10b_ENCODING:
-               link_encoder->funcs->update_mst_stream_allocation_table(
-                       link_encoder,
-                       &link->mst_stream_alloc_table);
-               break;
-       case DP_128b_132b_ENCODING:
-               hpo_dp_link_encoder->funcs->update_stream_allocation_table(
-                               hpo_dp_link_encoder,
-                               &link->mst_stream_alloc_table);
-               break;
-       case DP_UNKNOWN_ENCODING:
+       if (link_hwss->ext.update_stream_allocation_table == NULL ||
+                       dp_get_link_encoding_format(&link->cur_link_settings) == DP_UNKNOWN_ENCODING) {
                DC_LOG_ERROR("Failure: unknown encoding format\n");
                return DC_ERROR_UNEXPECTED;
        }
 
+       link_hwss->ext.update_stream_allocation_table(link,
+                       &pipe_ctx->link_res,
+                       &link->mst_stream_alloc_table);
+
        /* send down message */
        ret = dm_helpers_dp_mst_poll_for_allocation_change_trigger(
                        stream->ctx,
@@ -3703,7 +3675,6 @@ enum dc_status dc_link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw
        struct fixed31_32 avg_time_slots_per_mtp;
        struct fixed31_32 pbn;
        struct fixed31_32 pbn_per_slot;
-       struct link_encoder *link_encoder = link->link_enc;
        struct dp_mst_stream_allocation_table proposed_table = {0};
        uint8_t i;
        enum act_return_status ret;
@@ -3767,8 +3738,13 @@ enum dc_status dc_link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw
        ASSERT(proposed_table.stream_count > 0);
 
        /* update mst stream allocation table hardware state */
-       link_encoder->funcs->update_mst_stream_allocation_table(
-                       link_encoder,
+       if (link_hwss->ext.update_stream_allocation_table == NULL ||
+                       dp_get_link_encoding_format(&link->cur_link_settings) == DP_UNKNOWN_ENCODING) {
+               DC_LOG_ERROR("Failure: unknown encoding format\n");
+               return DC_ERROR_UNEXPECTED;
+       }
+
+       link_hwss->ext.update_stream_allocation_table(link, &pipe_ctx->link_res,
                        &link->mst_stream_alloc_table);
 
        /* poll for immediate branch device ACT handled */
@@ -3863,8 +3839,6 @@ 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->link;
-       struct link_encoder *link_encoder = NULL;
-       struct hpo_dp_link_encoder *hpo_dp_link_encoder = pipe_ctx->link_res.hpo_dp_link_enc;
        struct dp_mst_stream_allocation_table proposed_table = {0};
        struct fixed31_32 avg_time_slots_per_mtp = dc_fixpt_from_int(0);
        int i;
@@ -3873,9 +3847,6 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
        const struct dc_link_settings empty_link_settings = {0};
        DC_LOGGER_INIT(link->ctx->logger);
 
-       link_encoder = link_enc_cfg_get_link_enc(link);
-       ASSERT(link_encoder);
-
        /* deallocate_mst_payload is called before disable link. When mode or
         * disable/enable monitor, new stream is created which is not in link
         * stream[] yet. For this, payload is not allocated yet, so de-alloc
@@ -3933,36 +3904,16 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
                link->mst_stream_alloc_table.stream_allocations[i].slot_count);
        }
 
-       if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) {
-               enum dc_status status;
-               uint8_t mst_alloc_slots = 0, prev_mst_slots_in_use = 0xFF;
-
-               for (i = 0; i < link->mst_stream_alloc_table.stream_count; i++)
-                       mst_alloc_slots += link->mst_stream_alloc_table.stream_allocations[i].slot_count;
-
-               status = dc_process_dmub_set_mst_slots(link->dc, link->link_index,
-                       mst_alloc_slots, &prev_mst_slots_in_use);
-               ASSERT(status != DC_NOT_SUPPORTED);
-               DC_LOG_MST("dpia : status[%d]: alloc_slots[%d]: used_slots[%d]\n",
-                               status, mst_alloc_slots, prev_mst_slots_in_use);
-       }
-
-       switch (dp_get_link_encoding_format(&link->cur_link_settings)) {
-       case DP_8b_10b_ENCODING:
-               link_encoder->funcs->update_mst_stream_allocation_table(
-                       link_encoder,
-                       &link->mst_stream_alloc_table);
-               break;
-       case DP_128b_132b_ENCODING:
-               hpo_dp_link_encoder->funcs->update_stream_allocation_table(
-                               hpo_dp_link_encoder,
-                               &link->mst_stream_alloc_table);
-               break;
-       case DP_UNKNOWN_ENCODING:
+       /* update mst stream allocation table hardware state */
+       if (link_hwss->ext.update_stream_allocation_table == NULL ||
+                       dp_get_link_encoding_format(&link->cur_link_settings) == DP_UNKNOWN_ENCODING) {
                DC_LOG_DEBUG("Unknown encoding format\n");
                return DC_ERROR_UNEXPECTED;
        }
 
+       link_hwss->ext.update_stream_allocation_table(link, &pipe_ctx->link_res,
+                       &link->mst_stream_alloc_table);
+
        if (mst_mode) {
                dm_helpers_dp_mst_poll_for_allocation_change_trigger(
                        stream->ctx,
@@ -4109,8 +4060,8 @@ static void fpga_dp_hpo_enable_link_and_stream(struct dc_state *state, struct pi
                proposed_table.stream_allocations[0].hpo_dp_stream_enc = pipe_ctx->stream_res.hpo_dp_stream_enc;
        }
 
-       pipe_ctx->link_res.hpo_dp_link_enc->funcs->update_stream_allocation_table(
-                       pipe_ctx->link_res.hpo_dp_link_enc,
+       link_hwss->ext.update_stream_allocation_table(stream->link,
+                       &pipe_ctx->link_res,
                        &proposed_table);
 
        if (link_hwss->ext.set_throttled_vcp_size)
index e2f8544..e6c49ef 100644 (file)
@@ -37,9 +37,12 @@ struct dc_link;
 struct link_resource;
 struct pipe_ctx;
 struct encoder_set_dp_phy_pattern_param;
+struct link_mst_stream_allocation_table;
 
 struct link_hwss_ext {
-       /* function pointers below require check for NULL at all time
+       /* function pointers below may require to check for NULL if caller
+        * considers missing implementation as expected in some cases or none
+        * critical to be investigated immediately
         * *********************************************************************
         */
        void (*set_hblank_min_symbol_width)(struct pipe_ctx *pipe_ctx,
@@ -62,6 +65,9 @@ struct link_hwss_ext {
                const struct link_resource *link_res,
                const struct dc_link_settings *link_settings,
                const struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX]);
+       void (*update_stream_allocation_table)(struct dc_link *link,
+                       const struct link_resource *link_res,
+                       const struct link_mst_stream_allocation_table *table);
 };
 
 struct link_hwss {
index e557c92..776e822 100644 (file)
@@ -153,6 +153,16 @@ void set_dio_dp_lane_settings(struct dc_link *link,
        link_enc->funcs->dp_set_lane_settings(link_enc, link_settings, lane_settings);
 }
 
+static void update_dio_stream_allocation_table(struct dc_link *link,
+               const struct link_resource *link_res,
+               const struct link_mst_stream_allocation_table *table)
+{
+       struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
+
+       ASSERT(link_enc);
+       link_enc->funcs->update_mst_stream_allocation_table(link_enc, table);
+}
+
 static const struct link_hwss dio_link_hwss = {
        .setup_stream_encoder = setup_dio_stream_encoder,
        .reset_stream_encoder = reset_dio_stream_encoder,
@@ -163,6 +173,7 @@ static const struct link_hwss dio_link_hwss = {
                .disable_dp_link_output = disable_dio_dp_link_output,
                .set_dp_link_test_pattern = set_dio_dp_link_test_pattern,
                .set_dp_lane_settings = set_dio_dp_lane_settings,
+               .update_stream_allocation_table = update_dio_stream_allocation_table,
        },
 };
 
index f90596f..89d4e81 100644 (file)
 #include "link_hwss_dpia.h"
 #include "core_types.h"
 #include "link_hwss_dio.h"
+#include "link_enc_cfg.h"
+
+#define DC_LOGGER_INIT(logger)
+
+static void update_dpia_stream_allocation_table(struct dc_link *link,
+               const struct link_resource *link_res,
+               const struct link_mst_stream_allocation_table *table)
+{
+       struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
+       static enum dc_status status;
+       uint8_t mst_alloc_slots = 0, prev_mst_slots_in_use = 0xFF;
+       int i;
+       DC_LOGGER_INIT(link->ctx->logger);
+
+       for (i = 0; i < table->stream_count; i++)
+               mst_alloc_slots += table->stream_allocations[i].slot_count;
+
+       status = dc_process_dmub_set_mst_slots(link->dc, link->link_index,
+                       mst_alloc_slots, &prev_mst_slots_in_use);
+       ASSERT(status == DC_OK);
+       DC_LOG_MST("dpia : status[%d]: alloc_slots[%d]: used_slots[%d]\n",
+                       status, mst_alloc_slots, prev_mst_slots_in_use);
+
+       ASSERT(link_enc);
+       link_enc->funcs->update_mst_stream_allocation_table(link_enc, table);
+}
 
 static const struct link_hwss dpia_link_hwss = {
        .setup_stream_encoder = setup_dio_stream_encoder,
@@ -36,6 +62,7 @@ static const struct link_hwss dpia_link_hwss = {
                .disable_dp_link_output = disable_dio_dp_link_output,
                .set_dp_link_test_pattern = set_dio_dp_link_test_pattern,
                .set_dp_lane_settings = set_dio_dp_lane_settings,
+               .update_stream_allocation_table = update_dpia_stream_allocation_table,
        },
 };
 
index 311e2e2..87972dc 100644 (file)
@@ -244,6 +244,15 @@ static void set_hpo_dp_lane_settings(struct dc_link *link,
                        lane_settings[0].FFE_PRESET.raw);
 }
 
+static void update_hpo_dp_stream_allocation_table(struct dc_link *link,
+               const struct link_resource *link_res,
+               const struct link_mst_stream_allocation_table *table)
+{
+       link_res->hpo_dp_link_enc->funcs->update_stream_allocation_table(
+                       link_res->hpo_dp_link_enc,
+                       table);
+}
+
 static const struct link_hwss hpo_dp_link_hwss = {
        .setup_stream_encoder = setup_hpo_dp_stream_encoder,
        .reset_stream_encoder = reset_hpo_dp_stream_encoder,
@@ -255,6 +264,7 @@ static const struct link_hwss hpo_dp_link_hwss = {
                .disable_dp_link_output = disable_hpo_dp_link_output,
                .set_dp_link_test_pattern  = set_hpo_dp_link_test_pattern,
                .set_dp_lane_settings = set_hpo_dp_lane_settings,
+               .update_stream_allocation_table = update_hpo_dp_stream_allocation_table,
        },
 };