vision968.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include "pci.h"
  5. #include "vga.h"
  6. /*
  7. * S3 Vision968 GUI Accelerator.
  8. */
  9. static void
  10. snarf(Vga* vga, Ctlr* ctlr)
  11. {
  12. s3generic.snarf(vga, ctlr);
  13. vga->sequencer[0x09] = vgaxi(Seqx, 0x09);
  14. vga->sequencer[0x0A] = vgaxi(Seqx, 0x0A);
  15. vga->crt[0x22] = vgaxi(Crtx, 0x22);
  16. vga->crt[0x24] = vgaxi(Crtx, 0x24);
  17. vga->crt[0x26] = vgaxi(Crtx, 0x26);
  18. vga->crt[0x2D] = vgaxi(Crtx, 0x2D);
  19. vga->crt[0x2E] = vgaxi(Crtx, 0x2E);
  20. vga->crt[0x2F] = vgaxi(Crtx, 0x2F);
  21. }
  22. static void
  23. options(Vga*, Ctlr* ctlr)
  24. {
  25. ctlr->flag |= Hlinear|Henhanced|Foptions;
  26. }
  27. static void
  28. init(Vga* vga, Ctlr* ctlr)
  29. {
  30. Mode *mode;
  31. ulong x;
  32. int sid, dbl, bpp, divide;
  33. char *val;
  34. if(vga->mode->z > 8)
  35. error("depth %d not supported\n", vga->mode->z);
  36. mode = vga->mode;
  37. if(vga->ramdac && (vga->ramdac->flag & Uclk2)){
  38. resyncinit(vga, ctlr, Uenhanced, 0);
  39. vga->crt[0x00] = ((mode->ht/2)>>3)-5;
  40. vga->crt[0x01] = ((mode->x/2)>>3)-1;
  41. vga->crt[0x02] = ((mode->shb/2)>>3)-1;
  42. x = (mode->ehb/2)>>3;
  43. vga->crt[0x03] = 0x80|(x & 0x1F);
  44. vga->crt[0x04] = (mode->shs/2)>>3;
  45. vga->crt[0x05] = ((mode->ehs/2)>>3) & 0x1F;
  46. if(x & 0x20)
  47. vga->crt[0x05] |= 0x80;
  48. vga->crt[0x13] = mode->x/8;
  49. }
  50. else if(mode->z == 8)
  51. resyncinit(vga, ctlr, Uenhanced, 0);
  52. s3generic.init(vga, ctlr);
  53. /*
  54. if((ctlr->flag & Uenhanced) == 0)
  55. vga->crt[0x33] &= ~0x20;
  56. */
  57. vga->crt[0x3B] = (vga->crt[0]+vga->crt[4]+1)/2;
  58. if(vga->crt[0x3B] & 0x100)
  59. vga->crt[0x5D] |= 0x40;
  60. vga->crt[0x55] = 0x00;
  61. vga->crt[0x40] &= ~0x10;
  62. vga->crt[0x53] &= ~0x20;
  63. vga->crt[0x58] &= ~0x48;
  64. vga->crt[0x65] = 0x00;
  65. vga->crt[0x66] &= ~0x07;
  66. vga->crt[0x67] = 0x00;
  67. vga->crt[0x6D] = 0x00;
  68. if(ctlr->flag & Uenhanced){
  69. if(vga->ramdac && (vga->ramdac->flag & Hextsid)){
  70. if(vga->ramdac->flag & Hsid32)
  71. sid = 32;
  72. else
  73. sid = 64;
  74. if(vga->ramdac->flag & Uclk2)
  75. dbl = 2;
  76. else
  77. dbl = 1;
  78. if(mode->z < 4)
  79. bpp = 4;
  80. else
  81. bpp = mode->z;
  82. divide = sid/(dbl*bpp);
  83. switch(divide){
  84. case 2:
  85. vga->crt[0x66] |= 0x01;
  86. break;
  87. case 4:
  88. vga->crt[0x66] |= 0x02;
  89. break;
  90. case 8:
  91. vga->crt[0x66] |= 0x03;
  92. break;
  93. case 16:
  94. vga->crt[0x66] |= 0x04;
  95. break;
  96. case 32:
  97. vga->crt[0x66] |= 0x05;
  98. break;
  99. }
  100. }
  101. vga->crt[0x40] |= 0x10;
  102. vga->crt[0x58] |= 0x40;
  103. /*
  104. * The test against 1376 is necessary for the STB
  105. * Velocity 64 Video, no idea if it's relevant to other
  106. * cards.
  107. * Although not mentioned in the databook, bit 4 of Crt67
  108. * needs to be set on the STB Velocity 64 Video too. Gak.
  109. */
  110. if(dbattr(vga->attr, "disa1sc") && mode->x <= 1376)
  111. vga->crt[0x65] |= 0x02;
  112. if(vga->ramdac && strncmp(vga->ramdac->name, "tvp3026", 7))
  113. vga->crt[0x67] |= 0x10;
  114. if(dbattr(vga->attr, "vclkphs"))
  115. vga->crt[0x67] |= 0x01;
  116. if(val = dbattr(vga->attr, "delaybl"))
  117. vga->crt[0x6D] |= strtoul(val, 0, 0) & 0x07;
  118. if(val = dbattr(vga->attr, "delaysc"))
  119. vga->crt[0x6D] |= (strtoul(val, 0, 0) & 0x07)<<4;
  120. }
  121. }
  122. static void
  123. load(Vga* vga, Ctlr* ctlr)
  124. {
  125. ushort advfunc;
  126. s3generic.load(vga, ctlr);
  127. vgaxo(Crtx, 0x65, vga->crt[0x65]);
  128. vgaxo(Crtx, 0x66, vga->crt[0x66]);
  129. vgaxo(Crtx, 0x67, vga->crt[0x67]);
  130. vgaxo(Crtx, 0x6D, vga->crt[0x6D]);
  131. advfunc = 0x0000;
  132. if(ctlr->flag & Uenhanced)
  133. advfunc = 0x0001;
  134. outportw(0x4AE8, advfunc);
  135. }
  136. static void
  137. dump(Vga* vga, Ctlr* ctlr)
  138. {
  139. s3generic.dump(vga, ctlr);
  140. printitem(ctlr->name, "Seq09");
  141. printreg(vga->sequencer[0x09]);
  142. printreg(vga->sequencer[0x0A]);
  143. printitem(ctlr->name, "Crt22");
  144. printreg(vga->crt[0x22]);
  145. printitem(ctlr->name, "Crt24");
  146. printreg(vga->crt[0x24]);
  147. printitem(ctlr->name, "Crt26");
  148. printreg(vga->crt[0x26]);
  149. printitem(ctlr->name, "Crt2D");
  150. printreg(vga->crt[0x2D]);
  151. printreg(vga->crt[0x2E]);
  152. printreg(vga->crt[0x2F]);
  153. }
  154. Ctlr vision968 = {
  155. "vision968", /* name */
  156. snarf, /* snarf */
  157. options, /* options */
  158. init, /* init */
  159. load, /* load */
  160. dump, /* dump */
  161. };