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