Re: [PATCH] spl: Align device tree blob address at 8-byte boundary

Bin Meng
2021-07-12T05:36:35Z

On Mon, Jul 12, 2021 at 1:21 PM Reuben Dowle <reuben.dowle@4rf.com> wrote:
>
> I submitted an almost identical patch. See https://github.com/u-boot/u-boot/commit/eb39d8ba5f0d1468b01b89a2a464d18612d3ea76
>
> This patch eventually had to be reverted (https://github.com/u-boot/u-boot/commit/5675ed7cb645f5ec13958726992daeeed16fd114), because it was causing issues on some platforms that had FIT on 32 bit boundary. However I continue to use it in production code, as without it the boot on my platform aborts.
>
> I don't have time to investigate why this was happening, but you need to check this code won't just cause exactly the same faults.

Thanks for your information.

+Marek who did the revert

The revert commit message says:

"The commit breaks booting of fitImage by SPL, the system simply
hangs. This is because on arm32, the fitImage and all of its content
can be aligned to 4 bytes and U-Boot expects just that."

I don't understand this. If an address is aligned to 8, it is already
aligned to 4, so how did this commit make the system hang on arm32?

Note, as I indicated in this patch, now with libfdt 1.6.1, the
alignment to 8 byte is a must-have. So we have to do such alignment
anyway.

@Tom may fill in why libfdt commit commit 5e735860c478 ("libfdt: Check
for 8-byte address alignment in fdt_ro_probe_()") was made to have the
8-byte alignment requirement.

>
> -----Original Message-----
> > From: U-Boot <u-boot-bounces@lists.denx.de> On Behalf Of Bin Meng
> > Sent: Monday, 12 July 2021 3:53 pm
> > To: Tom Rini <trini@konsulko.com>; Simon Glass <sjg@chromium.org>; u-
> > boot@lists.denx.de
> > Cc: Bin Meng <bmeng.cn@gmail.com>
> > Subject: [PATCH] spl: Align device tree blob address at 8-byte boundary
> >
> > Since libfdt v1.6.1, a new requirement on the device tree address via:
> >
> > commit 5e735860c478 ("libfdt: Check for 8-byte address alignment in
> > fdt_ro_probe_()")
> >
> > must be met that the device tree must be loaded in to memory at an 8-byte
> > aligned address.
> >
> > Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
> > ---
> >
> > common/spl/spl_fit.c | 6 ++++++
> > 1 file changed, 6 insertions(+)
> >
> > diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index
> > f41abca0cc..9baf6aca9f 100644
> > --- a/common/spl/spl_fit.c
> > +++ b/common/spl/spl_fit.c
> > @@ -374,6 +374,12 @@ static int spl_fit_append_fdt(struct spl_image_info
> > *spl_image,
> > */
> > image_info.load_addr = spl_image->load_addr + spl_image->size;
> >
> > +/*
> > + * Since libfdt v1.6.1, the device tree must be loaded in to memory
> > + * at an 8-byte aligned address.
> > + */
> > +image_info.load_addr = roundup(image_info.load_addr, 8);
> > +
> > /* Figure out which device tree the board wants to use */
> > node = spl_fit_get_image_node(ctx, FIT_FDT_PROP, index++);
> > if (node < 0) {
> > --

Regards,
Bin