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 * ATI Mach64. Some hope. Kind of like a Mach32.
10219b2ee8SDavid du Colombier * No support for accelerator so can only do up to 1024x768.
11219b2ee8SDavid du Colombier *
12219b2ee8SDavid du Colombier * All ATI Extended Registers are addressed using the modified index
13219b2ee8SDavid du Colombier * index = (0x02<<6)|(index & 0x3F);
14219b2ee8SDavid du Colombier * so registers 0x00->0x3F map to 0x80->0xBF, but we will only ever
15219b2ee8SDavid du Colombier * look at a few in the range 0xA0->0xBF. In this way we can stash
16219b2ee8SDavid du Colombier * them in the vga->crt[] array.
17219b2ee8SDavid du Colombier */
18219b2ee8SDavid du Colombier enum {
19219b2ee8SDavid du Colombier Configcntl = 0x6AEC, /* Configuration control */
20219b2ee8SDavid du Colombier Configstat = 0x72EC, /* Configuration status */
21219b2ee8SDavid du Colombier Memcntl = 0x52EC, /* Memory control */
22219b2ee8SDavid du Colombier Scratch1 = 0x46EC, /* Scratch Register (BIOS info) */
23219b2ee8SDavid du Colombier };
24219b2ee8SDavid du Colombier
25219b2ee8SDavid du Colombier typedef struct {
26219b2ee8SDavid du Colombier ulong configcntl;
27219b2ee8SDavid du Colombier ulong configstat;
28219b2ee8SDavid du Colombier ulong memcntl;
29219b2ee8SDavid du Colombier ulong scratch1;
30219b2ee8SDavid du Colombier } Mach64;
31219b2ee8SDavid du Colombier
32219b2ee8SDavid du Colombier /*
33219b2ee8SDavid du Colombier * There are a number of possible clock generator chips for these
34219b2ee8SDavid du Colombier * boards. We can divide any frequency by 2 (bit<6> of b8).
35219b2ee8SDavid du Colombier */
36219b2ee8SDavid du Colombier typedef struct {
37219b2ee8SDavid du Colombier ulong frequency;
38219b2ee8SDavid du Colombier uchar be; /* <4> - bit<3> of frequency index */
39219b2ee8SDavid du Colombier uchar b9; /* <1> - bit<2> of frequency index */
40219b2ee8SDavid du Colombier uchar genmo; /* <3:2> - bits <1:0> of frequency index */
41219b2ee8SDavid du Colombier } Pclk;
42219b2ee8SDavid du Colombier
43219b2ee8SDavid du Colombier enum {
44219b2ee8SDavid du Colombier Npclkx = 16, /* number of clock entries per table */
45219b2ee8SDavid du Colombier };
46219b2ee8SDavid du Colombier
47219b2ee8SDavid du Colombier /*
48219b2ee8SDavid du Colombier * ATI18811-0
49219b2ee8SDavid du Colombier */
507dd7cddfSDavid du Colombier static Pclk ati188110[Npclkx] = {
51219b2ee8SDavid du Colombier { 42950000, 0x00, 0x00, 0x00 },
52219b2ee8SDavid du Colombier { 48770000, 0x00, 0x00, 0x04 },
53219b2ee8SDavid du Colombier { 92400000, 0x00, 0x00, 0x08 },
54219b2ee8SDavid du Colombier { 36000000, 0x00, 0x00, 0x0C },
55219b2ee8SDavid du Colombier { 50350000, 0x00, 0x02, 0x00 },
56219b2ee8SDavid du Colombier { 56640000, 0x00, 0x02, 0x04 },
57219b2ee8SDavid du Colombier { 0, 0x00, 0x02, 0x08 },
58219b2ee8SDavid du Colombier { 44900000, 0x00, 0x02, 0x0C },
59219b2ee8SDavid du Colombier { 30240000, 0x10, 0x00, 0x00 },
60219b2ee8SDavid du Colombier { 32000000, 0x10, 0x00, 0x04 },
61219b2ee8SDavid du Colombier { 110000000, 0x10, 0x00, 0x08 },
62219b2ee8SDavid du Colombier { 80000000, 0x10, 0x00, 0x0C },
63219b2ee8SDavid du Colombier { 39910000, 0x10, 0x02, 0x00 },
64219b2ee8SDavid du Colombier { 44900000, 0x10, 0x02, 0x04 },
65219b2ee8SDavid du Colombier { 75000000, 0x10, 0x02, 0x08 },
66219b2ee8SDavid du Colombier { 65000000, 0x10, 0x02, 0x0C },
67219b2ee8SDavid du Colombier };
68219b2ee8SDavid du Colombier
69219b2ee8SDavid du Colombier /*
70219b2ee8SDavid du Colombier * ATI18811-1, ATI18811-2
71219b2ee8SDavid du Colombier * PCLK_TABLE = 0 in Mach64 speak.
72219b2ee8SDavid du Colombier */
737dd7cddfSDavid du Colombier static Pclk ati188111[Npclkx] = {
74219b2ee8SDavid du Colombier { 100000000, 0x00, 0x00, 0x00 },
75219b2ee8SDavid du Colombier { 126000000, 0x00, 0x00, 0x04 },
76219b2ee8SDavid du Colombier { 92400000, 0x00, 0x00, 0x08 },
77219b2ee8SDavid du Colombier { 36000000, 0x00, 0x00, 0x0C },
78219b2ee8SDavid du Colombier { 50350000, 0x00, 0x02, 0x00 },
79219b2ee8SDavid du Colombier { 56640000, 0x00, 0x02, 0x04 },
80219b2ee8SDavid du Colombier { 0, 0x00, 0x02, 0x08 },
81219b2ee8SDavid du Colombier { 44900000, 0x00, 0x02, 0x0C },
82219b2ee8SDavid du Colombier { 135000000, 0x10, 0x00, 0x00 },
83219b2ee8SDavid du Colombier { 32000000, 0x10, 0x00, 0x04 },
84219b2ee8SDavid du Colombier { 110000000, 0x10, 0x00, 0x08 },
85219b2ee8SDavid du Colombier { 80000000, 0x10, 0x00, 0x0C },
86219b2ee8SDavid du Colombier { 39910000, 0x10, 0x02, 0x00 },
87219b2ee8SDavid du Colombier { 44900000, 0x10, 0x02, 0x04 },
88219b2ee8SDavid du Colombier { 75000000, 0x10, 0x02, 0x08 },
89219b2ee8SDavid du Colombier { 65000000, 0x10, 0x02, 0x0C },
90219b2ee8SDavid du Colombier };
91219b2ee8SDavid du Colombier
92219b2ee8SDavid du Colombier /*
93219b2ee8SDavid du Colombier * ATI18818
94219b2ee8SDavid du Colombier * The first four entries are programmable and the default
95219b2ee8SDavid du Colombier * settings are either those below or those below divided by 2
96219b2ee8SDavid du Colombier * (PCLK_TABLE = 1 and PCLK_TABLE = 2 respectively in Mach64
97219b2ee8SDavid du Colombier * speak).
98219b2ee8SDavid du Colombier */
997dd7cddfSDavid du Colombier static Pclk ati18818[Npclkx] = {
100219b2ee8SDavid du Colombier { 50350000, 0x00, 0x00, 0x00 },
101219b2ee8SDavid du Colombier { 56640000, 0x00, 0x00, 0x04 },
102219b2ee8SDavid du Colombier { 63000000, 0x00, 0x00, 0x08 },
103219b2ee8SDavid du Colombier { 72000000, 0x00, 0x00, 0x0C },
104219b2ee8SDavid du Colombier { 40000000, 0x00, 0x02, 0x00 },
105219b2ee8SDavid du Colombier { 44900000, 0x00, 0x02, 0x04 },
106219b2ee8SDavid du Colombier { 49500000, 0x00, 0x02, 0x08 },
107219b2ee8SDavid du Colombier { 50000000, 0x00, 0x02, 0x0C },
108219b2ee8SDavid du Colombier { 0, 0x10, 0x00, 0x00 },
109219b2ee8SDavid du Colombier { 110000000, 0x10, 0x00, 0x04 },
110219b2ee8SDavid du Colombier { 126000000, 0x10, 0x00, 0x08 },
111219b2ee8SDavid du Colombier { 135000000, 0x10, 0x00, 0x0C },
112219b2ee8SDavid du Colombier { 0, 0x10, 0x02, 0x00 },
113219b2ee8SDavid du Colombier { 80000000, 0x10, 0x02, 0x04 },
114219b2ee8SDavid du Colombier { 75000000, 0x10, 0x02, 0x08 },
115219b2ee8SDavid du Colombier { 65000000, 0x10, 0x02, 0x0C },
116219b2ee8SDavid du Colombier };
117219b2ee8SDavid du Colombier
118219b2ee8SDavid du Colombier static Pclk *pclkp; /* which clock chip we are using */
119219b2ee8SDavid du Colombier static ulong atix; /* index to extended regsiters */
120219b2ee8SDavid du Colombier
121219b2ee8SDavid du Colombier static uchar
atixi(uchar index)122219b2ee8SDavid du Colombier atixi(uchar index)
123219b2ee8SDavid du Colombier {
124219b2ee8SDavid du Colombier outportb(atix, index);
125219b2ee8SDavid du Colombier return inportb(atix+1);
126219b2ee8SDavid du Colombier }
127219b2ee8SDavid du Colombier
128219b2ee8SDavid du Colombier static void
atixo(uchar index,uchar data)129219b2ee8SDavid du Colombier atixo(uchar index, uchar data)
130219b2ee8SDavid du Colombier {
131219b2ee8SDavid du Colombier outportw(atix, (data<<8)|index);
132219b2ee8SDavid du Colombier }
133219b2ee8SDavid du Colombier
134219b2ee8SDavid du Colombier static void
atixinit(Vga * vga,Ctlr *)1357dd7cddfSDavid du Colombier atixinit(Vga* vga, Ctlr*)
136219b2ee8SDavid du Colombier {
137219b2ee8SDavid du Colombier uchar b;
138219b2ee8SDavid du Colombier
139219b2ee8SDavid du Colombier /*
140219b2ee8SDavid du Colombier * Set the I/O address and offset for the ATI
141219b2ee8SDavid du Colombier * extended registers to something we know about.
142219b2ee8SDavid du Colombier */
143219b2ee8SDavid du Colombier if(atix == 0){
144219b2ee8SDavid du Colombier outportw(Grx, (0xCE<<8)|0x50);
145219b2ee8SDavid du Colombier outportw(Grx, (0x81<<8)|0x51);
146219b2ee8SDavid du Colombier atix = 0x1CE;
147219b2ee8SDavid du Colombier }
148219b2ee8SDavid du Colombier
149219b2ee8SDavid du Colombier /*
150219b2ee8SDavid du Colombier * Unlock the ATI Extended Registers.
151219b2ee8SDavid du Colombier * We leave them unlocked from now on.
152219b2ee8SDavid du Colombier * Why does this chip have so many
153219b2ee8SDavid du Colombier * lock bits?
154219b2ee8SDavid du Colombier */
155219b2ee8SDavid du Colombier if((b = atixi(0xB8)) & 0x3F)
156219b2ee8SDavid du Colombier atixo(0xB8, b & 0xC0);
157219b2ee8SDavid du Colombier b = atixi(0xAB);
158219b2ee8SDavid du Colombier atixo(0xAB, b & ~0x18);
159219b2ee8SDavid du Colombier atixo(0xB4, 0x00);
160219b2ee8SDavid du Colombier b = atixi(0xB9);
161219b2ee8SDavid du Colombier atixo(0xB9, b & ~0x80);
162219b2ee8SDavid du Colombier b = atixi(0xBE);
163219b2ee8SDavid du Colombier atixo(0xBE, b|0x09);
164219b2ee8SDavid du Colombier
165219b2ee8SDavid du Colombier if(vga->private == 0)
1667dd7cddfSDavid du Colombier vga->private = alloc(sizeof(Mach64));
167219b2ee8SDavid du Colombier }
168219b2ee8SDavid du Colombier
169219b2ee8SDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)170219b2ee8SDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
171219b2ee8SDavid du Colombier {
172219b2ee8SDavid du Colombier int i;
173219b2ee8SDavid du Colombier Mach64 *mach64;
174219b2ee8SDavid du Colombier
175219b2ee8SDavid du Colombier atixinit(vga, ctlr);
176219b2ee8SDavid du Colombier for(i = 0xA0; i < 0xC0; i++)
177219b2ee8SDavid du Colombier vga->crt[i] = atixi(i);
178219b2ee8SDavid du Colombier
179219b2ee8SDavid du Colombier mach64 = vga->private;
180219b2ee8SDavid du Colombier mach64->configcntl = inportl(Configcntl);
181219b2ee8SDavid du Colombier mach64->configstat = inportl(Configstat);
182219b2ee8SDavid du Colombier mach64->memcntl = inportl(Memcntl);
183219b2ee8SDavid du Colombier mach64->scratch1 = inportl(Scratch1);
184219b2ee8SDavid du Colombier
185219b2ee8SDavid du Colombier /*
186219b2ee8SDavid du Colombier * Memory size.
187219b2ee8SDavid du Colombier */
188219b2ee8SDavid du Colombier switch(mach64->memcntl & 0x07){
189219b2ee8SDavid du Colombier
190219b2ee8SDavid du Colombier case 0:
1917dd7cddfSDavid du Colombier vga->vmz = 512*1024;
192219b2ee8SDavid du Colombier break;
193219b2ee8SDavid du Colombier
194219b2ee8SDavid du Colombier case 1:
1957dd7cddfSDavid du Colombier vga->vmz = 1024*1024;
196219b2ee8SDavid du Colombier break;
197219b2ee8SDavid du Colombier
198219b2ee8SDavid du Colombier case 2:
1997dd7cddfSDavid du Colombier vga->vmz = 2*1024*1024;
200219b2ee8SDavid du Colombier break;
201219b2ee8SDavid du Colombier
202219b2ee8SDavid du Colombier case 3:
2037dd7cddfSDavid du Colombier vga->vmz = 4*1024*1024;
204219b2ee8SDavid du Colombier break;
205219b2ee8SDavid du Colombier
206219b2ee8SDavid du Colombier case 4:
2077dd7cddfSDavid du Colombier vga->vmz = 6*1024*1024;
208219b2ee8SDavid du Colombier break;
209219b2ee8SDavid du Colombier
210219b2ee8SDavid du Colombier case 5:
2117dd7cddfSDavid du Colombier vga->vmz = 8*1024*1024;
212219b2ee8SDavid du Colombier break;
213219b2ee8SDavid du Colombier }
214219b2ee8SDavid du Colombier
215219b2ee8SDavid du Colombier ctlr->flag |= Fsnarf;
216219b2ee8SDavid du Colombier }
217219b2ee8SDavid du Colombier
218219b2ee8SDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)219219b2ee8SDavid du Colombier init(Vga* vga, Ctlr* ctlr)
220219b2ee8SDavid du Colombier {
221219b2ee8SDavid du Colombier Mode *mode;
222219b2ee8SDavid du Colombier int f, divisor, index;
223219b2ee8SDavid du Colombier
224219b2ee8SDavid du Colombier mode = vga->mode;
225219b2ee8SDavid du Colombier
226219b2ee8SDavid du Colombier /*
227219b2ee8SDavid du Colombier * Must somehow determine which clock chip to use here.
228219b2ee8SDavid du Colombier * For now, punt and assume ATI18818.
229219b2ee8SDavid du Colombier */
230219b2ee8SDavid du Colombier pclkp = ati18818;
231219b2ee8SDavid du Colombier if(pclkp == 0)
232219b2ee8SDavid du Colombier error("%s: can't determine clock chip\n", ctlr->name);
233219b2ee8SDavid du Colombier
2347dd7cddfSDavid du Colombier if(vga->f[0] == 0)
2357dd7cddfSDavid du Colombier vga->f[0] = vga->mode->frequency;
236219b2ee8SDavid du Colombier
237219b2ee8SDavid du Colombier /*
238219b2ee8SDavid du Colombier * Find a clock frequency close to what we want.
239219b2ee8SDavid du Colombier * 'Close' is within 1MHz.
240219b2ee8SDavid du Colombier */
241219b2ee8SDavid du Colombier for(divisor = 0, index = 0; index < Npclkx; index++, divisor = 0){
242219b2ee8SDavid du Colombier divisor = 1;
243219b2ee8SDavid du Colombier f = pclkp[index].frequency/divisor;
2447dd7cddfSDavid du Colombier if(f < vga->f[0]+1000000 && f >= vga->f[0]-1000000)
245219b2ee8SDavid du Colombier break;
246219b2ee8SDavid du Colombier
247219b2ee8SDavid du Colombier divisor = 2;
248219b2ee8SDavid du Colombier f /= divisor;
2497dd7cddfSDavid du Colombier if(f < vga->f[0]+1000000 && f >= vga->f[0]-1000000)
250219b2ee8SDavid du Colombier break;
251219b2ee8SDavid du Colombier }
252219b2ee8SDavid du Colombier if(divisor == 0)
2537dd7cddfSDavid du Colombier error("%s: no suitable clock for %lud\n",
2547dd7cddfSDavid du Colombier ctlr->name, vga->f[0]);
255219b2ee8SDavid du Colombier
2567dd7cddfSDavid du Colombier vga->d[0] = divisor;
2577dd7cddfSDavid du Colombier vga->i[0] = index;
258219b2ee8SDavid du Colombier
259219b2ee8SDavid du Colombier vga->crt[0xB0] &= 0xDA;
260219b2ee8SDavid du Colombier vga->crt[0xB1] &= 0x87;
261219b2ee8SDavid du Colombier vga->crt[0xB5] &= 0x7E;
262219b2ee8SDavid du Colombier vga->crt[0xB6] &= 0xE2;
263219b2ee8SDavid du Colombier vga->crt[0xB3] &= 0xAF;
264219b2ee8SDavid du Colombier vga->crt[0xA6] &= 0xFE;
265219b2ee8SDavid du Colombier vga->crt[0xA7] &= 0xF4;
266219b2ee8SDavid du Colombier
267219b2ee8SDavid du Colombier /*
268219b2ee8SDavid du Colombier * 256-colour linear addressing.
269219b2ee8SDavid du Colombier */
270219b2ee8SDavid du Colombier if(mode->z == 8){
271219b2ee8SDavid du Colombier vga->graphics[0x05] = 0x00;
272219b2ee8SDavid du Colombier vga->attribute[0x10] &= ~0x40;
273219b2ee8SDavid du Colombier vga->crt[0x13] = (mode->x/8)/2;
274219b2ee8SDavid du Colombier vga->crt[0x14] = 0x00;
275219b2ee8SDavid du Colombier vga->crt[0x17] = 0xE3;
276219b2ee8SDavid du Colombier
277219b2ee8SDavid du Colombier vga->crt[0xB0] |= 0x20;
278219b2ee8SDavid du Colombier vga->crt[0xB6] |= 0x04;
279219b2ee8SDavid du Colombier }
280219b2ee8SDavid du Colombier vga->attribute[0x11] = 0x00;
281219b2ee8SDavid du Colombier vga->crt[0xB6] |= 0x01;
282219b2ee8SDavid du Colombier vga->crt[0xBE] &= ~0x04;
283219b2ee8SDavid du Colombier
284219b2ee8SDavid du Colombier /*
285219b2ee8SDavid du Colombier * Do the clock index bits.
286219b2ee8SDavid du Colombier */
287219b2ee8SDavid du Colombier vga->crt[0xB8] &= 0x3F;
288219b2ee8SDavid du Colombier vga->crt[0xB9] &= 0xFD;
289219b2ee8SDavid du Colombier vga->crt[0xBE] &= 0xE5;
290219b2ee8SDavid du Colombier
2917dd7cddfSDavid du Colombier if(vga->d[0] == 2)
292219b2ee8SDavid du Colombier vga->crt[0xB8] |= 0x40;
2937dd7cddfSDavid du Colombier vga->crt[0xB9] |= pclkp[vga->i[0]].b9;
2947dd7cddfSDavid du Colombier vga->crt[0xBE] |= pclkp[vga->i[0]].be;
2957dd7cddfSDavid du Colombier vga->misc |= pclkp[vga->i[0]].genmo;
296219b2ee8SDavid du Colombier
297219b2ee8SDavid du Colombier if(vga->mode->interlace == 'v')
298219b2ee8SDavid du Colombier vga->crt[0xBE] |= 0x02;
299219b2ee8SDavid du Colombier
300219b2ee8SDavid du Colombier /*
301219b2ee8SDavid du Colombier * Turn off 128Kb CPU address bit so
302219b2ee8SDavid du Colombier * we only have a 64Kb aperture at 0xA0000.
303219b2ee8SDavid du Colombier */
304219b2ee8SDavid du Colombier vga->crt[0xBD] &= ~0x04;
305219b2ee8SDavid du Colombier
306219b2ee8SDavid du Colombier ctlr->type = mach32.name;
307219b2ee8SDavid du Colombier
308219b2ee8SDavid du Colombier /*
309219b2ee8SDavid du Colombier * The Mach64 can only address 1Mb in VGA mode
310219b2ee8SDavid du Colombier */
3117dd7cddfSDavid du Colombier vga->vmz = 1*1024*1024;
312219b2ee8SDavid du Colombier
313219b2ee8SDavid du Colombier ctlr->flag |= Finit;
314219b2ee8SDavid du Colombier }
315219b2ee8SDavid du Colombier
316219b2ee8SDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)317219b2ee8SDavid du Colombier load(Vga* vga, Ctlr* ctlr)
318219b2ee8SDavid du Colombier {
319219b2ee8SDavid du Colombier /*
320219b2ee8SDavid du Colombier * We should probably do something here to make sure we that we
321219b2ee8SDavid du Colombier * have access to all the video memory through the 64Kb VGA aperture
322219b2ee8SDavid du Colombier * by disabling and linear aperture and memory boundary and then
323219b2ee8SDavid du Colombier * enabling the VGA controller.
324219b2ee8SDavid du Colombier * But for now, let's just assume it's ok, the Mach64 documentation
325219b2ee8SDavid du Colombier * is just as clear as the Mach32 documentation.
326219b2ee8SDavid du Colombier */
327219b2ee8SDavid du Colombier atixo(0xB0, vga->crt[0xB0]);
328219b2ee8SDavid du Colombier atixo(0xB1, vga->crt[0xB1]);
329219b2ee8SDavid du Colombier atixo(0xB5, vga->crt[0xB5]);
330219b2ee8SDavid du Colombier atixo(0xB6, vga->crt[0xB6]);
331219b2ee8SDavid du Colombier atixo(0xB3, vga->crt[0xB3]);
332219b2ee8SDavid du Colombier atixo(0xA6, vga->crt[0xA6]);
333219b2ee8SDavid du Colombier atixo(0xA7, vga->crt[0xA7]);
334219b2ee8SDavid du Colombier atixo(0xB8, vga->crt[0xB8]);
335219b2ee8SDavid du Colombier atixo(0xB9, vga->crt[0xB9]);
336219b2ee8SDavid du Colombier atixo(0xBE, vga->crt[0xBE]);
337219b2ee8SDavid du Colombier vgao(MiscW, vga->misc);
338219b2ee8SDavid du Colombier
339219b2ee8SDavid du Colombier ctlr->flag |= Fload;
340219b2ee8SDavid du Colombier }
341219b2ee8SDavid du Colombier
342219b2ee8SDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)343219b2ee8SDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
344219b2ee8SDavid du Colombier {
345219b2ee8SDavid du Colombier int i;
346219b2ee8SDavid du Colombier Mach64 *mach64;
347219b2ee8SDavid du Colombier
348219b2ee8SDavid du Colombier printitem(ctlr->name, "ATIX");
349219b2ee8SDavid du Colombier for(i = 0xA0; i < 0xC0; i++)
350219b2ee8SDavid du Colombier printreg(vga->crt[i]);
351219b2ee8SDavid du Colombier
352219b2ee8SDavid du Colombier if((mach64 = vga->private) == 0)
353219b2ee8SDavid du Colombier return;
354219b2ee8SDavid du Colombier
355219b2ee8SDavid du Colombier printitem(ctlr->name, "CONFIGCNTL");
3567dd7cddfSDavid du Colombier Bprint(&stdout, "%.8lux\n", mach64->configcntl);
357219b2ee8SDavid du Colombier printitem(ctlr->name, "CONFIGSTAT");
3587dd7cddfSDavid du Colombier Bprint(&stdout, "%.8lux\n", mach64->configstat);
359219b2ee8SDavid du Colombier printitem(ctlr->name, "MEMCNTL");
3607dd7cddfSDavid du Colombier Bprint(&stdout, "%.8lux\n", mach64->memcntl);
361219b2ee8SDavid du Colombier printitem(ctlr->name, "SCRATCH1");
3627dd7cddfSDavid du Colombier Bprint(&stdout, "%.8lux\n", mach64->scratch1);
363219b2ee8SDavid du Colombier }
364219b2ee8SDavid du Colombier
365219b2ee8SDavid du Colombier Ctlr mach64 = {
366219b2ee8SDavid du Colombier "mach64", /* name */
367219b2ee8SDavid du Colombier snarf, /* snarf */
368219b2ee8SDavid du Colombier 0, /* options */
369219b2ee8SDavid du Colombier init, /* init */
370219b2ee8SDavid du Colombier load, /* load */
371219b2ee8SDavid du Colombier dump, /* dump */
372219b2ee8SDavid du Colombier };
373