Commit c689e1e3 authored by Lyude Paul's avatar Lyude Paul Committed by Alex Deucher

drm/amdgpu/display/mst: Fix mst_state->pbn_div and slot count assignments

Looks like I made a pretty big mistake here without noticing: it seems when
I moved the assignments of mst_state->pbn_div I completely missed the fact
that the reason for us calling drm_dp_mst_update_slots() earlier was to
account for the fact that we need to call this function using info from the
root MST connector, instead of just trying to do this from each MST
encoder's atomic check function. Otherwise, we end up filling out all of
DC's link information with zeroes.

So, let's restore that and hopefully fix this DSC regression.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/2171Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
Signed-off-by: default avatarHarry Wentland <harry.wentland@amd.com>
Fixes: 4d07b0bc ("drm/display/dp_mst: Move all payload info into the atomic state")
Cc: stable@vger.kernel.org # 6.1
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Tested-by: default avatarDidier Raboud <odyx@debian.org>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e11c7750
...@@ -9683,6 +9683,8 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -9683,6 +9683,8 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
struct drm_connector_state *old_con_state, *new_con_state; struct drm_connector_state *old_con_state, *new_con_state;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state, *new_crtc_state; struct drm_crtc_state *old_crtc_state, *new_crtc_state;
struct drm_dp_mst_topology_mgr *mgr;
struct drm_dp_mst_topology_state *mst_state;
struct drm_plane *plane; struct drm_plane *plane;
struct drm_plane_state *old_plane_state, *new_plane_state; struct drm_plane_state *old_plane_state, *new_plane_state;
enum dc_status status; enum dc_status status;
...@@ -9938,6 +9940,28 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -9938,6 +9940,28 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
lock_and_validation_needed = true; lock_and_validation_needed = true;
} }
#if defined(CONFIG_DRM_AMD_DC_DCN)
/* set the slot info for each mst_state based on the link encoding format */
for_each_new_mst_mgr_in_state(state, mgr, mst_state, i) {
struct amdgpu_dm_connector *aconnector;
struct drm_connector *connector;
struct drm_connector_list_iter iter;
u8 link_coding_cap;
drm_connector_list_iter_begin(dev, &iter);
drm_for_each_connector_iter(connector, &iter) {
if (connector->index == mst_state->mgr->conn_base_id) {
aconnector = to_amdgpu_dm_connector(connector);
link_coding_cap = dc_link_dp_mst_decide_link_encoding_format(aconnector->dc_link);
drm_dp_mst_update_slots(mst_state, link_coding_cap);
break;
}
}
drm_connector_list_iter_end(&iter);
}
#endif
/** /**
* Streams and planes are reset when there are changes that affect * Streams and planes are reset when there are changes that affect
* bandwidth. Anything that affects bandwidth needs to go through * bandwidth. Anything that affects bandwidth needs to go through
......
...@@ -927,11 +927,6 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state, ...@@ -927,11 +927,6 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
if (IS_ERR(mst_state)) if (IS_ERR(mst_state))
return PTR_ERR(mst_state); return PTR_ERR(mst_state);
mst_state->pbn_div = dm_mst_get_pbn_divider(dc_link);
#if defined(CONFIG_DRM_AMD_DC_DCN)
drm_dp_mst_update_slots(mst_state, dc_link_dp_mst_decide_link_encoding_format(dc_link));
#endif
/* Set up params */ /* Set up params */
for (i = 0; i < dc_state->stream_count; i++) { for (i = 0; i < dc_state->stream_count; i++) {
struct dc_dsc_policy dsc_policy = {0}; struct dc_dsc_policy dsc_policy = {0};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment