summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2017-11-14 16:11:28 +0100
committerThierry Reding <treding@nvidia.com>2017-12-21 14:52:36 +0100
commit41c3068cc2fd0ce179b910c4500934786e8156ba (patch)
tree9803afebc037c7d8bdc3bf03ea20dc684d0186f8
parentab7d3f5826c55ad23101327eab435660caa83436 (diff)
downloadlinux-41c3068cc2fd0ce179b910c4500934786e8156ba.tar.bz2
gpu: host1x: Use IOMMU groups
Use IOMMU groups to attach the host1x device to its IOMMU domain. This is not strictly necessary because the domain isn't shared with any other device, but it makes the code consistent with how IOMMU is handled in other drivers and provides an easy way to detect when no IOMMU has been attached via device tree. Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/gpu/host1x/dev.c22
-rw-r--r--drivers/gpu/host1x/dev.h1
2 files changed, 16 insertions, 7 deletions
diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c
index 1f916b579e95..03db71173f5d 100644
--- a/drivers/gpu/host1x/dev.c
+++ b/drivers/gpu/host1x/dev.c
@@ -218,19 +218,24 @@ static int host1x_probe(struct platform_device *pdev)
return err;
}
- if (iommu_present(&platform_bus_type)) {
+ host->group = iommu_group_get(&pdev->dev);
+ if (host->group) {
struct iommu_domain_geometry *geometry;
unsigned long order;
host->domain = iommu_domain_alloc(&platform_bus_type);
- if (!host->domain)
- return -ENOMEM;
+ if (!host->domain) {
+ err = -ENOMEM;
+ goto put_group;
+ }
- err = iommu_attach_device(host->domain, &pdev->dev);
+ err = iommu_attach_group(host->domain, host->group);
if (err) {
if (err == -ENODEV) {
iommu_domain_free(host->domain);
host->domain = NULL;
+ iommu_group_put(host->group);
+ host->group = NULL;
goto skip_iommu;
}
@@ -296,13 +301,15 @@ fail_unprepare_disable:
fail_free_channels:
host1x_channel_list_free(&host->channel_list);
fail_detach_device:
- if (host->domain) {
+ if (host->group && host->domain) {
put_iova_domain(&host->iova);
- iommu_detach_device(host->domain, &pdev->dev);
+ iommu_detach_group(host->domain, host->group);
}
fail_free_domain:
if (host->domain)
iommu_domain_free(host->domain);
+put_group:
+ iommu_group_put(host->group);
return err;
}
@@ -319,8 +326,9 @@ static int host1x_remove(struct platform_device *pdev)
if (host->domain) {
put_iova_domain(&host->iova);
- iommu_detach_device(host->domain, &pdev->dev);
+ iommu_detach_group(host->domain, host->group);
iommu_domain_free(host->domain);
+ iommu_group_put(host->group);
}
return 0;
diff --git a/drivers/gpu/host1x/dev.h b/drivers/gpu/host1x/dev.h
index 502769726480..43e9fabb43a1 100644
--- a/drivers/gpu/host1x/dev.h
+++ b/drivers/gpu/host1x/dev.h
@@ -117,6 +117,7 @@ struct host1x {
struct clk *clk;
struct reset_control *rst;
+ struct iommu_group *group;
struct iommu_domain *domain;
struct iova_domain iova;
dma_addr_t iova_end;