drm/nouveau/instmem/gk20a: make use of the IOMMU bit
authorAlexandre Courbot <acourbot@nvidia.com>
Fri, 4 Sep 2015 10:59:32 +0000 (19:59 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 3 Nov 2015 05:02:18 +0000 (15:02 +1000)
Use the IOMMU bit specified in platform data instead of hardcoding it to
the bit used by current Tegra GPUs.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/gk20a.c

index a2921ac..fc419bb 100644 (file)
@@ -103,6 +103,7 @@ struct gk20a_instmem {
        struct nvkm_mm *mm;
        struct iommu_domain *domain;
        unsigned long iommu_pgshift;
+       u16 iommu_bit;
 
        /* Only used by DMA API */
        struct dma_attrs attrs;
@@ -332,8 +333,8 @@ gk20a_instobj_dtor_iommu(struct nvkm_memory *memory)
        r = list_first_entry(&node->base.mem.regions, struct nvkm_mm_node,
                             rl_entry);
 
-       /* clear bit 34 to unmap pages */
-       r->offset &= ~BIT(34 - imem->iommu_pgshift);
+       /* clear IOMMU bit to unmap pages */
+       r->offset &= ~BIT(imem->iommu_bit - imem->iommu_pgshift);
 
        /* Unmap pages from GPU address space and free them */
        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,
                }
        }
 
-       /* Bit 34 tells that an address is to be resolved through the IOMMU */
-       r->offset |= BIT(34 - imem->iommu_pgshift);
+       /* IOMMU bit tells that an address is to be resolved through the IOMMU */
+       r->offset |= BIT(imem->iommu_bit - 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,
                imem->domain = tdev->iommu.domain;
                imem->iommu_pgshift = tdev->iommu.pgshift;
                imem->cpu_map = gk20a_instobj_cpu_map_iommu;
+               imem->iommu_bit = tdev->func->iommu_bit;
 
                nvkm_info(&imem->base.subdev, "using IOMMU\n");
        } else {