]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/nouveau/device: rework mmio mapping code to get rid of second map
authorKarol Herbst <kherbst@redhat.com>
Tue, 28 Apr 2020 16:54:02 +0000 (18:54 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 22 May 2020 01:13:50 +0000 (11:13 +1000)
Fixes warnings on GPUs with smaller a smaller mmio region like vGPUs.

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c

index 8ebbe16560083dc573b41dc0336d217264d0909d..37589f36546d9384cb6d1d44ee0d1faaa37552c8 100644 (file)
@@ -2935,7 +2935,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
        struct nvkm_subdev *subdev;
        u64 mmio_base, mmio_size;
        u32 boot0, strap;
-       void __iomem *map;
+       void __iomem *map = NULL;
        int ret = -EEXIST, i;
        unsigned chipset;
 
@@ -2961,12 +2961,17 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
        mmio_base = device->func->resource_addr(device, 0);
        mmio_size = device->func->resource_size(device, 0);
 
-       /* identify the chipset, and determine classes of subdev/engines */
-       if (detect) {
-               map = ioremap(mmio_base, 0x102000);
-               if (ret = -ENOMEM, map == NULL)
+       if (detect || mmio) {
+               map = ioremap(mmio_base, mmio_size);
+               if (map == NULL) {
+                       nvdev_error(device, "unable to map PRI\n");
+                       ret = -ENOMEM;
                        goto done;
+               }
+       }
 
+       /* identify the chipset, and determine classes of subdev/engines */
+       if (detect) {
                /* switch mmio to cpu's native endianness */
 #ifndef __BIG_ENDIAN
                if (ioread32_native(map + 0x000004) != 0x00000000) {
@@ -2980,7 +2985,6 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
                /* read boot0 and strapping information */
                boot0 = ioread32_native(map + 0x000000);
                strap = ioread32_native(map + 0x101000);
-               iounmap(map);
 
                /* chipset can be overridden for devel/testing purposes */
                chipset = nvkm_longopt(device->cfgopt, "NvChipset", 0);
@@ -3159,12 +3163,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
                device->name = device->chip->name;
 
        if (mmio) {
-               device->pri = ioremap(mmio_base, mmio_size);
-               if (!device->pri) {
-                       nvdev_error(device, "unable to map PRI\n");
-                       ret = -ENOMEM;
-                       goto done;
-               }
+               device->pri = map;
        }
 
        mutex_init(&device->mutex);
@@ -3254,6 +3253,10 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
 
        ret = 0;
 done:
+       if (map && (!mmio || ret)) {
+               device->pri = NULL;
+               iounmap(map);
+       }
        mutex_unlock(&nv_devices_mutex);
        return ret;
 }