drm/nouveau/bar: modify interface to bar1 vmm mapping
authorBen Skeggs <bskeggs@redhat.com>
Tue, 31 Oct 2017 17:56:19 +0000 (03:56 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 2 Nov 2017 03:32:18 +0000 (13:32 +1000)
Upcoming changes will remove the nvkm_vmm pointer from nvkm_vma, instead
requiring it to be explicitly specified on each operation.

It's not currently possible to get this information for BAR1 mappings,
so let's fix that ahead of time.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
13 files changed:
drivers/gpu/drm/nouveau/include/nvkm/core/os.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/bar.h
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.h
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.h
drivers/gpu/drm/nouveau/nvkm/subdev/bar/priv.h

index cd57e238ddd34db82765d171b15e79c845b01bca..cfd9ed361c44144a1ec8c168682876b9f493e447 100644 (file)
@@ -1,4 +1,5 @@
 #ifndef __NVKM_OS_H__
 #define __NVKM_OS_H__
 #include <nvif/os.h>
+#define nvkm_vmm nvkm_vm
 #endif
index 11427d3d617386bd91cef54ac4ff41e6116cba34..679027538b1285e72cf2dfa939b9b75fcec8617a 100644 (file)
@@ -14,11 +14,11 @@ struct nvkm_bar {
        bool iomap_uncached;
 };
 
+struct nvkm_vmm *nvkm_bar_bar1_vmm(struct nvkm_device *);
 void nvkm_bar_bar2_init(struct nvkm_device *);
 void nvkm_bar_bar2_fini(struct nvkm_device *);
 void nvkm_bar_flush(struct nvkm_bar *);
 struct nvkm_vm *nvkm_bar_kmap(struct nvkm_bar *);
-int nvkm_bar_umap(struct nvkm_bar *, u64 size, int type, struct nvkm_vma *);
 
 int nv50_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
 int g84_bar_new(struct nvkm_device *, int, struct nvkm_bar **);
index e427f80344c4da3f8681d28b7114e2375b6be350..3da87932a21f97ed7030dacb27824ad571dda0e9 100644 (file)
@@ -1362,13 +1362,13 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *reg)
                reg->bus.base = device->func->resource_addr(device, 1);
                reg->bus.is_iomem = true;
                if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
-                       struct nvkm_bar *bar = nvxx_bar(&drm->client.device);
+                       struct nvkm_vmm *bar = nvkm_bar_bar1_vmm(device);
                        int page_shift = 12;
                        if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_FERMI)
                                page_shift = mem->page_shift;
 
-                       ret = nvkm_bar_umap(bar, mem->size << 12, page_shift,
-                                           &mem->bar_vma);
+                       ret = nvkm_vm_get(bar, mem->size << 12, page_shift,
+                                         NV_MEM_ACCESS_RW, &mem->bar_vma);
                        if (ret)
                                return ret;
 
index cd468ab1db125e213de377eac9458d6879190009..b1ab34f1a0e94825944a6fb03f2c988a0b82bdf8 100644 (file)
@@ -28,6 +28,7 @@
 #include <core/enum.h>
 #include <core/gpuobj.h>
 #include <subdev/bar.h>
+#include <subdev/fb.h>
 #include <engine/sw.h>
 
 #include <nvif/class.h>
@@ -559,6 +560,7 @@ gf100_fifo_oneinit(struct nvkm_fifo *base)
        struct gf100_fifo *fifo = gf100_fifo(base);
        struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_device *device = subdev->device;
+       struct nvkm_vmm *bar = nvkm_bar_bar1_vmm(device);
        int ret;
 
        /* Determine number of PBDMAs by checking valid enable bits. */
@@ -584,7 +586,8 @@ gf100_fifo_oneinit(struct nvkm_fifo *base)
        if (ret)
                return ret;
 
-       ret = nvkm_bar_umap(device->bar, 128 * 0x1000, 12, &fifo->user.bar);
+       ret = nvkm_vm_get(bar, nvkm_memory_size(fifo->user.mem), 12,
+                         NV_MEM_ACCESS_RW, &fifo->user.bar);
        if (ret)
                return ret;
 
index a7e55c422501cf9c4fc98bc7e7798d2b2213cfcf..cdadff59bb4c5e65c09854977e66e08ea8d03ced 100644 (file)
@@ -27,6 +27,7 @@
 #include <core/client.h>
 #include <core/gpuobj.h>
 #include <subdev/bar.h>
