RE: [PATCH] drm/amdgpu: check ASPM on the dGPU host link
"Wang, Yang(Kevin)" <[email protected]> Thu, 6 Aug 2026 11:30:15 +0000
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <BN9PR12MB5211DE7BDF028DF3441F97FA82D22@BN9PR12MB5211.namprd12.prod.outlook.com> |
AMD General > -----Original Message----- > From: Feng, Kenneth <[email protected]> > Sent: Thursday, August 6, 2026 7:17 PM > To: Wang, Yang(Kevin) <[email protected]>; amd- > [email protected] > Cc: Deucher, Alexander <[email protected]>; Zhang, Hawking > <[email protected]> > Subject: RE: [PATCH] drm/amdgpu: check ASPM on the dGPU host link > > AMD General > > dev_info() could flood dmesg, better to use dev_dbg(). > Reviewed-by: Kenneth Feng <[email protected]> Thanks, will refine it before submitting. (and Asad raised the same suggestion during our offline talk) Best Regards, Kevin > > -----Original Message----- > From: Wang, Yang(Kevin) <[email protected]> > Sent: Thursday, August 6, 2026 1:47 PM > To: [email protected] > Cc: Deucher, Alexander <[email protected]>; Zhang, Hawking > <[email protected]>; Feng, Kenneth <[email protected]> > Subject: [PATCH] drm/amdgpu: check ASPM on the dGPU host link > > dGPUs with an internal PCIe switch expose graphics functions below the > switch downstream port. The automatic ASPM check uses the display > endpoint and evaluates the internal link instead of the host link. > > Use the switch upstream port for the check and report the selected link. > > Fixes: 0ab5d711ec74 ("drm/amd: Refactor `amdgpu_aspm` to be evaluated > per device") > Signed-off-by: Yang Wang <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 50 > +++++++++++++++++++++- > 1 file changed, 49 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 2b9799033174..e68a5ddcae69 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -1344,6 +1344,31 @@ static bool > amdgpu_device_aspm_support_quirk(struct amdgpu_device *adev) #endif } > > +/* > + * Some dGPUs expose their display endpoint below an internal PCIe switch. > + * Use the switch upstream port to query the host-facing link. > + */ > +static struct pci_dev *amdgpu_device_get_aspm_pdev(struct > amdgpu_device > +*adev) { > + struct pci_dev *swds, *swus; > + > + swds = pci_upstream_bridge(adev->pdev); > + if (!swds || > + (swds->vendor != PCI_VENDOR_ID_ATI && > + swds->vendor != PCI_VENDOR_ID_AMD) || > + pci_pcie_type(swds) != PCI_EXP_TYPE_DOWNSTREAM) > + return adev->pdev; > + > + swus = pci_upstream_bridge(swds); > + if (!swus || > + (swus->vendor != PCI_VENDOR_ID_ATI && > + swus->vendor != PCI_VENDOR_ID_AMD) || > + pci_pcie_type(swus) != PCI_EXP_TYPE_UPSTREAM) > + return adev->pdev; > + > + return swus; > +} > + > /** > * amdgpu_device_should_use_aspm - check if the device should program > ASPM > * > @@ -1356,6 +1381,9 @@ static bool > amdgpu_device_aspm_support_quirk(struct amdgpu_device *adev) > */ > bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev) { > + struct pci_dev *aspm_pdev, *parent; > + bool enabled; > + > switch (amdgpu_aspm) { > case -1: > break; > @@ -1370,7 +1398,27 @@ bool amdgpu_device_should_use_aspm(struct > amdgpu_device *adev) > return false; > if (amdgpu_device_aspm_support_quirk(adev)) > return false; > - return pcie_aspm_enabled(adev->pdev); > + > + /* > + * pcie_aspm_enabled() checks the link between its argument and > + * the immediate upstream bridge. Use SWUS for dGPUs with an > + * internal switch so that this is the host-facing link. > + */ > + aspm_pdev = amdgpu_device_get_aspm_pdev(adev); > + parent = pci_upstream_bridge(aspm_pdev); > + if (!parent) { > + dev_info(adev->dev, "ASPM: no upstream PCIe link for %s\n", > + pci_name(aspm_pdev)); > + return false; > + } > + > + enabled = pcie_aspm_enabled(aspm_pdev); > + /* Report the exact link used for the automatic ASPM decision. */ > + dev_info(adev->dev, "ASPM: link %s <-> %s is %s\n", > + pci_name(parent), pci_name(aspm_pdev), > + enabled ? "enabled" : "disabled"); > + > + return enabled; > } > > /* if we get transitioned to only one device, take VGA back */ > -- > 2.54.0 >