drm/nouveau/device: detect vGPUs
authorKarol Herbst <kherbst@redhat.com>
Tue, 28 Apr 2020 16:54:04 +0000 (18:54 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 22 May 2020 01:13:50 +0000 (11:13 +1000)
Using ENODEV as this prevents probe failed errors in dmesg.

v2: move check further down

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 c732074bf790f04589d8b9c55ac3aa9301b91e6e..f977dddcd8097b8e5eb85d91e479feb850020806 100644 (file)
@@ -2948,7 +2948,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
 {
        struct nvkm_subdev *subdev;
        u64 mmio_base, mmio_size;
-       u32 boot0, strap;
+       u32 boot0, boot1, strap;
        void __iomem *map = NULL;
        int ret = -EEXIST, i;
        unsigned chipset;
@@ -2998,9 +2998,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
                        }
                }
 
-               /* read boot0 and strapping information */
                boot0 = ioread32_native(map + 0x000000);
-               strap = ioread32_native(map + 0x101000);
 
                /* chipset can be overridden for devel/testing purposes */
                chipset = nvkm_longopt(device->cfgopt, "NvChipset", 0);
@@ -3158,6 +3156,17 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
                nvdev_info(device, "NVIDIA %s (%08x)\n",
                           device->chip->name, boot0);
 
+               /* vGPU detection */
+               boot1 = ioread32_native(map + 0x000004);
+               if (device->card_type >= TU100 && (boot1 & 0x00030000)) {
+                       nvdev_info(device, "vGPUs are not supported\n");
+                       ret = -ENODEV;
+                       goto done;
+               }
+
+               /* read strapping information */
+               strap = ioread32_native(map + 0x101000);
+
                /* determine frequency of timing crystal */
                if ( device->card_type <= NV_10 || device->chipset < 0x17 ||
                    (device->chipset >= 0x20 && device->chipset < 0x25))