Skip to content
Snippets Groups Projects
Commit 9031e001 authored by Wayne Lin's avatar Wayne Lin Committed by Alex Deucher
Browse files

drm/amd/display: Fix mst hub unplug warning


[Why]
Unplug mst hub will cause warning. That's because
dm_helpers_construct_old_payload() is changed to be called after
payload removement from dc link.

In dm_helpers_construct_old_payload(), We refer to the vcpi in
payload allocation table of dc link to construct the old payload
and payload is no longer in the table when we call the function
now.

[How]
Refer to the mst_state to construct the number of time slot for old
payload now. Note that dm_helpers_construct_old_payload() is just
a quick workaround before and we are going to abandon it soon.

Fixes: 5aa1dfcd ("drm/mst: Refactor the flow for payload allocation/removement")
Reviewed-by: default avatarJerry Zuo <jerry.zuo@amd.com>
Signed-off-by: default avatarWayne Lin <Wayne.Lin@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231005080405.169841-1-Wayne.Lin@amd.com
parent eba90a7a
No related branches found
No related tags found
No related merge requests found
...@@ -204,15 +204,16 @@ void dm_helpers_dp_update_branch_info( ...@@ -204,15 +204,16 @@ void dm_helpers_dp_update_branch_info(
{} {}
static void dm_helpers_construct_old_payload( static void dm_helpers_construct_old_payload(
struct dc_link *link, struct drm_dp_mst_topology_mgr *mgr,
int pbn_per_slot, struct drm_dp_mst_topology_state *mst_state,
struct drm_dp_mst_atomic_payload *new_payload, struct drm_dp_mst_atomic_payload *new_payload,
struct drm_dp_mst_atomic_payload *old_payload) struct drm_dp_mst_atomic_payload *old_payload)
{ {
struct link_mst_stream_allocation_table current_link_table = struct drm_dp_mst_atomic_payload *pos;
link->mst_stream_alloc_table; int pbn_per_slot = mst_state->pbn_div;
struct link_mst_stream_allocation *dc_alloc; u8 next_payload_vc_start = mgr->next_start_slot;
int i; u8 payload_vc_start = new_payload->vc_start_slot;
u8 allocated_time_slots;
*old_payload = *new_payload; *old_payload = *new_payload;
...@@ -221,20 +222,17 @@ static void dm_helpers_construct_old_payload( ...@@ -221,20 +222,17 @@ static void dm_helpers_construct_old_payload(
* struct drm_dp_mst_atomic_payload are don't care fields * struct drm_dp_mst_atomic_payload are don't care fields
* while calling drm_dp_remove_payload_part2() * while calling drm_dp_remove_payload_part2()
*/ */
for (i = 0; i < current_link_table.stream_count; i++) { list_for_each_entry(pos, &mst_state->payloads, next) {
dc_alloc = if (pos != new_payload &&
&current_link_table.stream_allocations[i]; pos->vc_start_slot > payload_vc_start &&
pos->vc_start_slot < next_payload_vc_start)
if (dc_alloc->vcp_id == new_payload->vcpi) { next_payload_vc_start = pos->vc_start_slot;
old_payload->time_slots = dc_alloc->slot_count;
old_payload->pbn = dc_alloc->slot_count * pbn_per_slot;
break;
}
} }
/* make sure there is an old payload*/ allocated_time_slots = next_payload_vc_start - payload_vc_start;
ASSERT(i != current_link_table.stream_count);
old_payload->time_slots = allocated_time_slots;
old_payload->pbn = allocated_time_slots * pbn_per_slot;
} }
/* /*
...@@ -271,7 +269,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table( ...@@ -271,7 +269,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload); drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload);
} else { } else {
/* construct old payload by VCPI*/ /* construct old payload by VCPI*/
dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div, dm_helpers_construct_old_payload(mst_mgr, mst_state,
new_payload, &old_payload); new_payload, &old_payload);
target_payload = &old_payload; target_payload = &old_payload;
...@@ -364,7 +362,7 @@ bool dm_helpers_dp_mst_send_payload_allocation( ...@@ -364,7 +362,7 @@ bool dm_helpers_dp_mst_send_payload_allocation(
if (enable) { if (enable) {
ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, new_payload); ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, new_payload);
} else { } else {
dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div, dm_helpers_construct_old_payload(mst_mgr, mst_state,
new_payload, &old_payload); new_payload, &old_payload);
drm_dp_remove_payload_part2(mst_mgr, mst_state, &old_payload, new_payload); drm_dp_remove_payload_part2(mst_mgr, mst_state, &old_payload, new_payload);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment