mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 08:42:12 +02:00
bloblist: fix bloblist convention check.
According to recently firmware handsoff spec [1]'s "Register usage at handoff
boundary", Transfer List's signature value was changed from 0x40_b10b
(3 bytes) to 4a0f_b10b (4 bytes).
As updating of TL's signature, register value of x1/r1 should be:
In aarch32's r1 value should be
R1[23:0]: set to the TL signature (4a0f_b10b -> masked range value: 0f_b10b)
R1[31:24]: version of the register convention == 1
and
In aarch64's x1 value should be
X1[31:0]: set to the TL signature (4a0f_b10b)
X1[39:32]: version of the register convention == 1
X1[63:40]: MBZ
(See the [2] and [3]).
This patch fix problems:
1. breaking X1 value with updated specification in aarch64
- change of length of signature field.
2. previous error value set in R1 in arm32.
- length of signature should be 24, but it uses 32bit signature.
This patch is a breaking change. It works only TF-A is updated.
Link: https://github.com/FirmwareHandoff/firmware_handoff [1]
Link: https://github.com/FirmwareHandoff/firmware_handoff/issues/32 [2]
Link: 5aa7aa1d3a
[3]
Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
Reviewed-by: Raymond Mao <raymond.mao@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -576,7 +576,16 @@ int bloblist_maybe_init(void)
|
||||
|
||||
int bloblist_check_reg_conv(ulong rfdt, ulong rzero, ulong rsig)
|
||||
{
|
||||
if (rzero || rsig != (BLOBLIST_MAGIC | BLOBLIST_REGCONV_VER) ||
|
||||
ulong version = BLOBLIST_REGCONV_VER;
|
||||
ulong sigval;
|
||||
|
||||
sigval = (IS_ENABLED(CONFIG_64BIT)) ?
|
||||
((BLOBLIST_MAGIC & ((1UL << BLOBLIST_REGCONV_SHIFT_64) - 1)) |
|
||||
((version & BLOBLIST_REGCONV_MASK) << BLOBLIST_REGCONV_SHIFT_64)) :
|
||||
((BLOBLIST_MAGIC & ((1UL << BLOBLIST_REGCONV_SHIFT_32) - 1)) |
|
||||
((version & BLOBLIST_REGCONV_MASK) << BLOBLIST_REGCONV_SHIFT_32));
|
||||
|
||||
if (rzero || rsig != sigval ||
|
||||
rfdt != (ulong)bloblist_find(BLOBLISTT_CONTROL_FDT, 0)) {
|
||||
gd->bloblist = NULL; /* Reset the gd bloblist pointer */
|
||||
return -EIO;
|
||||
|
@@ -78,12 +78,10 @@ enum {
|
||||
BLOBLIST_VERSION = 1,
|
||||
BLOBLIST_MAGIC = 0x4a0fb10b,
|
||||
|
||||
/*
|
||||
* FIXME:
|
||||
* Register convention version should be placed into a higher byte
|
||||
* https://github.com/FirmwareHandoff/firmware_handoff/issues/32
|
||||
*/
|
||||
BLOBLIST_REGCONV_VER = 1 << 24,
|
||||
BLOBLIST_REGCONV_SHIFT_64 = 32,
|
||||
BLOBLIST_REGCONV_SHIFT_32 = 24,
|
||||
BLOBLIST_REGCONV_MASK = 0xff,
|
||||
BLOBLIST_REGCONV_VER = 1,
|
||||
|
||||
BLOBLIST_BLOB_ALIGN_LOG2 = 3,
|
||||
BLOBLIST_BLOB_ALIGN = 1 << BLOBLIST_BLOB_ALIGN_LOG2,
|
||||
|
Reference in New Issue
Block a user