lkml.org 
[lkml]   [2019]   [May]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 3/7] iommu/vt-d: Introduce is_downstream_to_pci_bridge helper
    Date
    Several call sites are about to check whether a device belongs
    to the PCI sub-hierarchy of a candidate PCI-PCI bridge.
    Introduce an helper to perform that check.

    Signed-off-by: Eric Auger <eric.auger@redhat.com>
    ---
    drivers/iommu/intel-iommu.c | 37 +++++++++++++++++++++++++++++--------
    1 file changed, 29 insertions(+), 8 deletions(-)

    diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
    index 590a0e78d11d..15c2f9677491 100644
    --- a/drivers/iommu/intel-iommu.c
    +++ b/drivers/iommu/intel-iommu.c
    @@ -736,12 +736,39 @@ static int iommu_dummy(struct device *dev)
    return dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO;
    }

    +/* is_downstream_to_pci_bridge - test if a device belongs to the
    + * PCI sub-hierarchy of a candidate PCI-PCI bridge
    + *
    + * @dev: candidate PCI device belonging to @bridge PCI sub-hierarchy
    + * @bridge: the candidate PCI-PCI bridge
    + *
    + * Return: true if @dev belongs to @bridge PCI sub-hierarchy
    + */
    +static bool
    +is_downstream_to_pci_bridge(struct device *dev, struct device *bridge)
    +{
    + struct pci_dev *pdev, *pbridge;
    +
    + if (!dev_is_pci(dev) || !dev_is_pci(bridge))
    + return false;
    +
    + pdev = to_pci_dev(dev);
    + pbridge = to_pci_dev(bridge);
    +
    + if (pbridge->subordinate &&
    + pbridge->subordinate->number <= pdev->bus->number &&
    + pbridge->subordinate->busn_res.end >= pdev->bus->number)
    + return true;
    +
    + return false;
    +}
    +
    static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn)
    {
    struct dmar_drhd_unit *drhd = NULL;
    struct intel_iommu *iommu;
    struct device *tmp;
    - struct pci_dev *ptmp, *pdev = NULL;
    + struct pci_dev *pdev = NULL;
    u16 segment = 0;
    int i;

    @@ -787,13 +814,7 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
    goto out;
    }

    - if (!pdev || !dev_is_pci(tmp))
    - continue;
    -
    - ptmp = to_pci_dev(tmp);
    - if (ptmp->subordinate &&
    - ptmp->subordinate->number <= pdev->bus->number &&
    - ptmp->subordinate->busn_res.end >= pdev->bus->number)
    + if (is_downstream_to_pci_bridge(dev, tmp))
    goto got_pdev;
    }

    --
    2.20.1
    \
     
     \ /
      Last update: 2019-05-16 12:09    [W:4.030 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site