nouveau/ws: add a field for the SM version
authorKarol Herbst <kherbst@redhat.com>
Fri, 20 May 2022 13:23:47 +0000 (15:23 +0200)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:31:52 +0000 (21:31 +0000)
This is very useful when looking up capabitilites in Nvidia CUDA docs

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/winsys/nouveau_device.c
src/nouveau/winsys/nouveau_device.h

index a3060e9..1d150de 100644 (file)
@@ -9,6 +9,63 @@
 #include "util/os_file.h"
 #include "util/os_misc.h"
 
+static uint8_t
+sm_for_chipset(uint16_t chipset)
+{
+   if (chipset >= 0x180)
+      return 0x90;
+   else if (chipset == 0x17b)
+      return 0x87;
+   else if (chipset >= 0x172)
+      return 0x86;
+   else if (chipset >= 0x170)
+      return 0x80;
+   else if (chipset >= 0x160)
+      return 0x75;
+   else if (chipset >= 0x14b)
+      return 0x72;
+   else if (chipset >= 0x140)
+      return 0x70;
+   else if (chipset >= 0x13b)
+      return 0x62;
+   else if (chipset >= 0x132)
+      return 0x61;
+   else if (chipset >= 0x130)
+      return 0x60;
+   else if (chipset >= 0x12b)
+      return 0x53;
+   else if (chipset >= 0x120)
+      return 0x52;
+   else if (chipset >= 0x110)
+      return 0x50;
+   // TODO: 0x37
+   else if (chipset >= 0x0f0)
+      return 0x35;
+   else if (chipset >= 0x0ea)
+      return 0x32;
+   else if (chipset >= 0x0e0)
+      return 0x30;
+   // GF110 is SM20
+   else if (chipset == 0x0c8)
+      return 0x20;
+   else if (chipset >= 0x0c1)
+      return 0x21;
+   else if (chipset >= 0x0c0)
+      return 0x20;
+   else if (chipset >= 0x0a3)
+      return 0x12;
+   // GT200 is SM13
+   else if (chipset >= 0x0a0)
+      return 0x13;
+   else if (chipset >= 0x080)
+      return 0x11;
+   // this has to be == because 0x63 is older than 0x50 and has no compute
+   else if (chipset == 0x050)
+      return 0x10;
+   // no compute
+   return 0x00;
+}
+
 struct nouveau_ws_device *
 nouveau_ws_device_new(int fd)
 {
@@ -37,6 +94,7 @@ nouveau_ws_device_new(int fd)
    device->base.vendor_id = 0x10de;
    device->base.device_id = device_id;
    device->base.chipset = dev->chipset;
+   device->base.sm = sm_for_chipset(dev->chipset);
    device->base.vram_size = dev->vram_size;
    os_get_available_system_memory(&device->base.gart_size);
    device->base.gart_size = MIN2(device->base.gart_size, dev->gart_size);
index 391f5dc..602e06b 100644 (file)
@@ -9,6 +9,8 @@ struct nouveau_ws_device {
    uint16_t vendor_id;
    uint16_t device_id;
    uint32_t chipset;
+   /* maps to CUDAs Compute capability version */
+   uint8_t sm;
    uint64_t vram_size;
    uint64_t gart_size;
    bool is_integrated;