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