nv50_fb.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "drmP.h"
  2. #include "drm.h"
  3. #include "nouveau_drv.h"
  4. #include "nouveau_drm.h"
  5. struct nv50_fb_priv {
  6. struct page *r100c08_page;
  7. dma_addr_t r100c08;
  8. };
  9. static int
  10. nv50_fb_create(struct drm_device *dev)
  11. {
  12. struct drm_nouveau_private *dev_priv = dev->dev_private;
  13. struct nv50_fb_priv *priv;
  14. priv = kzalloc(sizeof(*priv), GFP_KERNEL);
  15. if (!priv)
  16. return -ENOMEM;
  17. priv->r100c08_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
  18. if (!priv->r100c08_page) {
  19. kfree(priv);
  20. return -ENOMEM;
  21. }
  22. priv->r100c08 = pci_map_page(dev->pdev, priv->r100c08_page, 0,
  23. PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
  24. if (pci_dma_mapping_error(dev->pdev, priv->r100c08)) {
  25. __free_page(priv->r100c08_page);
  26. kfree(priv);
  27. return -EFAULT;
  28. }
  29. dev_priv->engine.fb.priv = priv;
  30. return 0;
  31. }
  32. int
  33. nv50_fb_init(struct drm_device *dev)
  34. {
  35. struct drm_nouveau_private *dev_priv = dev->dev_private;
  36. struct nv50_fb_priv *priv;
  37. int ret;
  38. if (!dev_priv->engine.fb.priv) {
  39. ret = nv50_fb_create(dev);
  40. if (ret)
  41. return ret;
  42. }
  43. priv = dev_priv->engine.fb.priv;
  44. /* Not a clue what this is exactly. Without pointing it at a
  45. * scratch page, VRAM->GART blits with M2MF (as in DDX DFS)
  46. * cause IOMMU "read from address 0" errors (rh#561267)
  47. */
  48. nv_wr32(dev, 0x100c08, priv->r100c08 >> 8);
  49. /* This is needed to get meaningful information from 100c90
  50. * on traps. No idea what these values mean exactly. */
  51. switch (dev_priv->chipset) {
  52. case 0x50:
  53. nv_wr32(dev, 0x100c90, 0x000707ff);
  54. break;
  55. case 0xa3:
  56. case 0xa5:
  57. case 0xa8:
  58. nv_wr32(dev, 0x100c90, 0x000d0fff);
  59. break;
  60. case 0xaf:
  61. nv_wr32(dev, 0x100c90, 0x089d1fff);
  62. break;
  63. default:
  64. nv_wr32(dev, 0x100c90, 0x001d07ff);
  65. break;
  66. }
  67. return 0;
  68. }
  69. void
  70. nv50_fb_takedown(struct drm_device *dev)
  71. {
  72. struct drm_nouveau_private *dev_priv = dev->dev_private;
  73. struct nv50_fb_priv *priv;
  74. priv = dev_priv->engine.fb.priv;
  75. if (!priv)
  76. return;
  77. dev_priv->engine.fb.priv = NULL;
  78. pci_unmap_page(dev->pdev, priv->r100c08, PAGE_SIZE,
  79. PCI_DMA_BIDIRECTIONAL);
  80. __free_page(priv->r100c08_page);
  81. kfree(priv);
  82. }
  83. void
  84. nv50_fb_vm_trap(struct drm_device *dev, int display, const char *name)
  85. {
  86. struct drm_nouveau_private *dev_priv = dev->dev_private;
  87. unsigned long flags;
  88. u32 trap[6], idx, chinst;
  89. int i, ch;
  90. idx = nv_rd32(dev, 0x100c90);
  91. if (!(idx & 0x80000000))
  92. return;
  93. idx &= 0x00ffffff;
  94. for (i = 0; i < 6; i++) {
  95. nv_wr32(dev, 0x100c90, idx | i << 24);
  96. trap[i] = nv_rd32(dev, 0x100c94);
  97. }
  98. nv_wr32(dev, 0x100c90, idx | 0x80000000);
  99. if (!display)
  100. return;
  101. chinst = (trap[2] << 16) | trap[1];
  102. spin_lock_irqsave(&dev_priv->channels.lock, flags);
  103. for (ch = 0; ch < dev_priv->engine.fifo.channels; ch++) {
  104. struct nouveau_channel *chan = dev_priv->channels.ptr[ch];
  105. if (!chan || !chan->ramin)
  106. continue;
  107. if (chinst == chan->ramin->vinst >> 12)
  108. break;
  109. }
  110. spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
  111. NV_INFO(dev, "%s - VM: Trapped %s at %02x%04x%04x status %08x "
  112. "channel %d (0x%08x)\n",
  113. name, (trap[5] & 0x100 ? "read" : "write"),
  114. trap[5] & 0xff, trap[4] & 0xffff, trap[3] & 0xffff,
  115. trap[0], ch, chinst);
  116. }