[U-Boot] [PATCH] DEBUG 8xxx cpu_numcores
Peter Tyser
ptyser at xes-inc.com
Tue Dec 15 17:17:39 CET 2009
On Tue, 2009-12-15 at 08:49 -0600, Kumar Gala wrote:
> On Dec 15, 2009, at 1:07 AM, Ed Swarthout wrote:
>
> > The following debug patch shows that gd->cpu is not being relocated to
> > ddr. Linux may not be able to boot due to "fdt board" crashing if
> > flash has been erased or changed.
> >
> > On mpc8572ds:
> >
> > => fdt board
> > fdt board
> > cpu_numcores gd=3fe6df68 cpu=effed578 n=2
> > cpu_numcores gd=3fe6df68 cpu=effed578 n=2
> > cpu_numcores gd=3fe6df68 cpu=effed578 n=2
> > cpu_numcores gd=3fe6df68 cpu=effed578 n=2
> >
> > Signed-off-by: Ed Swarthout <Ed.Swarthout at freescale.com>
> > ---
> > cpu/mpc8xxx/cpu.c | 4 +++-
> > 1 files changed, 3 insertions(+), 1 deletions(-)
>
> I agree w/Ed that we broke the relocation of gd->cpu with commit:
>
> commit a0e2066f392782730f0398095e583c87812d97f2
> Author: Peter Tyser <ptyser at xes-inc.com>
> Date: Mon Sep 21 11:20:27 2009 -0500
>
> ppc: Remove board.c relocation fixups
>
> Signed-off-by: Peter Tyser <ptyser at xes-inc.com>
>
> ...
>
> -#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
> - gd->cpu += gd->reloc_off;
> -#endif
>
> Peter, Joakim,
>
> any suggestions on how to properly fix this?
Hmm, the cpu pointer is set with a flash address since probecpu() is
called before relocation. The relocation fixups only update initialized
pointers, so the cpu pointer isn't touched during relocation fixups.
Do we really need to call probecpu() so early? Calling it after
relocation would resolve the problem. Calling it both before and after
relocation would resolve the issue too, but seems kind of hokey.
Otherwise we could re-add a fixup to board.c, eg:
diff --git a/lib_ppc/board.c b/lib_ppc/board.c
index 765f97a..f245a10 100644
--- a/lib_ppc/board.c
+++ b/lib_ppc/board.c
@@ -645,6 +645,14 @@ void board_init_r (gd_t *id, ulong dest_addr)
/* The Malloc area is immediately below the monitor copy in DRAM */
malloc_start = dest_addr - TOTAL_MALLOC_LEN;
+#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
+ /*
+ * The cpu pointer is set to an address in flash prior to relocation.
+ * We need to update it to point to the same CPU entry in RAM.
+ */
+ gd->cpu += dest_addr - CONFIG_SYS_MONITOR_BASE;
+#endif
+
#ifdef CONFIG_SERIAL_MULTI
serial_initialize();
#endif
What's less dirty, adding some magical relocation fixup math, or calling
a function two times to magically update a variable? Or can we just
call probecpu() once after relocation?
Peter
More information about the U-Boot
mailing list