ramfuc.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #ifndef __NVKM_FBRAM_FUC_H__
  2. #define __NVKM_FBRAM_FUC_H__
  3. #include <subdev/fb.h>
  4. #include <subdev/pmu.h>
  5. struct ramfuc {
  6. struct nvkm_memx *memx;
  7. struct nvkm_fb *fb;
  8. int sequence;
  9. };
  10. struct ramfuc_reg {
  11. int sequence;
  12. bool force;
  13. u32 addr;
  14. u32 stride; /* in bytes */
  15. u32 mask;
  16. u32 data;
  17. };
  18. static inline struct ramfuc_reg
  19. ramfuc_stride(u32 addr, u32 stride, u32 mask)
  20. {
  21. return (struct ramfuc_reg) {
  22. .sequence = 0,
  23. .addr = addr,
  24. .stride = stride,
  25. .mask = mask,
  26. .data = 0xdeadbeef,
  27. };
  28. }
  29. static inline struct ramfuc_reg
  30. ramfuc_reg2(u32 addr1, u32 addr2)
  31. {
  32. return (struct ramfuc_reg) {
  33. .sequence = 0,
  34. .addr = addr1,
  35. .stride = addr2 - addr1,
  36. .mask = 0x3,
  37. .data = 0xdeadbeef,
  38. };
  39. }
  40. static noinline struct ramfuc_reg
  41. ramfuc_reg(u32 addr)
  42. {
  43. return (struct ramfuc_reg) {
  44. .sequence = 0,
  45. .addr = addr,
  46. .stride = 0,
  47. .mask = 0x1,
  48. .data = 0xdeadbeef,
  49. };
  50. }
  51. static inline int
  52. ramfuc_init(struct ramfuc *ram, struct nvkm_fb *fb)
  53. {
  54. int ret = nvkm_memx_init(fb->subdev.device->pmu, &ram->memx);
  55. if (ret)
  56. return ret;
  57. ram->sequence++;
  58. ram->fb = fb;
  59. return 0;
  60. }
  61. static inline int
  62. ramfuc_exec(struct ramfuc *ram, bool exec)
  63. {
  64. int ret = 0;
  65. if (ram->fb) {
  66. ret = nvkm_memx_fini(&ram->memx, exec);
  67. ram->fb = NULL;
  68. }
  69. return ret;
  70. }
  71. static inline u32
  72. ramfuc_rd32(struct ramfuc *ram, struct ramfuc_reg *reg)
  73. {
  74. struct nvkm_device *device = ram->fb->subdev.device;
  75. if (reg->sequence != ram->sequence)
  76. reg->data = nvkm_rd32(device, reg->addr);
  77. return reg->data;
  78. }
  79. static inline void
  80. ramfuc_wr32(struct ramfuc *ram, struct ramfuc_reg *reg, u32 data)
  81. {
  82. unsigned int mask, off = 0;
  83. reg->sequence = ram->sequence;
  84. reg->data = data;
  85. for (mask = reg->mask; mask > 0; mask = (mask & ~1) >> 1) {
  86. if (mask & 1)
  87. nvkm_memx_wr32(ram->memx, reg->addr+off, reg->data);
  88. off += reg->stride;
  89. }
  90. }
  91. static inline void
  92. ramfuc_nuke(struct ramfuc *ram, struct ramfuc_reg *reg)
  93. {
  94. reg->force = true;
  95. }
  96. static inline u32
  97. ramfuc_mask(struct ramfuc *ram, struct ramfuc_reg *reg, u32 mask, u32 data)
  98. {
  99. u32 temp = ramfuc_rd32(ram, reg);
  100. if (temp != ((temp & ~mask) | data) || reg->force) {
  101. ramfuc_wr32(ram, reg, (temp & ~mask) | data);
  102. reg->force = false;
  103. }
  104. return temp;
  105. }
  106. static inline void
  107. ramfuc_wait(struct ramfuc *ram, u32 addr, u32 mask, u32 data, u32 nsec)
  108. {
  109. nvkm_memx_wait(ram->memx, addr, mask, data, nsec);
  110. }
  111. static inline void
  112. ramfuc_nsec(struct ramfuc *ram, u32 nsec)
  113. {
  114. nvkm_memx_nsec(ram->memx, nsec);
  115. }
  116. static inline void
  117. ramfuc_wait_vblank(struct ramfuc *ram)
  118. {
  119. nvkm_memx_wait_vblank(ram->memx);
  120. }
  121. static inline void
  122. ramfuc_train(struct ramfuc *ram)
  123. {
  124. nvkm_memx_train(ram->memx);
  125. }
  126. static inline int
  127. ramfuc_train_result(struct nvkm_fb *fb, u32 *result, u32 rsize)
  128. {
  129. return nvkm_memx_train_result(fb->subdev.device->pmu, result, rsize);
  130. }
  131. static inline void
  132. ramfuc_block(struct ramfuc *ram)
  133. {
  134. nvkm_memx_block(ram->memx);
  135. }
  136. static inline void
  137. ramfuc_unblock(struct ramfuc *ram)
  138. {
  139. nvkm_memx_unblock(ram->memx);
  140. }
  141. #define ram_init(s,p) ramfuc_init(&(s)->base, (p))
  142. #define ram_exec(s,e) ramfuc_exec(&(s)->base, (e))
  143. #define ram_have(s,r) ((s)->r_##r.addr != 0x000000)
  144. #define ram_rd32(s,r) ramfuc_rd32(&(s)->base, &(s)->r_##r)
  145. #define ram_wr32(s,r,d) ramfuc_wr32(&(s)->base, &(s)->r_##r, (d))
  146. #define ram_nuke(s,r) ramfuc_nuke(&(s)->base, &(s)->r_##r)
  147. #define ram_mask(s,r,m,d) ramfuc_mask(&(s)->base, &(s)->r_##r, (m), (d))
  148. #define ram_wait(s,r,m,d,n) ramfuc_wait(&(s)->base, (r), (m), (d), (n))
  149. #define ram_nsec(s,n) ramfuc_nsec(&(s)->base, (n))
  150. #define ram_wait_vblank(s) ramfuc_wait_vblank(&(s)->base)
  151. #define ram_train(s) ramfuc_train(&(s)->base)
  152. #define ram_train_result(s,r,l) ramfuc_train_result((s), (r), (l))
  153. #define ram_block(s) ramfuc_block(&(s)->base)
  154. #define ram_unblock(s) ramfuc_unblock(&(s)->base)
  155. #endif