vga.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. /*
  2. * Generic VGA registers.
  3. */
  4. enum {
  5. MiscW = 0x03C2, /* Miscellaneous Output (W) */
  6. MiscR = 0x03CC, /* Miscellaneous Output (R) */
  7. Status0 = 0x03C2, /* Input status 0 (R) */
  8. Status1 = 0x03DA, /* Input Status 1 (R) */
  9. FeatureR = 0x03CA, /* Feature Control (R) */
  10. FeatureW = 0x03DA, /* Feature Control (W) */
  11. Seqx = 0x03C4, /* Sequencer Index, Data at Seqx+1 */
  12. Crtx = 0x03D4, /* CRT Controller Index, Data at Crtx+1 */
  13. Grx = 0x03CE, /* Graphics Controller Index, Data at Grx+1 */
  14. Attrx = 0x03C0, /* Attribute Controller Index and Data */
  15. PaddrW = 0x03C8, /* Palette Address Register, write */
  16. Pdata = 0x03C9, /* Palette Data Register */
  17. Pixmask = 0x03C6, /* Pixel Mask Register */
  18. PaddrR = 0x03C7, /* Palette Address Register, read */
  19. Pstatus = 0x03C7, /* DAC Status (RO) */
  20. Pcolours = 256, /* Palette */
  21. Red = 0,
  22. Green = 1,
  23. Blue = 2,
  24. Pblack = 0x00,
  25. Pwhite = 0xFF,
  26. };
  27. enum {
  28. RefFreq = 14318180, /* External Reference Clock frequency */
  29. VgaFreq0 = 25175000,
  30. VgaFreq1 = 28322000,
  31. };
  32. enum {
  33. Namelen = 32,
  34. };
  35. typedef struct Ctlr Ctlr;
  36. typedef struct Vga Vga;
  37. typedef struct Ctlr {
  38. char name[Namelen+1];
  39. void (*snarf)(Vga*, Ctlr*);
  40. void (*options)(Vga*, Ctlr*);
  41. void (*init)(Vga*, Ctlr*);
  42. void (*load)(Vga*, Ctlr*);
  43. void (*dump)(Vga*, Ctlr*);
  44. char* type;
  45. ulong flag;
  46. Ctlr* link;
  47. } Ctlr;
  48. enum { /* flag */
  49. Fsnarf = 0x00000001, /* snarf done */
  50. Foptions = 0x00000002, /* options done */
  51. Finit = 0x00000004, /* init done */
  52. Fload = 0x00000008, /* load done */
  53. Fdump = 0x00000010, /* dump done */
  54. Ferror = 0x00000020, /* error during snarf */
  55. Hpclk2x8 = 0x00000100, /* have double 8-bit mode */
  56. Upclk2x8 = 0x00000200, /* use double 8-bit mode */
  57. Henhanced = 0x00000400, /* have enhanced mode */
  58. Uenhanced = 0x00000800, /* use enhanced mode */
  59. Hpvram = 0x00001000, /* have parallel VRAM */
  60. Upvram = 0x00002000, /* use parallel VRAM */
  61. Hextsid = 0x00004000, /* have external SID mode */
  62. Uextsid = 0x00008000, /* use external SID mode */
  63. Hclk2 = 0x00010000, /* have clock-doubler */
  64. Uclk2 = 0x00020000, /* use clock-doubler */
  65. Hlinear = 0x00040000, /* have linear-address mode */
  66. Ulinear = 0x00080000, /* use linear-address mode */
  67. Hclkdiv = 0x00100000, /* have a clock-divisor */
  68. Uclkdiv = 0x00200000, /* use clock-divisor */
  69. Hsid32 = 0x00400000, /* have a 32-bit (as opposed to 64-bit) SID */
  70. };
  71. typedef struct Attr Attr;
  72. typedef struct Attr {
  73. char* attr;
  74. char* val;
  75. Attr* next;
  76. } Attr;
  77. typedef struct Mode {
  78. char type[Namelen+1]; /* monitor type e.g. "vs1782" */
  79. char size[Namelen+1]; /* size e.g. "1376x1024x8" */
  80. char chan[Namelen+1]; /* channel descriptor, e.g. "m8" or "r8g8b8a8" */
  81. char name[Namelen+1]; /* optional */
  82. int frequency; /* Dot Clock (MHz) */
  83. int deffrequency; /* Default dot clock if calculation can't be done */
  84. int x; /* Horizontal Display End (Crt01), from .size[] */
  85. int y; /* Vertical Display End (Crt18), from .size[] */
  86. int z; /* depth, from .size[] */
  87. int ht; /* Horizontal Total (Crt00) */
  88. int shb; /* Start Horizontal Blank (Crt02) */
  89. int ehb; /* End Horizontal Blank (Crt03) */
  90. int shs; /* optional Start Horizontal Sync (Crt04) */
  91. int ehs; /* optional End Horizontal Sync (Crt05) */
  92. int vt; /* Vertical Total (Crt06) */
  93. int vrs; /* Vertical Retrace Start (Crt10) */
  94. int vre; /* Vertical Retrace End (Crt11) */
  95. int vbs; /* optional Vertical Blank Start */
  96. int vbe; /* optional Vertical Blank End */
  97. ulong videobw;
  98. char hsync;
  99. char vsync;
  100. char interlace;
  101. Attr* attr;
  102. } Mode;
  103. /*
  104. * The sizes of the register sets are large as many SVGA and GUI chips have extras.
  105. * The Crt registers are ushorts in order to keep overflow bits handy.
  106. * The clock elements are used for communication between the VGA, RAMDAC and clock chips;
  107. * they can use them however they like, it's assumed they will be used compatibly.
  108. *
  109. * The mode->x, mode->y coordinates are the physical size of the screen.
  110. * Virtx and virty are the coordinates of the underlying memory image.
  111. * This can be used to implement panning around a larger screen or to cope
  112. * with chipsets that need the in-memory pixel line width to be a round number.
  113. * For example, virge.c uses this because the Savage chipset needs the pixel
  114. * width to be a multiple of 16. Also, mga2164w.c needs the pixel width
  115. * to be a multiple of 128.
  116. *
  117. * Vga->panning differentiates between these two uses of virtx, virty.
  118. *
  119. * (14 October 2001, rsc) Most drivers don't know the difference between
  120. * mode->x and virtx, a bug that should be corrected. Vga.c, virge.c, and
  121. * mga2164w.c know. For the others, the computation that sets crt[0x13]
  122. * should use virtx instead of mode->x (and maybe other places change too,
  123. * dependent on the driver).
  124. */
  125. typedef struct Vga {
  126. uchar misc;
  127. uchar feature;
  128. uchar sequencer[256];
  129. ushort crt[256];
  130. uchar graphics[256];
  131. uchar attribute[256];
  132. uchar pixmask;
  133. uchar pstatus;
  134. uchar palette[Pcolours][3];
  135. ulong f[2]; /* clock */
  136. ulong d[2];
  137. ulong i[2];
  138. ulong m[2];
  139. ulong n[2];
  140. ulong p[2];
  141. ulong q[2];
  142. ulong r[2];
  143. ulong vma; /* video memory linear-address alignment */
  144. ulong vmb; /* video memory linear-address base */
  145. ulong apz; /* aperture size */
  146. ulong vmz; /* video memory size */
  147. ulong membw; /* memory bandwidth, MB/s */
  148. long offset; /* BIOS string offset */
  149. char* bios; /* matching BIOS string */
  150. Pcidev* pci; /* matching PCI device if any */
  151. Mode* mode;
  152. ulong virtx; /* resolution of virtual screen */
  153. ulong virty;
  154. int panning; /* pan the virtual screen */
  155. Ctlr* ctlr;
  156. Ctlr* ramdac;
  157. Ctlr* clock;
  158. Ctlr* hwgc;
  159. Ctlr* vesa;
  160. Ctlr* link;
  161. int linear;
  162. Attr* attr;
  163. void* private;
  164. } Vga;
  165. /* 3dfx.c */
  166. extern Ctlr tdfx;
  167. extern Ctlr tdfxhwgc;
  168. /* ark2000pv.c */
  169. extern Ctlr ark2000pv;
  170. extern Ctlr ark2000pvhwgc;
  171. /* att20c49x.c */
  172. extern Ctlr att20c490;
  173. extern Ctlr att20c491;
  174. extern Ctlr att20c492;
  175. /* att21c498.c */
  176. extern uchar attdaci(uchar);
  177. extern void attdaco(uchar, uchar);
  178. extern Ctlr att21c498;
  179. /* bt485.c */
  180. extern uchar bt485i(uchar);
  181. extern void bt485o(uchar, uchar);
  182. extern Ctlr bt485;
  183. /* ch9294.c */
  184. extern Ctlr ch9294;
  185. /* clgd542x.c */
  186. extern void clgd54xxclock(Vga*, Ctlr*);
  187. extern Ctlr clgd542x;
  188. extern Ctlr clgd542xhwgc;
  189. /* clgd546x.c */
  190. extern Ctlr clgd546x;
  191. extern Ctlr clgd546xhwgc;
  192. /* ct65540.c */
  193. extern Ctlr ct65540;
  194. extern Ctlr ct65545;
  195. extern Ctlr ct65545hwgc;
  196. /* cyber938x.c */
  197. extern Ctlr cyber938x;
  198. extern Ctlr cyber938xhwgc;
  199. /* data.c */
  200. extern int cflag;
  201. extern int dflag;
  202. extern Ctlr *ctlrs[];
  203. extern ushort dacxreg[4];
  204. /* db.c */
  205. extern char* dbattr(Attr*, char*);
  206. extern int dbctlr(char*, Vga*);
  207. extern Mode* dbmode(char*, char*, char*);
  208. extern void dbdumpmode(Mode*);
  209. /* error.c */
  210. extern void error(char*, ...);
  211. extern void trace(char*, ...);
  212. extern int vflag, Vflag;
  213. /* et4000.c */
  214. extern Ctlr et4000;
  215. /* et4000hwgc.c */
  216. extern Ctlr et4000hwgc;
  217. /* hiqvideo.c */
  218. extern Ctlr hiqvideo;
  219. extern Ctlr hiqvideohwgc;
  220. /* i81x.c */
  221. extern Ctlr i81x;
  222. extern Ctlr i81xhwgc;
  223. /* ibm8514.c */
  224. extern Ctlr ibm8514;
  225. /* icd2061a.c */
  226. extern Ctlr icd2061a;
  227. /* ics2494.c */
  228. extern Ctlr ics2494;
  229. extern Ctlr ics2494a;
  230. /* ics534x.c */
  231. extern Ctlr ics534x;
  232. /* io.c */
  233. extern uchar inportb(long);
  234. extern void outportb(long, uchar);
  235. extern ushort inportw(long);
  236. extern void outportw(long, ushort);
  237. extern ulong inportl(long);
  238. extern void outportl(long, ulong);
  239. extern char* vgactlr(char*, char*);
  240. extern void vgactlw(char*, char*);
  241. extern char* readbios(long, long);
  242. extern void dumpbios(long);
  243. extern void error(char*, ...);
  244. extern void* alloc(ulong);
  245. extern void printitem(char*, char*);
  246. extern void printreg(ulong);
  247. extern void printflag(ulong);
  248. extern void setpalette(int, int, int, int);
  249. extern int curprintindex;
  250. /* mach32.c */
  251. extern Ctlr mach32;
  252. /* mach64.c */
  253. extern Ctlr mach64;
  254. /* mach64xx.c */
  255. extern Ctlr mach64xx;
  256. extern Ctlr mach64xxhwgc;
  257. /* main.c */
  258. extern char* chanstr[];
  259. extern void resyncinit(Vga*, Ctlr*, ulong, ulong);
  260. extern void sequencer(Vga*, int);
  261. extern void main(int, char*[]);
  262. Biobuf stdout;
  263. /* mga2164w.c */
  264. extern Ctlr mga2164w;
  265. extern Ctlr mga2164whwgc;
  266. /* neomagic.c */
  267. extern Ctlr neomagic;
  268. extern Ctlr neomagichwgc;
  269. /* nvidia.c */
  270. extern Ctlr nvidia;
  271. extern Ctlr nvidiahwgc;
  272. /* palette.c */
  273. extern Ctlr palette;
  274. /* pci.c */
  275. typedef struct Pcidev Pcidev;
  276. extern int pcicfgr8(Pcidev*, int);
  277. extern int pcicfgr16(Pcidev*, int);
  278. extern int pcicfgr32(Pcidev*, int);
  279. extern void pcicfgw8(Pcidev*, int, int);
  280. extern void pcicfgw16(Pcidev*, int, int);
  281. extern void pcicfgw32(Pcidev*, int, int);
  282. extern void pcihinv(Pcidev*);
  283. extern Pcidev* pcimatch(Pcidev*, int, int);
  284. /* rgb524.c */
  285. extern Ctlr rgb524;
  286. /* rgb524mn.c */
  287. extern uchar (*rgb524mnxi)(Vga*, int);
  288. extern void (*rgb524mnxo)(Vga*, int, uchar);
  289. extern Ctlr rgb524mn;
  290. /* s3801.c */
  291. extern Ctlr s3801;
  292. extern Ctlr s3805;
  293. /* s3928.c */
  294. extern Ctlr s3928;
  295. /* s3clock.c */
  296. extern Ctlr s3clock;
  297. /* s3generic.c */
  298. extern Ctlr s3generic;
  299. /* s3hwgc.c */
  300. extern Ctlr bt485hwgc;
  301. extern Ctlr rgb524hwgc;
  302. extern Ctlr s3hwgc;
  303. extern Ctlr tvp3020hwgc;
  304. extern Ctlr tvp3026hwgc;
  305. /* sc15025.c */
  306. extern Ctlr sc15025;
  307. /* stg1702.c */
  308. extern Ctlr stg1702;
  309. /* t2r4.c */
  310. extern Ctlr t2r4;
  311. extern Ctlr t2r4hwgc;
  312. /* trio64.c */
  313. extern void trio64clock(Vga*, Ctlr*);
  314. extern Ctlr trio64;
  315. /* tvp3020.c */
  316. extern uchar tvp3020i(uchar);
  317. extern uchar tvp3020xi(uchar);
  318. extern void tvp3020o(uchar, uchar);
  319. extern void tvp3020xo(uchar, uchar);
  320. extern Ctlr tvp3020;
  321. /* tvp3025.c */
  322. extern Ctlr tvp3025;
  323. /* tvp3025clock.c */
  324. extern Ctlr tvp3025clock;
  325. /* tvp3026.c */
  326. extern uchar tvp3026xi(uchar);
  327. extern void tvp3026xo(uchar, uchar);
  328. extern Ctlr tvp3026;
  329. /* tvp3026clock.c */
  330. extern Ctlr tvp3026clock;
  331. /* vga.c */
  332. extern uchar vgai(long);
  333. extern uchar vgaxi(long, uchar);
  334. extern void vgao(long, uchar);
  335. extern void vgaxo(long, uchar, uchar);
  336. extern Ctlr generic;
  337. /* vesa.c */
  338. extern Ctlr vesa;
  339. extern Ctlr softhwgc; /* has to go somewhere */
  340. extern int dbvesa(Vga*);
  341. extern Mode *dbvesamode(char*);
  342. extern void vesatextmode(void);
  343. /* virge.c */
  344. extern Ctlr virge;
  345. /* vision864.c */
  346. extern Ctlr vision864;
  347. /* vision964.c */
  348. extern Ctlr vision964;
  349. /* vision968.c */
  350. extern Ctlr vision968;
  351. /* vmware.c */
  352. extern Ctlr vmware;
  353. extern Ctlr vmwarehwgc;
  354. /* w30c516.c */
  355. extern Ctlr w30c516;
  356. /* mga4xx.c */
  357. extern Ctlr mga4xx;
  358. extern Ctlr mga4xxhwgc;
  359. #pragma varargck argpos error 1
  360. #pragma varargck argpos trace 1