Add support for boot arguments specification via fdt
Add suppport for passing boot arguments via FDT for mediatek/ralink SoCs. This was taken from kan's work on CI20. Since most OpenWRT dts files have bootargs defined, we use bsdbootargs to specify FreeBSD specific arguments. Approved by: adrian (mentor) Sponsored by: Smartcom - Bulgaria AD Differential Revision: https://reviews.freebsd.org/D5979
This commit is contained in:
parent
146045bcc3
commit
056d436755
@ -192,6 +192,52 @@ mips_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
_parse_bootarg(char *v)
|
||||
{
|
||||
char *n;
|
||||
|
||||
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)
|
||||
kern_setenv(n, "1");
|
||||
else
|
||||
kern_setenv(n, v);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 *v;
|
||||
|
||||
while ((v = strsep(&cmdline, " \n")) != NULL) {
|
||||
if (*v == '\0')
|
||||
continue;
|
||||
_parse_bootarg(v);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
platform_reset(void)
|
||||
{
|
||||
@ -209,6 +255,8 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused,
|
||||
char **argv = (char **)MIPS_PHYS_TO_KSEG0(a1);
|
||||
char **envp = (char **)MIPS_PHYS_TO_KSEG0(a2);
|
||||
void *dtbp;
|
||||
phandle_t chosen;
|
||||
char buf[2048];
|
||||
|
||||
/* clear the BSS and SBSS segments */
|
||||
kernend = (vm_offset_t)&end;
|
||||
@ -238,6 +286,13 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused,
|
||||
|
||||
init_static_kenv(boot1_env, sizeof(boot1_env));
|
||||
|
||||
/*
|
||||
* Get bsdbootargs from FDT if specified.
|
||||
*/
|
||||
chosen = OF_finddevice("/chosen");
|
||||
if (OF_getprop(chosen, "bsdbootargs", buf, sizeof(buf)) != -1)
|
||||
_parse_bootargs(buf);
|
||||
|
||||
printf("FDT DTB at: 0x%08x\n", (uint32_t)dtbp);
|
||||
|
||||
printf("CPU clock: %4dMHz\n", mtk_soc_get_cpuclk()/(1000*1000));
|
||||
|
Loading…
Reference in New Issue
Block a user