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:
parent
95587a75de
commit
8cc3759a6c
|
@ -5066,35 +5066,14 @@ static void intel_iommu_domain_free(struct iommu_domain *domain)
|
|||
domain_exit(to_dmar_domain(domain));
|
||||
}
|
||||
|
||||
static int intel_iommu_attach_device(struct iommu_domain *domain,
|
||||
struct device *dev)
|
||||
static int prepare_domain_attach_device(struct iommu_domain *domain,
|
||||
struct device *dev)
|
||||
{
|
||||
struct dmar_domain *dmar_domain = to_dmar_domain(domain);
|
||||
struct intel_iommu *iommu;
|
||||
int addr_width;
|
||||
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);
|
||||
if (!iommu)
|
||||
return -ENODEV;
|
||||
|
@ -5127,7 +5106,40 @@ static int intel_iommu_attach_device(struct iommu_domain *domain,
|
|||
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,
|
||||
|
|
Loading…
Reference in New Issue