You are welcome and thanks for the prompt inclusion!

Luigi Lauro

Il giorno gio 15 ott 2026 alle 15:41 Alex Deucher <[email protected]>
ha scritto:

> 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