xref: /plan9-contrib/sys/src/cmd/aux/vga/sc15025.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  * Sierra SC1502[56] HiCOLOR-24 Palette.
10219b2ee8SDavid du Colombier  */
11219b2ee8SDavid du Colombier static void
pixmask(void)12219b2ee8SDavid du Colombier pixmask(void)
13219b2ee8SDavid du Colombier {
14219b2ee8SDavid du Colombier 	inportb(PaddrW);
15219b2ee8SDavid du Colombier }
16219b2ee8SDavid du Colombier 
17219b2ee8SDavid du Colombier static void
commandrw(void)18219b2ee8SDavid du Colombier commandrw(void)
19219b2ee8SDavid du Colombier {
20219b2ee8SDavid du Colombier 	int i;
21219b2ee8SDavid du Colombier 
22219b2ee8SDavid du Colombier 	pixmask();
23219b2ee8SDavid du Colombier 	for(i = 0; i < 4; i++)
24219b2ee8SDavid du Colombier 		inportb(Pixmask);
25219b2ee8SDavid du Colombier }
26219b2ee8SDavid du Colombier 
27219b2ee8SDavid du Colombier static uchar
commandr(void)28219b2ee8SDavid du Colombier commandr(void)
29219b2ee8SDavid du Colombier {
30219b2ee8SDavid du Colombier 	uchar command;
31219b2ee8SDavid du Colombier 
32219b2ee8SDavid du Colombier 	commandrw();
33219b2ee8SDavid du Colombier 	command = inportb(Pixmask);
34219b2ee8SDavid du Colombier 	pixmask();
35219b2ee8SDavid du Colombier 
36219b2ee8SDavid du Colombier 	return command;
37219b2ee8SDavid du Colombier }
38219b2ee8SDavid du Colombier 
39219b2ee8SDavid du Colombier static void
commandw(uchar command)40219b2ee8SDavid du Colombier commandw(uchar command)
41219b2ee8SDavid du Colombier {
42219b2ee8SDavid du Colombier 	commandrw();
43219b2ee8SDavid du Colombier 	outportb(Pixmask, command);
44219b2ee8SDavid du Colombier 	pixmask();
45219b2ee8SDavid du Colombier }
46219b2ee8SDavid du Colombier 
47219b2ee8SDavid du Colombier static void
options(Vga *,Ctlr * ctlr)487dd7cddfSDavid du Colombier options(Vga*, Ctlr* ctlr)
49219b2ee8SDavid du Colombier {
50219b2ee8SDavid du Colombier 	ctlr->flag |= Foptions;
51219b2ee8SDavid du Colombier }
52219b2ee8SDavid du Colombier 
53219b2ee8SDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)54219b2ee8SDavid du Colombier init(Vga* vga, Ctlr* ctlr)
55219b2ee8SDavid du Colombier {
56219b2ee8SDavid du Colombier 	ulong pclk;
57219b2ee8SDavid du Colombier 	char *p;
58219b2ee8SDavid du Colombier 
59219b2ee8SDavid du Colombier 	/*
60219b2ee8SDavid du Colombier 	 * Part comes in -125, -110, -80, and -66MHz speed-grades.
61219b2ee8SDavid du Colombier 	 * Work out the part speed-grade from name.  Name can have,
62219b2ee8SDavid du Colombier 	 * e.g. '-110' on the end  for 100MHz part.
63219b2ee8SDavid du Colombier 	 */
64219b2ee8SDavid du Colombier 	pclk = 66000000;
65219b2ee8SDavid du Colombier 	if(p = strrchr(ctlr->name, '-'))
66219b2ee8SDavid du Colombier 		pclk = strtoul(p+1, 0, 0) * 1000000;
67219b2ee8SDavid du Colombier 
68219b2ee8SDavid du Colombier 	/*
69219b2ee8SDavid du Colombier 	 * If we don't already have a desired pclk,
70219b2ee8SDavid du Colombier 	 * take it from the mode.
71219b2ee8SDavid du Colombier 	 * Check it's within range.
72219b2ee8SDavid du Colombier 	 */
737dd7cddfSDavid du Colombier 	if(vga->f[0] == 0)
747dd7cddfSDavid du Colombier 		vga->f[0] = vga->mode->frequency;
757dd7cddfSDavid du Colombier 	if(vga->f[0] > pclk)
767dd7cddfSDavid du Colombier 		error("%s: invalid pclk - %ld\n", ctlr->name, vga->f[0]);
77219b2ee8SDavid du Colombier }
78219b2ee8SDavid du Colombier 
79219b2ee8SDavid du Colombier static void
load(Vga *,Ctlr *)807dd7cddfSDavid du Colombier load(Vga*, Ctlr*)
81219b2ee8SDavid du Colombier {
82219b2ee8SDavid du Colombier 	uchar aux, command;
83219b2ee8SDavid du Colombier 
84219b2ee8SDavid du Colombier 	aux = 0x00;
85219b2ee8SDavid du Colombier 	/*
86219b2ee8SDavid du Colombier 	if(vga->mode->z == 8)
87219b2ee8SDavid du Colombier 		aux = 0x01;
88219b2ee8SDavid du Colombier 	 */
89219b2ee8SDavid du Colombier 	commandrw();
90219b2ee8SDavid du Colombier 	command = inportb(Pixmask);
91219b2ee8SDavid du Colombier 	outportb(Pixmask, command|0x18);
92219b2ee8SDavid du Colombier 	outportb(PaddrR, 0x08);
93219b2ee8SDavid du Colombier 	outportb(PaddrW, aux);
94219b2ee8SDavid du Colombier 	commandw(command);
95219b2ee8SDavid du Colombier }
96219b2ee8SDavid du Colombier 
97219b2ee8SDavid du Colombier static void
dump(Vga *,Ctlr * ctlr)987dd7cddfSDavid du Colombier dump(Vga*, Ctlr* ctlr)
99219b2ee8SDavid du Colombier {
100219b2ee8SDavid du Colombier 	int i;
101219b2ee8SDavid du Colombier 	uchar command;
102219b2ee8SDavid du Colombier 
103219b2ee8SDavid du Colombier 	printitem(ctlr->name, "command");
104219b2ee8SDavid du Colombier 	command = commandr();
105219b2ee8SDavid du Colombier 	printreg(command);
106219b2ee8SDavid du Colombier 
107219b2ee8SDavid du Colombier 	printitem(ctlr->name, "index08");
108219b2ee8SDavid du Colombier 	commandw(command|0x10);
109219b2ee8SDavid du Colombier 	for(i = 0x08; i < 0x11; i++){
110219b2ee8SDavid du Colombier 		outportb(PaddrR, i);
111219b2ee8SDavid du Colombier 		printreg(inportb(PaddrW));
112219b2ee8SDavid du Colombier 	}
113219b2ee8SDavid du Colombier 	commandw(command);
114219b2ee8SDavid du Colombier }
115219b2ee8SDavid du Colombier 
116219b2ee8SDavid du Colombier Ctlr sc15025 = {
117219b2ee8SDavid du Colombier 	"sc15025",			/* name */
118219b2ee8SDavid du Colombier 	0,				/* snarf */
119219b2ee8SDavid du Colombier 	options,			/* options */
120219b2ee8SDavid du Colombier 	init,				/* init */
121219b2ee8SDavid du Colombier 	load,				/* load */
122219b2ee8SDavid du Colombier 	dump,				/* dump */
123219b2ee8SDavid du Colombier };
124