On 11/13/25 11:46 PM, Simon Glass wrote:

Hello Simon,

The problem should be fixed higher up, in its callers, etc. For one
thing, the caller knows whether it is a DT or not, so putting this
logic here is messy. See boot_get_fdt_fit()

This is triggered by a fitImage with DT embedded in that fitImage as
non-external-data. That DT is at 4-byte aligned address, so how can the
caller deal with it ? The caller gets a fitImage, which itself is at
8-byte aligned address, but the DT in it is not at 8-byte aligned
address, so that DT has to be relocated somehow and that happens here.

OK, but don't put the code in here...see boot_get_fdt_fit(). But even
then, why does it matter where the FDT is?

The FDT has to be at 8-byte aligned offset.

We are going to use
fdt_openinto() at some point and put it elsewhere, right, so we can do
pre-boot fixups?

Look at the fit load code, cca. 10 lines below, it checks the FDT for validity using fdt_check_header() . At that point, the FDT must be at 8-byte aligned address already:

2294 } else if (load_op != FIT_LOAD_IGNORED && image_type == IH_TYPE_FLATDT &&
2295                    ((uintptr_t)buf & 7)) {
2296                 loadbuf = memalign(8, len);
2297                 load = map_to_sysmem(loadbuf);
2298                 memcpy(loadbuf, buf, len);

...

2309         /* verify that image data is a proper FDT blob */
2310 if (load_op != FIT_LOAD_IGNORED && image_type == IH_TYPE_FLATDT &&
2311             fdt_check_header(loadbuf)) { <----------------- this
2312                 puts("Subimage data is not a FDT\n");
2313                 return -ENOEXEC;
2314         }

Perhaps we should deprecate FITs with internal data, too?
We cannot break compatibility and stop supporting old fitImage, so this is irrelevant here.

Reply via email to