Introduce a new (global, sorry!) option which controls whether

the ar71xx platform code should assume a uboot or redboot environment.

The current code gets very confused (and just crashes) on a uboot
environment, where each attribute=value pair is in a single entry.
Redboot on the other hand stores it as "attribute", "value", "attribute",
"value", ...

This allows the kernel to boot on a TP-LINK TL-WR1043ND from flash,
where the uboot environment gets setup. This didn't show up during a netboot
as "tftpboot" and "go" don't setup the uboot environment variables.
This commit is contained in:
Adrian Chadd 2011-11-24 07:32:52 +00:00
parent fee9ff323f
commit 1c3ed0a410
2 changed files with 16 additions and 3 deletions

View File

@ -899,4 +899,5 @@ RCTL opt_global.h
# that "lies" about the amount of RAM it has. Until a cleaner method is
# defined, this option will suffice in overriding what Redboot says.
AR71XX_REALMEM opt_global.h
AR71XX_ENV_UBOOT opt_global.h
AR71XX_ENV_REDBOOT opt_global.h

View File

@ -168,8 +168,8 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused,
__register_t a2 __unused, __register_t a3 __unused)
{
uint64_t platform_counter_freq;
int argc, i;
char **argv, **envp;
int argc = 0, i;
char **argv = NULL, **envp = NULL;
vm_offset_t kernend;
/*
@ -184,9 +184,18 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused,
/* Initialize pcpu stuff */
mips_pcpu0_init();
/*
* Until some more sensible abstractions for uboot/redboot
* environment handling, we have to make this a compile-time
* hack. The existing code handles the uboot environment
* very incorrectly so we should just ignore initialising
* the relevant pointers.
*/
#ifndef AR71XX_ENV_UBOOT
argc = a0;
argv = (char**)a1;
envp = (char**)a2;
#endif
/*
* Protect ourselves from garbage in registers
*/
@ -255,6 +264,9 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused,
printf(" a2 = %08x\n", a2);
printf(" a3 = %08x\n", a3);
/*
* XXX this code is very redboot specific.
*/
printf("Cmd line:");
if (MIPS_IS_VALID_PTR(argv)) {
for (i = 0; i < argc; i++) {