|
@@ -46,6 +46,7 @@
|
|
|
#include <linux/moduleparam.h>
|
|
|
#include <linux/version.h>
|
|
|
#include <linux/types.h>
|
|
|
+#include <linux/pm_runtime.h>
|
|
|
|
|
|
#include <drm/drmP.h>
|
|
|
#include <drm/drm_atomic.h>
|
|
@@ -4278,6 +4279,8 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
|
|
|
if (dm_old_crtc_state->stream)
|
|
|
remove_stream(adev, acrtc, dm_old_crtc_state->stream);
|
|
|
|
|
|
+ pm_runtime_get_noresume(dev->dev);
|
|
|
+
|
|
|
acrtc->enabled = true;
|
|
|
acrtc->hw_mode = new_crtc_state->mode;
|
|
|
crtc->hwmode = new_crtc_state->mode;
|
|
@@ -4466,6 +4469,16 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
|
|
|
drm_atomic_helper_wait_for_flip_done(dev, state);
|
|
|
|
|
|
drm_atomic_helper_cleanup_planes(dev, state);
|
|
|
+
|
|
|
+ /* Finally, drop a runtime PM reference for each newly disabled CRTC,
|
|
|
+ * so we can put the GPU into runtime suspend if we're not driving any
|
|
|
+ * displays anymore
|
|
|
+ */
|
|
|
+ pm_runtime_mark_last_busy(dev->dev);
|
|
|
+ for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
|
|
+ if (old_crtc_state->active && !new_crtc_state->active)
|
|
|
+ pm_runtime_put_autosuspend(dev->dev);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|