Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
typedef struct Attr {
86
	char*	attr;
87
	char*	val;
88
 
89
	Attr*	next;
90
} Attr;
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
	int		vbs;		/* optional Vertical Blank Start */
116
	int		vbe;		/* optional Vertical Blank End */
117
 
118
	ulong	videobw;
119
 
120
	char	hsync;
121
	char	vsync;
122
	char	interlace;
123
 
124
	Attr*	attr;
125
} Mode;
126
 
127
/*
128
 * The sizes of the register sets are large as many SVGA and GUI chips have extras.
129
 * The Crt registers are ushorts in order to keep overflow bits handy.
130
 * The clock elements are used for communication between the VGA, RAMDAC and clock chips;
131
 * they can use them however they like, it's assumed they will be used compatibly.
132
 *
133
 * The mode->x, mode->y coordinates are the physical size of the screen. 
134
 * Virtx and virty are the coordinates of the underlying memory image.
135
 * This can be used to implement panning around a larger screen or to cope
136
 * with chipsets that need the in-memory pixel line width to be a round number.
137
 * For example, virge.c uses this because the Savage chipset needs the pixel 
138
 * width to be a multiple of 16.  Also, mga2164w.c needs the pixel width
139
 * to be a multiple of 128.
140
 *
141
 * Vga->panning differentiates between these two uses of virtx, virty.
142
 *
143
 * (14 October 2001, rsc) Most drivers don't know the difference between
144
 * mode->x and virtx, a bug that should be corrected.  Vga.c, virge.c, and 
145
 * mga2164w.c know.  For the others, the computation that sets crt[0x13]
146
 * should use virtx instead of mode->x (and maybe other places change too,
147
 * dependent on the driver).
148
 */
149
typedef struct Vga {
150
	uchar	misc;
151
	uchar	feature;
152
	uchar	sequencer[256];
153
	ushort	crt[256];
154
	uchar	graphics[256];
155
	uchar	attribute[256];
156
	uchar	pixmask;
157
	uchar	pstatus;
158
	uchar	palette[Pcolours][3];
159
 
160
	ulong	f[2];			/* clock */
161
	ulong	d[2];
162
	ulong	i[2];
163
	ulong	m[2];
164
	ulong	n[2];
165
	ulong	p[2];
166
	ulong	q[2];
167
	ulong	r[2];
168
 
169
	ulong	vma;			/* video memory linear-address alignment */
170
	ulong	vmb;			/* video memory linear-address base */
171
	ulong	apz;			/* aperture size */
172
	ulong	vmz;			/* video memory size */
173
 
174
	ulong	membw;			/* memory bandwidth, MB/s */
175
 
176
	long	offset;			/* BIOS string offset */
177
	char*	bios;			/* matching BIOS string */
178
	Pcidev*	pci;			/* matching PCI device if any */
179
 
180
	Mode*	mode;
181
 
182
	ulong	virtx;			/* resolution of virtual screen */
183
	ulong	virty;
184
 
185
	int	panning;		/* pan the virtual screen */
186
 
187
	Ctlr*	ctlr;
188
	Ctlr*	ramdac;
189
	Ctlr*	clock;
190
	Ctlr*	hwgc;
191
	Ctlr* vesa;
192
	Ctlr*	link;
193
	int	linear;
194
	Attr*	attr;
195
 
196
	void*	private;
197
} Vga;
198
 
199
/* 3dfx.c */
200
extern Ctlr tdfx;
201
extern Ctlr tdfxhwgc;
202
 
203
/* ark2000pv.c */
204
extern Ctlr ark2000pv;
205
extern Ctlr ark2000pvhwgc;
206
 
207
/* att20c49x.c */
208
extern Ctlr att20c490;
209
extern Ctlr att20c491;
210
extern Ctlr att20c492;
211
 
212
/* att21c498.c */
213
extern uchar attdaci(uchar);
214
extern void attdaco(uchar, uchar);
215
extern Ctlr att21c498;
216
 
