summaryrefslogtreecommitdiff
path: root/nvkm/subdev/vm/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'nvkm/subdev/vm/base.c')
-rw-r--r--nvkm/subdev/vm/base.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/nvkm/subdev/vm/base.c b/nvkm/subdev/vm/base.c
index f75a683bd..583463cfe 100644
--- a/nvkm/subdev/vm/base.c
+++ b/nvkm/subdev/vm/base.c
@@ -152,13 +152,18 @@ nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
end = (pte + num);
if (unlikely(end >= max))
end = max;
- len = end - pte;
+
+ /*
+ * Map pages >4KB one by one so we can fix the list pointer
+ * as to not map intermediate pages to the next PTE
+ */
+ len = bits ? 1 : end - pte;
vmm->map_sg(vma, pgt, mem, pte, len, list);
num -= len;
pte += len;
- list += len;
+ list += len << bits;
if (unlikely(end >= max)) {
pde++;
pte = 0;