Merge branches 'iommu/fixes', 'arm/smmu', 'x86/amd', 'x86/vt-d' and 'core' into next
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/fsl/mc.h>
|
||||
#include <linux/module.h>
|
||||
#include <trace/events/iommu.h>
|
||||
|
||||
static struct kset *iommu_group_kset;
|
||||
@@ -141,6 +142,7 @@ int iommu_device_register(struct iommu_device *iommu)
|
||||
spin_unlock(&iommu_device_lock);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iommu_device_register);
|
||||
|
||||
void iommu_device_unregister(struct iommu_device *iommu)
|
||||
{
|
||||
@@ -148,6 +150,7 @@ void iommu_device_unregister(struct iommu_device *iommu)
|
||||
list_del(&iommu->list);
|
||||
spin_unlock(&iommu_device_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iommu_device_unregister);
|
||||
|
||||
static struct iommu_param *iommu_get_dev_param(struct device *dev)
|
||||
{
|
||||
@@ -183,10 +186,21 @@ int iommu_probe_device(struct device *dev)
|
||||
if (!iommu_get_dev_param(dev))
|
||||
return -ENOMEM;
|
||||
|
||||
if (!try_module_get(ops->owner)) {
|
||||
ret = -EINVAL;
|
||||
goto err_free_dev_param;
|
||||
}
|
||||
|
||||
ret = ops->add_device(dev);
|
||||
if (ret)
|
||||
iommu_free_dev_param(dev);
|
||||
goto err_module_put;
|
||||
|
||||
return 0;
|
||||
|
||||
err_module_put:
|
||||
module_put(ops->owner);
|
||||
err_free_dev_param:
|
||||
iommu_free_dev_param(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -197,7 +211,10 @@ void iommu_release_device(struct device *dev)
|
||||
if (dev->iommu_group)
|
||||
ops->remove_device(dev);
|
||||
|
||||
iommu_free_dev_param(dev);
|
||||
if (dev->iommu_param) {
|
||||
module_put(ops->owner);
|
||||
iommu_free_dev_param(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
|
||||
@@ -887,6 +904,7 @@ struct iommu_group *iommu_group_ref_get(struct iommu_group *group)
|
||||
kobject_get(group->devices_kobj);
|
||||
return group;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iommu_group_ref_get);
|
||||
|
||||
/**
|
||||
* iommu_group_put - Decrement group reference
|
||||
@@ -1260,6 +1278,7 @@ struct iommu_group *generic_device_group(struct device *dev)
|
||||
{
|
||||
return iommu_group_alloc();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(generic_device_group);
|
||||
|
||||
/*
|
||||
* Use standard PCI bus topology, isolation features, and DMA alias quirks
|
||||
@@ -1327,6 +1346,7 @@ struct iommu_group *pci_device_group(struct device *dev)
|
||||
/* No shared group found, allocate new */
|
||||
return iommu_group_alloc();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_device_group);
|
||||
|
||||
/* Get the IOMMU group for device on fsl-mc bus */
|
||||
struct iommu_group *fsl_mc_device_group(struct device *dev)
|
||||
@@ -1339,6 +1359,7 @@ struct iommu_group *fsl_mc_device_group(struct device *dev)
|
||||
group = iommu_group_alloc();
|
||||
return group;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fsl_mc_device_group);
|
||||
|
||||
/**
|
||||
* iommu_group_get_for_dev - Find or create the IOMMU group for a device
|
||||
@@ -1407,6 +1428,7 @@ struct iommu_group *iommu_group_get_for_dev(struct device *dev)
|
||||
|
||||
return group;
|
||||
}
|
||||
EXPORT_SYMBOL(iommu_group_get_for_dev);
|
||||
|
||||
struct iommu_domain *iommu_group_default_domain(struct iommu_group *group)
|
||||
{
|
||||
@@ -1537,6 +1559,11 @@ int bus_set_iommu(struct bus_type *bus, const struct iommu_ops *ops)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (ops == NULL) {
|
||||
bus->iommu_ops = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (bus->iommu_ops != NULL)
|
||||
return -EBUSY;
|
||||
|
||||
@@ -2230,6 +2257,25 @@ void iommu_put_resv_regions(struct device *dev, struct list_head *list)
|
||||
ops->put_resv_regions(dev, list);
|
||||
}
|
||||
|
||||
/**
|
||||
* generic_iommu_put_resv_regions - Reserved region driver helper
|
||||
* @dev: device for which to free reserved regions
|
||||
* @list: reserved region list for device
|
||||
*
|
||||
* IOMMU drivers can use this to implement their .put_resv_regions() callback
|
||||
* for simple reservations. Memory allocated for each reserved region will be
|
||||
* freed. If an IOMMU driver allocates additional resources per region, it is
|
||||
* going to have to implement a custom callback.
|
||||
*/
|
||||
void generic_iommu_put_resv_regions(struct device *dev, struct list_head *list)
|
||||
{
|
||||
struct iommu_resv_region *entry, *next;
|
||||
|
||||
list_for_each_entry_safe(entry, next, list, list)
|
||||
kfree(entry);
|
||||
}
|
||||
EXPORT_SYMBOL(generic_iommu_put_resv_regions);
|
||||
|
||||
struct iommu_resv_region *iommu_alloc_resv_region(phys_addr_t start,
|
||||
size_t length, int prot,
|
||||
enum iommu_resv_type type)
|
||||
@@ -2247,6 +2293,7 @@ struct iommu_resv_region *iommu_alloc_resv_region(phys_addr_t start,
|
||||
region->type = type;
|
||||
return region;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iommu_alloc_resv_region);
|
||||
|
||||
static int
|
||||
request_default_domain_for_dev(struct device *dev, unsigned long type)
|
||||
|
Reference in New Issue
Block a user