Public Applied. Thanks!
> -----Original Message----- > From: Theo Andersen Carton <[email protected]> > Sent: Thursday, September 17, 2026 3:15 PM > To: Deucher, Alexander <[email protected]>; Koenig, Christian > <[email protected]> > Cc: [email protected]; [email protected]; [email protected]; amd- > [email protected]; [email protected]; linux- > [email protected]; Theo Andersen Carton <[email protected]>; > [email protected] > Subject: [PATCH] drm/amdgpu: skip the noirq suspend reset for a switcheroo- > parked GPU > > amdgpu_pmops_suspend_noirq() resets the ASIC unconditionally. When the > GPU has been parked by vga_switcheroo it has neither power nor a PCIe link, > so the reset cannot reach it: pci_set_power_state() reports the device as > inaccessible and amdgpu_asic_reset() returns -EINVAL. A failure there aborts > the entire noirq suspend phase, and with it the system suspend, so the > machine cannot sleep at all while the GPU is switched off. > > amdgpu_device_prepare(), amdgpu_device_suspend() and > amdgpu_device_resume() all bail out early on DRM_SWITCH_POWER_OFF. > This callback was added later, for an unrelated reason, and did not inherit > the > check. nouveau guards every one of its PM callbacks the same way. > > Bail out the same way here. On a single-GPU system switch_power_state is > never DRM_SWITCH_POWER_OFF, so this is a no-op there. > > Found on a MacBookPro11,5, where the Radeon is powered down through > apple-gmux so that the internal panel can be driven by the iGPU instead. > Every suspend failed in amdgpu_pmops_suspend_noirq() while the card was > off; with this check a full S3 cycle completes. > > Fixes: 9e051720f9d3 ("drm/amdgpu: Ensure HDA function is suspended > before ASIC reset") > Cc: [email protected] > Signed-off-by: Theo Andersen Carton <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > index 5c33c19fd9bc..d9d794a7db96 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > @@ -2664,6 +2664,14 @@ static int amdgpu_pmops_suspend_noirq(struct > device *dev) > struct amdgpu_device *adev = drm_to_adev(drm_dev); > int r; > > + /* > + * A GPU parked by vga_switcheroo has no power and no PCIe link, so > the > + * ASIC reset below would fail and abort the whole noirq suspend > phase. > + * Bail out like amdgpu_device_prepare/suspend/resume() already do. > + */ > + if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF) > + return 0; > + > if (amdgpu_acpi_should_gpu_reset(adev)) { > amdgpu_device_lock_reset_domain(adev->reset_domain); > r = amdgpu_asic_reset(adev); > > base-commit: 50d05c7c76c96b90462f24debacca971d2e86713 > -- > 2.55.0
