xref: /plan9/sys/src/cmd/aux/vga/t2r4.c (revision 74f16c8187aab477889167f2422d0597b1b7d0ff)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier #include "pci.h"
69a747e4fSDavid du Colombier #include "vga.h"
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier /*
97dd7cddfSDavid du Colombier  * #9 Ticket to Ride IV.
107dd7cddfSDavid du Colombier  */
117dd7cddfSDavid du Colombier typedef struct {
127dd7cddfSDavid du Colombier 	Pcidev*	pci;
137dd7cddfSDavid du Colombier 	ulong	io;
14*74f16c81SDavid du Colombier 	uchar*	mmio;
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier 	ulong	ioreg[13];
177dd7cddfSDavid du Colombier 	ulong	g[25];
187dd7cddfSDavid du Colombier 	ulong	w[25];
197dd7cddfSDavid du Colombier } T2r4;
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier enum {					/* memory mapped global registers */
227dd7cddfSDavid du Colombier 	IntVcnt		= 0x20/4,	/* vertical interrupt counter */
237dd7cddfSDavid du Colombier 	IntHcnt		= 0x24/4,	/* horizontal interrupt counter */
247dd7cddfSDavid du Colombier 	DbAdr		= 0x28/4,	/* display start address */
257dd7cddfSDavid du Colombier 	DbPtch		= 0x2C/4,	/* display pitch */
267dd7cddfSDavid du Colombier 	CrtHac		= 0x30/4,	/* horizontal active line width */
277dd7cddfSDavid du Colombier 	CrtHbl		= 0x34/4,	/* horizontal blank width */
287dd7cddfSDavid du Colombier 	CrtHfp		= 0x38/4,	/* horizontal front porch */
297dd7cddfSDavid du Colombier 	CrtHs		= 0x3C/4,	/* horizontal sync width */
307dd7cddfSDavid du Colombier 	CrtVac		= 0x40/4,	/* vertical active field width */
317dd7cddfSDavid du Colombier 	CrtVbl		= 0x44/4,	/* vertical blank width */
327dd7cddfSDavid du Colombier 	CrtVfp		= 0x48/4,	/* vertical front porch */
337dd7cddfSDavid du Colombier 	CrtVs		= 0x4C/4,	/* vertical sync width */
347dd7cddfSDavid du Colombier 	CrtLcnt		= 0x50/4,	/* CRT line counter */
357dd7cddfSDavid du Colombier 	CrtZoom		= 0x54/4,	/* display zoom factor */
367dd7cddfSDavid du Colombier 	Crt1con		= 0x58/4,	/* CRT configuration register 1 */
377dd7cddfSDavid du Colombier 	Crt2con		= 0x5C/4,	/* CRT configuration register 2 */
387dd7cddfSDavid du Colombier 	DbAdr2		= 0x60/4,	/* CRT display start address 2 */
397dd7cddfSDavid du Colombier };
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier enum {					/* memory windows registers */
427dd7cddfSDavid du Colombier 	Mw0Ctrl		= 0x00/4,	/* memory window 0 control */
437dd7cddfSDavid du Colombier 	Mw0Ad		= 0x04/4,	/* memory window 0 address */
447dd7cddfSDavid du Colombier 	Mw0Sz		= 0x08/4,	/* memory window 0 size */
457dd7cddfSDavid du Colombier 	Mw0Org		= 0x10/4,	/* memory window 0 origin */
467dd7cddfSDavid du Colombier 	Mw0Mask		= 0x24/4,	/* Memory window 0 plane mask */
477dd7cddfSDavid du Colombier 	Mw1Ctlr		= 0x28/4,	/* memory window 1 control */
487dd7cddfSDavid du Colombier 	Mw1Ad		= 0x2C/4,	/* memory window 1 address */
497dd7cddfSDavid du Colombier 	Mw1Sz		= 0x30/4,	/* memory window 1 size */
507dd7cddfSDavid du Colombier 	Mw1Org		= 0x38/4,	/* memory window 1 origin */
517dd7cddfSDavid du Colombier 	Mw1Mask		= 0x4C/4,	/* Memory window 1 plane mask */
527dd7cddfSDavid du Colombier 	MwcFcnt		= 0x50/4,	/* memory window cache flush counter */
537dd7cddfSDavid du Colombier 	MwcFlsh		= 0x54/4,	/* manual cache flush */
547dd7cddfSDavid du Colombier 	YuvLi		= 0x58/4,	/* YUV LUT index */
557dd7cddfSDavid du Colombier 	YuvLa		= 0x5C/4,	/* YUV LUT address */
567dd7cddfSDavid du Colombier 	MwCtrl		= 0x60/4,	/* memory window 0 and 1 control */
577dd7cddfSDavid du Colombier };
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier enum {
607dd7cddfSDavid du Colombier 	IndexLo		= 4,
617dd7cddfSDavid du Colombier 	IndexHi		= 5,
627dd7cddfSDavid du Colombier 	Data		= 6,
637dd7cddfSDavid du Colombier 	IndexCtl	= 7,
647dd7cddfSDavid du Colombier };
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier static uchar
_rgb524xi(Vga * vga,int index)677dd7cddfSDavid du Colombier _rgb524xi(Vga* vga, int index)
687dd7cddfSDavid du Colombier {
697dd7cddfSDavid du Colombier 	ulong *mmio;
707dd7cddfSDavid du Colombier 
717dd7cddfSDavid du Colombier 	mmio = (ulong*)((T2r4*)vga->private)->mmio;
727dd7cddfSDavid du Colombier 	mmio[IndexLo] = index & 0xFF;
737dd7cddfSDavid du Colombier 	mmio[IndexHi] = (index>>8) & 0xFF;
747dd7cddfSDavid du Colombier 
757dd7cddfSDavid du Colombier 	return mmio[Data];
767dd7cddfSDavid du Colombier }
777dd7cddfSDavid du Colombier 
787dd7cddfSDavid du Colombier static void
_rgb524xo(Vga * vga,int index,uchar data)797dd7cddfSDavid du Colombier _rgb524xo(Vga* vga, int index, uchar data)
807dd7cddfSDavid du Colombier {
817dd7cddfSDavid du Colombier 	ulong *mmio;
827dd7cddfSDavid du Colombier 
837dd7cddfSDavid du Colombier 	mmio = (ulong*)((T2r4*)vga->private)->mmio;
847dd7cddfSDavid du Colombier 	mmio[IndexLo] = index & 0xFF;
857dd7cddfSDavid du Colombier 	mmio[IndexHi] = (index>>8) & 0xFF;
867dd7cddfSDavid du Colombier 
877dd7cddfSDavid du Colombier 	mmio[Data] = data;
887dd7cddfSDavid du Colombier }
897dd7cddfSDavid du Colombier 
907dd7cddfSDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)917dd7cddfSDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
927dd7cddfSDavid du Colombier {
93*74f16c81SDavid du Colombier 	ulong *mmio;
947dd7cddfSDavid du Colombier 	int f, i, x;
957dd7cddfSDavid du Colombier 	Pcidev *p;
967dd7cddfSDavid du Colombier 	T2r4 *t2r4;
977dd7cddfSDavid du Colombier 	ulong *rp;
987dd7cddfSDavid du Colombier 
997dd7cddfSDavid du Colombier 	if(vga->private == nil){
1007dd7cddfSDavid du Colombier 		vga->private = alloc(sizeof(T2r4));
1017dd7cddfSDavid du Colombier 		if((p = pcimatch(0, 0x105D, 0)) == nil)
1027dd7cddfSDavid du Colombier 			error("%s: not found\n", ctlr->name);
1037dd7cddfSDavid du Colombier 		switch(p->did){
1047dd7cddfSDavid du Colombier 		case 0x5348:			/*  */
1057dd7cddfSDavid du Colombier 			break;
1067dd7cddfSDavid du Colombier 		default:
1077dd7cddfSDavid du Colombier 			error("%s: not found\n", ctlr->name);
1087dd7cddfSDavid du Colombier 		}
1097dd7cddfSDavid du Colombier 
1107dd7cddfSDavid du Colombier 		if((f = open("#v/vgactl", OWRITE)) < 0)
1117dd7cddfSDavid du Colombier 			error("%s: can't open vgactl\n", ctlr->name);
1127dd7cddfSDavid du Colombier 		if(write(f, "type t2r4", 9) != 9)
1137dd7cddfSDavid du Colombier 			error("%s: can't set type\n", ctlr->name);
1147dd7cddfSDavid du Colombier 		close(f);
1157dd7cddfSDavid du Colombier 
116*74f16c81SDavid du Colombier 		mmio = segattach(0, "t2r4mmio", 0, p->mem[4].size);
117*74f16c81SDavid du Colombier 		if(mmio == (void*)-1)
1187dd7cddfSDavid du Colombier 			error("%s: can't attach mmio segment\n", ctlr->name);
1197dd7cddfSDavid du Colombier 
1207dd7cddfSDavid du Colombier 		t2r4 = vga->private;
1217dd7cddfSDavid du Colombier 		t2r4->pci = p;
1227dd7cddfSDavid du Colombier 		t2r4->io = p->mem[5].bar & ~0x0F;
123*74f16c81SDavid du Colombier 		t2r4->mmio = (uchar*)mmio;
1247dd7cddfSDavid du Colombier 	}
1257dd7cddfSDavid du Colombier 	t2r4 = vga->private;
1267dd7cddfSDavid du Colombier 	for(i = 0; i < nelem(t2r4->ioreg); i++)
1277dd7cddfSDavid du Colombier 		t2r4->ioreg[i] = inportl(t2r4->io+(i*4));
1287dd7cddfSDavid du Colombier 
1297dd7cddfSDavid du Colombier 	x = t2r4->ioreg[7] & 0xFF00001F;		/* config1 */
1307dd7cddfSDavid du Colombier 	outportl(t2r4->io+0x1C, x|0x00331F10);
1317dd7cddfSDavid du Colombier 
1327dd7cddfSDavid du Colombier 	x = t2r4->ioreg[8] & 0xFF0FFFFF;		/* config2 */
1337dd7cddfSDavid du Colombier 	outportl(t2r4->io+0x20, x|0x00100000);
1347dd7cddfSDavid du Colombier 
1357dd7cddfSDavid du Colombier 	x = inportl(t2r4->io+0x30) & 0xFF;		/* vgactl */
1367dd7cddfSDavid du Colombier 	outportl(t2r4->io+0x30, x|0x82);
1377dd7cddfSDavid du Colombier 
1387dd7cddfSDavid du Colombier 	rp = (ulong*)t2r4->mmio;
1397dd7cddfSDavid du Colombier 	for(i = 0; i < nelem(t2r4->g); i++)
1407dd7cddfSDavid du Colombier 		t2r4->g[i] = *rp++;
1417dd7cddfSDavid du Colombier 	rp = (ulong*)(t2r4->mmio+8192);
1427dd7cddfSDavid du Colombier 	for(i = 0; i < nelem(t2r4->w); i++)
1437dd7cddfSDavid du Colombier 		t2r4->w[i] = *rp++;
1447dd7cddfSDavid du Colombier 
1457dd7cddfSDavid du Colombier 	vga->vma = vga->vmz = t2r4->pci->mem[0].size;
1467dd7cddfSDavid du Colombier 	ctlr->flag |= Hlinear;
1477dd7cddfSDavid du Colombier 
1487dd7cddfSDavid du Colombier 	/*
1497dd7cddfSDavid du Colombier 	 * Currently, the RGB524 has no need of a snarf
1507dd7cddfSDavid du Colombier 	 * routine so this will be called before any RGB524 code.
1517dd7cddfSDavid du Colombier 	 */
1527dd7cddfSDavid du Colombier 	if(vga->ramdac && strncmp(vga->ramdac->name, "rgb524mn", 8) == 0){
1537dd7cddfSDavid du Colombier 		rgb524mnxi = _rgb524xi;
1547dd7cddfSDavid du Colombier 		rgb524mnxo = _rgb524xo;
1557dd7cddfSDavid du Colombier 	}
1567dd7cddfSDavid du Colombier 
1577dd7cddfSDavid du Colombier 	ctlr->flag |= Fsnarf;
1587dd7cddfSDavid du Colombier }
1597dd7cddfSDavid du Colombier 
1607dd7cddfSDavid du Colombier static void
options(Vga * vga,Ctlr * ctlr)1617dd7cddfSDavid du Colombier options(Vga* vga, Ctlr* ctlr)
1627dd7cddfSDavid du Colombier {
1637dd7cddfSDavid du Colombier 	USED(vga);
1647dd7cddfSDavid du Colombier 	ctlr->flag |= Foptions;
1657dd7cddfSDavid du Colombier }
1667dd7cddfSDavid du Colombier 
1677dd7cddfSDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)1687dd7cddfSDavid du Colombier init(Vga* vga, Ctlr* ctlr)
1697dd7cddfSDavid du Colombier {
1707dd7cddfSDavid du Colombier 	char *val;
1717dd7cddfSDavid du Colombier 	T2r4 *t2r4;
1727dd7cddfSDavid du Colombier 	int crtclocks, zoom;
1737dd7cddfSDavid du Colombier 
1747dd7cddfSDavid du Colombier 	t2r4 = vga->private;
1757dd7cddfSDavid du Colombier 	crtclocks = 64/vga->mode->z;
1767dd7cddfSDavid du Colombier 
1777dd7cddfSDavid du Colombier 	zoom = 1;
1787dd7cddfSDavid du Colombier 	if((val = dbattr(vga->mode->attr, "zoom")) && strtol(val, 0, 0))
1797dd7cddfSDavid du Colombier 		zoom = 2;
1807dd7cddfSDavid du Colombier 
1817dd7cddfSDavid du Colombier 	t2r4->g[DbAdr] = 0;
1827dd7cddfSDavid du Colombier 	switch(vga->mode->z){
1837dd7cddfSDavid du Colombier 	case 8:
1847dd7cddfSDavid du Colombier 		t2r4->g[DbPtch] = vga->mode->x*1;
1857dd7cddfSDavid du Colombier 		break;
1867dd7cddfSDavid du Colombier 	case 16:
1877dd7cddfSDavid du Colombier 		t2r4->g[DbPtch] = vga->mode->x*2;
1887dd7cddfSDavid du Colombier 		break;
1897dd7cddfSDavid du Colombier 	case 32:
1907dd7cddfSDavid du Colombier 		t2r4->g[DbPtch] = vga->mode->x*4;
1917dd7cddfSDavid du Colombier 		break;
1927dd7cddfSDavid du Colombier 	}
1937dd7cddfSDavid du Colombier 	t2r4->g[CrtHac] = vga->mode->x/crtclocks;
1947dd7cddfSDavid du Colombier 	t2r4->g[CrtHbl] = (vga->mode->ht-vga->mode->x)/crtclocks;
1957dd7cddfSDavid du Colombier 	if(vga->mode->shs == 0)
1967dd7cddfSDavid du Colombier 		vga->mode->shs = vga->mode->shb;
1977dd7cddfSDavid du Colombier 	t2r4->g[CrtHfp] = (vga->mode->shs-vga->mode->x)/crtclocks;
1987dd7cddfSDavid du Colombier 	if(vga->mode->ehs == 0)
1997dd7cddfSDavid du Colombier 		vga->mode->ehs = vga->mode->ehb;
2007dd7cddfSDavid du Colombier 	t2r4->g[CrtHs] = (vga->mode->ehs-vga->mode->shs)/crtclocks;
2017dd7cddfSDavid du Colombier 	t2r4->g[CrtVac] = vga->mode->y * zoom;
2027dd7cddfSDavid du Colombier 	t2r4->g[CrtVbl] = (vga->mode->vt-vga->mode->y) * zoom;
2037dd7cddfSDavid du Colombier 	t2r4->g[CrtVfp] = (vga->mode->vrs-vga->mode->y) * zoom;
2047dd7cddfSDavid du Colombier 	t2r4->g[CrtVs] = (vga->mode->vre-vga->mode->vrs) * zoom;
2057dd7cddfSDavid du Colombier 	t2r4->g[CrtZoom] = 0;
2067dd7cddfSDavid du Colombier 
2077dd7cddfSDavid du Colombier 	/*
2087dd7cddfSDavid du Colombier 	 * Turn on the syncs and video.
2097dd7cddfSDavid du Colombier 	 * Bts (bit 0x100) is digital RGB output enable. If there's
2107dd7cddfSDavid du Colombier 	 * a flat-panel then this is hopefully already set by the BIOS,
2117dd7cddfSDavid du Colombier 	 * so don't touch it. (It's possible that bit 0 of SoftSw
2127dd7cddfSDavid du Colombier 	 * indicates flat-panel or CRT).
2137dd7cddfSDavid du Colombier 	 */
2147dd7cddfSDavid du Colombier 	t2r4->g[Crt1con] &= 0x00000100;
2157dd7cddfSDavid du Colombier 	t2r4->g[Crt1con] |= 0x70;
2167dd7cddfSDavid du Colombier 	t2r4->g[Crt2con] = 0x20000100;
2177dd7cddfSDavid du Colombier 
2187dd7cddfSDavid du Colombier 	if(zoom == 2)
2197dd7cddfSDavid du Colombier 		t2r4->g[CrtZoom] = 1;
2207dd7cddfSDavid du Colombier 
2217dd7cddfSDavid du Colombier 	t2r4->w[Mw0Ctrl] = 0;
2227dd7cddfSDavid du Colombier 	t2r4->w[Mw0Sz] = 0x0D;	/* 32MB */
2237dd7cddfSDavid du Colombier 	t2r4->w[Mw0Org] = 0;
2247dd7cddfSDavid du Colombier 	t2r4->w[Mw0Mask] = 0xFFFFFFFF;
2257dd7cddfSDavid du Colombier 
2267dd7cddfSDavid du Colombier 	if(vga->linear && (ctlr->flag & Hlinear))
2277dd7cddfSDavid du Colombier 		ctlr->flag |= Ulinear;
2287dd7cddfSDavid du Colombier 
2297dd7cddfSDavid du Colombier 	ctlr->flag |= Finit;
2307dd7cddfSDavid du Colombier }
2317dd7cddfSDavid du Colombier 
2327dd7cddfSDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)2337dd7cddfSDavid du Colombier load(Vga* vga, Ctlr* ctlr)
2347dd7cddfSDavid du Colombier {
2357dd7cddfSDavid du Colombier 	T2r4 *t2r4;
2367dd7cddfSDavid du Colombier 	ulong *g, *w;
2377dd7cddfSDavid du Colombier 
2387dd7cddfSDavid du Colombier 	t2r4 = vga->private;
2397dd7cddfSDavid du Colombier 
2407dd7cddfSDavid du Colombier 	g = (ulong*)t2r4->mmio;
2417dd7cddfSDavid du Colombier 	g[DbAdr] = t2r4->g[DbAdr];
2427dd7cddfSDavid du Colombier 	g[DbPtch] = t2r4->g[DbPtch];
2437dd7cddfSDavid du Colombier 	g[CrtHac] = t2r4->g[CrtHac];
2447dd7cddfSDavid du Colombier 	g[CrtHbl] = t2r4->g[CrtHbl];
2457dd7cddfSDavid du Colombier 	g[CrtHfp] = t2r4->g[CrtHfp];
2467dd7cddfSDavid du Colombier 	g[CrtHs] = t2r4->g[CrtHs];
2477dd7cddfSDavid du Colombier 	g[CrtVac] = t2r4->g[CrtVac];
2487dd7cddfSDavid du Colombier 	g[CrtVbl] = t2r4->g[CrtVbl];
2497dd7cddfSDavid du Colombier 	g[CrtVfp] = t2r4->g[CrtVfp];
2507dd7cddfSDavid du Colombier 	g[CrtVs] = t2r4->g[CrtVs];
2517dd7cddfSDavid du Colombier 	g[Crt1con] = t2r4->g[Crt1con];
2527dd7cddfSDavid du Colombier 	g[Crt2con] = t2r4->g[Crt2con];
2537dd7cddfSDavid du Colombier 	g[CrtZoom] = t2r4->g[CrtZoom];
2547dd7cddfSDavid du Colombier 
2557dd7cddfSDavid du Colombier 	w = (ulong*)(t2r4->mmio+8192);
2567dd7cddfSDavid du Colombier 	w[Mw0Ctrl] = t2r4->w[Mw0Ctrl];
2577dd7cddfSDavid du Colombier 	w[Mw0Sz] = t2r4->w[Mw0Sz];
2587dd7cddfSDavid du Colombier 	w[Mw0Org] = t2r4->w[Mw0Org];
2597dd7cddfSDavid du Colombier 	w[Mw0Mask] = t2r4->w[Mw0Mask];
2607dd7cddfSDavid du Colombier 
2617dd7cddfSDavid du Colombier 	if(t2r4->g[CrtZoom])
2627dd7cddfSDavid du Colombier 		outportl(t2r4->io+0x30, 0xA2);	/* vgactl */
2637dd7cddfSDavid du Colombier 	else
2647dd7cddfSDavid du Colombier 		outportl(t2r4->io+0x30, 0x82);	/* vgactl */
2657dd7cddfSDavid du Colombier 	outportl(t2r4->io+0x24, 0x211BF030);	/* sgram */
2667dd7cddfSDavid du Colombier 	sleep(500);
2677dd7cddfSDavid du Colombier 	outportl(t2r4->io+0x24, 0xA11BF030);	/* sgram */
2687dd7cddfSDavid du Colombier 
2697dd7cddfSDavid du Colombier 	ctlr->flag |= Fload;
2707dd7cddfSDavid du Colombier }
2717dd7cddfSDavid du Colombier 
2727dd7cddfSDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)2737dd7cddfSDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
2747dd7cddfSDavid du Colombier {
2757dd7cddfSDavid du Colombier 	int i;
2767dd7cddfSDavid du Colombier 	T2r4 *t2r4;
2777dd7cddfSDavid du Colombier 
2787dd7cddfSDavid du Colombier 	t2r4 = vga->private;
2797dd7cddfSDavid du Colombier 	Bprint(&stdout, "\n");
2807dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s ioreg\t\t%8.8luX\n", ctlr->name, t2r4->io);
2817dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s rbase_g\t%8.8luX\n", ctlr->name, t2r4->ioreg[0]);
2827dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s rbase_w\t%8.8luX\n", ctlr->name, t2r4->ioreg[1]);
2837dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s rbase_d\t%8.8luX\n", ctlr->name, t2r4->ioreg[2]);
2847dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s rbase_i\t%8.8luX\n", ctlr->name, t2r4->ioreg[4]);
2857dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s rbase_e\t%8.8luX\n", ctlr->name, t2r4->ioreg[5]);
2867dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s id\t\t\t%8.8luX\n", ctlr->name, t2r4->ioreg[6]);
2877dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s config1\t\t%8.8luX\n", ctlr->name, t2r4->ioreg[7]);
2887dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s config2\t\t%8.8luX\n", ctlr->name, t2r4->ioreg[8]);
2897dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s sgram\t\t%8.8luX\n", ctlr->name, t2r4->ioreg[9]);
2907dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s softsw\t\t%8.8luX\n", ctlr->name, t2r4->ioreg[10]);
2917dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s ddc\t\t%8.8luX\n", ctlr->name, t2r4->ioreg[11]);
2927dd7cddfSDavid du Colombier 	Bprint(&stdout, "%s vgactl\t\t%8.8luX\n", ctlr->name, t2r4->ioreg[12]);
2937dd7cddfSDavid du Colombier 
2947dd7cddfSDavid du Colombier 	Bprint(&stdout, "\n");
2957dd7cddfSDavid du Colombier 	for(i = 0; i < nelem(t2r4->g); i++)
2967dd7cddfSDavid du Colombier 		Bprint(&stdout, "%s g reg0x%2.2uX\t\t%8.8luX\n",
2977dd7cddfSDavid du Colombier 			ctlr->name, i*4, t2r4->g[i]);
2987dd7cddfSDavid du Colombier 	Bprint(&stdout, "\n");
2997dd7cddfSDavid du Colombier 	for(i = 0; i < nelem(t2r4->w); i++)
3007dd7cddfSDavid du Colombier 		Bprint(&stdout, "%s w reg0x%2.2uX\t\t%8.8luX\n",
3017dd7cddfSDavid du Colombier 			ctlr->name, i*4, t2r4->w[i]);
3027dd7cddfSDavid du Colombier }
3037dd7cddfSDavid du Colombier 
3047dd7cddfSDavid du Colombier Ctlr t2r4 = {
3057dd7cddfSDavid du Colombier 	"t2r4",				/* name */
3067dd7cddfSDavid du Colombier 	snarf,				/* snarf */
3077dd7cddfSDavid du Colombier 	options,			/* options */
3087dd7cddfSDavid du Colombier 	init,				/* init */
3097dd7cddfSDavid du Colombier 	load,				/* load */
3107dd7cddfSDavid du Colombier 	dump,				/* dump */
3117dd7cddfSDavid du Colombier };
3127dd7cddfSDavid du Colombier 
3137dd7cddfSDavid du Colombier Ctlr t2r4hwgc = {
3147dd7cddfSDavid du Colombier 	"t2r4hwgc",			/* name */
3157dd7cddfSDavid du Colombier 	0,				/* snarf */
3167dd7cddfSDavid du Colombier 	0,				/* options */
3177dd7cddfSDavid du Colombier 	0,				/* init */
3187dd7cddfSDavid du Colombier 	0,				/* load */
3197dd7cddfSDavid du Colombier 	0,				/* dump */
3207dd7cddfSDavid du Colombier };
321