1 #ifndef NV_DEVINFO_H
2 #define NV_DEVINFO_H
3
4 #include <stdbool.h>
5 #include <string.h>
6
7 #include "util/macros.h"
8
9 #define NVIDIA_VENDOR_ID 0x10de
10
11 enum ENUM_PACKED nv_device_type {
12 NV_DEVICE_TYPE_IGP,
13 NV_DEVICE_TYPE_DIS,
14 NV_DEVICE_TYPE_SOC,
15 };
16
17 struct nv_device_info {
18 enum nv_device_type type;
19
20 uint16_t device_id;
21 uint16_t chipset;
22
23 char device_name[64];
24 char chipset_name[16];
25
26 /* Populated if type != NV_DEVICE_TYPE_SOC */
27 struct {
28 uint16_t domain;
29 uint8_t bus;
30 uint8_t dev;
31 uint8_t func;
32 uint8_t revision_id;
33 } pci;
34
35 uint8_t sm; /**< Shader model */
36
37 uint8_t gpc_count;
38 uint16_t tpc_count;
39 uint8_t mp_per_tpc;
40 uint8_t max_warps_per_mp;
41
42 uint16_t cls_copy;
43 uint16_t cls_eng2d;
44 uint16_t cls_eng3d;
45 uint16_t cls_m2mf;
46 uint16_t cls_compute;
47
48 uint64_t vram_size_B;
49 uint64_t bar_size_B;
50 };
51
52 static inline void
nv_device_uuid(const struct nv_device_info * info,uint8_t * uuid,size_t len,bool vm_bind)53 nv_device_uuid(const struct nv_device_info *info, uint8_t *uuid, size_t len, bool vm_bind)
54 {
55 uint16_t vendor_id = NVIDIA_VENDOR_ID;
56
57 assert(len >= 16);
58
59 memset(uuid, 0, len);
60 memcpy(&uuid[0], &info->chipset, 2);
61 memcpy(&uuid[2], &vendor_id, 2);
62 memcpy(&uuid[4], &info->device_id, 2);
63
64 if (info->type != NV_DEVICE_TYPE_SOC) {
65 memcpy(&uuid[6], &info->pci.domain, 2);
66 uuid[8] = info->pci.bus;
67 uuid[9] = info->pci.dev;
68 uuid[10] = info->pci.func;
69 }
70 uuid[11] = vm_bind;
71 }
72
73 #endif /* NV_DEVINFO_H */
74