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