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