Hi Aexey, On 15 December 2015 at 03:06, Alexey Brodkin <alexey.brod...@synopsys.com> wrote: > Current implementation of disabled relocation only works for EFI. > > In case of GD_FLG_SKIP_RELOC jump_to_copy() will return instead of > jumping further in board_init_r() etc. And jump_to_copy() being the last > call in init_sequence_f when returning simply triggers hang() in > board_init_f(). Well for everything except ARM, SANDBOX and EFI_APP. > > Not sure why ARM and SANBOX are here - I would assume it's all on > purpose but as for EFI_APP this is an essential need for getting out of > board_init_f() and jumping in board_init_r() immediately afterwards, see > efi_main(). > > But what if in case of no relocation we jump in board_init_r() right > from jump_to_copy()? In that case we remove one ifdef from > board_init_f() and leave a chance to seamlessly re-use disabled > relocation for other (non-EFI) cases. > > Signed-off-by: Alexey Brodkin <abrod...@synopsys.com> > --- > > Note I didn't test it for EFI because I don't know how to do that in > simulation, please let me know if there's a simple way to do it. > > But I did test it for ARC boards (with additional patches) that enable > disabled relocation - these patches to follow once something similar to > my proposal here is implemented. > > common/board_f.c | 11 ++++++++--- > lib/efi/efi_app.c | 2 +- > 2 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/common/board_f.c b/common/board_f.c > index eac7c5e..2d60ed9 100644 > --- a/common/board_f.c > +++ b/common/board_f.c > @@ -720,8 +720,14 @@ static int setup_reloc(void) > > static int jump_to_copy(void) > { > + /* > + * In case of no relocation nothing to do between "running from flash" > + * (init_f) and "running from ram" (init_r), so just jumping in > + * board_init_r(). > + */ > if (gd->flags & GD_FLG_SKIP_RELOC) > - return 0; > + board_init_r((gd_t *)gd, gd->relocaddr); > + > /* > * x86 is special, but in a nice way. It uses a trampoline which > * enables the dcache if possible. > @@ -1017,8 +1023,7 @@ void board_init_f(ulong boot_flags) > if (initcall_run_list(init_sequence_f)) > hang(); > > -#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX) && \ > - !defined(CONFIG_EFI_APP) > +#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX) > /* NOTREACHED - jump_to_copy() does not return */ > hang();
Actually the hope is that all boards will work this way soon, so I'd rather not remove one. I'd like to see board_init_f() return normally, and then board_init_r() be called by the caller. In the end, jump_to_copy() will be removed. So can you adjust your patch to just return from jump_to_copy() and skip this hang()? Then (I hope) on ARM it will also do the right thing...I can help test on x86 also. It's Christmas where I am so I may not be around much for the next few weeks. > #endif > diff --git a/lib/efi/efi_app.c b/lib/efi/efi_app.c > index 452ab5d..5e41b7f 100644 > --- a/lib/efi/efi_app.c > +++ b/lib/efi/efi_app.c > @@ -123,7 +123,7 @@ efi_status_t efi_main(efi_handle_t image, struct > efi_system_table *sys_table) > printf("starting\n"); > > board_init_f(GD_FLG_SKIP_RELOC); > - board_init_r(NULL, 0); > + /* board_init_r() is called in the end of board_init_f() */ > free_memory(priv); > > return EFI_SUCCESS; > -- > 2.4.3 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot