drm/nouveau/bar/gf100: add config option to limit BAR2 to 16MiB
authorBen Skeggs <bskeggs@redhat.com>
Fri, 4 Aug 2017 00:44:34 +0000 (10:44 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 22 Aug 2017 08:04:33 +0000 (18:04 +1000)
Useful for testing, and for the userspace build where we can't kick
a framebuffer driver off the device.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.h

index 6d8f21290aa20342c1d50f73aa836feab1266d8c..676c167c95b987b51e1edcdd213124ca733097e1 100644 (file)
@@ -24,6 +24,7 @@
 #include "gf100.h"
 
 #include <core/gpuobj.h>
+#include <core/option.h>
 #include <subdev/fb.h>
 #include <subdev/mmu.h>
 
@@ -59,6 +60,8 @@ gf100_bar_ctor_vm(struct gf100_bar *bar, struct gf100_bar_vm *bar_vm,
                return ret;
 
        bar_len = device->func->resource_size(device, bar_nr);
+       if (bar_nr == 3 && bar->bar2_halve)
+               bar_len >>= 1;
 
        ret = nvkm_vm_new(device, 0, bar_len, 0, key, &vm);
        if (ret)
@@ -129,6 +132,8 @@ gf100_bar_init(struct nvkm_bar *base)
 
        if (bar->bar[0].mem) {
                addr = nvkm_memory_addr(bar->bar[0].mem) >> 12;
+               if (bar->bar2_halve)
+                       addr |= 0x40000000;
                nvkm_wr32(device, 0x001714, 0x80000000 | addr);
        }
 
@@ -161,6 +166,7 @@ gf100_bar_new_(const struct nvkm_bar_func *func, struct nvkm_device *device,
        if (!(bar = kzalloc(sizeof(*bar), GFP_KERNEL)))
                return -ENOMEM;
        nvkm_bar_ctor(func, device, index, &bar->base);
+       bar->bar2_halve = nvkm_boolopt(device->cfgopt, "NvBar2Halve", false);
        *pbar = &bar->base;
        return 0;
 }
index f7dea69640d878aa353a15884e1b267c724471ea..20a5255362baf60bd578c55381a74ed984ad98ee 100644 (file)
@@ -11,6 +11,7 @@ struct gf100_bar_vm {
 
 struct gf100_bar {
        struct nvkm_bar base;
+       bool bar2_halve;
        struct gf100_bar_vm bar[2];
 };