if (pgt[1])
                pde[0] = 0x00000001 | (pgt[1]->addr >> 8);
 
-       nv_wo32(pgd, (index * 8) + 0, pde[0]);
-       nv_wo32(pgd, (index * 8) + 4, pde[1]);
+       nvkm_kmap(pgd);
+       nvkm_wo32(pgd, (index * 8) + 0, pde[0]);
+       nvkm_wo32(pgd, (index * 8) + 4, pde[1]);
+       nvkm_done(pgd);
 }
 
 static inline u64
                ltc->tags_clear(ltc, tag, cnt);
        }
 
+       nvkm_kmap(pgt);
        while (cnt--) {
-               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
-               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+               nvkm_wo32(pgt, pte + 0, lower_32_bits(phys));
+               nvkm_wo32(pgt, pte + 4, upper_32_bits(phys));
                phys += next;
                pte  += 8;
        }
+       nvkm_done(pgt);
 }
 
 static void
        /* compressed storage types are invalid for system memory */
        u32 memtype = gf100_pte_storage_type_map[mem->memtype & 0xff];
 
+       nvkm_kmap(pgt);
        pte <<= 3;
        while (cnt--) {
                u64 phys = gf100_vm_addr(vma, *list++, memtype, target);
-               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
-               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+               nvkm_wo32(pgt, pte + 0, lower_32_bits(phys));
+               nvkm_wo32(pgt, pte + 4, upper_32_bits(phys));
                pte += 8;
        }
+       nvkm_done(pgt);
 }
 
 static void
 gf100_vm_unmap(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt)
 {
+       nvkm_kmap(pgt);
        pte <<= 3;
        while (cnt--) {
-               nv_wo32(pgt, pte + 0, 0x00000000);
-               nv_wo32(pgt, pte + 4, 0x00000000);
+               nvkm_wo32(pgt, pte + 0, 0x00000000);
+               nvkm_wo32(pgt, pte + 4, 0x00000000);
                pte += 8;
        }
+       nvkm_done(pgt);
 }
 
 static void
 
               struct nvkm_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
 {
        pte = 0x00008 + (pte * 4);
+       nvkm_kmap(pgt);
        while (cnt) {
                u32 page = PAGE_SIZE / NV04_PDMA_PAGE;
                u32 phys = (u32)*list++;
                while (cnt && page--) {
-                       nv_wo32(pgt, pte, phys | 3);
+                       nvkm_wo32(pgt, pte, phys | 3);
                        phys += NV04_PDMA_PAGE;
                        pte += 4;
                        cnt -= 1;
                }
        }
+       nvkm_done(pgt);
 }
 
 static void
 nv04_vm_unmap(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt)
 {
        pte = 0x00008 + (pte * 4);
+       nvkm_kmap(pgt);
        while (cnt--) {
-               nv_wo32(pgt, pte, 0x00000000);
+               nvkm_wo32(pgt, pte, 0x00000000);
                pte += 4;
        }
+       nvkm_done(pgt);
 }
 
 static void
        if (ret)
                return ret;
 
-       nv_wo32(dma, 0x00000, 0x0002103d); /* PCI, RW, PT, !LN */
-       nv_wo32(dma, 0x00004, NV04_PDMA_SIZE - 1);
+       nvkm_kmap(dma);
+       nvkm_wo32(dma, 0x00000, 0x0002103d); /* PCI, RW, PT, !LN */
+       nvkm_wo32(dma, 0x00004, NV04_PDMA_SIZE - 1);
+       nvkm_done(dma);
        return 0;
 }
 
 
               struct nvkm_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
 {
        pte = pte * 4;
+       nvkm_kmap(pgt);
        while (cnt) {
                u32 page = PAGE_SIZE / NV41_GART_PAGE;
                u64 phys = (u64)*list++;
                while (cnt && page--) {
-                       nv_wo32(pgt, pte, (phys >> 7) | 1);
+                       nvkm_wo32(pgt, pte, (phys >> 7) | 1);
                        phys += NV41_GART_PAGE;
                        pte += 4;
                        cnt -= 1;
                }
        }
+       nvkm_done(pgt);
 }
 
 static void
 nv41_vm_unmap(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt)
 {
        pte = pte * 4;
+       nvkm_kmap(pgt);
        while (cnt--) {
-               nv_wo32(pgt, pte, 0x00000000);
+               nvkm_wo32(pgt, pte, 0x00000000);
                pte += 4;
        }
+       nvkm_done(pgt);
 }
 
 static void
 
        u32 base = (pte << 2) & ~0x0000000f;
        u32 tmp[4];
 
-       tmp[0] = nv_ro32(pgt, base + 0x0);
-       tmp[1] = nv_ro32(pgt, base + 0x4);
-       tmp[2] = nv_ro32(pgt, base + 0x8);
-       tmp[3] = nv_ro32(pgt, base + 0xc);
+       tmp[0] = nvkm_ro32(pgt, base + 0x0);
+       tmp[1] = nvkm_ro32(pgt, base + 0x4);
+       tmp[2] = nvkm_ro32(pgt, base + 0x8);
+       tmp[3] = nvkm_ro32(pgt, base + 0xc);
 
        while (cnt--) {
                u32 addr = list ? (*list++ >> 12) : (null >> 12);
                }
        }
 
