drm/nouveau: fix hibernate on disabled GPU
authorChristoph Rudorff <chris@rudorff.com>
Tue, 25 Mar 2025 12:44:36 +0000 (13:44 +0100)
committerLyude Paul <lyude@redhat.com>
Fri, 28 Mar 2025 22:05:53 +0000 (18:05 -0400)
Hibernate bricks the machine if a discrete GPU was disabled via

echo IGD > /sys/kernel/debug/vgaswitcheroo/switch

The freeze and thaw handler lacks checking the GPU power state,
as suspend and resume do.

This patch add the checks and fix this issue.

Signed-off-by: Christoph Rudorff <chris@rudorff.com>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Link: https://lore.kernel.org/r/20250325-nouveau-fix-hibernate-v2-1-2bd5c13fb953@rudorff.com
drivers/gpu/drm/nouveau/nouveau_drm.c

index e154d08857c55bcd6fec2a7f284b6c52eead5b5a..c69139701056d7bac234c95589b4ff55ae4a1bf9 100644 (file)
@@ -1079,6 +1079,10 @@ nouveau_pmops_freeze(struct device *dev)
 {
        struct nouveau_drm *drm = dev_get_drvdata(dev);
 
+       if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF ||
+           drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
+               return 0;
+
        return nouveau_do_suspend(drm, false);
 }
 
@@ -1087,6 +1091,10 @@ nouveau_pmops_thaw(struct device *dev)
 {
        struct nouveau_drm *drm = dev_get_drvdata(dev);
 
+       if (drm->dev->switch_power_state == DRM_SWITCH_POWER_OFF ||
+           drm->dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
+               return 0;
+
        return nouveau_do_resume(drm, false);
 }