iommu/vt-d: Move common code out of iommu_attch_device()
This part of code could be used by both normal and aux domain specific attach entries. Hence move them into a common function to avoid duplication. Cc: Ashok Raj <ashok.raj@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
@@ -5066,35 +5066,14 @@ static void intel_iommu_domain_free(struct iommu_domain *domain)
|
|||||||
domain_exit(to_dmar_domain(domain));
|
domain_exit(to_dmar_domain(domain));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int intel_iommu_attach_device(struct iommu_domain *domain,
|
static int prepare_domain_attach_device(struct iommu_domain *domain,
|
||||||
struct device *dev)
|
struct device *dev)
|
||||||
{
|
{
|
||||||
struct dmar_domain *dmar_domain = to_dmar_domain(domain);
|
struct dmar_domain *dmar_domain = to_dmar_domain(domain);
|
||||||
struct intel_iommu *iommu;
|
struct intel_iommu *iommu;
|
||||||
int addr_width;
|
int addr_width;
|
||||||
u8 bus, devfn;
|
u8 bus, devfn;
|
||||||
|
|
||||||
if (device_is_rmrr_locked(dev)) {
|
|
||||||
dev_warn(dev, "Device is ineligible for IOMMU domain attach due to platform RMRR requirement. Contact your platform vendor.\n");
|
|
||||||
return -EPERM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* normally dev is not mapped */
|
|
||||||
if (unlikely(domain_context_mapped(dev))) {
|
|
||||||
struct dmar_domain *old_domain;
|
|
||||||
|
|
||||||
old_domain = find_domain(dev);
|
|
||||||
if (old_domain) {
|
|
||||||
rcu_read_lock();
|
|
||||||
dmar_remove_one_dev_info(dev);
|
|
||||||
rcu_read_unlock();
|
|
||||||
|
|
||||||
if (!domain_type_is_vm_or_si(old_domain) &&
|
|
||||||
list_empty(&old_domain->devices))
|
|
||||||
domain_exit(old_domain);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iommu = device_to_iommu(dev, &bus, &devfn);
|
iommu = device_to_iommu(dev, &bus, &devfn);
|
||||||
if (!iommu)
|
if (!iommu)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@@ -5127,7 +5106,40 @@ static int intel_iommu_attach_device(struct iommu_domain *domain,
|
|||||||
dmar_domain->agaw--;
|
dmar_domain->agaw--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return domain_add_dev_info(dmar_domain, dev);
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int intel_iommu_attach_device(struct iommu_domain *domain,
|
||||||
|
struct device *dev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (device_is_rmrr_locked(dev)) {
|
||||||
|
dev_warn(dev, "Device is ineligible for IOMMU domain attach due to platform RMRR requirement. Contact your platform vendor.\n");
|
||||||
|
return -EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* normally dev is not mapped */
|
||||||
|
if (unlikely(domain_context_mapped(dev))) {
|
||||||
|
struct dmar_domain *old_domain;
|
||||||
|
|
||||||
|
old_domain = find_domain(dev);
|
||||||
|
if (old_domain) {
|
||||||
|
rcu_read_lock();
|
||||||
|
dmar_remove_one_dev_info(dev);
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
if (!domain_type_is_vm_or_si(old_domain) &&
|
||||||
|
list_empty(&old_domain->devices))
|
||||||
|
domain_exit(old_domain);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = prepare_domain_attach_device(domain, dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return domain_add_dev_info(to_dmar_domain(domain), dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_iommu_detach_device(struct iommu_domain *domain,
|
static void intel_iommu_detach_device(struct iommu_domain *domain,
|
||||||
|
Reference in New Issue
Block a user