RE: [PATCH] drm/amdgpu: skip the noirq suspend reset for a switcheroo-parked GPU
From: Deucher, Alexander
Date: Mon Sep 21 2026 - 17:48:22 EST
Public
Applied. Thanks!
> -----Original Message-----
> From: Theo Andersen Carton <andersen.theo@xxxxxxxxx>
> Sent: Thursday, September 17, 2026 3:15 PM
> To: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Koenig, Christian
> <Christian.Koenig@xxxxxxx>
> Cc: airlied@xxxxxxxxx; simona@xxxxxxxx; kai.heng.feng@xxxxxxxxxxxxx; amd-
> gfx@xxxxxxxxxxxxxxxxxxxxx; dri-devel@xxxxxxxxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; Theo Andersen Carton <andersen.theo@xxxxxxxxx>;
> stable@xxxxxxxxxxxxxxx
> 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: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Theo Andersen Carton <andersen.theo@xxxxxxxxx>
> ---
> 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