[U-Boot] [PATCH 16/22] x86: board_f: Adjust x86 boot order for performance
Graeme Russ
gruss at tss-engineering.com
Mon Jan 5 18:22:48 CET 2015
Hi Simon & Bin,
On Tue, Jan 6, 2015 at 12:40 AM, Bin Meng <bmeng.cn at gmail.com> wrote:
> Hi Simon,
>
> On Mon, Jan 5, 2015 at 9:44 AM, Simon Glass <sjg at chromium.org> wrote:
> > Hi Bin,
> >
> > On 3 January 2015 at 20:26, Bin Meng <bmeng.cn at gmail.com> wrote:
> >> Hi Simon,
> >>
> >> On Fri, Jan 2, 2015 at 6:23 AM, Simon Glass <sjg at chromium.org> wrote:
> >>> Hi Bin,
> >>>
> >>> On 30 December 2014 at 22:51, Bin Meng <bmeng.cn at gmail.com> wrote:
> >>>>
> >>>> Hi Simon,
> >>>>
> >>>> On Sun, Dec 28, 2014 at 10:20 AM, Simon Glass <sjg at chromium.org>
> wrote:
> >>>> > For bare platforms we turn off ROM-caching before calling
> board_init_f_r()
> >>>> > It is then very slow to copy U-Boot from ROM to RAM. So adjust the
> order so
> >>>> > that the copying happens before we turn off ROM-caching.
> >>>> >
> >>>> > Signed-off-by: Simon Glass <sjg at chromium.org>
> >>>> > ---
> >>>> >
> >>>> > common/board_f.c | 8 +++++---
> >>>> > 1 file changed, 5 insertions(+), 3 deletions(-)
> >>>> >
> >>>> > diff --git a/common/board_f.c b/common/board_f.c
> >>>> > index 98c9c72..1b65575 100644
> >>>> > --- a/common/board_f.c
> >>>> > +++ b/common/board_f.c
> >>>> > @@ -983,6 +983,11 @@ static init_fnc_t init_sequence_f[] = {
> >>>> > INIT_FUNC_WATCHDOG_RESET
> >>>> > reloc_fdt,
> >>>> > setup_reloc,
> >>>> > +#ifdef CONFIG_X86
> >>>> > + copy_uboot_to_ram,
> >>>> > + clear_bss,
> >>>> > + do_elf_reloc_fixups,
> >>>> > +#endif
> >>>> > #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
> >>>> > jump_to_copy,
> >>>> > #endif
> >>>> > @@ -1042,9 +1047,6 @@ void board_init_f(ulong boot_flags)
> >>>> > */
> >>>> > static init_fnc_t init_sequence_f_r[] = {
> >>>> > init_cache_f_r,
> >>>> > - copy_uboot_to_ram,
> >>>> > - clear_bss,
> >>>> > - do_elf_reloc_fixups,
> >>>> >
> >>>> > NULL,
> >>>> > };
> >>>> > --
>
Wow, doesn't this bring back some memories. I've had a look over this code
as it is now and it took a while to sink in. Things have moved on in the
past 2 years :)
> >>>>
> >>>> I don't understand. Isn't the init_cache_f_r() which turns on the
> cache?
> >>>>
> >>>
> >>> Yes it turns on the cache, but turns off the ROM cache (they are
> >>> different things). So this ordering is much faster. I think I might
> >>> have more tuning to do though.
> >>>
> >>
> >> Got it. Since we moved these 3 routines from init_sequence_f_r[] to
> >> init_sequence_f[], how about we remove the whole init_sequence_f_r[]
> >> completely? If not possible, the comment block above
> >> init_sequence_f_r[] needs to be fixed?
> >
> > I'll remove the comment.
>
I think init_sequence_f_r can go... but I need to have a better look at the
code
If turning off the ROM cache by init_cache_f_r is the problem, then perhaps
the following order would be better:
copy_uboot_to_ram,
init_cache_f_r,
clear_bss,
do_elf_reloc_fixups,
Without enabling the CPU's cache, clear_bss and do_elf_reloc_fixups will
suffer.
>
> >>
> >> *
> >> * The '_f_r' sequence must, as a minimum, copy U-Boot to RAM (if
> >> * supported). It _should_, if possible, copy global data to RAM and
> >> * initialise the CPU caches (to speed up the relocation process)
> >> *
> >> * NOTE: At present only x86 uses this route, but it is intended that
> >> * all archs will move to this when generic relocation is implemented.
> >> */
> >>
> >> So looks that we should either drop this _f_r stage, or make other
> >> arch use this _f_r?
> >
> > I think we should move to generic relocation, meaning that all archs
> > do relocation the same way with the same code. Then only arch-specific
> > stuff is the then ELF fixup function, which adjusts a relocation site,
> > and the code to actually change the stack pointer.
>
This was always my plan - have arch specific do_reloc_fixups and the rest
would be generic
> >
> > This board_init_f_r() code is part of one attempt to do this - the
> > premise was that turning the cache on before relocating U-Boot will
> > save time. That's true, but it would be even better to turn the cache
> > on much earlier. With pit (Chromebook 2) we turn on the cache in SPL.
> > So I think turning it on here is too late if we are trying to save
> > time. Still it is a good start and if we could make it happen
> > generally it would be nice.
>
And now you have me thinking board_init_f_r is not needed at all...
If we can setup the stack, clear BSS, copy U-Boot to RAM and perform
relocation fixups while running from ROM, what is left for board_init_f_r
to do?
The only thing I can think of is the caveats mentioned in the comment
('static' variables are read-only / Global Data (gd->xxx) is read/write).
But aren't these true when running from ROM?
Looking at non-x86 arches, relocate_code() looks to do what
copy_uboot_to_ram and clear_bss does in x86 land (not sure about
do_elf_reloc_fixups - seems to be arch specific as to whether
relocate_code() does this or it is done later (hence
the CONFIG_NEEDS_MANUAL_RELOC #define?)
>
> > See here for my original attempt, which was tied up with generic
> > board. In the end I untied them and we got one but not the other.
> >
> > http://lists.denx.de/pipermail/u-boot/2012-February/118409.html
> >
>
Ah, generic relocation... I really wish my life hadn't taken a hard-left
turn when it did. We got so close.
>From where I'm looking (fresh eyes - I might be missing something big) we
should be able to do the ROM->RAM copy, BSS clearing, and relocation fixups
in board_init_f.
When we return from board_init_f it should be a fairly simple matter of:
- Copying the contents of the Global Data structure from CAR to RAM (or
from RAM to RAM if your on a platform which initialises RAM before U-Boot)
- Set the gd pointer (reserved register) to point to the new copy
- Figure out where board_init_r is and jump to it
board_init_r should be able to do any remaining cache tweaks. If cache
tweaks cannot be done while executing from RAM then they need to be done in
board_init_f
I just cannot see the point of board_init_f_r any more
> > Since then Albert has tidied up ARM start.S a lot which makes this much
> easier.
> >
> > So that's the background. One of these days I might take another look
> > at it if it doesn't get someone's attention.
>
Oh dear - it looks like I just put my hand up :)
> >
> > Regards,
> > Simon
>
> Thanks for the background information. I will take a look. Hope we can
> achieve generic board support as soon as we can.
>
> Regards,
> Bin
>
>
Regards,
Graeme
More information about the U-Boot
mailing list