diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2014-03-09 23:24:46 +0100 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2014-03-24 15:07:51 +0100 |
commit | e1f167f3fd69d794b570fc4d3159191568ff9b70 (patch) | |
tree | 1254e730ba12f1a42c80c25b3ff57a54b10ffaf9 /drivers/iommu | |
parent | iommu/vt-d: Make device_to_iommu() cope with non-PCI devices (diff) | |
download | linux-e1f167f3fd69d794b570fc4d3159191568ff9b70.tar.xz linux-e1f167f3fd69d794b570fc4d3159191568ff9b70.zip |
iommu/vt-d: Make domain_context_mapp{ed,ing}() take struct device
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/iommu')
-rw-r--r-- | drivers/iommu/intel-iommu.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index cfc5eef81b82..949aa29dba8b 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -1840,24 +1840,25 @@ static int domain_context_mapping_one(struct dmar_domain *domain, } static int -domain_context_mapping(struct dmar_domain *domain, struct pci_dev *pdev, - int translation) +domain_context_mapping(struct dmar_domain *domain, struct device *dev, + int translation) { int ret; - struct pci_dev *tmp, *parent; + struct pci_dev *pdev, *tmp, *parent; struct intel_iommu *iommu; u8 bus, devfn; - iommu = device_to_iommu(&pdev->dev, &bus, &devfn); + iommu = device_to_iommu(dev, &bus, &devfn); if (!iommu) return -ENODEV; ret = domain_context_mapping_one(domain, iommu, bus, devfn, translation); - if (ret) + if (ret || !dev_is_pci(dev)) return ret; /* dependent device mapping */ + pdev = to_pci_dev(dev); tmp = pci_find_upstream_pcie_bridge(pdev); if (!tmp) return 0; @@ -1882,21 +1883,23 @@ domain_context_mapping(struct dmar_domain *domain, struct pci_dev *pdev, translation); } -static int domain_context_mapped(struct pci_dev *pdev) +static int domain_context_mapped(struct device *dev) { int ret; - struct pci_dev *tmp, *parent; + struct pci_dev *pdev, *tmp, *parent; struct intel_iommu *iommu; u8 bus, devfn; - iommu = device_to_iommu(&pdev->dev, &bus, &devfn); + iommu = device_to_iommu(dev, &bus, &devfn); if (!iommu) return -ENODEV; ret = device_context_mapped(iommu, bus, devfn); - if (!ret) + if (!ret || !dev_is_pci(dev)) return ret; + /* dependent device mapping */ + pdev = to_pci_dev(dev); tmp = pci_find_upstream_pcie_bridge(pdev); if (!tmp) return ret; @@ -2361,7 +2364,7 @@ static int iommu_prepare_identity_map(struct pci_dev *pdev, goto error; /* context entry init */ - ret = domain_context_mapping(domain, pdev, CONTEXT_TT_MULTI_LEVEL); + ret = domain_context_mapping(domain, &pdev->dev, CONTEXT_TT_MULTI_LEVEL); if (ret) goto error; @@ -2485,7 +2488,7 @@ static int domain_add_dev_info(struct dmar_domain *domain, if (ndomain != domain) return -EBUSY; - ret = domain_context_mapping(domain, pdev, translation); + ret = domain_context_mapping(domain, &pdev->dev, translation); if (ret) { domain_remove_one_dev_info(domain, pdev); return ret; @@ -2870,8 +2873,8 @@ static struct dmar_domain *__get_valid_domain_for_dev(struct pci_dev *pdev) } /* make sure context mapping is ok */ - if (unlikely(!domain_context_mapped(pdev))) { - ret = domain_context_mapping(domain, pdev, + if (unlikely(!domain_context_mapped(&pdev->dev))) { + ret = domain_context_mapping(domain, &pdev->dev, CONTEXT_TT_MULTI_LEVEL); if (ret) { printk(KERN_ERR @@ -4159,7 +4162,7 @@ static int intel_iommu_attach_device(struct iommu_domain *domain, u8 bus, devfn; /* normally pdev is not mapped */ - if (unlikely(domain_context_mapped(pdev))) { + if (unlikely(domain_context_mapped(&pdev->dev))) { struct dmar_domain *old_domain; old_domain = find_domain(dev); |