diff options
Diffstat (limited to 'nvkm/subdev/vm/base.c')
-rw-r--r-- | nvkm/subdev/vm/base.c | 9 |
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; |