forked from Minki/linux
iommu/tegra: gart: Don't detach devices from inactive domains
There could be unlimited number of allocated domains, but only one domain can be active at a time. Hence devices must be detached only from the active domain. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Acked-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
5dd82cdb36
commit
cc0e120576
@ -171,7 +171,7 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain,
|
||||
struct device *dev)
|
||||
{
|
||||
struct gart_domain *gart_domain = to_gart_domain(domain);
|
||||
struct gart_device *gart = gart_domain->gart;
|
||||
struct gart_device *gart = gart_handle;
|
||||
struct gart_client *client, *c;
|
||||
int err = 0;
|
||||
|
||||
@ -195,6 +195,7 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain,
|
||||
goto fail;
|
||||
}
|
||||
gart->active_domain = domain;
|
||||
gart_domain->gart = gart;
|
||||
list_add(&client->list, &gart->client);
|
||||
spin_unlock(&gart->client_lock);
|
||||
dev_dbg(gart->dev, "Attached %s\n", dev_name(dev));
|
||||
@ -217,8 +218,10 @@ static void __gart_iommu_detach_dev(struct iommu_domain *domain,
|
||||
if (c->dev == dev) {
|
||||
list_del(&c->list);
|
||||
kfree(c);
|
||||
if (list_empty(&gart->client))
|
||||
if (list_empty(&gart->client)) {
|
||||
gart->active_domain = NULL;
|
||||
gart_domain->gart = NULL;
|
||||
}
|
||||
dev_dbg(gart->dev, "Detached %s\n", dev_name(dev));
|
||||
return;
|
||||
}
|
||||
@ -254,7 +257,6 @@ static struct iommu_domain *gart_iommu_domain_alloc(unsigned type)
|
||||
if (!gart_domain)
|
||||
return NULL;
|
||||
|
||||
gart_domain->gart = gart;
|
||||
gart_domain->domain.geometry.aperture_start = gart->iovmm_base;
|
||||
gart_domain->domain.geometry.aperture_end = gart->iovmm_base +
|
||||
gart->page_count * GART_PAGE_SIZE - 1;
|
||||
|
Loading…
Reference in New Issue
Block a user