diff options
author | Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> | 2020-10-08 14:43:59 -0400 |
---|---|---|
committer | Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> | 2020-10-08 15:16:22 -0400 |
commit | 5dcf8eb3991298ab764be6f83eaa48f75d49e77a (patch) | |
tree | 5c475578845880441f631a53ff7ef2d017c95abf | |
parent | d710992187deab057941f5f2145e35c069684975 (diff) |
drm/amd/display: add copy of drm_dp_mst_add_affected_dsc_crtc()
There is a bug in drm_dp_mst_add_affected_dsc_crtc(), that caused mst
dsc hotplugs to not work because atomic check will fail. This was fixed
upstream but is not guaranteed to be in the kernel that dkms is running
on.
Add a copy of drm_dp_mst_add_affected_dsc_crtc() with the fix.
Reference: 2ee394a19a39 ("drm/dp_mst: Don't return error code when crtc is null")
Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 49 |
1 files changed, 48 insertions, 1 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 4fa6bed9873f..79180f36108a 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -9373,6 +9373,53 @@ static int dm_update_plane_state(struct dc *dc, } #if defined(HAVE_DRM_DP_MST_ADD_AFFECTED_DSC_CRTCS) +int amdgpu_dm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state, struct drm_dp_mst_topology_mgr *mgr) +{ + struct drm_dp_mst_topology_state *mst_state; + struct drm_dp_vcpi_allocation *pos; + struct drm_connector *connector; + struct drm_connector_state *conn_state; + struct drm_crtc *crtc; + struct drm_crtc_state *crtc_state; + + mst_state = drm_atomic_get_mst_topology_state(state, mgr); + + if (IS_ERR(mst_state)) + return -EINVAL; + + list_for_each_entry(pos, &mst_state->vcpis, next) { + + connector = pos->port->connector; + + if (!connector) + return -EINVAL; + + conn_state = drm_atomic_get_connector_state(state, connector); + + if (IS_ERR(conn_state)) + return PTR_ERR(conn_state); + + crtc = conn_state->crtc; + + if (!crtc) + continue; + + if (!drm_dp_mst_dsc_aux_for_port(pos->port)) + continue; + + crtc_state = drm_atomic_get_crtc_state(mst_state->base.state, crtc); + + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); + + DRM_DEBUG_ATOMIC("[MST MGR:%p] Setting mode_changed flag on CRTC %p\n", + mgr, crtc); + + crtc_state->mode_changed = true; + } + return 0; +} + static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm_crtc *crtc) { struct drm_connector *connector; @@ -9393,7 +9440,7 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm if (!aconnector) return 0; - return drm_dp_mst_add_affected_dsc_crtcs(state, &aconnector->mst_port->mst_mgr); + return amdgpu_dm_dp_mst_add_affected_dsc_crtcs(state, &aconnector->mst_port->mst_mgr); } #endif |