summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: abd3972)
raw | patch | inline | side by side (parent: abd3972)
author | Joerg Roedel <jroedel@suse.de> | |
Thu, 28 May 2015 16:41:29 +0000 (18:41 +0200) | ||
committer | Alex Shi <alex.shi@linaro.org> | |
Mon, 18 Apr 2016 06:27:26 +0000 (14:27 +0800) |
The default domain will be used (if supported by the iommu
driver) when the devices in the iommu group are not attached
to any other domain.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
(cherry picked from commit 53723dc59ff3ab504c739000b287ded49aeb2019)
Signed-off-by: Alex Shi <alex.shi@linaro.org>
driver) when the devices in the iommu group are not attached
to any other domain.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
(cherry picked from commit 53723dc59ff3ab504c739000b287ded49aeb2019)
Signed-off-by: Alex Shi <alex.shi@linaro.org>
drivers/iommu/iommu.c | patch | blob | history |
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index ee2c37736e3c00d6875193050bd05de88b756f41..553e2949eedc3605902db2b10e42e92c23d16acc 100644 (file)
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
void (*iommu_data_release)(void *iommu_data);
char *name;
int id;
+ struct iommu_domain *default_domain;
};
struct iommu_device {
#define to_iommu_group(_kobj) \
container_of(_kobj, struct iommu_group, kobj)
+static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
+ unsigned type);
+
static ssize_t iommu_group_attr_show(struct kobject *kobj,
struct attribute *__attr, char *buf)
{
ida_remove(&iommu_group_ida, group->id);
mutex_unlock(&iommu_group_mutex);
+ if (group->default_domain)
+ iommu_domain_free(group->default_domain);
+
kfree(group->name);
kfree(group);
}
return group;
/* No shared group found, allocate new */
- return iommu_group_alloc();
+ group = iommu_group_alloc();
+ if (group) {
+ /*
+ * Try to allocate a default domain - needs support from the
+ * IOMMU driver.
+ */
+ group->default_domain = __iommu_domain_alloc(pdev->dev.bus,
+ IOMMU_DOMAIN_DMA);
+ }
+
+ return group;
}
/**
}
EXPORT_SYMBOL_GPL(iommu_set_fault_handler);
-struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
+static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
+ unsigned type)
{
struct iommu_domain *domain;
if (bus == NULL || bus->iommu_ops == NULL)
return NULL;
- domain = bus->iommu_ops->domain_alloc(IOMMU_DOMAIN_UNMANAGED);
+ domain = bus->iommu_ops->domain_alloc(type);
if (!domain)
return NULL;
domain->ops = bus->iommu_ops;
- domain->type = IOMMU_DOMAIN_UNMANAGED;
+ domain->type = type;
return domain;
}
+
+struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
+{
+ return __iommu_domain_alloc(bus, IOMMU_DOMAIN_UNMANAGED);
+}
EXPORT_SYMBOL_GPL(iommu_domain_alloc);
void iommu_domain_free(struct iommu_domain *domain)