aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1787-drm-amd-display-Relax-requirements-for-CRTCs-to-be-e.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1787-drm-amd-display-Relax-requirements-for-CRTCs-to-be-e.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1787-drm-amd-display-Relax-requirements-for-CRTCs-to-be-e.patch127
1 files changed, 127 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1787-drm-amd-display-Relax-requirements-for-CRTCs-to-be-e.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1787-drm-amd-display-Relax-requirements-for-CRTCs-to-be-e.patch
new file mode 100644
index 00000000..8e943c34
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1787-drm-amd-display-Relax-requirements-for-CRTCs-to-be-e.patch
@@ -0,0 +1,127 @@
+From fa34232f38aca97d5f3fc07a6f89dc53a6be475b Mon Sep 17 00:00:00 2001
+From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Date: Fri, 29 Mar 2019 14:58:32 -0400
+Subject: [PATCH 1787/2940] drm/amd/display: Relax requirements for CRTCs to be
+ enabled
+
+[Why]
+As long as we have at least one non-cursor plane enabled on a CRTC then
+the CRTC itself can remain enabled.
+
+This will allow for commits where there's an overlay plane enabled but
+no primary plane enabled.
+
+[How]
+Remove existing primary plane fb != NULL checks and replace them with
+the new does_crtc_have_active_plane helper.
+
+This will be called from atomic check when validating the CRTC.
+
+Since the primary plane state can now potentially be NULL we'll need
+to guard for that when accessing it in some of the cursor logic.
+
+Change-Id: I25f32ff13d1e81e20eea233ffdddadf704ecd8d2
+Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Reviewed-by: David Francis <David.Francis@amd.com>
+Acked-by: Bhawanpreet Lakha <Bhawanpreet Lakha@amd.com>
+---
+ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 55 +++++++++++++++----
+ 1 file changed, 44 insertions(+), 11 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 7b6d53eba878..86405f4acc50 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -3974,6 +3974,38 @@ static void dm_crtc_helper_disable(struct drm_crtc *crtc)
+ {
+ }
+
++static bool does_crtc_have_active_plane(struct drm_crtc_state *new_crtc_state)
++{
++ struct drm_atomic_state *state = new_crtc_state->state;
++ struct drm_plane *plane;
++ int num_active = 0;
++
++ drm_for_each_plane_mask(plane, state->dev, new_crtc_state->plane_mask) {
++ struct drm_plane_state *new_plane_state;
++
++ /* Cursor planes are "fake". */
++ if (plane->type == DRM_PLANE_TYPE_CURSOR)
++ continue;
++
++ new_plane_state = drm_atomic_get_new_plane_state(state, plane);
++
++ if (!new_plane_state) {
++ /*
++ * The plane is enable on the CRTC and hasn't changed
++ * state. This means that it previously passed
++ * validation and is therefore enabled.
++ */
++ num_active += 1;
++ continue;
++ }
++
++ /* We need a framebuffer to be considered enabled. */
++ num_active += (new_plane_state->fb != NULL);
++ }
++
++ return num_active > 0;
++}
++
+ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
+ struct drm_crtc_state *state)
+ {
+@@ -3992,6 +4024,11 @@ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
+ if (!dm_crtc_state->stream)
+ return 0;
+
++ /* We want at least one hardware plane enabled to use the stream. */
++ if (state->enable && state->active &&
++ !does_crtc_have_active_plane(state))
++ return -EINVAL;
++
+ if (dc_validate_stream(dc, dm_crtc_state->stream) == DC_OK)
+ return 0;
+
+@@ -4969,9 +5006,13 @@ static int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc,
+
+ x = plane->state->crtc_x;
+ y = plane->state->crtc_y;
+- /* avivo cursor are offset into the total surface */
+- x += crtc->primary->state->src_x >> 16;
+- y += crtc->primary->state->src_y >> 16;
++
++ if (crtc->primary->state) {
++ /* avivo cursor are offset into the total surface */
++ x += crtc->primary->state->src_x >> 16;
++ y += crtc->primary->state->src_y >> 16;
++ }
++
+ if (x < 0) {
+ xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1);
+ x = 0;
+@@ -5990,7 +6031,6 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
+ struct amdgpu_dm_connector *aconnector = NULL;
+ struct drm_connector_state *drm_new_conn_state = NULL, *drm_old_conn_state = NULL;
+ struct dm_connector_state *dm_new_conn_state = NULL, *dm_old_conn_state = NULL;
+- struct drm_plane_state *new_plane_state = NULL;
+
+ new_stream = NULL;
+
+@@ -5998,13 +6038,6 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
+ dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
+ acrtc = to_amdgpu_crtc(crtc);
+
+- new_plane_state = drm_atomic_get_new_plane_state(state, new_crtc_state->crtc->primary);
+-
+- if (new_crtc_state->enable && new_plane_state && !new_plane_state->fb) {
+- ret = -EINVAL;
+- goto fail;
+- }
+-
+ aconnector = amdgpu_dm_find_first_crtc_matching_connector(state, crtc);
+
+ /* TODO This hack should go away */
+--
+2.17.1
+