From: Karol Herbst Date: Tue, 7 Jun 2022 00:41:16 +0000 (+0200) Subject: nouveau/ws: set GPU object class X-Git-Tag: upstream/23.3.3~4577 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=acbd4523a479733d997090add79731e6c30c4513;p=platform%2Fupstream%2Fmesa.git nouveau/ws: set GPU object class Part-of: --- diff --git a/src/nouveau/winsys/nouveau_device.c b/src/nouveau/winsys/nouveau_device.c index 6f4d621..a4d5083 100644 --- a/src/nouveau/winsys/nouveau_device.c +++ b/src/nouveau/winsys/nouveau_device.c @@ -10,60 +10,107 @@ #include "util/os_misc.h" static uint8_t -sm_for_chipset(uint16_t chipset) +cls_for_chipset(uint16_t chipset) { if (chipset >= 0x180) - return 0x90; + assert(!"unknown chipset"); else if (chipset == 0x17b) - return 0x87; + return 0xc7; else if (chipset >= 0x172) - return 0x86; + return 0xc6; else if (chipset >= 0x170) - return 0x80; + return 0xc5; else if (chipset >= 0x160) - return 0x75; - else if (chipset >= 0x14b) - return 0x72; + return 0xc4; else if (chipset >= 0x140) - return 0x70; - else if (chipset >= 0x13b) - return 0x62; + return 0xc3; else if (chipset >= 0x132) - return 0x61; + return 0xc1; else if (chipset >= 0x130) - return 0x60; - else if (chipset >= 0x12b) - return 0x53; + return 0xc0; else if (chipset >= 0x120) - return 0x52; + return 0xb1; else if (chipset >= 0x110) - return 0x50; - // TODO: 0x37 + return 0xb0; else if (chipset >= 0x0f0) - return 0x35; + return 0xa2; else if (chipset >= 0x0ea) - return 0x32; + return 0xa1; else if (chipset >= 0x0e0) - return 0x30; - // GF110 is SM20 + return 0xa0; + // GF110 is like GF100 else if (chipset == 0x0c8) - return 0x20; + return 0x90; else if (chipset >= 0x0c1) - return 0x21; + return 0x91; else if (chipset >= 0x0c0) - return 0x20; + return 0x90; else if (chipset >= 0x0a3) - return 0x12; - // GT200 is SM13 + return 0x85; + // GT200 is special else if (chipset >= 0x0a0) + return 0x86; + else if (chipset >= 0x082) + return 0x82; + // this has to be == because 0x63 is older than 0x50 + else if (chipset == 0x050) + return 0x50; + else if (chipset >= 0x044) + return 0x44; + else if (chipset >= 0x040) + return 0x40; + else if (chipset >= 0x036) + return 0x36; + else if (chipset >= 0x020) + return 0x20; + return 0x00; +} + +static uint8_t +sm_for_cls(uint8_t cls, uint16_t chipset) +{ + switch (cls) { + case 0xc7: + return 0x87; + case 0xc6: + return 0x86; + case 0xc5: + return 0x80; + case 0xc4: + return 0x75; + case 0xc3: + return chipset >= 0x14b ? 0x72 : 0x70; + case 0xc1: + // TODO maybe that's 0xc2? + return chipset >= 0x13b ? 0x62 : 0x61; + case 0xc0: + return 0x60; + case 0xb1: + // TODO is there a 0xb2? + return chipset >= 0x12b ? 0x53 : 0x52; + case 0xb0: + return 0x50; + case 0xa2: + return 0x35; + case 0xa1: + return 0x31; + case 0xa0: + return 0x30; + case 0x91: + return 0x21; + case 0x90: + return 0x20; + case 0x86: return 0x13; - else if (chipset >= 0x080) + case 0x85: + return 0x12; + case 0x82: return 0x11; - // this has to be == because 0x63 is older than 0x50 and has no compute - else if (chipset == 0x050) + case 0x50: return 0x10; - // no compute - return 0x00; + default: + return 0; + } } struct nouveau_ws_device * @@ -94,7 +141,8 @@ 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.cls = cls_for_chipset(dev->chipset); + device->base.cm = sm_for_cls(device->base.cls, 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); diff --git a/src/nouveau/winsys/nouveau_device.h b/src/nouveau/winsys/nouveau_device.h index cb78a20..e8fecb5 100644 --- a/src/nouveau/winsys/nouveau_device.h +++ b/src/nouveau/winsys/nouveau_device.h @@ -9,8 +9,10 @@ struct nouveau_ws_device { uint16_t vendor_id; uint16_t device_id; uint32_t chipset; + /* first byte of class id */ + uint8_t cls; /* maps to CUDAs Compute capability version */ - uint8_t sm; + uint8_t cm; uint64_t vram_size; uint64_t gart_size; bool is_integrated;