[U-Boot] [linux-sunxi] Re: [RFC PATCH 00/11] extend FIT loading support (plus Pine64/ATF support)

Icenowy Zheng icenowy at aosc.xyz
Fri Jan 20 20:07:04 CET 2017



21.01.2017, 01:47, "Andre Przywara" <andre.przywara at arm.com>:
> Hi,
>
> On 20/01/17 17:35, Andrew F. Davis wrote:
>>  On 01/20/2017 11:17 AM, Andre Przywara wrote:
>>>  Hi Andrew,
>>>
>>>  thanks for the comments.
>>>
>>>  On 20/01/17 17:02, Andrew F. Davis wrote:
>>>>  On 01/19/2017 07:53 PM, Andre Przywara wrote:
>>>>>  Currently the FIT format is not used to its full potential in the SPL:
>>>>>  It only loads the first image from the /images node and appends the
>>>>>  proper FDT.
>>>>>  Some boards and platforms would benefit from loading more images before
>>>>>  starting U-Boot proper, notably Allwinner A64 and ARMv8 Rockchip boards,
>>>>>  which use an ARM Trusted Firmware (ATF) image to be executed before U-Boot.
>>>>>
>>>>>  This series tries to solve this in a board agnostic and generic way:
>>>>>  We extend the SPL FIT loading scheme to allow loading multiple images.
>>>>>  So apart from loading the image which is referenced by the "firmware"
>>>>>  property in the respective configuration node and placing the DTB right
>>>>>  behind it, we iterate over all strings in the "loadable" property.
>>>>>  Each image referenced there will be loaded to its specified load address.
>>>>>  The entry point U-Boot eventually branches to will be taken from the
>>>>>  first image to explicitly provide the "entry" property, or, if none
>>>>>  of them does so, from the load address of the "firmware" image.
>>>>>  This keeps the scheme compatible with the FIT images our Makefile creates
>>>>>  automatically at the moment.
>>>>>
>>>>>  Apart from the already mentioned ATF scenario this opens up more usage
>>>>>  scenarios, of which the commit message of patch 04/11 lists some.
>>>>
>>>>  I have been thinking about a similar problem we are facing regarding
>>>>  OP-TEE loading when doing SPL-only boots. I think extending SPL FIT
>>>>  loader is a good approach, I've just been concerned about SPL bloat. On
>>>>  our High Security enabled AM335x SoC we only have 41KB of SRAM to load
>>>>  SPL (last I checked we only have 100 bytes of overhead left), and we
>>>>  need FIT support as we use it for image authentication (it's what we use
>>>>  the board_fit_image_post_process() hook for), so any changes to SPL FIT
>>>>  need to be carefully made.
>>>
>>>  Understood. Have you actually included FIT support as it exists already
>>>  in your build? My observation is that even without these changes
>>>  proposed here SPL FIT adds quite a bit to the SPL size (hence my patches
>>>  to extend SPL size for AArch64 sunxi). This is mostly due to some libfdt
>>>  bits being included, so I guess there is not much you can do about it. I
>>>  will later check how much the code size changes with my patches.
>>>  And btw.: Allwinner has either 24KB or 32KB of SRAM, so the situation is
>>>  even more dire here.
>>
>>  Yes, we include FIT support in our build, and we make a lot of
>>  sacrifices in functionality for it (reducing the types of media we can
>>  load from, tiny malloc, tiny printf, etc..).
>>
>>  When new features come out we need to decide which old ones to disable,
>>  so the benefits of FIT and other features have to be worth more than the
>>  size in code it takes to implement them. (I think this change is worth
>>  it and am willing to sacrifice other things to keep our boards booting
>>  and have this addition, but we need to try to keep this in size issue in
>>  mind).
>
> OK, got it. I have some easy patches to cut off 250 Bytes or so from an
> AArch64 build, maybe there is something similar possible for ARM?
> For instance I converted the ctype() implementation from table based to
> using simple comparisons and could cover all cases needed by the SPL and
> save 200 Bytes. After a quick look at am335x_shc_sdboot_defconfig it
> seems you have the 256 Byte ctype() table in there, so I can send this
> patch to give you more back than this FIT extension takes ;-)
>
>>>>>  The first three patches rework the SPL FIT support to be more flexible
>>>>>  and to allow easier usage in the fourth patch, which introduces the
>>>>>  multiple-image loading facility.
>>>>>  The remaining patches enable that support for the Pine64 board to make
>>>>>  its SPL support finally useful and to demonstrate usage of this scheme:
>>>>>  patches 5-7 extend the usable SPL size by about 4 KB to allow AArch64
>>>>>  compilation of the SPL with FIT support enabled. Patch 8 implements the
>>>>>  board selector routine, which selects either the Pine64 or Pine64+ DTB
>>>>>  depending on the detected DRAM size. Patch 9 enables SPL FIT support in
>>>>>  the Pine64 defconfig.
>>>>>  To demonstrate the usage, patch 10 provides a FIT source file, which
>>>>>  loads and executes ATF before the U-Boot proper. Users are expected to
>>>>>  compile this with "mkimage -f boards/sunxi/pine64_atf.its -E pine64.itb",
>>>>>  then write the resulting file behind the SPL on an SD card (or any other
>>>>>  U-Boot supported boot media, for that matter).
>>>>>  Patch 11 then adds FIT support to the sunxi SPL SPI loading routine,
>>>>>  which allows to load ATF on boards with SPI flash as well.
>>>>>
>>>>>  Questions:
>>>>>  1) Is this scheme the right one (usage of "firmware" and "loadables",
>>>>>     determination of entry point)? Shall we make use of the "setup"
>>>>>     property?
>>>>>  2) Shall we extend mkimage to allow supplying "loadable" files on the
>>>>>     command line, which would allow to build the .itb file automatically?
>>>>
>>>>  Where does this end, we may also need to add the load address for
>>>>  images, etc... eventually we are passing a full .its on the command
>>>>  line. I'm not against this, as it would help our build process also (we
>>>>  generate an .its file with all our build artifacts during our distro
>>>>  build and feed it to mkimage), so if we think this is better than option
>>>>  3 below, we should think through all the things we may need before
>>>>  cluttering up the mkimage command line arguments.
>>>
>>>  I agree, I was wondering about that as well. It's just tempting to add
>>>  one or two options and piggy-back on the existing Makefile support.
>>>
>>>  Maybe some generic infrastructure of storing platform or board specific
>>>  .its files can be included into the build system? Similarly to .dts
>>>  files we could reference them in the (def)config and use mkimage -f
>>>  during build to generate an image? That sounds more flexible than adding
>>>  command line options to cover specific scenarios. We may use something
>>>  like mergeconfig to make changes to the .its when needed.
>>
>>  I'm okay with that, as these .its files are .dts based anyway it
>>  shouldn't be too hard to have #includes to get other image specific
>>  nodes and overrides. One thing I'm not sure about is having the .its
>>  files stored in U-Boot tree, as most of the stuff we add to our .itb
>>  loadable section is external (ATF, OP-TEE, IPU/IVA firmware, etc..), but
>>  I'm all for adding the support to mkimage for such a thing anyway.
>
> Yeah, that's an interesting point. Allwinner also needs the ATF bl31.bin
> to be provided somehow. In the "demo" .its I put it into U-Boot root,
> maybe we should create a directory "externals" or the like with just a
> README in it, and people are supposed to copy or link in the binary
> images there? In the .its it would read "../../externals/...", for
> instance, to make it more clear that those components are external to
> and not provided by U-Boot.

