summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2019-02-01 14:28:34 +0100
committerThierry Reding <treding@nvidia.com>2019-02-07 18:29:00 +0100
commit02be8e4fbb1f352f2ed6251db9fddd646d531b6e (patch)
tree019e89c703461a0a4a6abae84b08a81c497d2d45 /drivers
parentb9f8b09ce256e2e197b9a38984dea64e3404728c (diff)
downloadlinux-02be8e4fbb1f352f2ed6251db9fddd646d531b6e.tar.gz
linux-02be8e4fbb1f352f2ed6251db9fddd646d531b6e.tar.bz2
linux-02be8e4fbb1f352f2ed6251db9fddd646d531b6e.zip
drm/tegra: Restrict IOVA space to DMA mask
On Tegra186 and later, the ARM SMMU provides an input address space that is 48 bits wide. However, memory clients can only address up to 40 bits. If the geometry is used as-is, allocations of IOVA space can end up in a region that cannot be addressed by the memory clients. To fix this, restrict the IOVA space to the DMA mask of the host1x device. Note that, technically, the IOVA space needs to be restricted to the intersection of the DMA masks for all clients that are attached to the IOMMU domain. In practice using the DMA mask of the host1x device is sufficient because all host1x clients share the same DMA mask. Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/tegra/drm.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 271c7a5fc954..0c5f1e6a0446 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -136,11 +136,12 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
if (tegra->domain) {
u64 carveout_start, carveout_end, gem_start, gem_end;
+ u64 dma_mask = dma_get_mask(&device->dev);
dma_addr_t start, end;
unsigned long order;
- start = tegra->domain->geometry.aperture_start;
- end = tegra->domain->geometry.aperture_end;
+ start = tegra->domain->geometry.aperture_start & dma_mask;
+ end = tegra->domain->geometry.aperture_end & dma_mask;
gem_start = start;
gem_end = end - CARVEOUT_SZ;