drm/amd/display: adjust flow for deallocation mst payload
authorWayne Lin <wayne.lin@amd.com>
Mon, 7 Aug 2023 07:34:39 +0000 (15:34 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 29 Nov 2023 21:49:00 +0000 (16:49 -0500)
[Why]
MST relevant variables are maintained at drm side. As the result, we
still have to call drm_dp_remove_payload_part2() to update the relevant
values regardless the link is under mst mode or not. We used to have a
workaround patch to tackle this: commit 3d8fcc6740c9 ("drm/amd/display:
Extract temp drm mst deallocation wa into its own function")

Now it's time to remove the workaround and adjust the flow.

[How]
During deallocate_mst_payload(), source actually doesn't send out
ALLOCATE_PAYLOAD at the end as like the flow in allocate_mst_payload().
Call function dm_helpers_dp_mst_send_payload_allocation() at the end of
deallocate_mst_payload() is a bit confusing.

Separate dm_helpers_dp_mst_send_payload_allocation() into 2 functions.
Have a new function dm_helpers_dp_mst_update_mst_mgr_for_deallocation()
to replace dm_helpers_dp_mst_send_payload_allocation() for payload
deallocation.

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dm_helpers.h
drivers/gpu/drm/amd/display/dc/link/link_dpms.c

index ba3f7b232a16f57be6a4f30c943926383b998db4..2be64c593c8770b487d69ba5962de0fcd40b2cf7 100644 (file)
@@ -1715,23 +1715,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
        /* TODO: Remove after DP2 receiver gets proper support of Cable ID feature */
        adev->dm.dc->debug.ignore_cable_id = true;
 
-       /* TODO: There is a new drm mst change where the freedom of
-        * vc_next_start_slot update is revoked/moved into drm, instead of in
-        * driver. This forces us to make sure to get vc_next_start_slot updated
-        * in drm function each time without considering if mst_state is active
-        * or not. Otherwise, next time hotplug will give wrong start_slot
-        * number. We are implementing a temporary solution to even notify drm
-        * mst deallocation when link is no longer of MST type when uncommitting
-        * the stream so we will have more time to work on a proper solution.
-        * Ideally when dm_helpers_dp_mst_stop_top_mgr message is triggered, we
-        * should notify drm to do a complete "reset" of its states and stop
-        * calling further drm mst functions when link is no longer of an MST
-        * type. This could happen when we unplug an MST hubs/displays. When
-        * uncommit stream comes later after unplug, we should just reset
-        * hardware states only.
-        */
-       adev->dm.dc->debug.temp_mst_deallocation_sequence = true;
-
        if (adev->dm.dc->caps.dp_hdmi21_pcon_support)
                DRM_INFO("DP-HDMI FRL PCON supported\n");
 
index c7a29bb737e24d0394e770529f1d3f43d0333aae..e44ba5c1c48eac89171c3c4a68791bb8cd8eddbc 100644 (file)
@@ -333,15 +333,14 @@ enum act_return_status dm_helpers_dp_mst_poll_for_allocation_change_trigger(
        return ACT_SUCCESS;
 }
 
-bool dm_helpers_dp_mst_send_payload_allocation(
+void dm_helpers_dp_mst_send_payload_allocation(
                struct dc_context *ctx,
-               const struct dc_stream_state *stream,
-               bool enable)
+               const struct dc_stream_state *stream)
 {
        struct amdgpu_dm_connector *aconnector;
        struct drm_dp_mst_topology_state *mst_state;
        struct drm_dp_mst_topology_mgr *mst_mgr;
-       struct drm_dp_mst_atomic_payload *new_payload, old_payload;
+       struct drm_dp_mst_atomic_payload *new_payload;
        enum mst_progress_status set_flag = MST_ALLOCATE_NEW_PAYLOAD;
        enum mst_progress_status clr_flag = MST_CLEAR_ALLOCATED_PAYLOAD;
        int ret = 0;
@@ -349,25 +348,13 @@ bool dm_helpers_dp_mst_send_payload_allocation(
        aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
 
        if (!aconnector || !aconnector->mst_root)
-               return false;
+               return;
 
        mst_mgr = &aconnector->mst_root->mst_mgr;
        mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);
-
        new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
 
-       if (!enable) {
-               set_flag = MST_CLEAR_ALLOCATED_PAYLOAD;
-               clr_flag = MST_ALLOCATE_NEW_PAYLOAD;
-       }
-
-       if (enable) {
-               ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, new_payload);
-       } else {
-               dm_helpers_construct_old_payload(mst_mgr, mst_state,
-                                                new_payload, &old_payload);
-               drm_dp_remove_payload_part2(mst_mgr, mst_state, &old_payload, new_payload);
-       }
+       ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, new_payload);
 
        if (ret) {
                amdgpu_dm_set_mst_status(&aconnector->mst_status,
@@ -378,10 +365,36 @@ bool dm_helpers_dp_mst_send_payload_allocation(
                amdgpu_dm_set_mst_status(&aconnector->mst_status,
                        clr_flag, false);
        }
-
-       return true;
 }
 
+void dm_helpers_dp_mst_update_mst_mgr_for_deallocation(
+               struct dc_context *ctx,
+               const struct dc_stream_state *stream)
+{
+       struct amdgpu_dm_connector *aconnector;
+       struct drm_dp_mst_topology_state *mst_state;
+       struct drm_dp_mst_topology_mgr *mst_mgr;
+       struct drm_dp_mst_atomic_payload *new_payload, old_payload;
+       enum mst_progress_status set_flag = MST_CLEAR_ALLOCATED_PAYLOAD;
+       enum mst_progress_status clr_flag = MST_ALLOCATE_NEW_PAYLOAD;
+
+       aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
+
+       if (!aconnector || !aconnector->mst_root)
+               return;
+
+       mst_mgr = &aconnector->mst_root->mst_mgr;
+       mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);
+       new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
+       dm_helpers_construct_old_payload(mst_mgr, mst_state,
+                                        new_payload, &old_payload);
+
+       drm_dp_remove_payload_part2(mst_mgr, mst_state, &old_payload, new_payload);
+
+       amdgpu_dm_set_mst_status(&aconnector->mst_status, set_flag, true);
+       amdgpu_dm_set_mst_status(&aconnector->mst_status, clr_flag, false);
+ }
+
 void dm_dtn_log_begin(struct dc_context *ctx,
        struct dc_log_buffer_ctx *log_ctx)
 {
index 18b8d7f3f738963133ee64ed30cc75b981574b75..85771ef98cd738116fb813777a8d83f32a63de19 100644 (file)
@@ -956,7 +956,6 @@ struct dc_debug_options {
        unsigned int min_prefetch_in_strobe_ns;
        bool disable_unbounded_requesting;
        bool dig_fifo_off_in_blank;
-       bool temp_mst_deallocation_sequence;
        bool override_dispclk_programming;
        bool otg_crc_db;
        bool disallow_dispclk_dppclk_ds;
index 7ce9a5b6c33badb417d58457f351b9b682bc15f9..6d7a15dcf8a7ba462cf00f58d5b116bc9eff3cb4 100644 (file)
@@ -103,10 +103,16 @@ enum act_return_status dm_helpers_dp_mst_poll_for_allocation_change_trigger(
 /*
  * Sends ALLOCATE_PAYLOAD message.
  */
-bool dm_helpers_dp_mst_send_payload_allocation(
+void dm_helpers_dp_mst_send_payload_allocation(
                struct dc_context *ctx,
-               const struct dc_stream_state *stream,
-               bool enable);
+               const struct dc_stream_state *stream);
+
+/*
+ * Update mst manager relevant variables
+ */
+void dm_helpers_dp_mst_update_mst_mgr_for_deallocation(
+               struct dc_context *ctx,
+               const struct dc_stream_state *stream);
 
 bool dm_helpers_dp_mst_start_top_mgr(
                struct dc_context *ctx,
index f8e01ca09d964697a0ec6e19abdbd62c97f3a985..aa0a086aa7fc39d254340ce81373d570b1c014ff 100644 (file)
@@ -1247,86 +1247,6 @@ static void remove_stream_from_alloc_table(
        }
 }
 
-static enum dc_status deallocate_mst_payload_with_temp_drm_wa(
-               struct pipe_ctx *pipe_ctx)
-{
-       struct dc_stream_state *stream = pipe_ctx->stream;
-       struct dc_link *link = stream->link;
-       struct dc_dp_mst_stream_allocation_table proposed_table = {0};
-       struct fixed31_32 avg_time_slots_per_mtp = dc_fixpt_from_int(0);
-       int i;
-       bool mst_mode = (link->type == dc_connection_mst_branch);
-       /* adjust for drm changes*/
-       const struct link_hwss *link_hwss = get_link_hwss(link, &pipe_ctx->link_res);
-       const struct dc_link_settings empty_link_settings = {0};
-       DC_LOGGER_INIT(link->ctx->logger);
-
-       if (link_hwss->ext.set_throttled_vcp_size)
-               link_hwss->ext.set_throttled_vcp_size(pipe_ctx, avg_time_slots_per_mtp);
-       if (link_hwss->ext.set_hblank_min_symbol_width)
-               link_hwss->ext.set_hblank_min_symbol_width(pipe_ctx,
-                               &empty_link_settings,
-                               avg_time_slots_per_mtp);
-
-       if (dm_helpers_dp_mst_write_payload_allocation_table(
-                       stream->ctx,
-                       stream,
-                       &proposed_table,
-                       false))
-               update_mst_stream_alloc_table(
-                               link,
-                               pipe_ctx->stream_res.stream_enc,
-                               pipe_ctx->stream_res.hpo_dp_stream_enc,
-                               &proposed_table);
-       else
-               DC_LOG_WARNING("Failed to update"
-                               "MST allocation table for"
-                               "pipe idx:%d\n",
-                               pipe_ctx->pipe_idx);
-
-       DC_LOG_MST("%s"
-                       "stream_count: %d: ",
-                       __func__,
-                       link->mst_stream_alloc_table.stream_count);
-
-       for (i = 0; i < MAX_CONTROLLER_NUM; i++) {
-               DC_LOG_MST("stream_enc[%d]: %p      "
-               "stream[%d].hpo_dp_stream_enc: %p      "
-               "stream[%d].vcp_id: %d      "
-               "stream[%d].slot_count: %d\n",
-               i,
-               (void *) link->mst_stream_alloc_table.stream_allocations[i].stream_enc,
-               i,
-               (void *) link->mst_stream_alloc_table.stream_allocations[i].hpo_dp_stream_enc,
-               i,
-               link->mst_stream_alloc_table.stream_allocations[i].vcp_id,
-               i,
-               link->mst_stream_alloc_table.stream_allocations[i].slot_count);
-       }
-
-       if (link_hwss->ext.update_stream_allocation_table == NULL ||
-                       link_dp_get_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,
-                       stream);
-       }
-
-       dm_helpers_dp_mst_send_payload_allocation(
-                       stream->ctx,
-                       stream,
-                       false);
-
-       return DC_OK;
-}
-
 static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
 {
        struct dc_stream_state *stream = pipe_ctx->stream;
@@ -1339,9 +1259,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);
 
-       if (link->dc->debug.temp_mst_deallocation_sequence)
-               return deallocate_mst_payload_with_temp_drm_wa(pipe_ctx);
-
        /* 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
@@ -1414,16 +1331,14 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
        link_hwss->ext.update_stream_allocation_table(link, &pipe_ctx->link_res,
                        &link->mst_stream_alloc_table);
 
-       if (mst_mode) {
+       if (mst_mode)
                dm_helpers_dp_mst_poll_for_allocation_change_trigger(
                        stream->ctx,
                        stream);
 
-               dm_helpers_dp_mst_send_payload_allocation(
-                               stream->ctx,
-                               stream,
-                               false);
-       }
+       dm_helpers_dp_mst_update_mst_mgr_for_deallocation(
+                       stream->ctx,
+                       stream);
 
        return DC_OK;
 }
@@ -1504,12 +1419,10 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx)
                        stream->ctx,
                        stream);
 
-       if (ret != ACT_LINK_LOST) {
+       if (ret != ACT_LINK_LOST)
                dm_helpers_dp_mst_send_payload_allocation(
                                stream->ctx,
-                               stream,
-                               true);
-       }
+                               stream);
 
        /* slot X.Y for only current stream */
        pbn_per_slot = get_pbn_per_slot(stream);
@@ -1769,8 +1682,7 @@ enum dc_status link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw_in
        /* send ALLOCATE_PAYLOAD sideband message with updated pbn */
        dm_helpers_dp_mst_send_payload_allocation(
                        stream->ctx,
-                       stream,
-                       true);
+                       stream);
 
        /* notify immediate branch device table update */
        if (dm_helpers_dp_mst_write_payload_allocation_table(
@@ -1899,8 +1811,7 @@ enum dc_status link_increase_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw_
                /* send ALLOCATE_PAYLOAD sideband message with updated pbn */
                dm_helpers_dp_mst_send_payload_allocation(
                                stream->ctx,
-                               stream,
-                               true);
+                               stream);
        }
 
        /* increase throttled vcp size */