+#include <subdev/fb.h>
 #include <subdev/timer.h>
 #include <subdev/top.h>
 #include <engine/sw.h>
@@ -771,6 +772,7 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
        struct gk104_fifo *fifo = gk104_fifo(base);
        struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_device *device = subdev->device;
+       struct nvkm_vmm *bar = nvkm_bar_bar1_vmm(device);
        int engn, runl, pbid, ret, i, j;
        enum nvkm_devidx engidx;
        u32 *map;
@@ -834,8 +836,8 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
        if (ret)
                return ret;
 
-       ret = nvkm_bar_umap(device->bar, fifo->base.nr * 0x200, 12,
-                           &fifo->user.bar);
+       ret = nvkm_vm_get(bar, nvkm_memory_size(fifo->user.mem), 12,
+                         NV_MEM_ACCESS_RW, &fifo->user.bar);
        if (ret)
                return ret;
 
index b495f7796fa3d93be7674b61c81cb9c6612c0f3f..5a80cf5f9eb0ac466a845da09b50b54e7c0d5d68 100644 (file)
@@ -39,10 +39,10 @@ nvkm_bar_kmap(struct nvkm_bar *bar)
        return NULL;
 }
 
-int
-nvkm_bar_umap(struct nvkm_bar *bar, u64 size, int type, struct nvkm_vma *vma)
+struct nvkm_vmm *
+nvkm_bar_bar1_vmm(struct nvkm_device *device)
 {
-       return bar->func->umap(bar, size, type, vma);
+       return device->bar->func->bar1.vmm(device->bar);
 }
 
 void
index dce74e0d2591f61639fb55b2e044f59e35115fa6..f88f5d6e64b98ebb3e3fce2ab4a3db7406d7143e 100644 (file)
@@ -47,11 +47,11 @@ g84_bar_func = {
        .bar1.init = nv50_bar_bar1_init,
        .bar1.fini = nv50_bar_bar1_fini,
        .bar1.wait = nv50_bar_bar1_wait,
+       .bar1.vmm = nv50_bar_bar1_vmm,
        .bar2.init = nv50_bar_bar2_init,
        .bar2.fini = nv50_bar_bar2_fini,
        .bar2.wait = nv50_bar_bar1_wait,
        .kmap = nv50_bar_kmap,
-       .umap = nv50_bar_umap,
        .flush = g84_bar_flush,
 };
 
index 13d5a04f41dfccbca3564f19761d420c911dbe55..379fa339dbafb1818ebf01a357c2e1d90f43733b 100644 (file)
@@ -34,11 +34,10 @@ gf100_bar_kmap(struct nvkm_bar *base)
        return gf100_bar(base)->bar[0].vm;
 }
 
-int
-gf100_bar_umap(struct nvkm_bar *base, u64 size, int type, struct nvkm_vma *vma)
+struct nvkm_vmm *
+gf100_bar_bar1_vmm(struct nvkm_bar *base)
 {
-       struct gf100_bar *bar = gf100_bar(base);
-       return nvkm_vm_get(bar->bar[1].vm, size, type, NV_MEM_ACCESS_RW, vma);
+       return gf100_bar(base)->bar[1].vm;
 }
 
 void
@@ -195,11 +194,11 @@ gf100_bar_func = {
        .bar1.init = gf100_bar_bar1_init,
        .bar1.fini = gf100_bar_bar1_fini,
        .bar1.wait = gf100_bar_bar1_wait,
+       .bar1.vmm = gf100_bar_bar1_vmm,
        .bar2.init = gf100_bar_bar2_init,
        .bar2.fini = gf100_bar_bar2_fini,
        .bar2.wait = gf100_bar_bar1_wait,
        .kmap = gf100_bar_kmap,
-       .umap = gf100_bar_umap,
        .flush = g84_bar_flush,
 };
 
index 393116a7398acbd8d0f17b888e37920c4c2923d0..c56c8989b2a17da2b77d1f2f940aaa4085987a48 100644 (file)
@@ -21,6 +21,6 @@ void *gf100_bar_dtor(struct nvkm_bar *);
 int gf100_bar_oneinit(struct nvkm_bar *);
 void gf100_bar_bar1_init(struct nvkm_bar *);
 void gf100_bar_bar1_wait(struct nvkm_bar *);
