diff options
Diffstat (limited to '0104-drm-amdgpu-display-mst-Fix_mst_state-pbn_div_and_slot_count_assignments.patch')
-rw-r--r-- | 0104-drm-amdgpu-display-mst-Fix_mst_state-pbn_div_and_slot_count_assignments.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/0104-drm-amdgpu-display-mst-Fix_mst_state-pbn_div_and_slot_count_assignments.patch b/0104-drm-amdgpu-display-mst-Fix_mst_state-pbn_div_and_slot_count_assignments.patch new file mode 100644 index 000000000000..9c4da2e377e9 --- /dev/null +++ b/0104-drm-amdgpu-display-mst-Fix_mst_state-pbn_div_and_slot_count_assignments.patch @@ -0,0 +1,85 @@ +From 688c752c92a868114d754da67a6d109dc1903e9a Mon Sep 17 00:00:00 2001 +From: Lyude Paul <lyude@redhat.com> +Date: Wed, 23 Nov 2022 14:50:16 -0500 +Subject: [PATCH] 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/2171 +Signed-off-by: Lyude Paul <lyude@redhat.com> +Signed-off-by: Harry Wentland <harry.wentland@amd.com> +Fixes: 4d07b0bc4034 ("drm/display/dp_mst: Move all payload info into the atomic state") +Cc: stable@vger.kernel.org # 6.1 +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 24 +++++++++++++++++++ + .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 5 ---- + 2 files changed, 24 insertions(+), 5 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 e10f1f15c9c434..e7ff09bdf53335 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -9397,6 +9397,8 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, + struct drm_connector_state *old_con_state, *new_con_state; + struct drm_crtc *crtc; + 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_state *old_plane_state, *new_plane_state; + enum dc_status status; +@@ -9652,6 +9654,28 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, + 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 + * bandwidth. Anything that affects bandwidth needs to go through +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +index 6483ba266893d3..4acd0b4afb4861 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +@@ -897,11 +897,6 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state, + if (IS_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 */ + for (i = 0; i < dc_state->stream_count; i++) { + struct dc_dsc_policy dsc_policy = {0}; |