]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/nouveau/bar: move bar1 initialisation into its own function
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:17 +0000 (13:32 +1000)
BAR2 being done for practical reasons, this is just for consistency.

Flushes have been added after the write to bind the instance block,
as later commits will reveal the need for them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
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 f849db6ef541e8e2d2b92228d93197a32f54992a..adaf91ee8326e126eea248ba9e23aa4d88666f17 100644 (file)
@@ -49,6 +49,8 @@ static int
 nvkm_bar_init(struct nvkm_subdev *subdev)
 {
        struct nvkm_bar *bar = nvkm_bar(subdev);
+       bar->func->bar1.init(bar);
+       bar->func->bar1.wait(bar);
        bar->func->init(bar);
        return 0;
 }
index ef717136c838cf52af4e298af6b5fa7c30fcb76b..dee1cd9987c2dc0d22046f78315da52d8a507011 100644 (file)
@@ -44,6 +44,8 @@ g84_bar_func = {
        .dtor = nv50_bar_dtor,
        .oneinit = nv50_bar_oneinit,
        .init = nv50_bar_init,
+       .bar1.init = nv50_bar_bar1_init,
+       .bar1.wait = nv50_bar_bar1_wait,
        .kmap = nv50_bar_kmap,
        .umap = nv50_bar_umap,
        .flush = g84_bar_flush,
index d2496cd736fa531d527e54a539403faa7ae70d76..fc3d771cef508ffe1b314c3cca6698a8bb37f4fa 100644 (file)
@@ -41,6 +41,23 @@ gf100_bar_umap(struct nvkm_bar *base, u64 size, int type, struct nvkm_vma *vma)
        return nvkm_vm_get(bar->bar[1].vm, size, type, NV_MEM_ACCESS_RW, vma);
 }
 
