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