mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
VT-d: correct ATS checking for root complex integrated devices
Spec version 4.1 says "The ATSR structures identifies PCI Express Root-Ports supporting Address Translation Services (ATS) transactions. Software must enable ATS on endpoint devices behind a Root Port only if the Root Port is reported as supporting ATS transactions." Clearly root complex integrated devices aren't "behind root ports", matching my observation on a SapphireRapids system having an ATS- capable root complex integrated device. Hence for such devices we shouldn't try to locate a corresponding ATSR. Since both pci_find_ext_capability() and pci_find_cap_offset() return "unsigned int", change "pos" to that type at the same time. Fixes:903b93211f("[VTD] laying the ground work for ATS") Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Roger Pau Monné <roger.pau@citrix.com> master commit:04e31583bamaster date: 2024-05-06 09:22:45 +0200
This commit is contained in:
1 parent
47cf06c09a
commit
a4c5bbb9db
1 file changed
+7
-2
@@ -44,7 +44,7 @@ struct acpi_drhd_unit *find_ats_dev_drhd(struct vtd_iommu *iommu)
|
||||
int ats_device(const struct pci_dev *pdev, const struct acpi_drhd_unit *drhd)
|
||||
{
|
||||
struct acpi_drhd_unit *ats_drhd;
|
||||
int pos;
|
||||
unsigned int pos, expfl = 0;
|
||||
|
||||
if ( !ats_enabled || !iommu_qinval )
|
||||
return 0;
|
||||
@@ -53,7 +53,12 @@ int ats_device(const struct pci_dev *pdev, const struct acpi_drhd_unit *drhd)
|
||||
!ecap_dev_iotlb(drhd->iommu->ecap) )
|
||||
return 0;
|
||||
|
||||
if ( !acpi_find_matched_atsr_unit(pdev) )
|
||||
pos = pci_find_cap_offset(pdev->sbdf, PCI_CAP_ID_EXP);
|
||||
if ( pos )
|
||||
expfl = pci_conf_read16(pdev->sbdf, pos + PCI_EXP_FLAGS);
|
||||
|
||||
if ( MASK_EXTR(expfl, PCI_EXP_FLAGS_TYPE) != PCI_EXP_TYPE_RC_END &&
|
||||
!acpi_find_matched_atsr_unit(pdev) )
|
||||
return 0;
|
||||
|
||||
ats_drhd = find_ats_dev_drhd(drhd->iommu);
|
||||
|
||||