
rec->tag = tag;
rec->hdr_size = sizeof(struct bloblist_rec);
rec->tag_and_hdr_size = tag | sizeof(*rec) << BLOBLISTR_HDR_SIZE_SHIFT;
nit: Might be a good idea to mask the tag or double-check that it fits the field size here.
- Bloblist uses 16-byte alignment internally and is designed to start on a
- 16-byte boundary. Its headers are multiples of 16 bytes. This makes it easier
- to deal with data structures which need this level of alignment, such as ACPI
- tables. For use in SPL and TPL the alignment can be relaxed, since it can be
- relocated to an aligned address in U-Boot proper.
- Bloblist uses 8-byte alignment internally and is designed to start on a
- 8-byte boundary. Its headers are 8 bytes long. It is possible to achieve
- larger alignment (e.g. 16 bytes) by adding a dummy header, For use in SPL and
nit: I would call it a "dummy entry", it's not always just a header.
BLOBLIST_BLOB_ALIGN_LOG2 = 3,
BLOBLIST_BLOB_ALIGN = 1 << BLOBLIST_BLOB_ALIGN_LOG2,
BLOBLIST_ALIGN_LOG2 = 4, BLOBLIST_ALIGN = 1 << BLOBLIST_ALIGN_LOG2,
}; @@ -181,17 +184,25 @@ struct bloblist_hdr {
Note that there's no specific requirement for the TL header to be aligned to 16 bytes. Even though it is 16 bytes long, 8 bytes alignment is enough (so you shouldn't really need a BLOBLIST_ALIGN that's different from BLOBLIST_BLOB_ALIGN).
There's also some text above this in the docstring for this struct that refers to 16 bytes and should be updated. (I would recommend also updating the "it can be safely moved around" part to point to the instructions for relocation in the firmware_handoff spec, since while it can be relocated, special care must be taken to preserve alignment restrictions.