xref: /plan9/sys/src/cmd/aux/vga/s3801.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier 
5*9a747e4fSDavid du Colombier #include "pci.h"
6219b2ee8SDavid du Colombier #include "vga.h"
7219b2ee8SDavid du Colombier 
8219b2ee8SDavid du Colombier /*
9219b2ee8SDavid du Colombier  * S3 86C80[15] GUI Accelerator.
10219b2ee8SDavid du Colombier  */
11219b2ee8SDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)12219b2ee8SDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
13219b2ee8SDavid du Colombier {
147dd7cddfSDavid du Colombier 	s3generic.snarf(vga, ctlr);
15219b2ee8SDavid du Colombier }
16219b2ee8SDavid du Colombier 
17219b2ee8SDavid du Colombier static void
options(Vga *,Ctlr * ctlr)187dd7cddfSDavid du Colombier options(Vga*, Ctlr* ctlr)
19219b2ee8SDavid du Colombier {
20219b2ee8SDavid du Colombier 	ctlr->flag |= Henhanced|Foptions;
21219b2ee8SDavid du Colombier }
22219b2ee8SDavid du Colombier 
23219b2ee8SDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)24219b2ee8SDavid du Colombier init(Vga* vga, Ctlr* ctlr)
25219b2ee8SDavid du Colombier {
26219b2ee8SDavid du Colombier 	ulong x;
27219b2ee8SDavid du Colombier 
287dd7cddfSDavid du Colombier 	s3generic.init(vga, ctlr);
29219b2ee8SDavid du Colombier 	vga->crt[0x3B] = vga->crt[0]-5;
30219b2ee8SDavid du Colombier 
317dd7cddfSDavid du Colombier 	if(vga->mode->z > 8)
327dd7cddfSDavid du Colombier 		error("depth %d not supported\n", vga->mode->z);
337dd7cddfSDavid du Colombier 
34219b2ee8SDavid du Colombier 	/*
35219b2ee8SDavid du Colombier 	 * Display memory access control.
36219b2ee8SDavid du Colombier 	 * Calculation of the M-parameter (Crt54) is
37219b2ee8SDavid du Colombier 	 * memory-system and dot-clock dependent, the
38219b2ee8SDavid du Colombier 	 * values below are guesses from dumping
39219b2ee8SDavid du Colombier 	 * registers.
40219b2ee8SDavid du Colombier 	 */
41219b2ee8SDavid du Colombier 	vga->crt[0x60] = 0xFF;
42219b2ee8SDavid du Colombier 	x = (vga->mode->x)/4;
43219b2ee8SDavid du Colombier 	vga->crt[0x61] = 0x80|((x>>8) & 0x07);
44219b2ee8SDavid du Colombier 	vga->crt[0x62] = (x & 0xFF);
45219b2ee8SDavid du Colombier 
46219b2ee8SDavid du Colombier 	if(vga->mode->x <= 800)
47219b2ee8SDavid du Colombier 		vga->crt[0x54] = 0x88;
48219b2ee8SDavid du Colombier 	else if(vga->mode->x <= 1024)
49219b2ee8SDavid du Colombier 		vga->crt[0x54] = 0xF8;
50219b2ee8SDavid du Colombier 	else
51219b2ee8SDavid du Colombier 		vga->crt[0x54] = 0x40;
52219b2ee8SDavid du Colombier }
53219b2ee8SDavid du Colombier 
54219b2ee8SDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)55219b2ee8SDavid du Colombier load(Vga* vga, Ctlr* ctlr)
56219b2ee8SDavid du Colombier {
57219b2ee8SDavid du Colombier 	ushort advfunc;
58219b2ee8SDavid du Colombier 
597dd7cddfSDavid du Colombier 	s3generic.load(vga, ctlr);
60219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x60, vga->crt[0x60]);
61219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x61, vga->crt[0x61]);
62219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x62, vga->crt[0x62]);
63219b2ee8SDavid du Colombier 
64219b2ee8SDavid du Colombier 	advfunc = 0x0000;
65219b2ee8SDavid du Colombier 	if(ctlr->flag & Uenhanced){
66219b2ee8SDavid du Colombier 		if(vga->mode->x == 1024 || vga->mode->x == 800)
67219b2ee8SDavid du Colombier 			advfunc = 0x0057;
68219b2ee8SDavid du Colombier 		else
69219b2ee8SDavid du Colombier 			advfunc = 0x0053;
70219b2ee8SDavid du Colombier 	}
71219b2ee8SDavid du Colombier 	outportw(0x4AE8, advfunc);
72219b2ee8SDavid du Colombier }
73219b2ee8SDavid du Colombier 
74219b2ee8SDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)75219b2ee8SDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
76219b2ee8SDavid du Colombier {
777dd7cddfSDavid du Colombier 	s3generic.dump(vga, ctlr);
78219b2ee8SDavid du Colombier }
79219b2ee8SDavid du Colombier 
80219b2ee8SDavid du Colombier Ctlr s3801 = {
81219b2ee8SDavid du Colombier 	"s3801",			/* name */
82219b2ee8SDavid du Colombier 	snarf,				/* snarf */
83219b2ee8SDavid du Colombier 	options,			/* options */
84219b2ee8SDavid du Colombier 	init,				/* init */
85219b2ee8SDavid du Colombier 	load,				/* load */
86219b2ee8SDavid du Colombier 	dump,				/* dump */
87219b2ee8SDavid du Colombier };
88219b2ee8SDavid du Colombier 
89219b2ee8SDavid du Colombier Ctlr s3805 = {
90219b2ee8SDavid du Colombier 	"s3805",			/* name */
91219b2ee8SDavid du Colombier 	snarf,				/* snarf */
92219b2ee8SDavid du Colombier 	options,			/* options */
93219b2ee8SDavid du Colombier 	init,				/* init */
94219b2ee8SDavid du Colombier 	load,				/* load */
95219b2ee8SDavid du Colombier 	dump,				/* dump */
96219b2ee8SDavid du Colombier };
97