217
/* bt485.c */
218
extern uchar bt485i(uchar);
219
extern void bt485o(uchar, uchar);
220
extern Ctlr bt485;
221
 
222
/* ch9294.c */
223
extern Ctlr ch9294;
224
 
225
/* clgd542x.c */
226
extern void clgd54xxclock(Vga*, Ctlr*);
227
extern Ctlr clgd542x;
228
extern Ctlr clgd542xhwgc;
229
 
230
/* clgd546x.c */
231
extern Ctlr clgd546x;
232
extern Ctlr clgd546xhwgc;
233
 
234
/* ct65540.c */
235
extern Ctlr ct65540;
236
extern Ctlr ct65545;
237
extern Ctlr ct65545hwgc;
238
 
239
/* cyber938x.c */
240
extern Ctlr cyber938x;
241
extern Ctlr cyber938xhwgc;
242
 
243
/* data.c */
244
extern int cflag;
245
extern int dflag;
246
extern Ctlr *ctlrs[];
247
extern ushort dacxreg[4];
248
 
249
/* db.c */
250
extern char* dbattr(Attr*, char*);
251
extern int dbctlr(char*, Vga*);
252
extern Mode* dbmode(char*, char*, char*);
253
extern void dbdumpmode(Mode*);
254
 
255
/* error.c */
256
extern void error(char*, ...);
257
extern void trace(char*, ...);
258
extern int vflag, Vflag;
259
 
260
/* et4000.c */
261
extern Ctlr et4000;
262
 
263
/* et4000hwgc.c */
264
extern Ctlr et4000hwgc;
265
 
266
/* hiqvideo.c */
267
extern Ctlr hiqvideo;
268
extern Ctlr hiqvideohwgc;
269
 
270
/* i81x.c */
271
extern Ctlr i81x;
272
extern Ctlr i81xhwgc;
273
 
274
/* ibm8514.c */
275
extern Ctlr ibm8514;
276
 
277
/* icd2061a.c */
278
extern Ctlr icd2061a;
279
 
280
/* ics2494.c */
281
extern Ctlr ics2494;
282
extern Ctlr ics2494a;
283
 
284
/* ics534x.c */
285
extern Ctlr ics534x;
286
 
287
/* io.c */
288
extern uchar inportb(long);
289
extern void outportb(long, uchar);
290
extern ushort inportw(long);
291
extern void outportw(long, ushort);
292
extern ulong inportl(long);
293
extern void outportl(long, ulong);
294
extern char* vgactlr(char*, char*);
295
extern void vgactlw(char*, char*);
296
extern char* readbios(long, long);
297
extern void dumpbios(long);
298
extern void error(char*, ...);
299
extern void* alloc(ulong);
300
extern void printitem(char*, char*);
301
extern void printreg(ulong);
302
extern void printflag(ulong);
303
extern void setpalette(int, int, int, int);
304
extern int curprintindex;
305
 
306
/* mach32.c */
307
extern Ctlr mach32;
308
 
309
/* mach64.c */
310
extern Ctlr mach64;
311
 
312
/* mach64xx.c */
313
extern Ctlr mach64xx;
314
extern Ctlr mach64xxhwgc;
315
 
316
/* main.c */
317
extern char* chanstr[];
318
extern void resyncinit(Vga*, Ctlr*, ulong, ulong);
319
extern void sequencer(Vga*, int);
320
extern void main(int, char*[]);
321
Biobuf stdout;
322
 
323
/* mga2164w.c */
324
extern Ctlr mga2164w;
325
extern Ctlr mga2164whwgc;
326
 
327
/* neomagic.c */
328
extern Ctlr neomagic;
329
extern Ctlr neomagichwgc;
330
 
331
/* nvidia.c */
332
extern Ctlr nvidia;
333
extern Ctlr nvidiahwgc;
334
 
335
/* radeon.c */
336
extern Ctlr radeon;
337
extern Ctlr radeonhwgc;
338
 