Maybe you can take doc/README.x86 as a reference?

X86 platform nearly all needs external blob (except QEMU :-) ) to build
a ROM image.

>
> Cheers,
> Andre.
>
>>>  Cheers,
>>>  Andre.
>>>
>>>>>  3) Is providing the .its source file for a (family of) boards the right
>>>>>     way?
>>>>>  4) Does this break any boards which already use SPL FIT loading?
>>>>>
>>>>>  And for the Pine64 part:
>>>>>  5) Is extending the usable SPL size like in patch 5-7 acceptable?
>>>>>
>>>>>  I have a more generic solution for the .dtb selection in mind: Based on
>>>>>  some patch from Siarhei we store the .dtb filename in the SPL header and
>>>>>  select the .dtb from the FIT image by simply matching the name. This would
>>>>>  allow _one_ build supporting multiple boards. The actual board name would
>>>>>  need to written into the SPL header or could be copied from there when
>>>>>  updating the image.
>>>>>  I can provide the patches once we agreed upon this series.
>>>>>
>>>>>  Please let me know what you think!
>>>>>
>>>>>  Cheers,
>>>>>  Andre.
>>>>>
>>>>>  Andre Przywara (11):
>>>>>    SPL: FIT: refactor FDT loading
>>>>>    SPL: FIT: rework U-Boot image loading
>>>>>    SPL: FIT: factor out spl_load_fit_image()
>>>>>    SPL: FIT: allow loading multiple images
>>>>>    tools: mksunxiboot: allow larger SPL binaries
>>>>>    sunxi: A64: SPL: allow large SPL binary
>>>>>    sunxi: A64: move SPL stack to end of SRAM A2
>>>>>    sunxi: SPL: add FIT config selector for Pine64 boards
>>>>>    sunxi: Pine64: defconfig: enable SPL FIT support
>>>>>    sunxi: Pine64: add FIT image source
>>>>>    SPL: SPI: sunxi: add SPL FIT image support
>>>>>
>>>>>   board/sunxi/board.c | 13 +++
>>>>>   board/sunxi/pine64_atf.its | 54 +++++++++
>>>>>   common/spl/spl_fit.c | 241 +++++++++++++++++++++++-----------------
>>>>>   configs/pine64_plus_defconfig | 5 +
>>>>>   drivers/mtd/spi/sunxi_spi_spl.c | 39 +++++--
>>>>>   include/configs/sunxi-common.h | 6 +-
>>>>>   scripts/Makefile.spl | 7 +-
>>>>>   tools/mksunxiboot.c | 51 ++++++---
>>>>>   8 files changed, 290 insertions(+), 126 deletions(-)
>>>>>   create mode 100644 board/sunxi/pine64_atf.its
>
> --
> You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe at googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.


More information about the U-Boot mailing list