On Thu, Oct 15, 2026 at 4:31 AM Luigi Lauro <[email protected]> wrote:
>
> amdgpu_device_supports_boco() returns true for an AMD_IS_PX device on a
> system with a hybrid ATPX method even when the device has no ACPI power
> resource (_PR3). On an APU mini PC with a discrete GPU attached over
> OCuLink, the iGPU's ATPX method reports hybrid graphics, the dGPU is
> flagged AMD_IS_PX, and runtime PM in auto mode picks BOCO:
>
>   amdgpu: ATPX Hybrid Graphics
>   amdgpu 0000:c6:00.0: Using BOCO for runtime pm
>
> In BOCO mode the driver leaves powering the device off to the PCI core,
> which can only do it through _PR3 on the upstream bridge. No device on
> this dGPU's path has _PR3, so when it runtime suspends the card stays
> powered, with its fans at about 700 rpm.
>
> Require has_pr3 for BOCO, as the function's description ("dGPU with ACPI
> power resources") says. The same card then picks BACO, which powers it
> down:
>
>   amdgpu 0000:c6:00.0: Using BACO for runtime pm
>
> This only changes systems with a hybrid ATPX method and no _PR3 on the
> dGPU's upstream bridge, where BOCO cannot cut the power today. Tested on
> one such system only, an RX 9070 XT (Navi 48) over OCuLink with a Ryzen
> AI 9 HX 470, with the change backported to 7.2.9: the stock module logs
> "Using BOCO", the patched one "Using BACO"; BACO runtime suspend powers
> the card off and it resumes cleanly. Not tested on a hybrid laptop or a
> Thunderbolt eGPU.
>
> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/5980
> Assisted-by: Claude:claude-opus-5-5
> Signed-off-by: Luigi Lauro <[email protected]>

Reviewed-by: Alex Deucher <[email protected]>

and applied.  Thanks!

> ---
> Alex asked for this on the issue. Here is the full picture, so you can
> judge which approach is best:
>
> Why _PR3: in amdgpu_pmops_runtime_suspend() the BOCO branch does nothing
> itself ("PCI core handles it for _PR3"), and has_pr3 checks exactly the
> bridge the PCI core would power off (link_partner, past the dGPU's own
> switch). On a hybrid ATPX, amdgpu_device_supports_px() is false, so the
> ATPX power-control method is not used either.
>
> Who changes: only hybrid-ATPX systems without _PR3 on that bridge. Hybrid
> laptops that have _PR3 there, which I understand is the usual design,
> are unaffected.
>
> Risks I cannot rule out:
> - BACO on older laptop chips that have never used it for runtime PM.
> - A platform that cuts the power in a way has_pr3 does not see (_PR3
>   somewhere else on the path).
> - The other users of the function change too on such a system: the
>   DPM_FLAG_SMART_SUSPEND | DPM_FLAG_MAY_SKIP_RESUME flags in
>   amdgpu_pci_probe(), amdgpu_pmops_prepare() returning 1, and
>   amdgpu_device_supports_smart_shift().
>
> Narrower alternative: leave amdgpu_device_supports_boco() alone and
> require has_pr3 only where amdgpu_device_detect_runtime_pm_mode() picks
> BOCO in the auto case, falling back to BACO. That fixes this system too
> and keeps the other three users as they are, which is the same state as
> booting it today with amdgpu.runpm=1.
>
> Please tell me which you prefer; I can send a v2 with the narrower form.
>
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index e001461..96cb4d3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -593,10 +593,8 @@ bool amdgpu_device_supports_boco(struct amdgpu_device 
> *adev)
>         if (!IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE))
>                 return false;
>
> -       if (adev->has_pr3 ||
> -           ((adev->flags & AMD_IS_PX) && amdgpu_is_atpx_hybrid()))
> -               return true;
> -       return false;
> +       /* BOCO needs a platform power resource (_PR3) to cut the power */
> +       return adev->has_pr3;
>  }
>
>  /**
> --
> 2.56.0
>

Reply via email to