[U-Boot] [PATCH] DEBUG 8xxx cpu_numcores

Kumar Gala galak at kernel.crashing.org
Tue Dec 15 17:57:34 CET 2009


On Dec 15, 2009, at 10:17 AM, Peter Tyser wrote:

> 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?

Where would we call it if it was after relocation?

- k


More information about the U-Boot mailing list