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