xref: /netbsd-src/sys/arch/hpc/hpc/debug_subr.c (revision df7f595ecd6efe54ea7c11083e2dbf711cad4b31)
1*df7f595eScegger /*	$NetBSD: debug_subr.c,v 1.10 2009/03/18 10:22:28 cegger Exp $	*/
27d170993Such 
37d170993Such /*-
47d170993Such  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
57d170993Such  * All rights reserved.
67d170993Such  *
77d170993Such  * This code is derived from software contributed to The NetBSD Foundation
87d170993Such  * by UCHIYAMA Yasushi.
97d170993Such  *
107d170993Such  * Redistribution and use in source and binary forms, with or without
117d170993Such  * modification, are permitted provided that the following conditions
127d170993Such  * are met:
137d170993Such  * 1. Redistributions of source code must retain the above copyright
147d170993Such  *    notice, this list of conditions and the following disclaimer.
157d170993Such  * 2. Redistributions in binary form must reproduce the above copyright
167d170993Such  *    notice, this list of conditions and the following disclaimer in the
177d170993Such  *    documentation and/or other materials provided with the distribution.
187d170993Such  *
197d170993Such  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
207d170993Such  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
217d170993Such  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
227d170993Such  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
237d170993Such  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
247d170993Such  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
257d170993Such  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
267d170993Such  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
277d170993Such  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
287d170993Such  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
297d170993Such  * POSSIBILITY OF SUCH DAMAGE.
307d170993Such  */
317d170993Such 
320c82163cSlukem #include <sys/cdefs.h>
33*df7f595eScegger __KERNEL_RCSID(0, "$NetBSD: debug_subr.c,v 1.10 2009/03/18 10:22:28 cegger Exp $");
340c82163cSlukem 
35c0a13ed2Such #include "debug_hpc.h"
36c0a13ed2Such 
377d170993Such #include <sys/param.h>
387d170993Such #include <sys/systm.h>
397d170993Such 
407d170993Such #include <machine/debug.h>
41c0a13ed2Such #include <machine/bootinfo.h>
427d170993Such 
437d170993Such #define BANNER_LENGTH		80
447d170993Such 
457d170993Such static const char onoff[2] = "_x";
467d170993Such 
477d170993Such void
__dbg_bit_print(uint32_t a,int len,int start,int end,const char * title,int flags)48756e048eSuwe __dbg_bit_print(uint32_t a, int len, int start, int end, const char *title,
49f8cb4c37Stakemura     int flags)
507d170993Such {
51756e048eSuwe 	uint32_t j, j1;
527d170993Such 	int i, n;
537d170993Such 	char buf[64];
547d170993Such 
557d170993Such 	n = len * NBBY - 1;
567d170993Such 	j1 = 1 << n;
577d170993Such 	end = end ? end : n;
587d170993Such 
59f8cb4c37Stakemura 	if (!(flags & DBG_BIT_PRINT_QUIET))
607d170993Such 		printf(" ");
617d170993Such 	if (title) {
627d170993Such 		printf("[%-16s] ", title);
637d170993Such 	}
647d170993Such 
657d170993Such 	for (j = j1, i = n; j > 0; j >>=1, i--) {
667d170993Such 		if (i > end || i < start) {
677d170993Such 			printf("%c", a & j ? '+' : '-'); /* out of range */
687d170993Such 		} else {
697d170993Such 			printf("%c", a & j ? '|' : '.');
707d170993Such 		}
717d170993Such 	}
727d170993Such 
73f8cb4c37Stakemura 	if (!(flags & DBG_BIT_PRINT_QUIET)) {
747d170993Such 		snprintf(buf, sizeof buf, " [0x%%0%dx %%12d]", len << 1);
757d170993Such 		printf(buf, a, a);
76f8cb4c37Stakemura 	}
777d170993Such 
78f8cb4c37Stakemura 	if (flags & DBG_BIT_PRINT_COUNT) {
797d170993Such 		for (j = j1, i = n; j > 0; j >>=1, i--) {
807d170993Such 			if (!(i > end || i < start) && (a & j)) {
817d170993Such 				printf(" %d", i);
827d170993Such 			}
837d170993Such 		}
847d170993Such 	}
857d170993Such 
86f8cb4c37Stakemura 	if (!(flags & DBG_BIT_PRINT_QUIET))
877d170993Such 		printf("\n");
887d170993Such }
897d170993Such 
907d170993Such void
dbg_bitmask_print(uint32_t reg,uint32_t mask,const char * name)91756e048eSuwe dbg_bitmask_print(uint32_t reg, uint32_t mask, const char *name)
927d170993Such {
937d170993Such 
947d170993Such 	printf("%s[%c] ", name, onoff[reg & mask ? 1 : 0]);
957d170993Such }
967d170993Such 
977d170993Such void
dbg_banner_title(const char * name,size_t len)987d170993Such dbg_banner_title(const char *name, size_t len)
997d170993Such {
1007d170993Such 	int n = (BANNER_LENGTH - (len + 2)) >> 1;
1017d170993Such 
1027d170993Such 	dbg_draw_line(n);
1037d170993Such 	printf("[%s]", name);
1047d170993Such 	dbg_draw_line(n);
1057d170993Such 	printf("\n");
1067d170993Such }
1077d170993Such 
1087d170993Such void
dbg_banner_line(void)109*df7f595eScegger dbg_banner_line(void)
1107d170993Such {
1117d170993Such 
1127d170993Such 	dbg_draw_line(BANNER_LENGTH);
1137d170993Such 	printf("\n");
1147d170993Such }
1157d170993Such 
1167d170993Such void
dbg_draw_line(int n)1177d170993Such dbg_draw_line(int n)
1187d170993Such {
1197d170993Such 	int i;
1207d170993Such 
1217d170993Such 	for (i = 0; i < n; i++)
1227d170993Such 		printf("-");
1237d170993Such }
124c0a13ed2Such 
125c0a13ed2Such #ifdef HPC_DEBUG_LCD
126c0a13ed2Such /*
127c0a13ed2Such  * LCD test routines for 8bpp, 16bpp LCD.
128c0a13ed2Such  */
129756e048eSuwe static const uint8_t img[1024] = {
130c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
131c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
132c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
133c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
134c0a13ed2Such 	0xff,0xd5,0xff,0xc3,0xff,0xd5,0xff,0xc3,
135c0a13ed2Such 	0xff,0xd5,0xff,0xc3,0xff,0xd5,0xff,0xc3,
136c0a13ed2Such 	0xff,0xd5,0xff,0xc3,0xff,0xd5,0xc3,0xd5,
137c0a13ed2Such 	0xff,0xc3,0xff,0xd5,0xff,0xc3,0xff,0xd5,
138c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
139c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
140c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0x82,0x82,
141c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
142c0a13ed2Such 	0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
143c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
144c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xb9,0x82,
145c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb9,
146c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
147c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
148c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0x82,
149c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,
150c0a13ed2Such 	0xff,0xb9,0xff,0xff,0xff,0xff,0xff,0xff,
151c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
152c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0x82,
153c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
154c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
155c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
156c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0x82,
157c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,
158c0a13ed2Such 	0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
159c0a13ed2Such 	0xff,0xff,0xff,0xff,0xb9,0xd5,0xc3,0xd5,
160c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0x3d,0x82,
161c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb9,
162c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
163c0a13ed2Such 	0xff,0xff,0xd5,0x82,0x82,0x82,0x82,0x82,
164c0a13ed2Such 	0x82,0x82,0xd5,0xff,0xff,0xff,0xd5,0x82,
165c0a13ed2Such 	0xff,0xff,0xd5,0xc3,0xff,0xff,0xff,0xc3,
166c0a13ed2Such 	0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
167c0a13ed2Such 	0xff,0xff,0x82,0x82,0xff,0xff,0xff,0xff,
168c0a13ed2Such 	0xd5,0x3e,0x82,0x82,0x82,0xc3,0x82,0x3d,
169c0a13ed2Such 	0xff,0xc3,0x82,0x3d,0xff,0xff,0xff,0xd5,
170c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
171c0a13ed2Such 	0xff,0xd5,0x82,0xff,0xff,0xff,0xff,0xff,
172c0a13ed2Such 	0xff,0xff,0xff,0xff,0x82,0x82,0x82,0x3d,
173c0a13ed2Such 	0x82,0x82,0xd5,0xff,0xff,0xff,0xff,0xb9,
174c0a13ed2Such 	0xff,0xb9,0xff,0xff,0xff,0xff,0xff,0xff,
175c0a13ed2Such 	0xff,0x82,0x82,0xff,0xff,0xff,0xff,0xff,
176c0a13ed2Such 	0xff,0xff,0xff,0xff,0xd5,0x82,0x82,0x82,
177c0a13ed2Such 	0x82,0x82,0xb9,0xff,0xff,0xff,0xff,0xc3,
178c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
179c0a13ed2Such 	0xff,0x82,0xd5,0xff,0xff,0xff,0xff,0xff,
180c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0x82,0x82,0x82,
181c0a13ed2Such 	0xd5,0xff,0x82,0xd5,0xff,0xff,0xff,0xd5,
182c0a13ed2Such 	0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
183c0a13ed2Such 	0xd5,0x82,0xff,0xff,0xff,0xff,0xff,0xff,
184c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0x82,0x82,0x3e,
185c0a13ed2Such 	0xff,0xff,0xc3,0x82,0xff,0xff,0xff,0xb9,
186c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
187c0a13ed2Such 	0x82,0x3e,0xff,0xff,0xff,0xff,0xff,0xff,
188c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0xc3,
189c0a13ed2Such 	0xff,0xff,0xff,0x82,0xf8,0xff,0xff,0xd5,
190c0a13ed2Such 	0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
191c0a13ed2Such 	0x82,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
192c0a13ed2Such 	0xff,0xff,0xff,0xff,0x3e,0x82,0x82,0x82,
193c0a13ed2Such 	0x80,0x3d,0xff,0x3d,0x82,0xff,0xff,0xc3,
194c0a13ed2Such 	0xff,0xff,0xff,0xff,0xd5,0xc3,0xd5,0xb9,
195c0a13ed2Such 	0x82,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
196c0a13ed2Such 	0xff,0xff,0xff,0xff,0x82,0x82,0xd5,0xff,
197c0a13ed2Such 	0x82,0xd5,0xff,0xd5,0x82,0xff,0xff,0xb9,
198c0a13ed2Such 	0xff,0xb9,0xff,0x82,0x82,0x82,0x82,0x82,
199c0a13ed2Such 	0x82,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
200c0a13ed2Such 	0xff,0xff,0xff,0x82,0x82,0x82,0x82,0x3d,
201c0a13ed2Such 	0x82,0xb9,0xff,0xc3,0x82,0xff,0xff,0xd5,
202c0a13ed2Such 	0xff,0xff,0xd5,0x82,0xd5,0xff,0xff,0xff,
203c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
204c0a13ed2Such 	0xff,0xff,0xff,0x82,0x82,0xd5,0x3e,0x82,
205c0a13ed2Such 	0x82,0xc3,0xff,0xb9,0x82,0xff,0xff,0xc3,
206c0a13ed2Such 	0xff,0xc3,0x3e,0x82,0xff,0xff,0xff,0xff,
207c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
208c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
209c0a13ed2Such 	0xff,0xff,0xff,0xd5,0x82,0xff,0xff,0xb9,
210c0a13ed2Such 	0xff,0xff,0x82,0x3d,0xff,0xff,0x3e,0xd5,
211c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
212c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
213c0a13ed2Such 	0xff,0xff,0xff,0xc3,0x82,0xff,0xff,0xd5,
214c0a13ed2Such 	0xff,0xd5,0x82,0xd5,0xff,0xc3,0x82,0xff,
215c0a13ed2Such 	0xc3,0xd5,0xb9,0xd5,0xff,0xff,0xff,0xff,
216c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xd5,
217c0a13ed2Such 	0xb9,0xff,0xff,0xb9,0x82,0xff,0xff,0xc3,
218c0a13ed2Such 	0xff,0xb9,0x82,0xb9,0xff,0x82,0x3d,0xff,
219c0a13ed2Such 	0x82,0x82,0x82,0x82,0xff,0xff,0xff,0xff,
220c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0x82,
221c0a13ed2Such 	0x82,0x82,0xff,0xd5,0x82,0xff,0xff,0xd5,
222c0a13ed2Such 	0xff,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
223c0a13ed2Such 	0x82,0x82,0x82,0x82,0x82,0xc3,0xb9,0xd5,
224c0a13ed2Such 	0xc3,0xd5,0xff,0xff,0xc3,0x82,0x82,0x82,
225c0a13ed2Such 	0x82,0x82,0xb9,0xc3,0x82,0xff,0xff,0xb9,
226c0a13ed2Such 	0xff,0xd5,0xc3,0xd5,0xb9,0x82,0x3d,0xd5,
227c0a13ed2Such 	0x82,0x82,0x3e,0x82,0x82,0x82,0x82,0x82,
228c0a13ed2Such 	0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x3d,
229c0a13ed2Such 	0x82,0x82,0x82,0x82,0x3d,0xff,0xff,0xc3,
230c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0xc3,
231c0a13ed2Such 	0x82,0xd5,0xff,0x82,0xd5,0xff,0xff,0xff,
232c0a13ed2Such 	0xff,0xd5,0xb9,0xd5,0x82,0x82,0x82,0xd5,
233c0a13ed2Such 	0x82,0x82,0x82,0xff,0xd5,0xff,0xff,0xd5,
234c0a13ed2Such 	0xff,0xb9,0xff,0xff,0xff,0xff,0x82,0x82,
235c0a13ed2Such 	0x82,0xc3,0x82,0x82,0xff,0xff,0xff,0xff,
236c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0x82,0x82,0x82,
237c0a13ed2Such 	0x82,0x82,0x82,0xff,0xff,0xff,0xff,0xb9,
238c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3d,
239c0a13ed2Such 	0x82,0x82,0x3d,0xff,0xff,0xff,0xff,0xff,
240c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0x82,
241c0a13ed2Such 	0x82,0x82,0xd5,0xff,0xff,0xff,0xff,0xc3,
242c0a13ed2Such 	0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
243c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
244c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
245c0a13ed2Such 	0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,
246c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
247c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
248c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
249c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb9,
250c0a13ed2Such 	0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
251c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
252c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
253c0a13ed2Such 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
254c0a13ed2Such 	0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
255c0a13ed2Such 	0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
256c0a13ed2Such 	0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
257c0a13ed2Such 	0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
258c0a13ed2Such };
259c0a13ed2Such 
260756e048eSuwe static const uint16_t rgb565_clut[256] = {
261c0a13ed2Such 	0x0000, 0x8000, 0x0400, 0x8400, 0x0080, 0x8080, 0x0480, 0x8480,
262c0a13ed2Such 	0xc6e0, 0xa6f0, 0x29ea, 0x29ff, 0x2ae0, 0x2af5, 0x2aea, 0x2aff,
263c0a13ed2Such 	0x2be0, 0x2bf5, 0x2bea, 0x2bff, 0x2ce0, 0x2cf5, 0x2cea, 0x2cff,
264c0a13ed2Such 	0x2de0, 0x2df5, 0x2dea, 0x2dff, 0x2ee0, 0x2ef5, 0x2eea, 0x2eff,
265c0a13ed2Such 	0x2fe0, 0x2ff5, 0x2fea, 0x2fff, 0x5000, 0x5055, 0x50aa, 0x50ff,
266c0a13ed2Such 	0x50e0, 0x50f5, 0x50ea, 0x50ff, 0x51e0, 0x51f5, 0x51ea, 0x51ff,
267c0a13ed2Such 	0x52e0, 0x52f5, 0x52ea, 0x52ff, 0x53e0, 0x53f5, 0x53ea, 0x53ff,
268c0a13ed2Such 	0x54e0, 0x54f5, 0x54ea, 0x54ff, 0x55e0, 0x55f5, 0x55ea, 0x55ff,
269c0a13ed2Such 	0x56e0, 0x56f5, 0x56ea, 0x56ff, 0x57e0, 0x57f5, 0x57ea, 0x57ff,
270c0a13ed2Such 	0x7800, 0x7855, 0x78aa, 0x78ff, 0x78e0, 0x78f5, 0x78ea, 0x78ff,
271c0a13ed2Such 	0x79e0, 0x79f5, 0x79ea, 0x79ff, 0x7ae0, 0x7af5, 0x7aea, 0x7aff,
272c0a13ed2Such 	0x7be0, 0x7bf5, 0x7bea, 0x7bff, 0x7ce0, 0x7cf5, 0x7cea, 0x7cff,
273c0a13ed2Such 	0x7de0, 0x7df5, 0x7dea, 0x7dff, 0x7ee0, 0x7ef5, 0x7eea, 0x7eff,
274c0a13ed2Such 	0x7fe0, 0x7ff5, 0x7fea, 0x7fff, 0xa800, 0xa855, 0xa8aa, 0xa8ff,
275c0a13ed2Such 	0xa8e0, 0xa8f5, 0xa8ea, 0xa8ff, 0xa9e0, 0xa9f5, 0xa9ea, 0xa9ff,
276c0a13ed2Such 	0xaae0, 0xaaf5, 0xaaea, 0xaaff, 0xabe0, 0xabf5, 0xabea, 0xabff,
277c0a13ed2Such 	0xace0, 0xacf5, 0xacea, 0xacff, 0xade0, 0xadf5, 0xadea, 0xadff,
278c0a13ed2Such 	0xaee0, 0xaef5, 0xaeea, 0xaeff, 0xafe0, 0xaff5, 0xafea, 0xafff,
279c0a13ed2Such 	0xd000, 0xd055, 0xd0aa, 0xd0ff, 0xd0e0, 0xd0f5, 0xd0ea, 0xd0ff,
280c0a13ed2Such 	0xd1e0, 0xd1f5, 0xd1ea, 0xd1ff, 0xd2e0, 0xd2f5, 0xd2ea, 0xd2ff,
281c0a13ed2Such 	0xd3e0, 0xd3f5, 0xd3ea, 0xd3ff, 0xd4e0, 0xd4f5, 0xd4ea, 0xd4ff,
282c0a13ed2Such 	0xd5e0, 0xd5f5, 0xd5ea, 0xd5ff, 0xd6e0, 0xd6f5, 0xd6ea, 0xd6ff,
283c0a13ed2Such 	0xd7e0, 0xd7f5, 0xd7ea, 0xd7ff, 0xf855, 0xf8aa, 0xf8e0, 0xf8f5,
284c0a13ed2Such 	0xf8ea, 0xf8ff, 0xf9e0, 0xf9f5, 0xf9ea, 0xf9ff, 0xfae0, 0xfaf5,
285c0a13ed2Such 	0xfaea, 0xfaff, 0xfbe0, 0xfbf5, 0xfbea, 0xfbff, 0xfce0, 0xfcf5,
286c0a13ed2Such 	0xfcea, 0xfcff, 0xfde0, 0xfdf5, 0xfdea, 0xfdff, 0xfee0, 0xfef5,
287c0a13ed2Such 	0xfeea, 0xfeff, 0xfff5, 0xffea, 0xceff, 0xfeff, 0x37ff, 0x67ff,
288c0a13ed2Such 	0x9fff, 0xcfff, 0x03e0, 0x03f5, 0x03ea, 0x03ff, 0x04e0, 0x04f5,
289c0a13ed2Such 	0x04ea, 0x04ff, 0x05e0, 0x05f5, 0x05ea, 0x05ff, 0x06e0, 0x06f5,
290c0a13ed2Such 	0x06ea, 0x06ff, 0x07f5, 0x07ea, 0x2800, 0x2855, 0x28aa, 0x28ff,
291c0a13ed2Such 	0x28e0, 0x28f5, 0x28ea, 0x28ff, 0x29e0, 0x29f5, 0xfff0, 0xa5a4,
292c0a13ed2Such 	0x8480, 0xf800, 0x07e0, 0xffe0, 0x00ff, 0xf8ff, 0x07ff, 0xffff
293c0a13ed2Such };
294c0a13ed2Such 
295756e048eSuwe static uint16_t __color_tab16[] = {
296c0a13ed2Such 	RGB565_BLACK,
297c0a13ed2Such 	RGB565_RED,
298c0a13ed2Such 	RGB565_GREEN,
299c0a13ed2Such 	RGB565_YELLOW,
300c0a13ed2Such 	RGB565_BLUE,
301c0a13ed2Such 	RGB565_MAGENTA,
302c0a13ed2Such 	RGB565_CYAN,
303c0a13ed2Such 	RGB565_WHITE
304c0a13ed2Such };
305c0a13ed2Such 
306c0a13ed2Such static int bootinfo_fb_depth(void);
307c0a13ed2Such static void __dbg_lcd_test8(vaddr_t, int, int);
308c0a13ed2Such static void __dbg_lcd_test16(vaddr_t, int, int);
309c0a13ed2Such 
310c0a13ed2Such void
dbg_lcd_test(void)311*df7f595eScegger dbg_lcd_test(void)
312c0a13ed2Such {
313c0a13ed2Such 	vaddr_t fbaddr;
314c0a13ed2Such 	int w, h;
315c0a13ed2Such 
316c0a13ed2Such 	if (bootinfo == NULL || bootinfo->fb_addr == NULL)
317c0a13ed2Such 		return;
318c0a13ed2Such 
319c0a13ed2Such 	fbaddr = (vaddr_t)bootinfo->fb_addr;
320c0a13ed2Such 	w = bootinfo->fb_width;
321c0a13ed2Such 	h = bootinfo->fb_height;
322c0a13ed2Such 
323c0a13ed2Such 	switch (bootinfo_fb_depth()) {
324c0a13ed2Such 	default:
325c0a13ed2Such 		break;
326c0a13ed2Such 	case 8:
327c0a13ed2Such 		__dbg_lcd_test8(fbaddr, w, h);
328c0a13ed2Such 		break;
329c0a13ed2Such 	case 16:
330c0a13ed2Such 		__dbg_lcd_test16(fbaddr, w, h);
331c0a13ed2Such 		break;
332c0a13ed2Such 	}
333c0a13ed2Such }
334c0a13ed2Such 
335c0a13ed2Such /*
336c0a13ed2Such  * 8bpp LCD test routine.
337c0a13ed2Such  *  HP620LX, HPW50PAD are little-endian display.
338c0a13ed2Such  */
339c0a13ed2Such void
__dbg_lcd_test8(vaddr_t fbaddr,int w,int h)340c0a13ed2Such __dbg_lcd_test8(vaddr_t fbaddr, int w, int h)
341c0a13ed2Such {
342756e048eSuwe 	uint8_t *fb, *fb_start = (uint8_t *)fbaddr;
343c0a13ed2Such 	int i, x, y, y_start, y_end, len, skip;
344756e048eSuwe 	uint16_t *fb16;
345756e048eSuwe 	uint32_t *fb32;
346c0a13ed2Such 
347c0a13ed2Such 	/*
348c0a13ed2Such 	 * Clear screen (BLACK)
349c0a13ed2Such 	 */
350c0a13ed2Such 	for (fb = fb_start, i = 0; i < w * h; i++)
351c0a13ed2Such 		*fb++ = 0;
352c0a13ed2Such 
353c0a13ed2Such 	/*
354c0a13ed2Such 	 * Color bar (I assume palette index is ANSI)
355c0a13ed2Such 	 *	BLACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE
356c0a13ed2Such 	 */
357c0a13ed2Such 	len = w / 8;
358c0a13ed2Such 	y_start = 0;
359c0a13ed2Such 	y_end = h / 2;
360c0a13ed2Such 	skip = bootinfo->fb_line_bytes - w;
361c0a13ed2Such 	for (fb = fb_start, y = y_start; y < y_end; y++, fb += skip) {
362c0a13ed2Such 		for (i = 0; i < 8; i++) {
363c0a13ed2Such 			for (x = 0; x < len; x++)
364c0a13ed2Such 				*fb++ = i;
365c0a13ed2Such 		}
366c0a13ed2Such 	}
367c0a13ed2Such 
368c0a13ed2Such 	/*
369c0a13ed2Such 	 * Byte order test. (display 32x32 bitmap)
370c0a13ed2Such 	 */
37143eee137Such 	/*
37243eee137Such 	 * 8-bit access (reference)
37343eee137Such 	 */
374c0a13ed2Such 	y_start = y_end;
375c0a13ed2Such 	y_end = y_start + 32;
376c0a13ed2Such 	i = 0;
377c0a13ed2Such 	fb += w / 2 - 16; /* center */
378c0a13ed2Such 	skip = bootinfo->fb_line_bytes - 32;
379c0a13ed2Such 	for (y = y_start; y < y_end; y++, fb += skip)
380c0a13ed2Such 		for (x = 0; x < 32; x++)
381c0a13ed2Such 			*fb++ = img[i++];
382c0a13ed2Such 
383c0a13ed2Such 	/*
38443eee137Such 	 * 16-bit access
385c0a13ed2Such 	 */
386c0a13ed2Such 	y_start = y_end;
387c0a13ed2Such 	y_end = y_start + 32;
388c0a13ed2Such 	i = 0;
389756e048eSuwe 	fb16 = (uint16_t *)fb;
390c0a13ed2Such 	skip /= 2;
391c0a13ed2Such 	for (y = y_start; y < y_end; y++, fb16 += skip)
392c0a13ed2Such 		for (x = 0; x < 16; x++, i += 2)
393c0a13ed2Such 			*fb16++ =
394c0a13ed2Such 			    img[i + 1] << 8 |
395c0a13ed2Such 			    img[i + 0];
396c0a13ed2Such 
397c0a13ed2Such 	/*
39843eee137Such 	 * 32-bit access
399c0a13ed2Such 	 */
400c0a13ed2Such 	y_start = y_end;
401c0a13ed2Such 	y_end = y_start + 32;
402c0a13ed2Such 	i = 0;
403756e048eSuwe 	fb32 = (uint32_t *)(fb + 32 * w);
404c0a13ed2Such 	skip /= 2;
405c0a13ed2Such 	for (y = y_start; y < y_end; y++, fb32 += skip)
406c0a13ed2Such 		for (x = 0; x < 8; x++, i += 4)
407c0a13ed2Such 			*fb32++ =
408c0a13ed2Such 			    img[i + 3] << 24 |
409c0a13ed2Such 			    img[i + 2] << 16 |
410c0a13ed2Such 			    img[i + 1] <<  8 |
411c0a13ed2Such 			    img[i + 0];
412c0a13ed2Such }
413c0a13ed2Such 
414c0a13ed2Such /*
415c0a13ed2Such  * 16bpp LCD test routine.
416c0a13ed2Such  *  Jornada6[89]0, HPW650PA are big-endian display.
417c0a13ed2Such  */
418c0a13ed2Such void
__dbg_lcd_test16(vaddr_t fbaddr,int w,int h)419c0a13ed2Such __dbg_lcd_test16(vaddr_t fbaddr, int w, int h)
420c0a13ed2Such {
421756e048eSuwe 	uint16_t *fb, *fb_start = (uint16_t *)fbaddr;
422756e048eSuwe 	uint16_t pat;
423c0a13ed2Such 	int i, x, y, y_start, y_end, len, skip;
424756e048eSuwe 	uint32_t *fb32;
425c0a13ed2Such 
426c0a13ed2Such 	/*
427c0a13ed2Such 	 * Clear screen (BLACK)
428c0a13ed2Such 	 */
429c0a13ed2Such 	pat = __color_tab16[0];
430c0a13ed2Such 	for (fb = fb_start, i = 0; i < w * h; i++)
431c0a13ed2Such 		*fb++ = pat;
432c0a13ed2Such 
433c0a13ed2Such 	/*
434c0a13ed2Such 	 * Color bar
435c0a13ed2Such 	 *	BLACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE
436c0a13ed2Such 	 */
437c0a13ed2Such 	len = w / 8;
438c0a13ed2Such 	y_start = 0;
439c0a13ed2Such 	y_end = h / 2;
440c0a13ed2Such 	for (fb = fb_start, y = y_start; y < y_end; y++) {
441c0a13ed2Such 		for (i = 0; i < 8; i++) {
442c0a13ed2Such 			pat = __color_tab16[i];
443c0a13ed2Such 			for (x = 0; x < len; x++)
444c0a13ed2Such 				*fb++ = pat;
445c0a13ed2Such 		}
446c0a13ed2Such 	}
447c0a13ed2Such 	y_start = y_end;
448c0a13ed2Such 
449c0a13ed2Such 	/*
450c0a13ed2Such 	 * Byte order test. (display 32x32 bitmap)
451c0a13ed2Such 	 */
452c0a13ed2Such 	/*
453c0a13ed2Such 	 * 16-bit access (reference)
454c0a13ed2Such 	 */
455c0a13ed2Such 	y_start = y_end;
456c0a13ed2Such 	y_end = y_start + 32;
457c0a13ed2Such 	i = 0;
458c0a13ed2Such 	fb += w / 2 - 16; /* center */
459c0a13ed2Such 	skip = w - 32;
460c0a13ed2Such 	for (y = y_start; y < y_end; y++, fb += skip)
461c0a13ed2Such 		for (x = 0; x < 32; x++)
462c0a13ed2Such 			*fb++ = rgb565_clut[img[i++]];
463c0a13ed2Such 
464c0a13ed2Such 	/*
465c0a13ed2Such 	 * 32-bit access (test)
466c0a13ed2Such 	 */
467c0a13ed2Such 	y_start = y_end;
468c0a13ed2Such 	y_end = y_start + 32;
469c0a13ed2Such 	i = 0;
470756e048eSuwe 	fb32 = (uint32_t *)fb;
471c0a13ed2Such 	skip /= 2;
472c0a13ed2Such 	for (y = y_start; y < y_end; y++, fb32 += skip)
473c0a13ed2Such 		for (x = 0; x < 16; x++, i += 2)
474c0a13ed2Such 			*fb32++ = (rgb565_clut[img[i + 1]] << 16) |
475c0a13ed2Such 			    rgb565_clut[img[i]];
476c0a13ed2Such }
477c0a13ed2Such 
478c0a13ed2Such int
bootinfo_fb_depth(void)479*df7f595eScegger bootinfo_fb_depth(void)
480c0a13ed2Such {
481c0a13ed2Such 
482c0a13ed2Such 	switch (bootinfo->fb_type) {
483c0a13ed2Such 	case BIFB_D2_M2L_3:
484c0a13ed2Such 		/* FALLTHROUGH */
485c0a13ed2Such 	case BIFB_D2_M2L_0:
486c0a13ed2Such 		return (2);
487c0a13ed2Such 	case BIFB_D4_M2L_F:
488c0a13ed2Such 		/* FALLTHROUGH */
489c0a13ed2Such 	case BIFB_D4_M2L_0:
490c0a13ed2Such 		return (4);
491c0a13ed2Such 	case BIFB_D8_FF:
492c0a13ed2Such 		/* FALLTHROUGH */
493c0a13ed2Such 	case BIFB_D8_00:
494c0a13ed2Such 		return (8);
495c0a13ed2Such 	case BIFB_D16_FFFF:
496c0a13ed2Such 		/* FALLTHROUGH */
497c0a13ed2Such 	case BIFB_D16_0000:
498c0a13ed2Such 		return (16);
499c0a13ed2Such 	}
500c0a13ed2Such 
501c0a13ed2Such 	return (0);
502c0a13ed2Such }
503c0a13ed2Such 
504c0a13ed2Such #endif /* HPC_DEBUG_LCD */
505