Commit | Line | Data |
---|---|---|
9274f4a9 BS |
1 | #ifndef __NOUVEAU_DEVICE_H__ |
2 | #define __NOUVEAU_DEVICE_H__ | |
3 | ||
4 | #include <core/object.h> | |
5 | #include <core/subdev.h> | |
6 | #include <core/engine.h> | |
7 | ||
8 | enum nv_subdev_type { | |
dded35de | 9 | NVDEV_ENGINE_DEVICE, |
9274f4a9 | 10 | NVDEV_SUBDEV_VBIOS, |
7234d023 BS |
11 | |
12 | /* All subdevs from DEVINIT to DEVINIT_LAST will be created before | |
13 | * *any* of them are initialised. This subdev category is used | |
14 | * for any subdevs that the VBIOS init table parsing may call out | |
15 | * to during POST. | |
16 | */ | |
17 | NVDEV_SUBDEV_DEVINIT, | |
9274f4a9 BS |
18 | NVDEV_SUBDEV_GPIO, |
19 | NVDEV_SUBDEV_I2C, | |
54ecff3e | 20 | NVDEV_SUBDEV_DEVINIT_LAST = NVDEV_SUBDEV_I2C, |
7234d023 BS |
21 | |
22 | /* This grouping of subdevs are initialised right after they've | |
23 | * been created, and are allowed to assume any subdevs in the | |
24 | * list above them exist and have been initialised. | |
25 | */ | |
9274f4a9 | 26 | NVDEV_SUBDEV_MXM, |
9274f4a9 | 27 | NVDEV_SUBDEV_MC, |
a10220bb | 28 | NVDEV_SUBDEV_BUS, |
9274f4a9 BS |
29 | NVDEV_SUBDEV_TIMER, |
30 | NVDEV_SUBDEV_FB, | |
31 | NVDEV_SUBDEV_LTCG, | |
2c1a425e | 32 | NVDEV_SUBDEV_IBUS, |
9274f4a9 BS |
33 | NVDEV_SUBDEV_INSTMEM, |
34 | NVDEV_SUBDEV_VM, | |
35 | NVDEV_SUBDEV_BAR, | |
36 | NVDEV_SUBDEV_VOLT, | |
54ecff3e | 37 | NVDEV_SUBDEV_CLOCK, |
9274f4a9 | 38 | NVDEV_SUBDEV_THERM, |
7234d023 | 39 | |
9274f4a9 BS |
40 | NVDEV_ENGINE_DMAOBJ, |
41 | NVDEV_ENGINE_FIFO, | |
42 | NVDEV_ENGINE_SW, | |
43 | NVDEV_ENGINE_GR, | |
44 | NVDEV_ENGINE_MPEG, | |
45 | NVDEV_ENGINE_ME, | |
46 | NVDEV_ENGINE_VP, | |
47 | NVDEV_ENGINE_CRYPT, | |
48 | NVDEV_ENGINE_BSP, | |
49 | NVDEV_ENGINE_PPP, | |
50 | NVDEV_ENGINE_COPY0, | |
51 | NVDEV_ENGINE_COPY1, | |
b0bc5304 | 52 | NVDEV_ENGINE_COPY2, |
c42a7aec | 53 | NVDEV_ENGINE_VIC, |
dbff2dee | 54 | NVDEV_ENGINE_VENC, |
9274f4a9 | 55 | NVDEV_ENGINE_DISP, |
7234d023 | 56 | |
9274f4a9 BS |
57 | NVDEV_SUBDEV_NR, |
58 | }; | |
59 | ||
60 | struct nouveau_device { | |
dded35de | 61 | struct nouveau_engine base; |
9274f4a9 BS |
62 | struct list_head head; |
63 | ||
64 | struct pci_dev *pdev; | |
65 | u64 handle; | |
66 | ||
67 | const char *cfgopt; | |
68 | const char *dbgopt; | |
69 | const char *name; | |
70 | const char *cname; | |
71 | ||
72 | enum { | |
73 | NV_04 = 0x04, | |
74 | NV_10 = 0x10, | |
4a0ff754 | 75 | NV_11 = 0x11, |
9274f4a9 BS |
76 | NV_20 = 0x20, |
77 | NV_30 = 0x30, | |
78 | NV_40 = 0x40, | |
79 | NV_50 = 0x50, | |
80 | NV_C0 = 0xc0, | |
81 | NV_D0 = 0xd0, | |
82 | NV_E0 = 0xe0, | |
83 | } card_type; | |
84 | u32 chipset; | |
85 | u32 crystal; | |
86 | ||
87 | struct nouveau_oclass *oclass[NVDEV_SUBDEV_NR]; | |
88 | struct nouveau_object *subdev[NVDEV_SUBDEV_NR]; | |
89 | }; | |
90 | ||
91 | static inline struct nouveau_device * | |
92 | nv_device(void *obj) | |
93 | { | |
94 | struct nouveau_object *object = nv_object(obj); | |
95 | struct nouveau_object *device = object; | |
96 | ||
97 | if (device->engine) | |
98 | device = device->engine; | |
99 | if (device->parent) | |
100 | device = device->parent; | |
101 | ||
102 | #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA | |
103 | if (unlikely(!nv_iclass(device, NV_SUBDEV_CLASS) || | |
dded35de | 104 | (nv_hclass(device) & 0xff) != NVDEV_ENGINE_DEVICE)) { |
9274f4a9 BS |
105 | nv_assert("BAD CAST -> NvDevice, 0x%08x 0x%08x", |
106 | nv_hclass(object), nv_hclass(device)); | |
107 | } | |
108 | #endif | |
109 | ||
110 | return (void *)device; | |
111 | } | |
112 | ||
113 | static inline struct nouveau_subdev * | |
114 | nouveau_subdev(void *obj, int sub) | |
115 | { | |
116 | if (nv_device(obj)->subdev[sub]) | |
117 | return nv_subdev(nv_device(obj)->subdev[sub]); | |
118 | return NULL; | |
119 | } | |
120 | ||
121 | static inline struct nouveau_engine * | |
122 | nouveau_engine(void *obj, int sub) | |
123 | { | |
124 | struct nouveau_subdev *subdev = nouveau_subdev(obj, sub); | |
125 | if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS)) | |
126 | return nv_engine(subdev); | |
127 | return NULL; | |
128 | } | |
129 | ||
130 | static inline bool | |
131 | nv_device_match(struct nouveau_object *object, u16 dev, u16 ven, u16 sub) | |
132 | { | |
133 | struct nouveau_device *device = nv_device(object); | |
134 | return device->pdev->device == dev && | |
135 | device->pdev->subsystem_vendor == ven && | |
136 | device->pdev->subsystem_device == sub; | |
137 | } | |
138 | ||
139 | #endif |