drm/nouveau/bar/nv50: ensure BAR is mapped
authorJon Derrick <jonathan.derrick@intel.com>
Sat, 16 Mar 2019 00:05:16 +0000 (18:05 -0600)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 1 May 2019 01:08:39 +0000 (11:08 +1000)
If the BAR is zero size, it indicates it was never successfully mapped.
Ensure that the BAR is valid during initialization before attempting to
use it.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c

index 8e64b19..f23a0cc 100644 (file)
@@ -109,7 +109,7 @@ nv50_bar_oneinit(struct nvkm_bar *base)
        struct nvkm_device *device = bar->base.subdev.device;
        static struct lock_class_key bar1_lock;
        static struct lock_class_key bar2_lock;
-       u64 start, limit;
+       u64 start, limit, size;
        int ret;
 
        ret = nvkm_gpuobj_new(device, 0x20000, 0, false, NULL, &bar->mem);
@@ -127,7 +127,10 @@ nv50_bar_oneinit(struct nvkm_bar *base)
 
        /* BAR2 */
        start = 0x0100000000ULL;
-       limit = start + device->func->resource_size(device, 3);
+       size = device->func->resource_size(device, 3);
+       if (!size)
+               return -ENOMEM;
+       limit = start + size;
 
        ret = nvkm_vmm_new(device, start, limit-- - start, NULL, 0,
                           &bar2_lock, "bar2", &bar->bar2_vmm);
@@ -164,7 +167,10 @@ nv50_bar_oneinit(struct nvkm_bar *base)
 
        /* BAR1 */
        start = 0x0000000000ULL;
-       limit = start + device->func->resource_size(device, 1);
+       size = device->func->resource_size(device, 1);
+       if (!size)
+               return -ENOMEM;
+       limit = start + size;
 
        ret = nvkm_vmm_new(device, start, limit-- - start, NULL, 0,
                           &bar1_lock, "bar1", &bar->bar1_vmm);