]>
Commit | Line | Data |
---|---|---|
5025407b BS |
1 | #ifndef __NVKM_DEVICE_H__ |
2 | #define __NVKM_DEVICE_H__ | |
ed76a870 | 3 | #include <core/event.h> |
68f3f702 | 4 | #include <core/object.h> |
9274f4a9 | 5 | |
9ace404b | 6 | enum nvkm_devidx { |
0a34fb31 | 7 | NVKM_SUBDEV_PCI, |
68f3f702 BS |
8 | NVKM_SUBDEV_VBIOS, |
9 | NVKM_SUBDEV_DEVINIT, | |
eaebfcc3 | 10 | NVKM_SUBDEV_TOP, |
68f3f702 BS |
11 | NVKM_SUBDEV_IBUS, |
12 | NVKM_SUBDEV_GPIO, | |
13 | NVKM_SUBDEV_I2C, | |
14 | NVKM_SUBDEV_FUSE, | |
15 | NVKM_SUBDEV_MXM, | |
16 | NVKM_SUBDEV_MC, | |
17 | NVKM_SUBDEV_BUS, | |
18 | NVKM_SUBDEV_TIMER, | |
77154fd9 | 19 | NVKM_SUBDEV_INSTMEM, |
68f3f702 BS |
20 | NVKM_SUBDEV_FB, |
21 | NVKM_SUBDEV_LTC, | |
68f3f702 BS |
22 | NVKM_SUBDEV_MMU, |
23 | NVKM_SUBDEV_BAR, | |
24 | NVKM_SUBDEV_PMU, | |
25 | NVKM_SUBDEV_VOLT, | |
dc06e366 | 26 | NVKM_SUBDEV_ICCSENSE, |
68f3f702 BS |
27 | NVKM_SUBDEV_THERM, |
28 | NVKM_SUBDEV_CLK, | |
7d12388a | 29 | NVKM_SUBDEV_SECBOOT, |
68f3f702 | 30 | |
68f3f702 | 31 | NVKM_ENGINE_BSP, |
7cee0433 | 32 | |
68f3f702 BS |
33 | NVKM_ENGINE_CE0, |
34 | NVKM_ENGINE_CE1, | |
35 | NVKM_ENGINE_CE2, | |
7cee0433 BS |
36 | NVKM_ENGINE_CE_LAST = NVKM_ENGINE_CE2, |
37 | ||
38 | NVKM_ENGINE_CIPHER, | |
68f3f702 | 39 | NVKM_ENGINE_DISP, |
7cee0433 BS |
40 | NVKM_ENGINE_DMAOBJ, |
41 | NVKM_ENGINE_FIFO, | |
42 | NVKM_ENGINE_GR, | |
43 | NVKM_ENGINE_IFB, | |
44 | NVKM_ENGINE_ME, | |
45 | NVKM_ENGINE_MPEG, | |
46 | NVKM_ENGINE_MSENC, | |
47 | NVKM_ENGINE_MSPDEC, | |
48 | NVKM_ENGINE_MSPPP, | |
68f3f702 | 49 | NVKM_ENGINE_MSVLD, |
294af04b BS |
50 | |
51 | NVKM_ENGINE_NVENC0, | |
52 | NVKM_ENGINE_NVENC1, | |
53 | NVKM_ENGINE_NVENC_LAST = NVKM_ENGINE_NVENC1, | |
54 | ||
3545b425 | 55 | NVKM_ENGINE_NVDEC, |
7cee0433 | 56 | NVKM_ENGINE_PM, |
68f3f702 | 57 | NVKM_ENGINE_SEC, |
7cee0433 BS |
58 | NVKM_ENGINE_SW, |
59 | NVKM_ENGINE_VIC, | |
60 | NVKM_ENGINE_VP, | |
68f3f702 | 61 | |
26c9e8ef BS |
62 | NVKM_SUBDEV_NR |
63 | }; | |
64 | ||
65 | enum nvkm_device_type { | |
66 | NVKM_DEVICE_PCI, | |
67 | NVKM_DEVICE_AGP, | |
68 | NVKM_DEVICE_PCIE, | |
69 | NVKM_DEVICE_TEGRA, | |
9ace404b BS |
70 | }; |
71 | ||
5025407b | 72 | struct nvkm_device { |
7974dd1b BS |
73 | const struct nvkm_device_func *func; |
74 | const struct nvkm_device_quirk *quirk; | |
75 | struct device *dev; | |
26c9e8ef | 76 | enum nvkm_device_type type; |
7974dd1b BS |
77 | u64 handle; |
78 | const char *name; | |
79 | const char *cfgopt; | |
80 | const char *dbgopt; | |
81 | ||
9274f4a9 | 82 | struct list_head head; |
a1e88736 BS |
83 | struct mutex mutex; |
84 | int refcount; | |
9274f4a9 | 85 | |
2ebfa1bc BS |
86 | void __iomem *pri; |
87 | ||
79ca2770 | 88 | struct nvkm_event event; |
ed76a870 | 89 | |
f0d13e3a | 90 | u64 disable_mask; |
68f3f702 | 91 | u32 debug; |
9274f4a9 | 92 | |
6cf813fb | 93 | const struct nvkm_device_chip *chip; |
9274f4a9 BS |
94 | enum { |
95 | NV_04 = 0x04, | |
96 | NV_10 = 0x10, | |
4a0ff754 | 97 | NV_11 = 0x11, |
9274f4a9 BS |
98 | NV_20 = 0x20, |
99 | NV_30 = 0x30, | |
100 | NV_40 = 0x40, | |
101 | NV_50 = 0x50, | |
102 | NV_C0 = 0xc0, | |
9274f4a9 | 103 | NV_E0 = 0xe0, |
3f204647 | 104 | GM100 = 0x110, |
9274f4a9 BS |
105 | } card_type; |
106 | u32 chipset; | |
3704791d | 107 | u8 chiprev; |
9274f4a9 BS |
108 | u32 crystal; |
109 | ||
ed76a870 BS |
110 | struct { |
111 | struct notifier_block nb; | |
112 | } acpi; | |
741d778e BS |
113 | |
114 | struct nvkm_bar *bar; | |
115 | struct nvkm_bios *bios; | |
116 | struct nvkm_bus *bus; | |
117 | struct nvkm_clk *clk; | |
118 | struct nvkm_devinit *devinit; | |
119 | struct nvkm_fb *fb; | |
120 | struct nvkm_fuse *fuse; | |
121 | struct nvkm_gpio *gpio; | |
122 | struct nvkm_i2c *i2c; | |
123 | struct nvkm_subdev *ibus; | |
dc06e366 | 124 | struct nvkm_iccsense *iccsense; |
741d778e BS |
125 | struct nvkm_instmem *imem; |
126 | struct nvkm_ltc *ltc; | |
127 | struct nvkm_mc *mc; | |
128 | struct nvkm_mmu *mmu; | |
129 | struct nvkm_subdev *mxm; | |
0a34fb31 | 130 | struct nvkm_pci *pci; |
741d778e | 131 | struct nvkm_pmu *pmu; |
7d12388a | 132 | struct nvkm_secboot *secboot; |
741d778e BS |
133 | struct nvkm_therm *therm; |
134 | struct nvkm_timer *timer; | |
eaebfcc3 | 135 | struct nvkm_top *top; |
741d778e BS |
136 | struct nvkm_volt *volt; |
137 | ||
138 | struct nvkm_engine *bsp; | |
139 | struct nvkm_engine *ce[3]; | |
140 | struct nvkm_engine *cipher; | |
141 | struct nvkm_disp *disp; | |
19fef52d | 142 | struct nvkm_dma *dma; |
741d778e BS |
143 | struct nvkm_fifo *fifo; |
144 | struct nvkm_gr *gr; | |
145 | struct nvkm_engine *ifb; | |
146 | struct nvkm_engine *me; | |
147 | struct nvkm_engine *mpeg; | |
148 | struct nvkm_engine *msenc; | |
149 | struct nvkm_engine *mspdec; | |
150 | struct nvkm_engine *msppp; | |
151 | struct nvkm_engine *msvld; | |
294af04b | 152 | struct nvkm_engine *nvenc[2]; |
3545b425 | 153 | struct nvkm_engine *nvdec; |
741d778e BS |
154 | struct nvkm_pm *pm; |
155 | struct nvkm_engine *sec; | |
156 | struct nvkm_sw *sw; | |
157 | struct nvkm_engine *vic; | |
158 | struct nvkm_engine *vp; | |
9274f4a9 BS |
159 | }; |
160 | ||
6cf813fb BS |
161 | struct nvkm_subdev *nvkm_device_subdev(struct nvkm_device *, int index); |
162 | struct nvkm_engine *nvkm_device_engine(struct nvkm_device *, int index); | |
163 | ||
7974dd1b BS |
164 | struct nvkm_device_func { |
165 | struct nvkm_device_pci *(*pci)(struct nvkm_device *); | |
166 | struct nvkm_device_tegra *(*tegra)(struct nvkm_device *); | |
167 | void *(*dtor)(struct nvkm_device *); | |
168 | int (*preinit)(struct nvkm_device *); | |
2b700825 | 169 | int (*init)(struct nvkm_device *); |
7974dd1b | 170 | void (*fini)(struct nvkm_device *, bool suspend); |
7e8820fe BS |
171 | resource_size_t (*resource_addr)(struct nvkm_device *, unsigned bar); |
172 | resource_size_t (*resource_size)(struct nvkm_device *, unsigned bar); | |
26c9e8ef | 173 | bool cpu_coherent; |
7974dd1b BS |
174 | }; |
175 | ||
176 | struct nvkm_device_quirk { | |
c7af0ff0 BS |
177 | u8 tv_pin_mask; |
178 | u8 tv_gpio; | |
7974dd1b BS |
179 | }; |
180 | ||
6cf813fb BS |
181 | struct nvkm_device_chip { |
182 | const char *name; | |
183 | ||
dc06e366 MP |
184 | int (*bar )(struct nvkm_device *, int idx, struct nvkm_bar **); |
185 | int (*bios )(struct nvkm_device *, int idx, struct nvkm_bios **); | |
186 | int (*bus )(struct nvkm_device *, int idx, struct nvkm_bus **); | |
187 | int (*clk )(struct nvkm_device *, int idx, struct nvkm_clk **); | |
188 | int (*devinit )(struct nvkm_device *, int idx, struct nvkm_devinit **); | |
189 | int (*fb )(struct nvkm_device *, int idx, struct nvkm_fb **); | |
190 | int (*fuse )(struct nvkm_device *, int idx, struct nvkm_fuse **); | |
191 | int (*gpio )(struct nvkm_device *, int idx, struct nvkm_gpio **); | |
192 | int (*i2c )(struct nvkm_device *, int idx, struct nvkm_i2c **); | |
193 | int (*ibus )(struct nvkm_device *, int idx, struct nvkm_subdev **); | |
194 | int (*iccsense)(struct nvkm_device *, int idx, struct nvkm_iccsense **); | |
195 | int (*imem )(struct nvkm_device *, int idx, struct nvkm_instmem **); | |
196 | int (*ltc )(struct nvkm_device *, int idx, struct nvkm_ltc **); | |
197 | int (*mc )(struct nvkm_device *, int idx, struct nvkm_mc **); | |
198 | int (*mmu )(struct nvkm_device *, int idx, struct nvkm_mmu **); | |
199 | int (*mxm )(struct nvkm_device *, int idx, struct nvkm_subdev **); | |
200 | int (*pci )(struct nvkm_device *, int idx, struct nvkm_pci **); | |
201 | int (*pmu )(struct nvkm_device *, int idx, struct nvkm_pmu **); | |
202 | int (*secboot )(struct nvkm_device *, int idx, struct nvkm_secboot **); | |
203 | int (*therm )(struct nvkm_device *, int idx, struct nvkm_therm **); | |
204 | int (*timer )(struct nvkm_device *, int idx, struct nvkm_timer **); | |
eaebfcc3 | 205 | int (*top )(struct nvkm_device *, int idx, struct nvkm_top **); |
dc06e366 MP |
206 | int (*volt )(struct nvkm_device *, int idx, struct nvkm_volt **); |
207 | ||
208 | int (*bsp )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
209 | int (*ce[3] )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
210 | int (*cipher )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
211 | int (*disp )(struct nvkm_device *, int idx, struct nvkm_disp **); | |
212 | int (*dma )(struct nvkm_device *, int idx, struct nvkm_dma **); | |
213 | int (*fifo )(struct nvkm_device *, int idx, struct nvkm_fifo **); | |
214 | int (*gr )(struct nvkm_device *, int idx, struct nvkm_gr **); | |
215 | int (*ifb )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
216 | int (*me )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
217 | int (*mpeg )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
218 | int (*msenc )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
219 | int (*mspdec )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
220 | int (*msppp )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
221 | int (*msvld )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
294af04b | 222 | int (*nvenc[2])(struct nvkm_device *, int idx, struct nvkm_engine **); |
3545b425 | 223 | int (*nvdec )(struct nvkm_device *, int idx, struct nvkm_engine **); |
dc06e366 MP |
224 | int (*pm )(struct nvkm_device *, int idx, struct nvkm_pm **); |
225 | int (*sec )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
226 | int (*sw )(struct nvkm_device *, int idx, struct nvkm_sw **); | |
227 | int (*vic )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
228 | int (*vp )(struct nvkm_device *, int idx, struct nvkm_engine **); | |
6cf813fb BS |
229 | }; |
230 | ||
5025407b BS |
231 | struct nvkm_device *nvkm_device_find(u64 name); |
232 | int nvkm_device_list(u64 *name, int size); | |
803c1787 | 233 | |
dd646942 | 234 | /* privileged register interface accessor macros */ |
2ebfa1bc BS |
235 | #define nvkm_rd08(d,a) ioread8((d)->pri + (a)) |
236 | #define nvkm_rd16(d,a) ioread16_native((d)->pri + (a)) | |
237 | #define nvkm_rd32(d,a) ioread32_native((d)->pri + (a)) | |
238 | #define nvkm_wr08(d,a,v) iowrite8((v), (d)->pri + (a)) | |
239 | #define nvkm_wr16(d,a,v) iowrite16_native((v), (d)->pri + (a)) | |
240 | #define nvkm_wr32(d,a,v) iowrite32_native((v), (d)->pri + (a)) | |
dd646942 BS |
241 | #define nvkm_mask(d,a,m,v) ({ \ |
242 | struct nvkm_device *_device = (d); \ | |
243 | u32 _addr = (a), _temp = nvkm_rd32(_device, _addr); \ | |
244 | nvkm_wr32(_device, _addr, (_temp & ~(m)) | (v)); \ | |
245 | _temp; \ | |
246 | }) | |
247 | ||
e781dc8f | 248 | void nvkm_device_del(struct nvkm_device **); |
6594363b | 249 | |
0e29998a BS |
250 | struct nvkm_device_oclass { |
251 | int (*ctor)(struct nvkm_device *, const struct nvkm_oclass *, | |
252 | void *data, u32 size, struct nvkm_object **); | |
253 | struct nvkm_sclass base; | |
254 | }; | |
255 | ||
2a9f847f BS |
256 | extern const struct nvkm_sclass nvkm_udevice_sclass; |
257 | ||
6594363b BS |
258 | /* device logging */ |
259 | #define nvdev_printk_(d,l,p,f,a...) do { \ | |
260 | struct nvkm_device *_device = (d); \ | |
68f3f702 | 261 | if (_device->debug >= (l)) \ |
6594363b BS |
262 | dev_##p(_device->dev, f, ##a); \ |
263 | } while(0) | |
264 | #define nvdev_printk(d,l,p,f,a...) nvdev_printk_((d), NV_DBG_##l, p, f, ##a) | |
265 | #define nvdev_fatal(d,f,a...) nvdev_printk((d), FATAL, crit, f, ##a) | |
266 | #define nvdev_error(d,f,a...) nvdev_printk((d), ERROR, err, f, ##a) | |
267 | #define nvdev_warn(d,f,a...) nvdev_printk((d), WARN, notice, f, ##a) | |
268 | #define nvdev_info(d,f,a...) nvdev_printk((d), INFO, info, f, ##a) | |
269 | #define nvdev_debug(d,f,a...) nvdev_printk((d), DEBUG, info, f, ##a) | |
270 | #define nvdev_trace(d,f,a...) nvdev_printk((d), TRACE, info, f, ##a) | |
271 | #define nvdev_spam(d,f,a...) nvdev_printk((d), SPAM, dbg, f, ##a) | |
9274f4a9 | 272 | #endif |