drm/tegra: gem: Take into account IOMMU aperture
authorThierry Reding <treding@nvidia.com>
Mon, 19 Jan 2015 15:15:04 +0000 (16:15 +0100)
committerThierry Reding <treding@nvidia.com>
Fri, 12 Jun 2015 14:23:50 +0000 (16:23 +0200)
The IOMMU may not always be able to address 2 GiB of memory. On Tegra20,
the GART supports 32 MiB starting at 0x58000000. Also the aperture on
Tegra30 and later is in fact the full 4 GiB, rather than just 2 GiB as
currently assumed.

Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/drm.c

index 1833abd7d3aafa38c796cc5acb7d3bb9a8356c86..106208463b37aa16fc44f4b6aa260bea299f7dd4 100644 (file)
@@ -124,14 +124,22 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
                return -ENOMEM;
 
        if (iommu_present(&platform_bus_type)) {
+               struct iommu_domain_geometry *geometry;
+               u64 start, end;
+
                tegra->domain = iommu_domain_alloc(&platform_bus_type);
                if (!tegra->domain) {
                        err = -ENOMEM;
                        goto free;
                }
 
-               DRM_DEBUG("IOMMU context initialized\n");
-               drm_mm_init(&tegra->mm, 0, SZ_2G);
+               geometry = &tegra->domain->geometry;
+               start = geometry->aperture_start;
+               end = geometry->aperture_end;
+
+               DRM_DEBUG("IOMMU context initialized (aperture: %#llx-%#llx)\n",
+                         start, end);
+               drm_mm_init(&tegra->mm, start, end - start + 1);
        }
 
        mutex_init(&tegra->clients_lock);