+struct nvkm_vmm *gf100_bar_bar1_vmm(struct nvkm_bar *);
 void gf100_bar_bar2_init(struct nvkm_bar *);
-int gf100_bar_umap(struct nvkm_bar *, u64, int, struct nvkm_vma *);
 #endif
index ab4664b4b2b2382229cd16efae4e9457bbccdd95..b10077d38839b6ce314edfa64bb9692c2a3ba61c 100644 (file)
@@ -28,7 +28,7 @@ gk20a_bar_func = {
        .bar1.init = gf100_bar_bar1_init,
        .bar1.fini = gf100_bar_bar1_fini,
        .bar1.wait = gf100_bar_bar1_wait,
-       .umap = gf100_bar_umap,
+       .bar1.vmm = gf100_bar_bar1_vmm,
        .flush = g84_bar_flush,
 };
 
index 8d3f7ac42e02396a1a4dd89a1993a4019c8be806..8020cc996d1ad9c6fb54bcec8679686133f60054 100644 (file)
@@ -34,13 +34,6 @@ nv50_bar_kmap(struct nvkm_bar *base)
        return nv50_bar(base)->bar2_vm;
 }
 
-int
-nv50_bar_umap(struct nvkm_bar *base, u64 size, int type, struct nvkm_vma *vma)
-{
-       struct nv50_bar *bar = nv50_bar(base);
-       return nvkm_vm_get(bar->bar1_vm, size, type, NV_MEM_ACCESS_RW, vma);
-}
-
 static void
 nv50_bar_flush(struct nvkm_bar *base)
 {
@@ -56,6 +49,12 @@ nv50_bar_flush(struct nvkm_bar *base)
        spin_unlock_irqrestore(&bar->base.lock, flags);
 }
 
+struct nvkm_vmm *
+nv50_bar_bar1_vmm(struct nvkm_bar *base)
+{
+       return nv50_bar(base)->bar1_vm;
+}
+
 void
 nv50_bar_bar1_wait(struct nvkm_bar *base)
 {
@@ -229,11 +228,11 @@ nv50_bar_func = {
        .bar1.init = nv50_bar_bar1_init,
        .bar1.fini = nv50_bar_bar1_fini,
        .bar1.wait = nv50_bar_bar1_wait,
+       .bar1.vmm = nv50_bar_bar1_vmm,
        .bar2.init = nv50_bar_bar2_init,
        .bar2.fini = nv50_bar_bar2_fini,
        .bar2.wait = nv50_bar_bar1_wait,
        .kmap = nv50_bar_kmap,
-       .umap = nv50_bar_umap,
        .flush = nv50_bar_flush,
 };
 
index 0009ed4344f027ce403a194b532df079394f5dfc..24ca9a52cb42b4685bc6f4d1f88c95ad6d7e6b15 100644 (file)
@@ -22,8 +22,8 @@ int nv50_bar_oneinit(struct nvkm_bar *);
 void nv50_bar_init(struct nvkm_bar *);
 void nv50_bar_bar1_init(struct nvkm_bar *);
 void nv50_bar_bar1_wait(struct nvkm_bar *);
+struct nvkm_vmm *nv50_bar_bar1_vmm(struct nvkm_bar *);
 void nv50_bar_bar2_init(struct nvkm_bar *);
 struct nvkm_vm *nv50_bar_kmap(struct nvkm_bar *);
-int nv50_bar_umap(struct nvkm_bar *, u64, int, struct nvkm_vma *);
 void nv50_bar_unmap(struct nvkm_bar *, struct nvkm_vma *);
 #endif
index 9b1c360d62ec981f707c3aa7adae7f298ab15434..5aa220e204ee4b6330065e0d326a65d08feb5044 100644 (file)
@@ -15,10 +15,10 @@ struct nvkm_bar_func {
                void (*init)(struct nvkm_bar *);
                void (*fini)(struct nvkm_bar *);
                void (*wait)(struct nvkm_bar *);
+               struct nvkm_vmm *(*vmm)(struct nvkm_bar *);
        } bar1, bar2;
 
        struct nvkm_vm *(*kmap)(struct nvkm_bar *);
-       int  (*umap)(struct nvkm_bar *, u64 size, int type, struct nvkm_vma *);
        void (*flush)(struct nvkm_bar *);
 };