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 * Laguna Visual Media Accelerators Family CL-GD546x.
107dd7cddfSDavid du Colombier */
117dd7cddfSDavid du Colombier typedef struct {
127dd7cddfSDavid du Colombier Pcidev* pci;
13*74f16c81SDavid du Colombier uchar* mmio;
147dd7cddfSDavid du Colombier int mem;
157dd7cddfSDavid du Colombier
167dd7cddfSDavid du Colombier int format; /* graphics and video format */
177dd7cddfSDavid du Colombier int threshold; /* display threshold */
187dd7cddfSDavid du Colombier int tilectrl; /* tiling control */
197dd7cddfSDavid du Colombier int vsc; /* vendor specific control */
207dd7cddfSDavid du Colombier int control; /* control */
217dd7cddfSDavid du Colombier int tilectrl2D3D; /* tiling control 2D3D */
227dd7cddfSDavid du Colombier } Laguna;
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier enum {
257dd7cddfSDavid du Colombier Format = 0xC0, /* graphics and video format */
267dd7cddfSDavid du Colombier
277dd7cddfSDavid du Colombier Threshold = 0xEA, /* Display Threshold */
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier TileCtrl = 0x2C4,
307dd7cddfSDavid du Colombier
317dd7cddfSDavid du Colombier Vsc = 0x3FC, /* Vendor Specific Control (32-bits) */
327dd7cddfSDavid du Colombier
337dd7cddfSDavid du Colombier Control = 0x402, /* 2D Control */
347dd7cddfSDavid du Colombier TileCtrl2D3D = 0x407, /* (8-bits) */
357dd7cddfSDavid du Colombier };
367dd7cddfSDavid du Colombier
377dd7cddfSDavid du Colombier static int
mmio8r(Laguna * laguna,int offset)387dd7cddfSDavid du Colombier mmio8r(Laguna* laguna, int offset)
397dd7cddfSDavid du Colombier {
40*74f16c81SDavid du Colombier return *(laguna->mmio+offset) & 0xFF;
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier static void
mmio8w(Laguna * laguna,int offset,int data)447dd7cddfSDavid du Colombier mmio8w(Laguna* laguna, int offset, int data)
457dd7cddfSDavid du Colombier {
46*74f16c81SDavid du Colombier *(laguna->mmio+offset) = data;
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier static int
mmio16r(Laguna * laguna,int offset)507dd7cddfSDavid du Colombier mmio16r(Laguna* laguna, int offset)
517dd7cddfSDavid du Colombier {
527dd7cddfSDavid du Colombier return *((ushort*)(laguna->mmio+offset)) & 0xFFFF;
537dd7cddfSDavid du Colombier }
547dd7cddfSDavid du Colombier
557dd7cddfSDavid du Colombier static void
mmio16w(Laguna * laguna,int offset,int data)567dd7cddfSDavid du Colombier mmio16w(Laguna* laguna, int offset, int data)
577dd7cddfSDavid du Colombier {
587dd7cddfSDavid du Colombier *((ushort*)(laguna->mmio+offset)) = data;
597dd7cddfSDavid du Colombier }
607dd7cddfSDavid du Colombier
617dd7cddfSDavid du Colombier static int
mmio32r(Laguna * laguna,int offset)627dd7cddfSDavid du Colombier mmio32r(Laguna* laguna, int offset)
637dd7cddfSDavid du Colombier {
647dd7cddfSDavid du Colombier return *((ulong*)(laguna->mmio+offset));
657dd7cddfSDavid du Colombier }
667dd7cddfSDavid du Colombier
677dd7cddfSDavid du Colombier static void
mmio32w(Laguna * laguna,int offset,int data)687dd7cddfSDavid du Colombier mmio32w(Laguna* laguna, int offset, int data)
697dd7cddfSDavid du Colombier {
707dd7cddfSDavid du Colombier *((ulong*)(laguna->mmio+offset)) = data;
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier
737dd7cddfSDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)747dd7cddfSDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
757dd7cddfSDavid du Colombier {
767dd7cddfSDavid du Colombier int f, i;
77*74f16c81SDavid du Colombier uchar *mmio;
787dd7cddfSDavid du Colombier Pcidev *p;
797dd7cddfSDavid du Colombier Laguna *laguna;
807dd7cddfSDavid du Colombier
817dd7cddfSDavid du Colombier /*
827dd7cddfSDavid du Colombier * Save all the registers, even though we'll only
837dd7cddfSDavid du Colombier * change a handful.
847dd7cddfSDavid du Colombier */
857dd7cddfSDavid du Colombier for(i = 0x06; i < 0x20; i++)
867dd7cddfSDavid du Colombier vga->sequencer[i] = vgaxi(Seqx, i);
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier for(i = 0x09; i < 0x0C; i++)
897dd7cddfSDavid du Colombier vga->graphics[i] = vgaxi(Grx, i);
907dd7cddfSDavid du Colombier
917dd7cddfSDavid du Colombier for(i = 0x19; i < 0x20; i++)
927dd7cddfSDavid du Colombier vga->crt[i] = vgaxi(Crtx, i);
937dd7cddfSDavid du Colombier
947dd7cddfSDavid du Colombier if(vga->private == nil){
957dd7cddfSDavid du Colombier vga->private = alloc(sizeof(Laguna));
967dd7cddfSDavid du Colombier if((p = pcimatch(0, 0x1013, 0)) == nil)
977dd7cddfSDavid du Colombier error("%s: not found\n", ctlr->name);
987dd7cddfSDavid du Colombier switch(p->did){
997dd7cddfSDavid du Colombier case 0xD0: /* CL-GD5462 */
1007dd7cddfSDavid du Colombier vga->f[1] = 170000000;
1017dd7cddfSDavid du Colombier break;
1027dd7cddfSDavid du Colombier case 0xD4: /* CL-GD5464 */
1037dd7cddfSDavid du Colombier case 0xD6: /* CL-GD5465 */
1047dd7cddfSDavid du Colombier vga->f[1] = 230000000;
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 clgd546x", 13) != 13)
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, "clgd546xmmio", 0, p->mem[1].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 laguna = vga->private;
1207dd7cddfSDavid du Colombier laguna->pci = p;
121*74f16c81SDavid du Colombier laguna->mmio = mmio;
1227dd7cddfSDavid du Colombier }
1237dd7cddfSDavid du Colombier laguna = vga->private;
1247dd7cddfSDavid du Colombier
1257dd7cddfSDavid du Colombier laguna->mem = (vga->sequencer[0x14] & 0x07)+1;
1267dd7cddfSDavid du Colombier
1277dd7cddfSDavid du Colombier laguna->format = mmio16r(laguna, Format);
1287dd7cddfSDavid du Colombier laguna->threshold = mmio16r(laguna, Threshold);
1297dd7cddfSDavid du Colombier laguna->tilectrl = mmio16r(laguna, TileCtrl);
1307dd7cddfSDavid du Colombier laguna->vsc = mmio32r(laguna, Vsc);
1317dd7cddfSDavid du Colombier laguna->control = mmio16r(laguna, Control);
1327dd7cddfSDavid du Colombier laguna->tilectrl2D3D = mmio8r(laguna, TileCtrl2D3D);
1337dd7cddfSDavid du Colombier
1347dd7cddfSDavid du Colombier vga->vma = vga->vmz = laguna->pci->mem[0].size;
1357dd7cddfSDavid du Colombier ctlr->flag |= Hlinear;
1367dd7cddfSDavid du Colombier
1377dd7cddfSDavid du Colombier ctlr->flag |= Fsnarf;
1387dd7cddfSDavid du Colombier }
1397dd7cddfSDavid du Colombier
1407dd7cddfSDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)1417dd7cddfSDavid du Colombier init(Vga* vga, Ctlr* ctlr)
1427dd7cddfSDavid du Colombier {
1437dd7cddfSDavid du Colombier Mode *mode;
1447dd7cddfSDavid du Colombier ushort x;
1457dd7cddfSDavid du Colombier int format, interleave, fetches, nointerleave, notile, pagesize, tiles;
1467dd7cddfSDavid du Colombier Laguna *laguna;
1477dd7cddfSDavid du Colombier
1487dd7cddfSDavid du Colombier nointerleave = 1;
1497dd7cddfSDavid du Colombier notile = 1;
1507dd7cddfSDavid du Colombier pagesize = 0;
1517dd7cddfSDavid du Colombier
1527dd7cddfSDavid du Colombier mode = vga->mode;
1537dd7cddfSDavid du Colombier
1547dd7cddfSDavid du Colombier if(vga->f[0] == 0)
1557dd7cddfSDavid du Colombier vga->f[0] = vga->mode->frequency;
1567dd7cddfSDavid du Colombier if(vga->f[0] > vga->f[1])
1577dd7cddfSDavid du Colombier error("%s: invalid pclk - %lud\n", ctlr->name, vga->f[0]);
1587dd7cddfSDavid du Colombier
1597dd7cddfSDavid du Colombier if(mode->z > 8)
1607dd7cddfSDavid du Colombier error("%s: depth %d not supported\n", ctlr->name, mode->z);
1617dd7cddfSDavid du Colombier
1627dd7cddfSDavid du Colombier /*
1637dd7cddfSDavid du Colombier * VCLK3
1647dd7cddfSDavid du Colombier */
1657dd7cddfSDavid du Colombier clgd54xxclock(vga, ctlr);
1667dd7cddfSDavid du Colombier vga->misc |= 0x0C;
1677dd7cddfSDavid du Colombier vga->sequencer[0x1E] = vga->n[0];
1687dd7cddfSDavid du Colombier vga->sequencer[0x0E] = (vga->d[0]<<1)|vga->p[0];
1697dd7cddfSDavid du Colombier
1707dd7cddfSDavid du Colombier vga->sequencer[0x07] = 0x00;
1717dd7cddfSDavid du Colombier if(mode->z == 8)
1727dd7cddfSDavid du Colombier vga->sequencer[0x07] |= 0x01;
1737dd7cddfSDavid du Colombier
1747dd7cddfSDavid du Colombier vga->crt[0x14] = 0;
1757dd7cddfSDavid du Colombier vga->crt[0x17] = 0xC3;
1767dd7cddfSDavid du Colombier
1777dd7cddfSDavid du Colombier /*
1787dd7cddfSDavid du Colombier * Overflow bits.
1797dd7cddfSDavid du Colombier */
1807dd7cddfSDavid du Colombier vga->crt[0x1A] = 0x00;
1817dd7cddfSDavid du Colombier x = mode->ehb>>3;
1827dd7cddfSDavid du Colombier if(x & 0x40)
1837dd7cddfSDavid du Colombier vga->crt[0x1A] |= 0x10;
1847dd7cddfSDavid du Colombier if(x & 0x80)
1857dd7cddfSDavid du Colombier vga->crt[0x1A] |= 0x20;
1867dd7cddfSDavid du Colombier if(vga->crt[0x16] & 0x100)
1877dd7cddfSDavid du Colombier vga->crt[0x1A] |= 0x40;
1887dd7cddfSDavid du Colombier if(vga->crt[0x16] & 0x200)
1897dd7cddfSDavid du Colombier vga->crt[0x1A] |= 0x80;
1907dd7cddfSDavid du Colombier vga->crt[0x1B] = 0x22;
1917dd7cddfSDavid du Colombier if(vga->crt[0x13] & 0x100)
1927dd7cddfSDavid du Colombier vga->crt[0x1B] |= 0x10;
1937dd7cddfSDavid du Colombier vga->crt[0x1D] = 0x00;
1947dd7cddfSDavid du Colombier if(vga->crt[0x13] & 0x200)
1957dd7cddfSDavid du Colombier vga->crt[0x1D] |= 0x01;
1967dd7cddfSDavid du Colombier vga->crt[0x1E] = 0x00;
1977dd7cddfSDavid du Colombier if(vga->crt[0x10] & 0x400)
1987dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x01;
1997dd7cddfSDavid du Colombier if(vga->crt[0x15] & 0x400)
2007dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x02;
2017dd7cddfSDavid du Colombier if(vga->crt[0x12] & 0x400)
2027dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x04;
2037dd7cddfSDavid du Colombier if(vga->crt[0x06] & 0x400)
2047dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x08;
2057dd7cddfSDavid du Colombier if(vga->crt[0x04] & 0x100)
2067dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x10;
2077dd7cddfSDavid du Colombier if(vga->crt[0x02] & 0x100)
2087dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x20;
2097dd7cddfSDavid du Colombier if(vga->crt[0x01] & 0x100)
2107dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x40;
2117dd7cddfSDavid du Colombier if(vga->crt[0x00] & 0x100)
2127dd7cddfSDavid du Colombier vga->crt[0x1E] |= 0x80;
2137dd7cddfSDavid du Colombier
2147dd7cddfSDavid du Colombier vga->graphics[0x0B] = 0x00;
2157dd7cddfSDavid du Colombier if(vga->vmz > 1024*1024)
2167dd7cddfSDavid du Colombier vga->graphics[0x0B] |= 0x20;
2177dd7cddfSDavid du Colombier
2187dd7cddfSDavid du Colombier if(mode->interlace == 'v'){
2197dd7cddfSDavid du Colombier vga->crt[0x19] = vga->crt[0x00]/2;
2207dd7cddfSDavid du Colombier vga->crt[0x1A] |= 0x01;
2217dd7cddfSDavid du Colombier }
2227dd7cddfSDavid du Colombier
2237dd7cddfSDavid du Colombier if(vga->linear && (ctlr->flag & Hlinear))
2247dd7cddfSDavid du Colombier ctlr->flag |= Ulinear;
2257dd7cddfSDavid du Colombier
2267dd7cddfSDavid du Colombier laguna = vga->private;
2277dd7cddfSDavid du Colombier
2287dd7cddfSDavid du Colombier /*
2297dd7cddfSDavid du Colombier * Ignore wide tiles for now, this simplifies things.
2307dd7cddfSDavid du Colombier */
2317dd7cddfSDavid du Colombier if(mode->x <= 640)
2327dd7cddfSDavid du Colombier tiles = 5;
2337dd7cddfSDavid du Colombier else if(mode->x <= 1024)
2347dd7cddfSDavid du Colombier tiles = 8;
2357dd7cddfSDavid du Colombier else if(mode->x <= 1280)
2367dd7cddfSDavid du Colombier tiles = 10;
2377dd7cddfSDavid du Colombier else if(mode->x <= 1664)
2387dd7cddfSDavid du Colombier tiles = 13;
2397dd7cddfSDavid du Colombier else if(mode->x <= 2048)
2407dd7cddfSDavid du Colombier tiles = 16;
2417dd7cddfSDavid du Colombier else if(mode->x <= 2560)
2427dd7cddfSDavid du Colombier tiles = 20;
2437dd7cddfSDavid du Colombier else if(mode->x <= 3228)
2447dd7cddfSDavid du Colombier tiles = 26;
2457dd7cddfSDavid du Colombier else
2467dd7cddfSDavid du Colombier tiles = 32;
2477dd7cddfSDavid du Colombier fetches = tiles; /* -1? */
2487dd7cddfSDavid du Colombier
2497dd7cddfSDavid du Colombier if(nointerleave)
2507dd7cddfSDavid du Colombier interleave = 0;
2517dd7cddfSDavid du Colombier else switch(laguna->mem){
2527dd7cddfSDavid du Colombier default:
2537dd7cddfSDavid du Colombier interleave = 0;
2547dd7cddfSDavid du Colombier break;
2557dd7cddfSDavid du Colombier case 2:
2567dd7cddfSDavid du Colombier interleave = 1;
2577dd7cddfSDavid du Colombier break;
2587dd7cddfSDavid du Colombier case 4:
2597dd7cddfSDavid du Colombier case 8:
2607dd7cddfSDavid du Colombier interleave = 2;
2617dd7cddfSDavid du Colombier break;
2627dd7cddfSDavid du Colombier }
2637dd7cddfSDavid du Colombier
2647dd7cddfSDavid du Colombier if(mode->z == 8)
2657dd7cddfSDavid du Colombier format = 0;
2667dd7cddfSDavid du Colombier else if(mode->z == 16)
2677dd7cddfSDavid du Colombier format = (1<<12)|(2<<9);
2687dd7cddfSDavid du Colombier else if(mode->z == 24)
2697dd7cddfSDavid du Colombier format = (2<<12)|(2<<9);
2707dd7cddfSDavid du Colombier else
2717dd7cddfSDavid du Colombier format = (2<<12)|(2<<9);
2727dd7cddfSDavid du Colombier
2737dd7cddfSDavid du Colombier //if(ctlr->flag & Ulinear)
2747dd7cddfSDavid du Colombier // laguna->vsc |= 0x10000000;
2757dd7cddfSDavid du Colombier //else
2767dd7cddfSDavid du Colombier laguna->vsc &= ~0x10000000;
2777dd7cddfSDavid du Colombier laguna->format = format;
2787dd7cddfSDavid du Colombier laguna->threshold = (interleave<<14)|(fetches<<8)|0x14;
2797dd7cddfSDavid du Colombier laguna->tilectrl &= 0x3F;
2807dd7cddfSDavid du Colombier laguna->tilectrl |= (interleave<<14)|(tiles<<8);
2817dd7cddfSDavid du Colombier if(!notile)
2827dd7cddfSDavid du Colombier laguna->tilectrl |= 0x80;
2837dd7cddfSDavid du Colombier if(pagesize == 1)
2847dd7cddfSDavid du Colombier laguna->tilectrl |= 0x10;
2857dd7cddfSDavid du Colombier laguna->tilectrl2D3D = (interleave<<6)|tiles;
2867dd7cddfSDavid du Colombier laguna->control = 0;
2877dd7cddfSDavid du Colombier if(notile)
2887dd7cddfSDavid du Colombier laguna->control |= 0x1000;
2897dd7cddfSDavid du Colombier if(pagesize == 1)
2907dd7cddfSDavid du Colombier laguna->control |= 0x0200;
2917dd7cddfSDavid du Colombier }
2927dd7cddfSDavid du Colombier
2937dd7cddfSDavid du Colombier static void
load(Vga * vga,Ctlr *)2947dd7cddfSDavid du Colombier load(Vga* vga, Ctlr*)
2957dd7cddfSDavid du Colombier {
2967dd7cddfSDavid du Colombier Laguna *laguna;
2977dd7cddfSDavid du Colombier
2987dd7cddfSDavid du Colombier vgaxo(Seqx, 0x0E, vga->sequencer[0x0E]);
2997dd7cddfSDavid du Colombier vgaxo(Seqx, 0x1E, vga->sequencer[0x1E]);
3007dd7cddfSDavid du Colombier vgaxo(Seqx, 0x07, vga->sequencer[0x07]);
3017dd7cddfSDavid du Colombier
3027dd7cddfSDavid du Colombier if(vga->mode->interlace == 'v')
3037dd7cddfSDavid du Colombier vgaxo(Crtx, 0x19, vga->crt[0x19]);
3047dd7cddfSDavid du Colombier vgaxo(Crtx, 0x1A, vga->crt[0x1A]);
3057dd7cddfSDavid du Colombier vgaxo(Crtx, 0x1B, vga->crt[0x1B]);
3067dd7cddfSDavid du Colombier vgaxo(Crtx, 0x1D, vga->crt[0x1D]);
3077dd7cddfSDavid du Colombier vgaxo(Crtx, 0x1E, vga->crt[0x1E]);
3087dd7cddfSDavid du Colombier
3097dd7cddfSDavid du Colombier vgaxo(Grx, 0x0B, vga->graphics[0x0B]);
3107dd7cddfSDavid du Colombier
3117dd7cddfSDavid du Colombier laguna = vga->private;
3127dd7cddfSDavid du Colombier mmio16w(laguna, Format, laguna->format);
3137dd7cddfSDavid du Colombier mmio32w(laguna, Vsc, laguna->vsc);
3147dd7cddfSDavid du Colombier mmio16w(laguna, Threshold, laguna->threshold);
3157dd7cddfSDavid du Colombier mmio16w(laguna, TileCtrl, laguna->tilectrl);
3167dd7cddfSDavid du Colombier mmio8w(laguna, TileCtrl2D3D, laguna->tilectrl2D3D);
3177dd7cddfSDavid du Colombier mmio16w(laguna, Control, laguna->control);
3187dd7cddfSDavid du Colombier }
3197dd7cddfSDavid du Colombier
3207dd7cddfSDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)3217dd7cddfSDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
3227dd7cddfSDavid du Colombier {
3237dd7cddfSDavid du Colombier int i;
3247dd7cddfSDavid du Colombier char *name;
3257dd7cddfSDavid du Colombier Laguna *laguna;
3267dd7cddfSDavid du Colombier
3277dd7cddfSDavid du Colombier name = ctlr->name;
3287dd7cddfSDavid du Colombier
3297dd7cddfSDavid du Colombier printitem(name, "Seq06");
3307dd7cddfSDavid du Colombier for(i = 0x06; i < 0x20; i++)
3317dd7cddfSDavid du Colombier printreg(vga->sequencer[i]);
3327dd7cddfSDavid du Colombier
3337dd7cddfSDavid du Colombier printitem(name, "Crt19");
3347dd7cddfSDavid du Colombier for(i = 0x19; i < 0x20; i++)
3357dd7cddfSDavid du Colombier printreg(vga->crt[i]);
3367dd7cddfSDavid du Colombier
3377dd7cddfSDavid du Colombier printitem(name, "Gr09");
3387dd7cddfSDavid du Colombier for(i = 0x09; i < 0x0C; i++)
3397dd7cddfSDavid du Colombier printreg(vga->graphics[i]);
3407dd7cddfSDavid du Colombier
3417dd7cddfSDavid du Colombier laguna = vga->private;
3427dd7cddfSDavid du Colombier Bprint(&stdout, "\n");
3437dd7cddfSDavid du Colombier Bprint(&stdout, "%s mem\t\t%d\n", ctlr->name, laguna->mem*1024*1024);
3447dd7cddfSDavid du Colombier Bprint(&stdout, "%s Format\t\t%uX\n", ctlr->name, laguna->format);
3457dd7cddfSDavid du Colombier Bprint(&stdout, "%s Threshold\t\t\t%uX\n",
3467dd7cddfSDavid du Colombier ctlr->name, laguna->threshold);
3477dd7cddfSDavid du Colombier Bprint(&stdout, "%s TileCtrl\t\t\t%uX\n", ctlr->name, laguna->tilectrl);
3487dd7cddfSDavid du Colombier Bprint(&stdout, "%s Vsc\t\t%uX\n", ctlr->name, laguna->vsc);
3497dd7cddfSDavid du Colombier Bprint(&stdout, "%s Control\t\t%uX\n", ctlr->name, laguna->control);
3507dd7cddfSDavid du Colombier Bprint(&stdout, "%s TileCtrlC2D3D\t\t%uX\n",
3517dd7cddfSDavid du Colombier ctlr->name, laguna->tilectrl2D3D);
3527dd7cddfSDavid du Colombier }
3537dd7cddfSDavid du Colombier
3547dd7cddfSDavid du Colombier Ctlr clgd546x = {
3557dd7cddfSDavid du Colombier "clgd546x", /* name */
3567dd7cddfSDavid du Colombier snarf, /* snarf */
3577dd7cddfSDavid du Colombier 0, /* options */
3587dd7cddfSDavid du Colombier init, /* init */
3597dd7cddfSDavid du Colombier load, /* load */
3607dd7cddfSDavid du Colombier dump, /* dump */
3617dd7cddfSDavid du Colombier };
3627dd7cddfSDavid du Colombier
3637dd7cddfSDavid du Colombier Ctlr clgd546xhwgc = {
3647dd7cddfSDavid du Colombier "clgd546xhwgc", /* name */
3657dd7cddfSDavid du Colombier 0, /* snarf */
3667dd7cddfSDavid du Colombier 0, /* options */
3677dd7cddfSDavid du Colombier 0, /* init */
3687dd7cddfSDavid du Colombier 0, /* load */
3697dd7cddfSDavid du Colombier 0, /* dump */
3707dd7cddfSDavid du Colombier };
371