drm/tegra: gem: Take into account IOMMU aperture
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>
This commit is contained in:
parent
3c1dae0a07
commit
4553f733c6
|
@ -124,14 +124,22 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (iommu_present(&platform_bus_type)) {
|
if (iommu_present(&platform_bus_type)) {
|
||||||
|
struct iommu_domain_geometry *geometry;
|
||||||
|
u64 start, end;
|
||||||
|
|
||||||
tegra->domain = iommu_domain_alloc(&platform_bus_type);
|
tegra->domain = iommu_domain_alloc(&platform_bus_type);
|
||||||
if (!tegra->domain) {
|
if (!tegra->domain) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto free;
|
goto free;
|
||||||
}
|
}
|
||||||
|
|
||||||
DRM_DEBUG("IOMMU context initialized\n");
|
geometry = &tegra->domain->geometry;
|
||||||
drm_mm_init(&tegra->mm, 0, SZ_2G);
|
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);
|
mutex_init(&tegra->clients_lock);
|
||||||
|
|
Loading…
Reference in New Issue