vision964.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include "pci.h"
  5. #include "vga.h"
  6. /*
  7. * S3 Vision964 GUI Accelerator.
  8. */
  9. static void
  10. snarf(Vga* vga, Ctlr* ctlr)
  11. {
  12. s3generic.snarf(vga, ctlr);
  13. vga->crt[0x22] = vgaxi(Crtx, 0x22);
  14. vga->crt[0x24] = vgaxi(Crtx, 0x24);
  15. vga->crt[0x26] = vgaxi(Crtx, 0x26);
  16. }
  17. static void
  18. options(Vga*, Ctlr* ctlr)
  19. {
  20. ctlr->flag |= Hlinear|Henhanced|Foptions;
  21. }
  22. static void
  23. init(Vga* vga, Ctlr* ctlr)
  24. {
  25. Mode *mode;
  26. ulong x;
  27. int sid, dbl, bpp, divide;
  28. char *val;
  29. if(vga->mode->z > 8)
  30. error("depth %d not supported\n", vga->mode->z);
  31. mode = vga->mode;
  32. if(vga->ramdac && (vga->ramdac->flag & Uclk2)){
  33. resyncinit(vga, ctlr, Uenhanced, 0);
  34. vga->crt[0x00] = ((mode->ht/2)>>3)-5;
  35. vga->crt[0x01] = ((mode->x/2)>>3)-1;
  36. vga->crt[0x02] = ((mode->shb/2)>>3)-1;
  37. x = (mode->ehb/2)>>3;
  38. vga->crt[0x03] = 0x80|(x & 0x1F);
  39. vga->crt[0x04] = (mode->shs/2)>>3;
  40. vga->crt[0x05] = ((mode->ehs/2)>>3) & 0x1F;
  41. if(x & 0x20)
  42. vga->crt[0x05] |= 0x80;
  43. vga->crt[0x13] = mode->x/8;
  44. }
  45. else if(mode->z == 8)
  46. resyncinit(vga, ctlr, Uenhanced, 0);
  47. s3generic.init(vga, ctlr);
  48. /*
  49. if((ctlr->flag & Uenhanced) == 0)
  50. vga->crt[0x33] &= ~0x20;
  51. */
  52. vga->crt[0x3B] = (vga->crt[0]+vga->crt[4]+1)/2;
  53. if(vga->crt[0x3B] & 0x100)
  54. vga->crt[0x5D] |= 0x40;
  55. vga->crt[0x55] = 0x00;
  56. vga->crt[0x40] &= ~0x10;
  57. vga->crt[0x53] &= ~0x20;
  58. vga->crt[0x58] &= ~0x48;
  59. if(dbattr(vga->attr, "sam512") == 0)
  60. vga->crt[0x58] |= 0x40; /* set 256 word SAM, always works */
  61. vga->crt[0x65] = 0x00;
  62. vga->crt[0x66] &= ~0x07;
  63. vga->crt[0x6D] = 0x00;
  64. if(ctlr->flag & Uenhanced){
  65. if(vga->ramdac && (vga->ramdac->flag & Hsid32))
  66. sid = 32;
  67. else
  68. sid = 64;
  69. if(vga->ramdac && (vga->ramdac->flag & Uclk2))
  70. dbl = 2;
  71. else
  72. dbl = 1;
  73. if(mode->z < 4)
  74. bpp = 4;
  75. else
  76. bpp = mode->z;
  77. divide = sid/(dbl*bpp);
  78. switch(divide){
  79. case 2:
  80. vga->crt[0x66] |= 0x01;
  81. break;
  82. case 4:
  83. vga->crt[0x66] |= 0x02;
  84. break;
  85. case 8:
  86. vga->crt[0x66] |= 0x03;
  87. break;
  88. case 16:
  89. vga->crt[0x66] |= 0x04;
  90. break;
  91. case 32:
  92. vga->crt[0x66] |= 0x05;
  93. break;
  94. }
  95. vga->crt[0x40] |= 0x10;
  96. vga->crt[0x65] |= 0x02;
  97. if(vga->ramdac && (vga->ramdac->flag & Hsid32))
  98. vga->crt[0x66] |= 0x10;
  99. /*
  100. * Some heuristics (what part of aux/vga isn't?)
  101. * to prevent some of the right border appearing
  102. * on the left edge of the screen.
  103. */
  104. if(dbattr(vga->attr, "vclkphs"))
  105. vga->crt[0x67] |= 0x01;
  106. if(val = dbattr(vga->attr, "delaybl"))
  107. vga->crt[0x6D] |= strtoul(val, 0, 0) & 0x07;
  108. else if(mode->x > 1024)
  109. vga->crt[0x6D] |= 0x01;
  110. else
  111. vga->crt[0x6D] |= 0x03;
  112. if(val = dbattr(vga->attr, "delaysc"))
  113. vga->crt[0x6D] |= (strtoul(val, 0, 0) & 0x07)<<4;
  114. }
  115. }
  116. static void
  117. load(Vga* vga, Ctlr* ctlr)
  118. {
  119. ushort advfunc;
  120. s3generic.load(vga, ctlr);
  121. vgaxo(Crtx, 0x65, vga->crt[0x65]);
  122. vgaxo(Crtx, 0x66, vga->crt[0x66]);
  123. vgaxo(Crtx, 0x6D, vga->crt[0x6D]);
  124. advfunc = 0x0000;
  125. if(ctlr->flag & Uenhanced)
  126. advfunc = 0x0001;
  127. outportw(0x4AE8, advfunc);
  128. }
  129. static void
  130. dump(Vga* vga, Ctlr* ctlr)
  131. {
  132. s3generic.dump(vga, ctlr);
  133. printitem(ctlr->name, "Crt22");
  134. printreg(vga->crt[0x22]);
  135. printitem(ctlr->name, "Crt24");
  136. printreg(vga->crt[0x24]);
  137. printitem(ctlr->name, "Crt26");
  138. printreg(vga->crt[0x26]);
  139. }
  140. Ctlr vision964 = {
  141. "vision964", /* name */
  142. snarf, /* snarf */
  143. options, /* options */
  144. init, /* init */
  145. load, /* load */
  146. dump, /* dump */
  147. };