339
/* palette.c */
340
extern Ctlr palette;
341
 
342
/* pci.c */
343
typedef struct Pcidev Pcidev;
344
 
345
extern int pcicfgr8(Pcidev*, int);
346
extern int pcicfgr16(Pcidev*, int);
347
extern int pcicfgr32(Pcidev*, int);
348
extern void pcicfgw8(Pcidev*, int, int);
349
extern void pcicfgw16(Pcidev*, int, int);
350
extern void pcicfgw32(Pcidev*, int, int);
351
extern void pcihinv(Pcidev*);
352
extern Pcidev* pcimatch(Pcidev*, int, int);
353
 
354
/* rgb524.c */
355
extern Ctlr rgb524;
356
 
357
/* rgb524mn.c */
358
extern uchar (*rgb524mnxi)(Vga*, int);
359
extern void (*rgb524mnxo)(Vga*, int, uchar);
360
extern Ctlr rgb524mn;
361
 
362
/* s3801.c */
363
extern Ctlr s3801;
364
extern Ctlr s3805;
365
 
366
/* s3928.c */
367
extern Ctlr s3928;
368
 
369
/* s3clock.c */
370
extern Ctlr s3clock;
371
 
372
/* s3generic.c */
373
extern Ctlr s3generic;
374
 
375
/* s3hwgc.c */
376
extern Ctlr bt485hwgc;
377
extern Ctlr rgb524hwgc;
378
extern Ctlr s3hwgc;
379
extern Ctlr tvp3020hwgc;
380
extern Ctlr tvp3026hwgc;
381
 
382
/* sc15025.c */
383
extern Ctlr sc15025;
384
 
385
/* stg1702.c */
386
extern Ctlr stg1702;
387
 
388
/* t2r4.c */
389
extern Ctlr t2r4;
390
extern Ctlr t2r4hwgc;
391
 
392
/* trio64.c */
393
extern void trio64clock(Vga*, Ctlr*);
394
extern Ctlr trio64;
395
 
396
/* tvp3020.c */
397
extern uchar tvp3020i(uchar);
398
extern uchar tvp3020xi(uchar);
399
extern void tvp3020o(uchar, uchar);
400
extern void tvp3020xo(uchar, uchar);
401
extern Ctlr tvp3020;
402
 
403
/* tvp3025.c */
404
extern Ctlr tvp3025;
405
 
406
/* tvp3025clock.c */
407
extern Ctlr tvp3025clock;
408
 
409
/* tvp3026.c */
410
extern uchar tvp3026xi(uchar);
411
extern void tvp3026xo(uchar, uchar);
412
extern Ctlr tvp3026;
413
 
414
/* tvp3026clock.c */
415
extern Ctlr tvp3026clock;
416
 
417
/* vga.c */
418
extern uchar vgai(long);
419
extern uchar vgaxi(long, uchar);
420
extern void vgao(long, uchar);
421
extern void vgaxo(long, uchar, uchar);
422
extern Ctlr generic;
423
 
424
/* vesa.c */
425
extern Ctlr vesa;
426
extern Ctlr softhwgc;	/* has to go somewhere */
427
extern int dbvesa(Vga*);
428
extern Mode *dbvesamode(char*);
429
extern void vesatextmode(void);
430
 
431
/* virge.c */
432
extern Ctlr virge;
433
 
434
/* vision864.c */
435
extern Ctlr vision864;
436
 
437
/* vision964.c */
438
extern Ctlr vision964;
439
 
440
/* vision968.c */
441
extern Ctlr vision968;
442
 
443
/* vmware.c */
444
extern Ctlr vmware;
445
extern Ctlr vmwarehwgc;
446
 
447
/* w30c516.c */
448
extern Ctlr w30c516;
449
 
450
/* mga4xx.c */
451
extern Ctlr mga4xx;
452
extern Ctlr mga4xxhwgc;
453
 
454
#pragma	varargck	argpos	error	1
455
#pragma	varargck	argpos	trace	1