nouveau_nvkm_engine_device_base.c revision 1.12
1/*	$NetBSD: nouveau_nvkm_engine_device_base.c,v 1.12 2021/12/19 10:50:22 riastradh Exp $	*/
2
3/*
4 * Copyright 2012 Red Hat Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors: Ben Skeggs
25 */
26#include <sys/cdefs.h>
27__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_device_base.c,v 1.12 2021/12/19 10:50:22 riastradh Exp $");
28
29#include "priv.h"
30#include "acpi.h"
31
32#include <core/notify.h>
33#include <core/option.h>
34
35#include <subdev/bios.h>
36#include <subdev/therm.h>
37
38#ifdef __NetBSD__
39#include <linux/nbsd-namespace.h>
40static struct mutex nv_devices_mutex;
41static struct list_head nv_devices = LIST_HEAD_INIT(nv_devices);
42
43void
44nvkm_devices_init(void)
45{
46
47	linux_mutex_init(&nv_devices_mutex);
48}
49
50void
51nvkm_devices_fini(void)
52{
53
54	linux_mutex_destroy(&nv_devices_mutex);
55}
56#else
57static DEFINE_MUTEX(nv_devices_mutex);
58static LIST_HEAD(nv_devices);
59#endif
60
61static struct nvkm_device *
62nvkm_device_find_locked(u64 handle)
63{
64	struct nvkm_device *device;
65	list_for_each_entry(device, &nv_devices, head) {
66		if (device->handle == handle)
67			return device;
68	}
69	return NULL;
70}
71
72struct nvkm_device *
73nvkm_device_find(u64 handle)
74{
75	struct nvkm_device *device;
76	mutex_lock(&nv_devices_mutex);
77	device = nvkm_device_find_locked(handle);
78	mutex_unlock(&nv_devices_mutex);
79	return device;
80}
81
82int
83nvkm_device_list(u64 *name, int size)
84{
85	struct nvkm_device *device;
86	int nr = 0;
87	mutex_lock(&nv_devices_mutex);
88	list_for_each_entry(device, &nv_devices, head) {
89		if (nr++ < size)
90			name[nr - 1] = device->handle;
91	}
92	mutex_unlock(&nv_devices_mutex);
93	return nr;
94}
95
96static const struct nvkm_device_chip
97null_chipset = {
98	.name = "NULL",
99	.bios = nvkm_bios_new,
100};
101
102static const struct nvkm_device_chip
103nv4_chipset = {
104	.name = "NV04",
105	.bios = nvkm_bios_new,
106	.bus = nv04_bus_new,
107	.clk = nv04_clk_new,
108	.devinit = nv04_devinit_new,
109	.fb = nv04_fb_new,
110	.i2c = nv04_i2c_new,
111	.imem = nv04_instmem_new,
112	.mc = nv04_mc_new,
113	.mmu = nv04_mmu_new,
114	.pci = nv04_pci_new,
115	.timer = nv04_timer_new,
116	.disp = nv04_disp_new,
117	.dma = nv04_dma_new,
118	.fifo = nv04_fifo_new,
119	.gr = nv04_gr_new,
120	.sw = nv04_sw_new,
121};
122
123static const struct nvkm_device_chip
124nv5_chipset = {
125	.name = "NV05",
126	.bios = nvkm_bios_new,
127	.bus = nv04_bus_new,
128	.clk = nv04_clk_new,
129	.devinit = nv05_devinit_new,
130	.fb = nv04_fb_new,
131	.i2c = nv04_i2c_new,
132	.imem = nv04_instmem_new,
133	.mc = nv04_mc_new,
134	.mmu = nv04_mmu_new,
135	.pci = nv04_pci_new,
136	.timer = nv04_timer_new,
137	.disp = nv04_disp_new,
138	.dma = nv04_dma_new,
139	.fifo = nv04_fifo_new,
140	.gr = nv04_gr_new,
141	.sw = nv04_sw_new,
142};
143
144static const struct nvkm_device_chip
145nv10_chipset = {
146	.name = "NV10",
147	.bios = nvkm_bios_new,
148	.bus = nv04_bus_new,
149	.clk = nv04_clk_new,
150	.devinit = nv10_devinit_new,
151	.fb = nv10_fb_new,
152	.gpio = nv10_gpio_new,
153	.i2c = nv04_i2c_new,
154	.imem = nv04_instmem_new,
155	.mc = nv04_mc_new,
156	.mmu = nv04_mmu_new,
157	.pci = nv04_pci_new,
158	.timer = nv04_timer_new,
159	.disp = nv04_disp_new,
160	.dma = nv04_dma_new,
161	.gr = nv10_gr_new,
162};
163
164static const struct nvkm_device_chip
165nv11_chipset = {
166	.name = "NV11",
167	.bios = nvkm_bios_new,
168	.bus = nv04_bus_new,
169	.clk = nv04_clk_new,
170	.devinit = nv10_devinit_new,
171	.fb = nv10_fb_new,
172	.gpio = nv10_gpio_new,
173	.i2c = nv04_i2c_new,
174	.imem = nv04_instmem_new,
175	.mc = nv11_mc_new,
176	.mmu = nv04_mmu_new,
177	.pci = nv04_pci_new,
178	.timer = nv04_timer_new,
179	.disp = nv04_disp_new,
180	.dma = nv04_dma_new,
181	.fifo = nv10_fifo_new,
182	.gr = nv15_gr_new,
183	.sw = nv10_sw_new,
184};
185
186static const struct nvkm_device_chip
187nv15_chipset = {
188	.name = "NV15",
189	.bios = nvkm_bios_new,
190	.bus = nv04_bus_new,
191	.clk = nv04_clk_new,
192	.devinit = nv10_devinit_new,
193	.fb = nv10_fb_new,
194	.gpio = nv10_gpio_new,
195	.i2c = nv04_i2c_new,
196	.imem = nv04_instmem_new,
197	.mc = nv04_mc_new,
198	.mmu = nv04_mmu_new,
199	.pci = nv04_pci_new,
200	.timer = nv04_timer_new,
201	.disp = nv04_disp_new,
202	.dma = nv04_dma_new,
203	.fifo = nv10_fifo_new,
204	.gr = nv15_gr_new,
205	.sw = nv10_sw_new,
206};
207
208static const struct nvkm_device_chip
209nv17_chipset = {
210	.name = "NV17",
211	.bios = nvkm_bios_new,
212	.bus = nv04_bus_new,
213	.clk = nv04_clk_new,
214	.devinit = nv10_devinit_new,
215	.fb = nv10_fb_new,
216	.gpio = nv10_gpio_new,
217	.i2c = nv04_i2c_new,
218	.imem = nv04_instmem_new,
219	.mc = nv17_mc_new,
220	.mmu = nv04_mmu_new,
221	.pci = nv04_pci_new,
222	.timer = nv04_timer_new,
223	.disp = nv04_disp_new,
224	.dma = nv04_dma_new,
225	.fifo = nv17_fifo_new,
226	.gr = nv17_gr_new,
227	.sw = nv10_sw_new,
228};
229
230static const struct nvkm_device_chip
231nv18_chipset = {
232	.name = "NV18",
233	.bios = nvkm_bios_new,
234	.bus = nv04_bus_new,
235	.clk = nv04_clk_new,
236	.devinit = nv10_devinit_new,
237	.fb = nv10_fb_new,
238	.gpio = nv10_gpio_new,
239	.i2c = nv04_i2c_new,
240	.imem = nv04_instmem_new,
241	.mc = nv17_mc_new,
242	.mmu = nv04_mmu_new,
243	.pci = nv04_pci_new,
244	.timer = nv04_timer_new,
245	.disp = nv04_disp_new,
246	.dma = nv04_dma_new,
247	.fifo = nv17_fifo_new,
248	.gr = nv17_gr_new,
249	.sw = nv10_sw_new,
250};
251
252static const struct nvkm_device_chip
253nv1a_chipset = {
254	.name = "nForce",
255	.bios = nvkm_bios_new,
256	.bus = nv04_bus_new,
257	.clk = nv04_clk_new,
258	.devinit = nv1a_devinit_new,
259	.fb = nv1a_fb_new,
260	.gpio = nv10_gpio_new,
261	.i2c = nv04_i2c_new,
262	.imem = nv04_instmem_new,
263	.mc = nv04_mc_new,
264	.mmu = nv04_mmu_new,
265	.pci = nv04_pci_new,
266	.timer = nv04_timer_new,
267	.disp = nv04_disp_new,
268	.dma = nv04_dma_new,
269	.fifo = nv10_fifo_new,
270	.gr = nv15_gr_new,
271	.sw = nv10_sw_new,
272};
273
274static const struct nvkm_device_chip
275nv1f_chipset = {
276	.name = "nForce2",
277	.bios = nvkm_bios_new,
278	.bus = nv04_bus_new,
279	.clk = nv04_clk_new,
280	.devinit = nv1a_devinit_new,
281	.fb = nv1a_fb_new,
282	.gpio = nv10_gpio_new,
283	.i2c = nv04_i2c_new,
284	.imem = nv04_instmem_new,
285	.mc = nv17_mc_new,
286	.mmu = nv04_mmu_new,
287	.pci = nv04_pci_new,
288	.timer = nv04_timer_new,
289	.disp = nv04_disp_new,
290	.dma = nv04_dma_new,
291	.fifo = nv17_fifo_new,
292	.gr = nv17_gr_new,
293	.sw = nv10_sw_new,
294};
295
296static const struct nvkm_device_chip
297nv20_chipset = {
298	.name = "NV20",
299	.bios = nvkm_bios_new,
300	.bus = nv04_bus_new,
301	.clk = nv04_clk_new,
302	.devinit = nv20_devinit_new,
303	.fb = nv20_fb_new,
304	.gpio = nv10_gpio_new,
305	.i2c = nv04_i2c_new,
306	.imem = nv04_instmem_new,
307	.mc = nv17_mc_new,
308	.mmu = nv04_mmu_new,
309	.pci = nv04_pci_new,
310	.timer = nv04_timer_new,
311	.disp = nv04_disp_new,
312	.dma = nv04_dma_new,
313	.fifo = nv17_fifo_new,
314	.gr = nv20_gr_new,
315	.sw = nv10_sw_new,
316};
317
318static const struct nvkm_device_chip
319nv25_chipset = {
320	.name = "NV25",
321	.bios = nvkm_bios_new,
322	.bus = nv04_bus_new,
323	.clk = nv04_clk_new,
324	.devinit = nv20_devinit_new,
325	.fb = nv25_fb_new,
326	.gpio = nv10_gpio_new,
327	.i2c = nv04_i2c_new,
328	.imem = nv04_instmem_new,
329	.mc = nv17_mc_new,
330	.mmu = nv04_mmu_new,
331	.pci = nv04_pci_new,
332	.timer = nv04_timer_new,
333	.disp = nv04_disp_new,
334	.dma = nv04_dma_new,
335	.fifo = nv17_fifo_new,
336	.gr = nv25_gr_new,
337	.sw = nv10_sw_new,
338};
339
340static const struct nvkm_device_chip
341nv28_chipset = {
342	.name = "NV28",
343	.bios = nvkm_bios_new,
344	.bus = nv04_bus_new,
345	.clk = nv04_clk_new,
346	.devinit = nv20_devinit_new,
347	.fb = nv25_fb_new,
348	.gpio = nv10_gpio_new,
349	.i2c = nv04_i2c_new,
350	.imem = nv04_instmem_new,
351	.mc = nv17_mc_new,
352	.mmu = nv04_mmu_new,
353	.pci = nv04_pci_new,
354	.timer = nv04_timer_new,
355	.disp = nv04_disp_new,
356	.dma = nv04_dma_new,
357	.fifo = nv17_fifo_new,
358	.gr = nv25_gr_new,
359	.sw = nv10_sw_new,
360};
361
362static const struct nvkm_device_chip
363nv2a_chipset = {
364	.name = "NV2A",
365	.bios = nvkm_bios_new,
366	.bus = nv04_bus_new,
367	.clk = nv04_clk_new,
368	.devinit = nv20_devinit_new,
369	.fb = nv25_fb_new,
370	.gpio = nv10_gpio_new,
371	.i2c = nv04_i2c_new,
372	.imem = nv04_instmem_new,
373	.mc = nv17_mc_new,
374	.mmu = nv04_mmu_new,
375	.pci = nv04_pci_new,
376	.timer = nv04_timer_new,
377	.disp = nv04_disp_new,
378	.dma = nv04_dma_new,
379	.fifo = nv17_fifo_new,
380	.gr = nv2a_gr_new,
381	.sw = nv10_sw_new,
382};
383
384static const struct nvkm_device_chip
385nv30_chipset = {
386	.name = "NV30",
387	.bios = nvkm_bios_new,
388	.bus = nv04_bus_new,
389	.clk = nv04_clk_new,
390	.devinit = nv20_devinit_new,
391	.fb = nv30_fb_new,
392	.gpio = nv10_gpio_new,
393	.i2c = nv04_i2c_new,
394	.imem = nv04_instmem_new,
395	.mc = nv17_mc_new,
396	.mmu = nv04_mmu_new,
397	.pci = nv04_pci_new,
398	.timer = nv04_timer_new,
399	.disp = nv04_disp_new,
400	.dma = nv04_dma_new,
401	.fifo = nv17_fifo_new,
402	.gr = nv30_gr_new,
403	.sw = nv10_sw_new,
404};
405
406static const struct nvkm_device_chip
407nv31_chipset = {
408	.name = "NV31",
409	.bios = nvkm_bios_new,
410	.bus = nv31_bus_new,
411	.clk = nv04_clk_new,
412	.devinit = nv20_devinit_new,
413	.fb = nv30_fb_new,
414	.gpio = nv10_gpio_new,
415	.i2c = nv04_i2c_new,
416	.imem = nv04_instmem_new,
417	.mc = nv17_mc_new,
418	.mmu = nv04_mmu_new,
419	.pci = nv04_pci_new,
420	.timer = nv04_timer_new,
421	.disp = nv04_disp_new,
422	.dma = nv04_dma_new,
423	.fifo = nv17_fifo_new,
424	.gr = nv30_gr_new,
425	.mpeg = nv31_mpeg_new,
426	.sw = nv10_sw_new,
427};
428
429static const struct nvkm_device_chip
430nv34_chipset = {
431	.name = "NV34",
432	.bios = nvkm_bios_new,
433	.bus = nv31_bus_new,
434	.clk = nv04_clk_new,
435	.devinit = nv10_devinit_new,
436	.fb = nv10_fb_new,
437	.gpio = nv10_gpio_new,
438	.i2c = nv04_i2c_new,
439	.imem = nv04_instmem_new,
440	.mc = nv17_mc_new,
441	.mmu = nv04_mmu_new,
442	.pci = nv04_pci_new,
443	.timer = nv04_timer_new,
444	.disp = nv04_disp_new,
445	.dma = nv04_dma_new,
446	.fifo = nv17_fifo_new,
447	.gr = nv34_gr_new,
448	.mpeg = nv31_mpeg_new,
449	.sw = nv10_sw_new,
450};
451
452static const struct nvkm_device_chip
453nv35_chipset = {
454	.name = "NV35",
455	.bios = nvkm_bios_new,
456	.bus = nv04_bus_new,
457	.clk = nv04_clk_new,
458	.devinit = nv20_devinit_new,
459	.fb = nv35_fb_new,
460	.gpio = nv10_gpio_new,
461	.i2c = nv04_i2c_new,
462	.imem = nv04_instmem_new,
463	.mc = nv17_mc_new,
464	.mmu = nv04_mmu_new,
465	.pci = nv04_pci_new,
466	.timer = nv04_timer_new,
467	.disp = nv04_disp_new,
468	.dma = nv04_dma_new,
469	.fifo = nv17_fifo_new,
470	.gr = nv35_gr_new,
471	.sw = nv10_sw_new,
472};
473
474static const struct nvkm_device_chip
475nv36_chipset = {
476	.name = "NV36",
477	.bios = nvkm_bios_new,
478	.bus = nv31_bus_new,
479	.clk = nv04_clk_new,
480	.devinit = nv20_devinit_new,
481	.fb = nv36_fb_new,
482	.gpio = nv10_gpio_new,
483	.i2c = nv04_i2c_new,
484	.imem = nv04_instmem_new,
485	.mc = nv17_mc_new,
486	.mmu = nv04_mmu_new,
487	.pci = nv04_pci_new,
488	.timer = nv04_timer_new,
489	.disp = nv04_disp_new,
490	.dma = nv04_dma_new,
491	.fifo = nv17_fifo_new,
492	.gr = nv35_gr_new,
493	.mpeg = nv31_mpeg_new,
494	.sw = nv10_sw_new,
495};
496
497static const struct nvkm_device_chip
498nv40_chipset = {
499	.name = "NV40",
500	.bios = nvkm_bios_new,
501	.bus = nv31_bus_new,
502	.clk = nv40_clk_new,
503	.devinit = nv1a_devinit_new,
504	.fb = nv40_fb_new,
505	.gpio = nv10_gpio_new,
506	.i2c = nv04_i2c_new,
507	.imem = nv40_instmem_new,
508	.mc = nv17_mc_new,
509	.mmu = nv04_mmu_new,
510	.pci = nv40_pci_new,
511	.therm = nv40_therm_new,
512	.timer = nv40_timer_new,
513	.volt = nv40_volt_new,
514	.disp = nv04_disp_new,
515	.dma = nv04_dma_new,
516	.fifo = nv40_fifo_new,
517	.gr = nv40_gr_new,
518	.mpeg = nv40_mpeg_new,
519	.pm = nv40_pm_new,
520	.sw = nv10_sw_new,
521};
522
523static const struct nvkm_device_chip
524nv41_chipset = {
525	.name = "NV41",
526	.bios = nvkm_bios_new,
527	.bus = nv31_bus_new,
528	.clk = nv40_clk_new,
529	.devinit = nv1a_devinit_new,
530	.fb = nv41_fb_new,
531	.gpio = nv10_gpio_new,
532	.i2c = nv04_i2c_new,
533	.imem = nv40_instmem_new,
534	.mc = nv17_mc_new,
535	.mmu = nv41_mmu_new,
536	.pci = nv40_pci_new,
537	.therm = nv40_therm_new,
538	.timer = nv41_timer_new,
539	.volt = nv40_volt_new,
540	.disp = nv04_disp_new,
541	.dma = nv04_dma_new,
542	.fifo = nv40_fifo_new,
543	.gr = nv40_gr_new,
544	.mpeg = nv40_mpeg_new,
545	.pm = nv40_pm_new,
546	.sw = nv10_sw_new,
547};
548
549static const struct nvkm_device_chip
550nv42_chipset = {
551	.name = "NV42",
552	.bios = nvkm_bios_new,
553	.bus = nv31_bus_new,
554	.clk = nv40_clk_new,
555	.devinit = nv1a_devinit_new,
556	.fb = nv41_fb_new,
557	.gpio = nv10_gpio_new,
558	.i2c = nv04_i2c_new,
559	.imem = nv40_instmem_new,
560	.mc = nv17_mc_new,
561	.mmu = nv41_mmu_new,
562	.pci = nv40_pci_new,
563	.therm = nv40_therm_new,
564	.timer = nv41_timer_new,
565	.volt = nv40_volt_new,
566	.disp = nv04_disp_new,
567	.dma = nv04_dma_new,
568	.fifo = nv40_fifo_new,
569	.gr = nv40_gr_new,
570	.mpeg = nv40_mpeg_new,
571	.pm = nv40_pm_new,
572	.sw = nv10_sw_new,
573};
574
575static const struct nvkm_device_chip
576nv43_chipset = {
577	.name = "NV43",
578	.bios = nvkm_bios_new,
579	.bus = nv31_bus_new,
580	.clk = nv40_clk_new,
581	.devinit = nv1a_devinit_new,
582	.fb = nv41_fb_new,
583	.gpio = nv10_gpio_new,
584	.i2c = nv04_i2c_new,
585	.imem = nv40_instmem_new,
586	.mc = nv17_mc_new,
587	.mmu = nv41_mmu_new,
588	.pci = nv40_pci_new,
589	.therm = nv40_therm_new,
590	.timer = nv41_timer_new,
591	.volt = nv40_volt_new,
592	.disp = nv04_disp_new,
593	.dma = nv04_dma_new,
594	.fifo = nv40_fifo_new,
595	.gr = nv40_gr_new,
596	.mpeg = nv40_mpeg_new,
597	.pm = nv40_pm_new,
598	.sw = nv10_sw_new,
599};
600
601static const struct nvkm_device_chip
602nv44_chipset = {
603	.name = "NV44",
604	.bios = nvkm_bios_new,
605	.bus = nv31_bus_new,
606	.clk = nv40_clk_new,
607	.devinit = nv1a_devinit_new,
608	.fb = nv44_fb_new,
609	.gpio = nv10_gpio_new,
610	.i2c = nv04_i2c_new,
611	.imem = nv40_instmem_new,
612	.mc = nv44_mc_new,
613	.mmu = nv44_mmu_new,
614	.pci = nv40_pci_new,
615	.therm = nv40_therm_new,
616	.timer = nv41_timer_new,
617	.volt = nv40_volt_new,
618	.disp = nv04_disp_new,
619	.dma = nv04_dma_new,
620	.fifo = nv40_fifo_new,
621	.gr = nv44_gr_new,
622	.mpeg = nv44_mpeg_new,
623	.pm = nv40_pm_new,
624	.sw = nv10_sw_new,
625};
626
627static const struct nvkm_device_chip
628nv45_chipset = {
629	.name = "NV45",
630	.bios = nvkm_bios_new,
631	.bus = nv31_bus_new,
632	.clk = nv40_clk_new,
633	.devinit = nv1a_devinit_new,
634	.fb = nv40_fb_new,
635	.gpio = nv10_gpio_new,
636	.i2c = nv04_i2c_new,
637	.imem = nv40_instmem_new,
638	.mc = nv17_mc_new,
639	.mmu = nv04_mmu_new,
640	.pci = nv40_pci_new,
641	.therm = nv40_therm_new,
642	.timer = nv41_timer_new,
643	.volt = nv40_volt_new,
644	.disp = nv04_disp_new,
645	.dma = nv04_dma_new,
646	.fifo = nv40_fifo_new,
647	.gr = nv40_gr_new,
648	.mpeg = nv44_mpeg_new,
649	.pm = nv40_pm_new,
650	.sw = nv10_sw_new,
651};
652
653static const struct nvkm_device_chip
654nv46_chipset = {
655	.name = "G72",
656	.bios = nvkm_bios_new,
657	.bus = nv31_bus_new,
658	.clk = nv40_clk_new,
659	.devinit = nv1a_devinit_new,
660	.fb = nv46_fb_new,
661	.gpio = nv10_gpio_new,
662	.i2c = nv04_i2c_new,
663	.imem = nv40_instmem_new,
664	.mc = nv44_mc_new,
665	.mmu = nv44_mmu_new,
666	.pci = nv46_pci_new,
667	.therm = nv40_therm_new,
668	.timer = nv41_timer_new,
669	.volt = nv40_volt_new,
670	.disp = nv04_disp_new,
671	.dma = nv04_dma_new,
672	.fifo = nv40_fifo_new,
673	.gr = nv44_gr_new,
674	.mpeg = nv44_mpeg_new,
675	.pm = nv40_pm_new,
676	.sw = nv10_sw_new,
677};
678
679static const struct nvkm_device_chip
680nv47_chipset = {
681	.name = "G70",
682	.bios = nvkm_bios_new,
683	.bus = nv31_bus_new,
684	.clk = nv40_clk_new,
685	.devinit = nv1a_devinit_new,
686	.fb = nv47_fb_new,
687	.gpio = nv10_gpio_new,
688	.i2c = nv04_i2c_new,
689	.imem = nv40_instmem_new,
690	.mc = nv17_mc_new,
691	.mmu = nv41_mmu_new,
692	.pci = nv40_pci_new,
693	.therm = nv40_therm_new,
694	.timer = nv41_timer_new,
695	.volt = nv40_volt_new,
696	.disp = nv04_disp_new,
697	.dma = nv04_dma_new,
698	.fifo = nv40_fifo_new,
699	.gr = nv40_gr_new,
700	.mpeg = nv44_mpeg_new,
701	.pm = nv40_pm_new,
702	.sw = nv10_sw_new,
703};
704
705static const struct nvkm_device_chip
706nv49_chipset = {
707	.name = "G71",
708	.bios = nvkm_bios_new,
709	.bus = nv31_bus_new,
710	.clk = nv40_clk_new,
711	.devinit = nv1a_devinit_new,
712	.fb = nv49_fb_new,
713	.gpio = nv10_gpio_new,
714	.i2c = nv04_i2c_new,
715	.imem = nv40_instmem_new,
716	.mc = nv17_mc_new,
717	.mmu = nv41_mmu_new,
718	.pci = nv40_pci_new,
719	.therm = nv40_therm_new,
720	.timer = nv41_timer_new,
721	.volt = nv40_volt_new,
722	.disp = nv04_disp_new,
723	.dma = nv04_dma_new,
724	.fifo = nv40_fifo_new,
725	.gr = nv40_gr_new,
726	.mpeg = nv44_mpeg_new,
727	.pm = nv40_pm_new,
728	.sw = nv10_sw_new,
729};
730
731static const struct nvkm_device_chip
732nv4a_chipset = {
733	.name = "NV44A",
734	.bios = nvkm_bios_new,
735	.bus = nv31_bus_new,
736	.clk = nv40_clk_new,
737	.devinit = nv1a_devinit_new,
738	.fb = nv44_fb_new,
739	.gpio = nv10_gpio_new,
740	.i2c = nv04_i2c_new,
741	.imem = nv40_instmem_new,
742	.mc = nv44_mc_new,
743	.mmu = nv04_mmu_new,
744	.pci = nv40_pci_new,
745	.therm = nv40_therm_new,
746	.timer = nv41_timer_new,
747	.volt = nv40_volt_new,
748	.disp = nv04_disp_new,
749	.dma = nv04_dma_new,
750	.fifo = nv40_fifo_new,
751	.gr = nv44_gr_new,
752	.mpeg = nv44_mpeg_new,
753	.pm = nv40_pm_new,
754	.sw = nv10_sw_new,
755};
756
757static const struct nvkm_device_chip
758nv4b_chipset = {
759	.name = "G73",
760	.bios = nvkm_bios_new,
761	.bus = nv31_bus_new,
762	.clk = nv40_clk_new,
763	.devinit = nv1a_devinit_new,
764	.fb = nv49_fb_new,
765	.gpio = nv10_gpio_new,
766	.i2c = nv04_i2c_new,
767	.imem = nv40_instmem_new,
768	.mc = nv17_mc_new,
769	.mmu = nv41_mmu_new,
770	.pci = nv40_pci_new,
771	.therm = nv40_therm_new,
772	.timer = nv41_timer_new,
773	.volt = nv40_volt_new,
774	.disp = nv04_disp_new,
775	.dma = nv04_dma_new,
776	.fifo = nv40_fifo_new,
777	.gr = nv40_gr_new,
778	.mpeg = nv44_mpeg_new,
779	.pm = nv40_pm_new,
780	.sw = nv10_sw_new,
781};
782
783static const struct nvkm_device_chip
784nv4c_chipset = {
785	.name = "C61",
786	.bios = nvkm_bios_new,
787	.bus = nv31_bus_new,
788	.clk = nv40_clk_new,
789	.devinit = nv1a_devinit_new,
790	.fb = nv46_fb_new,
791	.gpio = nv10_gpio_new,
792	.i2c = nv04_i2c_new,
793	.imem = nv40_instmem_new,
794	.mc = nv44_mc_new,
795	.mmu = nv44_mmu_new,
796	.pci = nv4c_pci_new,
797	.therm = nv40_therm_new,
798	.timer = nv41_timer_new,
799	.volt = nv40_volt_new,
800	.disp = nv04_disp_new,
801	.dma = nv04_dma_new,
802	.fifo = nv40_fifo_new,
803	.gr = nv44_gr_new,
804	.mpeg = nv44_mpeg_new,
805	.pm = nv40_pm_new,
806	.sw = nv10_sw_new,
807};
808
809static const struct nvkm_device_chip
810nv4e_chipset = {
811	.name = "C51",
812	.bios = nvkm_bios_new,
813	.bus = nv31_bus_new,
814	.clk = nv40_clk_new,
815	.devinit = nv1a_devinit_new,
816	.fb = nv4e_fb_new,
817	.gpio = nv10_gpio_new,
818	.i2c = nv4e_i2c_new,
819	.imem = nv40_instmem_new,
820	.mc = nv44_mc_new,
821	.mmu = nv44_mmu_new,
822	.pci = nv4c_pci_new,
823	.therm = nv40_therm_new,
824	.timer = nv41_timer_new,
825	.volt = nv40_volt_new,
826	.disp = nv04_disp_new,
827	.dma = nv04_dma_new,
828	.fifo = nv40_fifo_new,
829	.gr = nv44_gr_new,
830	.mpeg = nv44_mpeg_new,
831	.pm = nv40_pm_new,
832	.sw = nv10_sw_new,
833};
834
835static const struct nvkm_device_chip
836nv50_chipset = {
837	.name = "G80",
838	.bar = nv50_bar_new,
839	.bios = nvkm_bios_new,
840	.bus = nv50_bus_new,
841	.clk = nv50_clk_new,
842	.devinit = nv50_devinit_new,
843	.fb = nv50_fb_new,
844	.fuse = nv50_fuse_new,
845	.gpio = nv50_gpio_new,
846	.i2c = nv50_i2c_new,
847	.imem = nv50_instmem_new,
848	.mc = nv50_mc_new,
849	.mmu = nv50_mmu_new,
850	.mxm = nv50_mxm_new,
851	.pci = nv46_pci_new,
852	.therm = nv50_therm_new,
853	.timer = nv41_timer_new,
854	.volt = nv40_volt_new,
855	.disp = nv50_disp_new,
856	.dma = nv50_dma_new,
857	.fifo = nv50_fifo_new,
858	.gr = nv50_gr_new,
859	.mpeg = nv50_mpeg_new,
860	.pm = nv50_pm_new,
861	.sw = nv50_sw_new,
862};
863
864static const struct nvkm_device_chip
865nv63_chipset = {
866	.name = "C73",
867	.bios = nvkm_bios_new,
868	.bus = nv31_bus_new,
869	.clk = nv40_clk_new,
870	.devinit = nv1a_devinit_new,
871	.fb = nv46_fb_new,
872	.gpio = nv10_gpio_new,
873	.i2c = nv04_i2c_new,
874	.imem = nv40_instmem_new,
875	.mc = nv44_mc_new,
876	.mmu = nv44_mmu_new,
877	.pci = nv4c_pci_new,
878	.therm = nv40_therm_new,
879	.timer = nv41_timer_new,
880	.volt = nv40_volt_new,
881	.disp = nv04_disp_new,
882	.dma = nv04_dma_new,
883	.fifo = nv40_fifo_new,
884	.gr = nv44_gr_new,
885	.mpeg = nv44_mpeg_new,
886	.pm = nv40_pm_new,
887	.sw = nv10_sw_new,
888};
889
890static const struct nvkm_device_chip
891nv67_chipset = {
892	.name = "C67",
893	.bios = nvkm_bios_new,
894	.bus = nv31_bus_new,
895	.clk = nv40_clk_new,
896	.devinit = nv1a_devinit_new,
897	.fb = nv46_fb_new,
898	.gpio = nv10_gpio_new,
899	.i2c = nv04_i2c_new,
900	.imem = nv40_instmem_new,
901	.mc = nv44_mc_new,
902	.mmu = nv44_mmu_new,
903	.pci = nv4c_pci_new,
904	.therm = nv40_therm_new,
905	.timer = nv41_timer_new,
906	.volt = nv40_volt_new,
907	.disp = nv04_disp_new,
908	.dma = nv04_dma_new,
909	.fifo = nv40_fifo_new,
910	.gr = nv44_gr_new,
911	.mpeg = nv44_mpeg_new,
912	.pm = nv40_pm_new,
913	.sw = nv10_sw_new,
914};
915
916static const struct nvkm_device_chip
917nv68_chipset = {
918	.name = "C68",
919	.bios = nvkm_bios_new,
920	.bus = nv31_bus_new,
921	.clk = nv40_clk_new,
922	.devinit = nv1a_devinit_new,
923	.fb = nv46_fb_new,
924	.gpio = nv10_gpio_new,
925	.i2c = nv04_i2c_new,
926	.imem = nv40_instmem_new,
927	.mc = nv44_mc_new,
928	.mmu = nv44_mmu_new,
929	.pci = nv4c_pci_new,
930	.therm = nv40_therm_new,
931	.timer = nv41_timer_new,
932	.volt = nv40_volt_new,
933	.disp = nv04_disp_new,
934	.dma = nv04_dma_new,
935	.fifo = nv40_fifo_new,
936	.gr = nv44_gr_new,
937	.mpeg = nv44_mpeg_new,
938	.pm = nv40_pm_new,
939	.sw = nv10_sw_new,
940};
941
942static const struct nvkm_device_chip
943nv84_chipset = {
944	.name = "G84",
945	.bar = g84_bar_new,
946	.bios = nvkm_bios_new,
947	.bus = nv50_bus_new,
948	.clk = g84_clk_new,
949	.devinit = g84_devinit_new,
950	.fb = g84_fb_new,
951	.fuse = nv50_fuse_new,
952	.gpio = nv50_gpio_new,
953	.i2c = nv50_i2c_new,
954	.imem = nv50_instmem_new,
955	.mc = g84_mc_new,
956	.mmu = g84_mmu_new,
957	.mxm = nv50_mxm_new,
958	.pci = g84_pci_new,
959	.therm = g84_therm_new,
960	.timer = nv41_timer_new,
961	.volt = nv40_volt_new,
962	.bsp = g84_bsp_new,
963	.cipher = g84_cipher_new,
964	.disp = g84_disp_new,
965	.dma = nv50_dma_new,
966	.fifo = g84_fifo_new,
967	.gr = g84_gr_new,
968	.mpeg = g84_mpeg_new,
969	.pm = g84_pm_new,
970	.sw = nv50_sw_new,
971	.vp = g84_vp_new,
972};
973
974static const struct nvkm_device_chip
975nv86_chipset = {
976	.name = "G86",
977	.bar = g84_bar_new,
978	.bios = nvkm_bios_new,
979	.bus = nv50_bus_new,
980	.clk = g84_clk_new,
981	.devinit = g84_devinit_new,
982	.fb = g84_fb_new,
983	.fuse = nv50_fuse_new,
984	.gpio = nv50_gpio_new,
985	.i2c = nv50_i2c_new,
986	.imem = nv50_instmem_new,
987	.mc = g84_mc_new,
988	.mmu = g84_mmu_new,
989	.mxm = nv50_mxm_new,
990	.pci = g84_pci_new,
991	.therm = g84_therm_new,
992	.timer = nv41_timer_new,
993	.volt = nv40_volt_new,
994	.bsp = g84_bsp_new,
995	.cipher = g84_cipher_new,
996	.disp = g84_disp_new,
997	.dma = nv50_dma_new,
998	.fifo = g84_fifo_new,
999	.gr = g84_gr_new,
1000	.mpeg = g84_mpeg_new,
1001	.pm = g84_pm_new,
1002	.sw = nv50_sw_new,
1003	.vp = g84_vp_new,
1004};
1005
1006static const struct nvkm_device_chip
1007nv92_chipset = {
1008	.name = "G92",
1009	.bar = g84_bar_new,
1010	.bios = nvkm_bios_new,
1011	.bus = nv50_bus_new,
1012	.clk = g84_clk_new,
1013	.devinit = g84_devinit_new,
1014	.fb = g84_fb_new,
1015	.fuse = nv50_fuse_new,
1016	.gpio = nv50_gpio_new,
1017	.i2c = nv50_i2c_new,
1018	.imem = nv50_instmem_new,
1019	.mc = g84_mc_new,
1020	.mmu = g84_mmu_new,
1021	.mxm = nv50_mxm_new,
1022	.pci = g92_pci_new,
1023	.therm = g84_therm_new,
1024	.timer = nv41_timer_new,
1025	.volt = nv40_volt_new,
1026	.bsp = g84_bsp_new,
1027	.cipher = g84_cipher_new,
1028	.disp = g84_disp_new,
1029	.dma = nv50_dma_new,
1030	.fifo = g84_fifo_new,
1031	.gr = g84_gr_new,
1032	.mpeg = g84_mpeg_new,
1033	.pm = g84_pm_new,
1034	.sw = nv50_sw_new,
1035	.vp = g84_vp_new,
1036};
1037
1038static const struct nvkm_device_chip
1039nv94_chipset = {
1040	.name = "G94",
1041	.bar = g84_bar_new,
1042	.bios = nvkm_bios_new,
1043	.bus = g94_bus_new,
1044	.clk = g84_clk_new,
1045	.devinit = g84_devinit_new,
1046	.fb = g84_fb_new,
1047	.fuse = nv50_fuse_new,
1048	.gpio = g94_gpio_new,
1049	.i2c = g94_i2c_new,
1050	.imem = nv50_instmem_new,
1051	.mc = g84_mc_new,
1052	.mmu = g84_mmu_new,
1053	.mxm = nv50_mxm_new,
1054	.pci = g94_pci_new,
1055	.therm = g84_therm_new,
1056	.timer = nv41_timer_new,
1057	.volt = nv40_volt_new,
1058	.bsp = g84_bsp_new,
1059	.cipher = g84_cipher_new,
1060	.disp = g94_disp_new,
1061	.dma = nv50_dma_new,
1062	.fifo = g84_fifo_new,
1063	.gr = g84_gr_new,
1064	.mpeg = g84_mpeg_new,
1065	.pm = g84_pm_new,
1066	.sw = nv50_sw_new,
1067	.vp = g84_vp_new,
1068};
1069
1070static const struct nvkm_device_chip
1071nv96_chipset = {
1072	.name = "G96",
1073	.bar = g84_bar_new,
1074	.bios = nvkm_bios_new,
1075	.bus = g94_bus_new,
1076	.clk = g84_clk_new,
1077	.devinit = g84_devinit_new,
1078	.fb = g84_fb_new,
1079	.fuse = nv50_fuse_new,
1080	.gpio = g94_gpio_new,
1081	.i2c = g94_i2c_new,
1082	.imem = nv50_instmem_new,
1083	.mc = g84_mc_new,
1084	.mmu = g84_mmu_new,
1085	.mxm = nv50_mxm_new,
1086	.pci = g94_pci_new,
1087	.therm = g84_therm_new,
1088	.timer = nv41_timer_new,
1089	.volt = nv40_volt_new,
1090	.bsp = g84_bsp_new,
1091	.cipher = g84_cipher_new,
1092	.disp = g94_disp_new,
1093	.dma = nv50_dma_new,
1094	.fifo = g84_fifo_new,
1095	.gr = g84_gr_new,
1096	.mpeg = g84_mpeg_new,
1097	.pm = g84_pm_new,
1098	.sw = nv50_sw_new,
1099	.vp = g84_vp_new,
1100};
1101
1102static const struct nvkm_device_chip
1103nv98_chipset = {
1104	.name = "G98",
1105	.bar = g84_bar_new,
1106	.bios = nvkm_bios_new,
1107	.bus = g94_bus_new,
1108	.clk = g84_clk_new,
1109	.devinit = g98_devinit_new,
1110	.fb = g84_fb_new,
1111	.fuse = nv50_fuse_new,
1112	.gpio = g94_gpio_new,
1113	.i2c = g94_i2c_new,
1114	.imem = nv50_instmem_new,
1115	.mc = g98_mc_new,
1116	.mmu = g84_mmu_new,
1117	.mxm = nv50_mxm_new,
1118	.pci = g94_pci_new,
1119	.therm = g84_therm_new,
1120	.timer = nv41_timer_new,
1121	.volt = nv40_volt_new,
1122	.disp = g94_disp_new,
1123	.dma = nv50_dma_new,
1124	.fifo = g84_fifo_new,
1125	.gr = g84_gr_new,
1126	.mspdec = g98_mspdec_new,
1127	.msppp = g98_msppp_new,
1128	.msvld = g98_msvld_new,
1129	.pm = g84_pm_new,
1130	.sec = g98_sec_new,
1131	.sw = nv50_sw_new,
1132};
1133
1134static const struct nvkm_device_chip
1135nva0_chipset = {
1136	.name = "GT200",
1137	.bar = g84_bar_new,
1138	.bios = nvkm_bios_new,
1139	.bus = g94_bus_new,
1140	.clk = g84_clk_new,
1141	.devinit = g84_devinit_new,
1142	.fb = g84_fb_new,
1143	.fuse = nv50_fuse_new,
1144	.gpio = g94_gpio_new,
1145	.i2c = nv50_i2c_new,
1146	.imem = nv50_instmem_new,
1147	.mc = g84_mc_new,
1148	.mmu = g84_mmu_new,
1149	.mxm = nv50_mxm_new,
1150	.pci = g94_pci_new,
1151	.therm = g84_therm_new,
1152	.timer = nv41_timer_new,
1153	.volt = nv40_volt_new,
1154	.bsp = g84_bsp_new,
1155	.cipher = g84_cipher_new,
1156	.disp = gt200_disp_new,
1157	.dma = nv50_dma_new,
1158	.fifo = g84_fifo_new,
1159	.gr = gt200_gr_new,
1160	.mpeg = g84_mpeg_new,
1161	.pm = gt200_pm_new,
1162	.sw = nv50_sw_new,
1163	.vp = g84_vp_new,
1164};
1165
1166static const struct nvkm_device_chip
1167nva3_chipset = {
1168	.name = "GT215",
1169	.bar = g84_bar_new,
1170	.bios = nvkm_bios_new,
1171	.bus = g94_bus_new,
1172	.clk = gt215_clk_new,
1173	.devinit = gt215_devinit_new,
1174	.fb = gt215_fb_new,
1175	.fuse = nv50_fuse_new,
1176	.gpio = g94_gpio_new,
1177	.i2c = g94_i2c_new,
1178	.imem = nv50_instmem_new,
1179	.mc = gt215_mc_new,
1180	.mmu = g84_mmu_new,
1181	.mxm = nv50_mxm_new,
1182	.pci = g94_pci_new,
1183	.pmu = gt215_pmu_new,
1184	.therm = gt215_therm_new,
1185	.timer = nv41_timer_new,
1186	.volt = nv40_volt_new,
1187	.ce[0] = gt215_ce_new,
1188	.disp = gt215_disp_new,
1189	.dma = nv50_dma_new,
1190	.fifo = g84_fifo_new,
1191	.gr = gt215_gr_new,
1192	.mpeg = g84_mpeg_new,
1193	.mspdec = gt215_mspdec_new,
1194	.msppp = gt215_msppp_new,
1195	.msvld = gt215_msvld_new,
1196	.pm = gt215_pm_new,
1197	.sw = nv50_sw_new,
1198};
1199
1200static const struct nvkm_device_chip
1201nva5_chipset = {
1202	.name = "GT216",
1203	.bar = g84_bar_new,
1204	.bios = nvkm_bios_new,
1205	.bus = g94_bus_new,
1206	.clk = gt215_clk_new,
1207	.devinit = gt215_devinit_new,
1208	.fb = gt215_fb_new,
1209	.fuse = nv50_fuse_new,
1210	.gpio = g94_gpio_new,
1211	.i2c = g94_i2c_new,
1212	.imem = nv50_instmem_new,
1213	.mc = gt215_mc_new,
1214	.mmu = g84_mmu_new,
1215	.mxm = nv50_mxm_new,
1216	.pci = g94_pci_new,
1217	.pmu = gt215_pmu_new,
1218	.therm = gt215_therm_new,
1219	.timer = nv41_timer_new,
1220	.volt = nv40_volt_new,
1221	.ce[0] = gt215_ce_new,
1222	.disp = gt215_disp_new,
1223	.dma = nv50_dma_new,
1224	.fifo = g84_fifo_new,
1225	.gr = gt215_gr_new,
1226	.mspdec = gt215_mspdec_new,
1227	.msppp = gt215_msppp_new,
1228	.msvld = gt215_msvld_new,
1229	.pm = gt215_pm_new,
1230	.sw = nv50_sw_new,
1231};
1232
1233static const struct nvkm_device_chip
1234nva8_chipset = {
1235	.name = "GT218",
1236	.bar = g84_bar_new,
1237	.bios = nvkm_bios_new,
1238	.bus = g94_bus_new,
1239	.clk = gt215_clk_new,
1240	.devinit = gt215_devinit_new,
1241	.fb = gt215_fb_new,
1242	.fuse = nv50_fuse_new,
1243	.gpio = g94_gpio_new,
1244	.i2c = g94_i2c_new,
1245	.imem = nv50_instmem_new,
1246	.mc = gt215_mc_new,
1247	.mmu = g84_mmu_new,
1248	.mxm = nv50_mxm_new,
1249	.pci = g94_pci_new,
1250	.pmu = gt215_pmu_new,
1251	.therm = gt215_therm_new,
1252	.timer = nv41_timer_new,
1253	.volt = nv40_volt_new,
1254	.ce[0] = gt215_ce_new,
1255	.disp = gt215_disp_new,
1256	.dma = nv50_dma_new,
1257	.fifo = g84_fifo_new,
1258	.gr = gt215_gr_new,
1259	.mspdec = gt215_mspdec_new,
1260	.msppp = gt215_msppp_new,
1261	.msvld = gt215_msvld_new,
1262	.pm = gt215_pm_new,
1263	.sw = nv50_sw_new,
1264};
1265
1266static const struct nvkm_device_chip
1267nvaa_chipset = {
1268	.name = "MCP77/MCP78",
1269	.bar = g84_bar_new,
1270	.bios = nvkm_bios_new,
1271	.bus = g94_bus_new,
1272	.clk = mcp77_clk_new,
1273	.devinit = g98_devinit_new,
1274	.fb = mcp77_fb_new,
1275	.fuse = nv50_fuse_new,
1276	.gpio = g94_gpio_new,
1277	.i2c = g94_i2c_new,
1278	.imem = nv50_instmem_new,
1279	.mc = g98_mc_new,
1280	.mmu = mcp77_mmu_new,
1281	.mxm = nv50_mxm_new,
1282	.pci = g94_pci_new,
1283	.therm = g84_therm_new,
1284	.timer = nv41_timer_new,
1285	.volt = nv40_volt_new,
1286	.disp = mcp77_disp_new,
1287	.dma = nv50_dma_new,
1288	.fifo = g84_fifo_new,
1289	.gr = gt200_gr_new,
1290	.mspdec = g98_mspdec_new,
1291	.msppp = g98_msppp_new,
1292	.msvld = g98_msvld_new,
1293	.pm = g84_pm_new,
1294	.sec = g98_sec_new,
1295	.sw = nv50_sw_new,
1296};
1297
1298static const struct nvkm_device_chip
1299nvac_chipset = {
1300	.name = "MCP79/MCP7A",
1301	.bar = g84_bar_new,
1302	.bios = nvkm_bios_new,
1303	.bus = g94_bus_new,
1304	.clk = mcp77_clk_new,
1305	.devinit = g98_devinit_new,
1306	.fb = mcp77_fb_new,
1307	.fuse = nv50_fuse_new,
1308	.gpio = g94_gpio_new,
1309	.i2c = g94_i2c_new,
1310	.imem = nv50_instmem_new,
1311	.mc = g98_mc_new,
1312	.mmu = mcp77_mmu_new,
1313	.mxm = nv50_mxm_new,
1314	.pci = g94_pci_new,
1315	.therm = g84_therm_new,
1316	.timer = nv41_timer_new,
1317	.volt = nv40_volt_new,
1318	.disp = mcp77_disp_new,
1319	.dma = nv50_dma_new,
1320	.fifo = g84_fifo_new,
1321	.gr = mcp79_gr_new,
1322	.mspdec = g98_mspdec_new,
1323	.msppp = g98_msppp_new,
1324	.msvld = g98_msvld_new,
1325	.pm = g84_pm_new,
1326	.sec = g98_sec_new,
1327	.sw = nv50_sw_new,
1328};
1329
1330static const struct nvkm_device_chip
1331nvaf_chipset = {
1332	.name = "MCP89",
1333	.bar = g84_bar_new,
1334	.bios = nvkm_bios_new,
1335	.bus = g94_bus_new,
1336	.clk = gt215_clk_new,
1337	.devinit = mcp89_devinit_new,
1338	.fb = mcp89_fb_new,
1339	.fuse = nv50_fuse_new,
1340	.gpio = g94_gpio_new,
1341	.i2c = g94_i2c_new,
1342	.imem = nv50_instmem_new,
1343	.mc = gt215_mc_new,
1344	.mmu = mcp77_mmu_new,
1345	.mxm = nv50_mxm_new,
1346	.pci = g94_pci_new,
1347	.pmu = gt215_pmu_new,
1348	.therm = gt215_therm_new,
1349	.timer = nv41_timer_new,
1350	.volt = nv40_volt_new,
1351	.ce[0] = gt215_ce_new,
1352	.disp = mcp89_disp_new,
1353	.dma = nv50_dma_new,
1354	.fifo = g84_fifo_new,
1355	.gr = mcp89_gr_new,
1356	.mspdec = gt215_mspdec_new,
1357	.msppp = gt215_msppp_new,
1358	.msvld = mcp89_msvld_new,
1359	.pm = gt215_pm_new,
1360	.sw = nv50_sw_new,
1361};
1362
1363static const struct nvkm_device_chip
1364nvc0_chipset = {
1365	.name = "GF100",
1366	.bar = gf100_bar_new,
1367	.bios = nvkm_bios_new,
1368	.bus = gf100_bus_new,
1369	.clk = gf100_clk_new,
1370	.devinit = gf100_devinit_new,
1371	.fb = gf100_fb_new,
1372	.fuse = gf100_fuse_new,
1373	.gpio = g94_gpio_new,
1374	.i2c = g94_i2c_new,
1375	.ibus = gf100_ibus_new,
1376	.iccsense = gf100_iccsense_new,
1377	.imem = nv50_instmem_new,
1378	.ltc = gf100_ltc_new,
1379	.mc = gf100_mc_new,
1380	.mmu = gf100_mmu_new,
1381	.mxm = nv50_mxm_new,
1382	.pci = gf100_pci_new,
1383	.pmu = gf100_pmu_new,
1384	.therm = gt215_therm_new,
1385	.timer = nv41_timer_new,
1386	.volt = gf100_volt_new,
1387	.ce[0] = gf100_ce_new,
1388	.ce[1] = gf100_ce_new,
1389	.disp = gt215_disp_new,
1390	.dma = gf100_dma_new,
1391	.fifo = gf100_fifo_new,
1392	.gr = gf100_gr_new,
1393	.mspdec = gf100_mspdec_new,
1394	.msppp = gf100_msppp_new,
1395	.msvld = gf100_msvld_new,
1396	.pm = gf100_pm_new,
1397	.sw = gf100_sw_new,
1398};
1399
1400static const struct nvkm_device_chip
1401nvc1_chipset = {
1402	.name = "GF108",
1403	.bar = gf100_bar_new,
1404	.bios = nvkm_bios_new,
1405	.bus = gf100_bus_new,
1406	.clk = gf100_clk_new,
1407	.devinit = gf100_devinit_new,
1408	.fb = gf108_fb_new,
1409	.fuse = gf100_fuse_new,
1410	.gpio = g94_gpio_new,
1411	.i2c = g94_i2c_new,
1412	.ibus = gf100_ibus_new,
1413	.iccsense = gf100_iccsense_new,
1414	.imem = nv50_instmem_new,
1415	.ltc = gf100_ltc_new,
1416	.mc = gf100_mc_new,
1417	.mmu = gf100_mmu_new,
1418	.mxm = nv50_mxm_new,
1419	.pci = gf106_pci_new,
1420	.pmu = gf100_pmu_new,
1421	.therm = gt215_therm_new,
1422	.timer = nv41_timer_new,
1423	.volt = gf100_volt_new,
1424	.ce[0] = gf100_ce_new,
1425	.disp = gt215_disp_new,
1426	.dma = gf100_dma_new,
1427	.fifo = gf100_fifo_new,
1428	.gr = gf108_gr_new,
1429	.mspdec = gf100_mspdec_new,
1430	.msppp = gf100_msppp_new,
1431	.msvld = gf100_msvld_new,
1432	.pm = gf108_pm_new,
1433	.sw = gf100_sw_new,
1434};
1435
1436static const struct nvkm_device_chip
1437nvc3_chipset = {
1438	.name = "GF106",
1439	.bar = gf100_bar_new,
1440	.bios = nvkm_bios_new,
1441	.bus = gf100_bus_new,
1442	.clk = gf100_clk_new,
1443	.devinit = gf100_devinit_new,
1444	.fb = gf100_fb_new,
1445	.fuse = gf100_fuse_new,
1446	.gpio = g94_gpio_new,
1447	.i2c = g94_i2c_new,
1448	.ibus = gf100_ibus_new,
1449	.iccsense = gf100_iccsense_new,
1450	.imem = nv50_instmem_new,
1451	.ltc = gf100_ltc_new,
1452	.mc = gf100_mc_new,
1453	.mmu = gf100_mmu_new,
1454	.mxm = nv50_mxm_new,
1455	.pci = gf106_pci_new,
1456	.pmu = gf100_pmu_new,
1457	.therm = gt215_therm_new,
1458	.timer = nv41_timer_new,
1459	.volt = gf100_volt_new,
1460	.ce[0] = gf100_ce_new,
1461	.disp = gt215_disp_new,
1462	.dma = gf100_dma_new,
1463	.fifo = gf100_fifo_new,
1464	.gr = gf104_gr_new,
1465	.mspdec = gf100_mspdec_new,
1466	.msppp = gf100_msppp_new,
1467	.msvld = gf100_msvld_new,
1468	.pm = gf100_pm_new,
1469	.sw = gf100_sw_new,
1470};
1471
1472static const struct nvkm_device_chip
1473nvc4_chipset = {
1474	.name = "GF104",
1475	.bar = gf100_bar_new,
1476	.bios = nvkm_bios_new,
1477	.bus = gf100_bus_new,
1478	.clk = gf100_clk_new,
1479	.devinit = gf100_devinit_new,
1480	.fb = gf100_fb_new,
1481	.fuse = gf100_fuse_new,
1482	.gpio = g94_gpio_new,
1483	.i2c = g94_i2c_new,
1484	.ibus = gf100_ibus_new,
1485	.iccsense = gf100_iccsense_new,
1486	.imem = nv50_instmem_new,
1487	.ltc = gf100_ltc_new,
1488	.mc = gf100_mc_new,
1489	.mmu = gf100_mmu_new,
1490	.mxm = nv50_mxm_new,
1491	.pci = gf100_pci_new,
1492	.pmu = gf100_pmu_new,
1493	.therm = gt215_therm_new,
1494	.timer = nv41_timer_new,
1495	.volt = gf100_volt_new,
1496	.ce[0] = gf100_ce_new,
1497	.ce[1] = gf100_ce_new,
1498	.disp = gt215_disp_new,
1499	.dma = gf100_dma_new,
1500	.fifo = gf100_fifo_new,
1501	.gr = gf104_gr_new,
1502	.mspdec = gf100_mspdec_new,
1503	.msppp = gf100_msppp_new,
1504	.msvld = gf100_msvld_new,
1505	.pm = gf100_pm_new,
1506	.sw = gf100_sw_new,
1507};
1508
1509static const struct nvkm_device_chip
1510nvc8_chipset = {
1511	.name = "GF110",
1512	.bar = gf100_bar_new,
1513	.bios = nvkm_bios_new,
1514	.bus = gf100_bus_new,
1515	.clk = gf100_clk_new,
1516	.devinit = gf100_devinit_new,
1517	.fb = gf100_fb_new,
1518	.fuse = gf100_fuse_new,
1519	.gpio = g94_gpio_new,
1520	.i2c = g94_i2c_new,
1521	.ibus = gf100_ibus_new,
1522	.iccsense = gf100_iccsense_new,
1523	.imem = nv50_instmem_new,
1524	.ltc = gf100_ltc_new,
1525	.mc = gf100_mc_new,
1526	.mmu = gf100_mmu_new,
1527	.mxm = nv50_mxm_new,
1528	.pci = gf100_pci_new,
1529	.pmu = gf100_pmu_new,
1530	.therm = gt215_therm_new,
1531	.timer = nv41_timer_new,
1532	.volt = gf100_volt_new,
1533	.ce[0] = gf100_ce_new,
1534	.ce[1] = gf100_ce_new,
1535	.disp = gt215_disp_new,
1536	.dma = gf100_dma_new,
1537	.fifo = gf100_fifo_new,
1538	.gr = gf110_gr_new,
1539	.mspdec = gf100_mspdec_new,
1540	.msppp = gf100_msppp_new,
1541	.msvld = gf100_msvld_new,
1542	.pm = gf100_pm_new,
1543	.sw = gf100_sw_new,
1544};
1545
1546static const struct nvkm_device_chip
1547nvce_chipset = {
1548	.name = "GF114",
1549	.bar = gf100_bar_new,
1550	.bios = nvkm_bios_new,
1551	.bus = gf100_bus_new,
1552	.clk = gf100_clk_new,
1553	.devinit = gf100_devinit_new,
1554	.fb = gf100_fb_new,
1555	.fuse = gf100_fuse_new,
1556	.gpio = g94_gpio_new,
1557	.i2c = g94_i2c_new,
1558	.ibus = gf100_ibus_new,
1559	.iccsense = gf100_iccsense_new,
1560	.imem = nv50_instmem_new,
1561	.ltc = gf100_ltc_new,
1562	.mc = gf100_mc_new,
1563	.mmu = gf100_mmu_new,
1564	.mxm = nv50_mxm_new,
1565	.pci = gf100_pci_new,
1566	.pmu = gf100_pmu_new,
1567	.therm = gt215_therm_new,
1568	.timer = nv41_timer_new,
1569	.volt = gf100_volt_new,
1570	.ce[0] = gf100_ce_new,
1571	.ce[1] = gf100_ce_new,
1572	.disp = gt215_disp_new,
1573	.dma = gf100_dma_new,
1574	.fifo = gf100_fifo_new,
1575	.gr = gf104_gr_new,
1576	.mspdec = gf100_mspdec_new,
1577	.msppp = gf100_msppp_new,
1578	.msvld = gf100_msvld_new,
1579	.pm = gf100_pm_new,
1580	.sw = gf100_sw_new,
1581};
1582
1583static const struct nvkm_device_chip
1584nvcf_chipset = {
1585	.name = "GF116",
1586	.bar = gf100_bar_new,
1587	.bios = nvkm_bios_new,
1588	.bus = gf100_bus_new,
1589	.clk = gf100_clk_new,
1590	.devinit = gf100_devinit_new,
1591	.fb = gf100_fb_new,
1592	.fuse = gf100_fuse_new,
1593	.gpio = g94_gpio_new,
1594	.i2c = g94_i2c_new,
1595	.ibus = gf100_ibus_new,
1596	.iccsense = gf100_iccsense_new,
1597	.imem = nv50_instmem_new,
1598	.ltc = gf100_ltc_new,
1599	.mc = gf100_mc_new,
1600	.mmu = gf100_mmu_new,
1601	.mxm = nv50_mxm_new,
1602	.pci = gf106_pci_new,
1603	.pmu = gf100_pmu_new,
1604	.therm = gt215_therm_new,
1605	.timer = nv41_timer_new,
1606	.volt = gf100_volt_new,
1607	.ce[0] = gf100_ce_new,
1608	.disp = gt215_disp_new,
1609	.dma = gf100_dma_new,
1610	.fifo = gf100_fifo_new,
1611	.gr = gf104_gr_new,
1612	.mspdec = gf100_mspdec_new,
1613	.msppp = gf100_msppp_new,
1614	.msvld = gf100_msvld_new,
1615	.pm = gf100_pm_new,
1616	.sw = gf100_sw_new,
1617};
1618
1619static const struct nvkm_device_chip
1620nvd7_chipset = {
1621	.name = "GF117",
1622	.bar = gf100_bar_new,
1623	.bios = nvkm_bios_new,
1624	.bus = gf100_bus_new,
1625	.clk = gf100_clk_new,
1626	.devinit = gf100_devinit_new,
1627	.fb = gf100_fb_new,
1628	.fuse = gf100_fuse_new,
1629	.gpio = gf119_gpio_new,
1630	.i2c = gf117_i2c_new,
1631	.ibus = gf117_ibus_new,
1632	.iccsense = gf100_iccsense_new,
1633	.imem = nv50_instmem_new,
1634	.ltc = gf100_ltc_new,
1635	.mc = gf100_mc_new,
1636	.mmu = gf100_mmu_new,
1637	.mxm = nv50_mxm_new,
1638	.pci = gf106_pci_new,
1639	.therm = gf119_therm_new,
1640	.timer = nv41_timer_new,
1641	.volt = gf117_volt_new,
1642	.ce[0] = gf100_ce_new,
1643	.disp = gf119_disp_new,
1644	.dma = gf119_dma_new,
1645	.fifo = gf100_fifo_new,
1646	.gr = gf117_gr_new,
1647	.mspdec = gf100_mspdec_new,
1648	.msppp = gf100_msppp_new,
1649	.msvld = gf100_msvld_new,
1650	.pm = gf117_pm_new,
1651	.sw = gf100_sw_new,
1652};
1653
1654static const struct nvkm_device_chip
1655nvd9_chipset = {
1656	.name = "GF119",
1657	.bar = gf100_bar_new,
1658	.bios = nvkm_bios_new,
1659	.bus = gf100_bus_new,
1660	.clk = gf100_clk_new,
1661	.devinit = gf100_devinit_new,
1662	.fb = gf100_fb_new,
1663	.fuse = gf100_fuse_new,
1664	.gpio = gf119_gpio_new,
1665	.i2c = gf119_i2c_new,
1666	.ibus = gf117_ibus_new,
1667	.iccsense = gf100_iccsense_new,
1668	.imem = nv50_instmem_new,
1669	.ltc = gf100_ltc_new,
1670	.mc = gf100_mc_new,
1671	.mmu = gf100_mmu_new,
1672	.mxm = nv50_mxm_new,
1673	.pci = gf106_pci_new,
1674	.pmu = gf119_pmu_new,
1675	.therm = gf119_therm_new,
1676	.timer = nv41_timer_new,
1677	.volt = gf100_volt_new,
1678	.ce[0] = gf100_ce_new,
1679	.disp = gf119_disp_new,
1680	.dma = gf119_dma_new,
1681	.fifo = gf100_fifo_new,
1682	.gr = gf119_gr_new,
1683	.mspdec = gf100_mspdec_new,
1684	.msppp = gf100_msppp_new,
1685	.msvld = gf100_msvld_new,
1686	.pm = gf117_pm_new,
1687	.sw = gf100_sw_new,
1688};
1689
1690static const struct nvkm_device_chip
1691nve4_chipset = {
1692	.name = "GK104",
1693	.bar = gf100_bar_new,
1694	.bios = nvkm_bios_new,
1695	.bus = gf100_bus_new,
1696	.clk = gk104_clk_new,
1697	.devinit = gf100_devinit_new,
1698	.fb = gk104_fb_new,
1699	.fuse = gf100_fuse_new,
1700	.gpio = gk104_gpio_new,
1701	.i2c = gk104_i2c_new,
1702	.ibus = gk104_ibus_new,
1703	.iccsense = gf100_iccsense_new,
1704	.imem = nv50_instmem_new,
1705	.ltc = gk104_ltc_new,
1706	.mc = gk104_mc_new,
1707	.mmu = gk104_mmu_new,
1708	.mxm = nv50_mxm_new,
1709	.pci = gk104_pci_new,
1710	.pmu = gk104_pmu_new,
1711	.therm = gk104_therm_new,
1712	.timer = nv41_timer_new,
1713	.top = gk104_top_new,
1714	.volt = gk104_volt_new,
1715	.ce[0] = gk104_ce_new,
1716	.ce[1] = gk104_ce_new,
1717	.ce[2] = gk104_ce_new,
1718	.disp = gk104_disp_new,
1719	.dma = gf119_dma_new,
1720	.fifo = gk104_fifo_new,
1721	.gr = gk104_gr_new,
1722	.mspdec = gk104_mspdec_new,
1723	.msppp = gf100_msppp_new,
1724	.msvld = gk104_msvld_new,
1725	.pm = gk104_pm_new,
1726	.sw = gf100_sw_new,
1727};
1728
1729static const struct nvkm_device_chip
1730nve6_chipset = {
1731	.name = "GK106",
1732	.bar = gf100_bar_new,
1733	.bios = nvkm_bios_new,
1734	.bus = gf100_bus_new,
1735	.clk = gk104_clk_new,
1736	.devinit = gf100_devinit_new,
1737	.fb = gk104_fb_new,
1738	.fuse = gf100_fuse_new,
1739	.gpio = gk104_gpio_new,
1740	.i2c = gk104_i2c_new,
1741	.ibus = gk104_ibus_new,
1742	.iccsense = gf100_iccsense_new,
1743	.imem = nv50_instmem_new,
1744	.ltc = gk104_ltc_new,
1745	.mc = gk104_mc_new,
1746	.mmu = gk104_mmu_new,
1747	.mxm = nv50_mxm_new,
1748	.pci = gk104_pci_new,
1749	.pmu = gk104_pmu_new,
1750	.therm = gk104_therm_new,
1751	.timer = nv41_timer_new,
1752	.top = gk104_top_new,
1753	.volt = gk104_volt_new,
1754	.ce[0] = gk104_ce_new,
1755	.ce[1] = gk104_ce_new,
1756	.ce[2] = gk104_ce_new,
1757	.disp = gk104_disp_new,
1758	.dma = gf119_dma_new,
1759	.fifo = gk104_fifo_new,
1760	.gr = gk104_gr_new,
1761	.mspdec = gk104_mspdec_new,
1762	.msppp = gf100_msppp_new,
1763	.msvld = gk104_msvld_new,
1764	.pm = gk104_pm_new,
1765	.sw = gf100_sw_new,
1766};
1767
1768static const struct nvkm_device_chip
1769nve7_chipset = {
1770	.name = "GK107",
1771	.bar = gf100_bar_new,
1772	.bios = nvkm_bios_new,
1773	.bus = gf100_bus_new,
1774	.clk = gk104_clk_new,
1775	.devinit = gf100_devinit_new,
1776	.fb = gk104_fb_new,
1777	.fuse = gf100_fuse_new,
1778	.gpio = gk104_gpio_new,
1779	.i2c = gk104_i2c_new,
1780	.ibus = gk104_ibus_new,
1781	.iccsense = gf100_iccsense_new,
1782	.imem = nv50_instmem_new,
1783	.ltc = gk104_ltc_new,
1784	.mc = gk104_mc_new,
1785	.mmu = gk104_mmu_new,
1786	.mxm = nv50_mxm_new,
1787	.pci = gk104_pci_new,
1788	.pmu = gk104_pmu_new,
1789	.therm = gk104_therm_new,
1790	.timer = nv41_timer_new,
1791	.top = gk104_top_new,
1792	.volt = gk104_volt_new,
1793	.ce[0] = gk104_ce_new,
1794	.ce[1] = gk104_ce_new,
1795	.ce[2] = gk104_ce_new,
1796	.disp = gk104_disp_new,
1797	.dma = gf119_dma_new,
1798	.fifo = gk104_fifo_new,
1799	.gr = gk104_gr_new,
1800	.mspdec = gk104_mspdec_new,
1801	.msppp = gf100_msppp_new,
1802	.msvld = gk104_msvld_new,
1803	.pm = gk104_pm_new,
1804	.sw = gf100_sw_new,
1805};
1806
1807static const struct nvkm_device_chip
1808nvea_chipset = {
1809	.name = "GK20A",
1810	.bar = gk20a_bar_new,
1811	.bus = gf100_bus_new,
1812	.clk = gk20a_clk_new,
1813	.fb = gk20a_fb_new,
1814	.fuse = gf100_fuse_new,
1815	.ibus = gk20a_ibus_new,
1816	.imem = gk20a_instmem_new,
1817	.ltc = gk104_ltc_new,
1818	.mc = gk20a_mc_new,
1819	.mmu = gk20a_mmu_new,
1820	.pmu = gk20a_pmu_new,
1821	.timer = gk20a_timer_new,
1822	.top = gk104_top_new,
1823	.volt = gk20a_volt_new,
1824	.ce[2] = gk104_ce_new,
1825	.dma = gf119_dma_new,
1826	.fifo = gk20a_fifo_new,
1827	.gr = gk20a_gr_new,
1828	.pm = gk104_pm_new,
1829	.sw = gf100_sw_new,
1830};
1831
1832static const struct nvkm_device_chip
1833nvf0_chipset = {
1834	.name = "GK110",
1835	.bar = gf100_bar_new,
1836	.bios = nvkm_bios_new,
1837	.bus = gf100_bus_new,
1838	.clk = gk104_clk_new,
1839	.devinit = gf100_devinit_new,
1840	.fb = gk110_fb_new,
1841	.fuse = gf100_fuse_new,
1842	.gpio = gk104_gpio_new,
1843	.i2c = gk104_i2c_new,
1844	.ibus = gk104_ibus_new,
1845	.iccsense = gf100_iccsense_new,
1846	.imem = nv50_instmem_new,
1847	.ltc = gk104_ltc_new,
1848	.mc = gk104_mc_new,
1849	.mmu = gk104_mmu_new,
1850	.mxm = nv50_mxm_new,
1851	.pci = gk104_pci_new,
1852	.pmu = gk110_pmu_new,
1853	.therm = gk104_therm_new,
1854	.timer = nv41_timer_new,
1855	.top = gk104_top_new,
1856	.volt = gk104_volt_new,
1857	.ce[0] = gk104_ce_new,
1858	.ce[1] = gk104_ce_new,
1859	.ce[2] = gk104_ce_new,
1860	.disp = gk110_disp_new,
1861	.dma = gf119_dma_new,
1862	.fifo = gk110_fifo_new,
1863	.gr = gk110_gr_new,
1864	.mspdec = gk104_mspdec_new,
1865	.msppp = gf100_msppp_new,
1866	.msvld = gk104_msvld_new,
1867	.sw = gf100_sw_new,
1868};
1869
1870static const struct nvkm_device_chip
1871nvf1_chipset = {
1872	.name = "GK110B",
1873	.bar = gf100_bar_new,
1874	.bios = nvkm_bios_new,
1875	.bus = gf100_bus_new,
1876	.clk = gk104_clk_new,
1877	.devinit = gf100_devinit_new,
1878	.fb = gk110_fb_new,
1879	.fuse = gf100_fuse_new,
1880	.gpio = gk104_gpio_new,
1881	.i2c = gk104_i2c_new,
1882	.ibus = gk104_ibus_new,
1883	.iccsense = gf100_iccsense_new,
1884	.imem = nv50_instmem_new,
1885	.ltc = gk104_ltc_new,
1886	.mc = gk104_mc_new,
1887	.mmu = gk104_mmu_new,
1888	.mxm = nv50_mxm_new,
1889	.pci = gk104_pci_new,
1890	.pmu = gk110_pmu_new,
1891	.therm = gk104_therm_new,
1892	.timer = nv41_timer_new,
1893	.top = gk104_top_new,
1894	.volt = gk104_volt_new,
1895	.ce[0] = gk104_ce_new,
1896	.ce[1] = gk104_ce_new,
1897	.ce[2] = gk104_ce_new,
1898	.disp = gk110_disp_new,
1899	.dma = gf119_dma_new,
1900	.fifo = gk110_fifo_new,
1901	.gr = gk110b_gr_new,
1902	.mspdec = gk104_mspdec_new,
1903	.msppp = gf100_msppp_new,
1904	.msvld = gk104_msvld_new,
1905	.sw = gf100_sw_new,
1906};
1907
1908static const struct nvkm_device_chip
1909nv106_chipset = {
1910	.name = "GK208B",
1911	.bar = gf100_bar_new,
1912	.bios = nvkm_bios_new,
1913	.bus = gf100_bus_new,
1914	.clk = gk104_clk_new,
1915	.devinit = gf100_devinit_new,
1916	.fb = gk110_fb_new,
1917	.fuse = gf100_fuse_new,
1918	.gpio = gk104_gpio_new,
1919	.i2c = gk104_i2c_new,
1920	.ibus = gk104_ibus_new,
1921	.iccsense = gf100_iccsense_new,
1922	.imem = nv50_instmem_new,
1923	.ltc = gk104_ltc_new,
1924	.mc = gk20a_mc_new,
1925	.mmu = gk104_mmu_new,
1926	.mxm = nv50_mxm_new,
1927	.pci = gk104_pci_new,
1928	.pmu = gk208_pmu_new,
1929	.therm = gk104_therm_new,
1930	.timer = nv41_timer_new,
1931	.top = gk104_top_new,
1932	.volt = gk104_volt_new,
1933	.ce[0] = gk104_ce_new,
1934	.ce[1] = gk104_ce_new,
1935	.ce[2] = gk104_ce_new,
1936	.disp = gk110_disp_new,
1937	.dma = gf119_dma_new,
1938	.fifo = gk208_fifo_new,
1939	.gr = gk208_gr_new,
1940	.mspdec = gk104_mspdec_new,
1941	.msppp = gf100_msppp_new,
1942	.msvld = gk104_msvld_new,
1943	.sw = gf100_sw_new,
1944};
1945
1946static const struct nvkm_device_chip
1947nv108_chipset = {
1948	.name = "GK208",
1949	.bar = gf100_bar_new,
1950	.bios = nvkm_bios_new,
1951	.bus = gf100_bus_new,
1952	.clk = gk104_clk_new,
1953	.devinit = gf100_devinit_new,
1954	.fb = gk110_fb_new,
1955	.fuse = gf100_fuse_new,
1956	.gpio = gk104_gpio_new,
1957	.i2c = gk104_i2c_new,
1958	.ibus = gk104_ibus_new,
1959	.iccsense = gf100_iccsense_new,
1960	.imem = nv50_instmem_new,
1961	.ltc = gk104_ltc_new,
1962	.mc = gk20a_mc_new,
1963	.mmu = gk104_mmu_new,
1964	.mxm = nv50_mxm_new,
1965	.pci = gk104_pci_new,
1966	.pmu = gk208_pmu_new,
1967	.therm = gk104_therm_new,
1968	.timer = nv41_timer_new,
1969	.top = gk104_top_new,
1970	.volt = gk104_volt_new,
1971	.ce[0] = gk104_ce_new,
1972	.ce[1] = gk104_ce_new,
1973	.ce[2] = gk104_ce_new,
1974	.disp = gk110_disp_new,
1975	.dma = gf119_dma_new,
1976	.fifo = gk208_fifo_new,
1977	.gr = gk208_gr_new,
1978	.mspdec = gk104_mspdec_new,
1979	.msppp = gf100_msppp_new,
1980	.msvld = gk104_msvld_new,
1981	.sw = gf100_sw_new,
1982};
1983
1984static const struct nvkm_device_chip
1985nv117_chipset = {
1986	.name = "GM107",
1987	.bar = gm107_bar_new,
1988	.bios = nvkm_bios_new,
1989	.bus = gf100_bus_new,
1990	.clk = gk104_clk_new,
1991	.devinit = gm107_devinit_new,
1992	.fb = gm107_fb_new,
1993	.fuse = gm107_fuse_new,
1994	.gpio = gk104_gpio_new,
1995	.i2c = gk104_i2c_new,
1996	.ibus = gk104_ibus_new,
1997	.iccsense = gf100_iccsense_new,
1998	.imem = nv50_instmem_new,
1999	.ltc = gm107_ltc_new,
2000	.mc = gk20a_mc_new,
2001	.mmu = gk104_mmu_new,
2002	.mxm = nv50_mxm_new,
2003	.pci = gk104_pci_new,
2004	.pmu = gm107_pmu_new,
2005	.therm = gm107_therm_new,
2006	.timer = gk20a_timer_new,
2007	.top = gk104_top_new,
2008	.volt = gk104_volt_new,
2009	.ce[0] = gm107_ce_new,
2010	.ce[2] = gm107_ce_new,
2011	.disp = gm107_disp_new,
2012	.dma = gf119_dma_new,
2013	.fifo = gm107_fifo_new,
2014	.gr = gm107_gr_new,
2015	.nvdec[0] = gm107_nvdec_new,
2016	.nvenc[0] = gm107_nvenc_new,
2017	.sw = gf100_sw_new,
2018};
2019
2020static const struct nvkm_device_chip
2021nv118_chipset = {
2022	.name = "GM108",
2023	.bar = gm107_bar_new,
2024	.bios = nvkm_bios_new,
2025	.bus = gf100_bus_new,
2026	.clk = gk104_clk_new,
2027	.devinit = gm107_devinit_new,
2028	.fb = gm107_fb_new,
2029	.fuse = gm107_fuse_new,
2030	.gpio = gk104_gpio_new,
2031	.i2c = gk104_i2c_new,
2032	.ibus = gk104_ibus_new,
2033	.iccsense = gf100_iccsense_new,
2034	.imem = nv50_instmem_new,
2035	.ltc = gm107_ltc_new,
2036	.mc = gk20a_mc_new,
2037	.mmu = gk104_mmu_new,
2038	.mxm = nv50_mxm_new,
2039	.pci = gk104_pci_new,
2040	.pmu = gm107_pmu_new,
2041	.therm = gm107_therm_new,
2042	.timer = gk20a_timer_new,
2043	.top = gk104_top_new,
2044	.volt = gk104_volt_new,
2045	.ce[0] = gm107_ce_new,
2046	.ce[2] = gm107_ce_new,
2047	.disp = gm107_disp_new,
2048	.dma = gf119_dma_new,
2049	.fifo = gm107_fifo_new,
2050	.gr = gm107_gr_new,
2051	.sw = gf100_sw_new,
2052};
2053
2054static const struct nvkm_device_chip
2055nv120_chipset = {
2056	.name = "GM200",
2057	.acr = gm200_acr_new,
2058	.bar = gm107_bar_new,
2059	.bios = nvkm_bios_new,
2060	.bus = gf100_bus_new,
2061	.devinit = gm200_devinit_new,
2062	.fb = gm200_fb_new,
2063	.fuse = gm107_fuse_new,
2064	.gpio = gk104_gpio_new,
2065	.i2c = gm200_i2c_new,
2066	.ibus = gm200_ibus_new,
2067	.iccsense = gf100_iccsense_new,
2068	.imem = nv50_instmem_new,
2069	.ltc = gm200_ltc_new,
2070	.mc = gk20a_mc_new,
2071	.mmu = gm200_mmu_new,
2072	.mxm = nv50_mxm_new,
2073	.pci = gk104_pci_new,
2074	.pmu = gm107_pmu_new,
2075	.therm = gm200_therm_new,
2076	.timer = gk20a_timer_new,
2077	.top = gk104_top_new,
2078	.volt = gk104_volt_new,
2079	.ce[0] = gm200_ce_new,
2080	.ce[1] = gm200_ce_new,
2081	.ce[2] = gm200_ce_new,
2082	.disp = gm200_disp_new,
2083	.dma = gf119_dma_new,
2084	.fifo = gm200_fifo_new,
2085	.gr = gm200_gr_new,
2086	.nvdec[0] = gm107_nvdec_new,
2087	.nvenc[0] = gm107_nvenc_new,
2088	.nvenc[1] = gm107_nvenc_new,
2089	.sw = gf100_sw_new,
2090};
2091
2092static const struct nvkm_device_chip
2093nv124_chipset = {
2094	.name = "GM204",
2095	.acr = gm200_acr_new,
2096	.bar = gm107_bar_new,
2097	.bios = nvkm_bios_new,
2098	.bus = gf100_bus_new,
2099	.devinit = gm200_devinit_new,
2100	.fb = gm200_fb_new,
2101	.fuse = gm107_fuse_new,
2102	.gpio = gk104_gpio_new,
2103	.i2c = gm200_i2c_new,
2104	.ibus = gm200_ibus_new,
2105	.iccsense = gf100_iccsense_new,
2106	.imem = nv50_instmem_new,
2107	.ltc = gm200_ltc_new,
2108	.mc = gk20a_mc_new,
2109	.mmu = gm200_mmu_new,
2110	.mxm = nv50_mxm_new,
2111	.pci = gk104_pci_new,
2112	.pmu = gm107_pmu_new,
2113	.therm = gm200_therm_new,
2114	.timer = gk20a_timer_new,
2115	.top = gk104_top_new,
2116	.volt = gk104_volt_new,
2117	.ce[0] = gm200_ce_new,
2118	.ce[1] = gm200_ce_new,
2119	.ce[2] = gm200_ce_new,
2120	.disp = gm200_disp_new,
2121	.dma = gf119_dma_new,
2122	.fifo = gm200_fifo_new,
2123	.gr = gm200_gr_new,
2124	.nvdec[0] = gm107_nvdec_new,
2125	.nvenc[0] = gm107_nvenc_new,
2126	.nvenc[1] = gm107_nvenc_new,
2127	.sw = gf100_sw_new,
2128};
2129
2130static const struct nvkm_device_chip
2131nv126_chipset = {
2132	.name = "GM206",
2133	.acr = gm200_acr_new,
2134	.bar = gm107_bar_new,
2135	.bios = nvkm_bios_new,
2136	.bus = gf100_bus_new,
2137	.devinit = gm200_devinit_new,
2138	.fb = gm200_fb_new,
2139	.fuse = gm107_fuse_new,
2140	.gpio = gk104_gpio_new,
2141	.i2c = gm200_i2c_new,
2142	.ibus = gm200_ibus_new,
2143	.iccsense = gf100_iccsense_new,
2144	.imem = nv50_instmem_new,
2145	.ltc = gm200_ltc_new,
2146	.mc = gk20a_mc_new,
2147	.mmu = gm200_mmu_new,
2148	.mxm = nv50_mxm_new,
2149	.pci = gk104_pci_new,
2150	.pmu = gm107_pmu_new,
2151	.therm = gm200_therm_new,
2152	.timer = gk20a_timer_new,
2153	.top = gk104_top_new,
2154	.volt = gk104_volt_new,
2155	.ce[0] = gm200_ce_new,
2156	.ce[1] = gm200_ce_new,
2157	.ce[2] = gm200_ce_new,
2158	.disp = gm200_disp_new,
2159	.dma = gf119_dma_new,
2160	.fifo = gm200_fifo_new,
2161	.gr = gm200_gr_new,
2162	.nvdec[0] = gm107_nvdec_new,
2163	.nvenc[0] = gm107_nvenc_new,
2164	.sw = gf100_sw_new,
2165};
2166
2167static const struct nvkm_device_chip
2168nv12b_chipset = {
2169	.name = "GM20B",
2170	.acr = gm20b_acr_new,
2171	.bar = gm20b_bar_new,
2172	.bus = gf100_bus_new,
2173	.clk = gm20b_clk_new,
2174	.fb = gm20b_fb_new,
2175	.fuse = gm107_fuse_new,
2176	.ibus = gk20a_ibus_new,
2177	.imem = gk20a_instmem_new,
2178	.ltc = gm200_ltc_new,
2179	.mc = gk20a_mc_new,
2180	.mmu = gm20b_mmu_new,
2181	.pmu = gm20b_pmu_new,
2182	.timer = gk20a_timer_new,
2183	.top = gk104_top_new,
2184	.ce[2] = gm200_ce_new,
2185	.volt = gm20b_volt_new,
2186	.dma = gf119_dma_new,
2187	.fifo = gm20b_fifo_new,
2188	.gr = gm20b_gr_new,
2189	.sw = gf100_sw_new,
2190};
2191
2192static const struct nvkm_device_chip
2193nv130_chipset = {
2194	.name = "GP100",
2195	.acr = gm200_acr_new,
2196	.bar = gm107_bar_new,
2197	.bios = nvkm_bios_new,
2198	.bus = gf100_bus_new,
2199	.devinit = gm200_devinit_new,
2200	.fault = gp100_fault_new,
2201	.fb = gp100_fb_new,
2202	.fuse = gm107_fuse_new,
2203	.gpio = gk104_gpio_new,
2204	.i2c = gm200_i2c_new,
2205	.ibus = gm200_ibus_new,
2206	.imem = nv50_instmem_new,
2207	.ltc = gp100_ltc_new,
2208	.mc = gp100_mc_new,
2209	.mmu = gp100_mmu_new,
2210	.therm = gp100_therm_new,
2211	.pci = gp100_pci_new,
2212	.pmu = gp100_pmu_new,
2213	.timer = gk20a_timer_new,
2214	.top = gk104_top_new,
2215	.ce[0] = gp100_ce_new,
2216	.ce[1] = gp100_ce_new,
2217	.ce[2] = gp100_ce_new,
2218	.ce[3] = gp100_ce_new,
2219	.ce[4] = gp100_ce_new,
2220	.ce[5] = gp100_ce_new,
2221	.dma = gf119_dma_new,
2222	.disp = gp100_disp_new,
2223	.fifo = gp100_fifo_new,
2224	.gr = gp100_gr_new,
2225	.nvdec[0] = gm107_nvdec_new,
2226	.nvenc[0] = gm107_nvenc_new,
2227	.nvenc[1] = gm107_nvenc_new,
2228	.nvenc[2] = gm107_nvenc_new,
2229	.sw = gf100_sw_new,
2230};
2231
2232static const struct nvkm_device_chip
2233nv132_chipset = {
2234	.name = "GP102",
2235	.acr = gp102_acr_new,
2236	.bar = gm107_bar_new,
2237	.bios = nvkm_bios_new,
2238	.bus = gf100_bus_new,
2239	.devinit = gm200_devinit_new,
2240	.fault = gp100_fault_new,
2241	.fb = gp102_fb_new,
2242	.fuse = gm107_fuse_new,
2243	.gpio = gk104_gpio_new,
2244	.i2c = gm200_i2c_new,
2245	.ibus = gm200_ibus_new,
2246	.imem = nv50_instmem_new,
2247	.ltc = gp102_ltc_new,
2248	.mc = gp100_mc_new,
2249	.mmu = gp100_mmu_new,
2250	.therm = gp100_therm_new,
2251	.pci = gp100_pci_new,
2252	.pmu = gp102_pmu_new,
2253	.timer = gk20a_timer_new,
2254	.top = gk104_top_new,
2255	.ce[0] = gp102_ce_new,
2256	.ce[1] = gp102_ce_new,
2257	.ce[2] = gp102_ce_new,
2258	.ce[3] = gp102_ce_new,
2259	.disp = gp102_disp_new,
2260	.dma = gf119_dma_new,
2261	.fifo = gp100_fifo_new,
2262	.gr = gp102_gr_new,
2263	.nvdec[0] = gm107_nvdec_new,
2264	.nvenc[0] = gm107_nvenc_new,
2265	.nvenc[1] = gm107_nvenc_new,
2266	.sec2 = gp102_sec2_new,
2267	.sw = gf100_sw_new,
2268};
2269
2270static const struct nvkm_device_chip
2271nv134_chipset = {
2272	.name = "GP104",
2273	.acr = gp102_acr_new,
2274	.bar = gm107_bar_new,
2275	.bios = nvkm_bios_new,
2276	.bus = gf100_bus_new,
2277	.devinit = gm200_devinit_new,
2278	.fault = gp100_fault_new,
2279	.fb = gp102_fb_new,
2280	.fuse = gm107_fuse_new,
2281	.gpio = gk104_gpio_new,
2282	.i2c = gm200_i2c_new,
2283	.ibus = gm200_ibus_new,
2284	.imem = nv50_instmem_new,
2285	.ltc = gp102_ltc_new,
2286	.mc = gp100_mc_new,
2287	.mmu = gp100_mmu_new,
2288	.therm = gp100_therm_new,
2289	.pci = gp100_pci_new,
2290	.pmu = gp102_pmu_new,
2291	.timer = gk20a_timer_new,
2292	.top = gk104_top_new,
2293	.ce[0] = gp102_ce_new,
2294	.ce[1] = gp102_ce_new,
2295	.ce[2] = gp102_ce_new,
2296	.ce[3] = gp102_ce_new,
2297	.disp = gp102_disp_new,
2298	.dma = gf119_dma_new,
2299	.fifo = gp100_fifo_new,
2300	.gr = gp104_gr_new,
2301	.nvdec[0] = gm107_nvdec_new,
2302	.nvenc[0] = gm107_nvenc_new,
2303	.nvenc[1] = gm107_nvenc_new,
2304	.sec2 = gp102_sec2_new,
2305	.sw = gf100_sw_new,
2306};
2307
2308static const struct nvkm_device_chip
2309nv136_chipset = {
2310	.name = "GP106",
2311	.acr = gp102_acr_new,
2312	.bar = gm107_bar_new,
2313	.bios = nvkm_bios_new,
2314	.bus = gf100_bus_new,
2315	.devinit = gm200_devinit_new,
2316	.fault = gp100_fault_new,
2317	.fb = gp102_fb_new,
2318	.fuse = gm107_fuse_new,
2319	.gpio = gk104_gpio_new,
2320	.i2c = gm200_i2c_new,
2321	.ibus = gm200_ibus_new,
2322	.imem = nv50_instmem_new,
2323	.ltc = gp102_ltc_new,
2324	.mc = gp100_mc_new,
2325	.mmu = gp100_mmu_new,
2326	.therm = gp100_therm_new,
2327	.pci = gp100_pci_new,
2328	.pmu = gp102_pmu_new,
2329	.timer = gk20a_timer_new,
2330	.top = gk104_top_new,
2331	.ce[0] = gp102_ce_new,
2332	.ce[1] = gp102_ce_new,
2333	.ce[2] = gp102_ce_new,
2334	.ce[3] = gp102_ce_new,
2335	.disp = gp102_disp_new,
2336	.dma = gf119_dma_new,
2337	.fifo = gp100_fifo_new,
2338	.gr = gp104_gr_new,
2339	.nvdec[0] = gm107_nvdec_new,
2340	.nvenc[0] = gm107_nvenc_new,
2341	.sec2 = gp102_sec2_new,
2342	.sw = gf100_sw_new,
2343};
2344
2345static const struct nvkm_device_chip
2346nv137_chipset = {
2347	.name = "GP107",
2348	.acr = gp102_acr_new,
2349	.bar = gm107_bar_new,
2350	.bios = nvkm_bios_new,
2351	.bus = gf100_bus_new,
2352	.devinit = gm200_devinit_new,
2353	.fault = gp100_fault_new,
2354	.fb = gp102_fb_new,
2355	.fuse = gm107_fuse_new,
2356	.gpio = gk104_gpio_new,
2357	.i2c = gm200_i2c_new,
2358	.ibus = gm200_ibus_new,
2359	.imem = nv50_instmem_new,
2360	.ltc = gp102_ltc_new,
2361	.mc = gp100_mc_new,
2362	.mmu = gp100_mmu_new,
2363	.therm = gp100_therm_new,
2364	.pci = gp100_pci_new,
2365	.pmu = gp102_pmu_new,
2366	.timer = gk20a_timer_new,
2367	.top = gk104_top_new,
2368	.ce[0] = gp102_ce_new,
2369	.ce[1] = gp102_ce_new,
2370	.ce[2] = gp102_ce_new,
2371	.ce[3] = gp102_ce_new,
2372	.disp = gp102_disp_new,
2373	.dma = gf119_dma_new,
2374	.fifo = gp100_fifo_new,
2375	.gr = gp107_gr_new,
2376	.nvdec[0] = gm107_nvdec_new,
2377	.nvenc[0] = gm107_nvenc_new,
2378	.nvenc[1] = gm107_nvenc_new,
2379	.sec2 = gp102_sec2_new,
2380	.sw = gf100_sw_new,
2381};
2382
2383static const struct nvkm_device_chip
2384nv138_chipset = {
2385	.name = "GP108",
2386	.acr = gp108_acr_new,
2387	.bar = gm107_bar_new,
2388	.bios = nvkm_bios_new,
2389	.bus = gf100_bus_new,
2390	.devinit = gm200_devinit_new,
2391	.fault = gp100_fault_new,
2392	.fb = gp102_fb_new,
2393	.fuse = gm107_fuse_new,
2394	.gpio = gk104_gpio_new,
2395	.i2c = gm200_i2c_new,
2396	.ibus = gm200_ibus_new,
2397	.imem = nv50_instmem_new,
2398	.ltc = gp102_ltc_new,
2399	.mc = gp100_mc_new,
2400	.mmu = gp100_mmu_new,
2401	.therm = gp100_therm_new,
2402	.pci = gp100_pci_new,
2403	.pmu = gp102_pmu_new,
2404	.timer = gk20a_timer_new,
2405	.top = gk104_top_new,
2406	.ce[0] = gp102_ce_new,
2407	.ce[1] = gp102_ce_new,
2408	.ce[2] = gp102_ce_new,
2409	.ce[3] = gp102_ce_new,
2410	.disp = gp102_disp_new,
2411	.dma = gf119_dma_new,
2412	.fifo = gp100_fifo_new,
2413	.gr = gp108_gr_new,
2414	.nvdec[0] = gm107_nvdec_new,
2415	.sec2 = gp108_sec2_new,
2416	.sw = gf100_sw_new,
2417};
2418
2419static const struct nvkm_device_chip
2420nv13b_chipset = {
2421	.name = "GP10B",
2422	.acr = gp10b_acr_new,
2423	.bar = gm20b_bar_new,
2424	.bus = gf100_bus_new,
2425	.fault = gp10b_fault_new,
2426	.fb = gp10b_fb_new,
2427	.fuse = gm107_fuse_new,
2428	.ibus = gp10b_ibus_new,
2429	.imem = gk20a_instmem_new,
2430	.ltc = gp10b_ltc_new,
2431	.mc = gp10b_mc_new,
2432	.mmu = gp10b_mmu_new,
2433	.pmu = gp10b_pmu_new,
2434	.timer = gk20a_timer_new,
2435	.top = gk104_top_new,
2436	.ce[0] = gp100_ce_new,
2437	.dma = gf119_dma_new,
2438	.fifo = gp10b_fifo_new,
2439	.gr = gp10b_gr_new,
2440	.sw = gf100_sw_new,
2441};
2442
2443static const struct nvkm_device_chip
2444nv140_chipset = {
2445	.name = "GV100",
2446	.acr = gp108_acr_new,
2447	.bar = gm107_bar_new,
2448	.bios = nvkm_bios_new,
2449	.bus = gf100_bus_new,
2450	.devinit = gv100_devinit_new,
2451	.fault = gv100_fault_new,
2452	.fb = gv100_fb_new,
2453	.fuse = gm107_fuse_new,
2454	.gpio = gk104_gpio_new,
2455	.gsp = gv100_gsp_new,
2456	.i2c = gm200_i2c_new,
2457	.ibus = gm200_ibus_new,
2458	.imem = nv50_instmem_new,
2459	.ltc = gp102_ltc_new,
2460	.mc = gp100_mc_new,
2461	.mmu = gv100_mmu_new,
2462	.pci = gp100_pci_new,
2463	.pmu = gp102_pmu_new,
2464	.therm = gp100_therm_new,
2465	.timer = gk20a_timer_new,
2466	.top = gk104_top_new,
2467	.disp = gv100_disp_new,
2468	.ce[0] = gv100_ce_new,
2469	.ce[1] = gv100_ce_new,
2470	.ce[2] = gv100_ce_new,
2471	.ce[3] = gv100_ce_new,
2472	.ce[4] = gv100_ce_new,
2473	.ce[5] = gv100_ce_new,
2474	.ce[6] = gv100_ce_new,
2475	.ce[7] = gv100_ce_new,
2476	.ce[8] = gv100_ce_new,
2477	.dma = gv100_dma_new,
2478	.fifo = gv100_fifo_new,
2479	.gr = gv100_gr_new,
2480	.nvdec[0] = gm107_nvdec_new,
2481	.nvenc[0] = gm107_nvenc_new,
2482	.nvenc[1] = gm107_nvenc_new,
2483	.nvenc[2] = gm107_nvenc_new,
2484	.sec2 = gp108_sec2_new,
2485};
2486
2487static const struct nvkm_device_chip
2488nv162_chipset = {
2489	.name = "TU102",
2490	.acr = tu102_acr_new,
2491	.bar = tu102_bar_new,
2492	.bios = nvkm_bios_new,
2493	.bus = gf100_bus_new,
2494	.devinit = tu102_devinit_new,
2495	.fault = tu102_fault_new,
2496	.fb = gv100_fb_new,
2497	.fuse = gm107_fuse_new,
2498	.gpio = gk104_gpio_new,
2499	.gsp = gv100_gsp_new,
2500	.i2c = gm200_i2c_new,
2501	.ibus = gm200_ibus_new,
2502	.imem = nv50_instmem_new,
2503	.ltc = gp102_ltc_new,
2504	.mc = tu102_mc_new,
2505	.mmu = tu102_mmu_new,
2506	.pci = gp100_pci_new,
2507	.pmu = gp102_pmu_new,
2508	.therm = gp100_therm_new,
2509	.timer = gk20a_timer_new,
2510	.top = gk104_top_new,
2511	.ce[0] = tu102_ce_new,
2512	.ce[1] = tu102_ce_new,
2513	.ce[2] = tu102_ce_new,
2514	.ce[3] = tu102_ce_new,
2515	.ce[4] = tu102_ce_new,
2516	.disp = tu102_disp_new,
2517	.dma = gv100_dma_new,
2518	.fifo = tu102_fifo_new,
2519	.gr = tu102_gr_new,
2520	.nvdec[0] = gm107_nvdec_new,
2521	.nvenc[0] = gm107_nvenc_new,
2522	.sec2 = tu102_sec2_new,
2523};
2524
2525static const struct nvkm_device_chip
2526nv164_chipset = {
2527	.name = "TU104",
2528	.acr = tu102_acr_new,
2529	.bar = tu102_bar_new,
2530	.bios = nvkm_bios_new,
2531	.bus = gf100_bus_new,
2532	.devinit = tu102_devinit_new,
2533	.fault = tu102_fault_new,
2534	.fb = gv100_fb_new,
2535	.fuse = gm107_fuse_new,
2536	.gpio = gk104_gpio_new,
2537	.gsp = gv100_gsp_new,
2538	.i2c = gm200_i2c_new,
2539	.ibus = gm200_ibus_new,
2540	.imem = nv50_instmem_new,
2541	.ltc = gp102_ltc_new,
2542	.mc = tu102_mc_new,
2543	.mmu = tu102_mmu_new,
2544	.pci = gp100_pci_new,
2545	.pmu = gp102_pmu_new,
2546	.therm = gp100_therm_new,
2547	.timer = gk20a_timer_new,
2548	.top = gk104_top_new,
2549	.ce[0] = tu102_ce_new,
2550	.ce[1] = tu102_ce_new,
2551	.ce[2] = tu102_ce_new,
2552	.ce[3] = tu102_ce_new,
2553	.ce[4] = tu102_ce_new,
2554	.disp = tu102_disp_new,
2555	.dma = gv100_dma_new,
2556	.fifo = tu102_fifo_new,
2557	.gr = tu102_gr_new,
2558	.nvdec[0] = gm107_nvdec_new,
2559	.nvdec[1] = gm107_nvdec_new,
2560	.nvenc[0] = gm107_nvenc_new,
2561	.sec2 = tu102_sec2_new,
2562};
2563
2564static const struct nvkm_device_chip
2565nv166_chipset = {
2566	.name = "TU106",
2567	.acr = tu102_acr_new,
2568	.bar = tu102_bar_new,
2569	.bios = nvkm_bios_new,
2570	.bus = gf100_bus_new,
2571	.devinit = tu102_devinit_new,
2572	.fault = tu102_fault_new,
2573	.fb = gv100_fb_new,
2574	.fuse = gm107_fuse_new,
2575	.gpio = gk104_gpio_new,
2576	.gsp = gv100_gsp_new,
2577	.i2c = gm200_i2c_new,
2578	.ibus = gm200_ibus_new,
2579	.imem = nv50_instmem_new,
2580	.ltc = gp102_ltc_new,
2581	.mc = tu102_mc_new,
2582	.mmu = tu102_mmu_new,
2583	.pci = gp100_pci_new,
2584	.pmu = gp102_pmu_new,
2585	.therm = gp100_therm_new,
2586	.timer = gk20a_timer_new,
2587	.top = gk104_top_new,
2588	.ce[0] = tu102_ce_new,
2589	.ce[1] = tu102_ce_new,
2590	.ce[2] = tu102_ce_new,
2591	.ce[3] = tu102_ce_new,
2592	.ce[4] = tu102_ce_new,
2593	.disp = tu102_disp_new,
2594	.dma = gv100_dma_new,
2595	.fifo = tu102_fifo_new,
2596	.gr = tu102_gr_new,
2597	.nvdec[0] = gm107_nvdec_new,
2598	.nvdec[1] = gm107_nvdec_new,
2599	.nvdec[2] = gm107_nvdec_new,
2600	.nvenc[0] = gm107_nvenc_new,
2601	.sec2 = tu102_sec2_new,
2602};
2603
2604static const struct nvkm_device_chip
2605nv167_chipset = {
2606	.name = "TU117",
2607	.acr = tu102_acr_new,
2608	.bar = tu102_bar_new,
2609	.bios = nvkm_bios_new,
2610	.bus = gf100_bus_new,
2611	.devinit = tu102_devinit_new,
2612	.fault = tu102_fault_new,
2613	.fb = gv100_fb_new,
2614	.fuse = gm107_fuse_new,
2615	.gpio = gk104_gpio_new,
2616	.gsp = gv100_gsp_new,
2617	.i2c = gm200_i2c_new,
2618	.ibus = gm200_ibus_new,
2619	.imem = nv50_instmem_new,
2620	.ltc = gp102_ltc_new,
2621	.mc = tu102_mc_new,
2622	.mmu = tu102_mmu_new,
2623	.pci = gp100_pci_new,
2624	.pmu = gp102_pmu_new,
2625	.therm = gp100_therm_new,
2626	.timer = gk20a_timer_new,
2627	.top = gk104_top_new,
2628	.ce[0] = tu102_ce_new,
2629	.ce[1] = tu102_ce_new,
2630	.ce[2] = tu102_ce_new,
2631	.ce[3] = tu102_ce_new,
2632	.ce[4] = tu102_ce_new,
2633	.disp = tu102_disp_new,
2634	.dma = gv100_dma_new,
2635	.fifo = tu102_fifo_new,
2636	.gr = tu102_gr_new,
2637	.nvdec[0] = gm107_nvdec_new,
2638	.nvenc[0] = gm107_nvenc_new,
2639	.sec2 = tu102_sec2_new,
2640};
2641
2642static const struct nvkm_device_chip
2643nv168_chipset = {
2644	.name = "TU116",
2645	.acr = tu102_acr_new,
2646	.bar = tu102_bar_new,
2647	.bios = nvkm_bios_new,
2648	.bus = gf100_bus_new,
2649	.devinit = tu102_devinit_new,
2650	.fault = tu102_fault_new,
2651	.fb = gv100_fb_new,
2652	.fuse = gm107_fuse_new,
2653	.gpio = gk104_gpio_new,
2654	.gsp = gv100_gsp_new,
2655	.i2c = gm200_i2c_new,
2656	.ibus = gm200_ibus_new,
2657	.imem = nv50_instmem_new,
2658	.ltc = gp102_ltc_new,
2659	.mc = tu102_mc_new,
2660	.mmu = tu102_mmu_new,
2661	.pci = gp100_pci_new,
2662	.pmu = gp102_pmu_new,
2663	.therm = gp100_therm_new,
2664	.timer = gk20a_timer_new,
2665	.top = gk104_top_new,
2666	.ce[0] = tu102_ce_new,
2667	.ce[1] = tu102_ce_new,
2668	.ce[2] = tu102_ce_new,
2669	.ce[3] = tu102_ce_new,
2670	.ce[4] = tu102_ce_new,
2671	.disp = tu102_disp_new,
2672	.dma = gv100_dma_new,
2673	.fifo = tu102_fifo_new,
2674	.gr = tu102_gr_new,
2675	.nvdec[0] = gm107_nvdec_new,
2676	.nvenc[0] = gm107_nvenc_new,
2677	.sec2 = tu102_sec2_new,
2678};
2679
2680static int
2681nvkm_device_event_ctor(struct nvkm_object *object, void *data, u32 size,
2682		       struct nvkm_notify *notify)
2683{
2684	if (!WARN_ON(size != 0)) {
2685		notify->size  = 0;
2686		notify->types = 1;
2687		notify->index = 0;
2688		return 0;
2689	}
2690	return -EINVAL;
2691}
2692
2693static const struct nvkm_event_func
2694nvkm_device_event_func = {
2695	.ctor = nvkm_device_event_ctor,
2696};
2697
2698struct nvkm_subdev *
2699nvkm_device_subdev(struct nvkm_device *device, int index)
2700{
2701	struct nvkm_engine *engine;
2702
2703	if (device->disable_mask & (1ULL << index))
2704		return NULL;
2705
2706	switch (index) {
2707#define _(n,p,m) case NVKM_SUBDEV_##n: if (p) return (m); break
2708	_(ACR     , device->acr     , &device->acr->subdev);
2709	_(BAR     , device->bar     , &device->bar->subdev);
2710	_(VBIOS   , device->bios    , &device->bios->subdev);
2711	_(BUS     , device->bus     , &device->bus->subdev);
2712	_(CLK     , device->clk     , &device->clk->subdev);
2713	_(DEVINIT , device->devinit , &device->devinit->subdev);
2714	_(FAULT   , device->fault   , &device->fault->subdev);
2715	_(FB      , device->fb      , &device->fb->subdev);
2716	_(FUSE    , device->fuse    , &device->fuse->subdev);
2717	_(GPIO    , device->gpio    , &device->gpio->subdev);
2718	_(GSP     , device->gsp     , &device->gsp->subdev);
2719	_(I2C     , device->i2c     , &device->i2c->subdev);
2720	_(IBUS    , device->ibus    ,  device->ibus);
2721	_(ICCSENSE, device->iccsense, &device->iccsense->subdev);
2722	_(INSTMEM , device->imem    , &device->imem->subdev);
2723	_(LTC     , device->ltc     , &device->ltc->subdev);
2724	_(MC      , device->mc      , &device->mc->subdev);
2725	_(MMU     , device->mmu     , &device->mmu->subdev);
2726	_(MXM     , device->mxm     ,  device->mxm);
2727	_(PCI     , device->pci     , &device->pci->subdev);
2728	_(PMU     , device->pmu     , &device->pmu->subdev);
2729	_(THERM   , device->therm   , &device->therm->subdev);
2730	_(TIMER   , device->timer   , &device->timer->subdev);
2731	_(TOP     , device->top     , &device->top->subdev);
2732	_(VOLT    , device->volt    , &device->volt->subdev);
2733#undef _
2734	default:
2735		engine = nvkm_device_engine(device, index);
2736		if (engine)
2737			return &engine->subdev;
2738		break;
2739	}
2740	return NULL;
2741}
2742
2743struct nvkm_engine *
2744nvkm_device_engine(struct nvkm_device *device, int index)
2745{
2746	if (device->disable_mask & (1ULL << index))
2747		return NULL;
2748
2749	switch (index) {
2750#define _(n,p,m) case NVKM_ENGINE_##n: if (p) return (m); break
2751	_(BSP    , device->bsp     ,  device->bsp);
2752	_(CE0    , device->ce[0]   ,  device->ce[0]);
2753	_(CE1    , device->ce[1]   ,  device->ce[1]);
2754	_(CE2    , device->ce[2]   ,  device->ce[2]);
2755	_(CE3    , device->ce[3]   ,  device->ce[3]);
2756	_(CE4    , device->ce[4]   ,  device->ce[4]);
2757	_(CE5    , device->ce[5]   ,  device->ce[5]);
2758	_(CE6    , device->ce[6]   ,  device->ce[6]);
2759	_(CE7    , device->ce[7]   ,  device->ce[7]);
2760	_(CE8    , device->ce[8]   ,  device->ce[8]);
2761	_(CIPHER , device->cipher  ,  device->cipher);
2762	_(DISP   , device->disp    , &device->disp->engine);
2763	_(DMAOBJ , device->dma     , &device->dma->engine);
2764	_(FIFO   , device->fifo    , &device->fifo->engine);
2765	_(GR     , device->gr      , &device->gr->engine);
2766	_(IFB    , device->ifb     ,  device->ifb);
2767	_(ME     , device->me      ,  device->me);
2768	_(MPEG   , device->mpeg    ,  device->mpeg);
2769	_(MSENC  , device->msenc   ,  device->msenc);
2770	_(MSPDEC , device->mspdec  ,  device->mspdec);
2771	_(MSPPP  , device->msppp   ,  device->msppp);
2772	_(MSVLD  , device->msvld   ,  device->msvld);
2773	_(NVENC0 , device->nvenc[0], &device->nvenc[0]->engine);
2774	_(NVENC1 , device->nvenc[1], &device->nvenc[1]->engine);
2775	_(NVENC2 , device->nvenc[2], &device->nvenc[2]->engine);
2776	_(NVDEC0 , device->nvdec[0], &device->nvdec[0]->engine);
2777	_(NVDEC1 , device->nvdec[1], &device->nvdec[1]->engine);
2778	_(NVDEC2 , device->nvdec[2], &device->nvdec[2]->engine);
2779	_(PM     , device->pm      , &device->pm->engine);
2780	_(SEC    , device->sec     ,  device->sec);
2781	_(SEC2   , device->sec2    , &device->sec2->engine);
2782	_(SW     , device->sw      , &device->sw->engine);
2783	_(VIC    , device->vic     ,  device->vic);
2784	_(VP     , device->vp      ,  device->vp);
2785#undef _
2786	default:
2787		WARN_ON(1);
2788		break;
2789	}
2790	return NULL;
2791}
2792
2793int
2794nvkm_device_fini(struct nvkm_device *device, bool suspend)
2795{
2796	const char *action = suspend ? "suspend" : "fini";
2797	struct nvkm_subdev *subdev;
2798	int ret, i;
2799	s64 time;
2800
2801	nvdev_trace(device, "%s running...\n", action);
2802	time = ktime_to_us(ktime_get());
2803
2804	nvkm_acpi_fini(device);
2805
2806	for (i = NVKM_SUBDEV_NR - 1; i >= 0; i--) {
2807		if ((subdev = nvkm_device_subdev(device, i))) {
2808			ret = nvkm_subdev_fini(subdev, suspend);
2809			if (ret && suspend)
2810				goto fail;
2811		}
2812	}
2813
2814	nvkm_therm_clkgate_fini(device->therm, suspend);
2815
2816	if (device->func->fini)
2817		device->func->fini(device, suspend);
2818
2819	time = ktime_to_us(ktime_get()) - time;
2820	nvdev_trace(device, "%s completed in %"PRId64"us...\n", action, time);
2821	return 0;
2822
2823fail:
2824	do {
2825		if ((subdev = nvkm_device_subdev(device, i))) {
2826			int rret = nvkm_subdev_init(subdev);
2827			if (rret)
2828				nvkm_fatal(subdev, "failed restart, %d\n", ret);
2829		}
2830	} while (++i < NVKM_SUBDEV_NR);
2831
2832	nvdev_trace(device, "%s failed with %d\n", action, ret);
2833	return ret;
2834}
2835
2836static int
2837nvkm_device_preinit(struct nvkm_device *device)
2838{
2839	struct nvkm_subdev *subdev;
2840	int ret, i;
2841	s64 time;
2842
2843	nvdev_trace(device, "preinit running...\n");
2844	time = ktime_to_us(ktime_get());
2845
2846	if (device->func->preinit) {
2847		ret = device->func->preinit(device);
2848		if (ret)
2849			goto fail;
2850	}
2851
2852	for (i = 0; i < NVKM_SUBDEV_NR; i++) {
2853		if ((subdev = nvkm_device_subdev(device, i))) {
2854			ret = nvkm_subdev_preinit(subdev);
2855			if (ret)
2856				goto fail;
2857		}
2858	}
2859
2860	ret = nvkm_devinit_post(device->devinit, &device->disable_mask);
2861	if (ret)
2862		goto fail;
2863
2864	time = ktime_to_us(ktime_get()) - time;
2865	nvdev_trace(device, "preinit completed in %"PRId64"us\n", time);
2866	return 0;
2867
2868fail:
2869	nvdev_error(device, "preinit failed with %d\n", ret);
2870	return ret;
2871}
2872
2873int
2874nvkm_device_init(struct nvkm_device *device)
2875{
2876	struct nvkm_subdev *subdev;
2877	int ret, i;
2878	s64 time;
2879
2880	ret = nvkm_device_preinit(device);
2881	if (ret)
2882		return ret;
2883
2884	nvkm_device_fini(device, false);
2885
2886	nvdev_trace(device, "init running...\n");
2887	time = ktime_to_us(ktime_get());
2888
2889	if (device->func->init) {
2890		ret = device->func->init(device);
2891		if (ret)
2892			goto fail;
2893	}
2894
2895	for (i = 0; i < NVKM_SUBDEV_NR; i++) {
2896		if ((subdev = nvkm_device_subdev(device, i))) {
2897			ret = nvkm_subdev_init(subdev);
2898			if (ret)
2899				goto fail_subdev;
2900		}
2901	}
2902
2903	nvkm_acpi_init(device);
2904	nvkm_therm_clkgate_enable(device->therm);
2905
2906	time = ktime_to_us(ktime_get()) - time;
2907	nvdev_trace(device, "init completed in %"PRId64"us\n", time);
2908	return 0;
2909
2910fail_subdev:
2911	do {
2912		if ((subdev = nvkm_device_subdev(device, i)))
2913			nvkm_subdev_fini(subdev, false);
2914	} while (--i >= 0);
2915
2916fail:
2917	nvkm_device_fini(device, false);
2918
2919	nvdev_error(device, "init failed with %d\n", ret);
2920	return ret;
2921}
2922
2923void
2924nvkm_device_del(struct nvkm_device **pdevice)
2925{
2926	struct nvkm_device *device = *pdevice;
2927	int i;
2928	if (device) {
2929		mutex_lock(&nv_devices_mutex);
2930		device->disable_mask = 0;
2931		for (i = NVKM_SUBDEV_NR - 1; i >= 0; i--) {
2932			struct nvkm_subdev *subdev =
2933				nvkm_device_subdev(device, i);
2934			nvkm_subdev_del(&subdev);
2935		}
2936
2937		mutex_destroy(&device->mutex);
2938
2939		nvkm_event_fini(&device->event);
2940
2941#ifdef __NetBSD__
2942		if (device->mmiosz)
2943			bus_space_unmap(device->mmiot, device->mmioh,
2944			    device->mmiosz);
2945#else
2946		if (device->pri)
2947			iounmap(device->pri);
2948#endif
2949		list_del(&device->head);
2950
2951		if (device->func->dtor)
2952			*pdevice = device->func->dtor(device);
2953		mutex_unlock(&nv_devices_mutex);
2954
2955		kfree(*pdevice);
2956		*pdevice = NULL;
2957	}
2958}
2959
2960int
2961nvkm_device_ctor(const struct nvkm_device_func *func,
2962		 const struct nvkm_device_quirk *quirk,
2963		 struct device *dev, enum nvkm_device_type type, u64 handle,
2964		 const char *name, const char *cfg, const char *dbg,
2965		 bool detect, bool mmio, u64 subdev_mask,
2966		 struct nvkm_device *device)
2967{
2968	struct nvkm_subdev *subdev;
2969	u64 mmio_base, mmio_size;
2970	u32 boot0, strap;
2971#ifdef __NetBSD__
2972	bus_space_tag_t mmiot;
2973	bus_space_handle_t mmioh;
2974#else
2975	void __iomem *map;
2976#endif
2977	int ret = -EEXIST, i;
2978	unsigned chipset;
2979
2980	mutex_lock(&nv_devices_mutex);
2981	if (nvkm_device_find_locked(handle))
2982		goto done;
2983
2984	device->func = func;
2985	device->quirk = quirk;
2986	device->dev = dev;
2987	device->type = type;
2988	device->handle = handle;
2989	device->cfgopt = cfg;
2990	device->dbgopt = dbg;
2991	device->name = name;
2992	list_add_tail(&device->head, &nv_devices);
2993	device->debug = nvkm_dbgopt(device->dbgopt, "device");
2994
2995	ret = nvkm_event_init(&nvkm_device_event_func, 1, 1, &device->event);
2996	if (ret)
2997		goto done;
2998
2999#ifdef __NetBSD__
3000	mmiot = device->func->resource_tag(device, 0);
3001#endif
3002	mmio_base = device->func->resource_addr(device, 0);
3003	mmio_size = device->func->resource_size(device, 0);
3004
3005	/* identify the chipset, and determine classes of subdev/engines */
3006	if (detect) {
3007#ifdef __NetBSD__
3008		if (mmio_size < 0x102000) {
3009			ret = -ENOMEM;
3010			goto done;
3011		}
3012		/* XXX errno NetBSD->Linux */
3013		ret = -bus_space_map(mmiot, mmio_base, 0x102000, 0, &mmioh);
3014		if (ret)
3015			goto done;
3016#ifndef __BIG_ENDIAN
3017		if (bus_space_read_stream_4(mmiot, mmioh, 4) != 0)
3018#else
3019		if (bus_space_read_stream_4(mmiot, mmioh, 4) == 0)
3020#endif
3021		{
3022			bus_space_write_stream_4(mmiot, mmioh, 4, 0x01000001);
3023			bus_space_read_stream_4(mmiot, mmioh, 0);
3024		}
3025
3026		/* read boot0 and strapping information */
3027		boot0 = bus_space_read_stream_4(mmiot, mmioh, 0x000000);
3028		strap = bus_space_read_stream_4(mmiot, mmioh, 0x101000);
3029		bus_space_unmap(mmiot, mmioh, 0x102000);
3030#else
3031		map = ioremap(mmio_base, 0x102000);
3032		if (ret = -ENOMEM, map == NULL)
3033			goto done;
3034
3035		/* switch mmio to cpu's native endianness */
3036#ifndef __BIG_ENDIAN
3037		if (ioread32_native(map + 0x000004) != 0x00000000) {
3038#else
3039		if (ioread32_native(map + 0x000004) == 0x00000000) {
3040#endif
3041			iowrite32_native(0x01000001, map + 0x000004);
3042			ioread32_native(map);
3043		}
3044
3045		/* read boot0 and strapping information */
3046		boot0 = ioread32_native(map + 0x000000);
3047		strap = ioread32_native(map + 0x101000);
3048		iounmap(map);
3049#endif
3050
3051		/* chipset can be overridden for devel/testing purposes */
3052		chipset = nvkm_longopt(device->cfgopt, "NvChipset", 0);
3053		if (chipset) {
3054			u32 override_boot0;
3055
3056			if (chipset >= 0x10) {
3057				override_boot0  = ((chipset & 0x1ff) << 20);
3058				override_boot0 |= 0x000000a1;
3059			} else {
3060				if (chipset != 0x04)
3061					override_boot0 = 0x20104000;
3062				else
3063					override_boot0 = 0x20004000;
3064			}
3065
3066			nvdev_warn(device, "CHIPSET OVERRIDE: %08x -> %08x\n",
3067				   boot0, override_boot0);
3068			boot0 = override_boot0;
3069		}
3070
3071		/* determine chipset and derive architecture from it */
3072		if ((boot0 & 0x1f000000) > 0) {
3073			device->chipset = (boot0 & 0x1ff00000) >> 20;
3074			device->chiprev = (boot0 & 0x000000ff);
3075			switch (device->chipset & 0x1f0) {
3076			case 0x010: {
3077				if (0x461 & (1 << (device->chipset & 0xf)))
3078					device->card_type = NV_10;
3079				else
3080					device->card_type = NV_11;
3081				device->chiprev = 0x00;
3082				break;
3083			}
3084			case 0x020: device->card_type = NV_20; break;
3085			case 0x030: device->card_type = NV_30; break;
3086			case 0x040:
3087			case 0x060: device->card_type = NV_40; break;
3088			case 0x050:
3089			case 0x080:
3090			case 0x090:
3091			case 0x0a0: device->card_type = NV_50; break;
3092			case 0x0c0:
3093			case 0x0d0: device->card_type = NV_C0; break;
3094			case 0x0e0:
3095			case 0x0f0:
3096			case 0x100: device->card_type = NV_E0; break;
3097			case 0x110:
3098			case 0x120: device->card_type = GM100; break;
3099			case 0x130: device->card_type = GP100; break;
3100			case 0x140: device->card_type = GV100; break;
3101			case 0x160: device->card_type = TU100; break;
3102			default:
3103				break;
3104			}
3105		} else
3106		if ((boot0 & 0xff00fff0) == 0x20004000) {
3107			if (boot0 & 0x00f00000)
3108				device->chipset = 0x05;
3109			else
3110				device->chipset = 0x04;
3111			device->card_type = NV_04;
3112		}
3113
3114		switch (device->chipset) {
3115		case 0x004: device->chip = &nv4_chipset; break;
3116		case 0x005: device->chip = &nv5_chipset; break;
3117		case 0x010: device->chip = &nv10_chipset; break;
3118		case 0x011: device->chip = &nv11_chipset; break;
3119		case 0x015: device->chip = &nv15_chipset; break;
3120		case 0x017: device->chip = &nv17_chipset; break;
3121		case 0x018: device->chip = &nv18_chipset; break;
3122		case 0x01a: device->chip = &nv1a_chipset; break;
3123		case 0x01f: device->chip = &nv1f_chipset; break;
3124		case 0x020: device->chip = &nv20_chipset; break;
3125		case 0x025: device->chip = &nv25_chipset; break;
3126		case 0x028: device->chip = &nv28_chipset; break;
3127		case 0x02a: device->chip = &nv2a_chipset; break;
3128		case 0x030: device->chip = &nv30_chipset; break;
3129		case 0x031: device->chip = &nv31_chipset; break;
3130		case 0x034: device->chip = &nv34_chipset; break;
3131		case 0x035: device->chip = &nv35_chipset; break;
3132		case 0x036: device->chip = &nv36_chipset; break;
3133		case 0x040: device->chip = &nv40_chipset; break;
3134		case 0x041: device->chip = &nv41_chipset; break;
3135		case 0x042: device->chip = &nv42_chipset; break;
3136		case 0x043: device->chip = &nv43_chipset; break;
3137		case 0x044: device->chip = &nv44_chipset; break;
3138		case 0x045: device->chip = &nv45_chipset; break;
3139		case 0x046: device->chip = &nv46_chipset; break;
3140		case 0x047: device->chip = &nv47_chipset; break;
3141		case 0x049: device->chip = &nv49_chipset; break;
3142		case 0x04a: device->chip = &nv4a_chipset; break;
3143		case 0x04b: device->chip = &nv4b_chipset; break;
3144		case 0x04c: device->chip = &nv4c_chipset; break;
3145		case 0x04e: device->chip = &nv4e_chipset; break;
3146		case 0x050: device->chip = &nv50_chipset; break;
3147		case 0x063: device->chip = &nv63_chipset; break;
3148		case 0x067: device->chip = &nv67_chipset; break;
3149		case 0x068: device->chip = &nv68_chipset; break;
3150		case 0x084: device->chip = &nv84_chipset; break;
3151		case 0x086: device->chip = &nv86_chipset; break;
3152		case 0x092: device->chip = &nv92_chipset; break;
3153		case 0x094: device->chip = &nv94_chipset; break;
3154		case 0x096: device->chip = &nv96_chipset; break;
3155		case 0x098: device->chip = &nv98_chipset; break;
3156		case 0x0a0: device->chip = &nva0_chipset; break;
3157		case 0x0a3: device->chip = &nva3_chipset; break;
3158		case 0x0a5: device->chip = &nva5_chipset; break;
3159		case 0x0a8: device->chip = &nva8_chipset; break;
3160		case 0x0aa: device->chip = &nvaa_chipset; break;
3161		case 0x0ac: device->chip = &nvac_chipset; break;
3162		case 0x0af: device->chip = &nvaf_chipset; break;
3163		case 0x0c0: device->chip = &nvc0_chipset; break;
3164		case 0x0c1: device->chip = &nvc1_chipset; break;
3165		case 0x0c3: device->chip = &nvc3_chipset; break;
3166		case 0x0c4: device->chip = &nvc4_chipset; break;
3167		case 0x0c8: device->chip = &nvc8_chipset; break;
3168		case 0x0ce: device->chip = &nvce_chipset; break;
3169		case 0x0cf: device->chip = &nvcf_chipset; break;
3170		case 0x0d7: device->chip = &nvd7_chipset; break;
3171		case 0x0d9: device->chip = &nvd9_chipset; break;
3172		case 0x0e4: device->chip = &nve4_chipset; break;
3173		case 0x0e6: device->chip = &nve6_chipset; break;
3174		case 0x0e7: device->chip = &nve7_chipset; break;
3175		case 0x0ea: device->chip = &nvea_chipset; break;
3176		case 0x0f0: device->chip = &nvf0_chipset; break;
3177		case 0x0f1: device->chip = &nvf1_chipset; break;
3178		case 0x106: device->chip = &nv106_chipset; break;
3179		case 0x108: device->chip = &nv108_chipset; break;
3180		case 0x117: device->chip = &nv117_chipset; break;
3181		case 0x118: device->chip = &nv118_chipset; break;
3182		case 0x120: device->chip = &nv120_chipset; break;
3183		case 0x124: device->chip = &nv124_chipset; break;
3184		case 0x126: device->chip = &nv126_chipset; break;
3185		case 0x12b: device->chip = &nv12b_chipset; break;
3186		case 0x130: device->chip = &nv130_chipset; break;
3187		case 0x132: device->chip = &nv132_chipset; break;
3188		case 0x134: device->chip = &nv134_chipset; break;
3189		case 0x136: device->chip = &nv136_chipset; break;
3190		case 0x137: device->chip = &nv137_chipset; break;
3191		case 0x138: device->chip = &nv138_chipset; break;
3192		case 0x13b: device->chip = &nv13b_chipset; break;
3193		case 0x140: device->chip = &nv140_chipset; break;
3194		case 0x162: device->chip = &nv162_chipset; break;
3195		case 0x164: device->chip = &nv164_chipset; break;
3196		case 0x166: device->chip = &nv166_chipset; break;
3197		case 0x167: device->chip = &nv167_chipset; break;
3198		case 0x168: device->chip = &nv168_chipset; break;
3199		default:
3200			nvdev_error(device, "unknown chipset (%08x)\n", boot0);
3201			goto done;
3202		}
3203
3204		nvdev_info(device, "NVIDIA %s (%08x)\n",
3205			   device->chip->name, boot0);
3206
3207		/* determine frequency of timing crystal */
3208		if ( device->card_type <= NV_10 || device->chipset < 0x17 ||
3209		    (device->chipset >= 0x20 && device->chipset < 0x25))
3210			strap &= 0x00000040;
3211		else
3212			strap &= 0x00400040;
3213
3214		switch (strap) {
3215		case 0x00000000: device->crystal = 13500; break;
3216		case 0x00000040: device->crystal = 14318; break;
3217		case 0x00400000: device->crystal = 27000; break;
3218		case 0x00400040: device->crystal = 25000; break;
3219		}
3220	} else {
3221		device->chip = &null_chipset;
3222	}
3223
3224	if (!device->name)
3225		device->name = device->chip->name;
3226
3227	if (mmio) {
3228#ifdef __NetBSD__
3229		/* XXX errno NetBSD->Linux */
3230		ret = -bus_space_map(mmiot, mmio_base, mmio_size,
3231		    BUS_SPACE_MAP_LINEAR, &mmioh);
3232		if (ret) {
3233			nvdev_error(device, "unable to map device registers\n");
3234			goto done; /* XXX Linux leaks mutex */
3235		}
3236		device->mmiot = mmiot;
3237		device->mmioh = mmioh;
3238		device->mmioaddr = mmio_base;
3239		device->mmiosz = mmio_size;
3240#else
3241		device->pri = ioremap(mmio_base, mmio_size);
3242		if (!device->pri) {
3243			nvdev_error(device, "unable to map PRI\n");
3244			ret = -ENOMEM;
3245			goto done;
3246		}
3247#endif
3248	}
3249
3250	mutex_init(&device->mutex);
3251
3252	for (i = 0; i < NVKM_SUBDEV_NR; i++) {
3253#define _(s,m) case s:                                                         \
3254	if (device->chip->m && (subdev_mask & (1ULL << (s)))) {                \
3255		ret = device->chip->m(device, (s), &device->m);                \
3256		if (ret) {                                                     \
3257			subdev = nvkm_device_subdev(device, (s));              \
3258			nvkm_subdev_del(&subdev);                              \
3259			device->m = NULL;                                      \
3260			if (ret != -ENODEV) {                                  \
3261				nvdev_error(device, "%s ctor failed, %d\n",    \
3262					    nvkm_subdev_name[s], ret);         \
3263				goto done;                                     \
3264			}                                                      \
3265		}                                                              \
3266	}                                                                      \
3267	break
3268		switch (i) {
3269		_(NVKM_SUBDEV_ACR     ,      acr);
3270		_(NVKM_SUBDEV_BAR     ,      bar);
3271		_(NVKM_SUBDEV_VBIOS   ,     bios);
3272		_(NVKM_SUBDEV_BUS     ,      bus);
3273		_(NVKM_SUBDEV_CLK     ,      clk);
3274		_(NVKM_SUBDEV_DEVINIT ,  devinit);
3275		_(NVKM_SUBDEV_FAULT   ,    fault);
3276		_(NVKM_SUBDEV_FB      ,       fb);
3277		_(NVKM_SUBDEV_FUSE    ,     fuse);
3278		_(NVKM_SUBDEV_GPIO    ,     gpio);
3279		_(NVKM_SUBDEV_GSP     ,      gsp);
3280		_(NVKM_SUBDEV_I2C     ,      i2c);
3281		_(NVKM_SUBDEV_IBUS    ,     ibus);
3282		_(NVKM_SUBDEV_ICCSENSE, iccsense);
3283		_(NVKM_SUBDEV_INSTMEM ,     imem);
3284		_(NVKM_SUBDEV_LTC     ,      ltc);
3285		_(NVKM_SUBDEV_MC      ,       mc);
3286		_(NVKM_SUBDEV_MMU     ,      mmu);
3287		_(NVKM_SUBDEV_MXM     ,      mxm);
3288		_(NVKM_SUBDEV_PCI     ,      pci);
3289		_(NVKM_SUBDEV_PMU     ,      pmu);
3290		_(NVKM_SUBDEV_THERM   ,    therm);
3291		_(NVKM_SUBDEV_TIMER   ,    timer);
3292		_(NVKM_SUBDEV_TOP     ,      top);
3293		_(NVKM_SUBDEV_VOLT    ,     volt);
3294		_(NVKM_ENGINE_BSP     ,      bsp);
3295		_(NVKM_ENGINE_CE0     ,    ce[0]);
3296		_(NVKM_ENGINE_CE1     ,    ce[1]);
3297		_(NVKM_ENGINE_CE2     ,    ce[2]);
3298		_(NVKM_ENGINE_CE3     ,    ce[3]);
3299		_(NVKM_ENGINE_CE4     ,    ce[4]);
3300		_(NVKM_ENGINE_CE5     ,    ce[5]);
3301		_(NVKM_ENGINE_CE6     ,    ce[6]);
3302		_(NVKM_ENGINE_CE7     ,    ce[7]);
3303		_(NVKM_ENGINE_CE8     ,    ce[8]);
3304		_(NVKM_ENGINE_CIPHER  ,   cipher);
3305		_(NVKM_ENGINE_DISP    ,     disp);
3306		_(NVKM_ENGINE_DMAOBJ  ,      dma);
3307		_(NVKM_ENGINE_FIFO    ,     fifo);
3308		_(NVKM_ENGINE_GR      ,       gr);
3309		_(NVKM_ENGINE_IFB     ,      ifb);
3310		_(NVKM_ENGINE_ME      ,       me);
3311		_(NVKM_ENGINE_MPEG    ,     mpeg);
3312		_(NVKM_ENGINE_MSENC   ,    msenc);
3313		_(NVKM_ENGINE_MSPDEC  ,   mspdec);
3314		_(NVKM_ENGINE_MSPPP   ,    msppp);
3315		_(NVKM_ENGINE_MSVLD   ,    msvld);
3316		_(NVKM_ENGINE_NVENC0  , nvenc[0]);
3317		_(NVKM_ENGINE_NVENC1  , nvenc[1]);
3318		_(NVKM_ENGINE_NVENC2  , nvenc[2]);
3319		_(NVKM_ENGINE_NVDEC0  , nvdec[0]);
3320		_(NVKM_ENGINE_NVDEC1  , nvdec[1]);
3321		_(NVKM_ENGINE_NVDEC2  , nvdec[2]);
3322		_(NVKM_ENGINE_PM      ,       pm);
3323		_(NVKM_ENGINE_SEC     ,      sec);
3324		_(NVKM_ENGINE_SEC2    ,     sec2);
3325		_(NVKM_ENGINE_SW      ,       sw);
3326		_(NVKM_ENGINE_VIC     ,      vic);
3327		_(NVKM_ENGINE_VP      ,       vp);
3328		default:
3329			WARN_ON(1);
3330			continue;
3331		}
3332#undef _
3333	}
3334
3335	ret = 0;
3336done:
3337	mutex_unlock(&nv_devices_mutex);
3338	return ret;
3339}
3340