xref: /netbsd-src/sys/arch/zaurus/zaurus/machdep.c (revision 3e5d658ac504acc1c863cc2f0d8eff56a288830a)
1 /*	$NetBSD: machdep.c,v 1.55 2024/05/13 00:08:06 msaitoh Exp $	*/
2 /*	$OpenBSD: zaurus_machdep.c,v 1.25 2006/06/20 18:24:04 todd Exp $	*/
3 
4 /*
5  * Copyright (c) 2002, 2003  Genetec Corporation.  All rights reserved.
6  * Written by Hiroyuki Bessho for Genetec Corporation.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. The name of Genetec Corporation may not be used to endorse or
17  *    promote products derived from this software without specific prior
18  *    written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  *
32  * Machine dependent functions for kernel setup for
33  * Intel DBPXA250 evaluation board (a.k.a. Lubbock).
34  * Based on iq80310_machhdep.c
35  */
36 
37 /*
38  * Copyright (c) 2001 Wasabi Systems, Inc.
39  * All rights reserved.
40  *
41  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
42  *
43  * Redistribution and use in source and binary forms, with or without
44  * modification, are permitted provided that the following conditions
45  * are met:
46  * 1. Redistributions of source code must retain the above copyright
47  *    notice, this list of conditions and the following disclaimer.
48  * 2. Redistributions in binary form must reproduce the above copyright
49  *    notice, this list of conditions and the following disclaimer in the
50  *    documentation and/or other materials provided with the distribution.
51  * 3. All advertising materials mentioning features or use of this software
52  *    must display the following acknowledgement:
53  *	This product includes software developed for the NetBSD Project by
54  *	Wasabi Systems, Inc.
55  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
56  *    or promote products derived from this software without specific prior
57  *    written permission.
58  *
59  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
60  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
61  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
62  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
63  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
64  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
65  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
66  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
67  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
68  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
69  * POSSIBILITY OF SUCH DAMAGE.
70  */
71 
72 /*
73  * Copyright (c) 1997,1998 Mark Brinicombe.
74  * Copyright (c) 1997,1998 Causality Limited.
75  * All rights reserved.
76  *
77  * Redistribution and use in source and binary forms, with or without
78  * modification, are permitted provided that the following conditions
79  * are met:
80  * 1. Redistributions of source code must retain the above copyright
81  *    notice, this list of conditions and the following disclaimer.
82  * 2. Redistributions in binary form must reproduce the above copyright
83  *    notice, this list of conditions and the following disclaimer in the
84  *    documentation and/or other materials provided with the distribution.
85  * 3. All advertising materials mentioning features or use of this software
86  *    must display the following acknowledgement:
87  *	This product includes software developed by Mark Brinicombe
88  *	for the NetBSD Project.
89  * 4. The name of the company nor the name of the author may be used to
90  *    endorse or promote products derived from this software without specific
91  *    prior written permission.
92  *
93  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
94  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
95  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
96  * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
97  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
98  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
99  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
101  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
102  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
103  * SUCH DAMAGE.
104  *
105  * Machine dependent functions for kernel setup for Intel IQ80310 evaluation
106  * boards using RedBoot firmware.
107  */
108 
109 #include <sys/cdefs.h>
110 __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.55 2024/05/13 00:08:06 msaitoh Exp $");
111 
112 #include "opt_ddb.h"
113 #include "opt_kgdb.h"
114 #include "opt_modular.h"
115 #include "opt_md.h"
116 #include "opt_com.h"
117 #include "ksyms.h"
118 
119 #include "opt_kloader.h"
120 #ifndef KLOADER_KERNEL_PATH
121 #define KLOADER_KERNEL_PATH	"/netbsd"
122 #endif
123 
124 #include <sys/param.h>
125 #include <sys/device.h>
126 #include <sys/systm.h>
127 #include <sys/kernel.h>
128 #include <sys/exec.h>
129 #include <sys/proc.h>
130 #include <sys/msgbuf.h>
131 #include <sys/reboot.h>
132 #include <sys/termios.h>
133 #include <sys/boot_flag.h>
134 #include <sys/cpu.h>
135 #include <sys/conf.h>
136 #include <sys/queue.h>
137 #include <sys/bus.h>
138 
139 #include <uvm/uvm_extern.h>
140 
141 #include <dev/cons.h>
142 
143 #include <dev/ic/comreg.h>
144 
145 #include <machine/db_machdep.h>
146 #include <ddb/db_sym.h>
147 #include <ddb/db_extern.h>
148 #ifdef KGDB
149 #include <sys/kgdb.h>
150 #endif
151 
152 #include <machine/bootconfig.h>
153 #include <machine/bootinfo.h>
154 #ifdef KLOADER
155 #include <machine/kloader.h>
156 #endif
157 
158 #include <arm/locore.h>
159 #include <arm/undefined.h>
160 #include <arm/arm32/machdep.h>
161 
162 #include <arm/xscale/pxa2x0cpu.h>
163 #include <arm/xscale/pxa2x0reg.h>
164 #include <arm/xscale/pxa2x0var.h>
165 #include <arm/xscale/pxa2x0_gpio.h>
166 
167 #include <arm/sa11x0/sa11x0_ostvar.h>
168 
169 #include <arch/zaurus/zaurus/zaurus_reg.h>
170 #include <arch/zaurus/zaurus/zaurus_var.h>
171 
172 #include <zaurus/dev/scoopreg.h>
173 #include <zaurus/dev/zlcdvar.h>
174 #include <zaurus/dev/w100lcdvar.h>
175 
176 #if 0	/* XXX */
177 #include "apm.h"
178 #endif	/* XXX */
179 #if NAPM > 0
180 #include <zaurus/dev/zapmvar.h>
181 #endif
182 
183 /* Kernel text starts 2MB in from the bottom of the kernel address space. */
184 #define	KERNEL_TEXT_BASE	((vaddr_t)&KERNEL_BASE_virt)
185 #ifndef	KERNEL_VM_BASE
186 #define	KERNEL_VM_BASE		(KERNEL_BASE + 0x01000000)
187 #endif
188 
189 /*
190  * The range 0xc4000000 - 0xcfffffff is available for kernel VM space
191  * Core-logic registers and I/O mappings occupy 0xfd000000 - 0xffffffff
192  */
193 #define KERNEL_VM_SIZE		0x0c000000
194 
195 int zaurusmod;			/* Zaurus model */
196 
197 BootConfig bootconfig;		/* Boot config storage */
198 char *boot_file = NULL;
199 char *boot_args = NULL;
200 
201 paddr_t physical_start;
202 paddr_t physical_freestart;
203 paddr_t physical_freeend;
204 paddr_t physical_end;
205 u_int free_pages;
206 
207 #ifndef PMAP_STATIC_L1S
208 int max_processes = 64;			/* Default number */
209 #endif	/* !PMAP_STATIC_L1S */
210 
211 /* Physical and virtual addresses for some global pages */
212 pv_addr_t minidataclean;
213 
214 paddr_t msgbufphys;
215 
216 #define KERNEL_PT_SYS		0	/* Page table for mapping proc0 zero page */
217 #define KERNEL_PT_KERNEL	1	/* Page table for mapping kernel */
218 #define	KERNEL_PT_KERNEL_NUM	((KERNEL_VM_BASE - KERNEL_BASE) >> 22)
219 #define KERNEL_PT_VMDATA	(KERNEL_PT_KERNEL + KERNEL_PT_KERNEL_NUM)
220 				        /* Page tables for mapping kernel VM */
221 #define	KERNEL_PT_VMDATA_NUM	4	/* start with 16MB of KVM */
222 #define NUM_KERNEL_PTS		(KERNEL_PT_VMDATA + KERNEL_PT_VMDATA_NUM)
223 
224 pv_addr_t kernel_pt_table[NUM_KERNEL_PTS];
225 
226 const char *console =
227 #ifdef FFUARTCONSOLE
228 	"ffuart";
229 #else
230 	"glass";
231 #endif
232 int glass_console = 0;
233 
234 #ifdef KLOADER
235 pv_addr_t bootinfo_pt;
236 pv_addr_t bootinfo_pg;
237 struct kloader_bootinfo kbootinfo;
238 int kloader_howto = 0;
239 #else
240 struct bootinfo _bootinfo;
241 #endif
242 struct bootinfo *bootinfo;
243 struct btinfo_howto *bi_howto;
244 
245 extern char etext[], end[];
246 extern void *esym;
247 #if NKSYMS || defined(DDB) || defined(MODULAR)
248 #include <sys/exec_elf.h>
249 #endif
250 
251 #define	KERNEL_BASE_PHYS	((paddr_t)&KERNEL_BASE_phys)
252 #define	BOOTINFO_PAGE		(KERNEL_BASE_PHYS - PAGE_SIZE)
253 
254 /* Prototypes */
255 void	consinit(void);
256 void	dumpsys(void);
257 #ifdef KGDB
258 void	kgdb_port_init(void);
259 #endif
260 #ifdef KLOADER
261 static int parseboot(char *arg, char **filename, int *howto);
262 static char *gettrailer(char *arg);
263 static int parseopts(const char *opts, int *howto);
264 #endif
265 
266 #if defined(CPU_XSCALE_PXA250)
267 static struct pxa2x0_gpioconf pxa25x_boarddep_gpioconf[] = {
268 	{  34, GPIO_ALT_FN_1_IN },	/* FFRXD */
269 	{  35, GPIO_ALT_FN_1_IN },	/* FFCTS */
270 	{  39, GPIO_ALT_FN_2_OUT },	/* FFTXD */
271 	{  40, GPIO_ALT_FN_2_OUT },	/* FFDTR */
272 	{  41, GPIO_ALT_FN_2_OUT },	/* FFRTS */
273 
274 	{  44, GPIO_ALT_FN_1_IN },	/* BTCST */
275 	{  45, GPIO_ALT_FN_2_OUT },	/* BTRST */
276 
277 	{ -1 }
278 };
279 static struct pxa2x0_gpioconf *pxa25x_zaurus_gpioconf[] = {
280 	pxa25x_com_btuart_gpioconf,
281 	pxa25x_com_ffuart_gpioconf,
282 	pxa25x_com_stuart_gpioconf,
283 	pxa25x_boarddep_gpioconf,
284 	NULL
285 };
286 #else
287 static struct pxa2x0_gpioconf *pxa25x_zaurus_gpioconf[] = {
288 	NULL
289 };
290 #endif
291 #if defined(CPU_XSCALE_PXA270)
292 static struct pxa2x0_gpioconf pxa27x_boarddep_gpioconf[] = {
293 	{  34, GPIO_ALT_FN_1_IN },	/* FFRXD */
294 	{  35, GPIO_ALT_FN_1_IN },	/* FFCTS */
295 	{  39, GPIO_ALT_FN_2_OUT },	/* FFTXD */
296 	{  40, GPIO_ALT_FN_2_OUT },	/* FFDTR */
297 	{  41, GPIO_ALT_FN_2_OUT },	/* FFRTS */
298 
299 	{  44, GPIO_ALT_FN_1_IN },	/* BTCST */
300 	{  45, GPIO_ALT_FN_2_OUT },	/* BTRST */
301 
302 	{ 104, GPIO_ALT_FN_1_OUT },	/* pSKTSEL */
303 
304 	{ -1 }
305 };
306 static struct pxa2x0_gpioconf *pxa27x_zaurus_gpioconf[] = {
307 	pxa27x_com_btuart_gpioconf,
308 	pxa27x_com_ffuart_gpioconf,
309 	pxa27x_com_stuart_gpioconf,
310 	pxa27x_i2c_gpioconf,
311 	pxa27x_i2s_gpioconf,
312 	pxa27x_pxamci_gpioconf,
313 	pxa27x_boarddep_gpioconf,
314 	NULL
315 };
316 #else
317 static struct pxa2x0_gpioconf *pxa27x_zaurus_gpioconf[] = {
318 	NULL
319 };
320 #endif
321 
322 /*
323  * void cpu_reboot(int howto, char *bootstr)
324  *
325  * Reboots the system
326  *
327  * Deal with any syncing, unmounting, dumping and shutdown hooks,
328  * then reset the CPU.
329  */
330 void
cpu_reboot(int howto,char * bootstr)331 cpu_reboot(int howto, char *bootstr)
332 {
333 	/*
334 	 * If we are still cold then hit the air brakes
335 	 * and crash to earth fast
336 	 */
337 	if (cold) {
338 		howto |= RB_HALT;
339 		goto haltsys;
340 	}
341 
342 	boothowto = howto;
343 
344 #ifdef KLOADER
345 	if ((howto & RB_HALT) == 0 && panicstr == NULL) {
346 		char *filename = NULL;
347 
348 		if ((howto & RB_STRING) && (bootstr != NULL)) {
349 			if (parseboot(bootstr, &filename, &kloader_howto) == 0){
350 				filename = NULL;
351 				kloader_howto = 0;
352 			}
353 		}
354 		if (kloader_howto != 0) {
355 			printf("howto: 0x%x\n", kloader_howto);
356 		}
357 		if (filename != NULL) {
358 			kloader_reboot_setup(filename);
359 		} else {
360 			kloader_reboot_setup(KLOADER_KERNEL_PATH);
361 		}
362 	}
363 #endif
364 
365 	/*
366 	 * If RB_NOSYNC was not specified sync the discs.
367 	 * Note: Unless cold is set to 1 here, syslogd will die during the
368 	 * unmount.  It looks like syslogd is getting woken up only to find
369 	 * that it cannot page part of the binary in as the filesystem has
370 	 * been unmounted.
371 	 */
372 	if (!(howto & RB_NOSYNC)) {
373 		bootsync();
374 	}
375 
376 	/* Wait 3s */
377 	delay(3 * 1000 * 1000);
378 
379 	/* Say NO to interrupts */
380 	splhigh();
381 
382 	/* Do a dump if requested. */
383 	if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP)
384 		dumpsys();
385 
386 haltsys:
387 	/* Run any shutdown hooks */
388 	doshutdownhooks();
389 
390 	pmf_system_shutdown(boothowto);
391 
392 	/* Make sure IRQ's are disabled */
393 	IRQdisable;
394 
395 	if (howto & RB_HALT) {
396 #if NAPM > 0
397 		if (howto & RB_POWERDOWN) {
398 			printf("\nAttempting to power down...\n");
399 			zapm_poweroff();
400 		}
401 #endif
402 		printf("The operating system has halted.\n");
403 		printf("Please press any key to reboot.\n\n");
404 		cngetc();
405 	}
406 #ifdef KLOADER
407 	else if (panicstr == NULL) {
408 		delay(1 * 1000 * 1000);
409 		kloader_reboot();
410 		printf("\n");
411 		printf("Failed to load a new kernel.\n");
412 		printf("Please press any key to reboot.\n\n");
413 		cngetc();
414 	}
415 #endif
416 
417 	printf("rebooting...\n");
418 	delay(1 * 1000 * 1000);
419 	zaurus_restart();
420 
421 	printf("REBOOT FAILED!!!\n");
422 	for (;;)
423 		continue;
424 	/*NOTREACHED*/
425 }
426 
427 /*
428  * Do a GPIO reset, immediately causing the processor to begin the normal
429  * boot sequence.  See 2.7 Reset in the PXA27x Developer's Manual for the
430  * summary of effects of this kind of reset.
431  */
432 void
zaurus_restart(void)433 zaurus_restart(void)
434 {
435 	uint32_t rv;
436 
437 	if (ZAURUS_ISC1000 || ZAURUS_ISC3000) {
438 		rv = pxa2x0_memctl_read(MEMCTL_MSC0);
439 		if ((rv & 0xffff0000) == 0x7ff00000) {
440 			pxa2x0_memctl_write(MEMCTL_MSC0,
441 			    (rv & 0xffff) | 0x7ee00000);
442 		}
443 
444 		/* External reset circuit presumably asserts nRESET_GPIO. */
445 		pxa2x0_gpio_set_function(89, GPIO_OUT | GPIO_SET);
446 	} else {
447 		/* SL-C7x0/SL-C860 */
448 		/* Clear all reset status */
449 		ioreg_write(ZAURUS_POWMAN_VBASE + POWMAN_RCSR,
450 		    POWMAN_HWR|POWMAN_WDR|POWMAN_SMR|POWMAN_GPR);
451 
452 		/* watchdog reset */
453 		saost_reset();
454 	}
455 	delay(1 * 1000 * 1000);	/* wait 1s */
456 }
457 
458 static inline pd_entry_t *
read_ttb(void)459 read_ttb(void)
460 {
461 	u_long ttb;
462 
463 	__asm volatile("mrc p15, 0, %0, c2, c0, 0" : "=r" (ttb));
464 
465 	return (pd_entry_t *)(ttb & ~((1 << 14) - 1));
466 }
467 
468 /*
469  * Static device mappings. These peripheral registers are mapped at
470  * fixed virtual addresses very early in initarm() so that we can use
471  * them while booting the kernel, and stay at the same address
472  * throughout whole kernel's life time.
473  *
474  * We use this table twice; once with bootstrap page table, and once
475  * with kernel's page table which we build up in initarm().
476  *
477  * Since we map these registers into the bootstrap page table using
478  * pmap_devmap_bootstrap() which calls pmap_map_chunk(), we map
479  * registers segment-aligned and segment-rounded in order to avoid
480  * using the 2nd page tables.
481  */
482 static const struct pmap_devmap zaurus_devmap[] = {
483     DEVMAP_ENTRY(
484 	    ZAURUS_GPIO_VBASE,
485 	    PXA2X0_GPIO_BASE,
486 	    PXA2X0_GPIO_SIZE
487     ),
488     DEVMAP_ENTRY(
489 	    ZAURUS_CLKMAN_VBASE,
490 	    PXA2X0_CLKMAN_BASE,
491 	    PXA2X0_CLKMAN_SIZE
492     ),
493     DEVMAP_ENTRY(
494 	    ZAURUS_INTCTL_VBASE,
495 	    PXA2X0_INTCTL_BASE,
496 	    PXA2X0_INTCTL_SIZE
497     ),
498     DEVMAP_ENTRY(
499 	    ZAURUS_MEMCTL_VBASE,
500 	    PXA2X0_MEMCTL_BASE,
501 	    PXA2X0_MEMCTL_SIZE
502     ),
503     DEVMAP_ENTRY(
504 	    ZAURUS_SCOOP0_VBASE,
505 	    C3000_SCOOP0_BASE,
506 	    SCOOP_SIZE
507     ),
508     DEVMAP_ENTRY(
509 	    ZAURUS_SCOOP1_VBASE,
510 	    C3000_SCOOP1_BASE,
511 	    SCOOP_SIZE
512     ),
513     DEVMAP_ENTRY(
514 	    ZAURUS_FFUART_VBASE,
515 	    PXA2X0_FFUART_BASE,
516 	    4 * COM_NPORTS
517     ),
518     DEVMAP_ENTRY(
519 	    ZAURUS_BTUART_VBASE,
520 	    PXA2X0_BTUART_BASE,
521 	    4 * COM_NPORTS
522     ),
523     DEVMAP_ENTRY(
524 	    ZAURUS_STUART_VBASE,
525 	    PXA2X0_STUART_BASE,
526 	    4 * COM_NPORTS
527     ),
528     DEVMAP_ENTRY(
529 	    ZAURUS_POWMAN_VBASE,
530 	    PXA2X0_POWMAN_BASE,
531 	    PXA2X0_POWMAN_SIZE
532     ),
533 
534     DEVMAP_ENTRY_END
535 };
536 
537 void green_on(int virt);
538 void
green_on(int virt)539 green_on(int virt)
540 {
541 	/* clobber green led p */
542 	volatile uint16_t *p;
543 
544 	if (virt) {
545 		p = (volatile uint16_t *)(ZAURUS_SCOOP0_VBASE + SCOOP_GPWR);
546 	} else {
547 		p = (volatile uint16_t *)(C3000_SCOOP0_BASE + SCOOP_GPWR);
548 	}
549 
550 	*p |= (1 << SCOOP0_LED_GREEN);
551 }
552 
553 void irda_on(int virt);
554 void
irda_on(int virt)555 irda_on(int virt)
556 {
557 	/* clobber IrDA led p */
558 	volatile uint16_t *p;
559 
560 	if (virt) {
561 		/* XXX scoop1 registers are not page-aligned! */
562 		int o = C3000_SCOOP1_BASE - trunc_page(C3000_SCOOP1_BASE);
563 		p = (volatile uint16_t *)(ZAURUS_SCOOP1_VBASE + o + SCOOP_GPWR);
564 	} else {
565 		p = (volatile uint16_t *)(C3000_SCOOP1_BASE + SCOOP_GPWR);
566 	}
567 
568 	*p &= ~(1 << SCOOP1_IR_ON);
569 }
570 
571 static int
hw_isc1000(void)572 hw_isc1000(void)
573 {
574 	/* XXX scoop1 registers are not page-aligned! */
575 	const u_long baseaddr = ZAURUS_SCOOP1_VBASE +
576 	    (C3000_SCOOP1_BASE - trunc_page(C3000_SCOOP1_BASE));
577 	uint16_t mcr, cdr, csr, cpr, ccr, irr, irm, imr, isr;
578 	uint16_t gpcr, gpwr, gprr;
579 
580 	mcr = ioreg16_read(baseaddr + SCOOP_MCR);
581 	cdr = ioreg16_read(baseaddr + SCOOP_CDR);
582 	csr = ioreg16_read(baseaddr + SCOOP_CSR);
583 	cpr = ioreg16_read(baseaddr + SCOOP_CPR);
584 	ccr = ioreg16_read(baseaddr + SCOOP_CCR);
585 	irr = ioreg16_read(baseaddr + SCOOP_IRR);
586 	irm = ioreg16_read(baseaddr + SCOOP_IRM);
587 	imr = ioreg16_read(baseaddr + SCOOP_IMR);
588 	isr = ioreg16_read(baseaddr + SCOOP_ISR);
589 	gpcr = ioreg16_read(baseaddr + SCOOP_GPCR);
590 	gpwr = ioreg16_read(baseaddr + SCOOP_GPWR);
591 	gprr = ioreg16_read(baseaddr + SCOOP_GPRR);
592 
593 	if (mcr == 0 && cdr == 0 && csr == 0 && cpr == 0 && ccr == 0 &&
594 	    irr == 0 && irm == 0 && imr == 0 && isr == 0 &&
595 	    gpcr == 0 && gpwr == 0 && gprr == 0) {
596 	    /* scoop1 isn't found: hardware is SL-C1000 */
597 	    return 1;
598 	}
599 	return 0;
600 }
601 
602 /*
603  * vaddr_t initarm(...)
604  *
605  * Initial entry point on startup. This gets called before main() is
606  * entered.
607  * It should be responsible for setting up everything that must be
608  * in place when main is called.
609  * This includes
610  *   Taking a copy of the boot configuration structure.
611  *   Initialising the physical console so characters can be printed.
612  *   Setting up page tables for the kernel
613  *   Relocating the kernel to the bottom of physical memory
614  */
615 vaddr_t
initarm(void * arg)616 initarm(void *arg)
617 {
618 	extern char KERNEL_BASE_phys[], KERNEL_BASE_virt[];
619 	int loop;
620 	int loop1;
621 	u_int l1pagetable;
622 	paddr_t memstart;
623 	psize_t memsize;
624 	struct pxa2x0_gpioconf **zaurus_gpioconf;
625 	u_int *magicaddr;
626 #if NKSYMS || defined(DDB) || defined(MODULAR)
627 	u_int symbolsize;
628 #endif
629 
630 	/* Get ready for zaurus_restart() */
631 	pxa2x0_memctl_bootstrap(PXA2X0_MEMCTL_BASE);
632 
633 	/*
634 	 * Heads up ... Setup the CPU / MMU / TLB functions
635 	 */
636 	if (set_cpufuncs())
637 		panic("cpu not recognized!");
638 
639 	/* Get ready for splfoo() */
640 	pxa2x0_intr_bootstrap(PXA2X0_INTCTL_BASE);
641 
642 	/* map some peripheral registers at static I/O area */
643 	pmap_devmap_bootstrap((vaddr_t)read_ttb(), zaurus_devmap);
644 
645 	/* set new memctl register address so that zaurus_restart() doesn't
646 	   touch illegal address. */
647 	pxa2x0_memctl_bootstrap(ZAURUS_MEMCTL_VBASE);
648 
649 	/* set new intc register address so that splfoo() doesn't
650 	   touch illegal address.  */
651 	pxa2x0_intr_bootstrap(ZAURUS_INTCTL_VBASE);
652 
653 	/*
654 	 * Examine the boot args string for options we need to know about
655 	 * now.
656 	 */
657 	magicaddr = (u_int *)(KERNEL_BASE_PHYS - BOOTARGS_BUFSIZ);
658 	if (*magicaddr == BOOTARGS_MAGIC) {
659 #ifdef KLOADER
660 		bootinfo = &kbootinfo.bootinfo;
661 #else
662 		bootinfo = &_bootinfo;
663 #endif
664 		memcpy(bootinfo, (void *)(KERNEL_BASE_PHYS - BOOTINFO_MAXSIZE),
665 		    BOOTINFO_MAXSIZE);
666 		bi_howto = lookup_bootinfo(BTINFO_HOWTO);
667 		boothowto = (bi_howto != NULL) ? bi_howto->howto : RB_AUTOBOOT;
668 	} else {
669 		boothowto = RB_AUTOBOOT;
670 	}
671 	*magicaddr = 0xdeadbeef;
672 	if (boothowto & RB_MD1) {
673 		/* serial console */
674 		console = "ffuart";
675 	}
676 
677 	memstart = PXA2X0_SDRAM0_START;
678 	memsize =  0x04000000; /* 64MB */
679 
680 	/*
681 	 * This test will work for now but has to be revised when support
682 	 * for other models is added.
683 	 */
684 	if ((cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA27X) {
685 		if (hw_isc1000())
686 			zaurusmod = ZAURUS_C1000;	/* SL-C1000 */
687 		else
688 			zaurusmod = ZAURUS_C3000;	/* SL-C3x00 */
689 		zaurus_gpioconf = pxa27x_zaurus_gpioconf;
690 	} else {
691 		zaurusmod = ZAURUS_C860;		/* SL-C7x0/860 */
692 		if (cputype == CPU_ID_PXA250B) {
693 			/* SL-C700 */
694 			memsize =  0x02000000;		/* 32MB */
695 		}
696 		zaurus_gpioconf = pxa25x_zaurus_gpioconf;
697 	}
698 
699 	/* setup a serial console for very early boot */
700 	pxa2x0_gpio_bootstrap(ZAURUS_GPIO_VBASE);
701 	pxa2x0_gpio_config(zaurus_gpioconf);
702 	pxa2x0_clkman_bootstrap(ZAURUS_CLKMAN_VBASE);
703 	if (strcmp(console, "glass") != 0)
704 		consinit();
705 #ifdef KGDB
706 	kgdb_port_init();
707 #endif
708 
709 #ifdef VERBOSE_INIT_ARM
710 	/* Talk to the user */
711 	printf("\nNetBSD/zaurus booting ...\n");
712 #endif
713 
714 #ifdef KLOADER
715 	/* copy boot parameter for kloader */
716 	kloader_bootinfo_set(&kbootinfo, 0, NULL, NULL, true);
717 #endif
718 
719 #ifdef VERBOSE_INIT_ARM
720 	printf("initarm: Configuring system ...\n");
721 #endif
722 
723 	/* Fake bootconfig structure for the benefit of pmap.c */
724 	/* XXX must make the memory description h/w independent */
725 	bootconfig.dramblocks = 1;
726 	bootconfig.dram[0].address = memstart;
727 	bootconfig.dram[0].pages = memsize / PAGE_SIZE;
728 
729 	/*
730 	 * Set up the variables that define the availability of
731 	 * physical memory.  For now, we're going to set
732 	 * physical_freestart to 0xa0200000 (where the kernel
733 	 * was loaded), and allocate the memory we need downwards.
734 	 * If we get too close to the page tables that RedBoot
735 	 * set up, we will panic.  We will update physical_freestart
736 	 * and physical_freeend later to reflect what pmap_bootstrap()
737 	 * wants to see.
738 	 *
739 	 * XXX pmap_bootstrap() needs an enema.
740 	 */
741 	physical_start = bootconfig.dram[0].address;
742 	physical_end = physical_start + (bootconfig.dram[0].pages * PAGE_SIZE);
743 
744 	physical_freestart = PXA2X0_SDRAM0_START + 0x9000;
745 	physical_freeend = BOOTINFO_PAGE;
746 
747 	physmem = (physical_end - physical_start) / PAGE_SIZE;
748 
749 #ifdef VERBOSE_INIT_ARM
750 	/* Tell the user about the memory */
751 	printf("physmemory: %lu pages at 0x%08lx -> 0x%08lx\n", physmem,
752 	    physical_start, physical_end - 1);
753 #endif
754 
755 	/*
756 	 * Okay, the kernel starts 2MB in from the bottom of physical
757 	 * memory.  We are going to allocate our bootstrap pages downwards
758 	 * from there.
759 	 *
760 	 * We need to allocate some fixed page tables to get the kernel
761 	 * going.  We allocate one page directory and a number of page
762 	 * tables and store the physical addresses in the kernel_pt_table
763 	 * array.
764 	 *
765 	 * The kernel page directory must be on a 16K boundary.  The page
766 	 * tables must be on 4K boundaries.  What we do is allocate the
767 	 * page directory on the first 16K boundary that we encounter, and
768 	 * the page tables on 4K boundaries otherwise.  Since we allocate
769 	 * at least 3 L2 page tables, we are guaranteed to encounter at
770 	 * least one 16K aligned region.
771 	 */
772 
773 #ifdef VERBOSE_INIT_ARM
774 	printf("Allocating page tables\n");
775 #endif
776 
777 	free_pages = (physical_freeend - physical_freestart) / PAGE_SIZE;
778 
779 #ifdef VERBOSE_INIT_ARM
780 	printf("freestart = 0x%08lx, free_pages = %d (0x%08x)\n",
781 	       physical_freestart, free_pages, free_pages);
782 #endif
783 
784 	/* Define a macro to simplify memory allocation */
785 #define	valloc_pages(var, np)				\
786 	alloc_pages((var).pv_pa, (np));			\
787 	(var).pv_va = KERNEL_BASE + (var).pv_pa - physical_start;
788 
789 #define alloc_pages(var, np)				\
790 	physical_freeend -= ((np) * PAGE_SIZE);		\
791 	if (physical_freeend < physical_freestart)	\
792 		panic("initarm: out of memory");	\
793 	(var) = physical_freeend;			\
794 	free_pages -= (np);				\
795 	memset((char *)(var), 0, ((np) * PAGE_SIZE));
796 
797 	loop1 = 0;
798 	for (loop = 0; loop <= NUM_KERNEL_PTS; ++loop) {
799 		/* Are we 16KB aligned for an L1 ? */
800 		if (((physical_freeend - L1_TABLE_SIZE) & (L1_TABLE_SIZE - 1)) == 0
801 		    && kernel_l1pt.pv_pa == 0) {
802 			valloc_pages(kernel_l1pt, L1_TABLE_SIZE / PAGE_SIZE);
803 		} else {
804 			valloc_pages(kernel_pt_table[loop1],
805 			    L2_TABLE_SIZE / PAGE_SIZE);
806 			++loop1;
807 		}
808 	}
809 #ifdef KLOADER
810 	valloc_pages(bootinfo_pt, L2_TABLE_SIZE / PAGE_SIZE);
811 #endif
812 
813 	/* This should never be able to happen but better confirm that. */
814 	if (!kernel_l1pt.pv_pa || (kernel_l1pt.pv_pa & (L1_TABLE_SIZE-1)) != 0)
815 		panic("initarm: Failed to align the kernel page directory");
816 
817 	/*
818 	 * Allocate a page for the system page mapped to V0x00000000
819 	 * This page will just contain the system vectors and can be
820 	 * shared by all processes.
821 	 */
822 	alloc_pages(systempage.pv_pa, 1);
823 
824 	/* Allocate stacks for all modes */
825 	valloc_pages(irqstack, IRQ_STACK_SIZE);
826 	valloc_pages(abtstack, ABT_STACK_SIZE);
827 	valloc_pages(undstack, UND_STACK_SIZE);
828 	valloc_pages(kernelstack, UPAGES);
829 
830 	/* Allocate enough pages for cleaning the Mini-Data cache. */
831 #ifdef DIAGNOSTIC
832 	KASSERT(xscale_minidata_clean_size <= PAGE_SIZE);
833 #endif
834 	valloc_pages(minidataclean, 1);
835 
836 #ifdef KLOADER
837 	bootinfo_pg.pv_pa = BOOTINFO_PAGE;
838 	bootinfo_pg.pv_va = KERNEL_BASE + bootinfo_pg.pv_pa - physical_start;
839 #endif
840 
841 #ifdef VERBOSE_INIT_ARM
842 	printf("IRQ stack: p0x%08lx v0x%08lx\n", irqstack.pv_pa,
843 	    irqstack.pv_va);
844 	printf("ABT stack: p0x%08lx v0x%08lx\n", abtstack.pv_pa,
845 	    abtstack.pv_va);
846 	printf("UND stack: p0x%08lx v0x%08lx\n", undstack.pv_pa,
847 	    undstack.pv_va);
848 	printf("SVC stack: p0x%08lx v0x%08lx\n", kernelstack.pv_pa,
849 	    kernelstack.pv_va);
850 	printf("minidataclean: p0x%08lx v0x%08lx, size = %ld\n",
851 	    minidataclean.pv_pa, minidataclean.pv_va,
852 	    xscale_minidata_clean_size);
853 #ifdef KLOADER
854 	printf("bootinfo_pg: p0x%08lx v0x%08lx\n", bootinfo_pg.pv_pa,
855 	    bootinfo_pg.pv_va);
856 #endif
857 #endif
858 
859 	/*
860 	 * XXX Defer this to later so that we can reclaim the memory
861 	 * XXX used by the RedBoot page tables.
862 	 */
863 	alloc_pages(msgbufphys, round_page(MSGBUFSIZE) / PAGE_SIZE);
864 
865 	/*
866 	 * Ok we have allocated physical pages for the primary kernel
867 	 * page tables
868 	 */
869 
870 #ifdef VERBOSE_INIT_ARM
871 	printf("Creating L1 page table at 0x%08lx\n", kernel_l1pt.pv_pa);
872 #endif
873 
874 	/*
875 	 * Now we start construction of the L1 page table
876 	 * We start by mapping the L2 page tables into the L1.
877 	 * This means that we can replace L1 mappings later on if necessary
878 	 */
879 	l1pagetable = kernel_l1pt.pv_pa;
880 
881 	/* Map the L2 pages tables in the L1 page table */
882 	pmap_link_l2pt(l1pagetable, 0x00000000,
883 	    &kernel_pt_table[KERNEL_PT_SYS]);
884 	for (loop = 0; loop < KERNEL_PT_KERNEL_NUM; loop++)
885 		pmap_link_l2pt(l1pagetable, KERNEL_BASE + loop * 0x00400000,
886 		    &kernel_pt_table[KERNEL_PT_KERNEL + loop]);
887 	for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
888 		pmap_link_l2pt(l1pagetable, KERNEL_VM_BASE + loop * 0x00400000,
889 		    &kernel_pt_table[KERNEL_PT_VMDATA + loop]);
890 #ifdef KLOADER
891 	pmap_link_l2pt(l1pagetable, PXA2X0_SDRAM0_START, &bootinfo_pt);
892 #endif
893 
894 	/* update the top of the kernel VM */
895 	pmap_curmaxkvaddr =
896 	    KERNEL_VM_BASE + (KERNEL_PT_VMDATA_NUM * 0x00400000);
897 
898 	/* check symbol table loaded by bootloader (zbsdmod.o) */
899 	esym = end;
900 #if NKSYMS || defined(DDB) || defined(MODULAR)
901 	symbolsize = 0;
902 	Elf_Ehdr *eh = (Elf_Ehdr *)end;
903 #ifdef VERBOSE_INIT_ARM
904 	printf("Checking ELF MAGIC at end: %02x %02x %02x %02x\n",
905 	    end[0], end[1], end[2], end[3]);
906 #endif
907 	if (memcmp(eh->e_ident, ELFMAG, SELFMAG) == 0) {
908 		Elf_Shdr *sh;
909 #ifdef VERBOSE_INIT_ARM
910 		printf("ELF header found at end\n");
911 #endif
912 		sh = (Elf_Shdr *)((char *)end + eh->e_shoff);
913 		for (loop = 0; loop < eh->e_shnum; loop++, sh++) {
914 #ifdef VERBOSE_INIT_ARM
915 			printf("Checking ELF header %d\n", loop);
916 #endif
917 			if (sh->sh_type != SHT_SYMTAB &&
918 			    sh->sh_type != SHT_STRTAB) {
919 				continue;
920 			}
921 #ifdef VERBOSE_INIT_ARM
922 			printf("Section[%2d]: offset = %d, size = %d\n",
923 			    loop, sh->sh_offset, sh->sh_size);
924 #endif
925 			if (sh->sh_offset > 0 &&
926 			    (sh->sh_offset + sh->sh_size) > symbolsize) {
927 				symbolsize = sh->sh_offset + sh->sh_size;
928 			}
929 #ifdef VERBOSE_INIT_ARM
930 			printf("Updating symbolsize = %d\n", symbolsize);
931 #endif
932 		}
933 		esym = (char *)esym + symbolsize;
934 	}
935 #ifdef VERBOSE_INIT_ARM
936 	printf("symbolsize = %d\n", symbolsize);
937 #endif
938 #endif /* NKSYMS || defined(DDB) || defined(MODULAR) */
939 
940 #ifdef VERBOSE_INIT_ARM
941 	printf("Mapping kernel\n");
942 #endif
943 
944 	/* Now we fill in the L2 pagetable for the kernel static code/data
945 	 * and the symbol table. */
946 	{
947 
948 		size_t textsize = (uintptr_t) etext - KERNEL_TEXT_BASE;
949 		size_t totalsize = (uintptr_t) esym - KERNEL_TEXT_BASE;
950 		u_int logical;
951 
952 		textsize = (textsize + PGOFSET) & ~PGOFSET;
953 		totalsize = (totalsize + PGOFSET) & ~PGOFSET;
954 
955 		/* offset of kernel in RAM */
956 		logical = KERNEL_TEXT_BASE - KERNEL_BASE;
957 
958 		logical += pmap_map_chunk(l1pagetable, KERNEL_BASE + logical,
959 		    physical_start + logical, textsize,
960 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
961 		pmap_map_chunk(l1pagetable, KERNEL_BASE + logical,
962 		    physical_start + logical, totalsize - textsize,
963 		    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
964 	}
965 
966 #ifdef VERBOSE_INIT_ARM
967 	printf("Constructing L2 page tables\n");
968 #endif
969 
970 	/* Map the stack pages */
971 	pmap_map_chunk(l1pagetable, irqstack.pv_va, irqstack.pv_pa,
972 	    IRQ_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
973 	pmap_map_chunk(l1pagetable, abtstack.pv_va, abtstack.pv_pa,
974 	    ABT_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
975 	pmap_map_chunk(l1pagetable, undstack.pv_va, undstack.pv_pa,
976 	    UND_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
977 	pmap_map_chunk(l1pagetable, kernelstack.pv_va, kernelstack.pv_pa,
978 	    UPAGES * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
979 
980 	pmap_map_chunk(l1pagetable, kernel_l1pt.pv_va, kernel_l1pt.pv_pa,
981 	    L1_TABLE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
982 
983 	for (loop = 0; loop < NUM_KERNEL_PTS; ++loop) {
984 		pmap_map_chunk(l1pagetable, kernel_pt_table[loop].pv_va,
985 		    kernel_pt_table[loop].pv_pa, L2_TABLE_SIZE,
986 		    VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
987 	}
988 
989 #ifdef KLOADER
990 	pmap_map_chunk(l1pagetable, bootinfo_pt.pv_va, bootinfo_pt.pv_pa,
991 	    L2_TABLE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
992 	pmap_map_chunk(l1pagetable, bootinfo_pg.pv_va, bootinfo_pg.pv_pa,
993 	    PAGE_SIZE, VM_PROT_ALL, PTE_CACHE);
994 #endif
995 
996 	/* Map the Mini-Data cache clean area. */
997 	xscale_setup_minidata(l1pagetable, minidataclean.pv_va,
998 	    minidataclean.pv_pa);
999 
1000 	/* Map the vector page. */
1001 #if 0
1002 	/* MULTI-ICE requires that page 0 is NC/NB so that it can download the
1003 	 * cache-clean code there.  */
1004 	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
1005 	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
1006 #else
1007 	pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
1008 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
1009 #endif
1010 
1011 	/*
1012 	 * map integrated peripherals at same address in l1pagetable
1013 	 * so that we can continue to use console.
1014 	 */
1015 	pmap_devmap_bootstrap(l1pagetable, zaurus_devmap);
1016 
1017 	/*
1018 	 * Give the XScale global cache clean code an appropriately
1019 	 * sized chunk of unmapped VA space starting at 0xff000000
1020 	 * (our device mappings end before this address).
1021 	 */
1022 	xscale_cache_clean_addr = 0xff000000U;
1023 
1024 	/*
1025 	 * Now we have the real page tables in place so we can switch to them.
1026 	 * Once this is done we will be running with the REAL kernel page
1027 	 * tables.
1028 	 */
1029 
1030 	/*
1031 	 * Update the physical_freestart/physical_freeend/free_pages
1032 	 * variables.
1033 	 */
1034 	{
1035 
1036 		physical_freestart = physical_start +
1037 		    ((((uintptr_t) esym + PGOFSET) & ~PGOFSET) - KERNEL_BASE);
1038 		physical_freeend = physical_end;
1039 		free_pages =
1040 		    (physical_freeend - physical_freestart) / PAGE_SIZE;
1041 	}
1042 
1043 	/* Switch tables */
1044 #ifdef VERBOSE_INIT_ARM
1045 	printf("freestart = 0x%08lx, free_pages = %d (0x%x)\n",
1046 	       physical_freestart, free_pages, free_pages);
1047 	printf("switching to new L1 page table  @%#lx...", kernel_l1pt.pv_pa);
1048 #endif
1049 
1050 	cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
1051 	cpu_setttb(kernel_l1pt.pv_pa, true);
1052 	cpu_tlb_flushID();
1053 	cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2));
1054 
1055 	/*
1056 	 * Moved from cpu_startup() as data_abort_handler() references
1057 	 * this during uvm init
1058 	 */
1059 	uvm_lwp_setuarea(&lwp0, kernelstack.pv_va);
1060 
1061 #ifdef VERBOSE_INIT_ARM
1062 	printf("bootstrap done.\n");
1063 #endif
1064 
1065 	arm32_vector_init(ARM_VECTORS_LOW, ARM_VEC_ALL);
1066 
1067 	/*
1068 	 * Pages were allocated during the secondary bootstrap for the
1069 	 * stacks for different CPU modes.
1070 	 * We must now set the r13 registers in the different CPU modes to
1071 	 * point to these stacks.
1072 	 * Since the ARM stacks use STMFD etc. we must set r13 to the top end
1073 	 * of the stack memory.
1074 	 */
1075 #ifdef VERBOSE_INIT_ARM
1076 	printf("init subsystems: stacks ");
1077 #endif
1078 
1079 	set_stackptr(PSR_IRQ32_MODE,
1080 	    irqstack.pv_va + IRQ_STACK_SIZE * PAGE_SIZE);
1081 	set_stackptr(PSR_ABT32_MODE,
1082 	    abtstack.pv_va + ABT_STACK_SIZE * PAGE_SIZE);
1083 	set_stackptr(PSR_UND32_MODE,
1084 	    undstack.pv_va + UND_STACK_SIZE * PAGE_SIZE);
1085 
1086 	/*
1087 	 * Well we should set a data abort handler.
1088 	 * Once things get going this will change as we will need a proper
1089 	 * handler.
1090 	 * Until then we will use a handler that just panics but tells us
1091 	 * why.
1092 	 * Initialisation of the vectors will just panic on a data abort.
1093 	 * This just fills in a slightly better one.
1094 	 */
1095 #ifdef VERBOSE_INIT_ARM
1096 	printf("vectors ");
1097 #endif
1098 	data_abort_handler_address = (u_int)data_abort_handler;
1099 	prefetch_abort_handler_address = (u_int)prefetch_abort_handler;
1100 	undefined_handler_address = (u_int)undefinedinstruction_bounce;
1101 
1102 	/* Initialise the undefined instruction handlers */
1103 #ifdef VERBOSE_INIT_ARM
1104 	printf("undefined ");
1105 #endif
1106 	undefined_init();
1107 
1108 	/* Load memory into UVM. */
1109 #ifdef VERBOSE_INIT_ARM
1110 	printf("page ");
1111 #endif
1112 	uvm_md_init();
1113 	uvm_page_physload(atop(physical_freestart), atop(physical_freeend),
1114 	    atop(physical_freestart), atop(physical_freeend),
1115 	    VM_FREELIST_DEFAULT);
1116 
1117 	/* Boot strap pmap telling it where managed kernel virtual memory is */
1118 #ifdef VERBOSE_INIT_ARM
1119 	printf("pmap ");
1120 #endif
1121 	pmap_bootstrap(KERNEL_VM_BASE, KERNEL_VM_BASE + KERNEL_VM_SIZE);
1122 
1123 #ifdef VERBOSE_INIT_ARM
1124 	printf("\n");
1125 #endif
1126 
1127 #ifdef __HAVE_MEMORY_DISK__
1128 	md_root_setconf(memory_disk, sizeof memory_disk);
1129 #endif
1130 
1131 #if NKSYMS || defined(DDB) || defined(MODULAR)
1132 	if (symbolsize > 0)
1133 		ksyms_addsyms_elf(symbolsize, &end, esym);
1134 #endif
1135 
1136 #ifdef KGDB
1137 	if (boothowto & RB_KDB) {
1138 		kgdb_debug_init = 1;
1139 		kgdb_connect(1);
1140 	}
1141 #endif
1142 
1143 #ifdef DDB
1144 	db_machine_init();
1145 	if (boothowto & RB_KDB)
1146 		Debugger();
1147 #endif
1148 
1149 	/* We return the new stack pointer address */
1150 	return kernelstack.pv_va + USPACE_SVC_STACK_TOP;
1151 }
1152 
1153 void *
lookup_bootinfo(int type)1154 lookup_bootinfo(int type)
1155 {
1156 	struct btinfo_common *help;
1157 	int n;
1158 
1159 	if (bootinfo == NULL)
1160 		return (NULL);
1161 
1162 	n = bootinfo->nentries;
1163 	help = (struct btinfo_common *)(bootinfo->info);
1164 	while (n--) {
1165 		if (help->type == type)
1166 			return (help);
1167 		help = (struct btinfo_common *)((char *)help + help->len);
1168 	}
1169 	return (NULL);
1170 }
1171 
1172 #ifdef KLOADER
1173 static int
parseboot(char * arg,char ** filename,int * howto)1174 parseboot(char *arg, char **filename, int *howto)
1175 {
1176 	char *opts = NULL;
1177 
1178 	*filename = NULL;
1179 	*howto = 0;
1180 
1181 	/* if there were no arguments */
1182 	if (arg == NULL || *arg == '\0')
1183 		return 1;
1184 
1185 	/* format is... */
1186 	/* [[xxNx:]filename] [-adqsv] */
1187 
1188 	/* check for just args */
1189 	if (arg[0] == '-') {
1190 		opts = arg;
1191 	} else {
1192 		/* there's a file name */
1193 		*filename = arg;
1194 
1195 		opts = gettrailer(arg);
1196 		if (opts == NULL || *opts == '\0') {
1197 			opts = NULL;
1198 		} else if (*opts != '-') {
1199 			printf("invalid arguments\n");
1200 			return 0;
1201 		}
1202 	}
1203 
1204 	/* at this point, we have dealt with filenames. */
1205 
1206 	/* now, deal with options */
1207 	if (opts) {
1208 		if (parseopts(opts, howto) == 0) {
1209 			return 0;
1210 		}
1211 	}
1212 	return 1;
1213 }
1214 
1215 static char *
gettrailer(char * arg)1216 gettrailer(char *arg)
1217 {
1218 	static char nullstr[] = "";
1219 	char *options;
1220 
1221 	if ((options = strchr(arg, ' ')) == NULL)
1222 		return nullstr;
1223 	else
1224 		*options++ = '\0';
1225 
1226 	/* trim leading blanks */
1227 	while (*options == ' ')
1228 		options++;
1229 
1230 	return options;
1231 }
1232 
1233 static int
parseopts(const char * opts,int * howto)1234 parseopts(const char *opts, int *howto)
1235 {
1236 	int r, tmpopt = *howto;
1237 
1238 	opts++; 	/* skip - */
1239 	while (*opts && *opts != ' ') {
1240 		r = 0;
1241 		BOOT_FLAG(*opts, r);
1242 		if (r == 0) {
1243 			printf("-%c: unknown flag\n", *opts);
1244 			return 0;
1245 		}
1246 		tmpopt |= r;
1247 		opts++;
1248 	}
1249 
1250 	*howto = tmpopt;
1251 	return 1;
1252 }
1253 #endif
1254 
1255 /*
1256  * Console
1257  */
1258 #include "com.h"
1259 #if (NCOM > 0)
1260 #include <dev/ic/comvar.h>
1261 #endif
1262 
1263 #include "lcd.h"
1264 #include "w100lcd.h"
1265 #include "wsdisplay.h"
1266 
1267 #ifndef CONSPEED
1268 #define CONSPEED B9600
1269 #endif
1270 #ifndef CONMODE
1271 #define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
1272 #endif
1273 
1274 int comcnspeed = CONSPEED;
1275 int comcnmode = CONMODE;
1276 
1277 #ifdef KGDB
1278 #ifndef KGDB_DEVNAME
1279 #define KGDB_DEVNAME	"ffuart"
1280 #endif
1281 const char kgdb_devname[] = KGDB_DEVNAME;
1282 
1283 #if (NCOM > 0)
1284 #ifndef KGDB_DEVMODE
1285 #define KGDB_DEVMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
1286 #endif
1287 int comkgdbmode = KGDB_DEVMODE;
1288 #endif /* NCOM */
1289 #endif /* KGDB */
1290 
1291 void
consinit(void)1292 consinit(void)
1293 {
1294 	static int consinit_called = 0;
1295 #if (NCOM > 0) && defined(COM_PXA2X0)
1296 	paddr_t paddr;
1297 	u_int cken = 0;
1298 #endif
1299 
1300 	if (consinit_called)
1301 		return;
1302 	consinit_called = 1;
1303 
1304 #if (NCOM > 0) && defined(COM_PXA2X0)
1305 #ifdef KGDB
1306 	if (strcmp(kgdb_devname, console) == 0) {
1307 		/* port is reserved for kgdb */
1308 	} else
1309 #endif
1310 	if (strcmp(console, "ffuart") == 0) {
1311 		paddr = PXA2X0_FFUART_BASE;
1312 		cken = CKEN_FFUART;
1313 	} else if (strcmp(console, "btuart") == 0) {
1314 		paddr = PXA2X0_BTUART_BASE;
1315 		cken = CKEN_BTUART;
1316 	} else if (strcmp(console, "stuart") == 0) {
1317 		paddr = PXA2X0_STUART_BASE;
1318 		cken = CKEN_STUART;
1319 		irda_on(0);
1320 	} else
1321 #endif
1322 	if (strcmp(console, "glass") == 0) {
1323 #if ((NLCD > 0) || (NW100LCD > 0)) && (NWSDISPLAY > 0)
1324 		glass_console = 1;
1325 #if NLCD > 0
1326 		if (ZAURUS_ISC1000 || ZAURUS_ISC3000)
1327 			lcd_cnattach();
1328 #endif
1329 #if NW100LCD > 0
1330 		if (ZAURUS_ISC860)
1331 			w100lcd_cnattach();
1332 #endif
1333 #endif
1334 	}
1335 
1336 #if (NCOM > 0) && defined(COM_PXA2X0)
1337 	if (cken != 0 && comcnattach(&pxa2x0_a4x_bs_tag, paddr, comcnspeed,
1338 	    PXA2X0_COM_FREQ, COM_TYPE_PXA2x0, comcnmode) == 0) {
1339 		pxa2x0_clkman_config(cken, 1);
1340 	}
1341 #endif
1342 }
1343 
1344 #ifdef KGDB
1345 void
kgdb_port_init(void)1346 kgdb_port_init(void)
1347 {
1348 #if (NCOM > 0) && defined(COM_PXA2X0)
1349 	paddr_t paddr;
1350 	u_int cken;
1351 
1352 	if (strcmp(kgdb_devname, "ffuart") == 0) {
1353 		paddr = PXA2X0_FFUART_BASE;
1354 		cken = CKEN_FFUART;
1355 	} else if (strcmp(kgdb_devname, "btuart") == 0) {
1356 		paddr = PXA2X0_BTUART_BASE;
1357 		cken = CKEN_BTUART;
1358 	} else if (strcmp(kgdb_devname, "stuart") == 0) {
1359 		paddr = PXA2X0_STUART_BASE;
1360 		cken = CKEN_STUART;
1361 		irda_on(0);
1362 	} else
1363 		return;
1364 
1365 	if (com_kgdb_attach(&pxa2x0_a4x_bs_tag, paddr,
1366 	    kgdb_rate, PXA2X0_COM_FREQ, COM_TYPE_PXA2x0, comkgdbmode) == 0) {
1367 		pxa2x0_clkman_config(cken, 1);
1368 	}
1369 #endif
1370 }
1371 #endif
1372