xref: /netbsd-src/sys/arch/evbarm/stand/bootimx23/args_prep.c (revision ff0329c8ae2b96af76bbd4ed1ccd28bedb198fb2)
1*ff0329c8Schristos /* $Id: args_prep.c,v 1.4 2017/12/10 02:26:41 christos Exp $ */
2bf9547b2Sjkunz 
3bf9547b2Sjkunz /*
4bf9547b2Sjkunz  * Copyright (c) 2012 The NetBSD Foundation, Inc.
5bf9547b2Sjkunz  * All rights reserved.
6bf9547b2Sjkunz  *
7bf9547b2Sjkunz  * This code is derived from software contributed to The NetBSD Foundation
8bf9547b2Sjkunz  * by Petri Laakso.
9bf9547b2Sjkunz  *
10bf9547b2Sjkunz  * Redistribution and use in source and binary forms, with or without
11bf9547b2Sjkunz  * modification, are permitted provided that the following conditions
12bf9547b2Sjkunz  * are met:
13bf9547b2Sjkunz  * 1. Redistributions of source code must retain the above copyright
14bf9547b2Sjkunz  *    notice, this list of conditions and the following disclaimer.
15bf9547b2Sjkunz  * 2. Redistributions in binary form must reproduce the above copyright
16bf9547b2Sjkunz  *    notice, this list of conditions and the following disclaimer in the
17bf9547b2Sjkunz  *    documentation and/or other materials provided with the distribution.
18bf9547b2Sjkunz  *
19bf9547b2Sjkunz  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20bf9547b2Sjkunz  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21bf9547b2Sjkunz  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22bf9547b2Sjkunz  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23bf9547b2Sjkunz  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24bf9547b2Sjkunz  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25bf9547b2Sjkunz  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26bf9547b2Sjkunz  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27bf9547b2Sjkunz  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28bf9547b2Sjkunz  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29bf9547b2Sjkunz  * POSSIBILITY OF SUCH DAMAGE.
30bf9547b2Sjkunz  */
31bf9547b2Sjkunz 
32bf9547b2Sjkunz /* (c) for ngets() below:
33bf9547b2Sjkunz  *
34bf9547b2Sjkunz  * Copyright (c) 1993
35bf9547b2Sjkunz  *	The Regents of the University of California.  All rights reserved.
36bf9547b2Sjkunz  *
37bf9547b2Sjkunz  * Redistribution and use in source and binary forms, with or without
38bf9547b2Sjkunz  * modification, are permitted provided that the following conditions
39bf9547b2Sjkunz  * are met:
40bf9547b2Sjkunz  * 1. Redistributions of source code must retain the above copyright
41bf9547b2Sjkunz  *    notice, this list of conditions and the following disclaimer.
42bf9547b2Sjkunz  * 2. Redistributions in binary form must reproduce the above copyright
43bf9547b2Sjkunz  *    notice, this list of conditions and the following disclaimer in the
44bf9547b2Sjkunz  *    documentation and/or other materials provided with the distribution.
45bf9547b2Sjkunz  * 3. All advertising materials mentioning features or use of this software
46bf9547b2Sjkunz  *    must display the following acknowledgement:
47bf9547b2Sjkunz  *	This product includes software developed by the University of
48bf9547b2Sjkunz  *	California, Berkeley and its contributors.
49bf9547b2Sjkunz  * 4. Neither the name of the University nor the names of its contributors
50bf9547b2Sjkunz  *    may be used to endorse or promote products derived from this software
51bf9547b2Sjkunz  *    without specific prior written permission.
52bf9547b2Sjkunz  *
53bf9547b2Sjkunz  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
54bf9547b2Sjkunz  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55bf9547b2Sjkunz  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56bf9547b2Sjkunz  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
57bf9547b2Sjkunz  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
58bf9547b2Sjkunz  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
59bf9547b2Sjkunz  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60bf9547b2Sjkunz  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61bf9547b2Sjkunz  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62bf9547b2Sjkunz  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
63bf9547b2Sjkunz  * SUCH DAMAGE.
64bf9547b2Sjkunz  *
65bf9547b2Sjkunz  *	@(#)gets.c	8.1 (Berkeley) 6/11/93
66bf9547b2Sjkunz  */
67bf9547b2Sjkunz 
68bf9547b2Sjkunz 
69bf9547b2Sjkunz #include <sys/param.h>
70bf9547b2Sjkunz #include <sys/types.h>
71bf9547b2Sjkunz #include <sys/cdefs.h>
72bf9547b2Sjkunz 
73bf9547b2Sjkunz #include <lib/libsa/stand.h>
74bf9547b2Sjkunz #include <lib/libkern/libkern.h>
75bf9547b2Sjkunz 
76bf9547b2Sjkunz #include <arm/arm32/pte.h>
77bf9547b2Sjkunz #define _LOCORE
78bf9547b2Sjkunz #include <arm/imx/imx23var.h>
79bf9547b2Sjkunz #undef _LOCORE
80*ff0329c8Schristos #include <machine/bootconfig.h>
81bf9547b2Sjkunz 
82bf9547b2Sjkunz #include <arm/imx/imx23_digctlreg.h>
83bf9547b2Sjkunz #include <arm/imx/imx23_uartdbgreg.h>
84bf9547b2Sjkunz 
85bf9547b2Sjkunz #include "common.h"
86bf9547b2Sjkunz 
87bf9547b2Sjkunz static void ngets(char *, int);
88bf9547b2Sjkunz 
89bf9547b2Sjkunz #define L1_PAGE_TABLE (DRAM_BASE + MEMSIZE * 1024 * 1024 - L1_TABLE_SIZE)
90bf9547b2Sjkunz #define BOOTIMX23_ARGS (L1_PAGE_TABLE - MAX_BOOT_STRING - 1)
91bf9547b2Sjkunz 
92bf9547b2Sjkunz #define PROMPT_DELAY 5000000 /* Wait 5 seconds user to press any key. */
93bf9547b2Sjkunz 
94bf9547b2Sjkunz int
args_prep(void)95bf9547b2Sjkunz args_prep(void)
96bf9547b2Sjkunz {
97bf9547b2Sjkunz 	u_int prompt;
98bf9547b2Sjkunz 	char *boot_args = (char *)BOOTIMX23_ARGS;
99bf9547b2Sjkunz 
100bf9547b2Sjkunz 	/* Copy default boot arguments. */
101bf9547b2Sjkunz 	memset((void *)boot_args, 0x00, MAX_BOOT_STRING);
102bf9547b2Sjkunz 	strcpy(boot_args, KERNEL_BOOT_ARGS);
103bf9547b2Sjkunz 
104bf9547b2Sjkunz 	prompt = 0;
105bf9547b2Sjkunz 
106bf9547b2Sjkunz 	/* Enable debug UART data reception which was not enabled by the ROM. */
107bf9547b2Sjkunz 	uint16_t cr = REG_RD_HW(HW_UARTDBG_BASE + HW_UARTDBGCR);
108bf9547b2Sjkunz 	cr |= HW_UARTDBGCR_RXE;
109bf9547b2Sjkunz 	REG_WR_HW(HW_UARTDBG_BASE + HW_UARTDBGCR, cr);
110bf9547b2Sjkunz 
111bf9547b2Sjkunz 	printf("Press any key to drop into boot prompt...\n\r");
112bf9547b2Sjkunz 
113bf9547b2Sjkunz 	REG_WR(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS_CLR, 0xFFFFFFFF);
114bf9547b2Sjkunz 
115bf9547b2Sjkunz 	while (REG_RD(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS) < PROMPT_DELAY) {
116bf9547b2Sjkunz 		if (!(REG_RD_HW(HW_UARTDBG_BASE + HW_UARTDBGFR) &
117bf9547b2Sjkunz 		    HW_UARTDBGFR_RXFE)) {
118bf9547b2Sjkunz 			/* RX FIFO is not empty, some key was pressed. */
119bf9547b2Sjkunz 			REG_RD(HW_UARTDBG_BASE + HW_UARTDBGDR); /* Flush. */
120bf9547b2Sjkunz 			prompt = 1;
121bf9547b2Sjkunz 			break;
122bf9547b2Sjkunz 		}
123bf9547b2Sjkunz 	}
124bf9547b2Sjkunz 
125bf9547b2Sjkunz 	if (prompt) {
126bf9547b2Sjkunz 		memset((void *)boot_args, 0x00, MAX_BOOT_STRING);
127bf9547b2Sjkunz 		printf("boot: ");
128bf9547b2Sjkunz 		ngets(boot_args, MAX_BOOT_STRING);
129bf9547b2Sjkunz 	}
130bf9547b2Sjkunz 
131bf9547b2Sjkunz 	return 0;
132bf9547b2Sjkunz }
133bf9547b2Sjkunz 
134bf9547b2Sjkunz /*
135bf9547b2Sjkunz  * gets() with constrained input length.
136bf9547b2Sjkunz  *
137bf9547b2Sjkunz  * Copied from: sys/arch/ia64/stand/common/gets.c
138bf9547b2Sjkunz  */
139bf9547b2Sjkunz static void
ngets(char * buf,int n)140bf9547b2Sjkunz ngets(char *buf, int n)
141bf9547b2Sjkunz {
142bf9547b2Sjkunz 	int c;
143bf9547b2Sjkunz 	char *lp;
144bf9547b2Sjkunz 
145bf9547b2Sjkunz 	for (lp = buf;;) {
146bf9547b2Sjkunz 		switch (c = getchar() & 0177) {
147bf9547b2Sjkunz 		case '\n':
148bf9547b2Sjkunz 		case '\r':
149bf9547b2Sjkunz 			*lp = '\0';
150bf9547b2Sjkunz 			putchar('\n');
151bf9547b2Sjkunz 			return;
152bf9547b2Sjkunz 		case '\b':
153bf9547b2Sjkunz 		case '\177':
154bf9547b2Sjkunz 			if (lp > buf) {
155bf9547b2Sjkunz 				lp--;
156bf9547b2Sjkunz 				putchar('\b');
157bf9547b2Sjkunz 				putchar(' ');
158bf9547b2Sjkunz 				putchar('\b');
159bf9547b2Sjkunz 			}
160bf9547b2Sjkunz 			break;
161bf9547b2Sjkunz 		case 'r'&037: {
162bf9547b2Sjkunz 			char *p;
163bf9547b2Sjkunz 
164bf9547b2Sjkunz 			putchar('\n');
165bf9547b2Sjkunz 			for (p = buf; p < lp; ++p)
166bf9547b2Sjkunz 				putchar(*p);
167bf9547b2Sjkunz 			break;
168bf9547b2Sjkunz 		}
169bf9547b2Sjkunz 		case 'u'&037:
170bf9547b2Sjkunz 		case 'w'&037:
171bf9547b2Sjkunz 			lp = buf;
172bf9547b2Sjkunz 			putchar('\n');
173bf9547b2Sjkunz 			break;
174bf9547b2Sjkunz 		default:
175bf9547b2Sjkunz 			if ((n < 1) || ((lp - buf) < n)) {
176bf9547b2Sjkunz 				*lp++ = c;
177bf9547b2Sjkunz 				putchar(c);
178bf9547b2Sjkunz 			}
179bf9547b2Sjkunz 		}
180bf9547b2Sjkunz 	}
181bf9547b2Sjkunz 	/*NOTREACHED*/
182bf9547b2Sjkunz }
183