Commit 68b56653 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Ben Skeggs

drm/nouveau/instmem/gk20a: make use of the IOMMU bit

Use the IOMMU bit specified in platform data instead of hardcoding it to
the bit used by current Tegra GPUs.
Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e396ecd1
...@@ -103,6 +103,7 @@ struct gk20a_instmem { ...@@ -103,6 +103,7 @@ struct gk20a_instmem {
struct nvkm_mm *mm; struct nvkm_mm *mm;
struct iommu_domain *domain; struct iommu_domain *domain;
unsigned long iommu_pgshift; unsigned long iommu_pgshift;
u16 iommu_bit;
/* Only used by DMA API */ /* Only used by DMA API */
struct dma_attrs attrs; struct dma_attrs attrs;
...@@ -332,8 +333,8 @@ gk20a_instobj_dtor_iommu(struct nvkm_memory *memory) ...@@ -332,8 +333,8 @@ gk20a_instobj_dtor_iommu(struct nvkm_memory *memory)
r = list_first_entry(&node->base.mem.regions, struct nvkm_mm_node, r = list_first_entry(&node->base.mem.regions, struct nvkm_mm_node,
rl_entry); rl_entry);
/* clear bit 34 to unmap pages */ /* clear IOMMU bit to unmap pages */
r->offset &= ~BIT(34 - imem->iommu_pgshift); r->offset &= ~BIT(imem->iommu_bit - imem->iommu_pgshift);
/* Unmap pages from GPU address space and free them */ /* Unmap pages from GPU address space and free them */
for (i = 0; i < node->base.mem.size; i++) { for (i = 0; i < node->base.mem.size; i++) {
...@@ -489,8 +490,8 @@ gk20a_instobj_ctor_iommu(struct gk20a_instmem *imem, u32 npages, u32 align, ...@@ -489,8 +490,8 @@ gk20a_instobj_ctor_iommu(struct gk20a_instmem *imem, u32 npages, u32 align,
} }
} }
/* Bit 34 tells that an address is to be resolved through the IOMMU */ /* IOMMU bit tells that an address is to be resolved through the IOMMU */
r->offset |= BIT(34 - imem->iommu_pgshift); r->offset |= BIT(imem->iommu_bit - imem->iommu_pgshift);
node->base.mem.offset = ((u64)r->offset) << imem->iommu_pgshift; node->base.mem.offset = ((u64)r->offset) << imem->iommu_pgshift;
...@@ -603,6 +604,7 @@ gk20a_instmem_new(struct nvkm_device *device, int index, ...@@ -603,6 +604,7 @@ gk20a_instmem_new(struct nvkm_device *device, int index,
imem->domain = tdev->iommu.domain; imem->domain = tdev->iommu.domain;
imem->iommu_pgshift = tdev->iommu.pgshift; imem->iommu_pgshift = tdev->iommu.pgshift;
imem->cpu_map = gk20a_instobj_cpu_map_iommu; imem->cpu_map = gk20a_instobj_cpu_map_iommu;
imem->iommu_bit = tdev->func->iommu_bit;
nvkm_info(&imem->base.subdev, "using IOMMU\n"); nvkm_info(&imem->base.subdev, "using IOMMU\n");
} else { } else {
......
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