+void
+gf100_bar_bar1_wait(struct nvkm_bar *base)
+{
+       /* NFI why it's twice. */
+       nvkm_bar_flush(base);
+       nvkm_bar_flush(base);
+}
+
+void
+gf100_bar_bar1_init(struct nvkm_bar *base)
+{
+       struct nvkm_device *device = base->subdev.device;
+       struct gf100_bar *bar = gf100_bar(base);
+       const u32 addr = nvkm_memory_addr(bar->bar[1].mem) >> 12;
+       nvkm_wr32(device, 0x001704, 0x80000000 | addr);
+}
+
 void
 gf100_bar_init(struct nvkm_bar *base)
 {
@@ -48,9 +65,6 @@ gf100_bar_init(struct nvkm_bar *base)
        struct nvkm_device *device = bar->base.subdev.device;
        u32 addr;
 
-       addr = nvkm_memory_addr(bar->bar[1].mem) >> 12;
-       nvkm_wr32(device, 0x001704, 0x80000000 | addr);
-
        if (bar->bar[0].mem) {
                addr = nvkm_memory_addr(bar->bar[0].mem) >> 12;
                if (bar->bar2_halve)
@@ -171,6 +185,8 @@ gf100_bar_func = {
        .dtor = gf100_bar_dtor,
        .oneinit = gf100_bar_oneinit,
        .init = gf100_bar_init,
+       .bar1.init = gf100_bar_bar1_init,
+       .bar1.wait = gf100_bar_bar1_wait,
        .kmap = gf100_bar_kmap,
        .umap = gf100_bar_umap,
        .flush = g84_bar_flush,
index ece98643beddbaf8b0985d476c9c3138ab2a475a..9b994eaad1e5d036b6442c8c9287582280451f75 100644 (file)
@@ -20,5 +20,7 @@ int gf100_bar_new_(const struct nvkm_bar_func *, struct nvkm_device *,
 void *gf100_bar_dtor(struct nvkm_bar *);
 int gf100_bar_oneinit(struct nvkm_bar *);
 void gf100_bar_init(struct nvkm_bar *);
+void gf100_bar_bar1_init(struct nvkm_bar *);
+void gf100_bar_bar1_wait(struct nvkm_bar *);
 int gf100_bar_umap(struct nvkm_bar *, u64, int, struct nvkm_vma *);
 #endif
index 9232fab4274c859b6dda857605c679cb28bf0b75..86aca93e76e804c4639af40a1c6f445624cb6276 100644 (file)
@@ -25,7 +25,8 @@ static const struct nvkm_bar_func
 gk20a_bar_func = {
        .dtor = gf100_bar_dtor,
        .oneinit = gf100_bar_oneinit,
-       .init = gf100_bar_init,
+       .bar1.init = gf100_bar_bar1_init,
+       .bar1.wait = gf100_bar_bar1_wait,
        .umap = gf100_bar_umap,
        .flush = g84_bar_flush,
 };
index 8a4c42f9a96a5a300c28f194ec9f719f0afeaf6a..8cb8e721a5152174c995af1a8bac3ccfb0aa3e96 100644 (file)
@@ -56,6 +56,20 @@ nv50_bar_flush(struct nvkm_bar *base)
        spin_unlock_irqrestore(&bar->base.lock, flags);
 }
 
+void
+nv50_bar_bar1_wait(struct nvkm_bar *base)
+{
+       nvkm_bar_flush(base);
+}
+
+void
+nv50_bar_bar1_init(struct nvkm_bar *base)
+{
+       struct nvkm_device *device = base->subdev.device;
+       struct nv50_bar *bar = nv50_bar(base);
+       nvkm_wr32(device, 0x001708, 0x80000000 | bar->bar1->node->offset >> 4);
+}
+
 void
 nv50_bar_init(struct nvkm_bar *base)
 {
@@ -65,7 +79,6 @@ nv50_bar_init(struct nvkm_bar *base)
 
        nvkm_wr32(device, 0x001704, 0x00000000 | bar->mem->addr >> 12);
        nvkm_wr32(device, 0x001704, 0x40000000 | bar->mem->addr >> 12);
-       nvkm_wr32(device, 0x001708, 0x80000000 | bar->bar1->node->offset >> 4);
        nvkm_wr32(device, 0x00170c, 0x80000000 | bar->bar2->node->offset >> 4);
        for (i = 0; i < 8; i++)
                nvkm_wr32(device, 0x001900 + (i * 4), 0x00000000);
@@ -194,6 +207,8 @@ nv50_bar_func = {
        .dtor = nv50_bar_dtor,
        .oneinit = nv50_bar_oneinit,
        .init = nv50_bar_init,
+       .bar1.init = nv50_bar_bar1_init,
+       .bar1.wait = nv50_bar_bar1_wait,
        .kmap = nv50_bar_kmap,
        .umap = nv50_bar_umap,
        .flush = nv50_bar_flush,
index 6ff3fdb4b4bd82feffa45463375b1ba66b160ea4..52971cfd119cbe693806acfc8fca56e9d90e906f 100644 (file)
@@ -20,6 +20,8 @@ int nv50_bar_new_(const struct nvkm_bar_func *, struct nvkm_device *,
 void *nv50_bar_dtor(struct nvkm_bar *);
 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_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 *);
index c017239b2a8e834ce06a64a75ca526244b70f67c..8b508373769f8746acc6b42847563c36fd423702 100644 (file)
@@ -10,6 +10,12 @@ struct nvkm_bar_func {
        void *(*dtor)(struct nvkm_bar *);
        int (*oneinit)(struct nvkm_bar *);
        void (*init)(struct nvkm_bar *);
+
+       struct {
+               void (*init)(struct nvkm_bar *);
+               void (*wait)(struct nvkm_bar *);
+       } bar1;
+
        struct nvkm_vm *(*kmap)(struct nvkm_bar *);
        int  (*umap)(struct nvkm_bar *, u64 size, int type, struct nvkm_vma *);
        void (*flush)(struct nvkm_bar *);