xref: /plan9/sys/src/cmd/aux/vga/vision864.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier 
4*219b2ee8SDavid du Colombier #include "vga.h"
5*219b2ee8SDavid du Colombier 
6*219b2ee8SDavid du Colombier /*
7*219b2ee8SDavid du Colombier  * S3 Vision964 GUI Accelerator.
8*219b2ee8SDavid du Colombier  * Pretty much the same as the 86C80[15].
9*219b2ee8SDavid du Colombier  * First pass, needs tuning.
10*219b2ee8SDavid du Colombier  */
11*219b2ee8SDavid du Colombier static void
12*219b2ee8SDavid du Colombier snarf(Vga *vga, Ctlr *ctlr)
13*219b2ee8SDavid du Colombier {
14*219b2ee8SDavid du Colombier 	verbose("%s->snarf\n", ctlr->name);
15*219b2ee8SDavid du Colombier 
16*219b2ee8SDavid du Colombier 	(*s3generic.snarf)(vga, ctlr);
17*219b2ee8SDavid du Colombier }
18*219b2ee8SDavid du Colombier 
19*219b2ee8SDavid du Colombier static void
20*219b2ee8SDavid du Colombier options(Vga *vga, Ctlr *ctlr)
21*219b2ee8SDavid du Colombier {
22*219b2ee8SDavid du Colombier 	USED(vga);
23*219b2ee8SDavid du Colombier 	verbose("%s->options\n", ctlr->name);
24*219b2ee8SDavid du Colombier 
25*219b2ee8SDavid du Colombier 	ctlr->flag |= Hpclk2x8|Henhanced|Foptions;
26*219b2ee8SDavid du Colombier }
27*219b2ee8SDavid du Colombier 
28*219b2ee8SDavid du Colombier static void
29*219b2ee8SDavid du Colombier init(Vga *vga, Ctlr *ctlr)
30*219b2ee8SDavid du Colombier {
31*219b2ee8SDavid du Colombier 	ulong x;
32*219b2ee8SDavid du Colombier 
33*219b2ee8SDavid du Colombier 	verbose("%s->init\n", ctlr->name);
34*219b2ee8SDavid du Colombier 
35*219b2ee8SDavid du Colombier 	(*s3generic.init)(vga, ctlr);
36*219b2ee8SDavid du Colombier 	vga->crt[0x3B] = vga->crt[0]-5;
37*219b2ee8SDavid du Colombier 
38*219b2ee8SDavid du Colombier 	/*
39*219b2ee8SDavid du Colombier 	 * VL-bus crap.
40*219b2ee8SDavid du Colombier 	 */
41*219b2ee8SDavid du Colombier 	if((vga->crt[0x36] & 0x03) == 0x01){
42*219b2ee8SDavid du Colombier 		vga->crt[0x40] |= 0x08;
43*219b2ee8SDavid du Colombier 		vga->crt[0x58] &= ~0x88;
44*219b2ee8SDavid du Colombier 	}
45*219b2ee8SDavid du Colombier 
46*219b2ee8SDavid du Colombier 	/*
47*219b2ee8SDavid du Colombier 	 * Display memory access control.
48*219b2ee8SDavid du Colombier 	 * Calculation of the M-parameter (Crt54) is
49*219b2ee8SDavid du Colombier 	 * memory-system and dot-clock dependent, the
50*219b2ee8SDavid du Colombier 	 * values below are guesses from dumping
51*219b2ee8SDavid du Colombier 	 * registers.
52*219b2ee8SDavid du Colombier 	 */
53*219b2ee8SDavid du Colombier 	vga->crt[0x60] = 0xFF;
54*219b2ee8SDavid du Colombier 	x = vga->mode->x/8;
55*219b2ee8SDavid du Colombier 	vga->crt[0x61] = 0x80|((x>>8) & 0x07);
56*219b2ee8SDavid du Colombier 	vga->crt[0x62] = (x & 0xFF);
57*219b2ee8SDavid du Colombier 	if(vga->mode->x <= 800)
58*219b2ee8SDavid du Colombier 		vga->crt[0x54] = 0x88;
59*219b2ee8SDavid du Colombier 	else if(vga->mode->x <= 1024)
60*219b2ee8SDavid du Colombier 		vga->crt[0x54] = 0xF8;
61*219b2ee8SDavid du Colombier 	else
62*219b2ee8SDavid du Colombier 		vga->crt[0x54] = 0x40;
63*219b2ee8SDavid du Colombier 
64*219b2ee8SDavid du Colombier 
65*219b2ee8SDavid du Colombier 	vga->crt[0x67] &= ~0xF0;
66*219b2ee8SDavid du Colombier 	if(ctlr->flag & Upclk2x8)
67*219b2ee8SDavid du Colombier 		vga->crt[0x67] |= 0x10;
68*219b2ee8SDavid du Colombier 
69*219b2ee8SDavid du Colombier 	/*
70*219b2ee8SDavid du Colombier 	 * Blank adjust.
71*219b2ee8SDavid du Colombier 	 * This may not be correct for all monitors.
72*219b2ee8SDavid du Colombier 	 */
73*219b2ee8SDavid du Colombier 	vga->crt[0x6D] = 2;
74*219b2ee8SDavid du Colombier }
75*219b2ee8SDavid du Colombier 
76*219b2ee8SDavid du Colombier static void
77*219b2ee8SDavid du Colombier load(Vga *vga, Ctlr *ctlr)
78*219b2ee8SDavid du Colombier {
79*219b2ee8SDavid du Colombier 	ushort advfunc;
80*219b2ee8SDavid du Colombier 
81*219b2ee8SDavid du Colombier 	verbose("%s->load\n", ctlr->name);
82*219b2ee8SDavid du Colombier 
83*219b2ee8SDavid du Colombier 	(*s3generic.load)(vga, ctlr);
84*219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x60, vga->crt[0x60]);
85*219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x61, vga->crt[0x61]);
86*219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x62, vga->crt[0x62]);
87*219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x67, vga->crt[0x67]);
88*219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x6D, vga->crt[0x6D]);
89*219b2ee8SDavid du Colombier 
90*219b2ee8SDavid du Colombier 	advfunc = 0x0000;
91*219b2ee8SDavid du Colombier 	if(ctlr->flag & Uenhanced){
92*219b2ee8SDavid du Colombier 		if(vga->mode->x == 1024 || vga->mode->x == 800)
93*219b2ee8SDavid du Colombier 			advfunc = 0x0057;
94*219b2ee8SDavid du Colombier 		else
95*219b2ee8SDavid du Colombier 			advfunc = 0x0053;
96*219b2ee8SDavid du Colombier 	}
97*219b2ee8SDavid du Colombier 	outportw(0x4AE8, advfunc);
98*219b2ee8SDavid du Colombier }
99*219b2ee8SDavid du Colombier 
100*219b2ee8SDavid du Colombier static void
101*219b2ee8SDavid du Colombier dump(Vga *vga, Ctlr *ctlr)
102*219b2ee8SDavid du Colombier {
103*219b2ee8SDavid du Colombier 	(*s3generic.dump)(vga, ctlr);
104*219b2ee8SDavid du Colombier }
105*219b2ee8SDavid du Colombier 
106*219b2ee8SDavid du Colombier Ctlr vision864 = {
107*219b2ee8SDavid du Colombier 	"vision864",			/* name */
108*219b2ee8SDavid du Colombier 	snarf,				/* snarf */
109*219b2ee8SDavid du Colombier 	options,			/* options */
110*219b2ee8SDavid du Colombier 	init,				/* init */
111*219b2ee8SDavid du Colombier 	load,				/* load */
112*219b2ee8SDavid du Colombier 	dump,				/* dump */
113*219b2ee8SDavid du Colombier };
114