-       nv_wo32(pgt, base + 0x0, tmp[0]);
-       nv_wo32(pgt, base + 0x4, tmp[1]);
-       nv_wo32(pgt, base + 0x8, tmp[2]);
-       nv_wo32(pgt, base + 0xc, tmp[3] | 0x40000000);
+       nvkm_wo32(pgt, base + 0x0, tmp[0]);
+       nvkm_wo32(pgt, base + 0x4, tmp[1]);
+       nvkm_wo32(pgt, base + 0x8, tmp[2]);
+       nvkm_wo32(pgt, base + 0xc, tmp[3] | 0x40000000);
 }
 
 static void
        u32 tmp[4];
        int i;
 
+       nvkm_kmap(pgt);
        if (pte & 3) {
                u32  max = 4 - (pte & 3);
                u32 part = (cnt > max) ? max : cnt;
        while (cnt >= 4) {
                for (i = 0; i < 4; i++)
                        tmp[i] = *list++ >> 12;
-               nv_wo32(pgt, pte++ * 4, tmp[0] >>  0 | tmp[1] << 27);
-               nv_wo32(pgt, pte++ * 4, tmp[1] >>  5 | tmp[2] << 22);
-               nv_wo32(pgt, pte++ * 4, tmp[2] >> 10 | tmp[3] << 17);
-               nv_wo32(pgt, pte++ * 4, tmp[3] >> 15 | 0x40000000);
+               nvkm_wo32(pgt, pte++ * 4, tmp[0] >>  0 | tmp[1] << 27);
+               nvkm_wo32(pgt, pte++ * 4, tmp[1] >>  5 | tmp[2] << 22);
+               nvkm_wo32(pgt, pte++ * 4, tmp[2] >> 10 | tmp[3] << 17);
+               nvkm_wo32(pgt, pte++ * 4, tmp[3] >> 15 | 0x40000000);
                cnt -= 4;
        }
 
        if (cnt)
                nv44_vm_fill(pgt, mmu->null, list, pte, cnt);
+       nvkm_done(pgt);
 }
 
 static void
 {
        struct nv04_mmu *mmu = (void *)nvkm_mmu(pgt);
 
+       nvkm_kmap(pgt);
        if (pte & 3) {
                u32  max = 4 - (pte & 3);
                u32 part = (cnt > max) ? max : cnt;
        }
 
        while (cnt >= 4) {
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
+               nvkm_wo32(pgt, pte++ * 4, 0x00000000);
+               nvkm_wo32(pgt, pte++ * 4, 0x00000000);
+               nvkm_wo32(pgt, pte++ * 4, 0x00000000);
+               nvkm_wo32(pgt, pte++ * 4, 0x00000000);
                cnt -= 4;
        }
 
        if (cnt)
                nv44_vm_fill(pgt, mmu->null, NULL, pte, cnt);
+       nvkm_done(pgt);
 }
 
 static void
 
                        phys |= 0x20;
        }
 
-       nv_wo32(pgd, (pde * 8) + 0, lower_32_bits(phys));
-       nv_wo32(pgd, (pde * 8) + 4, upper_32_bits(phys));
+       nvkm_kmap(pgd);
+       nvkm_wo32(pgd, (pde * 8) + 0, lower_32_bits(phys));
+       nvkm_wo32(pgd, (pde * 8) + 4, upper_32_bits(phys));
+       nvkm_done(pgd);
 }
 
 static inline u64
        pte <<= 3;
        cnt <<= 3;
 
+       nvkm_kmap(pgt);
        while (cnt) {
                u32 offset_h = upper_32_bits(phys);
                u32 offset_l = lower_32_bits(phys);
                }
 
                while (block) {
-                       nv_wo32(pgt, pte + 0, offset_l);
-                       nv_wo32(pgt, pte + 4, offset_h);
+                       nvkm_wo32(pgt, pte + 0, offset_l);
+                       nvkm_wo32(pgt, pte + 4, offset_h);
                        pte += 8;
                        block -= 8;
                }
        }
+       nvkm_done(pgt);
 }
 
 static void
 {
        u32 target = (vma->access & NV_MEM_ACCESS_NOSNOOP) ? 3 : 2;
        pte <<= 3;
+       nvkm_kmap(pgt);
        while (cnt--) {
                u64 phys = vm_addr(vma, (u64)*list++, mem->memtype, target);
-               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
-               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+               nvkm_wo32(pgt, pte + 0, lower_32_bits(phys));
+               nvkm_wo32(pgt, pte + 4, upper_32_bits(phys));
                pte += 8;
        }
+       nvkm_done(pgt);
 }
 
 static void
 nv50_vm_unmap(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt)
 {
        pte <<= 3;
+       nvkm_kmap(pgt);
        while (cnt--) {
-               nv_wo32(pgt, pte + 0, 0x00000000);
-               nv_wo32(pgt, pte + 4, 0x00000000);
+               nvkm_wo32(pgt, pte + 0, 0x00000000);
+               nvkm_wo32(pgt, pte + 4, 0x00000000);
                pte += 8;
        }
+       nvkm_done(pgt);
 }
 
 static void