aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1759-drm-amd-display-Recreate-private_obj-state-during-S3.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1759-drm-amd-display-Recreate-private_obj-state-during-S3.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1759-drm-amd-display-Recreate-private_obj-state-during-S3.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1759-drm-amd-display-Recreate-private_obj-state-during-S3.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1759-drm-amd-display-Recreate-private_obj-state-during-S3.patch
new file mode 100644
index 00000000..92c1898f
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1759-drm-amd-display-Recreate-private_obj-state-during-S3.patch
@@ -0,0 +1,61 @@
+From 134e238d544bd601b110fe885c1bdb5dae221c71 Mon Sep 17 00:00:00 2001
+From: Leo Li <sunpeng.li@amd.com>
+Date: Tue, 19 Mar 2019 19:29:16 -0400
+Subject: [PATCH 1759/2940] drm/amd/display: Recreate private_obj->state during
+ S3 resume
+
+[Why]
+
+When entering S3, amdgpu first calls DRM to cache the current atomic
+state, then commit the 'all-disabled' state. This sets dc->current_state
+to point at the private atomic object's dm_atomic_state->context, as
+any regular atomic commit would.
+
+Afterwards, amdgpu_dm calls dc_set_power_state() with S3 power state.
+This invalidates dc->current_state by wiping it to 0, consequently
+wiping dm_atomic_state->context.
+
+During resume, the cached atomic state is restored. When getting the
+private object however, the dm_atomic_state - containing the wiped
+context - is duplicated into the atomic state. This causes DC validation
+to fail during atomic check, as necessary function pointers in dc_state
+are now NULL.
+
+[How]
+
+Recreate the private object's dm_atomic_state->context during resume,
+restoring any static values such as function pointers.
+
+A TODO item is added to move static read-only values out of dc_state -
+they shouldn't be there anyways.
+
+Signed-off-by: Leo Li <sunpeng.li@amd.com>
+Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
+---
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+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 e578845a98c5..80a8cddd3db7 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -983,9 +983,16 @@ static int dm_resume(void *handle)
+ struct drm_plane *plane;
+ struct drm_plane_state *new_plane_state;
+ struct dm_plane_state *dm_new_plane_state;
++ struct dm_atomic_state *dm_state = to_dm_atomic_state(dm->atomic_obj.state);
+ enum dc_connection_type new_connection_type = dc_connection_none;
+ int i;
+
++ /* Recreate dc_state - DC invalidates it when setting power state to S3. */
++ dc_release_state(dm_state->context);
++ dm_state->context = dc_create_state(dm->dc);
++ /* TODO: Remove dc_state->dccg, use dc->dccg directly. */
++ dc_resource_state_construct(dm->dc, dm_state->context);
++
+ /* power on hardware */
+ dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
+
+--
+2.17.1
+