summaryrefslogtreecommitdiffstats
path: root/sys/mips/beri/beri_machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/mips/beri/beri_machdep.c')
-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 b4c810f..f532f60 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).
*/
OpenPOWER on IntegriCloud