newport.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * newport.c: context switching the newport graphics card and
  3.  *            newport graphics support.
  4.  *
  5.  * Author: Miguel de Icaza
  6.  */
  7. #include <linux/errno.h>
  8. #include <linux/sched.h>
  9. #include <asm/types.h>
  10. #include <asm/gfx.h>
  11. #include <asm/ng1.h>
  12. #include <asm/uaccess.h>
  13. #include <video/newport.h>
  14. #include <linux/module.h>
  15. struct newport_regs *npregs;
  16. EXPORT_SYMBOL(npregs);
  17. /* Kernel routines for supporting graphics context switching */
  18. void newport_save (void *y)
  19. {
  20. newport_ctx *x = y;
  21. newport_wait ();
  22. #define LOAD(val) x->val = npregs->set.val;
  23. #define LOADI(val) x->val = npregs->set.val.word;
  24. #define LOADC(val) x->val = npregs->cset.val;
  25. LOAD(drawmode1);
  26. LOAD(drawmode0);
  27. LOAD(lsmode);
  28. LOAD(lspattern);
  29. LOAD(lspatsave);
  30. LOAD(zpattern);
  31. LOAD(colorback);
  32. LOAD(colorvram);
  33. LOAD(alpharef);
  34. LOAD(smask0x);
  35. LOAD(smask0y);
  36. LOADI(_xstart);
  37. LOADI(_ystart);
  38. LOADI(_xend);
  39. LOADI(_yend);
  40. LOAD(xsave);
  41. LOAD(xymove);
  42. LOADI(bresd);
  43. LOADI(bress1);
  44. LOAD(bresoctinc1);
  45. LOAD(bresrndinc2);
  46. LOAD(brese1);
  47. LOAD(bress2);
  48. LOAD(aweight0);
  49. LOAD(aweight1);
  50. LOADI(colorred);
  51. LOADI(coloralpha);
  52. LOADI(colorgrn);
  53. LOADI(colorblue);
  54. LOADI(slopered);
  55. LOADI(slopealpha);
  56. LOADI(slopegrn);
  57. LOADI(slopeblue);
  58. LOAD(wrmask);
  59. LOAD(hostrw0);
  60. LOAD(hostrw1);
  61.         /* configregs */
  62. LOADC(smask1x);
  63. LOADC(smask1y);
  64. LOADC(smask2x);
  65. LOADC(smask2y);
  66. LOADC(smask3x);
  67. LOADC(smask3y);
  68. LOADC(smask4x);
  69. LOADC(smask4y);
  70. LOADC(topscan);
  71. LOADC(xywin);
  72. LOADC(clipmode);
  73. LOADC(config);
  74. /* Mhm, maybe I am missing something, but it seems that
  75.  * saving/restoring the DCB is only a matter of saving these
  76.  * registers
  77.  */
  78. newport_bfwait ();
  79. LOAD (dcbmode);
  80. newport_bfwait ();
  81. x->dcbdata0 = npregs->set.dcbdata0.byword;
  82. newport_bfwait ();
  83. LOAD(dcbdata1);
  84. }
  85. /*
  86.  * Importat things to keep in mind when restoring the newport context:
  87.  *
  88.  * 1. slopered register is stored as a 2's complete (s12.11);
  89.  *    needs to be converted to a signed magnitude (s(8)12.11).
  90.  *
  91.  * 2. xsave should be stored after xstart.
  92.  *
  93.  * 3. None of the registers should be written with the GO address.
  94.  *    (read the docs for more details on this).
  95.  */
  96. void newport_restore (void *y)
  97. {
  98. newport_ctx *x = y;
  99. #define STORE(val) npregs->set.val = x->val
  100. #define STOREI(val) npregs->set.val.word = x->val
  101. #define STOREC(val) npregs->cset.val = x->val
  102. newport_wait ();
  103. STORE(drawmode1);
  104. STORE(drawmode0);
  105. STORE(lsmode);
  106. STORE(lspattern);
  107. STORE(lspatsave);
  108. STORE(zpattern);
  109. STORE(colorback);
  110. STORE(colorvram);
  111. STORE(alpharef);
  112. STORE(smask0x);
  113. STORE(smask0y);
  114. STOREI(_xstart);
  115. STOREI(_ystart);
  116. STOREI(_xend);
  117. STOREI(_yend);
  118. STORE(xsave);
  119. STORE(xymove);
  120. STOREI(bresd);
  121. STOREI(bress1);
  122. STORE(bresoctinc1);
  123. STORE(bresrndinc2);
  124. STORE(brese1);
  125. STORE(bress2);
  126. STORE(aweight0);
  127. STORE(aweight1);
  128. STOREI(colorred);
  129. STOREI(coloralpha);
  130. STOREI(colorgrn);
  131. STOREI(colorblue);
  132. STOREI(slopered);
  133. STOREI(slopealpha);
  134. STOREI(slopegrn);
  135. STOREI(slopeblue);
  136. STORE(wrmask);
  137. STORE(hostrw0);
  138. STORE(hostrw1);
  139.         /* configregs */
  140. STOREC(smask1x);
  141. STOREC(smask1y);
  142. STOREC(smask2x);
  143. STOREC(smask2y);
  144. STOREC(smask3x);
  145. STOREC(smask3y);
  146. STOREC(smask4x);
  147. STOREC(smask4y);
  148. STOREC(topscan);
  149. STOREC(xywin);
  150. STOREC(clipmode);
  151. STOREC(config);
  152. /* FIXME: restore dcb thingies */
  153. }
  154. int
  155. newport_ioctl (int card, int cmd, unsigned long arg)
  156. {
  157. switch (cmd){
  158. case NG1_SETDISPLAYMODE: {
  159. struct ng1_setdisplaymode_args request;
  160. if (copy_from_user (&request, (void *) arg, sizeof (request)))
  161. return -EFAULT;
  162. newport_wait ();
  163. newport_bfwait ();
  164. npregs->set.dcbmode = DCB_XMAP0 | XM9_CRS_FIFO_AVAIL |
  165. DCB_DATAWIDTH_1 | R_DCB_XMAP9_PROTOCOL;
  166. xmap9FIFOWait (npregs);
  167. /* FIXME: timing is wrong, just be extracted from 
  168.  * the per-board timing table.  I still have to figure
  169.  * out where this comes from
  170.  *
  171.  * This is used to select the protocol used to talk to
  172.  * the xmap9.  For now I am using 60, selecting the
  173.  * WSLOW_DCB_XMAP9_PROTOCOL.
  174.  *
  175.  * Robert Tray comments on this issue:
  176.  *
  177.  * cfreq refers to the frequency of the monitor
  178.  * (ie. the refresh rate).  Our monitors run typically
  179.  * between 60 Hz and 76 Hz.  But it will be as low as
  180.  * 50 Hz if you're displaying NTSC/PAL and as high as
  181.  * 120 Hz if you are runining in stereo mode.  You
  182.  * might want to try the WSLOW values.
  183.  */
  184. xmap9SetModeReg (npregs, request.wid, request.mode, 60);
  185. return 0;
  186. }
  187. case NG1_SET_CURSOR_HOTSPOT: {
  188. struct ng1_set_cursor_hotspot request;
  189. if (copy_from_user (&request, (void *) arg, sizeof (request)))
  190. return -EFAULT;
  191. /* FIXME: make request.xhot, request.yhot the hot spot */
  192. return 0;
  193. }
  194. case NG1_SETGAMMARAMP0:
  195. /* FIXME: load the gamma ramps :-) */
  196. return 0;
  197. }
  198. return -EINVAL;
  199. }