nouveau_state.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  1. /*
  2. * Copyright 2005 Stephane Marchesin
  3. * Copyright 2008 Stuart Bennett
  4. * All Rights Reserved.
  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 (including the next
  14. * paragraph) shall be included in all copies or substantial portions of the
  15. * Software.
  16. *
  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.
  24. */
  25. #include <linux/swab.h>
  26. #include <linux/slab.h>
  27. #include "drmP.h"
  28. #include "drm.h"
  29. #include "drm_sarea.h"
  30. #include "drm_crtc_helper.h"
  31. #include <linux/vgaarb.h>
  32. #include <linux/vga_switcheroo.h>
  33. #include "nouveau_drv.h"
  34. #include <nouveau_drm.h>
  35. #include "nouveau_fbcon.h"
  36. #include <core/ramht.h>
  37. #include "nouveau_pm.h"
  38. #include "nv04_display.h"
  39. #include "nv50_display.h"
  40. #include <engine/fifo.h>
  41. #include "nouveau_fence.h"
  42. #include "nouveau_software.h"
  43. static void nouveau_stub_takedown(struct drm_device *dev) {}
  44. static int nouveau_stub_init(struct drm_device *dev) { return 0; }
  45. static int nouveau_init_engine_ptrs(struct drm_device *dev)
  46. {
  47. struct drm_nouveau_private *dev_priv = dev->dev_private;
  48. struct nouveau_engine *engine = &dev_priv->engine;
  49. switch (dev_priv->chipset & 0xf0) {
  50. case 0x00:
  51. engine->display.early_init = nv04_display_early_init;
  52. engine->display.late_takedown = nv04_display_late_takedown;
  53. engine->display.create = nv04_display_create;
  54. engine->display.destroy = nv04_display_destroy;
  55. engine->display.init = nv04_display_init;
  56. engine->display.fini = nv04_display_fini;
  57. engine->pm.clocks_get = nv04_pm_clocks_get;
  58. engine->pm.clocks_pre = nv04_pm_clocks_pre;
  59. engine->pm.clocks_set = nv04_pm_clocks_set;
  60. break;
  61. case 0x10:
  62. engine->display.early_init = nv04_display_early_init;
  63. engine->display.late_takedown = nv04_display_late_takedown;
  64. engine->display.create = nv04_display_create;
  65. engine->display.destroy = nv04_display_destroy;
  66. engine->display.init = nv04_display_init;
  67. engine->display.fini = nv04_display_fini;
  68. engine->pm.clocks_get = nv04_pm_clocks_get;
  69. engine->pm.clocks_pre = nv04_pm_clocks_pre;
  70. engine->pm.clocks_set = nv04_pm_clocks_set;
  71. break;
  72. case 0x20:
  73. engine->display.early_init = nv04_display_early_init;
  74. engine->display.late_takedown = nv04_display_late_takedown;
  75. engine->display.create = nv04_display_create;
  76. engine->display.destroy = nv04_display_destroy;
  77. engine->display.init = nv04_display_init;
  78. engine->display.fini = nv04_display_fini;
  79. engine->pm.clocks_get = nv04_pm_clocks_get;
  80. engine->pm.clocks_pre = nv04_pm_clocks_pre;
  81. engine->pm.clocks_set = nv04_pm_clocks_set;
  82. break;
  83. case 0x30:
  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;
  93. engine->pm.voltage_get = nouveau_voltage_gpio_get;
  94. engine->pm.voltage_set = nouveau_voltage_gpio_set;
  95. break;
  96. case 0x40:
  97. case 0x60:
  98. engine->display.early_init = nv04_display_early_init;
  99. engine->display.late_takedown = nv04_display_late_takedown;
  100. engine->display.create = nv04_display_create;
  101. engine->display.destroy = nv04_display_destroy;
  102. engine->display.init = nv04_display_init;
  103. engine->display.fini = nv04_display_fini;
  104. engine->pm.clocks_get = nv40_pm_clocks_get;
  105. engine->pm.clocks_pre = nv40_pm_clocks_pre;
  106. engine->pm.clocks_set = nv40_pm_clocks_set;
  107. engine->pm.voltage_get = nouveau_voltage_gpio_get;
  108. engine->pm.voltage_set = nouveau_voltage_gpio_set;
  109. engine->pm.temp_get = nv40_temp_get;
  110. engine->pm.pwm_get = nv40_pm_pwm_get;
  111. engine->pm.pwm_set = nv40_pm_pwm_set;
  112. break;
  113. case 0x50:
  114. case 0x80: /* gotta love NVIDIA's consistency.. */
  115. case 0x90:
  116. case 0xa0:
  117. engine->display.early_init = nv50_display_early_init;
  118. engine->display.late_takedown = nv50_display_late_takedown;
  119. engine->display.create = nv50_display_create;
  120. engine->display.destroy = nv50_display_destroy;
  121. engine->display.init = nv50_display_init;
  122. engine->display.fini = nv50_display_fini;
  123. switch (dev_priv->chipset) {
  124. case 0x84:
  125. case 0x86:
  126. case 0x92:
  127. case 0x94:
  128. case 0x96:
  129. case 0x98:
  130. case 0xa0:
  131. case 0xaa:
  132. case 0xac:
  133. case 0x50:
  134. engine->pm.clocks_get = nv50_pm_clocks_get;
  135. engine->pm.clocks_pre = nv50_pm_clocks_pre;
  136. engine->pm.clocks_set = nv50_pm_clocks_set;
  137. break;
  138. default:
  139. engine->pm.clocks_get = nva3_pm_clocks_get;
  140. engine->pm.clocks_pre = nva3_pm_clocks_pre;
  141. engine->pm.clocks_set = nva3_pm_clocks_set;
  142. break;
  143. }
  144. engine->pm.voltage_get = nouveau_voltage_gpio_get;
  145. engine->pm.voltage_set = nouveau_voltage_gpio_set;
  146. if (dev_priv->chipset >= 0x84)
  147. engine->pm.temp_get = nv84_temp_get;
  148. else
  149. engine->pm.temp_get = nv40_temp_get;
  150. engine->pm.pwm_get = nv50_pm_pwm_get;
  151. engine->pm.pwm_set = nv50_pm_pwm_set;
  152. break;
  153. case 0xc0:
  154. engine->display.early_init = nv50_display_early_init;
  155. engine->display.late_takedown = nv50_display_late_takedown;
  156. engine->display.create = nv50_display_create;
  157. engine->display.destroy = nv50_display_destroy;
  158. engine->display.init = nv50_display_init;
  159. engine->display.fini = nv50_display_fini;
  160. engine->pm.temp_get = nv84_temp_get;
  161. engine->pm.clocks_get = nvc0_pm_clocks_get;
  162. engine->pm.clocks_pre = nvc0_pm_clocks_pre;
  163. engine->pm.clocks_set = nvc0_pm_clocks_set;
  164. engine->pm.voltage_get = nouveau_voltage_gpio_get;
  165. engine->pm.voltage_set = nouveau_voltage_gpio_set;
  166. engine->pm.pwm_get = nv50_pm_pwm_get;
  167. engine->pm.pwm_set = nv50_pm_pwm_set;
  168. break;
  169. case 0xd0:
  170. engine->display.early_init = nouveau_stub_init;
  171. engine->display.late_takedown = nouveau_stub_takedown;
  172. engine->display.create = nvd0_display_create;
  173. engine->display.destroy = nvd0_display_destroy;
  174. engine->display.init = nvd0_display_init;
  175. engine->display.fini = nvd0_display_fini;
  176. engine->pm.temp_get = nv84_temp_get;
  177. engine->pm.clocks_get = nvc0_pm_clocks_get;
  178. engine->pm.clocks_pre = nvc0_pm_clocks_pre;
  179. engine->pm.clocks_set = nvc0_pm_clocks_set;
  180. engine->pm.voltage_get = nouveau_voltage_gpio_get;
  181. engine->pm.voltage_set = nouveau_voltage_gpio_set;
  182. break;
  183. case 0xe0:
  184. engine->display.early_init = nouveau_stub_init;
  185. engine->display.late_takedown = nouveau_stub_takedown;
  186. engine->display.create = nvd0_display_create;
  187. engine->display.destroy = nvd0_display_destroy;
  188. engine->display.init = nvd0_display_init;
  189. engine->display.fini = nvd0_display_fini;
  190. break;
  191. default:
  192. NV_ERROR(dev, "NV%02x unsupported\n", dev_priv->chipset);
  193. return 1;
  194. }
  195. /* headless mode */
  196. if (nouveau_modeset == 2) {
  197. engine->display.early_init = nouveau_stub_init;
  198. engine->display.late_takedown = nouveau_stub_takedown;
  199. engine->display.create = nouveau_stub_init;
  200. engine->display.init = nouveau_stub_init;
  201. engine->display.destroy = nouveau_stub_takedown;
  202. }
  203. return 0;
  204. }
  205. static unsigned int
  206. nouveau_vga_set_decode(void *priv, bool state)
  207. {
  208. struct drm_device *dev = priv;
  209. struct drm_nouveau_private *dev_priv = dev->dev_private;
  210. if (dev_priv->chipset >= 0x40)
  211. nv_wr32(dev, 0x88054, state);
  212. else
  213. nv_wr32(dev, 0x1854, state);
  214. if (state)
  215. return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
  216. VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
  217. else
  218. return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
  219. }
  220. static void nouveau_switcheroo_set_state(struct pci_dev *pdev,
  221. enum vga_switcheroo_state state)
  222. {
  223. struct drm_device *dev = pci_get_drvdata(pdev);
  224. pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
  225. if (state == VGA_SWITCHEROO_ON) {
  226. printk(KERN_ERR "VGA switcheroo: switched nouveau on\n");
  227. dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
  228. nouveau_pci_resume(pdev);
  229. drm_kms_helper_poll_enable(dev);
  230. dev->switch_power_state = DRM_SWITCH_POWER_ON;
  231. } else {
  232. printk(KERN_ERR "VGA switcheroo: switched nouveau off\n");
  233. dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
  234. drm_kms_helper_poll_disable(dev);
  235. nouveau_switcheroo_optimus_dsm();
  236. nouveau_pci_suspend(pdev, pmm);
  237. dev->switch_power_state = DRM_SWITCH_POWER_OFF;
  238. }
  239. }
  240. static void nouveau_switcheroo_reprobe(struct pci_dev *pdev)
  241. {
  242. struct drm_device *dev = pci_get_drvdata(pdev);
  243. nouveau_fbcon_output_poll_changed(dev);
  244. }
  245. static bool nouveau_switcheroo_can_switch(struct pci_dev *pdev)
  246. {
  247. struct drm_device *dev = pci_get_drvdata(pdev);
  248. bool can_switch;
  249. spin_lock(&dev->count_lock);
  250. can_switch = (dev->open_count == 0);
  251. spin_unlock(&dev->count_lock);
  252. return can_switch;
  253. }
  254. static void
  255. nouveau_card_channel_fini(struct drm_device *dev)
  256. {
  257. struct drm_nouveau_private *dev_priv = dev->dev_private;
  258. if (dev_priv->channel) {
  259. nouveau_channel_put_unlocked(&dev_priv->channel);
  260. nouveau_vm_ref(NULL, &dev_priv->chan_vm, NULL);
  261. }
  262. }
  263. static int
  264. nouveau_card_channel_init(struct drm_device *dev)
  265. {
  266. struct drm_nouveau_private *dev_priv = dev->dev_private;
  267. struct nouveau_channel *chan;
  268. int ret;
  269. ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x1000, &dev_priv->chan_vm);
  270. if (ret)
  271. return ret;
  272. ret = nouveau_channel_alloc(dev, &chan, NULL, NvDmaFB, NvDmaTT);
  273. dev_priv->channel = chan;
  274. if (ret)
  275. return ret;
  276. mutex_unlock(&dev_priv->channel->mutex);
  277. nouveau_bo_move_init(chan);
  278. return 0;
  279. }
  280. static const struct vga_switcheroo_client_ops nouveau_switcheroo_ops = {
  281. .set_gpu_state = nouveau_switcheroo_set_state,
  282. .reprobe = nouveau_switcheroo_reprobe,
  283. .can_switch = nouveau_switcheroo_can_switch,
  284. };
  285. int
  286. nouveau_card_init(struct drm_device *dev)
  287. {
  288. struct drm_nouveau_private *dev_priv = dev->dev_private;
  289. struct nouveau_engine *engine;
  290. int ret, e = 0;
  291. vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode);
  292. vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops);
  293. /* Initialise internal driver API hooks */
  294. ret = nouveau_init_engine_ptrs(dev);
  295. if (ret)
  296. goto out;
  297. engine = &dev_priv->engine;
  298. spin_lock_init(&dev_priv->channels.lock);
  299. spin_lock_init(&dev_priv->tile.lock);
  300. spin_lock_init(&dev_priv->context_switch_lock);
  301. spin_lock_init(&dev_priv->vm_lock);
  302. INIT_LIST_HEAD(&dev_priv->classes);
  303. /* Make the CRTCs and I2C buses accessible */
  304. ret = engine->display.early_init(dev);
  305. if (ret)
  306. goto out;
  307. /* Parse BIOS tables / Run init tables if card not POSTed */
  308. ret = nouveau_bios_init(dev);
  309. if (ret)
  310. goto out_display_early;
  311. /* workaround an odd issue on nvc1 by disabling the device's
  312. * nosnoop capability. hopefully won't cause issues until a
  313. * better fix is found - assuming there is one...
  314. */
  315. if (dev_priv->chipset == 0xc1) {
  316. nv_mask(dev, 0x00088080, 0x00000800, 0x00000000);
  317. }
  318. ret = nouveau_mem_vram_init(dev);
  319. if (ret)
  320. goto out_bios;
  321. ret = nouveau_mem_gart_init(dev);
  322. if (ret)
  323. goto out_ttmvram;
  324. if (!dev_priv->noaccel) {
  325. switch (dev_priv->card_type) {
  326. case NV_04:
  327. nv04_fifo_create(dev);
  328. break;
  329. case NV_10:
  330. case NV_20:
  331. case NV_30:
  332. if (dev_priv->chipset < 0x17)
  333. nv10_fifo_create(dev);
  334. else
  335. nv17_fifo_create(dev);
  336. break;
  337. case NV_40:
  338. nv40_fifo_create(dev);
  339. break;
  340. case NV_50:
  341. if (dev_priv->chipset == 0x50)
  342. nv50_fifo_create(dev);
  343. else
  344. nv84_fifo_create(dev);
  345. break;
  346. case NV_C0:
  347. case NV_D0:
  348. nvc0_fifo_create(dev);
  349. break;
  350. case NV_E0:
  351. nve0_fifo_create(dev);
  352. break;
  353. default:
  354. break;
  355. }
  356. switch (dev_priv->card_type) {
  357. case NV_04:
  358. nv04_fence_create(dev);
  359. break;
  360. case NV_10:
  361. case NV_20:
  362. case NV_30:
  363. case NV_40:
  364. case NV_50:
  365. if (dev_priv->chipset < 0x84)
  366. nv10_fence_create(dev);
  367. else
  368. nv84_fence_create(dev);
  369. break;
  370. case NV_C0:
  371. case NV_D0:
  372. case NV_E0:
  373. nvc0_fence_create(dev);
  374. break;
  375. default:
  376. break;
  377. }
  378. switch (dev_priv->card_type) {
  379. case NV_04:
  380. case NV_10:
  381. case NV_20:
  382. case NV_30:
  383. case NV_40:
  384. nv04_software_create(dev);
  385. break;
  386. case NV_50:
  387. nv50_software_create(dev);
  388. break;
  389. case NV_C0:
  390. case NV_D0:
  391. case NV_E0:
  392. nvc0_software_create(dev);
  393. break;
  394. default:
  395. break;
  396. }
  397. switch (dev_priv->card_type) {
  398. case NV_04:
  399. nv04_graph_create(dev);
  400. break;
  401. case NV_10:
  402. nv10_graph_create(dev);
  403. break;
  404. case NV_20:
  405. case NV_30:
  406. nv20_graph_create(dev);
  407. break;
  408. case NV_40:
  409. nv40_graph_create(dev);
  410. break;
  411. case NV_50:
  412. nv50_graph_create(dev);
  413. break;
  414. case NV_C0:
  415. case NV_D0:
  416. nvc0_graph_create(dev);
  417. break;
  418. case NV_E0:
  419. nve0_graph_create(dev);
  420. break;
  421. default:
  422. break;
  423. }
  424. switch (dev_priv->chipset) {
  425. case 0x84:
  426. case 0x86:
  427. case 0x92:
  428. case 0x94:
  429. case 0x96:
  430. case 0xa0:
  431. nv84_crypt_create(dev);
  432. break;
  433. case 0x98:
  434. case 0xaa:
  435. case 0xac:
  436. nv98_crypt_create(dev);
  437. break;
  438. }
  439. switch (dev_priv->card_type) {
  440. case NV_50:
  441. switch (dev_priv->chipset) {
  442. case 0xa3:
  443. case 0xa5:
  444. case 0xa8:
  445. nva3_copy_create(dev);
  446. break;
  447. }
  448. break;
  449. case NV_C0:
  450. if (!(nv_rd32(dev, 0x022500) & 0x00000200))
  451. nvc0_copy_create(dev, 1);
  452. case NV_D0:
  453. if (!(nv_rd32(dev, 0x022500) & 0x00000100))
  454. nvc0_copy_create(dev, 0);
  455. break;
  456. default:
  457. break;
  458. }
  459. if (dev_priv->chipset >= 0xa3 || dev_priv->chipset == 0x98) {
  460. nv84_bsp_create(dev);
  461. nv84_vp_create(dev);
  462. nv98_ppp_create(dev);
  463. } else
  464. if (dev_priv->chipset >= 0x84) {
  465. nv50_mpeg_create(dev);
  466. nv84_bsp_create(dev);
  467. nv84_vp_create(dev);
  468. } else
  469. if (dev_priv->chipset >= 0x50) {
  470. nv50_mpeg_create(dev);
  471. } else
  472. if (dev_priv->card_type == NV_40 ||
  473. dev_priv->chipset == 0x31 ||
  474. dev_priv->chipset == 0x34 ||
  475. dev_priv->chipset == 0x36) {
  476. nv31_mpeg_create(dev);
  477. }
  478. for (e = 0; e < NVOBJ_ENGINE_NR; e++) {
  479. if (dev_priv->eng[e]) {
  480. ret = dev_priv->eng[e]->init(dev, e);
  481. if (ret)
  482. goto out_engine;
  483. }
  484. }
  485. }
  486. ret = nouveau_irq_init(dev);
  487. if (ret)
  488. goto out_engine;
  489. ret = nouveau_display_create(dev);
  490. if (ret)
  491. goto out_irq;
  492. nouveau_backlight_init(dev);
  493. nouveau_pm_init(dev);
  494. if (dev_priv->eng[NVOBJ_ENGINE_GR]) {
  495. ret = nouveau_card_channel_init(dev);
  496. if (ret)
  497. goto out_pm;
  498. }
  499. if (dev->mode_config.num_crtc) {
  500. ret = nouveau_display_init(dev);
  501. if (ret)
  502. goto out_chan;
  503. nouveau_fbcon_init(dev);
  504. }
  505. return 0;
  506. out_chan:
  507. nouveau_card_channel_fini(dev);
  508. out_pm:
  509. nouveau_pm_fini(dev);
  510. nouveau_backlight_exit(dev);
  511. nouveau_display_destroy(dev);
  512. out_irq:
  513. nouveau_irq_fini(dev);
  514. out_engine:
  515. if (!dev_priv->noaccel) {
  516. for (e = e - 1; e >= 0; e--) {
  517. if (!dev_priv->eng[e])
  518. continue;
  519. dev_priv->eng[e]->fini(dev, e, false);
  520. dev_priv->eng[e]->destroy(dev,e );
  521. }
  522. }
  523. nouveau_mem_gart_fini(dev);
  524. out_ttmvram:
  525. nouveau_mem_vram_fini(dev);
  526. out_bios:
  527. nouveau_bios_takedown(dev);
  528. out_display_early:
  529. engine->display.late_takedown(dev);
  530. out:
  531. vga_switcheroo_unregister_client(dev->pdev);
  532. vga_client_register(dev->pdev, NULL, NULL, NULL);
  533. return ret;
  534. }
  535. static void nouveau_card_takedown(struct drm_device *dev)
  536. {
  537. struct drm_nouveau_private *dev_priv = dev->dev_private;
  538. struct nouveau_engine *engine = &dev_priv->engine;
  539. int e;
  540. if (dev->mode_config.num_crtc) {
  541. nouveau_fbcon_fini(dev);
  542. nouveau_display_fini(dev);
  543. }
  544. nouveau_card_channel_fini(dev);
  545. nouveau_pm_fini(dev);
  546. nouveau_backlight_exit(dev);
  547. nouveau_display_destroy(dev);
  548. if (!dev_priv->noaccel) {
  549. for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
  550. if (dev_priv->eng[e]) {
  551. dev_priv->eng[e]->fini(dev, e, false);
  552. dev_priv->eng[e]->destroy(dev,e );
  553. }
  554. }
  555. }
  556. if (dev_priv->vga_ram) {
  557. nouveau_bo_unpin(dev_priv->vga_ram);
  558. nouveau_bo_ref(NULL, &dev_priv->vga_ram);
  559. }
  560. mutex_lock(&dev->struct_mutex);
  561. ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM);
  562. ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT);
  563. mutex_unlock(&dev->struct_mutex);
  564. nouveau_mem_gart_fini(dev);
  565. nouveau_mem_vram_fini(dev);
  566. nouveau_bios_takedown(dev);
  567. engine->display.late_takedown(dev);
  568. nouveau_irq_fini(dev);
  569. vga_switcheroo_unregister_client(dev->pdev);
  570. vga_client_register(dev->pdev, NULL, NULL, NULL);
  571. }
  572. int
  573. nouveau_open(struct drm_device *dev, struct drm_file *file_priv)
  574. {
  575. struct drm_nouveau_private *dev_priv = dev->dev_private;
  576. struct nouveau_fpriv *fpriv;
  577. int ret;
  578. fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
  579. if (unlikely(!fpriv))
  580. return -ENOMEM;
  581. spin_lock_init(&fpriv->lock);
  582. INIT_LIST_HEAD(&fpriv->channels);
  583. if (dev_priv->card_type == NV_50) {
  584. ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0020000000ULL,
  585. &fpriv->vm);
  586. if (ret) {
  587. kfree(fpriv);
  588. return ret;
  589. }
  590. } else
  591. if (dev_priv->card_type >= NV_C0) {
  592. ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0008000000ULL,
  593. &fpriv->vm);
  594. if (ret) {
  595. kfree(fpriv);
  596. return ret;
  597. }
  598. }
  599. file_priv->driver_priv = fpriv;
  600. return 0;
  601. }
  602. /* here a client dies, release the stuff that was allocated for its
  603. * file_priv */
  604. void nouveau_preclose(struct drm_device *dev, struct drm_file *file_priv)
  605. {
  606. nouveau_channel_cleanup(dev, file_priv);
  607. }
  608. void
  609. nouveau_postclose(struct drm_device *dev, struct drm_file *file_priv)
  610. {
  611. struct nouveau_fpriv *fpriv = nouveau_fpriv(file_priv);
  612. nouveau_vm_ref(NULL, &fpriv->vm, NULL);
  613. kfree(fpriv);
  614. }
  615. /* first module load, setup the mmio/fb mapping */
  616. /* KMS: we need mmio at load time, not when the first drm client opens. */
  617. int nouveau_firstopen(struct drm_device *dev)
  618. {
  619. return 0;
  620. }
  621. /* if we have an OF card, copy vbios to RAMIN */
  622. static void nouveau_OF_copy_vbios_to_ramin(struct drm_device *dev)
  623. {
  624. #if defined(__powerpc__)
  625. int size, i;
  626. const uint32_t *bios;
  627. struct device_node *dn = pci_device_to_OF_node(dev->pdev);
  628. if (!dn) {
  629. NV_INFO(dev, "Unable to get the OF node\n");
  630. return;
  631. }
  632. bios = of_get_property(dn, "NVDA,BMP", &size);
  633. if (bios) {
  634. for (i = 0; i < size; i += 4)
  635. nv_wi32(dev, i, bios[i/4]);
  636. NV_INFO(dev, "OF bios successfully copied (%d bytes)\n", size);
  637. } else {
  638. NV_INFO(dev, "Unable to get the OF bios\n");
  639. }
  640. #endif
  641. }
  642. static struct apertures_struct *nouveau_get_apertures(struct drm_device *dev)
  643. {
  644. struct pci_dev *pdev = dev->pdev;
  645. struct apertures_struct *aper = alloc_apertures(3);
  646. if (!aper)
  647. return NULL;
  648. aper->ranges[0].base = pci_resource_start(pdev, 1);
  649. aper->ranges[0].size = pci_resource_len(pdev, 1);
  650. aper->count = 1;
  651. if (pci_resource_len(pdev, 2)) {
  652. aper->ranges[aper->count].base = pci_resource_start(pdev, 2);
  653. aper->ranges[aper->count].size = pci_resource_len(pdev, 2);
  654. aper->count++;
  655. }
  656. if (pci_resource_len(pdev, 3)) {
  657. aper->ranges[aper->count].base = pci_resource_start(pdev, 3);
  658. aper->ranges[aper->count].size = pci_resource_len(pdev, 3);
  659. aper->count++;
  660. }
  661. return aper;
  662. }
  663. static int nouveau_remove_conflicting_drivers(struct drm_device *dev)
  664. {
  665. struct drm_nouveau_private *dev_priv = dev->dev_private;
  666. bool primary = false;
  667. dev_priv->apertures = nouveau_get_apertures(dev);
  668. if (!dev_priv->apertures)
  669. return -ENOMEM;
  670. #ifdef CONFIG_X86
  671. primary = dev->pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
  672. #endif
  673. remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb", primary);
  674. return 0;
  675. }
  676. void *
  677. nouveau_newpriv(struct drm_device *dev)
  678. {
  679. struct drm_nouveau_private *dev_priv = dev->dev_private;
  680. return dev_priv->newpriv;
  681. }
  682. int nouveau_load(struct drm_device *dev, unsigned long flags)
  683. {
  684. struct drm_nouveau_private *dev_priv;
  685. uint32_t reg0 = ~0, strap;
  686. int ret;
  687. dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
  688. if (!dev_priv) {
  689. ret = -ENOMEM;
  690. goto err_out;
  691. }
  692. dev_priv->newpriv = dev->dev_private;
  693. dev->dev_private = dev_priv;
  694. dev_priv->dev = dev;
  695. dev_priv->flags = flags & NOUVEAU_FLAGS;
  696. NV_DEBUG(dev, "vendor: 0x%X device: 0x%X class: 0x%X\n",
  697. dev->pci_vendor, dev->pci_device, dev->pdev->class);
  698. /* determine chipset and derive architecture from it */
  699. reg0 = nv_rd32(dev, NV03_PMC_BOOT_0);
  700. if ((reg0 & 0x0f000000) > 0) {
  701. dev_priv->chipset = (reg0 & 0xff00000) >> 20;
  702. switch (dev_priv->chipset & 0xf0) {
  703. case 0x10:
  704. case 0x20:
  705. case 0x30:
  706. dev_priv->card_type = dev_priv->chipset & 0xf0;
  707. break;
  708. case 0x40:
  709. case 0x60:
  710. dev_priv->card_type = NV_40;
  711. break;
  712. case 0x50:
  713. case 0x80:
  714. case 0x90:
  715. case 0xa0:
  716. dev_priv->card_type = NV_50;
  717. break;
  718. case 0xc0:
  719. dev_priv->card_type = NV_C0;
  720. break;
  721. case 0xd0:
  722. dev_priv->card_type = NV_D0;
  723. break;
  724. case 0xe0:
  725. dev_priv->card_type = NV_E0;
  726. break;
  727. default:
  728. break;
  729. }
  730. } else
  731. if ((reg0 & 0xff00fff0) == 0x20004000) {
  732. if (reg0 & 0x00f00000)
  733. dev_priv->chipset = 0x05;
  734. else
  735. dev_priv->chipset = 0x04;
  736. dev_priv->card_type = NV_04;
  737. }
  738. if (!dev_priv->card_type) {
  739. NV_ERROR(dev, "unsupported chipset 0x%08x\n", reg0);
  740. ret = -EINVAL;
  741. goto err_priv;
  742. }
  743. NV_INFO(dev, "Detected an NV%02x generation card (0x%08x)\n",
  744. dev_priv->card_type, reg0);
  745. /* determine frequency of timing crystal */
  746. strap = nv_rd32(dev, 0x101000);
  747. if ( dev_priv->chipset < 0x17 ||
  748. (dev_priv->chipset >= 0x20 && dev_priv->chipset <= 0x25))
  749. strap &= 0x00000040;
  750. else
  751. strap &= 0x00400040;
  752. switch (strap) {
  753. case 0x00000000: dev_priv->crystal = 13500; break;
  754. case 0x00000040: dev_priv->crystal = 14318; break;
  755. case 0x00400000: dev_priv->crystal = 27000; break;
  756. case 0x00400040: dev_priv->crystal = 25000; break;
  757. }
  758. NV_DEBUG(dev, "crystal freq: %dKHz\n", dev_priv->crystal);
  759. /* Determine whether we'll attempt acceleration or not, some
  760. * cards are disabled by default here due to them being known
  761. * non-functional, or never been tested due to lack of hw.
  762. */
  763. dev_priv->noaccel = !!nouveau_noaccel;
  764. if (nouveau_noaccel == -1) {
  765. switch (dev_priv->chipset) {
  766. case 0xd9: /* known broken */
  767. case 0xe4: /* needs binary driver firmware */
  768. case 0xe7: /* needs binary driver firmware */
  769. NV_INFO(dev, "acceleration disabled by default, pass "
  770. "noaccel=0 to force enable\n");
  771. dev_priv->noaccel = true;
  772. break;
  773. default:
  774. dev_priv->noaccel = false;
  775. break;
  776. }
  777. }
  778. ret = nouveau_remove_conflicting_drivers(dev);
  779. if (ret)
  780. goto err_priv;
  781. nouveau_OF_copy_vbios_to_ramin(dev);
  782. /* Special flags */
  783. if (dev->pci_device == 0x01a0)
  784. dev_priv->flags |= NV_NFORCE;
  785. else if (dev->pci_device == 0x01f0)
  786. dev_priv->flags |= NV_NFORCE2;
  787. /* For kernel modesetting, init card now and bring up fbcon */
  788. ret = nouveau_card_init(dev);
  789. if (ret)
  790. goto err_priv;
  791. return 0;
  792. err_priv:
  793. dev->dev_private = dev_priv->newpriv;
  794. kfree(dev_priv);
  795. err_out:
  796. return ret;
  797. }
  798. void nouveau_lastclose(struct drm_device *dev)
  799. {
  800. vga_switcheroo_process_delayed_switch();
  801. }
  802. int nouveau_unload(struct drm_device *dev)
  803. {
  804. struct drm_nouveau_private *dev_priv = dev->dev_private;
  805. nouveau_card_takedown(dev);
  806. dev->dev_private = dev_priv->newpriv;
  807. kfree(dev_priv);
  808. return 0;
  809. }
  810. /* Waits for PGRAPH to go completely idle */
  811. bool nouveau_wait_for_idle(struct drm_device *dev)
  812. {
  813. struct drm_nouveau_private *dev_priv = dev->dev_private;
  814. uint32_t mask = ~0;
  815. if (dev_priv->card_type == NV_40)
  816. mask &= ~NV40_PGRAPH_STATUS_SYNC_STALL;
  817. if (!nv_wait(dev, NV04_PGRAPH_STATUS, mask, 0)) {
  818. NV_ERROR(dev, "PGRAPH idle timed out with status 0x%08x\n",
  819. nv_rd32(dev, NV04_PGRAPH_STATUS));
  820. return false;
  821. }
  822. return true;
  823. }