Import 2.3.18pre1
[davej-history.git] / arch / ppc / kernel / prom.c
bloba7859ca9a603a6e26c2f2ba6b75dd023d4bcb0f2
1 /*
2 * $Id: prom.c,v 1.73 1999/09/05 11:56:32 paulus Exp $
4 * Procedures for interfacing to the Open Firmware PROM on
5 * Power Macintosh computers.
7 * In particular, we are interested in the device tree
8 * and in using some of its services (exit, write to stdout).
10 * Paul Mackerras August 1996.
11 * Copyright (C) 1996 Paul Mackerras.
13 #include <stdarg.h>
14 #include <linux/config.h>
15 #include <linux/kernel.h>
16 #include <linux/string.h>
17 #include <linux/init.h>
18 #include <linux/version.h>
19 #include <linux/threads.h>
20 #include <linux/spinlock.h>
22 #include <asm/init.h>
23 #include <asm/prom.h>
24 #include <asm/page.h>
25 #include <asm/processor.h>
26 #include <asm/irq.h>
27 #include <asm/io.h>
28 #include <asm/smp.h>
29 #include <asm/bootx.h>
30 #include <asm/system.h>
31 #include <asm/gemini.h>
34 * Properties whose value is longer than this get excluded from our
35 * copy of the device tree. This way we don't waste space storing
36 * things like "driver,AAPL,MacOS,PowerPC" properties.
38 #define MAX_PROPERTY_LENGTH 1024
40 struct prom_args {
41 const char *service;
42 int nargs;
43 int nret;
44 void *args[10];
47 struct pci_address {
48 unsigned a_hi;
49 unsigned a_mid;
50 unsigned a_lo;
53 struct pci_reg_property {
54 struct pci_address addr;
55 unsigned size_hi;
56 unsigned size_lo;
59 struct pci_range {
60 struct pci_address addr;
61 unsigned phys;
62 unsigned size_hi;
63 unsigned size_lo;
66 struct isa_reg_property {
67 unsigned space;
68 unsigned address;
69 unsigned size;
72 struct pci_intr_map {
73 struct pci_address addr;
74 unsigned dunno;
75 phandle int_ctrler;
76 unsigned intr;
79 typedef unsigned long interpret_func(struct device_node *, unsigned long);
80 static interpret_func interpret_pci_props;
81 static interpret_func interpret_dbdma_props;
82 static interpret_func interpret_isa_props;
83 static interpret_func interpret_macio_props;
84 static interpret_func interpret_root_props;
86 #ifndef FB_MAX /* avoid pulling in all of the fb stuff */
87 #define FB_MAX 8
88 #endif
89 char *prom_display_paths[FB_MAX] __initdata = { 0, };
90 unsigned int prom_num_displays = 0;
91 char *of_stdout_device = 0;
93 prom_entry prom = 0;
94 ihandle prom_chosen = 0, prom_stdout = 0;
96 extern char *klimit;
97 char *bootpath = 0;
98 char *bootdevice = 0;
100 unsigned int rtas_data = 0; /* virtual pointer */
101 unsigned int rtas_entry = 0; /* physical pointer */
102 unsigned int rtas_size = 0;
103 unsigned int old_rtas = 0;
105 static struct device_node *allnodes = 0;
107 static void clearscreen(void);
108 static void flushscreen(void);
110 #ifdef CONFIG_BOOTX_TEXT
112 static void drawchar(char c);
113 static void drawhex(unsigned long v);
114 static void drawstring(const char *c);
115 static void scrollscreen(void);
117 static void draw_byte(unsigned char c, long locX, long locY);
118 static void draw_byte_32(unsigned char *bits, unsigned long *base);
119 static void draw_byte_16(unsigned char *bits, unsigned long *base);
120 static void draw_byte_8(unsigned char *bits, unsigned long *base);
122 static long g_loc_X;
123 static long g_loc_Y;
124 static long g_max_loc_X;
125 static long g_max_loc_Y;
127 #define cmapsz (16*256)
129 static unsigned char vga_font[cmapsz];
131 #endif
134 static void *call_prom(const char *service, int nargs, int nret, ...);
135 static void prom_exit(void);
136 static unsigned long copy_device_tree(unsigned long, unsigned long);
137 static unsigned long inspect_node(phandle, struct device_node *, unsigned long,
138 unsigned long, struct device_node ***);
139 static unsigned long finish_node(struct device_node *, unsigned long,
140 interpret_func *);
141 static void relocate_nodes(void);
142 static unsigned long check_display(unsigned long);
143 static int prom_next_node(phandle *);
144 static void *early_get_property(unsigned long, unsigned long, char *);
146 extern void enter_rtas(void *);
147 extern unsigned long reloc_offset(void);
149 extern char cmd_line[512]; /* XXX */
150 boot_infos_t *boot_infos = 0; /* init it so it's in data segment not bss */
153 * prom_init() is called very early on, before the kernel text
154 * and data have been mapped to KERNELBASE. At this point the code
155 * is running at whatever address it has been loaded at, so
156 * references to extern and static variables must be relocated
157 * explicitly. The procedure reloc_offset() returns the address
158 * we're currently running at minus the address we were linked at.
159 * (Note that strings count as static variables.)
161 * Because OF may have mapped I/O devices into the area starting at
162 * KERNELBASE, particularly on CHRP machines, we can't safely call
163 * OF once the kernel has been mapped to KERNELBASE. Therefore all
164 * OF calls should be done within prom_init(), and prom_init()
165 * and all routines called within it must be careful to relocate
166 * references as necessary.
168 * Note that the bss is cleared *after* prom_init runs, so we have
169 * to make sure that any static or extern variables it accesses
170 * are put in the data segment.
172 #define PTRRELOC(x) ((typeof(x))((unsigned long)(x) + offset))
173 #define PTRUNRELOC(x) ((typeof(x))((unsigned long)(x) - offset))
174 #define RELOC(x) (*PTRRELOC(&(x)))
176 #define ALIGN(x) (((x) + sizeof(unsigned long)-1) & -sizeof(unsigned long))
178 /* Is boot-info compatible ? */
179 #define BOOT_INFO_IS_COMPATIBLE(bi) ((bi)->compatible_version <= BOOT_INFO_VERSION)
180 #define BOOT_INFO_IS_V2_COMPATIBLE(bi) ((bi)->version >= 2)
181 #define BOOT_INFO_IS_V4_COMPATIBLE(bi) ((bi)->version >= 4)
183 __init
184 static void
185 prom_exit()
187 struct prom_args args;
188 unsigned long offset = reloc_offset();
190 args.service = "exit";
191 args.nargs = 0;
192 args.nret = 0;
193 RELOC(prom)(&args);
194 for (;;) /* should never get here */
198 __init
199 void
200 prom_enter(void)
202 struct prom_args args;
203 unsigned long offset = reloc_offset();
205 args.service = RELOC("enter");
206 args.nargs = 0;
207 args.nret = 0;
208 RELOC(prom)(&args);
211 __init
212 static void *
213 call_prom(const char *service, int nargs, int nret, ...)
215 va_list list;
216 int i;
217 unsigned long offset = reloc_offset();
218 struct prom_args prom_args;
220 prom_args.service = service;
221 prom_args.nargs = nargs;
222 prom_args.nret = nret;
223 va_start(list, nret);
224 for (i = 0; i < nargs; ++i)
225 prom_args.args[i] = va_arg(list, void *);
226 va_end(list);
227 for (i = 0; i < nret; ++i)
228 prom_args.args[i + nargs] = 0;
229 RELOC(prom)(&prom_args);
230 return prom_args.args[nargs];
233 __init
234 void
235 prom_print(const char *msg)
237 const char *p, *q;
238 unsigned long offset = reloc_offset();
240 if (RELOC(prom_stdout) == 0)
242 #ifdef CONFIG_BOOTX_TEXT
243 if (RELOC(boot_infos) != 0)
244 drawstring(msg);
245 #endif
246 return;
250 for (p = msg; *p != 0; p = q) {
251 for (q = p; *q != 0 && *q != '\n'; ++q)
253 if (q > p)
254 call_prom(RELOC("write"), 3, 1, RELOC(prom_stdout),
255 p, q - p);
256 if (*q != 0) {
257 ++q;
258 call_prom(RELOC("write"), 3, 1, RELOC(prom_stdout),
259 RELOC("\r\n"), 2);
264 unsigned long smp_ibm_chrp_hack __initdata = 0;
265 unsigned long smp_chrp_cpu_nr __initdata = 1;
268 * We enter here early on, when the Open Firmware prom is still
269 * handling exceptions and the MMU hash table for us.
271 __init
272 void
273 prom_init(int r3, int r4, prom_entry pp)
275 #ifdef CONFIG_SMP
276 int i;
277 phandle node;
278 char type[16], *path;
279 #endif
280 unsigned long mem;
281 ihandle prom_rtas;
282 unsigned long offset = reloc_offset();
283 int l;
284 char *p, *d;
286 #ifdef CONFIG_GEMINI
287 gemini_prom_init();
288 return;
289 #endif /* CONFIG_GEMINI */
291 /* check if we're apus, return if we are */
292 if ( r3 == 0x61707573 )
293 return;
295 /* If we came here from BootX, clear the screen,
296 * set up some pointers and return. */
297 if (r3 == 0x426f6f58 && pp == NULL) {
298 boot_infos_t *bi = (boot_infos_t *) r4;
299 unsigned long space;
300 unsigned long ptr, x;
301 char *model;
302 #ifdef CONFIG_BOOTX_TEXT
303 unsigned long flags;
304 #endif
306 RELOC(boot_infos) = PTRUNRELOC(bi);
308 clearscreen();
310 #ifdef CONFIG_BOOTX_TEXT
311 RELOC(g_loc_X) = 0;
312 RELOC(g_loc_Y) = 0;
313 RELOC(g_max_loc_X) = (bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) / 8;
314 RELOC(g_max_loc_Y) = (bi->dispDeviceRect[3] - bi->dispDeviceRect[1]) / 16;
316 /* Test if boot-info is compatible. Done only in config CONFIG_BOOTX_TEXT since
317 there is nothing much we can do with an incompatible version, except display
318 a message and eventually hang the processor...
320 I'll try to keep enough of boot-info compatible in the future to always allow
321 display of this message;
323 if (!BOOT_INFO_IS_COMPATIBLE(bi))
324 prom_print(RELOC(" !!! WARNING - Incompatible version of BootX !!!\n\n\n"));
326 prom_print(RELOC("Welcome to Linux, kernel " UTS_RELEASE "\n"));
327 prom_print(RELOC("\nstarted at : 0x"));
328 drawhex(reloc_offset() + KERNELBASE);
329 prom_print(RELOC("\nlinked at : 0x"));
330 drawhex(KERNELBASE);
331 prom_print(RELOC("\nframe buffer at : 0x"));
332 drawhex((unsigned long)bi->dispDeviceBase);
333 prom_print(RELOC(" (phys), 0x"));
334 drawhex((unsigned long)bi->logicalDisplayBase);
335 prom_print(RELOC(" (log)"));
336 prom_print(RELOC("\nMSR : 0x"));
337 __asm__ __volatile__ ("mfmsr %0" : "=r" ((flags)) : : "memory");
338 drawhex(flags);
339 prom_print(RELOC("\n\n"));
340 #endif
341 /* Out of the #if/#endif since it flushes the clearscreen too */
342 flushscreen();
344 /* New BootX enters kernel with MMU off, i/os are not allowed
345 here. This hack will have been done by the boostrap anyway.
347 if (bi->version < 4) {
349 * XXX If this is an iMac, turn off the USB controller.
351 model = (char *) early_get_property
352 (r4 + bi->deviceTreeOffset, 4, RELOC("model"));
353 if (model
354 && (strcmp(model, RELOC("iMac,1")) == 0
355 || strcmp(model, RELOC("PowerMac1,1")) == 0)) {
356 out_le32((unsigned *)0x80880008, 1); /* XXX */
360 space = bi->deviceTreeOffset + bi->deviceTreeSize;
361 if (bi->ramDisk)
362 space = bi->ramDisk + bi->ramDiskSize;
363 RELOC(klimit) = PTRUNRELOC((char *) bi + space);
365 /* New BootX will have flushed all TLBs and enters kernel with
366 MMU switched OFF, so this should not be useful anymore.
368 if (bi->version < 4) {
370 * Touch each page to make sure the PTEs for them
371 * are in the hash table - the aim is to try to avoid
372 * getting DSI exceptions while copying the kernel image.
374 for (ptr = (KERNELBASE + offset) & PAGE_MASK;
375 ptr < (unsigned long)bi + space; ptr += PAGE_SIZE)
376 x = *(volatile unsigned long *)ptr;
379 #ifdef CONFIG_BOOTX_TEXT
380 prom_print(RELOC("booting...\n"));
381 flushscreen();
382 #endif
383 return;
386 /* check if we're prep, return if we are */
387 if ( *(unsigned long *)(0) == 0xdeadc0de )
388 return;
390 /* First get a handle for the stdout device */
391 RELOC(prom) = pp;
392 RELOC(prom_chosen) = call_prom(RELOC("finddevice"), 1, 1,
393 RELOC("/chosen"));
394 if (RELOC(prom_chosen) == (void *)-1)
395 prom_exit();
396 if ((int) call_prom(RELOC("getprop"), 4, 1, RELOC(prom_chosen),
397 RELOC("stdout"), &RELOC(prom_stdout),
398 sizeof(prom_stdout)) <= 0)
399 prom_exit();
401 /* Get the full OF pathname of the stdout device */
402 mem = (unsigned long) RELOC(klimit) + offset;
403 p = (char *) mem;
404 memset(p, 0, 256);
405 call_prom(RELOC("instance-to-path"), 3, 1, RELOC(prom_stdout), p, 255);
406 RELOC(of_stdout_device) = PTRUNRELOC(p);
407 mem += strlen(p) + 1;
409 /* Get the boot device and translate it to a full OF pathname. */
410 p = (char *) mem;
411 l = (int) call_prom(RELOC("getprop"), 4, 1, RELOC(prom_chosen),
412 RELOC("bootpath"), p, 1<<20);
413 if (l > 0) {
414 p[l] = 0; /* should already be null-terminated */
415 RELOC(bootpath) = PTRUNRELOC(p);
416 mem += l + 1;
417 d = (char *) mem;
418 *d = 0;
419 call_prom(RELOC("canon"), 3, 1, p, d, 1<<20);
420 RELOC(bootdevice) = PTRUNRELOC(d);
421 mem = ALIGN(mem + strlen(d) + 1);
424 mem = check_display(mem);
426 prom_print(RELOC("copying OF device tree..."));
427 mem = copy_device_tree(mem, mem + (1<<20));
428 prom_print(RELOC("done\n"));
431 RELOC(klimit) = (char *) (mem - offset);
433 prom_rtas = call_prom(RELOC("finddevice"), 1, 1, RELOC("/rtas"));
434 if (prom_rtas != (void *) -1) {
435 RELOC(rtas_size) = 0;
436 call_prom(RELOC("getprop"), 4, 1, prom_rtas,
437 RELOC("rtas-size"), &RELOC(rtas_size), sizeof(rtas_size));
438 prom_print(RELOC("instantiating rtas..."));
439 if (RELOC(rtas_size) == 0) {
440 RELOC(rtas_data) = 0;
441 } else {
443 * We do _not_ want the rtas_data inside the klimit
444 * boundry since it'll be squashed when we do the
445 * relocate of the kernel on chrp right after prom_init()
446 * in head.S. So, we just pick a spot in memory.
447 * -- Cort
449 #if 0
450 mem = (mem + 4095) & -4096;
451 RELOC(rtas_data) = mem + KERNELBASE;
452 mem += RELOC(rtas_size);
453 #endif
454 RELOC(rtas_data) = (6<<20) + KERNELBASE;
456 prom_rtas = call_prom(RELOC("open"), 1, 1, RELOC("/rtas"));
458 int i, nargs;
459 struct prom_args prom_args;
460 nargs = 3;
461 prom_args.service = RELOC("call-method");
462 prom_args.nargs = nargs;
463 prom_args.nret = 2;
464 prom_args.args[0] = RELOC("instantiate-rtas");
465 prom_args.args[1] = prom_rtas;
466 prom_args.args[2] = ((void *)(RELOC(rtas_data)-KERNELBASE));
467 RELOC(prom)(&prom_args);
468 if (prom_args.args[nargs] != 0)
469 i = 0;
470 else
471 i = (int)prom_args.args[nargs+1];
472 RELOC(rtas_entry) = i;
474 if ((RELOC(rtas_entry) == -1) || (RELOC(rtas_entry) == 0))
475 prom_print(RELOC(" failed\n"));
476 else
477 prom_print(RELOC(" done\n"));
480 #ifdef CONFIG_SMP
482 * With CHRP SMP we need to use the OF to start the other
483 * processors so we can't wait until smp_boot_cpus (the OF is
484 * trashed by then) so we have to put the processors into
485 * a holding pattern controlled by the kernel (not OF) before
486 * we destroy the OF.
488 * This uses a chunk of high memory, puts some holding pattern
489 * code there and sends the other processors off to there until
490 * smp_boot_cpus tells them to do something. We do that by using
491 * physical address 0x0. The holding pattern checks that address
492 * until its cpu # is there, when it is that cpu jumps to
493 * __secondary_start(). smp_boot_cpus() takes care of setting those
494 * values.
496 * We also use physical address 0x4 here to tell when a cpu
497 * is in its holding pattern code.
499 * -- Cort
502 extern void __secondary_hold(void);
503 unsigned long i;
504 char type[16];
508 * XXX: hack to make sure we're chrp, assume that if we're
509 * chrp we have a device_type property -- Cort
511 node = call_prom(RELOC("finddevice"), 1, 1, RELOC("/"));
512 if ( (int)call_prom(RELOC("getprop"), 4, 1, node,
513 RELOC("device_type"),type, sizeof(type)) <= 0)
514 return;
516 /* copy the holding pattern code to someplace safe (8M) */
517 memcpy( (void *)(8<<20), RELOC(__secondary_hold), 0x100 );
518 for (i = 8<<20; i < ((8<<20)+0x100); i += 32)
520 asm volatile("dcbf 0,%0" : : "r" (i) : "memory");
521 asm volatile("icbi 0,%0" : : "r" (i) : "memory");
525 /* look for cpus */
526 for (node = 0; prom_next_node(&node);)
528 type[0] = 0;
529 call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"),
530 type, sizeof(type));
531 if (strcmp(type, RELOC("cpu")) != 0)
532 continue;
533 path = (char *) mem;
534 memset(path, 0, 256);
535 if ((int) call_prom(RELOC("package-to-path"), 3, 1,
536 node, path, 255) < 0)
537 continue;
538 /* XXX: hack - don't start cpu 0, this cpu -- Cort */
539 if ( smp_chrp_cpu_nr++ == 0 )
540 continue;
541 RELOC(smp_ibm_chrp_hack) = 1;
542 prom_print(RELOC("starting cpu "));
543 prom_print(path);
544 *(unsigned long *)(0x4) = 0;
545 asm volatile("dcbf 0,%0": : "r" (0x4) : "memory");
546 call_prom(RELOC("start-cpu"), 3, 0, node, 8<<20, smp_chrp_cpu_nr-1);
547 for ( i = 0 ; (i < 10000) &&
548 (*(ulong *)(0x4) == (ulong)0); i++ )
550 if (*(ulong *)(0x4) == (ulong)smp_chrp_cpu_nr-1 )
551 prom_print(RELOC("...ok\n"));
552 else
553 prom_print(RELOC("...failed\n"));
555 #endif
559 * If we have a display that we don't know how to drive,
560 * we will want to try to execute OF's open method for it
561 * later. However, OF will probably fall over if we do that
562 * we've taken over the MMU.
563 * So we check whether we will need to open the display,
564 * and if so, open it now.
566 __init
567 static unsigned long
568 check_display(unsigned long mem)
570 phandle node;
571 ihandle ih;
572 int i;
573 unsigned long offset = reloc_offset();
574 char type[16], *path;
576 for (node = 0; prom_next_node(&node); ) {
577 type[0] = 0;
578 call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"),
579 type, sizeof(type));
580 if (strcmp(type, RELOC("display")) != 0)
581 continue;
582 /* It seems OF doesn't null-terminate the path :-( */
583 path = (char *) mem;
584 memset(path, 0, 256);
585 if ((int) call_prom(RELOC("package-to-path"), 3, 1,
586 node, path, 255) < 0)
587 continue;
588 prom_print(RELOC("opening display "));
589 prom_print(path);
590 ih = call_prom(RELOC("open"), 1, 1, path);
591 if (ih == 0 || ih == (ihandle) -1) {
592 prom_print(RELOC("... failed\n"));
593 continue;
595 prom_print(RELOC("... ok\n"));
598 * If this display is the device that OF is using for stdout,
599 * move it to the front of the list.
601 mem += strlen(path) + 1;
602 i = RELOC(prom_num_displays)++;
603 if (RELOC(of_stdout_device) != 0 && i > 0
604 && strcmp(PTRRELOC(RELOC(of_stdout_device)), path) == 0) {
605 for (; i > 0; --i)
606 RELOC(prom_display_paths[i])
607 = RELOC(prom_display_paths[i-1]);
609 RELOC(prom_display_paths[i]) = PTRUNRELOC(path);
610 if (RELOC(prom_num_displays) >= FB_MAX)
611 break;
613 return ALIGN(mem);
616 __init
617 static int
618 prom_next_node(phandle *nodep)
620 phandle node;
621 unsigned long offset = reloc_offset();
623 if ((node = *nodep) != 0
624 && (*nodep = call_prom(RELOC("child"), 1, 1, node)) != 0)
625 return 1;
626 if ((*nodep = call_prom(RELOC("peer"), 1, 1, node)) != 0)
627 return 1;
628 for (;;) {
629 if ((node = call_prom(RELOC("parent"), 1, 1, node)) == 0)
630 return 0;
631 if ((*nodep = call_prom(RELOC("peer"), 1, 1, node)) != 0)
632 return 1;
637 * Make a copy of the device tree from the PROM.
639 __init
640 static unsigned long
641 copy_device_tree(unsigned long mem_start, unsigned long mem_end)
643 phandle root;
644 unsigned long new_start;
645 struct device_node **allnextp;
646 unsigned long offset = reloc_offset();
648 root = call_prom(RELOC("peer"), 1, 1, (phandle)0);
649 if (root == (phandle)0) {
650 prom_print(RELOC("couldn't get device tree root\n"));
651 prom_exit();
653 allnextp = &RELOC(allnodes);
654 mem_start = ALIGN(mem_start);
655 new_start = inspect_node(root, 0, mem_start, mem_end, &allnextp);
656 *allnextp = 0;
657 return new_start;
660 __init
661 static unsigned long
662 inspect_node(phandle node, struct device_node *dad,
663 unsigned long mem_start, unsigned long mem_end,
664 struct device_node ***allnextpp)
666 int l;
667 phandle child;
668 struct device_node *np;
669 struct property *pp, **prev_propp;
670 char *prev_name, *namep;
671 unsigned char *valp;
672 unsigned long offset = reloc_offset();
674 np = (struct device_node *) mem_start;
675 mem_start += sizeof(struct device_node);
676 memset(np, 0, sizeof(*np));
677 np->node = node;
678 **allnextpp = PTRUNRELOC(np);
679 *allnextpp = &np->allnext;
680 if (dad != 0) {
681 np->parent = PTRUNRELOC(dad);
682 /* we temporarily use the `next' field as `last_child'. */
683 if (dad->next == 0)
684 dad->child = PTRUNRELOC(np);
685 else
686 dad->next->sibling = PTRUNRELOC(np);
687 dad->next = np;
690 /* get and store all properties */
691 prev_propp = &np->properties;
692 prev_name = RELOC("");
693 for (;;) {
694 pp = (struct property *) mem_start;
695 namep = (char *) (pp + 1);
696 pp->name = PTRUNRELOC(namep);
697 if ((int) call_prom(RELOC("nextprop"), 3, 1, node, prev_name,
698 namep) <= 0)
699 break;
700 mem_start = ALIGN((unsigned long)namep + strlen(namep) + 1);
701 prev_name = namep;
702 valp = (unsigned char *) mem_start;
703 pp->value = PTRUNRELOC(valp);
704 pp->length = (int)
705 call_prom(RELOC("getprop"), 4, 1, node, namep,
706 valp, mem_end - mem_start);
707 if (pp->length < 0)
708 continue;
709 #ifdef MAX_PROPERTY_LENGTH
710 if (pp->length > MAX_PROPERTY_LENGTH)
711 continue; /* ignore this property */
712 #endif
713 mem_start = ALIGN(mem_start + pp->length);
714 *prev_propp = PTRUNRELOC(pp);
715 prev_propp = &pp->next;
717 *prev_propp = 0;
719 /* get the node's full name */
720 l = (int) call_prom(RELOC("package-to-path"), 3, 1, node,
721 (char *) mem_start, mem_end - mem_start);
722 if (l >= 0) {
723 np->full_name = PTRUNRELOC((char *) mem_start);
724 *(char *)(mem_start + l) = 0;
725 mem_start = ALIGN(mem_start + l + 1);
728 /* do all our children */
729 child = call_prom(RELOC("child"), 1, 1, node);
730 while (child != (void *)0) {
731 mem_start = inspect_node(child, np, mem_start, mem_end,
732 allnextpp);
733 child = call_prom(RELOC("peer"), 1, 1, child);
736 return mem_start;
740 * finish_device_tree is called once things are running normally
741 * (i.e. with text and data mapped to the address they were linked at).
742 * It traverses the device tree and fills in the name, type,
743 * {n_}addrs and {n_}intrs fields of each node.
745 __init
746 void
747 finish_device_tree(void)
749 unsigned long mem = (unsigned long) klimit;
751 if (boot_infos)
752 relocate_nodes();
753 mem = finish_node(allnodes, mem, NULL);
754 printk(KERN_INFO "device tree used %lu bytes\n",
755 mem - (unsigned long) allnodes);
756 klimit = (char *) mem;
760 * early_get_property is used to access the device tree image prepared
761 * by BootX very early on, before the pointers in it have been relocated.
763 __init void *
764 early_get_property(unsigned long base, unsigned long node, char *prop)
766 struct device_node *np = (struct device_node *)(base + node);
767 struct property *pp;
769 for (pp = np->properties; pp != 0; pp = pp->next) {
770 pp = (struct property *) (base + (unsigned long)pp);
771 if (strcmp((char *)((unsigned long)pp->name + base),
772 prop) == 0) {
773 return (void *)((unsigned long)pp->value + base);
776 return 0;
779 __init
780 static unsigned long
781 finish_node(struct device_node *np, unsigned long mem_start,
782 interpret_func *ifunc)
784 struct device_node *child;
786 np->name = get_property(np, "name", 0);
787 np->type = get_property(np, "device_type", 0);
789 /* get the device addresses and interrupts */
790 if (ifunc != NULL) {
791 mem_start = ifunc(np, mem_start);
794 /* the f50 sets the name to 'display' and 'compatible' to what we
795 * expect for the name -- Cort
797 if (!strcmp(np->name, "display"))
798 np->name = get_property(np, "compatible", 0);
800 if (!strcmp(np->name, "device-tree"))
801 ifunc = interpret_root_props;
802 else if (np->type == 0)
803 ifunc = NULL;
804 else if (!strcmp(np->type, "pci") || !strcmp(np->type, "vci"))
805 ifunc = interpret_pci_props;
806 else if (!strcmp(np->type, "dbdma"))
807 ifunc = interpret_dbdma_props;
808 else if (!strcmp(np->type, "mac-io")
809 || ifunc == interpret_macio_props)
810 ifunc = interpret_macio_props;
811 else if (!strcmp(np->type, "isa"))
812 ifunc = interpret_isa_props;
813 else if (!((ifunc == interpret_dbdma_props
814 || ifunc == interpret_macio_props)
815 && (!strcmp(np->type, "escc")
816 || !strcmp(np->type, "media-bay"))))
817 ifunc = NULL;
819 /* if we were booted from BootX, convert the full name */
820 if (boot_infos
821 && strncmp(np->full_name, "Devices:device-tree", 19) == 0) {
822 if (np->full_name[19] == 0) {
823 strcpy(np->full_name, "/");
824 } else if (np->full_name[19] == ':') {
825 char *p = np->full_name + 19;
826 np->full_name = p;
827 for (; *p; ++p)
828 if (*p == ':')
829 *p = '/';
833 for (child = np->child; child != NULL; child = child->sibling)
834 mem_start = finish_node(child, mem_start, ifunc);
836 return mem_start;
840 * When BootX makes a copy of the device tree from the MacOS
841 * Name Registry, it is in the format we use but all of the pointers
842 * are offsets from the start of the tree.
843 * This procedure updates the pointers.
845 __init
846 static void relocate_nodes(void)
848 unsigned long base;
849 struct device_node *np;
850 struct property *pp;
852 #define ADDBASE(x) (x = (x)? ((typeof (x))((unsigned long)(x) + base)): 0)
854 base = (unsigned long) boot_infos + boot_infos->deviceTreeOffset;
855 allnodes = (struct device_node *)(base + 4);
856 for (np = allnodes; np != 0; np = np->allnext) {
857 ADDBASE(np->full_name);
858 ADDBASE(np->properties);
859 ADDBASE(np->parent);
860 ADDBASE(np->child);
861 ADDBASE(np->sibling);
862 ADDBASE(np->allnext);
863 for (pp = np->properties; pp != 0; pp = pp->next) {
864 ADDBASE(pp->name);
865 ADDBASE(pp->value);
866 ADDBASE(pp->next);
871 __init
872 static unsigned long
873 interpret_pci_props(struct device_node *np, unsigned long mem_start)
875 struct address_range *adr;
876 struct pci_reg_property *pci_addrs;
877 int i, l, *ip, ml;
878 struct pci_intr_map *imp;
880 pci_addrs = (struct pci_reg_property *)
881 get_property(np, "assigned-addresses", &l);
882 if (pci_addrs != 0 && l >= sizeof(struct pci_reg_property)) {
883 i = 0;
884 adr = (struct address_range *) mem_start;
885 while ((l -= sizeof(struct pci_reg_property)) >= 0) {
886 /* XXX assumes PCI addresses mapped 1-1 to physical */
887 adr[i].space = pci_addrs[i].addr.a_hi;
888 adr[i].address = pci_addrs[i].addr.a_lo;
889 adr[i].size = pci_addrs[i].size_lo;
890 ++i;
892 np->addrs = adr;
893 np->n_addrs = i;
894 mem_start += i * sizeof(struct address_range);
898 * If the pci host bridge has an interrupt-map property,
899 * look for our node in it.
901 if (np->parent != 0 && pci_addrs != 0
902 && (imp = (struct pci_intr_map *)
903 get_property(np->parent, "interrupt-map", &ml)) != 0
904 && (ip = (int *) get_property(np, "interrupts", &l)) != 0) {
905 unsigned int devfn = pci_addrs[0].addr.a_hi & 0xff00;
906 np->n_intrs = 0;
907 np->intrs = (struct interrupt_info *) mem_start;
908 for (i = 0; (ml -= sizeof(struct pci_intr_map)) >= 0; ++i) {
909 if (imp[i].addr.a_hi == devfn) {
910 np->intrs[np->n_intrs].line = imp[i].intr;
911 np->intrs[np->n_intrs].sense = 0;
912 ++np->n_intrs;
915 if (np->n_intrs == 0)
916 np->intrs = 0;
917 mem_start += np->n_intrs * sizeof(struct interrupt_info);
918 return mem_start;
921 ip = (int *) get_property(np, "AAPL,interrupts", &l);
922 if (ip == 0)
923 ip = (int *) get_property(np, "interrupts", &l);
924 if (ip != 0) {
925 np->intrs = (struct interrupt_info *) mem_start;
926 np->n_intrs = l / sizeof(int);
927 mem_start += np->n_intrs * sizeof(struct interrupt_info);
928 for (i = 0; i < np->n_intrs; ++i) {
929 np->intrs[i].line = *ip++;
930 np->intrs[i].sense = 0;
934 return mem_start;
937 __init
938 static unsigned long
939 interpret_dbdma_props(struct device_node *np, unsigned long mem_start)
941 struct reg_property *rp;
942 struct address_range *adr;
943 unsigned long base_address;
944 int i, l, *ip;
945 struct device_node *db;
947 base_address = 0;
948 for (db = np->parent; db != NULL; db = db->parent) {
949 if (!strcmp(db->type, "dbdma") && db->n_addrs != 0) {
950 base_address = db->addrs[0].address;
951 break;
955 rp = (struct reg_property *) get_property(np, "reg", &l);
956 if (rp != 0 && l >= sizeof(struct reg_property)) {
957 i = 0;
958 adr = (struct address_range *) mem_start;
959 while ((l -= sizeof(struct reg_property)) >= 0) {
960 adr[i].space = 0;
961 adr[i].address = rp[i].address + base_address;
962 adr[i].size = rp[i].size;
963 ++i;
965 np->addrs = adr;
966 np->n_addrs = i;
967 mem_start += i * sizeof(struct address_range);
970 ip = (int *) get_property(np, "AAPL,interrupts", &l);
971 if (ip == 0)
972 ip = (int *) get_property(np, "interrupts", &l);
973 if (ip != 0) {
974 np->intrs = (struct interrupt_info *) mem_start;
975 np->n_intrs = l / sizeof(int);
976 mem_start += np->n_intrs * sizeof(struct interrupt_info);
977 for (i = 0; i < np->n_intrs; ++i) {
978 np->intrs[i].line = *ip++;
979 np->intrs[i].sense = 0;
983 return mem_start;
986 __init
987 static unsigned long
988 interpret_macio_props(struct device_node *np, unsigned long mem_start)
990 struct reg_property *rp;
991 struct address_range *adr;
992 unsigned long base_address;
993 int i, l, *ip;
994 struct device_node *db;
996 base_address = 0;
997 for (db = np->parent; db != NULL; db = db->parent) {
998 if (!strcmp(db->type, "mac-io") && db->n_addrs != 0) {
999 base_address = db->addrs[0].address;
1000 break;
1004 rp = (struct reg_property *) get_property(np, "reg", &l);
1005 if (rp != 0 && l >= sizeof(struct reg_property)) {
1006 i = 0;
1007 adr = (struct address_range *) mem_start;
1008 while ((l -= sizeof(struct reg_property)) >= 0) {
1009 adr[i].space = 0;
1010 adr[i].address = rp[i].address + base_address;
1011 adr[i].size = rp[i].size;
1012 ++i;
1014 np->addrs = adr;
1015 np->n_addrs = i;
1016 mem_start += i * sizeof(struct address_range);
1019 ip = (int *) get_property(np, "interrupts", &l);
1020 if (ip == 0)
1021 ip = (int *) get_property(np, "AAPL,interrupts", &l);
1022 if (ip != 0) {
1023 np->intrs = (struct interrupt_info *) mem_start;
1024 if (_machine == _MACH_Pmac) {
1025 /* for the iMac */
1026 np->n_intrs = l / sizeof(int);
1027 for (i = 0; i < np->n_intrs; ++i) {
1028 np->intrs[i].line = *ip++;
1029 np->intrs[i].sense = 0;
1031 } else {
1032 /* CHRP machines */
1033 np->n_intrs = l / (2 * sizeof(int));
1034 for (i = 0; i < np->n_intrs; ++i) {
1035 np->intrs[i].line = openpic_to_irq(*ip++);
1036 np->intrs[i].sense = *ip++;
1039 mem_start += np->n_intrs * sizeof(struct interrupt_info);
1042 return mem_start;
1045 __init
1046 static unsigned long
1047 interpret_isa_props(struct device_node *np, unsigned long mem_start)
1049 struct isa_reg_property *rp;
1050 struct address_range *adr;
1051 int i, l, *ip;
1053 rp = (struct isa_reg_property *) get_property(np, "reg", &l);
1054 if (rp != 0 && l >= sizeof(struct isa_reg_property)) {
1055 i = 0;
1056 adr = (struct address_range *) mem_start;
1057 while ((l -= sizeof(struct reg_property)) >= 0) {
1058 adr[i].space = rp[i].space;
1059 adr[i].address = rp[i].address
1060 + (adr[i].space? 0: _ISA_MEM_BASE);
1061 adr[i].size = rp[i].size;
1062 ++i;
1064 np->addrs = adr;
1065 np->n_addrs = i;
1066 mem_start += i * sizeof(struct address_range);
1069 ip = (int *) get_property(np, "interrupts", &l);
1070 if (ip != 0) {
1071 np->intrs = (struct interrupt_info *) mem_start;
1072 np->n_intrs = l / (2 * sizeof(int));
1073 mem_start += np->n_intrs * sizeof(struct interrupt_info);
1074 for (i = 0; i < np->n_intrs; ++i) {
1075 np->intrs[i].line = *ip++;
1076 np->intrs[i].sense = *ip++;
1080 return mem_start;
1083 __init
1084 static unsigned long
1085 interpret_root_props(struct device_node *np, unsigned long mem_start)
1087 struct reg_property *rp;
1088 struct address_range *adr;
1089 int i, l, *ip;
1091 rp = (struct reg_property *) get_property(np, "reg", &l);
1092 if (rp != 0 && l >= sizeof(struct reg_property)) {
1093 i = 0;
1094 adr = (struct address_range *) mem_start;
1095 while ((l -= sizeof(struct reg_property)) >= 0) {
1096 adr[i].space = 0;
1097 adr[i].address = rp[i].address;
1098 adr[i].size = rp[i].size;
1099 ++i;
1101 np->addrs = adr;
1102 np->n_addrs = i;
1103 mem_start += i * sizeof(struct address_range);
1106 ip = (int *) get_property(np, "AAPL,interrupts", &l);
1107 if (ip == 0)
1108 ip = (int *) get_property(np, "interrupts", &l);
1109 if (ip != 0) {
1110 np->intrs = (struct interrupt_info *) mem_start;
1111 np->n_intrs = l / sizeof(int);
1112 mem_start += np->n_intrs * sizeof(struct interrupt_info);
1113 for (i = 0; i < np->n_intrs; ++i) {
1114 np->intrs[i].line = *ip++;
1115 np->intrs[i].sense = 0;
1119 return mem_start;
1123 * Construct and return a list of the device_nodes with a given name.
1125 __openfirmware
1126 struct device_node *
1127 find_devices(const char *name)
1129 struct device_node *head, **prevp, *np;
1131 prevp = &head;
1132 for (np = allnodes; np != 0; np = np->allnext) {
1133 if (np->name != 0 && strcasecmp(np->name, name) == 0) {
1134 *prevp = np;
1135 prevp = &np->next;
1138 *prevp = 0;
1139 return head;
1143 * Construct and return a list of the device_nodes with a given type.
1145 __openfirmware
1146 struct device_node *
1147 find_type_devices(const char *type)
1149 struct device_node *head, **prevp, *np;
1151 prevp = &head;
1152 for (np = allnodes; np != 0; np = np->allnext) {
1153 if (np->type != 0 && strcasecmp(np->type, type) == 0) {
1154 *prevp = np;
1155 prevp = &np->next;
1158 *prevp = 0;
1159 return head;
1162 /* Checks if the given "compat" string matches one of the strings in
1163 * the device's "compatible" property
1165 __openfirmware
1167 device_is_compatible(struct device_node *device, const char *compat)
1169 const char* cp;
1170 int cplen, l;
1172 cp = (char *) get_property(device, "compatible", &cplen);
1173 if (cp == NULL)
1174 return 0;
1175 while (cplen > 0) {
1176 if (strncasecmp(cp, compat, strlen(compat)) == 0)
1177 return 1;
1178 l = strlen(cp) + 1;
1179 cp += l;
1180 cplen -= l;
1183 return 0;
1187 * Construct and return a list of the device_nodes with a given type
1188 * and compatible property.
1190 __openfirmware
1191 struct device_node *
1192 find_compatible_devices(const char *type, const char *compat)
1194 struct device_node *head, **prevp, *np;
1196 prevp = &head;
1197 for (np = allnodes; np != 0; np = np->allnext) {
1198 if (type != NULL
1199 && !(np->type != 0 && strcasecmp(np->type, type) == 0))
1200 continue;
1201 if (device_is_compatible(np, compat)) {
1202 *prevp = np;
1203 prevp = &np->next;
1206 *prevp = 0;
1207 return head;
1211 * Find the device_node with a given full_name.
1213 __openfirmware
1214 struct device_node *
1215 find_path_device(const char *path)
1217 struct device_node *np;
1219 for (np = allnodes; np != 0; np = np->allnext)
1220 if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0)
1221 return np;
1222 return NULL;
1226 * Find the device_node with a given phandle.
1228 __openfirmware
1229 struct device_node *
1230 find_phandle(phandle ph)
1232 struct device_node *np;
1234 for (np = allnodes; np != 0; np = np->allnext)
1235 if (np->node == ph)
1236 return np;
1237 return NULL;
1241 * Find a property with a given name for a given node
1242 * and return the value.
1244 __openfirmware
1245 unsigned char *
1246 get_property(struct device_node *np, const char *name, int *lenp)
1248 struct property *pp;
1250 for (pp = np->properties; pp != 0; pp = pp->next)
1251 if (strcmp(pp->name, name) == 0) {
1252 if (lenp != 0)
1253 *lenp = pp->length;
1254 return pp->value;
1256 return 0;
1259 #if 0
1260 __openfirmware
1261 void
1262 print_properties(struct device_node *np)
1264 struct property *pp;
1265 char *cp;
1266 int i, n;
1268 for (pp = np->properties; pp != 0; pp = pp->next) {
1269 printk(KERN_INFO "%s", pp->name);
1270 for (i = strlen(pp->name); i < 16; ++i)
1271 printk(" ");
1272 cp = (char *) pp->value;
1273 for (i = pp->length; i > 0; --i, ++cp)
1274 if ((i > 1 && (*cp < 0x20 || *cp > 0x7e))
1275 || (i == 1 && *cp != 0))
1276 break;
1277 if (i == 0 && pp->length > 1) {
1278 /* looks like a string */
1279 printk(" %s\n", (char *) pp->value);
1280 } else {
1281 /* dump it in hex */
1282 n = pp->length;
1283 if (n > 64)
1284 n = 64;
1285 if (pp->length % 4 == 0) {
1286 unsigned int *p = (unsigned int *) pp->value;
1288 n /= 4;
1289 for (i = 0; i < n; ++i) {
1290 if (i != 0 && (i % 4) == 0)
1291 printk("\n ");
1292 printk(" %08x", *p++);
1294 } else {
1295 unsigned char *bp = pp->value;
1297 for (i = 0; i < n; ++i) {
1298 if (i != 0 && (i % 16) == 0)
1299 printk("\n ");
1300 printk(" %02x", *bp++);
1303 printk("\n");
1304 if (pp->length > 64)
1305 printk(" ... (length = %d)\n",
1306 pp->length);
1310 #endif
1312 /* this can be called after setup -- Cort */
1313 __openfirmware
1315 call_rtas(const char *service, int nargs, int nret,
1316 unsigned long *outputs, ...)
1318 va_list list;
1319 int i, s;
1320 struct device_node *rtas;
1321 int *tokp;
1322 union {
1323 unsigned long words[16];
1324 double align;
1325 } u;
1327 rtas = find_devices("rtas");
1328 if (rtas == NULL)
1329 return -1;
1330 tokp = (int *) get_property(rtas, service, NULL);
1331 if (tokp == NULL) {
1332 printk(KERN_ERR "No RTAS service called %s\n", service);
1333 return -1;
1335 u.words[0] = *tokp;
1336 u.words[1] = nargs;
1337 u.words[2] = nret;
1338 va_start(list, outputs);
1339 for (i = 0; i < nargs; ++i)
1340 u.words[i+3] = va_arg(list, unsigned long);
1341 va_end(list);
1343 save_flags(s);
1344 cli();
1346 enter_rtas((void *)__pa(&u));
1347 restore_flags(s);
1348 if (nret > 1 && outputs != NULL)
1349 for (i = 0; i < nret-1; ++i)
1350 outputs[i] = u.words[i+nargs+4];
1351 return u.words[nargs+3];
1354 __init
1355 void
1356 abort()
1358 #ifdef CONFIG_XMON
1359 xmon(NULL);
1360 #endif
1361 prom_exit();
1364 /* Calc the base address of a given point (x,y) */
1365 #define CALC_BASE(x,y) ((BOOT_INFO_IS_V2_COMPATIBLE(bi) ? bi->logicalDisplayBase : \
1366 bi->dispDeviceBase) + (bi->dispDeviceRect[0] + (x)) * \
1367 (bi->dispDeviceDepth >> 3) + bi->dispDeviceRowBytes * \
1368 ((y) + bi->dispDeviceRect[1]))
1370 __init
1371 static void
1372 clearscreen(void)
1374 unsigned long offset = reloc_offset();
1375 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1376 unsigned long *base = (unsigned long *)CALC_BASE(0,0);
1377 unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
1378 (bi->dispDeviceDepth >> 3)) >> 2;
1379 int i,j;
1381 for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1]); i++)
1383 unsigned long *ptr = base;
1384 for(j=width; j; --j)
1385 *(ptr++) = 0;
1386 base += (bi->dispDeviceRowBytes >> 2);
1390 __inline__ void dcbst(const void* addr)
1392 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (addr));
1395 __init
1396 static void
1397 flushscreen(void)
1399 unsigned long offset = reloc_offset();
1400 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1401 unsigned long *base = (unsigned long *)CALC_BASE(0,0);
1402 unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
1403 (bi->dispDeviceDepth >> 3)) >> 2;
1404 int i,j;
1406 for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1]); i++)
1408 unsigned long *ptr = base;
1409 for(j=width; j>0; j-=8) {
1410 dcbst(ptr);
1411 ptr += 8;
1413 base += (bi->dispDeviceRowBytes >> 2);
1417 #ifdef CONFIG_BOOTX_TEXT
1419 __init
1420 static void
1421 scrollscreen(void)
1423 unsigned long offset = reloc_offset();
1424 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1425 unsigned long *src = (unsigned long *)CALC_BASE(0,16);
1426 unsigned long *dst = (unsigned long *)CALC_BASE(0,0);
1427 unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
1428 (bi->dispDeviceDepth >> 3)) >> 2;
1429 int i,j;
1431 for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1] - 16); i++)
1433 unsigned long *src_ptr = src;
1434 unsigned long *dst_ptr = dst;
1435 for(j=width; j; --j)
1436 *(dst_ptr++) = *(src_ptr++);
1437 src += (bi->dispDeviceRowBytes >> 2);
1438 dst += (bi->dispDeviceRowBytes >> 2);
1440 for (i=0; i<16; i++)
1442 unsigned long *dst_ptr = dst;
1443 for(j=width; j; --j)
1444 *(dst_ptr++) = 0;
1445 dst += (bi->dispDeviceRowBytes >> 2);
1449 __init
1450 static void
1451 drawchar(char c)
1453 unsigned long offset = reloc_offset();
1455 switch(c) {
1456 case '\r': RELOC(g_loc_X) = 0; break;
1457 case '\n': RELOC(g_loc_X) = 0; RELOC(g_loc_Y)++; break;
1458 default:
1459 draw_byte(c, RELOC(g_loc_X)++, RELOC(g_loc_Y));
1460 if (RELOC(g_loc_X) >= RELOC(g_max_loc_X)) {
1461 RELOC(g_loc_X) = 0;
1462 RELOC(g_loc_Y)++;
1465 while (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y)) {
1466 scrollscreen();
1467 RELOC(g_loc_Y)--;
1471 __init
1472 static void
1473 drawstring(const char *c)
1475 while(*c)
1476 drawchar(*(c++));
1479 __init
1480 static void
1481 drawhex(unsigned long v)
1483 static char hex_table[] = "0123456789abcdef";
1484 unsigned long offset = reloc_offset();
1486 drawchar(RELOC(hex_table)[(v >> 28) & 0x0000000FUL]);
1487 drawchar(RELOC(hex_table)[(v >> 24) & 0x0000000FUL]);
1488 drawchar(RELOC(hex_table)[(v >> 20) & 0x0000000FUL]);
1489 drawchar(RELOC(hex_table)[(v >> 16) & 0x0000000FUL]);
1490 drawchar(RELOC(hex_table)[(v >> 12) & 0x0000000FUL]);
1491 drawchar(RELOC(hex_table)[(v >> 8) & 0x0000000FUL]);
1492 drawchar(RELOC(hex_table)[(v >> 4) & 0x0000000FUL]);
1493 drawchar(RELOC(hex_table)[(v >> 0) & 0x0000000FUL]);
1497 __init
1498 static void
1499 draw_byte(unsigned char c, long locX, long locY)
1501 unsigned long offset = reloc_offset();
1502 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1503 unsigned char *base = CALC_BASE(locX << 3, locY << 4);
1504 unsigned char *font = &RELOC(vga_font)[((unsigned long)c) * 16];
1506 switch(bi->dispDeviceDepth) {
1507 case 32:
1508 draw_byte_32(font, (unsigned long *)base);
1509 break;
1510 case 16:
1511 draw_byte_16(font, (unsigned long *)base);
1512 break;
1513 case 8:
1514 draw_byte_8(font, (unsigned long *)base);
1515 break;
1516 default:
1517 break;
1521 __init
1522 static unsigned long expand_bits_8[16] = {
1523 0x00000000,
1524 0x000000ff,
1525 0x0000ff00,
1526 0x0000ffff,
1527 0x00ff0000,
1528 0x00ff00ff,
1529 0x00ffff00,
1530 0x00ffffff,
1531 0xff000000,
1532 0xff0000ff,
1533 0xff00ff00,
1534 0xff00ffff,
1535 0xffff0000,
1536 0xffff00ff,
1537 0xffffff00,
1538 0xffffffff
1541 __init
1542 static unsigned long expand_bits_16[4] = {
1543 0x00000000,
1544 0x0000ffff,
1545 0xffff0000,
1546 0xffffffff
1550 __init
1551 static void
1552 draw_byte_32(unsigned char *font, unsigned long *base)
1554 unsigned long offset = reloc_offset();
1555 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1556 int l, bits;
1557 int fg = 0xFFFFFFFFUL;
1558 int bg = 0x00000000UL;
1561 for (l = 0; l < 16; ++l)
1563 bits = *font++;
1564 base[0] = (-(bits >> 7) & fg) ^ bg;
1565 base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
1566 base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
1567 base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
1568 base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
1569 base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
1570 base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
1571 base[7] = (-(bits & 1) & fg) ^ bg;
1572 base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
1576 __init
1577 static void
1578 draw_byte_16(unsigned char *font, unsigned long *base)
1580 unsigned long offset = reloc_offset();
1581 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1582 int l, bits;
1583 int fg = 0xFFFFFFFFUL;
1584 int bg = 0x00000000UL;
1585 unsigned long *eb = RELOC(expand_bits_16);
1587 for (l = 0; l < 16; ++l)
1589 bits = *font++;
1590 base[0] = (eb[bits >> 6] & fg) ^ bg;
1591 base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
1592 base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
1593 base[3] = (eb[bits & 3] & fg) ^ bg;
1594 base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
1598 __init
1599 static void
1600 draw_byte_8(unsigned char *font, unsigned long *base)
1602 unsigned long offset = reloc_offset();
1603 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1604 int l, bits;
1605 int fg = 0x0F0F0F0FUL;
1606 int bg = 0x00000000UL;
1607 unsigned long *eb = RELOC(expand_bits_8);
1609 for (l = 0; l < 16; ++l)
1611 bits = *font++;
1612 base[0] = (eb[bits >> 4] & fg) ^ bg;
1613 base[1] = (eb[bits & 0xf] & fg) ^ bg;
1614 base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
1618 __init
1619 static unsigned char vga_font[cmapsz] = {
1620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
1622 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
1623 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
1624 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
1626 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1627 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1628 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
1629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
1630 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
1631 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1632 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
1633 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
1634 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
1635 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
1636 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
1637 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
1638 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
1639 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
1640 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
1641 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
1642 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
1643 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1644 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
1645 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1646 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
1647 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
1648 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
1649 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1650 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
1651 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
1652 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1654 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1655 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1656 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
1657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
1658 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1659 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1660 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
1661 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
1662 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1664 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
1665 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
1666 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
1667 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
1668 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
1669 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
1670 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
1671 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1672 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
1674 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
1675 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1676 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
1677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
1678 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1679 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
1680 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
1681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1682 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1683 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
1685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
1686 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1687 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
1688 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
1689 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
1690 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
1691 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1692 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
1694 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1695 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1696 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
1697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1698 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1699 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1700 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
1701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
1702 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
1703 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1704 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
1705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
1706 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
1707 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1708 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
1709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
1710 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
1711 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
1712 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
1713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
1714 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
1715 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
1716 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
1718 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
1719 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
1720 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
1721 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
1722 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
1723 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
1725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1726 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
1727 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
1728 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
1729 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
1730 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1731 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1732 0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1734 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
1735 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
1736 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
1737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
1738 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
1739 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
1741 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
1742 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1743 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1744 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
1745 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
1746 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
1748 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1749 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
1750 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
1751 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
1752 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
1753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
1754 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
1757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
1758 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
1759 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
1760 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
1762 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
1763 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1765 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
1766 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1767 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1768 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
1770 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
1771 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
1772 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
1773 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
1774 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
1775 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
1776 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
1778 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1779 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
1780 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
1781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
1782 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
1783 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
1784 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
1785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1786 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
1787 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1788 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
1790 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
1791 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
1792 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1793 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
1794 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
1795 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1796 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
1797 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
1798 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
1799 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1800 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
1801 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
1802 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
1803 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1804 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
1805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1806 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
1807 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1808 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1809 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
1810 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
1811 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1812 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
1813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
1814 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
1815 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
1816 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
1818 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
1819 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1820 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1821 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
1822 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
1823 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
1824 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1825 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1826 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
1827 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1828 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
1829 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
1830 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
1831 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
1832 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
1833 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
1834 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
1835 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1836 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
1838 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
1839 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1840 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
1841 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
1843 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1844 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
1845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
1846 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1847 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1848 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
1849 0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
1850 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1851 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
1852 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
1853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
1854 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
1855 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1856 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
1857 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
1858 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
1859 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1860 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
1861 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
1862 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
1863 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1864 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
1865 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
1866 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
1867 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1868 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1869 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
1870 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1871 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1872 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
1873 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
1874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1875 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1876 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
1877 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
1878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1879 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1880 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1881 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1883 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1884 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1885 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1886 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1887 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1888 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
1889 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
1890 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1891 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1892 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
1893 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
1894 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
1895 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1896 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
1897 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
1898 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1899 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
1901 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
1902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1903 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1904 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1905 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
1906 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1907 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1908 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
1909 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
1910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1911 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1912 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1913 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1914 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
1915 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
1916 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
1917 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1919 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
1920 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
1921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
1922 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1923 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
1924 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
1925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
1926 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1927 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
1928 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
1930 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
1931 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
1932 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
1933 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
1934 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1935 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1936 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
1937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
1938 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
1939 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1940 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
1941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
1942 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1943 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
1944 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
1945 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
1946 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1947 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
1948 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
1949 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
1950 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
1951 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1952 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
1953 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1954 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
1955 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
1956 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
1957 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
1958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1959 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
1960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1961 0x00, 0x00, 0x00, 0x00,
1964 #endif /* CONFIG_BOOTX_TEXT */