The IOMMU physical translation bit might vary with different SoCs. So add
a variable to specify this bit for GK20A.

Signed-off-by: Vince Hsu <[email protected]>
---
 drm/nouveau/nouveau_platform.c | 19 +++++++++++++++++++
 drm/nouveau/nouveau_platform.h |  1 +
 2 files changed, 20 insertions(+)

diff --git a/drm/nouveau/nouveau_platform.c b/drm/nouveau/nouveau_platform.c
index 775277f1edb0..0d002f73e356 100644
--- a/drm/nouveau/nouveau_platform.c
+++ b/drm/nouveau/nouveau_platform.c
@@ -25,6 +25,7 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/reset.h>
 #include <linux/regulator/consumer.h>
 #include <linux/iommu.h>
@@ -92,6 +93,22 @@ static int nouveau_platform_power_down(struct 
nouveau_platform_gpu *gpu)
        return 0;
 }
 
+static unsigned long nouveau_platform_get_iommu_bit(struct device *dev)
+{
+       const struct of_device_id *match;
+
+       match = of_match_device(dev->driver->of_match_table, dev);
+       if (!match) {
+               dev_warn(dev, "cannot find OF match for device\n");
+               return 0;
+       }
+
+       if (!strcmp(match->compatible, "nvidia,gk20a"))
+               return 34;
+       else
+               return 0;
+}
+
 static void nouveau_platform_probe_iommu(struct device *dev,
                                         struct nouveau_platform_gpu *gpu)
 {
@@ -122,6 +139,8 @@ static void nouveau_platform_probe_iommu(struct device *dev,
                        gpu->iommu.pgshift -= 1;
                }
 
+               gpu->iommu.phys_addr_bit = nouveau_platform_get_iommu_bit(dev);
+
                err = iommu_attach_device(gpu->iommu.domain, dev);
                if (err)
                        goto free_domain;
diff --git a/drm/nouveau/nouveau_platform.h b/drm/nouveau/nouveau_platform.h
index 392874cf4725..3e9bd7dc0092 100644
--- a/drm/nouveau/nouveau_platform.h
+++ b/drm/nouveau/nouveau_platform.h
@@ -53,6 +53,7 @@ struct nouveau_platform_gpu {
                struct nvkm_mm *mm;
                struct iommu_domain *domain;
                unsigned long pgshift;
+               unsigned long phys_addr_bit;
        } iommu;
 };
 
-- 
2.1.4

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to