2 * Copyright 2005 Stephane Marchesin
3 * Copyright 2008 Stuart Bennett
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:
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
26 #include <linux/swab.h>
27 #include <linux/slab.h>
30 #include "drm_sarea.h"
31 #include "drm_crtc_helper.h"
32 #include <linux/vgaarb.h>
33 #include <linux/vga_switcheroo.h>
35 #include "nouveau_drv.h"
36 #include <nouveau_drm.h>
37 #include "nouveau_fbcon.h"
38 #include <core/ramht.h>
39 #include "nouveau_pm.h"
40 #include "nv50_display.h"
41 #include <engine/fifo.h>
42 #include "nouveau_fence.h"
43 #include "nouveau_software.h"
45 static void nouveau_stub_takedown(struct drm_device
*dev
) {}
46 static int nouveau_stub_init(struct drm_device
*dev
) { return 0; }
48 static int nouveau_init_engine_ptrs(struct drm_device
*dev
)
50 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
51 struct nouveau_engine
*engine
= &dev_priv
->engine
;
53 switch (dev_priv
->chipset
& 0xf0) {
55 engine
->instmem
.init
= nv04_instmem_init
;
56 engine
->instmem
.takedown
= nv04_instmem_takedown
;
57 engine
->instmem
.suspend
= nv04_instmem_suspend
;
58 engine
->instmem
.resume
= nv04_instmem_resume
;
59 engine
->instmem
.get
= nv04_instmem_get
;
60 engine
->instmem
.put
= nv04_instmem_put
;
61 engine
->instmem
.map
= nv04_instmem_map
;
62 engine
->instmem
.unmap
= nv04_instmem_unmap
;
63 engine
->instmem
.flush
= nv04_instmem_flush
;
64 engine
->display
.early_init
= nv04_display_early_init
;
65 engine
->display
.late_takedown
= nv04_display_late_takedown
;
66 engine
->display
.create
= nv04_display_create
;
67 engine
->display
.destroy
= nv04_display_destroy
;
68 engine
->display
.init
= nv04_display_init
;
69 engine
->display
.fini
= nv04_display_fini
;
70 engine
->pm
.clocks_get
= nv04_pm_clocks_get
;
71 engine
->pm
.clocks_pre
= nv04_pm_clocks_pre
;
72 engine
->pm
.clocks_set
= nv04_pm_clocks_set
;
75 engine
->instmem
.init
= nv04_instmem_init
;
76 engine
->instmem
.takedown
= nv04_instmem_takedown
;
77 engine
->instmem
.suspend
= nv04_instmem_suspend
;
78 engine
->instmem
.resume
= nv04_instmem_resume
;
79 engine
->instmem
.get
= nv04_instmem_get
;
80 engine
->instmem
.put
= nv04_instmem_put
;
81 engine
->instmem
.map
= nv04_instmem_map
;
82 engine
->instmem
.unmap
= nv04_instmem_unmap
;
83 engine
->instmem
.flush
= nv04_instmem_flush
;
84 engine
->display
.early_init
= nv04_display_early_init
;
85 engine
->display
.late_takedown
= nv04_display_late_takedown
;
86 engine
->display
.create
= nv04_display_create
;
87 engine
->display
.destroy
= nv04_display_destroy
;
88 engine
->display
.init
= nv04_display_init
;
89 engine
->display
.fini
= nv04_display_fini
;
90 engine
->pm
.clocks_get
= nv04_pm_clocks_get
;
91 engine
->pm
.clocks_pre
= nv04_pm_clocks_pre
;
92 engine
->pm
.clocks_set
= nv04_pm_clocks_set
;
95 engine
->instmem
.init
= nv04_instmem_init
;
96 engine
->instmem
.takedown
= nv04_instmem_takedown
;
97 engine
->instmem
.suspend
= nv04_instmem_suspend
;
98 engine
->instmem
.resume
= nv04_instmem_resume
;
99 engine
->instmem
.get
= nv04_instmem_get
;
100 engine
->instmem
.put
= nv04_instmem_put
;
101 engine
->instmem
.map
= nv04_instmem_map
;
102 engine
->instmem
.unmap
= nv04_instmem_unmap
;
103 engine
->instmem
.flush
= nv04_instmem_flush
;
104 engine
->display
.early_init
= nv04_display_early_init
;
105 engine
->display
.late_takedown
= nv04_display_late_takedown
;
106 engine
->display
.create
= nv04_display_create
;
107 engine
->display
.destroy
= nv04_display_destroy
;
108 engine
->display
.init
= nv04_display_init
;
109 engine
->display
.fini
= nv04_display_fini
;
110 engine
->pm
.clocks_get
= nv04_pm_clocks_get
;
111 engine
->pm
.clocks_pre
= nv04_pm_clocks_pre
;
112 engine
->pm
.clocks_set
= nv04_pm_clocks_set
;
115 engine
->instmem
.init
= nv04_instmem_init
;
116 engine
->instmem
.takedown
= nv04_instmem_takedown
;
117 engine
->instmem
.suspend
= nv04_instmem_suspend
;
118 engine
->instmem
.resume
= nv04_instmem_resume
;
119 engine
->instmem
.get
= nv04_instmem_get
;
120 engine
->instmem
.put
= nv04_instmem_put
;
121 engine
->instmem
.map
= nv04_instmem_map
;
122 engine
->instmem
.unmap
= nv04_instmem_unmap
;
123 engine
->instmem
.flush
= nv04_instmem_flush
;
124 engine
->display
.early_init
= nv04_display_early_init
;
125 engine
->display
.late_takedown
= nv04_display_late_takedown
;
126 engine
->display
.create
= nv04_display_create
;
127 engine
->display
.destroy
= nv04_display_destroy
;
128 engine
->display
.init
= nv04_display_init
;
129 engine
->display
.fini
= nv04_display_fini
;
130 engine
->pm
.clocks_get
= nv04_pm_clocks_get
;
131 engine
->pm
.clocks_pre
= nv04_pm_clocks_pre
;
132 engine
->pm
.clocks_set
= nv04_pm_clocks_set
;
133 engine
->pm
.voltage_get
= nouveau_voltage_gpio_get
;
134 engine
->pm
.voltage_set
= nouveau_voltage_gpio_set
;
138 engine
->instmem
.init
= nv04_instmem_init
;
139 engine
->instmem
.takedown
= nv04_instmem_takedown
;
140 engine
->instmem
.suspend
= nv04_instmem_suspend
;
141 engine
->instmem
.resume
= nv04_instmem_resume
;
142 engine
->instmem
.get
= nv04_instmem_get
;
143 engine
->instmem
.put
= nv04_instmem_put
;
144 engine
->instmem
.map
= nv04_instmem_map
;
145 engine
->instmem
.unmap
= nv04_instmem_unmap
;
146 engine
->instmem
.flush
= nv04_instmem_flush
;
147 engine
->display
.early_init
= nv04_display_early_init
;
148 engine
->display
.late_takedown
= nv04_display_late_takedown
;
149 engine
->display
.create
= nv04_display_create
;
150 engine
->display
.destroy
= nv04_display_destroy
;
151 engine
->display
.init
= nv04_display_init
;
152 engine
->display
.fini
= nv04_display_fini
;
153 engine
->pm
.clocks_get
= nv40_pm_clocks_get
;
154 engine
->pm
.clocks_pre
= nv40_pm_clocks_pre
;
155 engine
->pm
.clocks_set
= nv40_pm_clocks_set
;
156 engine
->pm
.voltage_get
= nouveau_voltage_gpio_get
;
157 engine
->pm
.voltage_set
= nouveau_voltage_gpio_set
;
158 engine
->pm
.temp_get
= nv40_temp_get
;
159 engine
->pm
.pwm_get
= nv40_pm_pwm_get
;
160 engine
->pm
.pwm_set
= nv40_pm_pwm_set
;
163 case 0x80: /* gotta love NVIDIA's consistency.. */
166 engine
->instmem
.init
= nv50_instmem_init
;
167 engine
->instmem
.takedown
= nv50_instmem_takedown
;
168 engine
->instmem
.suspend
= nv50_instmem_suspend
;
169 engine
->instmem
.resume
= nv50_instmem_resume
;
170 engine
->instmem
.get
= nv50_instmem_get
;
171 engine
->instmem
.put
= nv50_instmem_put
;
172 engine
->instmem
.map
= nv50_instmem_map
;
173 engine
->instmem
.unmap
= nv50_instmem_unmap
;
174 if (dev_priv
->chipset
== 0x50)
175 engine
->instmem
.flush
= nv50_instmem_flush
;
177 engine
->instmem
.flush
= nv84_instmem_flush
;
178 engine
->display
.early_init
= nv50_display_early_init
;
179 engine
->display
.late_takedown
= nv50_display_late_takedown
;
180 engine
->display
.create
= nv50_display_create
;
181 engine
->display
.destroy
= nv50_display_destroy
;
182 engine
->display
.init
= nv50_display_init
;
183 engine
->display
.fini
= nv50_display_fini
;
184 switch (dev_priv
->chipset
) {
195 engine
->pm
.clocks_get
= nv50_pm_clocks_get
;
196 engine
->pm
.clocks_pre
= nv50_pm_clocks_pre
;
197 engine
->pm
.clocks_set
= nv50_pm_clocks_set
;
200 engine
->pm
.clocks_get
= nva3_pm_clocks_get
;
201 engine
->pm
.clocks_pre
= nva3_pm_clocks_pre
;
202 engine
->pm
.clocks_set
= nva3_pm_clocks_set
;
205 engine
->pm
.voltage_get
= nouveau_voltage_gpio_get
;
206 engine
->pm
.voltage_set
= nouveau_voltage_gpio_set
;
207 if (dev_priv
->chipset
>= 0x84)
208 engine
->pm
.temp_get
= nv84_temp_get
;
210 engine
->pm
.temp_get
= nv40_temp_get
;
211 engine
->pm
.pwm_get
= nv50_pm_pwm_get
;
212 engine
->pm
.pwm_set
= nv50_pm_pwm_set
;
215 engine
->instmem
.init
= nvc0_instmem_init
;
216 engine
->instmem
.takedown
= nvc0_instmem_takedown
;
217 engine
->instmem
.suspend
= nvc0_instmem_suspend
;
218 engine
->instmem
.resume
= nvc0_instmem_resume
;
219 engine
->instmem
.get
= nv50_instmem_get
;
220 engine
->instmem
.put
= nv50_instmem_put
;
221 engine
->instmem
.map
= nv50_instmem_map
;
222 engine
->instmem
.unmap
= nv50_instmem_unmap
;
223 engine
->instmem
.flush
= nv84_instmem_flush
;
224 engine
->display
.early_init
= nv50_display_early_init
;
225 engine
->display
.late_takedown
= nv50_display_late_takedown
;
226 engine
->display
.create
= nv50_display_create
;
227 engine
->display
.destroy
= nv50_display_destroy
;
228 engine
->display
.init
= nv50_display_init
;
229 engine
->display
.fini
= nv50_display_fini
;
230 engine
->pm
.temp_get
= nv84_temp_get
;
231 engine
->pm
.clocks_get
= nvc0_pm_clocks_get
;
232 engine
->pm
.clocks_pre
= nvc0_pm_clocks_pre
;
233 engine
->pm
.clocks_set
= nvc0_pm_clocks_set
;
234 engine
->pm
.voltage_get
= nouveau_voltage_gpio_get
;
235 engine
->pm
.voltage_set
= nouveau_voltage_gpio_set
;
236 engine
->pm
.pwm_get
= nv50_pm_pwm_get
;
237 engine
->pm
.pwm_set
= nv50_pm_pwm_set
;
240 engine
->instmem
.init
= nvc0_instmem_init
;
241 engine
->instmem
.takedown
= nvc0_instmem_takedown
;
242 engine
->instmem
.suspend
= nvc0_instmem_suspend
;
243 engine
->instmem
.resume
= nvc0_instmem_resume
;
244 engine
->instmem
.get
= nv50_instmem_get
;
245 engine
->instmem
.put
= nv50_instmem_put
;
246 engine
->instmem
.map
= nv50_instmem_map
;
247 engine
->instmem
.unmap
= nv50_instmem_unmap
;
248 engine
->instmem
.flush
= nv84_instmem_flush
;
249 engine
->display
.early_init
= nouveau_stub_init
;
250 engine
->display
.late_takedown
= nouveau_stub_takedown
;
251 engine
->display
.create
= nvd0_display_create
;
252 engine
->display
.destroy
= nvd0_display_destroy
;
253 engine
->display
.init
= nvd0_display_init
;
254 engine
->display
.fini
= nvd0_display_fini
;
255 engine
->pm
.temp_get
= nv84_temp_get
;
256 engine
->pm
.clocks_get
= nvc0_pm_clocks_get
;
257 engine
->pm
.clocks_pre
= nvc0_pm_clocks_pre
;
258 engine
->pm
.clocks_set
= nvc0_pm_clocks_set
;
259 engine
->pm
.voltage_get
= nouveau_voltage_gpio_get
;
260 engine
->pm
.voltage_set
= nouveau_voltage_gpio_set
;
263 engine
->instmem
.init
= nvc0_instmem_init
;
264 engine
->instmem
.takedown
= nvc0_instmem_takedown
;
265 engine
->instmem
.suspend
= nvc0_instmem_suspend
;
266 engine
->instmem
.resume
= nvc0_instmem_resume
;
267 engine
->instmem
.get
= nv50_instmem_get
;
268 engine
->instmem
.put
= nv50_instmem_put
;
269 engine
->instmem
.map
= nv50_instmem_map
;
270 engine
->instmem
.unmap
= nv50_instmem_unmap
;
271 engine
->instmem
.flush
= nv84_instmem_flush
;
272 engine
->display
.early_init
= nouveau_stub_init
;
273 engine
->display
.late_takedown
= nouveau_stub_takedown
;
274 engine
->display
.create
= nvd0_display_create
;
275 engine
->display
.destroy
= nvd0_display_destroy
;
276 engine
->display
.init
= nvd0_display_init
;
277 engine
->display
.fini
= nvd0_display_fini
;
280 NV_ERROR(dev
, "NV%02x unsupported\n", dev_priv
->chipset
);
285 if (nouveau_modeset
== 2) {
286 engine
->display
.early_init
= nouveau_stub_init
;
287 engine
->display
.late_takedown
= nouveau_stub_takedown
;
288 engine
->display
.create
= nouveau_stub_init
;
289 engine
->display
.init
= nouveau_stub_init
;
290 engine
->display
.destroy
= nouveau_stub_takedown
;
297 nouveau_vga_set_decode(void *priv
, bool state
)
299 struct drm_device
*dev
= priv
;
300 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
302 if (dev_priv
->chipset
>= 0x40)
303 nv_wr32(dev
, 0x88054, state
);
305 nv_wr32(dev
, 0x1854, state
);
308 return VGA_RSRC_LEGACY_IO
| VGA_RSRC_LEGACY_MEM
|
309 VGA_RSRC_NORMAL_IO
| VGA_RSRC_NORMAL_MEM
;
311 return VGA_RSRC_NORMAL_IO
| VGA_RSRC_NORMAL_MEM
;
314 static void nouveau_switcheroo_set_state(struct pci_dev
*pdev
,
315 enum vga_switcheroo_state state
)
317 struct drm_device
*dev
= pci_get_drvdata(pdev
);
318 pm_message_t pmm
= { .event
= PM_EVENT_SUSPEND
};
319 if (state
== VGA_SWITCHEROO_ON
) {
320 printk(KERN_ERR
"VGA switcheroo: switched nouveau on\n");
321 dev
->switch_power_state
= DRM_SWITCH_POWER_CHANGING
;
322 nouveau_pci_resume(pdev
);
323 drm_kms_helper_poll_enable(dev
);
324 dev
->switch_power_state
= DRM_SWITCH_POWER_ON
;
326 printk(KERN_ERR
"VGA switcheroo: switched nouveau off\n");
327 dev
->switch_power_state
= DRM_SWITCH_POWER_CHANGING
;
328 drm_kms_helper_poll_disable(dev
);
329 nouveau_switcheroo_optimus_dsm();
330 nouveau_pci_suspend(pdev
, pmm
);
331 dev
->switch_power_state
= DRM_SWITCH_POWER_OFF
;
335 static void nouveau_switcheroo_reprobe(struct pci_dev
*pdev
)
337 struct drm_device
*dev
= pci_get_drvdata(pdev
);
338 nouveau_fbcon_output_poll_changed(dev
);
341 static bool nouveau_switcheroo_can_switch(struct pci_dev
*pdev
)
343 struct drm_device
*dev
= pci_get_drvdata(pdev
);
346 spin_lock(&dev
->count_lock
);
347 can_switch
= (dev
->open_count
== 0);
348 spin_unlock(&dev
->count_lock
);
353 nouveau_card_channel_fini(struct drm_device
*dev
)
355 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
357 if (dev_priv
->channel
)
358 nouveau_channel_put_unlocked(&dev_priv
->channel
);
362 nouveau_card_channel_init(struct drm_device
*dev
)
364 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
365 struct nouveau_channel
*chan
;
368 ret
= nouveau_channel_alloc(dev
, &chan
, NULL
, NvDmaFB
, NvDmaTT
);
369 dev_priv
->channel
= chan
;
372 mutex_unlock(&dev_priv
->channel
->mutex
);
374 nouveau_bo_move_init(chan
);
378 static const struct vga_switcheroo_client_ops nouveau_switcheroo_ops
= {
379 .set_gpu_state
= nouveau_switcheroo_set_state
,
380 .reprobe
= nouveau_switcheroo_reprobe
,
381 .can_switch
= nouveau_switcheroo_can_switch
,
385 nouveau_card_init(struct drm_device
*dev
)
387 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
388 struct nouveau_engine
*engine
;
391 vga_client_register(dev
->pdev
, dev
, NULL
, nouveau_vga_set_decode
);
392 vga_switcheroo_register_client(dev
->pdev
, &nouveau_switcheroo_ops
);
394 /* Initialise internal driver API hooks */
395 ret
= nouveau_init_engine_ptrs(dev
);
398 engine
= &dev_priv
->engine
;
399 spin_lock_init(&dev_priv
->channels
.lock
);
400 spin_lock_init(&dev_priv
->tile
.lock
);
401 spin_lock_init(&dev_priv
->context_switch_lock
);
402 spin_lock_init(&dev_priv
->vm_lock
);
404 /* Make the CRTCs and I2C buses accessible */
405 ret
= engine
->display
.early_init(dev
);
409 /* Parse BIOS tables / Run init tables if card not POSTed */
410 ret
= nouveau_bios_init(dev
);
412 goto out_display_early
;
414 /* workaround an odd issue on nvc1 by disabling the device's
415 * nosnoop capability. hopefully won't cause issues until a
416 * better fix is found - assuming there is one...
418 if (dev_priv
->chipset
== 0xc1) {
419 nv_mask(dev
, 0x00088080, 0x00000800, 0x00000000);
422 ret
= nouveau_gpuobj_init(dev
);
426 ret
= engine
->instmem
.init(dev
);
430 ret
= nouveau_mem_vram_init(dev
);
434 ret
= nouveau_mem_gart_init(dev
);
438 if (!dev_priv
->noaccel
) {
439 switch (dev_priv
->card_type
) {
441 nv04_fifo_create(dev
);
446 if (dev_priv
->chipset
< 0x17)
447 nv10_fifo_create(dev
);
449 nv17_fifo_create(dev
);
452 nv40_fifo_create(dev
);
455 if (dev_priv
->chipset
== 0x50)
456 nv50_fifo_create(dev
);
458 nv84_fifo_create(dev
);
462 nvc0_fifo_create(dev
);
465 nve0_fifo_create(dev
);
471 switch (dev_priv
->card_type
) {
473 nv04_fence_create(dev
);
480 if (dev_priv
->chipset
< 0x84)
481 nv10_fence_create(dev
);
483 nv84_fence_create(dev
);
488 nvc0_fence_create(dev
);
494 switch (dev_priv
->card_type
) {
500 nv04_software_create(dev
);
503 nv50_software_create(dev
);
508 nvc0_software_create(dev
);
514 switch (dev_priv
->card_type
) {
516 nv04_graph_create(dev
);
519 nv10_graph_create(dev
);
523 nv20_graph_create(dev
);
526 nv40_graph_create(dev
);
529 nv50_graph_create(dev
);
533 nvc0_graph_create(dev
);
536 nve0_graph_create(dev
);
542 switch (dev_priv
->chipset
) {
549 nv84_crypt_create(dev
);
554 nv98_crypt_create(dev
);
558 switch (dev_priv
->card_type
) {
560 switch (dev_priv
->chipset
) {
564 nva3_copy_create(dev
);
569 if (!(nv_rd32(dev
, 0x022500) & 0x00000200))
570 nvc0_copy_create(dev
, 1);
572 if (!(nv_rd32(dev
, 0x022500) & 0x00000100))
573 nvc0_copy_create(dev
, 0);
579 if (dev_priv
->chipset
>= 0xa3 || dev_priv
->chipset
== 0x98) {
580 nv84_bsp_create(dev
);
582 nv98_ppp_create(dev
);
584 if (dev_priv
->chipset
>= 0x84) {
585 nv50_mpeg_create(dev
);
586 nv84_bsp_create(dev
);
589 if (dev_priv
->chipset
>= 0x50) {
590 nv50_mpeg_create(dev
);
592 if (dev_priv
->card_type
== NV_40
||
593 dev_priv
->chipset
== 0x31 ||
594 dev_priv
->chipset
== 0x34 ||
595 dev_priv
->chipset
== 0x36) {
596 nv31_mpeg_create(dev
);
599 for (e
= 0; e
< NVOBJ_ENGINE_NR
; e
++) {
600 if (dev_priv
->eng
[e
]) {
601 ret
= dev_priv
->eng
[e
]->init(dev
, e
);
608 ret
= nouveau_irq_init(dev
);
612 ret
= nouveau_display_create(dev
);
616 nouveau_backlight_init(dev
);
617 nouveau_pm_init(dev
);
619 if (dev_priv
->eng
[NVOBJ_ENGINE_GR
]) {
620 ret
= nouveau_card_channel_init(dev
);
625 if (dev
->mode_config
.num_crtc
) {
626 ret
= nouveau_display_init(dev
);
630 nouveau_fbcon_init(dev
);
636 nouveau_card_channel_fini(dev
);
638 nouveau_pm_fini(dev
);
639 nouveau_backlight_exit(dev
);
640 nouveau_display_destroy(dev
);
642 nouveau_irq_fini(dev
);
644 if (!dev_priv
->noaccel
) {
645 for (e
= e
- 1; e
>= 0; e
--) {
646 if (!dev_priv
->eng
[e
])
648 dev_priv
->eng
[e
]->fini(dev
, e
, false);
649 dev_priv
->eng
[e
]->destroy(dev
,e
);
652 nouveau_mem_gart_fini(dev
);
654 nouveau_mem_vram_fini(dev
);
656 engine
->instmem
.takedown(dev
);
658 nouveau_gpuobj_takedown(dev
);
660 nouveau_bios_takedown(dev
);
662 engine
->display
.late_takedown(dev
);
664 vga_switcheroo_unregister_client(dev
->pdev
);
665 vga_client_register(dev
->pdev
, NULL
, NULL
, NULL
);
669 static void nouveau_card_takedown(struct drm_device
*dev
)
671 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
672 struct nouveau_engine
*engine
= &dev_priv
->engine
;
675 if (dev
->mode_config
.num_crtc
) {
676 nouveau_fbcon_fini(dev
);
677 nouveau_display_fini(dev
);
680 nouveau_card_channel_fini(dev
);
681 nouveau_pm_fini(dev
);
682 nouveau_backlight_exit(dev
);
683 nouveau_display_destroy(dev
);
685 if (!dev_priv
->noaccel
) {
686 for (e
= NVOBJ_ENGINE_NR
- 1; e
>= 0; e
--) {
687 if (dev_priv
->eng
[e
]) {
688 dev_priv
->eng
[e
]->fini(dev
, e
, false);
689 dev_priv
->eng
[e
]->destroy(dev
,e
);
694 if (dev_priv
->vga_ram
) {
695 nouveau_bo_unpin(dev_priv
->vga_ram
);
696 nouveau_bo_ref(NULL
, &dev_priv
->vga_ram
);
699 mutex_lock(&dev
->struct_mutex
);
700 ttm_bo_clean_mm(&dev_priv
->ttm
.bdev
, TTM_PL_VRAM
);
701 ttm_bo_clean_mm(&dev_priv
->ttm
.bdev
, TTM_PL_TT
);
702 mutex_unlock(&dev
->struct_mutex
);
703 nouveau_mem_gart_fini(dev
);
704 nouveau_mem_vram_fini(dev
);
706 engine
->instmem
.takedown(dev
);
707 nouveau_gpuobj_takedown(dev
);
709 nouveau_bios_takedown(dev
);
710 engine
->display
.late_takedown(dev
);
712 nouveau_irq_fini(dev
);
714 vga_switcheroo_unregister_client(dev
->pdev
);
715 vga_client_register(dev
->pdev
, NULL
, NULL
, NULL
);
719 nouveau_open(struct drm_device
*dev
, struct drm_file
*file_priv
)
721 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
722 struct nouveau_fpriv
*fpriv
;
725 fpriv
= kzalloc(sizeof(*fpriv
), GFP_KERNEL
);
726 if (unlikely(!fpriv
))
729 spin_lock_init(&fpriv
->lock
);
730 INIT_LIST_HEAD(&fpriv
->channels
);
732 if (dev_priv
->card_type
== NV_50
) {
733 ret
= nouveau_vm_new(dev
, 0, (1ULL << 40), 0x0020000000ULL
,
740 if (dev_priv
->card_type
>= NV_C0
) {
741 ret
= nouveau_vm_new(dev
, 0, (1ULL << 40), 0x0008000000ULL
,
749 file_priv
->driver_priv
= fpriv
;
753 /* here a client dies, release the stuff that was allocated for its
755 void nouveau_preclose(struct drm_device
*dev
, struct drm_file
*file_priv
)
757 nouveau_channel_cleanup(dev
, file_priv
);
761 nouveau_postclose(struct drm_device
*dev
, struct drm_file
*file_priv
)
763 struct nouveau_fpriv
*fpriv
= nouveau_fpriv(file_priv
);
764 nouveau_vm_ref(NULL
, &fpriv
->vm
, NULL
);
768 /* first module load, setup the mmio/fb mapping */
769 /* KMS: we need mmio at load time, not when the first drm client opens. */
770 int nouveau_firstopen(struct drm_device
*dev
)
775 /* if we have an OF card, copy vbios to RAMIN */
776 static void nouveau_OF_copy_vbios_to_ramin(struct drm_device
*dev
)
778 #if defined(__powerpc__)
780 const uint32_t *bios
;
781 struct device_node
*dn
= pci_device_to_OF_node(dev
->pdev
);
783 NV_INFO(dev
, "Unable to get the OF node\n");
787 bios
= of_get_property(dn
, "NVDA,BMP", &size
);
789 for (i
= 0; i
< size
; i
+= 4)
790 nv_wi32(dev
, i
, bios
[i
/4]);
791 NV_INFO(dev
, "OF bios successfully copied (%d bytes)\n", size
);
793 NV_INFO(dev
, "Unable to get the OF bios\n");
798 static struct apertures_struct
*nouveau_get_apertures(struct drm_device
*dev
)
800 struct pci_dev
*pdev
= dev
->pdev
;
801 struct apertures_struct
*aper
= alloc_apertures(3);
805 aper
->ranges
[0].base
= pci_resource_start(pdev
, 1);
806 aper
->ranges
[0].size
= pci_resource_len(pdev
, 1);
809 if (pci_resource_len(pdev
, 2)) {
810 aper
->ranges
[aper
->count
].base
= pci_resource_start(pdev
, 2);
811 aper
->ranges
[aper
->count
].size
= pci_resource_len(pdev
, 2);
815 if (pci_resource_len(pdev
, 3)) {
816 aper
->ranges
[aper
->count
].base
= pci_resource_start(pdev
, 3);
817 aper
->ranges
[aper
->count
].size
= pci_resource_len(pdev
, 3);
824 static int nouveau_remove_conflicting_drivers(struct drm_device
*dev
)
826 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
827 bool primary
= false;
828 dev_priv
->apertures
= nouveau_get_apertures(dev
);
829 if (!dev_priv
->apertures
)
833 primary
= dev
->pdev
->resource
[PCI_ROM_RESOURCE
].flags
& IORESOURCE_ROM_SHADOW
;
836 remove_conflicting_framebuffers(dev_priv
->apertures
, "nouveaufb", primary
);
841 nouveau_newpriv(struct drm_device
*dev
)
843 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
844 return dev_priv
->newpriv
;
847 int nouveau_load(struct drm_device
*dev
, unsigned long flags
)
849 struct drm_nouveau_private
*dev_priv
;
850 uint32_t reg0
= ~0, strap
;
853 dev_priv
= kzalloc(sizeof(*dev_priv
), GFP_KERNEL
);
858 dev_priv
->newpriv
= dev
->dev_private
;
859 dev
->dev_private
= dev_priv
;
862 dev_priv
->flags
= flags
& NOUVEAU_FLAGS
;
864 NV_DEBUG(dev
, "vendor: 0x%X device: 0x%X class: 0x%X\n",
865 dev
->pci_vendor
, dev
->pci_device
, dev
->pdev
->class);
867 /* determine chipset and derive architecture from it */
868 reg0
= nv_rd32(dev
, NV03_PMC_BOOT_0
);
869 if ((reg0
& 0x0f000000) > 0) {
870 dev_priv
->chipset
= (reg0
& 0xff00000) >> 20;
871 switch (dev_priv
->chipset
& 0xf0) {
875 dev_priv
->card_type
= dev_priv
->chipset
& 0xf0;
879 dev_priv
->card_type
= NV_40
;
885 dev_priv
->card_type
= NV_50
;
888 dev_priv
->card_type
= NV_C0
;
891 dev_priv
->card_type
= NV_D0
;
894 dev_priv
->card_type
= NV_E0
;
900 if ((reg0
& 0xff00fff0) == 0x20004000) {
901 if (reg0
& 0x00f00000)
902 dev_priv
->chipset
= 0x05;
904 dev_priv
->chipset
= 0x04;
905 dev_priv
->card_type
= NV_04
;
908 if (!dev_priv
->card_type
) {
909 NV_ERROR(dev
, "unsupported chipset 0x%08x\n", reg0
);
914 NV_INFO(dev
, "Detected an NV%02x generation card (0x%08x)\n",
915 dev_priv
->card_type
, reg0
);
917 /* determine frequency of timing crystal */
918 strap
= nv_rd32(dev
, 0x101000);
919 if ( dev_priv
->chipset
< 0x17 ||
920 (dev_priv
->chipset
>= 0x20 && dev_priv
->chipset
<= 0x25))
926 case 0x00000000: dev_priv
->crystal
= 13500; break;
927 case 0x00000040: dev_priv
->crystal
= 14318; break;
928 case 0x00400000: dev_priv
->crystal
= 27000; break;
929 case 0x00400040: dev_priv
->crystal
= 25000; break;
932 NV_DEBUG(dev
, "crystal freq: %dKHz\n", dev_priv
->crystal
);
934 /* Determine whether we'll attempt acceleration or not, some
935 * cards are disabled by default here due to them being known
936 * non-functional, or never been tested due to lack of hw.
938 dev_priv
->noaccel
= !!nouveau_noaccel
;
939 if (nouveau_noaccel
== -1) {
940 switch (dev_priv
->chipset
) {
941 case 0xd9: /* known broken */
942 case 0xe4: /* needs binary driver firmware */
943 case 0xe7: /* needs binary driver firmware */
944 NV_INFO(dev
, "acceleration disabled by default, pass "
945 "noaccel=0 to force enable\n");
946 dev_priv
->noaccel
= true;
949 dev_priv
->noaccel
= false;
954 ret
= nouveau_remove_conflicting_drivers(dev
);
958 /* Map PRAMIN BAR, or on older cards, the aperture within BAR0 */
959 if (dev_priv
->card_type
>= NV_40
) {
961 if (pci_resource_len(dev
->pdev
, ramin_bar
) == 0)
964 dev_priv
->ramin_size
= pci_resource_len(dev
->pdev
, ramin_bar
);
966 ioremap(pci_resource_start(dev
->pdev
, ramin_bar
),
967 dev_priv
->ramin_size
);
968 if (!dev_priv
->ramin
) {
969 NV_ERROR(dev
, "Failed to map PRAMIN BAR\n");
974 dev_priv
->ramin_size
= 1 * 1024 * 1024;
975 dev_priv
->ramin
= ioremap(pci_resource_start(dev
->pdev
, 0),
976 dev_priv
->ramin_size
);
977 if (!dev_priv
->ramin
) {
978 NV_ERROR(dev
, "Failed to map BAR0 PRAMIN.\n");
984 nouveau_OF_copy_vbios_to_ramin(dev
);
987 if (dev
->pci_device
== 0x01a0)
988 dev_priv
->flags
|= NV_NFORCE
;
989 else if (dev
->pci_device
== 0x01f0)
990 dev_priv
->flags
|= NV_NFORCE2
;
992 /* For kernel modesetting, init card now and bring up fbcon */
993 ret
= nouveau_card_init(dev
);
1000 iounmap(dev_priv
->ramin
);
1002 dev
->dev_private
= dev_priv
->newpriv
;
1008 void nouveau_lastclose(struct drm_device
*dev
)
1010 vga_switcheroo_process_delayed_switch();
1013 int nouveau_unload(struct drm_device
*dev
)
1015 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
1017 nouveau_card_takedown(dev
);
1019 iounmap(dev_priv
->ramin
);
1021 dev
->dev_private
= dev_priv
->newpriv
;
1026 /* Waits for PGRAPH to go completely idle */
1027 bool nouveau_wait_for_idle(struct drm_device
*dev
)
1029 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
1032 if (dev_priv
->card_type
== NV_40
)
1033 mask
&= ~NV40_PGRAPH_STATUS_SYNC_STALL
;
1035 if (!nv_wait(dev
, NV04_PGRAPH_STATUS
, mask
, 0)) {
1036 NV_ERROR(dev
, "PGRAPH idle timed out with status 0x%08x\n",
1037 nv_rd32(dev
, NV04_PGRAPH_STATUS
));