123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447 |
- /*
- * Generic VGA registers.
- */
- enum {
- MiscW = 0x03C2, /* Miscellaneous Output (W) */
- MiscR = 0x03CC, /* Miscellaneous Output (R) */
- Status0 = 0x03C2, /* Input status 0 (R) */
- Status1 = 0x03DA, /* Input Status 1 (R) */
- FeatureR = 0x03CA, /* Feature Control (R) */
- FeatureW = 0x03DA, /* Feature Control (W) */
- Seqx = 0x03C4, /* Sequencer Index, Data at Seqx+1 */
- Crtx = 0x03D4, /* CRT Controller Index, Data at Crtx+1 */
- Grx = 0x03CE, /* Graphics Controller Index, Data at Grx+1 */
- Attrx = 0x03C0, /* Attribute Controller Index and Data */
- PaddrW = 0x03C8, /* Palette Address Register, write */
- Pdata = 0x03C9, /* Palette Data Register */
- Pixmask = 0x03C6, /* Pixel Mask Register */
- PaddrR = 0x03C7, /* Palette Address Register, read */
- Pstatus = 0x03C7, /* DAC Status (RO) */
- Pcolours = 256, /* Palette */
- Red = 0,
- Green = 1,
- Blue = 2,
- Pblack = 0x00,
- Pwhite = 0xFF,
- };
- enum {
- RefFreq = 14318180, /* External Reference Clock frequency */
- VgaFreq0 = 25175000,
- VgaFreq1 = 28322000,
- };
- enum {
- Namelen = 32,
- };
- typedef struct Ctlr Ctlr;
- typedef struct Vga Vga;
- typedef struct Ctlr {
- char name[Namelen+1];
- void (*snarf)(Vga*, Ctlr*);
- void (*options)(Vga*, Ctlr*);
- void (*init)(Vga*, Ctlr*);
- void (*load)(Vga*, Ctlr*);
- void (*dump)(Vga*, Ctlr*);
- char* type;
- ulong flag;
- Ctlr* link;
- } Ctlr;
- enum { /* flag */
- Fsnarf = 0x00000001, /* snarf done */
- Foptions = 0x00000002, /* options done */
- Finit = 0x00000004, /* init done */
- Fload = 0x00000008, /* load done */
- Fdump = 0x00000010, /* dump done */
- Ferror = 0x00000020, /* error during snarf */
- Hpclk2x8 = 0x00000100, /* have double 8-bit mode */
- Upclk2x8 = 0x00000200, /* use double 8-bit mode */
- Henhanced = 0x00000400, /* have enhanced mode */
- Uenhanced = 0x00000800, /* use enhanced mode */
- Hpvram = 0x00001000, /* have parallel VRAM */
- Upvram = 0x00002000, /* use parallel VRAM */
- Hextsid = 0x00004000, /* have external SID mode */
- Uextsid = 0x00008000, /* use external SID mode */
- Hclk2 = 0x00010000, /* have clock-doubler */
- Uclk2 = 0x00020000, /* use clock-doubler */
- Hlinear = 0x00040000, /* have linear-address mode */
- Ulinear = 0x00080000, /* use linear-address mode */
- Hclkdiv = 0x00100000, /* have a clock-divisor */
- Uclkdiv = 0x00200000, /* use clock-divisor */
- Hsid32 = 0x00400000, /* have a 32-bit (as opposed to 64-bit) SID */
- };
- typedef struct Attr Attr;
- typedef struct Attr {
- char* attr;
- char* val;
- Attr* next;
- } Attr;
- typedef struct Mode {
- char type[Namelen+1]; /* monitor type e.g. "vs1782" */
- char size[Namelen+1]; /* size e.g. "1376x1024x8" */
- char chan[Namelen+1]; /* channel descriptor, e.g. "m8" or "r8g8b8a8" */
- int frequency; /* Dot Clock (MHz) */
- int deffrequency; /* Default dot clock if calculation can't be done */
- int x; /* Horizontal Display End (Crt01), from .size[] */
- int y; /* Vertical Display End (Crt18), from .size[] */
- int z; /* depth, from .size[] */
- int ht; /* Horizontal Total (Crt00) */
- int shb; /* Start Horizontal Blank (Crt02) */
- int ehb; /* End Horizontal Blank (Crt03) */
- int shs; /* optional Start Horizontal Sync (Crt04) */
- int ehs; /* optional End Horizontal Sync (Crt05) */
- int vt; /* Vertical Total (Crt06) */
- int vrs; /* Vertical Retrace Start (Crt10) */
- int vre; /* Vertical Retrace End (Crt11) */
- ulong videobw;
- char hsync;
- char vsync;
- char interlace;
- Attr* attr;
- } Mode;
- /*
- * The sizes of the register sets are large as many SVGA and GUI chips have extras.
- * The Crt registers are ushorts in order to keep overflow bits handy.
- * The clock elements are used for communication between the VGA, RAMDAC and clock chips;
- * they can use them however they like, it's assumed they will be used compatibly.
- *
- * The mode->x, mode->y coordinates are the physical size of the screen.
- * Virtx and virty are the coordinates of the underlying memory image.
- * This can be used to implement panning around a larger screen or to cope
- * with chipsets that need the in-memory pixel line width to be a round number.
- * For example, virge.c uses this because the Savage chipset needs the pixel
- * width to be a multiple of 16. Also, mga2164w.c needs the pixel width
- * to be a multiple of 128.
- *
- * Vga->panning differentiates between these two uses of virtx, virty.
- *
- * (14 October 2001, rsc) Most drivers don't know the difference between
- * mode->x and virtx, a bug that should be corrected. Vga.c, virge.c, and
- * mga2164w.c know. For the others, the computation that sets crt[0x13]
- * should use virtx instead of mode->x (and maybe other places change too,
- * dependent on the driver).
- */
- typedef struct Vga {
- uchar misc;
- uchar feature;
- uchar sequencer[256];
- ushort crt[256];
- uchar graphics[256];
- uchar attribute[256];
- uchar pixmask;
- uchar pstatus;
- uchar palette[Pcolours][3];
- ulong f[2]; /* clock */
- ulong d[2];
- ulong i[2];
- ulong m[2];
- ulong n[2];
- ulong p[2];
- ulong q[2];
- ulong r[2];
- ulong vma; /* video memory linear-address alignment */
- ulong vmb; /* video memory linear-address base */
- ulong apz; /* aperture size */
- ulong vmz; /* video memory size */
- ulong membw; /* memory bandwidth, MB/s */
- long offset; /* BIOS string offset */
- char* bios; /* matching BIOS string */
- Pcidev* pci; /* matching PCI device if any */
- Mode* mode;
- ulong virtx; /* resolution of virtual screen */
- ulong virty;
- int panning; /* pan the virtual screen */
- Ctlr* ctlr;
- Ctlr* ramdac;
- Ctlr* clock;
- Ctlr* hwgc;
- Ctlr* vesa;
- Ctlr* link;
- int linear;
- Attr* attr;
- void* private;
- } Vga;
- /* 3dfx.c */
- extern Ctlr tdfx;
- extern Ctlr tdfxhwgc;
- /* ark2000pv.c */
- extern Ctlr ark2000pv;
- extern Ctlr ark2000pvhwgc;
- /* att20c49x.c */
- extern Ctlr att20c490;
- extern Ctlr att20c491;
- extern Ctlr att20c492;
- /* att21c498.c */
- extern uchar attdaci(uchar);
- extern void attdaco(uchar, uchar);
- extern Ctlr att21c498;
- /* bt485.c */
- extern uchar bt485i(uchar);
- extern void bt485o(uchar, uchar);
- extern Ctlr bt485;
- /* ch9294.c */
- extern Ctlr ch9294;
- /* clgd542x.c */
- extern void clgd54xxclock(Vga*, Ctlr*);
- extern Ctlr clgd542x;
- extern Ctlr clgd542xhwgc;
- /* clgd546x.c */
- extern Ctlr clgd546x;
- extern Ctlr clgd546xhwgc;
- /* ct65540.c */
- extern Ctlr ct65540;
- extern Ctlr ct65545;
- extern Ctlr ct65545hwgc;
- /* cyber938x.c */
- extern Ctlr cyber938x;
- extern Ctlr cyber938xhwgc;
- /* data.c */
- extern int cflag;
- extern int dflag;
- extern Ctlr *ctlrs[];
- extern ushort dacxreg[4];
- /* db.c */
- extern char* dbattr(Attr*, char*);
- extern int dbctlr(char*, Vga*);
- extern Mode* dbmode(char*, char*, char*);
- extern void dbdumpmode(Mode*);
- /* error.c */
- extern void error(char*, ...);
- extern void trace(char*, ...);
- extern int vflag, Vflag;
- /* et4000.c */
- extern Ctlr et4000;
- /* et4000hwgc.c */
- extern Ctlr et4000hwgc;
- /* hiqvideo.c */
- extern Ctlr hiqvideo;
- extern Ctlr hiqvideohwgc;
- /* i81x.c */
- extern Ctlr i81x;
- extern Ctlr i81xhwgc;
- /* ibm8514.c */
- extern Ctlr ibm8514;
- /* icd2061a.c */
- extern Ctlr icd2061a;
- /* ics2494.c */
- extern Ctlr ics2494;
- extern Ctlr ics2494a;
- /* ics534x.c */
- extern Ctlr ics534x;
- /* io.c */
- extern uchar inportb(long);
- extern void outportb(long, uchar);
- extern ushort inportw(long);
- extern void outportw(long, ushort);
- extern ulong inportl(long);
- extern void outportl(long, ulong);
- extern char* vgactlr(char*, char*);
- extern void vgactlw(char*, char*);
- extern char* readbios(long, long);
- extern void dumpbios(long);
- extern void error(char*, ...);
- extern void* alloc(ulong);
- extern void printitem(char*, char*);
- extern void printreg(ulong);
- extern void printflag(ulong);
- extern void setpalette(int, int, int, int);
- extern int curprintindex;
- /* mach32.c */
- extern Ctlr mach32;
- /* mach64.c */
- extern Ctlr mach64;
- /* mach64xx.c */
- extern Ctlr mach64xx;
- extern Ctlr mach64xxhwgc;
- /* main.c */
- extern char* chanstr[];
- extern void resyncinit(Vga*, Ctlr*, ulong, ulong);
- extern void sequencer(Vga*, int);
- extern void main(int, char*[]);
- Biobuf stdout;
- /* mga2164w.c */
- extern Ctlr mga2164w;
- extern Ctlr mga2164whwgc;
- /* neomagic.c */
- extern Ctlr neomagic;
- extern Ctlr neomagichwgc;
- /* nvidia.c */
- extern Ctlr nvidia;
- extern Ctlr nvidiahwgc;
- /* palette.c */
- extern Ctlr palette;
- /* pci.c */
- typedef struct Pcidev Pcidev;
- extern int pcicfgr8(Pcidev*, int);
- extern int pcicfgr16(Pcidev*, int);
- extern int pcicfgr32(Pcidev*, int);
- extern void pcicfgw8(Pcidev*, int, int);
- extern void pcicfgw16(Pcidev*, int, int);
- extern void pcicfgw32(Pcidev*, int, int);
- extern void pcihinv(Pcidev*);
- extern Pcidev* pcimatch(Pcidev*, int, int);
- /* rgb524.c */
- extern Ctlr rgb524;
- /* rgb524mn.c */
- extern uchar (*rgb524mnxi)(Vga*, int);
- extern void (*rgb524mnxo)(Vga*, int, uchar);
- extern Ctlr rgb524mn;
- /* s3801.c */
- extern Ctlr s3801;
- extern Ctlr s3805;
- /* s3928.c */
- extern Ctlr s3928;
- /* s3clock.c */
- extern Ctlr s3clock;
- /* s3generic.c */
- extern Ctlr s3generic;
- /* s3hwgc.c */
- extern Ctlr bt485hwgc;
- extern Ctlr rgb524hwgc;
- extern Ctlr s3hwgc;
- extern Ctlr tvp3020hwgc;
- extern Ctlr tvp3026hwgc;
- /* sc15025.c */
- extern Ctlr sc15025;
- /* stg1702.c */
- extern Ctlr stg1702;
- /* t2r4.c */
- extern Ctlr t2r4;
- extern Ctlr t2r4hwgc;
- /* trio64.c */
- extern void trio64clock(Vga*, Ctlr*);
- extern Ctlr trio64;
- /* tvp3020.c */
- extern uchar tvp3020i(uchar);
- extern uchar tvp3020xi(uchar);
- extern void tvp3020o(uchar, uchar);
- extern void tvp3020xo(uchar, uchar);
- extern Ctlr tvp3020;
- /* tvp3025.c */
- extern Ctlr tvp3025;
- /* tvp3025clock.c */
- extern Ctlr tvp3025clock;
- /* tvp3026.c */
- extern uchar tvp3026xi(uchar);
- extern void tvp3026xo(uchar, uchar);
- extern Ctlr tvp3026;
- /* tvp3026clock.c */
- extern Ctlr tvp3026clock;
- /* vga.c */
- extern uchar vgai(long);
- extern uchar vgaxi(long, uchar);
- extern void vgao(long, uchar);
- extern void vgaxo(long, uchar, uchar);
- extern Ctlr generic;
- /* vesa.c */
- extern Ctlr vesa;
- extern Ctlr softhwgc; /* has to go somewhere */
- extern int dbvesa(Vga*);
- extern Mode *dbvesamode(char*);
- extern void vesatextmode(void);
- /* virge.c */
- extern Ctlr virge;
- /* vision864.c */
- extern Ctlr vision864;
- /* vision964.c */
- extern Ctlr vision964;
- /* vision968.c */
- extern Ctlr vision968;
- /* vmware.c */
- extern Ctlr vmware;
- extern Ctlr vmwarehwgc;
- /* w30c516.c */
- extern Ctlr w30c516;
- /* mga4xx.c */
- extern Ctlr mga4xx;
- extern Ctlr mga4xxhwgc;
- #pragma varargck argpos error 1
- #pragma varargck argpos trace 1
|