aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2014-04-29 07:48:07 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2014-04-29 07:48:07 +0000
commit27caa49f0b6b4f78f91f053c5d607caa83f411f4 (patch)
tree12aa02b553e8ed43347397908128eb0310963d24 /sys
parente418b6fd0b58606a2c6866604cb6e2312c3cc98c (diff)
downloadsrc-27caa49f0b6b4f78f91f053c5d607caa83f411f4.tar.gz
src-27caa49f0b6b4f78f91f053c5d607caa83f411f4.zip
After r264897 restore the ability to add bootoptions from FDT for
platforms which do not use loaders or kernels that want to hardcode options or for FDT passed in by loader. Also fix a build issue by putting the kmdp variable accessed back under the #ifdef FDT; we may wish to revisit decision in which case more code needs changing. Submitted by: brooks
Notes
Notes: svn path=/head/; revision=265089
Diffstat (limited to 'sys')
-rw-r--r--sys/mips/beri/beri_machdep.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/sys/mips/beri/beri_machdep.c b/sys/mips/beri/beri_machdep.c
index b4c810fd3dc4..f532f609d192 100644
--- a/sys/mips/beri/beri_machdep.c
+++ b/sys/mips/beri/beri_machdep.c
@@ -132,6 +132,46 @@ platform_reset(void)
__asm__ __volatile("wait");
}
+#ifdef FDT
+/* Parse cmd line args as env - copied from xlp_machdep. */
+/* XXX-BZ this should really be centrally provided for all (boot) code. */
+static void
+_parse_bootargs(char *cmdline)
+{
+ char *n, *v;
+
+ while ((v = strsep(&cmdline, " \n")) != NULL) {
+ if (*v == '\0')
+ continue;
+ if (*v == '-') {
+ while (*v != '\0') {
+ v++;
+ switch (*v) {
+ case 'a': boothowto |= RB_ASKNAME; break;
+ /* Someone should simulate that ;-) */
+ case 'C': boothowto |= RB_CDROM; break;
+ case 'd': boothowto |= RB_KDB; break;
+ case 'D': boothowto |= RB_MULTIPLE; break;
+ case 'm': boothowto |= RB_MUTE; break;
+ case 'g': boothowto |= RB_GDB; break;
+ case 'h': boothowto |= RB_SERIAL; break;
+ case 'p': boothowto |= RB_PAUSE; break;
+ case 'r': boothowto |= RB_DFLTROOT; break;
+ case 's': boothowto |= RB_SINGLE; break;
+ case 'v': boothowto |= RB_VERBOSE; break;
+ }
+ }
+ } else {
+ n = strsep(&v, "=");
+ if (v == NULL)
+ setenv(n, "1");
+ else
+ setenv(n, v);
+ }
+ }
+}
+#endif
+
void
platform_start(__register_t a0, __register_t a1, __register_t a2,
__register_t a3)
@@ -144,7 +184,9 @@ platform_start(__register_t a0, __register_t a1, __register_t a2,
char **envp = (char **)a2;
long memsize;
#ifdef FDT
+ char buf[2048]; /* early stack supposedly big enough */
vm_offset_t dtbp;
+ phandle_t chosen;
void *kmdp;
#endif
int i;
@@ -201,7 +243,6 @@ platform_start(__register_t a0, __register_t a1, __register_t a2,
while (1);
if (OF_init((void *)dtbp) != 0)
while (1);
-#endif
/*
* Configure more boot-time parameters passed in by loader.
@@ -210,6 +251,14 @@ platform_start(__register_t a0, __register_t a1, __register_t a2,
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
/*
+ * Get bootargs from FDT if specified.
+ */
+ chosen = OF_finddevice("/chosen");
+ if (OF_getprop(chosen, "bootargs", buf, sizeof(buf)) != -1)
+ _parse_bootargs(buf);
+#endif
+
+ /*
* XXXRW: We have no way to compare wallclock time to cycle rate on
* BERI, so for now assume we run at the MALTA default (100MHz).
*/