summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c26
1 files changed, 4 insertions, 22 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 17cf8d83..3f71fc5e 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -1161,6 +1161,8 @@ u64 gk20a_locked_gmmu_map(struct vm_gk20a *vm,
1161 goto fail_validate; 1161 goto fail_validate;
1162 } 1162 }
1163 1163
1164 g->ops.mm.tlb_invalidate(vm);
1165
1164 return map_offset; 1166 return map_offset;
1165fail_validate: 1167fail_validate:
1166 if (allocated) 1168 if (allocated)
@@ -1202,8 +1204,6 @@ void gk20a_locked_gmmu_unmap(struct vm_gk20a *vm,
1202 dev_err(dev_from_vm(vm), 1204 dev_err(dev_from_vm(vm),
1203 "failed to update gmmu ptes on unmap"); 1205 "failed to update gmmu ptes on unmap");
1204 1206
1205 /* detect which if any pdes/ptes can now be released */
1206
1207 /* flush l2 so any dirty lines are written out *now*. 1207 /* flush l2 so any dirty lines are written out *now*.
1208 * also as we could potentially be switching this buffer 1208 * also as we could potentially be switching this buffer
1209 * from nonvolatile (l2 cacheable) to volatile (l2 non-cacheable) at 1209 * from nonvolatile (l2 cacheable) to volatile (l2 non-cacheable) at
@@ -1213,6 +1213,8 @@ void gk20a_locked_gmmu_unmap(struct vm_gk20a *vm,
1213 * unmapping (below). */ 1213 * unmapping (below). */
1214 1214
1215 gk20a_mm_l2_flush(g, true); 1215 gk20a_mm_l2_flush(g, true);
1216
1217 g->ops.mm.tlb_invalidate(vm);
1216} 1218}
1217 1219
1218static u64 gk20a_vm_map_duplicate_locked(struct vm_gk20a *vm, 1220static u64 gk20a_vm_map_duplicate_locked(struct vm_gk20a *vm,
@@ -1502,10 +1504,6 @@ u64 gk20a_vm_map(struct vm_gk20a *vm,
1502 1504
1503 mutex_unlock(&vm->update_gmmu_lock); 1505 mutex_unlock(&vm->update_gmmu_lock);
1504 1506
1505 /* Invalidate kernel mappings immediately */
1506 if (vm_aspace_id(vm) == -1)
1507 gk20a_mm_tlb_invalidate(vm);
1508
1509 return map_offset; 1507 return map_offset;
1510 1508
1511clean_up: 1509clean_up:
@@ -1549,9 +1547,6 @@ u64 gk20a_gmmu_map(struct vm_gk20a *vm,
1549 return 0; 1547 return 0;
1550 } 1548 }
1551 1549
1552 /* Invalidate kernel mappings immediately */
1553 g->ops.mm.tlb_invalidate(vm);
1554
1555 return vaddr; 1550 return vaddr;
1556} 1551}
1557 1552
@@ -1882,8 +1877,6 @@ static int update_gmmu_ptes_locked(struct vm_gk20a *vm,
1882 } 1877 }
1883 1878
1884 smp_mb(); 1879 smp_mb();
1885 vm->tlb_dirty = true;
1886 gk20a_dbg_fn("set tlb dirty");
1887 1880
1888 return 0; 1881 return 0;
1889 1882
@@ -1972,8 +1965,6 @@ void update_gmmu_pde_locked(struct vm_gk20a *vm, u32 i)
1972 gk20a_mm_l2_invalidate(vm->mm->g); 1965 gk20a_mm_l2_invalidate(vm->mm->g);
1973 1966
1974 gk20a_dbg(gpu_dbg_pte, "pde:%d = 0x%x,0x%08x\n", i, pde_v[1], pde_v[0]); 1967 gk20a_dbg(gpu_dbg_pte, "pde:%d = 0x%x,0x%08x\n", i, pde_v[1], pde_v[0]);
1975
1976 vm->tlb_dirty = true;
1977} 1968}
1978 1969
1979/* NOTE! mapped_buffers lock must be held */ 1970/* NOTE! mapped_buffers lock must be held */
@@ -2992,13 +2983,6 @@ void gk20a_mm_tlb_invalidate(struct vm_gk20a *vm)
2992 if (!g->power_on) 2983 if (!g->power_on)
2993 return; 2984 return;
2994 2985
2995 /* No need to invalidate if tlb is clean */
2996 mutex_lock(&vm->update_gmmu_lock);
2997 if (!vm->tlb_dirty) {
2998 mutex_unlock(&vm->update_gmmu_lock);
2999 return;
3000 }
3001
3002 mutex_lock(&tlb_lock); 2986 mutex_lock(&tlb_lock);
3003 2987
3004 trace_gk20a_mm_tlb_invalidate(g->dev->name); 2988 trace_gk20a_mm_tlb_invalidate(g->dev->name);
@@ -3042,8 +3026,6 @@ void gk20a_mm_tlb_invalidate(struct vm_gk20a *vm)
3042 3026
3043out: 3027out:
3044 mutex_unlock(&tlb_lock); 3028 mutex_unlock(&tlb_lock);
3045 vm->tlb_dirty = false;
3046 mutex_unlock(&vm->update_gmmu_lock);
3047} 3029}
3048 3030
3049int gk20a_mm_suspend(struct gk20a *g) 3031int gk20a_mm_suspend(struct gk20a *g)