Commit 02be8e4f authored by Thierry Reding's avatar Thierry Reding

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: default avatarThierry Reding <treding@nvidia.com>
parent b9f8b09c
...@@ -136,11 +136,12 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) ...@@ -136,11 +136,12 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
if (tegra->domain) { if (tegra->domain) {
u64 carveout_start, carveout_end, gem_start, gem_end; u64 carveout_start, carveout_end, gem_start, gem_end;
u64 dma_mask = dma_get_mask(&device->dev);
dma_addr_t start, end; dma_addr_t start, end;
unsigned long order; unsigned long order;
start = tegra->domain->geometry.aperture_start; start = tegra->domain->geometry.aperture_start & dma_mask;
end = tegra->domain->geometry.aperture_end; end = tegra->domain->geometry.aperture_end & dma_mask;
gem_start = start; gem_start = start;
gem_end = end - CARVEOUT_SZ; gem_end = end - CARVEOUT_SZ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment