
Hello Nicolas,
Nicolas Pitre wrote:
But does U-Boot properly provide machine information to the kernel these days? I have been and still being burned by U-Boot hardcoding the _wrong_ machine ID, and therefore custom built kernels from k.o simply won't boot on those boards without hacking the kernel source.
With "our" U-Boot you can override the compiled-in machid with an environment variable. I didn't implement this patch but I think it's not that difficult. I will check tomorrow if I can easily get a patch out of our scm.
It took a bit longer, but here it comes. This is on top of todays u-boot.
I didn't tested this patch in that version, but this is how it is done in our version of U-Boot (that is considerable older).
Switching the machid is also very convenient because we have modules that can be plugged on different base boards and so can use different machids.
Best regards Uwe
--->8--- From: Uwe Kleine-König Uwe.Kleine-Koenig@digi.com
make the machid configurable via the environment
If the variable "machid" exists, let do_bootm_linux use that instead of bd->bi_arch_number.
Signed-off-by: Uwe Kleine-König Uwe.Kleine-Koenig@digi.com --- lib_arm/armlinux.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/lib_arm/armlinux.c b/lib_arm/armlinux.c index 6d32a41..62185f0 100644 --- a/lib_arm/armlinux.c +++ b/lib_arm/armlinux.c @@ -78,6 +78,8 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], void (*theKernel)(int zero, int arch, uint params); image_header_t *hdr = &header; bd_t *bd = gd->bd; + int machid = bd->bi_arch_number; + char *s;
#ifdef CONFIG_CMDLINE_TAG char *commandline = getenv ("bootargs"); @@ -85,6 +87,12 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);
+ s = getenv ("machid"); + if (s) { + machid = simple_strtoul (s, NULL, 16); + printf ("Using machid 0x%x from environment\n", machid); + } + /* * Check if there is an initrd image */ @@ -260,7 +268,7 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
cleanup_before_linux ();
- theKernel (0, bd->bi_arch_number, bd->bi_boot_params); + theKernel (0, machid, bd->bi_boot_params); }