Import 2.3.16
[davej-history.git] / arch / ppc / kernel / prom.c
blob04acd80fb44df95d27e86de65fdd7e115abcb713
1 /*
2 * $Id: prom.c,v 1.70 1999/08/25 21:26:08 cort 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>
20 #include <asm/init.h>
21 #include <asm/spinlock.h>
22 #include <asm/prom.h>
23 #include <asm/page.h>
24 #include <asm/processor.h>
25 #include <asm/irq.h>
26 #include <asm/io.h>
27 #include <asm/smp.h>
28 #include <asm/bootx.h>
29 #include <asm/system.h>
32 * Properties whose value is longer than this get excluded from our
33 * copy of the device tree. This way we don't waste space storing
34 * things like "driver,AAPL,MacOS,PowerPC" properties.
36 #define MAX_PROPERTY_LENGTH 1024
38 struct prom_args {
39 const char *service;
40 int nargs;
41 int nret;
42 void *args[10];
45 struct pci_address {
46 unsigned a_hi;
47 unsigned a_mid;
48 unsigned a_lo;
51 struct pci_reg_property {
52 struct pci_address addr;
53 unsigned size_hi;
54 unsigned size_lo;
57 struct pci_range {
58 struct pci_address addr;
59 unsigned phys;
60 unsigned size_hi;
61 unsigned size_lo;
64 struct isa_reg_property {
65 unsigned space;
66 unsigned address;
67 unsigned size;
70 struct pci_intr_map {
71 struct pci_address addr;
72 unsigned dunno;
73 phandle int_ctrler;
74 unsigned intr;
77 typedef unsigned long interpret_func(struct device_node *, unsigned long);
78 static interpret_func interpret_pci_props;
79 static interpret_func interpret_dbdma_props;
80 static interpret_func interpret_isa_props;
81 static interpret_func interpret_macio_props;
82 static interpret_func interpret_root_props;
84 #ifndef FB_MAX /* avoid pulling in all of the fb stuff */
85 #define FB_MAX 8
86 #endif
87 char *prom_display_paths[FB_MAX] __initdata = { 0, };
88 unsigned int prom_num_displays = 0;
89 char *of_stdout_device = 0;
91 prom_entry prom = 0;
92 ihandle prom_chosen = 0, prom_stdout = 0;
94 extern char *klimit;
95 char *bootpath = 0;
96 char *bootdevice = 0;
98 unsigned int rtas_data = 0; /* virtual pointer */
99 unsigned int rtas_entry = 0; /* physical pointer */
100 unsigned int rtas_size = 0;
101 unsigned int old_rtas = 0;
103 static struct device_node *allnodes = 0;
105 static void clearscreen(void);
106 static void flushscreen(void);
108 #ifdef CONFIG_BOOTX_TEXT
110 static void drawchar(char c);
111 static void drawhex(unsigned long v);
112 static void drawstring(const char *c);
113 static void scrollscreen(void);
115 static void draw_byte(unsigned char c, long locX, long locY);
116 static void draw_byte_32(unsigned char *bits, unsigned long *base);
117 static void draw_byte_16(unsigned char *bits, unsigned long *base);
118 static void draw_byte_8(unsigned char *bits, unsigned long *base);
120 static long g_loc_X;
121 static long g_loc_Y;
122 static long g_max_loc_X;
123 static long g_max_loc_Y;
125 #define cmapsz (16*256)
127 static unsigned char vga_font[cmapsz];
129 #endif
132 static void *call_prom(const char *service, int nargs, int nret, ...);
133 static void prom_exit(void);
134 static unsigned long copy_device_tree(unsigned long, unsigned long);
135 static unsigned long inspect_node(phandle, struct device_node *, unsigned long,
136 unsigned long, struct device_node ***);
137 static unsigned long finish_node(struct device_node *, unsigned long,
138 interpret_func *);
139 static void relocate_nodes(void);
140 static unsigned long check_display(unsigned long);
141 static int prom_next_node(phandle *);
142 static void *early_get_property(unsigned long, unsigned long, char *);
144 extern void enter_rtas(void *);
145 extern unsigned long reloc_offset(void);
147 extern char cmd_line[512]; /* XXX */
148 boot_infos_t *boot_infos = 0; /* init it so it's in data segment not bss */
151 * prom_init() is called very early on, before the kernel text
152 * and data have been mapped to KERNELBASE. At this point the code
153 * is running at whatever address it has been loaded at, so
154 * references to extern and static variables must be relocated
155 * explicitly. The procedure reloc_offset() returns the address
156 * we're currently running at minus the address we were linked at.
157 * (Note that strings count as static variables.)
159 * Because OF may have mapped I/O devices into the area starting at
160 * KERNELBASE, particularly on CHRP machines, we can't safely call
161 * OF once the kernel has been mapped to KERNELBASE. Therefore all
162 * OF calls should be done within prom_init(), and prom_init()
163 * and all routines called within it must be careful to relocate
164 * references as necessary.
166 * Note that the bss is cleared *after* prom_init runs, so we have
167 * to make sure that any static or extern variables it accesses
168 * are put in the data segment.
170 #define PTRRELOC(x) ((typeof(x))((unsigned long)(x) + offset))
171 #define PTRUNRELOC(x) ((typeof(x))((unsigned long)(x) - offset))
172 #define RELOC(x) (*PTRRELOC(&(x)))
174 #define ALIGN(x) (((x) + sizeof(unsigned long)-1) & -sizeof(unsigned long))
176 /* Is boot-info compatible ? */
177 #define BOOT_INFO_IS_COMPATIBLE(bi) ((bi)->compatible_version <= BOOT_INFO_VERSION)
178 #define BOOT_INFO_IS_V2_COMPATIBLE(bi) ((bi)->version >= 2)
179 #define BOOT_INFO_IS_V4_COMPATIBLE(bi) ((bi)->version >= 4)
181 __init
182 static void
183 prom_exit()
185 struct prom_args args;
186 unsigned long offset = reloc_offset();
188 args.service = "exit";
189 args.nargs = 0;
190 args.nret = 0;
191 RELOC(prom)(&args);
192 for (;;) /* should never get here */
196 __init
197 void
198 prom_enter(void)
200 struct prom_args args;
201 unsigned long offset = reloc_offset();
203 args.service = RELOC("enter");
204 args.nargs = 0;
205 args.nret = 0;
206 RELOC(prom)(&args);
209 __init
210 static void *
211 call_prom(const char *service, int nargs, int nret, ...)
213 va_list list;
214 int i;
215 unsigned long offset = reloc_offset();
216 struct prom_args prom_args;
218 prom_args.service = service;
219 prom_args.nargs = nargs;
220 prom_args.nret = nret;
221 va_start(list, nret);
222 for (i = 0; i < nargs; ++i)
223 prom_args.args[i] = va_arg(list, void *);
224 va_end(list);
225 for (i = 0; i < nret; ++i)
226 prom_args.args[i + nargs] = 0;
227 RELOC(prom)(&prom_args);
228 return prom_args.args[nargs];
231 __init
232 void
233 prom_print(const char *msg)
235 const char *p, *q;
236 unsigned long offset = reloc_offset();
238 if (RELOC(prom_stdout) == 0)
240 #ifdef CONFIG_BOOTX_TEXT
241 if (RELOC(boot_infos) != 0)
242 drawstring(msg);
243 #endif
244 return;
248 for (p = msg; *p != 0; p = q) {
249 for (q = p; *q != 0 && *q != '\n'; ++q)
251 if (q > p)
252 call_prom(RELOC("write"), 3, 1, RELOC(prom_stdout),
253 p, q - p);
254 if (*q != 0) {
255 ++q;
256 call_prom(RELOC("write"), 3, 1, RELOC(prom_stdout),
257 RELOC("\r\n"), 2);
262 unsigned long smp_ibm_chrp_hack __initdata = 0;
263 unsigned long smp_chrp_cpu_nr __initdata = 1;
266 * We enter here early on, when the Open Firmware prom is still
267 * handling exceptions and the MMU hash table for us.
269 __init
270 void
271 prom_init(int r3, int r4, prom_entry pp)
273 #ifdef CONFIG_SMP
274 int i;
275 phandle node;
276 char type[16], *path;
277 #endif
278 unsigned long mem;
279 ihandle prom_rtas;
280 unsigned long offset = reloc_offset();
281 int l;
282 char *p, *d;
284 /* check if we're apus, return if we are */
285 if ( r3 == 0x61707573 )
286 return;
288 /* If we came here from BootX, clear the screen,
289 * set up some pointers and return. */
290 if (r3 == 0x426f6f58 && pp == NULL) {
291 boot_infos_t *bi = (boot_infos_t *) r4;
292 unsigned long space;
293 unsigned long ptr, x;
294 char *model;
295 #ifdef CONFIG_BOOTX_TEXT
296 unsigned long flags;
297 #endif
299 RELOC(boot_infos) = PTRUNRELOC(bi);
301 clearscreen();
303 #ifdef CONFIG_BOOTX_TEXT
304 RELOC(g_loc_X) = 0;
305 RELOC(g_loc_Y) = 0;
306 RELOC(g_max_loc_X) = (bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) / 8;
307 RELOC(g_max_loc_Y) = (bi->dispDeviceRect[3] - bi->dispDeviceRect[1]) / 16;
309 /* Test if boot-info is compatible. Done only in config CONFIG_BOOTX_TEXT since
310 there is nothing much we can do with an incompatible version, except display
311 a message and eventually hang the processor...
313 I'll try to keep enough of boot-info compatible in the future to always allow
314 display of this message;
316 if (!BOOT_INFO_IS_COMPATIBLE(bi))
317 prom_print(RELOC(" !!! WARNING - Incompatible version of BootX !!!\n\n\n"));
319 prom_print(RELOC("Welcome to Linux, kernel " UTS_RELEASE "\n"));
320 prom_print(RELOC("\nstarted at : 0x"));
321 drawhex(reloc_offset() + KERNELBASE);
322 prom_print(RELOC("\nlinked at : 0x"));
323 drawhex(KERNELBASE);
324 prom_print(RELOC("\nframe buffer at : 0x"));
325 drawhex((unsigned long)bi->dispDeviceBase);
326 prom_print(RELOC(" (phys), 0x"));
327 drawhex((unsigned long)bi->logicalDisplayBase);
328 prom_print(RELOC(" (log)"));
329 prom_print(RELOC("\nMSR : 0x"));
330 __asm__ __volatile__ ("mfmsr %0" : "=r" ((flags)) : : "memory");
331 drawhex(flags);
332 prom_print(RELOC("\n\n"));
333 #endif
334 /* Out of the #if/#endif since it flushes the clearscreen too */
335 flushscreen();
337 /* New BootX enters kernel with MMU off, i/os are not allowed
338 here. This hack will have been done by the boostrap anyway.
340 if (bi->version < 4) {
342 * XXX If this is an iMac, turn off the USB controller.
344 model = (char *) early_get_property
345 (r4 + bi->deviceTreeOffset, 4, RELOC("model"));
346 if (model
347 && (strcmp(model, RELOC("iMac,1")) == 0
348 || strcmp(model, RELOC("PowerMac1,1")) == 0)) {
349 out_le32((unsigned *)0x80880008, 1); /* XXX */
353 space = bi->deviceTreeOffset + bi->deviceTreeSize;
354 if (bi->ramDisk)
355 space = bi->ramDisk + bi->ramDiskSize;
356 RELOC(klimit) = PTRUNRELOC((char *) bi + space);
358 /* New BootX will have flushed all TLBs and enters kernel with
359 MMU switched OFF, so this should not be useful anymore.
361 if (bi->version < 4) {
363 * Touch each page to make sure the PTEs for them
364 * are in the hash table - the aim is to try to avoid
365 * getting DSI exceptions while copying the kernel image.
367 for (ptr = (KERNELBASE + offset) & PAGE_MASK;
368 ptr < (unsigned long)bi + space; ptr += PAGE_SIZE)
369 x = *(volatile unsigned long *)ptr;
372 #ifdef CONFIG_BOOTX_TEXT
373 prom_print(RELOC("booting...\n"));
374 flushscreen();
375 #endif
376 return;
379 /* check if we're prep, return if we are */
380 if ( *(unsigned long *)(0) == 0xdeadc0de )
381 return;
383 /* First get a handle for the stdout device */
384 RELOC(prom) = pp;
385 RELOC(prom_chosen) = call_prom(RELOC("finddevice"), 1, 1,
386 RELOC("/chosen"));
387 if (RELOC(prom_chosen) == (void *)-1)
388 prom_exit();
389 if ((int) call_prom(RELOC("getprop"), 4, 1, RELOC(prom_chosen),
390 RELOC("stdout"), &RELOC(prom_stdout),
391 sizeof(prom_stdout)) <= 0)
392 prom_exit();
394 /* Get the full OF pathname of the stdout device */
395 mem = (unsigned long) RELOC(klimit) + offset;
396 p = (char *) mem;
397 memset(p, 0, 256);
398 call_prom(RELOC("instance-to-path"), 3, 1, RELOC(prom_stdout), p, 255);
399 RELOC(of_stdout_device) = PTRUNRELOC(p);
400 mem += strlen(p) + 1;
402 /* Get the boot device and translate it to a full OF pathname. */
403 p = (char *) mem;
404 l = (int) call_prom(RELOC("getprop"), 4, 1, RELOC(prom_chosen),
405 RELOC("bootpath"), p, 1<<20);
406 if (l > 0) {
407 p[l] = 0; /* should already be null-terminated */
408 RELOC(bootpath) = PTRUNRELOC(p);
409 mem += l + 1;
410 d = (char *) mem;
411 *d = 0;
412 call_prom(RELOC("canon"), 3, 1, p, d, 1<<20);
413 RELOC(bootdevice) = PTRUNRELOC(d);
414 mem = ALIGN(mem + strlen(d) + 1);
417 mem = check_display(mem);
419 prom_print(RELOC("copying OF device tree..."));
420 mem = copy_device_tree(mem, mem + (1<<20));
421 prom_print(RELOC("done\n"));
424 RELOC(klimit) = (char *) (mem - offset);
426 prom_rtas = call_prom(RELOC("finddevice"), 1, 1, RELOC("/rtas"));
427 if (prom_rtas != (void *) -1) {
428 RELOC(rtas_size) = 0;
429 call_prom(RELOC("getprop"), 4, 1, prom_rtas,
430 RELOC("rtas-size"), &RELOC(rtas_size), sizeof(rtas_size));
431 prom_print(RELOC("instantiating rtas..."));
432 if (RELOC(rtas_size) == 0) {
433 RELOC(rtas_data) = 0;
434 } else {
436 * We do _not_ want the rtas_data inside the klimit
437 * boundry since it'll be squashed when we do the
438 * relocate of the kernel on chrp right after prom_init()
439 * in head.S. So, we just pick a spot in memory.
440 * -- Cort
442 #if 0
443 mem = (mem + 4095) & -4096;
444 RELOC(rtas_data) = mem + KERNELBASE;
445 mem += RELOC(rtas_size);
446 #endif
447 RELOC(rtas_data) = (6<<20) + KERNELBASE;
449 prom_rtas = call_prom(RELOC("open"), 1, 1, RELOC("/rtas"));
451 int i, nargs;
452 struct prom_args prom_args;
453 nargs = 3;
454 prom_args.service = RELOC("call-method");
455 prom_args.nargs = nargs;
456 prom_args.nret = 2;
457 prom_args.args[0] = RELOC("instantiate-rtas");
458 prom_args.args[1] = prom_rtas;
459 prom_args.args[2] = ((void *)(RELOC(rtas_data)-KERNELBASE));
460 RELOC(prom)(&prom_args);
461 if (prom_args.args[nargs] != 0)
462 i = 0;
463 else
464 i = (int)prom_args.args[nargs+1];
465 RELOC(rtas_entry) = i;
467 if ((RELOC(rtas_entry) == -1) || (RELOC(rtas_entry) == 0))
468 prom_print(RELOC(" failed\n"));
469 else
470 prom_print(RELOC(" done\n"));
473 #ifdef CONFIG_SMP
475 * With CHRP SMP we need to use the OF to start the other
476 * processors so we can't wait until smp_boot_cpus (the OF is
477 * trashed by then) so we have to put the processors into
478 * a holding pattern controlled by the kernel (not OF) before
479 * we destroy the OF.
481 * This uses a chunk of high memory, puts some holding pattern
482 * code there and sends the other processors off to there until
483 * smp_boot_cpus tells them to do something. We do that by using
484 * physical address 0x0. The holding pattern checks that address
485 * until its cpu # is there, when it is that cpu jumps to
486 * __secondary_start(). smp_boot_cpus() takes care of setting those
487 * values.
489 * We also use physical address 0x4 here to tell when a cpu
490 * is in its holding pattern code.
492 * -- Cort
495 extern void __secondary_hold(void);
496 unsigned long i;
497 char type[16];
501 * XXX: hack to make sure we're chrp, assume that if we're
502 * chrp we have a device_type property -- Cort
504 node = call_prom(RELOC("finddevice"), 1, 1, RELOC("/"));
505 if ( (int)call_prom(RELOC("getprop"), 4, 1, node,
506 RELOC("device_type"),type, sizeof(type)) <= 0)
507 return;
509 /* copy the holding pattern code to someplace safe (8M) */
510 memcpy( (void *)(8<<20), RELOC(__secondary_hold), 0x100 );
511 for (i = 8<<20; i < ((8<<20)+0x100); i += 32)
513 asm volatile("dcbf 0,%0" : : "r" (i) : "memory");
514 asm volatile("icbi 0,%0" : : "r" (i) : "memory");
518 /* look for cpus */
519 for (node = 0; prom_next_node(&node);)
521 type[0] = 0;
522 call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"),
523 type, sizeof(type));
524 if (strcmp(type, RELOC("cpu")) != 0)
525 continue;
526 path = (char *) mem;
527 memset(path, 0, 256);
528 if ((int) call_prom(RELOC("package-to-path"), 3, 1,
529 node, path, 255) < 0)
530 continue;
531 /* XXX: hack - don't start cpu 0, this cpu -- Cort */
532 if ( smp_chrp_cpu_nr++ == 0 )
533 continue;
534 RELOC(smp_ibm_chrp_hack) = 1;
535 prom_print(RELOC("starting cpu "));
536 prom_print(path);
537 *(unsigned long *)(0x4) = 0;
538 asm volatile("dcbf 0,%0": : "r" (0x4) : "memory");
539 call_prom(RELOC("start-cpu"), 3, 0, node, 8<<20, smp_chrp_cpu_nr-1);
540 for ( i = 0 ; (i < 10000) &&
541 (*(ulong *)(0x4) == (ulong)0); i++ )
543 if (*(ulong *)(0x4) == (ulong)smp_chrp_cpu_nr-1 )
544 prom_print(RELOC("...ok\n"));
545 else
546 prom_print(RELOC("...failed\n"));
548 #endif
552 * If we have a display that we don't know how to drive,
553 * we will want to try to execute OF's open method for it
554 * later. However, OF will probably fall over if we do that
555 * we've taken over the MMU.
556 * So we check whether we will need to open the display,
557 * and if so, open it now.
559 __init
560 static unsigned long
561 check_display(unsigned long mem)
563 phandle node;
564 ihandle ih;
565 int i;
566 unsigned long offset = reloc_offset();
567 char type[16], *path;
569 for (node = 0; prom_next_node(&node); ) {
570 type[0] = 0;
571 call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"),
572 type, sizeof(type));
573 if (strcmp(type, RELOC("display")) != 0)
574 continue;
575 /* It seems OF doesn't null-terminate the path :-( */
576 path = (char *) mem;
577 memset(path, 0, 256);
578 if ((int) call_prom(RELOC("package-to-path"), 3, 1,
579 node, path, 255) < 0)
580 continue;
581 prom_print(RELOC("opening display "));
582 prom_print(path);
583 ih = call_prom(RELOC("open"), 1, 1, path);
584 if (ih == 0 || ih == (ihandle) -1) {
585 prom_print(RELOC("... failed\n"));
586 continue;
588 prom_print(RELOC("... ok\n"));
591 * If this display is the device that OF is using for stdout,
592 * move it to the front of the list.
594 mem += strlen(path) + 1;
595 i = RELOC(prom_num_displays)++;
596 if (RELOC(of_stdout_device) != 0 && i > 0
597 && strcmp(PTRRELOC(RELOC(of_stdout_device)), path) == 0) {
598 for (; i > 0; --i)
599 RELOC(prom_display_paths[i])
600 = RELOC(prom_display_paths[i-1]);
602 RELOC(prom_display_paths[i]) = PTRUNRELOC(path);
603 if (RELOC(prom_num_displays) >= FB_MAX)
604 break;
606 return ALIGN(mem);
609 __init
610 static int
611 prom_next_node(phandle *nodep)
613 phandle node;
614 unsigned long offset = reloc_offset();
616 if ((node = *nodep) != 0
617 && (*nodep = call_prom(RELOC("child"), 1, 1, node)) != 0)
618 return 1;
619 if ((*nodep = call_prom(RELOC("peer"), 1, 1, node)) != 0)
620 return 1;
621 for (;;) {
622 if ((node = call_prom(RELOC("parent"), 1, 1, node)) == 0)
623 return 0;
624 if ((*nodep = call_prom(RELOC("peer"), 1, 1, node)) != 0)
625 return 1;
630 * Make a copy of the device tree from the PROM.
632 __init
633 static unsigned long
634 copy_device_tree(unsigned long mem_start, unsigned long mem_end)
636 phandle root;
637 unsigned long new_start;
638 struct device_node **allnextp;
639 unsigned long offset = reloc_offset();
641 root = call_prom(RELOC("peer"), 1, 1, (phandle)0);
642 if (root == (phandle)0) {
643 prom_print(RELOC("couldn't get device tree root\n"));
644 prom_exit();
646 allnextp = &RELOC(allnodes);
647 mem_start = ALIGN(mem_start);
648 new_start = inspect_node(root, 0, mem_start, mem_end, &allnextp);
649 *allnextp = 0;
650 return new_start;
653 __init
654 static unsigned long
655 inspect_node(phandle node, struct device_node *dad,
656 unsigned long mem_start, unsigned long mem_end,
657 struct device_node ***allnextpp)
659 int l;
660 phandle child;
661 struct device_node *np;
662 struct property *pp, **prev_propp;
663 char *prev_name, *namep;
664 unsigned char *valp;
665 unsigned long offset = reloc_offset();
667 np = (struct device_node *) mem_start;
668 mem_start += sizeof(struct device_node);
669 memset(np, 0, sizeof(*np));
670 np->node = node;
671 **allnextpp = PTRUNRELOC(np);
672 *allnextpp = &np->allnext;
673 if (dad != 0) {
674 np->parent = PTRUNRELOC(dad);
675 /* we temporarily use the `next' field as `last_child'. */
676 if (dad->next == 0)
677 dad->child = PTRUNRELOC(np);
678 else
679 dad->next->sibling = PTRUNRELOC(np);
680 dad->next = np;
683 /* get and store all properties */
684 prev_propp = &np->properties;
685 prev_name = RELOC("");
686 for (;;) {
687 pp = (struct property *) mem_start;
688 namep = (char *) (pp + 1);
689 pp->name = PTRUNRELOC(namep);
690 if ((int) call_prom(RELOC("nextprop"), 3, 1, node, prev_name,
691 namep) <= 0)
692 break;
693 mem_start = ALIGN((unsigned long)namep + strlen(namep) + 1);
694 prev_name = namep;
695 valp = (unsigned char *) mem_start;
696 pp->value = PTRUNRELOC(valp);
697 pp->length = (int)
698 call_prom(RELOC("getprop"), 4, 1, node, namep,
699 valp, mem_end - mem_start);
700 if (pp->length < 0)
701 continue;
702 #ifdef MAX_PROPERTY_LENGTH
703 if (pp->length > MAX_PROPERTY_LENGTH)
704 continue; /* ignore this property */
705 #endif
706 mem_start = ALIGN(mem_start + pp->length);
707 *prev_propp = PTRUNRELOC(pp);
708 prev_propp = &pp->next;
710 *prev_propp = 0;
712 /* get the node's full name */
713 l = (int) call_prom(RELOC("package-to-path"), 3, 1, node,
714 (char *) mem_start, mem_end - mem_start);
715 if (l >= 0) {
716 np->full_name = PTRUNRELOC((char *) mem_start);
717 *(char *)(mem_start + l) = 0;
718 mem_start = ALIGN(mem_start + l + 1);
721 /* do all our children */
722 child = call_prom(RELOC("child"), 1, 1, node);
723 while (child != (void *)0) {
724 mem_start = inspect_node(child, np, mem_start, mem_end,
725 allnextpp);
726 child = call_prom(RELOC("peer"), 1, 1, child);
729 return mem_start;
733 * finish_device_tree is called once things are running normally
734 * (i.e. with text and data mapped to the address they were linked at).
735 * It traverses the device tree and fills in the name, type,
736 * {n_}addrs and {n_}intrs fields of each node.
738 __init
739 void
740 finish_device_tree(void)
742 unsigned long mem = (unsigned long) klimit;
744 if (boot_infos)
745 relocate_nodes();
746 mem = finish_node(allnodes, mem, NULL);
747 printk(KERN_INFO "device tree used %lu bytes\n",
748 mem - (unsigned long) allnodes);
749 klimit = (char *) mem;
753 * early_get_property is used to access the device tree image prepared
754 * by BootX very early on, before the pointers in it have been relocated.
756 __init void *
757 early_get_property(unsigned long base, unsigned long node, char *prop)
759 struct device_node *np = (struct device_node *)(base + node);
760 struct property *pp;
762 for (pp = np->properties; pp != 0; pp = pp->next) {
763 pp = (struct property *) (base + (unsigned long)pp);
764 if (strcmp((char *)((unsigned long)pp->name + base),
765 prop) == 0) {
766 return (void *)((unsigned long)pp->value + base);
769 return 0;
772 __init
773 static unsigned long
774 finish_node(struct device_node *np, unsigned long mem_start,
775 interpret_func *ifunc)
777 struct device_node *child;
779 np->name = get_property(np, "name", 0);
780 np->type = get_property(np, "device_type", 0);
782 /* get the device addresses and interrupts */
783 if (ifunc != NULL) {
784 mem_start = ifunc(np, mem_start);
787 /* the f50 sets the name to 'display' and 'compatible' to what we
788 * expect for the name -- Cort
790 if (!strcmp(np->name, "display"))
791 np->name = get_property(np, "compatible", 0);
793 if (!strcmp(np->name, "device-tree"))
794 ifunc = interpret_root_props;
795 else if (np->type == 0)
796 ifunc = NULL;
797 else if (!strcmp(np->type, "pci") || !strcmp(np->type, "vci"))
798 ifunc = interpret_pci_props;
799 else if (!strcmp(np->type, "dbdma"))
800 ifunc = interpret_dbdma_props;
801 else if (!strcmp(np->type, "mac-io")
802 || ifunc == interpret_macio_props)
803 ifunc = interpret_macio_props;
804 else if (!strcmp(np->type, "isa"))
805 ifunc = interpret_isa_props;
806 else if (!((ifunc == interpret_dbdma_props
807 || ifunc == interpret_macio_props)
808 && (!strcmp(np->type, "escc")
809 || !strcmp(np->type, "media-bay"))))
810 ifunc = NULL;
812 /* if we were booted from BootX, convert the full name */
813 if (boot_infos
814 && strncmp(np->full_name, "Devices:device-tree", 19) == 0) {
815 if (np->full_name[19] == 0) {
816 strcpy(np->full_name, "/");
817 } else if (np->full_name[19] == ':') {
818 char *p = np->full_name + 19;
819 np->full_name = p;
820 for (; *p; ++p)
821 if (*p == ':')
822 *p = '/';
826 for (child = np->child; child != NULL; child = child->sibling)
827 mem_start = finish_node(child, mem_start, ifunc);
829 return mem_start;
833 * When BootX makes a copy of the device tree from the MacOS
834 * Name Registry, it is in the format we use but all of the pointers
835 * are offsets from the start of the tree.
836 * This procedure updates the pointers.
838 __init
839 static void relocate_nodes(void)
841 unsigned long base;
842 struct device_node *np;
843 struct property *pp;
845 #define ADDBASE(x) (x = (x)? ((typeof (x))((unsigned long)(x) + base)): 0)
847 base = (unsigned long) boot_infos + boot_infos->deviceTreeOffset;
848 allnodes = (struct device_node *)(base + 4);
849 for (np = allnodes; np != 0; np = np->allnext) {
850 ADDBASE(np->full_name);
851 ADDBASE(np->properties);
852 ADDBASE(np->parent);
853 ADDBASE(np->child);
854 ADDBASE(np->sibling);
855 ADDBASE(np->allnext);
856 for (pp = np->properties; pp != 0; pp = pp->next) {
857 ADDBASE(pp->name);
858 ADDBASE(pp->value);
859 ADDBASE(pp->next);
864 __init
865 static unsigned long
866 interpret_pci_props(struct device_node *np, unsigned long mem_start)
868 struct address_range *adr;
869 struct pci_reg_property *pci_addrs;
870 int i, l, *ip, ml;
871 struct pci_intr_map *imp;
873 pci_addrs = (struct pci_reg_property *)
874 get_property(np, "assigned-addresses", &l);
875 if (pci_addrs != 0 && l >= sizeof(struct pci_reg_property)) {
876 i = 0;
877 adr = (struct address_range *) mem_start;
878 while ((l -= sizeof(struct pci_reg_property)) >= 0) {
879 /* XXX assumes PCI addresses mapped 1-1 to physical */
880 adr[i].space = pci_addrs[i].addr.a_hi;
881 adr[i].address = pci_addrs[i].addr.a_lo;
882 adr[i].size = pci_addrs[i].size_lo;
883 ++i;
885 np->addrs = adr;
886 np->n_addrs = i;
887 mem_start += i * sizeof(struct address_range);
891 * If the pci host bridge has an interrupt-map property,
892 * look for our node in it.
894 if (np->parent != 0 && pci_addrs != 0
895 && (imp = (struct pci_intr_map *)
896 get_property(np->parent, "interrupt-map", &ml)) != 0
897 && (ip = (int *) get_property(np, "interrupts", &l)) != 0) {
898 unsigned int devfn = pci_addrs[0].addr.a_hi & 0xff00;
899 np->n_intrs = 0;
900 np->intrs = (struct interrupt_info *) mem_start;
901 for (i = 0; (ml -= sizeof(struct pci_intr_map)) >= 0; ++i) {
902 if (imp[i].addr.a_hi == devfn) {
903 np->intrs[np->n_intrs].line = imp[i].intr;
904 np->intrs[np->n_intrs].sense = 0;
905 ++np->n_intrs;
908 if (np->n_intrs == 0)
909 np->intrs = 0;
910 mem_start += np->n_intrs * sizeof(struct interrupt_info);
911 return mem_start;
914 ip = (int *) get_property(np, "AAPL,interrupts", &l);
915 if (ip == 0)
916 ip = (int *) get_property(np, "interrupts", &l);
917 if (ip != 0) {
918 np->intrs = (struct interrupt_info *) mem_start;
919 np->n_intrs = l / sizeof(int);
920 mem_start += np->n_intrs * sizeof(struct interrupt_info);
921 for (i = 0; i < np->n_intrs; ++i) {
922 np->intrs[i].line = *ip++;
923 np->intrs[i].sense = 0;
927 return mem_start;
930 __init
931 static unsigned long
932 interpret_dbdma_props(struct device_node *np, unsigned long mem_start)
934 struct reg_property *rp;
935 struct address_range *adr;
936 unsigned long base_address;
937 int i, l, *ip;
938 struct device_node *db;
940 base_address = 0;
941 for (db = np->parent; db != NULL; db = db->parent) {
942 if (!strcmp(db->type, "dbdma") && db->n_addrs != 0) {
943 base_address = db->addrs[0].address;
944 break;
948 rp = (struct reg_property *) get_property(np, "reg", &l);
949 if (rp != 0 && l >= sizeof(struct reg_property)) {
950 i = 0;
951 adr = (struct address_range *) mem_start;
952 while ((l -= sizeof(struct reg_property)) >= 0) {
953 adr[i].space = 0;
954 adr[i].address = rp[i].address + base_address;
955 adr[i].size = rp[i].size;
956 ++i;
958 np->addrs = adr;
959 np->n_addrs = i;
960 mem_start += i * sizeof(struct address_range);
963 ip = (int *) get_property(np, "AAPL,interrupts", &l);
964 if (ip == 0)
965 ip = (int *) get_property(np, "interrupts", &l);
966 if (ip != 0) {
967 np->intrs = (struct interrupt_info *) mem_start;
968 np->n_intrs = l / sizeof(int);
969 mem_start += np->n_intrs * sizeof(struct interrupt_info);
970 for (i = 0; i < np->n_intrs; ++i) {
971 np->intrs[i].line = *ip++;
972 np->intrs[i].sense = 0;
976 return mem_start;
979 __init
980 static unsigned long
981 interpret_macio_props(struct device_node *np, unsigned long mem_start)
983 struct reg_property *rp;
984 struct address_range *adr;
985 unsigned long base_address;
986 int i, l, *ip;
987 struct device_node *db;
989 base_address = 0;
990 for (db = np->parent; db != NULL; db = db->parent) {
991 if (!strcmp(db->type, "mac-io") && db->n_addrs != 0) {
992 base_address = db->addrs[0].address;
993 break;
997 rp = (struct reg_property *) get_property(np, "reg", &l);
998 if (rp != 0 && l >= sizeof(struct reg_property)) {
999 i = 0;
1000 adr = (struct address_range *) mem_start;
1001 while ((l -= sizeof(struct reg_property)) >= 0) {
1002 adr[i].space = 0;
1003 adr[i].address = rp[i].address + base_address;
1004 adr[i].size = rp[i].size;
1005 ++i;
1007 np->addrs = adr;
1008 np->n_addrs = i;
1009 mem_start += i * sizeof(struct address_range);
1012 ip = (int *) get_property(np, "interrupts", &l);
1013 if (ip == 0)
1014 ip = (int *) get_property(np, "AAPL,interrupts", &l);
1015 if (ip != 0) {
1016 np->intrs = (struct interrupt_info *) mem_start;
1017 if (_machine == _MACH_Pmac) {
1018 /* for the iMac */
1019 np->n_intrs = l / sizeof(int);
1020 for (i = 0; i < np->n_intrs; ++i) {
1021 np->intrs[i].line = *ip++;
1022 np->intrs[i].sense = 0;
1024 } else {
1025 /* CHRP machines */
1026 np->n_intrs = l / (2 * sizeof(int));
1027 for (i = 0; i < np->n_intrs; ++i) {
1028 np->intrs[i].line = openpic_to_irq(*ip++);
1029 np->intrs[i].sense = *ip++;
1032 mem_start += np->n_intrs * sizeof(struct interrupt_info);
1035 return mem_start;
1038 __init
1039 static unsigned long
1040 interpret_isa_props(struct device_node *np, unsigned long mem_start)
1042 struct isa_reg_property *rp;
1043 struct address_range *adr;
1044 int i, l, *ip;
1046 rp = (struct isa_reg_property *) get_property(np, "reg", &l);
1047 if (rp != 0 && l >= sizeof(struct isa_reg_property)) {
1048 i = 0;
1049 adr = (struct address_range *) mem_start;
1050 while ((l -= sizeof(struct reg_property)) >= 0) {
1051 adr[i].space = rp[i].space;
1052 adr[i].address = rp[i].address
1053 + (adr[i].space? 0: _ISA_MEM_BASE);
1054 adr[i].size = rp[i].size;
1055 ++i;
1057 np->addrs = adr;
1058 np->n_addrs = i;
1059 mem_start += i * sizeof(struct address_range);
1062 ip = (int *) get_property(np, "interrupts", &l);
1063 if (ip != 0) {
1064 np->intrs = (struct interrupt_info *) mem_start;
1065 np->n_intrs = l / (2 * sizeof(int));
1066 mem_start += np->n_intrs * sizeof(struct interrupt_info);
1067 for (i = 0; i < np->n_intrs; ++i) {
1068 np->intrs[i].line = *ip++;
1069 np->intrs[i].sense = *ip++;
1073 return mem_start;
1076 __init
1077 static unsigned long
1078 interpret_root_props(struct device_node *np, unsigned long mem_start)
1080 struct reg_property *rp;
1081 struct address_range *adr;
1082 int i, l, *ip;
1084 rp = (struct reg_property *) get_property(np, "reg", &l);
1085 if (rp != 0 && l >= sizeof(struct reg_property)) {
1086 i = 0;
1087 adr = (struct address_range *) mem_start;
1088 while ((l -= sizeof(struct reg_property)) >= 0) {
1089 adr[i].space = 0;
1090 adr[i].address = rp[i].address;
1091 adr[i].size = rp[i].size;
1092 ++i;
1094 np->addrs = adr;
1095 np->n_addrs = i;
1096 mem_start += i * sizeof(struct address_range);
1099 ip = (int *) get_property(np, "AAPL,interrupts", &l);
1100 if (ip == 0)
1101 ip = (int *) get_property(np, "interrupts", &l);
1102 if (ip != 0) {
1103 np->intrs = (struct interrupt_info *) mem_start;
1104 np->n_intrs = l / sizeof(int);
1105 mem_start += np->n_intrs * sizeof(struct interrupt_info);
1106 for (i = 0; i < np->n_intrs; ++i) {
1107 np->intrs[i].line = *ip++;
1108 np->intrs[i].sense = 0;
1112 return mem_start;
1116 * Construct and return a list of the device_nodes with a given name.
1118 __openfirmware
1119 struct device_node *
1120 find_devices(const char *name)
1122 struct device_node *head, **prevp, *np;
1124 prevp = &head;
1125 for (np = allnodes; np != 0; np = np->allnext) {
1126 if (np->name != 0 && strcasecmp(np->name, name) == 0) {
1127 *prevp = np;
1128 prevp = &np->next;
1131 *prevp = 0;
1132 return head;
1136 * Construct and return a list of the device_nodes with a given type.
1138 __openfirmware
1139 struct device_node *
1140 find_type_devices(const char *type)
1142 struct device_node *head, **prevp, *np;
1144 prevp = &head;
1145 for (np = allnodes; np != 0; np = np->allnext) {
1146 if (np->type != 0 && strcasecmp(np->type, type) == 0) {
1147 *prevp = np;
1148 prevp = &np->next;
1151 *prevp = 0;
1152 return head;
1155 /* Checks if the given "compat" string matches one of the strings in
1156 * the device's "compatible" property
1158 __openfirmware
1160 device_is_compatible(struct device_node *device, const char *compat)
1162 const char* cp;
1163 int cplen, l;
1165 cp = (char *) get_property(device, "compatible", &cplen);
1166 if (cp == NULL)
1167 return 0;
1168 while (cplen > 0) {
1169 if (strncasecmp(cp, compat, strlen(compat)) == 0)
1170 return 1;
1171 l = strlen(cp) + 1;
1172 cp += l;
1173 cplen -= l;
1176 return 0;
1180 * Construct and return a list of the device_nodes with a given type
1181 * and compatible property.
1183 __openfirmware
1184 struct device_node *
1185 find_compatible_devices(const char *type, const char *compat)
1187 struct device_node *head, **prevp, *np;
1189 prevp = &head;
1190 for (np = allnodes; np != 0; np = np->allnext) {
1191 if (type != NULL
1192 && !(np->type != 0 && strcasecmp(np->type, type) == 0))
1193 continue;
1194 if (device_is_compatible(np, compat)) {
1195 *prevp = np;
1196 prevp = &np->next;
1199 *prevp = 0;
1200 return head;
1204 * Find the device_node with a given full_name.
1206 __openfirmware
1207 struct device_node *
1208 find_path_device(const char *path)
1210 struct device_node *np;
1212 for (np = allnodes; np != 0; np = np->allnext)
1213 if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0)
1214 return np;
1215 return NULL;
1219 * Find the device_node with a given phandle.
1221 __openfirmware
1222 struct device_node *
1223 find_phandle(phandle ph)
1225 struct device_node *np;
1227 for (np = allnodes; np != 0; np = np->allnext)
1228 if (np->node == ph)
1229 return np;
1230 return NULL;
1234 * Find a property with a given name for a given node
1235 * and return the value.
1237 __openfirmware
1238 unsigned char *
1239 get_property(struct device_node *np, const char *name, int *lenp)
1241 struct property *pp;
1243 for (pp = np->properties; pp != 0; pp = pp->next)
1244 if (strcmp(pp->name, name) == 0) {
1245 if (lenp != 0)
1246 *lenp = pp->length;
1247 return pp->value;
1249 return 0;
1252 #if 0
1253 __openfirmware
1254 void
1255 print_properties(struct device_node *np)
1257 struct property *pp;
1258 char *cp;
1259 int i, n;
1261 for (pp = np->properties; pp != 0; pp = pp->next) {
1262 printk(KERN_INFO "%s", pp->name);
1263 for (i = strlen(pp->name); i < 16; ++i)
1264 printk(" ");
1265 cp = (char *) pp->value;
1266 for (i = pp->length; i > 0; --i, ++cp)
1267 if ((i > 1 && (*cp < 0x20 || *cp > 0x7e))
1268 || (i == 1 && *cp != 0))
1269 break;
1270 if (i == 0 && pp->length > 1) {
1271 /* looks like a string */
1272 printk(" %s\n", (char *) pp->value);
1273 } else {
1274 /* dump it in hex */
1275 n = pp->length;
1276 if (n > 64)
1277 n = 64;
1278 if (pp->length % 4 == 0) {
1279 unsigned int *p = (unsigned int *) pp->value;
1281 n /= 4;
1282 for (i = 0; i < n; ++i) {
1283 if (i != 0 && (i % 4) == 0)
1284 printk("\n ");
1285 printk(" %08x", *p++);
1287 } else {
1288 unsigned char *bp = pp->value;
1290 for (i = 0; i < n; ++i) {
1291 if (i != 0 && (i % 16) == 0)
1292 printk("\n ");
1293 printk(" %02x", *bp++);
1296 printk("\n");
1297 if (pp->length > 64)
1298 printk(" ... (length = %d)\n",
1299 pp->length);
1303 #endif
1305 /* this can be called after setup -- Cort */
1306 __openfirmware
1308 call_rtas(const char *service, int nargs, int nret,
1309 unsigned long *outputs, ...)
1311 va_list list;
1312 int i, s;
1313 struct device_node *rtas;
1314 int *tokp;
1315 union {
1316 unsigned long words[16];
1317 double align;
1318 } u;
1320 rtas = find_devices("rtas");
1321 if (rtas == NULL)
1322 return -1;
1323 tokp = (int *) get_property(rtas, service, NULL);
1324 if (tokp == NULL) {
1325 printk(KERN_ERR "No RTAS service called %s\n", service);
1326 return -1;
1328 u.words[0] = *tokp;
1329 u.words[1] = nargs;
1330 u.words[2] = nret;
1331 va_start(list, outputs);
1332 for (i = 0; i < nargs; ++i)
1333 u.words[i+3] = va_arg(list, unsigned long);
1334 va_end(list);
1336 save_flags(s);
1337 cli();
1339 enter_rtas((void *)__pa(&u));
1340 restore_flags(s);
1341 if (nret > 1 && outputs != NULL)
1342 for (i = 0; i < nret-1; ++i)
1343 outputs[i] = u.words[i+nargs+4];
1344 return u.words[nargs+3];
1347 __init
1348 void
1349 abort()
1351 #ifdef CONFIG_XMON
1352 xmon(NULL);
1353 #endif
1354 prom_exit();
1357 /* Calc the base address of a given point (x,y) */
1358 #define CALC_BASE(x,y) ((BOOT_INFO_IS_V2_COMPATIBLE(bi) ? bi->logicalDisplayBase : \
1359 bi->dispDeviceBase) + (bi->dispDeviceRect[0] + (x)) * \
1360 (bi->dispDeviceDepth >> 3) + bi->dispDeviceRowBytes * \
1361 ((y) + bi->dispDeviceRect[1]))
1363 __init
1364 static void
1365 clearscreen(void)
1367 unsigned long offset = reloc_offset();
1368 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1369 unsigned long *base = (unsigned long *)CALC_BASE(0,0);
1370 unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
1371 (bi->dispDeviceDepth >> 3)) >> 2;
1372 int i,j;
1374 for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1]); i++)
1376 unsigned long *ptr = base;
1377 for(j=width; j; --j)
1378 *(ptr++) = 0;
1379 base += (bi->dispDeviceRowBytes >> 2);
1383 __inline__ void dcbst(const void* addr)
1385 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (addr));
1388 __init
1389 static void
1390 flushscreen(void)
1392 unsigned long offset = reloc_offset();
1393 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1394 unsigned long *base = (unsigned long *)CALC_BASE(0,0);
1395 unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
1396 (bi->dispDeviceDepth >> 3)) >> 2;
1397 int i,j;
1399 for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1]); i++)
1401 unsigned long *ptr = base;
1402 for(j=width; j>0; j-=8) {
1403 dcbst(ptr);
1404 ptr += 8;
1406 base += (bi->dispDeviceRowBytes >> 2);
1410 #ifdef CONFIG_BOOTX_TEXT
1412 __init
1413 static void
1414 scrollscreen(void)
1416 unsigned long offset = reloc_offset();
1417 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1418 unsigned long *src = (unsigned long *)CALC_BASE(0,16);
1419 unsigned long *dst = (unsigned long *)CALC_BASE(0,0);
1420 unsigned long width = ((bi->dispDeviceRect[2] - bi->dispDeviceRect[0]) *
1421 (bi->dispDeviceDepth >> 3)) >> 2;
1422 int i,j;
1424 for (i=0; i<(bi->dispDeviceRect[3] - bi->dispDeviceRect[1] - 16); i++)
1426 unsigned long *src_ptr = src;
1427 unsigned long *dst_ptr = dst;
1428 for(j=width; j; --j)
1429 *(dst_ptr++) = *(src_ptr++);
1430 src += (bi->dispDeviceRowBytes >> 2);
1431 dst += (bi->dispDeviceRowBytes >> 2);
1433 for (i=0; i<16; i++)
1435 unsigned long *dst_ptr = dst;
1436 for(j=width; j; --j)
1437 *(dst_ptr++) = 0;
1438 dst += (bi->dispDeviceRowBytes >> 2);
1442 __init
1443 static void
1444 drawchar(char c)
1446 unsigned long offset = reloc_offset();
1448 switch(c) {
1449 case '\r': RELOC(g_loc_X) = 0; break;
1450 case '\n': RELOC(g_loc_X) = 0; RELOC(g_loc_Y)++; break;
1451 default:
1452 draw_byte(c, RELOC(g_loc_X)++, RELOC(g_loc_Y));
1453 if (RELOC(g_loc_X) >= RELOC(g_max_loc_X)) {
1454 RELOC(g_loc_X) = 0;
1455 RELOC(g_loc_Y)++;
1458 while (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y)) {
1459 scrollscreen();
1460 RELOC(g_loc_Y)--;
1464 __init
1465 static void
1466 drawstring(const char *c)
1468 while(*c)
1469 drawchar(*(c++));
1472 __init
1473 static void
1474 drawhex(unsigned long v)
1476 static char hex_table[] = "0123456789abcdef";
1477 unsigned long offset = reloc_offset();
1479 drawchar(RELOC(hex_table)[(v >> 28) & 0x0000000FUL]);
1480 drawchar(RELOC(hex_table)[(v >> 24) & 0x0000000FUL]);
1481 drawchar(RELOC(hex_table)[(v >> 20) & 0x0000000FUL]);
1482 drawchar(RELOC(hex_table)[(v >> 16) & 0x0000000FUL]);
1483 drawchar(RELOC(hex_table)[(v >> 12) & 0x0000000FUL]);
1484 drawchar(RELOC(hex_table)[(v >> 8) & 0x0000000FUL]);
1485 drawchar(RELOC(hex_table)[(v >> 4) & 0x0000000FUL]);
1486 drawchar(RELOC(hex_table)[(v >> 0) & 0x0000000FUL]);
1490 __init
1491 static void
1492 draw_byte(unsigned char c, long locX, long locY)
1494 unsigned long offset = reloc_offset();
1495 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1496 unsigned char *base = CALC_BASE(locX << 3, locY << 4);
1497 unsigned char *font = &RELOC(vga_font)[((unsigned long)c) * 16];
1499 switch(bi->dispDeviceDepth) {
1500 case 32:
1501 draw_byte_32(font, (unsigned long *)base);
1502 break;
1503 case 16:
1504 draw_byte_16(font, (unsigned long *)base);
1505 break;
1506 case 8:
1507 draw_byte_8(font, (unsigned long *)base);
1508 break;
1509 default:
1510 break;
1514 __init
1515 static unsigned long expand_bits_8[16] = {
1516 0x00000000,
1517 0x000000ff,
1518 0x0000ff00,
1519 0x0000ffff,
1520 0x00ff0000,
1521 0x00ff00ff,
1522 0x00ffff00,
1523 0x00ffffff,
1524 0xff000000,
1525 0xff0000ff,
1526 0xff00ff00,
1527 0xff00ffff,
1528 0xffff0000,
1529 0xffff00ff,
1530 0xffffff00,
1531 0xffffffff
1534 __init
1535 static unsigned long expand_bits_16[4] = {
1536 0x00000000,
1537 0x0000ffff,
1538 0xffff0000,
1539 0xffffffff
1543 __init
1544 static void
1545 draw_byte_32(unsigned char *font, unsigned long *base)
1547 unsigned long offset = reloc_offset();
1548 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1549 int l, bits;
1550 int fg = 0xFFFFFFFFUL;
1551 int bg = 0x00000000UL;
1554 for (l = 0; l < 16; ++l)
1556 bits = *font++;
1557 base[0] = (-(bits >> 7) & fg) ^ bg;
1558 base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
1559 base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
1560 base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
1561 base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
1562 base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
1563 base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
1564 base[7] = (-(bits & 1) & fg) ^ bg;
1565 base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
1569 __init
1570 static void
1571 draw_byte_16(unsigned char *font, unsigned long *base)
1573 unsigned long offset = reloc_offset();
1574 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1575 int l, bits;
1576 int fg = 0xFFFFFFFFUL;
1577 int bg = 0x00000000UL;
1578 unsigned long *eb = RELOC(expand_bits_16);
1580 for (l = 0; l < 16; ++l)
1582 bits = *font++;
1583 base[0] = (eb[bits >> 6] & fg) ^ bg;
1584 base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
1585 base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
1586 base[3] = (eb[bits & 3] & fg) ^ bg;
1587 base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
1591 __init
1592 static void
1593 draw_byte_8(unsigned char *font, unsigned long *base)
1595 unsigned long offset = reloc_offset();
1596 boot_infos_t* bi = PTRRELOC(RELOC(boot_infos));
1597 int l, bits;
1598 int fg = 0x0F0F0F0FUL;
1599 int bg = 0x00000000UL;
1600 unsigned long *eb = RELOC(expand_bits_8);
1602 for (l = 0; l < 16; ++l)
1604 bits = *font++;
1605 base[0] = (eb[bits >> 4] & fg) ^ bg;
1606 base[1] = (eb[bits & 0xf] & fg) ^ bg;
1607 base = (unsigned long *) ((char *)base + bi->dispDeviceRowBytes);
1611 __init
1612 static unsigned char vga_font[cmapsz] = {
1613 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
1615 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
1616 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
1617 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
1618 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
1619 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1620 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
1622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
1623 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
1624 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
1626 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
1627 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
1628 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
1629 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
1630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
1631 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
1632 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
1633 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
1634 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
1635 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
1636 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1637 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
1638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1639 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
1640 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
1641 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
1642 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1643 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
1644 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
1645 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1647 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1648 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1649 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
1650 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
1651 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1652 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1653 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
1654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
1655 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1657 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
1658 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
1659 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
1660 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
1661 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
1662 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
1663 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
1664 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1665 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1666 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
1667 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
1668 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1669 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
1670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
1671 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1672 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
1673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
1674 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1675 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1676 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
1677 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
1678 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
1679 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1680 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
1681 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
1682 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
1683 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
1684 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
1687 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1688 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1689 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
1690 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1691 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1692 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1693 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
1694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
1695 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
1696 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1697 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
1698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
1699 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
1700 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1701 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
1702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
1703 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
1704 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
1705 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
1706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
1707 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
1708 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
1711 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
1712 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
1713 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
1714 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
1715 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
1716 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
1717 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
1718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1719 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
1720 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
1721 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
1722 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
1723 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1724 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1727 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
1728 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
1730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
1731 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
1732 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1733 0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
1734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
1735 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1736 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1737 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
1738 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
1741 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
1743 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
1744 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
1745 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
1746 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
1747 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1749 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
1750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
1751 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
1752 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
1753 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
1755 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
1756 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
1757 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
1759 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1760 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1761 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1762 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
1763 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
1765 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
1766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
1767 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
1768 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
1769 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
1771 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1772 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
1773 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
1774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
1775 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
1776 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
1777 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
1778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1779 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
1780 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1781 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
1783 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
1784 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
1785 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1786 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
1787 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
1788 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1789 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
1790 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
1791 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
1792 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1793 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
1794 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
1795 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
1796 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1797 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
1798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1799 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
1800 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1801 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1802 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
1803 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
1804 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1805 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
1806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
1807 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
1808 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
1809 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
1811 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
1812 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1813 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1814 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
1815 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
1816 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
1817 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1818 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1819 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
1820 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1821 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
1822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
1823 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
1824 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
1825 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
1826 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
1827 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
1828 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1829 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1830 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
1831 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
1832 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1833 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
1834 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
1835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
1836 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1837 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
1838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
1839 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1840 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1841 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
1842 0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
1843 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1844 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
1845 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
1846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
1847 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
1848 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1849 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
1850 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
1851 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
1852 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1853 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
1854 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
1855 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
1856 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
1858 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
1859 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
1860 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1861 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1862 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
1863 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1864 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1865 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
1866 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
1867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1868 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1869 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
1870 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
1871 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1872 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1873 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1874 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1876 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1877 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1878 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1879 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1880 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1881 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
1882 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
1883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1884 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1885 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
1886 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
1887 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
1888 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1889 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
1890 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
1891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1892 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
1894 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
1895 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1896 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1897 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1898 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
1899 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1900 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1901 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
1902 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
1903 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1904 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1905 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1906 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1907 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
1908 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
1909 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
1910 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1911 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1912 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
1913 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
1914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
1915 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1916 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
1917 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
1918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
1919 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1920 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
1921 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1922 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
1923 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
1924 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
1925 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
1926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
1927 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1928 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1929 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
1930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
1931 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
1932 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1933 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
1934 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
1935 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1936 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
1937 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
1938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
1939 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1940 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
1941 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
1942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
1943 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
1944 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1945 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
1946 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1947 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
1948 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
1949 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
1950 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
1951 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1952 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
1953 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1954 0x00, 0x00, 0x00, 0x00,
1957 #endif /* CONFIG_BOOTX_TEXT */