nv40_fb.c 1.5 KB

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