drm/amd/display: introduce mpo detection flags
authorMikita Lipski <mikita.lipski@amd.com>
Wed, 15 Dec 2021 16:01:45 +0000 (11:01 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 7 Jan 2022 22:21:53 +0000 (17:21 -0500)
[why]
We want to know if new crtc state is enabling MPO configuration before
enabling it.
[how]
Detect if both primary and overlay planes are enabled on the same CRTC.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Mikita Lipski <mikita.lipski@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.h

index 344384a6c632816113b7c44dee09f9513b638d6a..e6ad1d426ba393e8482d540b0de46733617e39f0 100644 (file)
@@ -10761,6 +10761,8 @@ static int dm_update_plane_state(struct dc *dc,
 
                dm_new_plane_state->dc_state = dc_new_plane_state;
 
+               dm_new_crtc_state->mpo_requested |= (plane->type == DRM_PLANE_TYPE_OVERLAY);
+
                /* Tell DC to do a full surface update every time there
                 * is a plane change. Inefficient, but works for now.
                 */
@@ -10913,7 +10915,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
        enum dc_status status;
        int ret, i;
        bool lock_and_validation_needed = false;
-       struct dm_crtc_state *dm_old_crtc_state;
+       struct dm_crtc_state *dm_old_crtc_state, *dm_new_crtc_state;
 #if defined(CONFIG_DRM_AMD_DC_DCN)
        struct dsc_mst_fairness_vars vars[MAX_PIPES];
        struct drm_dp_mst_topology_state *mst_state;
@@ -11095,6 +11097,12 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                goto fail;
        }
 
+       for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
+               dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
+               if (dm_new_crtc_state->mpo_requested)
+                       DRM_DEBUG_DRIVER("MPO enablement requested on crtc:[%p]\n", crtc);
+       }
+
        /* Check cursor planes scaling */
        for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
                ret = dm_check_crtc_cursor(state, crtc, new_crtc_state);
index c98e402eab0ccdd8b5121ed065ee36dbb8edc9fe..b9a69b0cef23b722e2defd41a4fc6497d0f007a3 100644 (file)
@@ -626,6 +626,8 @@ struct dm_crtc_state {
        bool cm_has_degamma;
        bool cm_is_degamma_srgb;
 
+       bool mpo_requested;
+
        int update_type;
        int active_planes;