Hello,
                                                                                
                                                                                
                             
When bringing up a new board based on i.MX7D, I stumbled upon an ABI 
incompatibility between U-Boot,
and a boot-ROM plugin used to select and execute DCD, that was caused by the 
following commit:
699279cac0ed0816433e0922aba26fe6dd0a8066 ("tools: mkimage: fix imximage header 
size") [1]

My configuration has worked previously with i.MX6, which shares the DCD format 
and constraints with i.MX7.
This change concerns me for the following reasons:
- Compatibility between i.MX boot-ROM plugin and U-boot,
- I need to maintain ABI compatibility between U-boot and SPL.
- DCD is copied to OCRAM by boot-ROM, and it either wouldn't be copied in 
whole, or worse,
  overwrite boot-ROM state if size specified in header is greater than allowed 
maximum -
  and 'imximage' always generates DCD images of the maximum size as defined by 
dcd_v2_t.
  Although, the first seems more likely.

Before [1], sizeof(dcd_v2_t) was 1768 bytes, and this is the maximum size 
specified by [2] and [3]:
"The DCD table shown below is a big-endian byte array of the allowable DCD 
commands.
The maximum size of the DCD is limited to 1768 B."

After [1] is applied, then sizeof(dcd_v2_t) grows to 1772 bytes.
This is not only not aligned to 8 byte boundary as the commit message tells,
but is out of specification for i.MX7 [2] and i.MX6 [3].

So, the main question is - which value is correct? 1768 or 1772 bytes?

I wrote a simple static assertion to check for that (in include/imximage.h, 
after definition of dcd_v2_t), and it passes after introducing [1]:

_Static_assert (sizeof(dcd_v2_t) == 1772, "DCD size mismatch");

Secondary question is: If [1] is correct, then shouldn't the DCD header be 
counted in?
After [1], DCD payload itself take up 1768 bytes indeed.
According to [4], DCD length specified in header itself includes the header:

Tag: A single-byte field set to 0xD2
Length: a two-byte field in the big-endian format containing the overall length 
of the DCD
(in bytes) including the header
Version: A single-byte field set to 0x41

I fixed my issue by reverting this commit locally for the time being,
but I'd still like to keep the tree as close to upstream as possible.

Any information on the topic would be greatly appreciated.

[1] 
https://gitlab.denx.de/u-boot/u-boot/-/commit/699279cac0ed0816433e0922aba26fe6dd0a8066
[2] "i.MX 7Dual Applications Processor Reference Manual" paragraph 6.6.7.2
[3] "i.MX 6Dual/6Quad Applications Processor Reference Manual" paragraph 8.6.2
[4] "i.MX 7Dual Applications Processor Reference Manual" figure 6-43. DCD 
header format

-- 
Pozdrawiam/With kind regards,
Lech Perczak

Sr. Software Engineer
Camlin Technologies Poland Limited Sp. z o.o.

Reply via email to