mirror of https://gitee.com/openkylin/linux.git
iommu: Consolitate ->add/remove_device() calls
Put them into separate functions and call those where the plain ops have been called before. Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
6954cf9bfd
commit
cc5aed44a3
|
@ -111,6 +111,23 @@ void iommu_device_unregister(struct iommu_device *iommu)
|
|||
spin_unlock(&iommu_device_lock);
|
||||
}
|
||||
|
||||
int iommu_probe_device(struct device *dev)
|
||||
{
|
||||
const struct iommu_ops *ops = dev->bus->iommu_ops;
|
||||
|
||||
WARN_ON(dev->iommu_group);
|
||||
|
||||
return ops->add_device(dev);
|
||||
}
|
||||
|
||||
void iommu_release_device(struct device *dev)
|
||||
{
|
||||
const struct iommu_ops *ops = dev->bus->iommu_ops;
|
||||
|
||||
if (dev->iommu_group)
|
||||
ops->remove_device(dev);
|
||||
}
|
||||
|
||||
static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
|
||||
unsigned type);
|
||||
static int __iommu_attach_device(struct iommu_domain *domain,
|
||||
|
@ -1118,16 +1135,7 @@ struct iommu_domain *iommu_group_default_domain(struct iommu_group *group)
|
|||
|
||||
static int add_iommu_group(struct device *dev, void *data)
|
||||
{
|
||||
struct iommu_callback_data *cb = data;
|
||||
const struct iommu_ops *ops = cb->ops;
|
||||
int ret;
|
||||
|
||||
if (!ops->add_device)
|
||||
return 0;
|
||||
|
||||
WARN_ON(dev->iommu_group);
|
||||
|
||||
ret = ops->add_device(dev);
|
||||
int ret = iommu_probe_device(dev);
|
||||
|
||||
/*
|
||||
* We ignore -ENODEV errors for now, as they just mean that the
|
||||
|
@ -1142,11 +1150,7 @@ static int add_iommu_group(struct device *dev, void *data)
|
|||
|
||||
static int remove_iommu_group(struct device *dev, void *data)
|
||||
{
|
||||
struct iommu_callback_data *cb = data;
|
||||
const struct iommu_ops *ops = cb->ops;
|
||||
|
||||
if (ops->remove_device && dev->iommu_group)
|
||||
ops->remove_device(dev);
|
||||
iommu_release_device(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1154,27 +1158,22 @@ static int remove_iommu_group(struct device *dev, void *data)
|
|||
static int iommu_bus_notifier(struct notifier_block *nb,
|
||||
unsigned long action, void *data)
|
||||
{
|
||||
struct device *dev = data;
|
||||
const struct iommu_ops *ops = dev->bus->iommu_ops;
|
||||
struct iommu_group *group;
|
||||
unsigned long group_action = 0;
|
||||
struct device *dev = data;
|
||||
struct iommu_group *group;
|
||||
|
||||
/*
|
||||
* ADD/DEL call into iommu driver ops if provided, which may
|
||||
* result in ADD/DEL notifiers to group->notifier
|
||||
*/
|
||||
if (action == BUS_NOTIFY_ADD_DEVICE) {
|
||||
if (ops->add_device) {
|
||||
int ret;
|
||||
int ret;
|
||||
|
||||
ret = ops->add_device(dev);
|
||||
return (ret) ? NOTIFY_DONE : NOTIFY_OK;
|
||||
}
|
||||
ret = iommu_probe_device(dev);
|
||||
return (ret) ? NOTIFY_DONE : NOTIFY_OK;
|
||||
} else if (action == BUS_NOTIFY_REMOVED_DEVICE) {
|
||||
if (ops->remove_device && dev->iommu_group) {
|
||||
ops->remove_device(dev);
|
||||
return 0;
|
||||
}
|
||||
iommu_release_device(dev);
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -409,6 +409,9 @@ static inline void dev_iommu_fwspec_set(struct device *dev,
|
|||
dev->iommu_fwspec = fwspec;
|
||||
}
|
||||
|
||||
int iommu_probe_device(struct device *dev);
|
||||
void iommu_release_device(struct device *dev);
|
||||
|
||||
#else /* CONFIG_IOMMU_API */
|
||||
|
||||
struct iommu_ops {};
|
||||
|
|
Loading…
Reference in New Issue