nv40_fb.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "drmP.h"
  2. #include "drm.h"
  3. #include "nouveau_drv.h"
  4. #include "nouveau_drm.h"
  5. void
  6. nv40_fb_set_tile_region(struct drm_device *dev, int i)
  7. {
  8. struct drm_nouveau_private *dev_priv = dev->dev_private;
  9. struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
  10. switch (dev_priv->chipset) {
  11. case 0x40:
  12. nv_wr32(dev, NV10_PFB_TLIMIT(i), tile->limit);
  13. nv_wr32(dev, NV10_PFB_TSIZE(i), tile->pitch);
  14. nv_wr32(dev, NV10_PFB_TILE(i), tile->addr);
  15. break;
  16. default:
  17. nv_wr32(dev, NV40_PFB_TLIMIT(i), tile->limit);
  18. nv_wr32(dev, NV40_PFB_TSIZE(i), tile->pitch);
  19. nv_wr32(dev, NV40_PFB_TILE(i), tile->addr);
  20. break;
  21. }
  22. }
  23. int
  24. nv40_fb_init(struct drm_device *dev)
  25. {
  26. struct drm_nouveau_private *dev_priv = dev->dev_private;
  27. struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
  28. uint32_t tmp;
  29. int i;
  30. /* This is strictly a NV4x register (don't know about NV5x). */
  31. /* The blob sets these to all kinds of values, and they mess up our setup. */
  32. /* I got value 0x52802 instead. For some cards the blob even sets it back to 0x1. */
  33. /* Note: the blob doesn't read this value, so i'm pretty sure this is safe for all cards. */
  34. /* Any idea what this is? */
  35. nv_wr32(dev, NV40_PFB_UNK_800, 0x1);
  36. switch (dev_priv->chipset) {
  37. case 0x40:
  38. case 0x45:
  39. tmp = nv_rd32(dev, NV10_PFB_CLOSE_PAGE2);
  40. nv_wr32(dev, NV10_PFB_CLOSE_PAGE2, tmp & ~(1 << 15));
  41. pfb->num_tiles = NV10_PFB_TILE__SIZE;
  42. break;
  43. case 0x46: /* G72 */
  44. case 0x47: /* G70 */
  45. case 0x49: /* G71 */
  46. case 0x4b: /* G73 */
  47. case 0x4c: /* C51 (G7X version) */
  48. pfb->num_tiles = NV40_PFB_TILE__SIZE_1;
  49. break;
  50. default:
  51. pfb->num_tiles = NV40_PFB_TILE__SIZE_0;
  52. break;
  53. }
  54. /* Turn all the tiling regions off. */
  55. for (i = 0; i < pfb->num_tiles; i++)
  56. pfb->set_tile_region(dev, i);
  57. return 0;
  58. }
  59. void
  60. nv40_fb_takedown(struct drm_device *dev)
  61. {
  62. }