]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/aux/vga/vga.h
exec(2): fix prototypes
[plan9front.git] / sys / src / cmd / aux / vga / vga.h
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
12         Seqx            = 0x03C4,       /* Sequencer Index, Data at Seqx+1 */
13         Crtx            = 0x03D4,       /* CRT Controller Index, Data at Crtx+1 */
14         Grx             = 0x03CE,       /* Graphics Controller Index, Data at Grx+1 */
15         Attrx           = 0x03C0,       /* Attribute Controller Index and Data */
16
17         PaddrW          = 0x03C8,       /* Palette Address Register, write */
18         Pdata           = 0x03C9,       /* Palette Data Register */
19         Pixmask         = 0x03C6,       /* Pixel Mask Register */
20         PaddrR          = 0x03C7,       /* Palette Address Register, read */
21         Pstatus         = 0x03C7,       /* DAC Status (RO) */
22
23         Pcolours        = 256,          /* Palette */
24         Red             = 0,
25         Green           = 1,
26         Blue            = 2,
27
28         Pblack          = 0x00,
29         Pwhite          = 0xFF,
30 };
31
32 enum {
33         RefFreq         = 14318180,     /* External Reference Clock frequency */
34         VgaFreq0        = 25175000,
35         VgaFreq1        = 28322000,
36 };
37
38 enum {
39         Namelen         = 32,
40 };
41
42 typedef struct Ctlr Ctlr;
43 typedef struct Vga Vga;
44
45 typedef struct Ctlr {
46         char    name[Namelen+1];
47         void    (*snarf)(Vga*, Ctlr*);
48         void    (*options)(Vga*, Ctlr*);
49         void    (*init)(Vga*, Ctlr*);
50         void    (*load)(Vga*, Ctlr*);
51         void    (*dump)(Vga*, Ctlr*);
52         char*   type;
53
54         ulong   flag;
55
56         Ctlr*   link;
57 } Ctlr;
58
59 enum {                                  /* flag */
60         Fsnarf          = 0x00000001,   /* snarf done */
61         Foptions        = 0x00000002,   /* options done */
62         Finit           = 0x00000004,   /* init done */
63         Fload           = 0x00000008,   /* load done */
64         Fdump           = 0x00000010,   /* dump done */
65         Ferror          = 0x00000020, /* error during snarf */
66
67         Hpclk2x8        = 0x00000100,   /* have double 8-bit mode */
68         Upclk2x8        = 0x00000200,   /* use double 8-bit mode */
69         Henhanced       = 0x00000400,   /* have enhanced mode */
70         Uenhanced       = 0x00000800,   /* use enhanced mode */
71         Hpvram          = 0x00001000,   /* have parallel VRAM */
72         Upvram          = 0x00002000,   /* use parallel VRAM */
73         Hextsid         = 0x00004000,   /* have external SID mode */
74         Uextsid         = 0x00008000,   /* use external SID mode */
75         Hclk2           = 0x00010000,   /* have clock-doubler */
76         Uclk2           = 0x00020000,   /* use clock-doubler */
77         Hlinear         = 0x00040000,   /* have linear-address mode */
78         Ulinear         = 0x00080000,   /* use linear-address mode */
79         Hclkdiv         = 0x00100000,   /* have a clock-divisor */
80         Uclkdiv         = 0x00200000,   /* use clock-divisor */
81         Hsid32          = 0x00400000,   /* have a 32-bit (as opposed to 64-bit) SID */
82 };
83
84 typedef struct Attr Attr;
85 struct Attr {
86         char*   attr;
87         char*   val;
88
89         Attr*   next;
90 };
91
92 typedef struct Mode {
93         char    type[Namelen+1];        /* monitor type e.g. "vs1782" */
94         char    size[Namelen+1];        /* size e.g. "1376x1024x8" */
95         char    chan[Namelen+1];        /* channel descriptor, e.g. "m8" or "r8g8b8a8" */
96         char name[Namelen+1];   /* optional */
97
98         int     frequency;              /* Dot Clock (MHz) */
99         int     deffrequency;           /* Default dot clock if calculation can't be done */
100         int     x;                      /* Horizontal Display End (Crt01), from .size[] */
101         int     y;                      /* Vertical Display End (Crt18), from .size[] */
102         int     z;                      /* depth, from .size[] */
103
104         int     ht;                     /* Horizontal Total (Crt00) */
105         int     shb;                    /* Start Horizontal Blank (Crt02) */
106         int     ehb;                    /* End Horizontal Blank (Crt03) */
107
108         int     shs;                    /* optional Start Horizontal Sync (Crt04) */
109         int     ehs;                    /* optional End Horizontal Sync (Crt05) */
110
111         int     vt;                     /* Vertical Total (Crt06) */
112         int     vrs;                    /* Vertical Retrace Start (Crt10) */
113         int     vre;                    /* Vertical Retrace End (Crt11) */
114         
115         ulong   videobw;
116
117         char    hsync;
118         char    vsync;
119         char    interlace;
120
121         Attr*   attr;
122 } Mode;
123
124 typedef struct Modelist Modelist;
125 struct Modelist {
126         Mode;
127         Modelist *next;
128 };
129
130 typedef struct Edid {
131         char            mfr[4];         /* manufacturer */
132         char            serialstr[16];  /* serial number as string (in extended data) */
133         char            name[16];       /* monitor name as string (in extended data) */
134         ushort          product;        /* product code, 0 = unused */
135         ulong           serial;         /* serial number, 0 = unused */
136         uchar           version;        /* major version number */
137         uchar           revision;       /* minor version number */
138         uchar           mfrweek;        /* week of manufacture, 0 = unused */
139         int             mfryear;        /* year of manufacture, 0 = unused */
140         uchar           dxcm;           /* horizontal image size in cm. */
141         uchar           dycm;           /* vertical image size in cm. */
142         int             gamma;          /* gamma*100 */
143         int             rrmin;          /* minimum vertical refresh rate */
144         int             rrmax;          /* maximum vertical refresh rate */
145         int             hrmin;          /* minimum horizontal refresh rate */
146         int             hrmax;          /* maximum horizontal refresh rate */
147         ulong           pclkmax;        /* maximum pixel clock */
148         int             flags;
149         Modelist        *modelist;      /* list of supported modes */
150 } Edid;
151
152 typedef struct Flag {
153         int bit;
154         char *desc;
155 } Flag;
156
157 /*
158  * The sizes of the register sets are large as many SVGA and GUI chips have extras.
159  * The Crt registers are ushorts in order to keep overflow bits handy.
160  * The clock elements are used for communication between the VGA, RAMDAC and clock chips;
161  * they can use them however they like, it's assumed they will be used compatibly.
162  *
163  * The mode->x, mode->y coordinates are the physical size of the screen. 
164  * Virtx and virty are the coordinates of the underlying memory image.
165  * This can be used to implement panning around a larger screen or to cope
166  * with chipsets that need the in-memory pixel line width to be a round number.
167  * For example, virge.c uses this because the Savage chipset needs the pixel 
168  * width to be a multiple of 16.  Also, mga2164w.c needs the pixel width
169  * to be a multiple of 128.
170  *
171  * Vga->panning differentiates between these two uses of virtx, virty.
172  *
173  * (14 October 2001, rsc) Most drivers don't know the difference between
174  * mode->x and virtx, a bug that should be corrected.  Vga.c, virge.c, and 
175  * mga2164w.c know.  For the others, the computation that sets crt[0x13]
176  * should use virtx instead of mode->x (and maybe other places change too,
177  * dependent on the driver).
178  */
179 typedef struct Vga {
180         uchar   misc;
181         uchar   feature;
182         uchar   sequencer[256];
183         ushort  crt[256];
184         uchar   graphics[256];
185         uchar   attribute[256];
186         uchar   pixmask;
187         uchar   pstatus;
188         uchar   palette[Pcolours][3];
189
190         ulong   f[2];                   /* clock */
191         ulong   d[2];
192         ulong   i[2];
193         ulong   m[2];
194         ulong   n[2];
195         ulong   p[2];
196         ulong   q[2];
197         ulong   r[2];
198
199         ulong   vma;                    /* video memory linear-address alignment */
200         ulong   vmb;                    /* video memory linear-address base */
201         ulong   apz;                    /* aperture size */
202         ulong   vmz;                    /* video memory size */
203
204         ulong   membw;                  /* memory bandwidth, MB/s */
205
206         long    offset;                 /* BIOS string offset */
207         char*   bios;                   /* matching BIOS string */
208         Pcidev* pci;                    /* matching PCI device if any */
209
210         Mode*   mode;
211
212         ulong   virtx;                  /* resolution of virtual screen */
213         ulong   virty;
214
215         int     panning;                /* pan the virtual screen */
216
217         Ctlr*   ctlr;
218         Ctlr*   ramdac;
219         Ctlr*   clock;
220         Ctlr*   hwgc;
221         Ctlr*   vesa;
222         Ctlr*   link;
223         int     linear;
224         Attr*   attr;
225
226         Edid*   edid[8];                /* edid information for connected monitors */
227
228         void*   private;
229 } Vga;
230
231 /* 3dfx.c */
232 extern Ctlr tdfx;
233 extern Ctlr tdfxhwgc;
234
235 /* ark2000pv.c */
236 extern Ctlr ark2000pv;
237 extern Ctlr ark2000pvhwgc;
238
239 /* att20c49x.c */
240 extern Ctlr att20c490;
241 extern Ctlr att20c491;
242 extern Ctlr att20c492;
243
244 /* att21c498.c */
245 extern uchar attdaci(uchar);
246 extern void attdaco(uchar, uchar);
247 extern Ctlr att21c498;
248
249 /* bt485.c */
250 extern uchar bt485i(uchar);
251 extern void bt485o(uchar, uchar);
252 extern Ctlr bt485;
253
254 /* ch9294.c */
255 extern Ctlr ch9294;
256
257 /* clgd542x.c */
258 extern void clgd54xxclock(Vga*, Ctlr*);
259 extern Ctlr clgd542x;
260 extern Ctlr clgd542xhwgc;
261
262 /* clgd546x.c */
263 extern Ctlr clgd546x;
264 extern Ctlr clgd546xhwgc;
265
266 /* ct65540.c */
267 extern Ctlr ct65540;
268 extern Ctlr ct65545;
269 extern Ctlr ct65545hwgc;
270
271 /* cyber938x.c */
272 extern Ctlr cyber938x;
273 extern Ctlr cyber938xhwgc;
274
275 /* data.c */
276 extern int cflag;
277 extern int dflag;
278 extern Ctlr *ctlrs[];
279 extern ushort dacxreg[4];
280
281 /* db.c */
282 extern Attr* mkattr(Attr*, char*, char*, ...);
283 extern char* dbattr(Attr*, char*);
284 extern int dbctlr(char*, Vga*);
285 extern Mode* dbmode(char*, char*, char*);
286 extern void dbdumpmode(Mode*);
287
288 /* edid.c */
289 enum {
290         Fdigital        = 1<<0, /* is a digital display */
291         Fdpmsstandby    = 1<<1, /* supports DPMS standby mode */
292         Fdpmssuspend    = 1<<2, /* supports DPMS suspend mode */
293         Fdpmsactiveoff  = 1<<3, /* supports DPMS active off mode */
294         Fmonochrome     = 1<<4, /* is a monochrome display */
295         Fgtf            = 1<<5, /* supports VESA GTF: see /public/doc/vesa/gtf10.pdf */
296 };
297 extern Flag edidflags[];
298 extern void printflags(Flag *f, int b);
299 extern Edid* parseedid128(void *v);
300 extern void printedid(Edid *e);
301
302 /* error.c */
303 extern void error(char*, ...);
304 extern void trace(char*, ...);
305 extern int vflag, Vflag;
306
307 /* et4000.c */
308 extern Ctlr et4000;
309
310 /* et4000hwgc.c */
311 extern Ctlr et4000hwgc;
312
313 /* hiqvideo.c */
314 extern Ctlr hiqvideo;
315 extern Ctlr hiqvideohwgc;
316
317 /* i81x.c */
318 extern Ctlr i81x;
319 extern Ctlr i81xhwgc;
320
321 /* ibm8514.c */
322 extern Ctlr ibm8514;
323
324 /* icd2061a.c */
325 extern Ctlr icd2061a;
326
327 /* ics2494.c */
328 extern Ctlr ics2494;
329 extern Ctlr ics2494a;
330
331 /* ics534x.c */
332 extern Ctlr ics534x;
333
334 /* io.c */
335 extern uchar inportb(long);
336 extern void outportb(long, uchar);
337 extern ushort inportw(long);
338 extern void outportw(long, ushort);
339 extern ulong inportl(long);
340 extern void outportl(long, ulong);
341 extern char* vgactlr(char*, char*);
342 extern void vgactlw(char*, char*);
343 extern char* readbios(long, long);
344 extern void dumpbios(long);
345 extern void error(char*, ...);
346 extern void* alloc(ulong);
347 extern void printitem(char*, char*);
348 extern void printreg(ulong);
349 extern void printflag(ulong);
350 extern void setpalette(int, int, int, int);
351 extern int curprintindex;
352 extern uvlong rdmsr(long);
353 extern void wrmsr(long, uvlong);
354
355 /* geode.c */
356 extern Ctlr geode;
357 extern Ctlr geodehwgc;
358
359 /* igfx.c */
360 extern Ctlr igfx;
361 extern Ctlr igfxhwgc;
362
363 /* mach32.c */
364 extern Ctlr mach32;
365
366 /* mach64.c */
367 extern Ctlr mach64;
368
369 /* mach64xx.c */
370 extern Ctlr mach64xx;
371 extern Ctlr mach64xxhwgc;
372
373 /* main.c */
374 extern char* chanstr[];
375 extern void resyncinit(Vga*, Ctlr*, ulong, ulong);
376 extern void sequencer(Vga*, int);
377 extern void main(int, char*[]);
378 Biobuf stdout;
379
380 /* mga2164w.c */
381 extern Ctlr mga2164w;
382 extern Ctlr mga2164whwgc;
383
384 /* neomagic.c */
385 extern Ctlr neomagic;
386 extern Ctlr neomagichwgc;
387
388 /* nvidia.c */
389 extern Ctlr nvidia;
390 extern Ctlr nvidiahwgc;
391
392 /* radeon.c */
393 extern Ctlr radeon;
394 extern Ctlr radeonhwgc;
395
396 /* palette.c */
397 extern Ctlr palette;
398
399 /* pci.c */
400 typedef struct Pcidev Pcidev;
401
402 extern int pcicfgr8(Pcidev*, int);
403 extern int pcicfgr16(Pcidev*, int);
404 extern int pcicfgr32(Pcidev*, int);
405 extern void pcicfgw8(Pcidev*, int, int);
406 extern void pcicfgw16(Pcidev*, int, int);
407 extern void pcicfgw32(Pcidev*, int, int);
408 extern void pcihinv(Pcidev*);
409 extern Pcidev* pcimatch(Pcidev*, int, int);
410
411 /* rgb524.c */
412 extern Ctlr rgb524;
413
414 /* rgb524mn.c */
415 extern uchar (*rgb524mnxi)(Vga*, int);
416 extern void (*rgb524mnxo)(Vga*, int, uchar);
417 extern Ctlr rgb524mn;
418
419 /* s3801.c */
420 extern Ctlr s3801;
421 extern Ctlr s3805;
422
423 /* s3928.c */
424 extern Ctlr s3928;
425
426 /* s3clock.c */
427 extern Ctlr s3clock;
428
429 /* s3generic.c */
430 extern Ctlr s3generic;
431
432 /* s3hwgc.c */
433 extern Ctlr bt485hwgc;
434 extern Ctlr rgb524hwgc;
435 extern Ctlr s3hwgc;
436 extern Ctlr tvp3020hwgc;
437 extern Ctlr tvp3026hwgc;
438
439 /* sc15025.c */
440 extern Ctlr sc15025;
441
442 /* stg1702.c */
443 extern Ctlr stg1702;
444
445 /* t2r4.c */
446 extern Ctlr t2r4;
447 extern Ctlr t2r4hwgc;
448
449 /* trio64.c */
450 extern void trio64clock(Vga*, Ctlr*);
451 extern Ctlr trio64;
452
453 /* tvp3020.c */
454 extern uchar tvp3020i(uchar);
455 extern uchar tvp3020xi(uchar);
456 extern void tvp3020o(uchar, uchar);
457 extern void tvp3020xo(uchar, uchar);
458 extern Ctlr tvp3020;
459
460 /* tvp3025.c */
461 extern Ctlr tvp3025;
462
463 /* tvp3025clock.c */
464 extern Ctlr tvp3025clock;
465
466 /* tvp3026.c */
467 extern uchar tvp3026xi(uchar);
468 extern void tvp3026xo(uchar, uchar);
469 extern Ctlr tvp3026;
470
471 /* tvp3026clock.c */
472 extern Ctlr tvp3026clock;
473
474 /* vga.c */
475 extern uchar vgai(long);
476 extern uchar vgaxi(long, uchar);
477 extern void vgao(long, uchar);
478 extern void vgaxo(long, uchar, uchar);
479 extern Ctlr generic;
480
481 /* vesa.c */
482 extern Ctlr vesa;
483 extern Ctlr softhwgc;   /* has to go somewhere */
484 extern int dbvesa(Vga*);
485 extern Mode *dbvesamode(Vga*,char*);
486 extern void vesatextmode(void);
487
488 /* vesadb.c */
489 extern Mode *vesamodes[];
490
491 /* virge.c */
492 extern Ctlr virge;
493
494 /* vision864.c */
495 extern Ctlr vision864;
496
497 /* vision964.c */
498 extern Ctlr vision964;
499
500 /* vision968.c */
501 extern Ctlr vision968;
502
503 /* vmware.c */
504 extern Ctlr vmware;
505 extern Ctlr vmwarehwgc;
506
507 /* w30c516.c */
508 extern Ctlr w30c516;
509
510 /* mga4xx.c */
511 extern Ctlr mga4xx;
512 extern Ctlr mga4xxhwgc;
513
514 #pragma varargck        argpos  error   1
515 #pragma varargck        argpos  trace   1
516 #pragma varargck        argpos  mkattr  3