xref: /netbsd-src/sys/arch/hpcmips/stand/pbsdboot/disptest.c (revision df7f595ecd6efe54ea7c11083e2dbf711cad4b31)
1*df7f595eScegger /*	$NetBSD: disptest.c,v 1.6 2009/03/18 10:22:29 cegger Exp $	*/
2db2b0adeStakemura 
3db2b0adeStakemura /*-
4db2b0adeStakemura  * Copyright (c) 1999 Shin Takemura.
5db2b0adeStakemura  * All rights reserved.
6db2b0adeStakemura  *
7db2b0adeStakemura  * This software is part of the PocketBSD.
8db2b0adeStakemura  *
9db2b0adeStakemura  * Redistribution and use in source and binary forms, with or without
10db2b0adeStakemura  * modification, are permitted provided that the following conditions
11db2b0adeStakemura  * are met:
12db2b0adeStakemura  * 1. Redistributions of source code must retain the above copyright
13db2b0adeStakemura  *    notice, this list of conditions and the following disclaimer.
14db2b0adeStakemura  * 2. Redistributions in binary form must reproduce the above copyright
15db2b0adeStakemura  *    notice, this list of conditions and the following disclaimer in the
16db2b0adeStakemura  *    documentation and/or other materials provided with the distribution.
17db2b0adeStakemura  * 3. All advertising materials mentioning features or use of this software
18db2b0adeStakemura  *    must display the following acknowledgement:
19db2b0adeStakemura  *	This product includes software developed by the PocketBSD project
20db2b0adeStakemura  *	and its contributors.
21db2b0adeStakemura  * 4. Neither the name of the project nor the names of its contributors
22db2b0adeStakemura  *    may be used to endorse or promote products derived from this software
23db2b0adeStakemura  *    without specific prior written permission.
24db2b0adeStakemura  *
25db2b0adeStakemura  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26db2b0adeStakemura  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27db2b0adeStakemura  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28db2b0adeStakemura  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29db2b0adeStakemura  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30db2b0adeStakemura  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31db2b0adeStakemura  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32db2b0adeStakemura  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33db2b0adeStakemura  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34db2b0adeStakemura  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35db2b0adeStakemura  * SUCH DAMAGE.
36db2b0adeStakemura  *
37db2b0adeStakemura  */
38db2b0adeStakemura #include <pbsdboot.h>
39db2b0adeStakemura 
40ce2f39b6Stakemura extern BOOL SetKMode(BOOL);
41db2b0adeStakemura #define ARRAYSIZEOF(a)	(sizeof(a)/sizeof(*(a)))
42db2b0adeStakemura 
43db2b0adeStakemura static struct area {
44db2b0adeStakemura   long start, end;
45db2b0adeStakemura } targets[] = {
46db2b0adeStakemura 	{ 0x0a000000, 0x0b000000 },
47db2b0adeStakemura 	{ 0x10000000, 0x14000000 },
48db2b0adeStakemura };
49db2b0adeStakemura int ntargets = ARRAYSIZEOF(targets);
50db2b0adeStakemura 
51db2b0adeStakemura void
flush_XX(void)52*df7f595eScegger flush_XX(void)
53db2b0adeStakemura {
54db2b0adeStakemura   static volatile unsigned char tmp[1024*64];
55db2b0adeStakemura   int i, s;
56db2b0adeStakemura 
57db2b0adeStakemura   for (i = 0; i < ARRAYSIZEOF(tmp); i++) {
58db2b0adeStakemura 	  s += tmp[i];
59db2b0adeStakemura   }
60db2b0adeStakemura }
61db2b0adeStakemura 
62db2b0adeStakemura static void
gpio_test(void)63*df7f595eScegger gpio_test(void)
64db2b0adeStakemura {
65db2b0adeStakemura #define GIUBASE 0xab000000
66db2b0adeStakemura #define GIUOFFSET 0x0100
67db2b0adeStakemura 	volatile unsigned short *giusell;
68db2b0adeStakemura 	volatile unsigned short *giuselh;
69db2b0adeStakemura 	volatile unsigned short *giupiodl;
70db2b0adeStakemura 	volatile unsigned short *giupiodh;
719759fc21Stakemura 	unsigned short sell = 0;
729759fc21Stakemura 	unsigned short selh = 0;
739759fc21Stakemura 	unsigned short piodl = 0;
749759fc21Stakemura 	unsigned short piodh = 0;
75db2b0adeStakemura 	int res, i;
76db2b0adeStakemura 	unsigned short regs[16];
77db2b0adeStakemura 	unsigned short prev_regs[16];
78db2b0adeStakemura 
79db2b0adeStakemura 	unsigned char* p = (char*)VirtualAlloc(0, 1024, MEM_RESERVE,
80db2b0adeStakemura 				      PAGE_NOACCESS);
81db2b0adeStakemura 	res = VirtualCopy((LPVOID)p, (LPVOID)(GIUBASE >> 8), 1024,
82db2b0adeStakemura 			  PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
83db2b0adeStakemura 	if (!res) {
84db2b0adeStakemura 		win_printf(TEXT("VirtualCopy() failed."));
85db2b0adeStakemura 	}
86db2b0adeStakemura 
87db2b0adeStakemura 	for (i = 0; i < 16; i++) {
88db2b0adeStakemura 		prev_regs[i] = ~0;
89db2b0adeStakemura 	}
90db2b0adeStakemura 
91db2b0adeStakemura 	giusell = (unsigned short*)(p + GIUOFFSET + 0);
92db2b0adeStakemura 	giuselh = (unsigned short*)(p + GIUOFFSET + 2);
93db2b0adeStakemura 	giupiodl = (unsigned short*)(p + GIUOFFSET + 4);
94db2b0adeStakemura 	giupiodh = (unsigned short*)(p + GIUOFFSET + 6);
95db2b0adeStakemura 
96db2b0adeStakemura 	while (1) {
97db2b0adeStakemura 		sell = *giusell;
98db2b0adeStakemura 		selh = *giuselh;
99db2b0adeStakemura 		*giusell = sell;
100db2b0adeStakemura 		*giuselh = selh;
101db2b0adeStakemura 
102db2b0adeStakemura 		piodl = *giupiodl;
103db2b0adeStakemura 		piodh = *giupiodh;
104db2b0adeStakemura 		*giupiodl = piodl;
105db2b0adeStakemura 		*giupiodh = piodh;
106db2b0adeStakemura 		for (i = 0; i < 16; i++) {
107db2b0adeStakemura 			regs[i] = *(unsigned short*)(p + GIUOFFSET + i * 2);
108db2b0adeStakemura 		}
109db2b0adeStakemura 		for (i = 0; i < 16; i++) {
110db2b0adeStakemura 			if (i != 3 && i != 5 && regs[i] != prev_regs[i]) {
111db2b0adeStakemura 				win_printf(TEXT("IOSEL=%04x%04x "),
112db2b0adeStakemura 					   regs[1], regs[0]);
113db2b0adeStakemura 				win_printf(TEXT("PIOD=%04x%04x "),
114db2b0adeStakemura 					   regs[3], regs[2]);
115db2b0adeStakemura 				win_printf(TEXT("STAT=%04x%04x "),
116db2b0adeStakemura 					   regs[5], regs[4]);
117db2b0adeStakemura 				win_printf(TEXT("(%04x%04x) "),
118db2b0adeStakemura 					   regs[5]&regs[7], regs[4]&regs[6]);
119db2b0adeStakemura 				win_printf(TEXT("EN=%04x%04x "),
120db2b0adeStakemura 					   regs[7], regs[6]);
121db2b0adeStakemura 				win_printf(TEXT("TYP=%04x%04x "),
122db2b0adeStakemura 					   regs[9], regs[8]);
123db2b0adeStakemura 				win_printf(TEXT("ALSEL=%04x%04x "),
124db2b0adeStakemura 					   regs[11], regs[10]);
125db2b0adeStakemura 				win_printf(TEXT("HTSEL=%04x%04x "),
126db2b0adeStakemura 					   regs[13], regs[12]);
127db2b0adeStakemura 				win_printf(TEXT("PODAT=%04x%04x "),
128db2b0adeStakemura 					   regs[15], regs[14]);
129db2b0adeStakemura 				win_printf(TEXT("\n"));
130db2b0adeStakemura 				for (i = 0; i < 16; i++) {
131db2b0adeStakemura 					prev_regs[i] = regs[i];
132db2b0adeStakemura 				}
133db2b0adeStakemura 				break;
134db2b0adeStakemura 			}
135db2b0adeStakemura 		}
136db2b0adeStakemura 	}
137db2b0adeStakemura }
138db2b0adeStakemura 
139e18e70f6Stakemura static struct regdesc {
140e18e70f6Stakemura 	TCHAR *name;
141e18e70f6Stakemura 	int physaddr;
142e18e70f6Stakemura 	int size;
143e18e70f6Stakemura 	int mask;
144e18e70f6Stakemura 	//void *addr;
145e18e70f6Stakemura 	unsigned long val;
146e18e70f6Stakemura 	unsigned long preval;
147e18e70f6Stakemura } test_regs[] = {
148e18e70f6Stakemura #if 0
149e18e70f6Stakemura 	/*
150e18e70f6Stakemura 	 * Vrc4172 GPIO and PWM
151e18e70f6Stakemura 	 */
152e18e70f6Stakemura 	{ TEXT("EXGPDATA0"),	0x15001080,	2,	0xfffd		},
153e18e70f6Stakemura 	{ TEXT("EXGPDATA1"),	0x150010c0,	2,	0xffff		},
154e18e70f6Stakemura 	{ TEXT("LCDDUTYEN"),	0x15003880,	2,	0xffff		},
155e18e70f6Stakemura 	{ TEXT("LCDFREQ"),	0x15003882,	2,	0xffff		},
156e18e70f6Stakemura 	{ TEXT("LCDDUTY"),	0x15003884,	2,	0xffff		},
157e18e70f6Stakemura #endif
158e18e70f6Stakemura 
159e18e70f6Stakemura #if 0
160e18e70f6Stakemura 	/*
161e18e70f6Stakemura 	 * Vr41xx GPIO
162e18e70f6Stakemura 	 */
163e18e70f6Stakemura 	{ TEXT("GIUPIODL"),	0x0b000104,	2,	0xffff		},
164e18e70f6Stakemura 	{ TEXT("GIUPIODH"),	0x0b000106,	2,	0xffff		},
165e18e70f6Stakemura 	{ TEXT("GIUPODATL"),	0x0b00011c,	2,	0xffff		},
166e18e70f6Stakemura 	{ TEXT("GIUPODATH"),	0x0b00011e,	2,	0xffff		},
167e18e70f6Stakemura 	{ TEXT("GIUUSEUPDN"),	0x0b0002e0,	2,	0xffff		},
168e18e70f6Stakemura 	{ TEXT("GIUTERMUPDN"),	0x0b0002e2,	2,	0xffff		},
169e18e70f6Stakemura #endif
170e18e70f6Stakemura 
171e18e70f6Stakemura 	/*
172e18e70f6Stakemura 	 * MQ200
173e18e70f6Stakemura 	 */
174e18e70f6Stakemura 	{ TEXT("PM00R"),	0x0a600000,	4,	0xffffffff	},
175e18e70f6Stakemura 	{ TEXT("PM01R"),	0x0a600004,	4,	0xffffffff	},
176e18e70f6Stakemura 	{ TEXT("PM02R"),	0x0a600008,	4,	0xffffffff	},
177e18e70f6Stakemura 	{ TEXT("PM06R"),	0x0a600018,	4,	0xffffffff	},
178e18e70f6Stakemura 	{ TEXT("PM07R"),	0x0a60001c,	4,	0xffffffff	},
179e18e70f6Stakemura 
180e18e70f6Stakemura 	{ TEXT("CC00R"),	0x0a602000,	4,	0x0000003f	},
181e18e70f6Stakemura 	{ TEXT("CC01R"),	0x0a602004,	4,	0x00000000	},
182e18e70f6Stakemura 
183e18e70f6Stakemura 	{ TEXT("MM00R"),	0x0a604000,	4,	0x00000007	},
184e18e70f6Stakemura 	{ TEXT("MM01R"),	0x0a604004,	4,	0xffffffff	},
185e18e70f6Stakemura 	{ TEXT("MM02R"),	0x0a604008,	4,	0xffffffff	},
186e18e70f6Stakemura 	{ TEXT("MM03R"),	0x0a60400c,	4,	0x00000001	},
187e18e70f6Stakemura 	{ TEXT("MM04R"),	0x0a604010,	4,	0x00000001	},
188e18e70f6Stakemura 
189e18e70f6Stakemura 	{ TEXT("IN00R"),	0x0a608000,	4,	0x0000001f	},
190e18e70f6Stakemura 	{ TEXT("IN01R"),	0x0a608004,	4,	0x0000ffff	},
191e18e70f6Stakemura 	{ TEXT("IN02R"),	0x0a608008,	4,	0x00000000	},
192e18e70f6Stakemura 	{ TEXT("IN03R"),	0x0a60800c,	4,	0x00000000	},
193e18e70f6Stakemura 
194e18e70f6Stakemura 	{ TEXT("GC00R"),	0x0a60a000,	4,	0xfffff9ff	},
195e18e70f6Stakemura 	{ TEXT("GC01R"),	0x0a60a004,	4,	0x10ffffff	},
196e18e70f6Stakemura 	{ TEXT("GC20R"),	0x0a60a080,	4,	0xffffffff	},
197e18e70f6Stakemura 	{ TEXT("GC21R"),	0x0a60a084,	4,	0x0000007f	},
198e18e70f6Stakemura 
199e18e70f6Stakemura 	{ TEXT("FP00R"),	0x0a60e000,	4,	0xffffffff	},
200e18e70f6Stakemura 	{ TEXT("FP01R"),	0x0a60e004,	4,	0xffffffff	},
201e18e70f6Stakemura 	{ TEXT("FP02R"),	0x0a60e008,	4,	0x007fffff	},
202e18e70f6Stakemura 	{ TEXT("FP03R"),	0x0a60e00c,	4,	0x0707003f	},
203e18e70f6Stakemura 	{ TEXT("FP04R"),	0x0a60e010,	4,	0xffff3fff	},
204e18e70f6Stakemura 	{ TEXT("FP05R"),	0x0a60e014,	4,	0xffffffff	},
205e18e70f6Stakemura 	{ TEXT("FP0FR"),	0x0a60e03c,	4,	0xffffffff	},
206e18e70f6Stakemura 
207e18e70f6Stakemura 	{ TEXT("DC00R"),	0x0a614000,	4,	0xffffffff	},
208e18e70f6Stakemura 	{ TEXT("DC01R"),	0x0a614004,	4,	0x0000003f	},
209e18e70f6Stakemura 	{ TEXT("DC02R"),	0x0a614008,	4,	0xffffffff	},
210e18e70f6Stakemura 	{ TEXT("DC03R"),	0x0a61400c,	4,	0xffffffff	},
211e18e70f6Stakemura 
212e18e70f6Stakemura 	{ TEXT("PC00R"),	0x0a616000,	4,	0xffffffff	},
213e18e70f6Stakemura 	{ TEXT("PC04R"),	0x0a616004,	4,	0xffffffff	},
214e18e70f6Stakemura 	{ TEXT("PC08R"),	0x0a616008,	4,	0xffffffff	},
215e18e70f6Stakemura 	{ TEXT("PC0CR"),	0x0a61600c,	4,	0xffffffff	},
216e18e70f6Stakemura 	{ TEXT("PC10R"),	0x0a616010,	4,	0xffffffff	},
217e18e70f6Stakemura 	{ TEXT("PC14R"),	0x0a616014,	4,	0xffffffff	},
218e18e70f6Stakemura 	{ TEXT("PC2CR"),	0x0a61602c,	4,	0xffffffff	},
219e18e70f6Stakemura 	{ TEXT("PC3CR"),	0x0a61603c,	4,	0xffffffff	},
220e18e70f6Stakemura 	{ TEXT("PC40R"),	0x0a616040,	4,	0xffffffff	},
221e18e70f6Stakemura 	{ TEXT("PC44R"),	0x0a616044,	4,	0x00000003	},
222e18e70f6Stakemura };
223e18e70f6Stakemura 
224e18e70f6Stakemura extern int SetKMode(int);
225e18e70f6Stakemura static void
regfetch(struct regdesc * desc)226e18e70f6Stakemura regfetch(struct regdesc* desc)
227e18e70f6Stakemura {
228e18e70f6Stakemura 	SetKMode(1);
229e18e70f6Stakemura 	switch (desc->size) {
230e18e70f6Stakemura 	case 1:
231e18e70f6Stakemura 		desc->val = *(unsigned char*)(desc->physaddr | 0xa0000000);
232e18e70f6Stakemura 		break;
233e18e70f6Stakemura 	case 2:
234e18e70f6Stakemura 		desc->val = *(unsigned short*)(desc->physaddr | 0xa0000000);
235e18e70f6Stakemura 		break;
236e18e70f6Stakemura 	case 4:
237e18e70f6Stakemura 		desc->val = *(unsigned long*)(desc->physaddr | 0xa0000000);
238e18e70f6Stakemura 		break;
239e18e70f6Stakemura 	default:
240e18e70f6Stakemura 		win_printf(TEXT("Invalid size"));
241e18e70f6Stakemura 		break;
242e18e70f6Stakemura 	}
243e18e70f6Stakemura 	SetKMode(0);
244e18e70f6Stakemura 	desc->val &= desc->mask;
245e18e70f6Stakemura }
246e18e70f6Stakemura 
247e18e70f6Stakemura static void
register_test(void)248*df7f595eScegger register_test(void)
249e18e70f6Stakemura {
250e18e70f6Stakemura     int i;
251e18e70f6Stakemura     int nregs = sizeof(test_regs)/sizeof(*test_regs);
252e18e70f6Stakemura 
253e18e70f6Stakemura     for (i = 0; i < nregs; i++) {
254e18e70f6Stakemura 	regfetch(&test_regs[i]);
255e18e70f6Stakemura 	test_regs[i].preval = test_regs[i].val;
256e18e70f6Stakemura     }
257e18e70f6Stakemura 
258e18e70f6Stakemura     while (1) {
259e18e70f6Stakemura 	for (i = 0; i < nregs; i++) {
260e18e70f6Stakemura 	    regfetch(&test_regs[i]);
261e18e70f6Stakemura 	    if (test_regs[i].val != test_regs[i].preval) {
262e18e70f6Stakemura 		win_printf(TEXT("%20s(%08x) %08x -> %08x\n"),
263e18e70f6Stakemura 		    test_regs[i].name,
264e18e70f6Stakemura 		    test_regs[i].physaddr,
265e18e70f6Stakemura 		    test_regs[i].preval,
266e18e70f6Stakemura 		    test_regs[i].val);
267e18e70f6Stakemura 		test_regs[i].preval = test_regs[i].val;
268e18e70f6Stakemura 	    }
269e18e70f6Stakemura 	}
270e18e70f6Stakemura 	Sleep(10); /* 10 msec */
271e18e70f6Stakemura     }
272e18e70f6Stakemura }
273e18e70f6Stakemura 
274e18e70f6Stakemura static void
dump_memory(void)275*df7f595eScegger dump_memory(void)
276e18e70f6Stakemura {
277e18e70f6Stakemura 	HANDLE fh = INVALID_HANDLE_VALUE;
278e18e70f6Stakemura #define UNICODE_MEMORY_CARD \
279e18e70f6Stakemura 	TEXT('\\'), 0xff92, 0xff93, 0xff98, TEXT(' '), 0xff76, 0xff70, \
280e18e70f6Stakemura 	0xff84, 0xff9e
281e18e70f6Stakemura 	TCHAR filename[] = { UNICODE_MEMORY_CARD,  TEXT('2'), TEXT('\\'),
282e18e70f6Stakemura 			     TEXT('d'), TEXT('u'),  TEXT('m'), TEXT('p'), 0 };
283e18e70f6Stakemura 	unsigned long *addr;
284e18e70f6Stakemura 	int found;
285e18e70f6Stakemura 
286e18e70f6Stakemura 	win_printf(TEXT("dump to %s\n"), filename);
287e18e70f6Stakemura 	fh = CreateFile(
288e18e70f6Stakemura 		filename,      	/* file name */
289e18e70f6Stakemura 		GENERIC_WRITE,	/* access (read-write) mode */
290e18e70f6Stakemura 		FILE_SHARE_WRITE,/* share mode */
291e18e70f6Stakemura 		NULL,		/* pointer to security attributes */
292e18e70f6Stakemura 		CREATE_ALWAYS,	/* how to create */
293e18e70f6Stakemura 		FILE_ATTRIBUTE_NORMAL,	/* file attributes*/
294e18e70f6Stakemura 		NULL		/* handle to file with attributes to */
295e18e70f6Stakemura 	    );
296e18e70f6Stakemura 	if (fh == INVALID_HANDLE_VALUE) {
297e18e70f6Stakemura 		return;
298e18e70f6Stakemura 	}
299e18e70f6Stakemura 
300e18e70f6Stakemura 	for (addr = (unsigned long*)0xbe000000;
301e18e70f6Stakemura 	    addr < (unsigned long*)0xbfffffff;
302e18e70f6Stakemura 	    addr += 2048) {
303e18e70f6Stakemura 		char buf[2048];
304e18e70f6Stakemura 		DWORD n;
305e18e70f6Stakemura 
306e18e70f6Stakemura 		SetKMode(1);
307e18e70f6Stakemura 		memcpy(buf, addr, 2048);
308e18e70f6Stakemura 		SetKMode(0);
309e18e70f6Stakemura 		if (WriteFile(fh, buf, 2048, &n, NULL) == 0 ||
310e18e70f6Stakemura 		    n != 2048) {
311e18e70f6Stakemura 			win_printf(TEXT("dump failed\n"));
312e18e70f6Stakemura 			break;
313e18e70f6Stakemura 		}
314e18e70f6Stakemura 	}
315e18e70f6Stakemura 
316e18e70f6Stakemura 	CloseHandle(fh);
317e18e70f6Stakemura }
318e18e70f6Stakemura 
319db2b0adeStakemura static void
serial_test(void)320*df7f595eScegger serial_test(void)
321db2b0adeStakemura {
322db2b0adeStakemura #if 1
323db2b0adeStakemura #  define SIUADDR 0xac000000
324db2b0adeStakemura #  define REGOFFSET 0x0
325db2b0adeStakemura #else
326db2b0adeStakemura #  define SIUADDR 0xab000000
327db2b0adeStakemura #  define REGOFFSET 0x1a0
328db2b0adeStakemura #endif
329db2b0adeStakemura #define REGSIZE 32
330db2b0adeStakemura 	int i, changed, res;
331db2b0adeStakemura 	unsigned char regs[REGSIZE], prev_regs[REGSIZE];
332db2b0adeStakemura 	unsigned char* p = (char*)VirtualAlloc(0, 1024, MEM_RESERVE,
333db2b0adeStakemura 				      PAGE_NOACCESS);
334db2b0adeStakemura 
335db2b0adeStakemura 	for (i = 0; i < ARRAYSIZEOF(prev_regs); i++) {
336db2b0adeStakemura 		prev_regs[i] = ~0;
337db2b0adeStakemura 	}
338db2b0adeStakemura 
339db2b0adeStakemura 	res = VirtualCopy((LPVOID)p, (LPVOID)(SIUADDR >> 8), 1024,
340db2b0adeStakemura 			  PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
341db2b0adeStakemura 	if (!res) {
342db2b0adeStakemura 		win_printf(TEXT("VirtualCopy() failed."));
343db2b0adeStakemura 	}
344db2b0adeStakemura 
345db2b0adeStakemura 	while (1) {
346db2b0adeStakemura 		flush_XX();
347db2b0adeStakemura 
348db2b0adeStakemura 		for (i = 0; i < ARRAYSIZEOF(regs); i++) {
349db2b0adeStakemura 			regs[i] = p[REGOFFSET + i];
350db2b0adeStakemura 		}
351db2b0adeStakemura 
352db2b0adeStakemura 		changed = 0;
353db2b0adeStakemura 		for (i = 0; i < ARRAYSIZEOF(regs); i++) {
354db2b0adeStakemura 			if (regs[i] != prev_regs[i]) {
355db2b0adeStakemura 				changed++;
356db2b0adeStakemura 			}
357db2b0adeStakemura 			prev_regs[i] = regs[i];
358db2b0adeStakemura 		}
359db2b0adeStakemura 		if (changed) {
360db2b0adeStakemura 			win_printf(TEXT("SIU regs: "));
361db2b0adeStakemura 			for (i = 0; i < ARRAYSIZEOF(regs); i++) {
362db2b0adeStakemura 				win_printf(TEXT("%02x "), regs[i]);
363db2b0adeStakemura 			}
364db2b0adeStakemura 			win_printf(TEXT("\n"));
365db2b0adeStakemura 		}
366db2b0adeStakemura 	}
367db2b0adeStakemura 
368db2b0adeStakemura 	VirtualFree(p, 0, MEM_RELEASE);
369db2b0adeStakemura }
370db2b0adeStakemura 
371db2b0adeStakemura static long
checksum(char * addr,int size)372db2b0adeStakemura checksum(char* addr, int size)
373db2b0adeStakemura {
374db2b0adeStakemura 	long sum = 0;
375db2b0adeStakemura 	int i;
376db2b0adeStakemura 
377db2b0adeStakemura 	for (i = 0; i < size; i++) {
378db2b0adeStakemura 		sum += *addr++ * i;
379db2b0adeStakemura 	}
380db2b0adeStakemura 	return (sum);
381db2b0adeStakemura }
382db2b0adeStakemura 
383db2b0adeStakemura static int
examine(char * addr,int size)384db2b0adeStakemura examine(char* addr, int size)
385db2b0adeStakemura {
386db2b0adeStakemura 	long random_data[256];
387db2b0adeStakemura 	long dijest;
388db2b0adeStakemura 	int i;
389db2b0adeStakemura 
390db2b0adeStakemura 	for (i = 0; i < ARRAYSIZEOF(random_data); i++) {
391db2b0adeStakemura 		random_data[i] = Random();
392db2b0adeStakemura 	}
393db2b0adeStakemura 	if (sizeof(random_data) < size) {
394db2b0adeStakemura 		size = sizeof(random_data);
395db2b0adeStakemura 	}
396db2b0adeStakemura 	memcpy(addr, (char*)random_data, size);
397db2b0adeStakemura 	dijest= checksum((char*)random_data, size);
398db2b0adeStakemura 
399db2b0adeStakemura 	return (dijest == checksum(addr, size));
400db2b0adeStakemura }
401db2b0adeStakemura 
402db2b0adeStakemura void
display_search(void)403*df7f595eScegger display_search(void)
404db2b0adeStakemura {
405db2b0adeStakemura 	int step = 0x10000;
406db2b0adeStakemura 	int i;
407db2b0adeStakemura 	long addr;
408db2b0adeStakemura 
409db2b0adeStakemura 	for (i = 0; i < ntargets; i++) {
410db2b0adeStakemura 		int prevres = -1;
411db2b0adeStakemura 		for (addr = targets[i].start;
412db2b0adeStakemura 		     addr < targets[i].end;
413db2b0adeStakemura 		     addr += step) {
414db2b0adeStakemura 			int res;
415ce2f39b6Stakemura #if 0
416db2b0adeStakemura 			char* p = (char*)VirtualAlloc(0, step, MEM_RESERVE,
417db2b0adeStakemura 						      PAGE_NOACCESS);
418db2b0adeStakemura 			res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), step,
419db2b0adeStakemura 				   PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
420db2b0adeStakemura 			if (!res) {
421db2b0adeStakemura 				win_printf(TEXT("VirtualCopy() failed."));
422db2b0adeStakemura 			}
423db2b0adeStakemura 			res = examine(p, step);
424db2b0adeStakemura 			VirtualFree(p, 0, MEM_RELEASE);
425ce2f39b6Stakemura #else
426ce2f39b6Stakemura 			SetKMode(1);
427ce2f39b6Stakemura 			res = examine((char*)((int)addr | 0xa0000000), step);
428ce2f39b6Stakemura 			SetKMode(0);
429ce2f39b6Stakemura #endif
430db2b0adeStakemura 			if (res != prevres && prevres != -1) {
431db2b0adeStakemura 				if (res) {
432db2b0adeStakemura 					win_printf(TEXT("0x%x "), addr);
433db2b0adeStakemura 				} else {
434db2b0adeStakemura 					win_printf(TEXT("- 0x%x\n"), addr);
435db2b0adeStakemura 				}
436db2b0adeStakemura 			} else
437db2b0adeStakemura 			if (res && prevres == -1) {
438db2b0adeStakemura 				win_printf(TEXT("0x%x "), addr);
439db2b0adeStakemura 			}
440db2b0adeStakemura 			prevres = res;
441db2b0adeStakemura 		}
442db2b0adeStakemura 		if (prevres) {
443db2b0adeStakemura 			win_printf(TEXT("\n"));
444db2b0adeStakemura 		}
445db2b0adeStakemura 	}
446db2b0adeStakemura }
447db2b0adeStakemura 
448db2b0adeStakemura void
display_draw(void)449*df7f595eScegger display_draw(void)
450db2b0adeStakemura {
451db2b0adeStakemura 	long addr = 0x13000000;
452ce2f39b6Stakemura 	int size = 0x80000;
453db2b0adeStakemura 	char* p;
454db2b0adeStakemura 	int i, j, res;
455db2b0adeStakemura 	int x, y;
456ce2f39b6Stakemura 	int stride = 1280;
457db2b0adeStakemura 
458db2b0adeStakemura 	p = (char*)VirtualAlloc(0, size, MEM_RESERVE,
459db2b0adeStakemura 				PAGE_NOACCESS);
460db2b0adeStakemura 	res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), size,
461db2b0adeStakemura 			  PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
462db2b0adeStakemura 	if (!res) {
463db2b0adeStakemura 		win_printf(TEXT("VirtualCopy() failed."));
464db2b0adeStakemura 	}
465db2b0adeStakemura 
466db2b0adeStakemura 	for (i = 0; i < 10000; i++) {
467db2b0adeStakemura 		p[i] = i;
468db2b0adeStakemura 	}
469db2b0adeStakemura 	for (x = 0; x < 640; x += 10) {
470db2b0adeStakemura 		for (y = 0; y < 240; y += 1) {
471ce2f39b6Stakemura 		        p[stride * y + x] = (char)0xff;
472db2b0adeStakemura 		}
473db2b0adeStakemura 	}
474db2b0adeStakemura 	for (y = 0; y < 240; y += 10) {
475db2b0adeStakemura 		for (x = 0; x < 640; x += 1) {
476ce2f39b6Stakemura 		        p[stride * y + x] = (char)0xff;
477db2b0adeStakemura 		}
478db2b0adeStakemura 	}
479db2b0adeStakemura 	for (i = 0; i < 16; i++) {
480db2b0adeStakemura 		for (j = 0; j < 16; j++) {
481db2b0adeStakemura 			for (x = i * 32; x < i * 32 + 32; x++) {
482db2b0adeStakemura 				for (y = j * 15; y < j * 15 + 15; y++) {
483ce2f39b6Stakemura 					p[stride * y + x] = j * 16 + i;
484db2b0adeStakemura 				}
485db2b0adeStakemura 			}
486db2b0adeStakemura 		}
487db2b0adeStakemura 	}
488db2b0adeStakemura 
489db2b0adeStakemura 	VirtualFree(p, 0, MEM_RELEASE);
490db2b0adeStakemura }
491db2b0adeStakemura 
492db2b0adeStakemura #define PCIC_IDENT		0x00
493db2b0adeStakemura #define	PCIC_REG_INDEX		0
494db2b0adeStakemura #define	PCIC_REG_DATA		1
495db2b0adeStakemura #define PCIC_IDENT_EXPECTED	0x83
496db2b0adeStakemura 
497db2b0adeStakemura void
pcic_search(void)498*df7f595eScegger pcic_search(void)
499db2b0adeStakemura {
500db2b0adeStakemura 	long addr;
501db2b0adeStakemura 	int window_size = 0x10000;
502db2b0adeStakemura 	int i;
503db2b0adeStakemura 
504db2b0adeStakemura 	for (addr = 0x14000000; addr < 0x18000000; addr += window_size) {
505db2b0adeStakemura 		int res;
506db2b0adeStakemura 		unsigned char* p;
507db2b0adeStakemura 		p = (char*)VirtualAlloc(0, window_size, MEM_RESERVE,
508db2b0adeStakemura 					PAGE_NOACCESS);
509db2b0adeStakemura 		res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), window_size,
510db2b0adeStakemura 				  PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
511db2b0adeStakemura 		if (!res) {
512db2b0adeStakemura 			win_printf(TEXT("VirtualCopy() failed."));
513db2b0adeStakemura 		}
514db2b0adeStakemura 
515db2b0adeStakemura 		for (i = 0; i < window_size; i += 2) {
516db2b0adeStakemura 			p[i + PCIC_REG_INDEX] = PCIC_IDENT;
517db2b0adeStakemura 			if (p[i + PCIC_REG_DATA] == PCIC_IDENT_EXPECTED) {
518db2b0adeStakemura 				win_printf(TEXT("pcic is found at 0x%x\n"),
519db2b0adeStakemura 					   addr + i);
520db2b0adeStakemura 			}
521db2b0adeStakemura 		}
522db2b0adeStakemura 
523db2b0adeStakemura 		VirtualFree(p, 0, MEM_RELEASE);
524db2b0adeStakemura 	}
525db2b0adeStakemura }
526db2b0adeStakemura 
527ce2f39b6Stakemura #define VRPCIU_CONFA	(*(u_int32_t*)0xaf000c18)
528ce2f39b6Stakemura #define VRPCIU_CONFD	(*(u_int32_t*)0xaf000c14)
529ce2f39b6Stakemura 
530ce2f39b6Stakemura void
pci_dump(void)531*df7f595eScegger pci_dump(void)
532ce2f39b6Stakemura {
533ce2f39b6Stakemura 	int mode, i;
534ce2f39b6Stakemura 	BOOL SetKMode(BOOL);
535ce2f39b6Stakemura 	int bus, dev;
536ce2f39b6Stakemura 	u_int32_t addr, val;
537ce2f39b6Stakemura 	u_int32_t addrs[] = {
538ce2f39b6Stakemura 		0x00000800,
539ce2f39b6Stakemura 		0x00001000,
540ce2f39b6Stakemura 		0x00002000,
541ce2f39b6Stakemura 		0x00004000,
542ce2f39b6Stakemura 		0x00008000,
543ce2f39b6Stakemura 		0x00010000,
544ce2f39b6Stakemura 		0x00020000,
545ce2f39b6Stakemura 		0x00040000,
546ce2f39b6Stakemura 		0x00080000,
547ce2f39b6Stakemura 		0x00100000,
548ce2f39b6Stakemura 		0x00200000,
549ce2f39b6Stakemura 		0x00400000,
550ce2f39b6Stakemura 		0x00800000,
551ce2f39b6Stakemura 		0x01000000,
552ce2f39b6Stakemura 		0x02000000,
553ce2f39b6Stakemura 		0x04000000,
554ce2f39b6Stakemura 		0x08000000,
555ce2f39b6Stakemura 		0x10000000,
556ce2f39b6Stakemura 		0x20000000,
557ce2f39b6Stakemura 		0x40000000,
558ce2f39b6Stakemura 		0x80000000,
559ce2f39b6Stakemura 	};
560ce2f39b6Stakemura 
561ce2f39b6Stakemura #if 0 /* You can find Vrc4173 BCU at 0xb6010000 on Sigmarion II */
562ce2f39b6Stakemura 	win_printf(TEXT("Vrc4173 CMUCLKMSK:	%04X\n"),
563ce2f39b6Stakemura 	    *(u_int16_t*)0xb6010040);
564ce2f39b6Stakemura 	win_printf(TEXT("Vrc4173 CMUSRST:	%04X\n"),
565ce2f39b6Stakemura 	    *(u_int16_t*)0xb6010042);
566ce2f39b6Stakemura 
567ce2f39b6Stakemura 	/* enable CARDU clock */
568ce2f39b6Stakemura 	*(u_int16_t*)0xb6010042 = 0x0006; /* enable CARD1RST and CARD2RST */
569ce2f39b6Stakemura 	*(u_int16_t*)0xb6010040 = *(u_int16_t*)0xb6010040 | 0x00c0;
570ce2f39b6Stakemura 	*(u_int16_t*)0xb6010042 = 0x0000; /* disable CARD1RST and CARD2RST */
571ce2f39b6Stakemura 
572ce2f39b6Stakemura 	win_printf(TEXT("Vrc4173 CMUCLKMSK:	%04X\n"),
573ce2f39b6Stakemura 	    *(u_int16_t*)0xb6010040);
574ce2f39b6Stakemura 	win_printf(TEXT("Vrc4173 CMUSRST:	%04X\n"),
575ce2f39b6Stakemura 	    *(u_int16_t*)0xb6010042);
576ce2f39b6Stakemura #endif
577ce2f39b6Stakemura 
578ce2f39b6Stakemura 	for (i = 0; i < sizeof(addrs)/sizeof(*addrs); i++) {
579ce2f39b6Stakemura 		VRPCIU_CONFA = addrs[i];
580ce2f39b6Stakemura 		val = VRPCIU_CONFD;
581ce2f39b6Stakemura 		win_printf(TEXT("%2d:	%08X	%04X %04X\n"),
582ce2f39b6Stakemura 		    i, addrs[i], val & 0xffff, (val >> 16) & 0xffff);
583ce2f39b6Stakemura 	}
584ce2f39b6Stakemura 
585ce2f39b6Stakemura 	mode = SetKMode(1);
586ce2f39b6Stakemura 	SetKMode(mode);
587ce2f39b6Stakemura }
588ce2f39b6Stakemura 
589db2b0adeStakemura void
hardware_test(void)590*df7f595eScegger hardware_test(void)
591db2b0adeStakemura {
592db2b0adeStakemura 	int do_gpio_test = 0;
593e18e70f6Stakemura 	int do_register_test = 0;
594db2b0adeStakemura 	int do_serial_test = 0;
595db2b0adeStakemura 	int do_display_draw = 0;
596db2b0adeStakemura 	int do_display_search = 0;
597db2b0adeStakemura 	int do_pcic_search = 0;
598e18e70f6Stakemura 	int do_dump_memory = 0;
599ce2f39b6Stakemura 	int do_pci_dump = 0;
600db2b0adeStakemura 
601db2b0adeStakemura 	if (do_gpio_test) {
602db2b0adeStakemura 		gpio_test();
603db2b0adeStakemura 	}
604e18e70f6Stakemura 	if (do_register_test) {
605e18e70f6Stakemura 		register_test();
606e18e70f6Stakemura 	}
607db2b0adeStakemura 	if (do_serial_test) {
608db2b0adeStakemura 		serial_test();
609db2b0adeStakemura 	}
610db2b0adeStakemura 	if (do_display_draw) {
611db2b0adeStakemura 		display_draw();
612db2b0adeStakemura 	}
613db2b0adeStakemura 	if (do_display_search) {
614db2b0adeStakemura 		display_search();
615db2b0adeStakemura 	}
616db2b0adeStakemura 	if (do_pcic_search) {
617db2b0adeStakemura 		pcic_search();
618db2b0adeStakemura 	}
619e18e70f6Stakemura 	if (do_dump_memory) {
620e18e70f6Stakemura 		dump_memory();
621e18e70f6Stakemura 	}
622ce2f39b6Stakemura 	if (do_pci_dump) {
623ce2f39b6Stakemura 		pci_dump();
624ce2f39b6Stakemura 	}
625db2b0adeStakemura }
626