stm32mp: stm32prog: add support of UUID for FIP partition
Add support of UUID for FIP parttion, required by Firmware update support in TF-A: - UUID TYPE for FIP partition: 19d5df83-11b0-457b-be2c-7559c13142a5 - "fip-a" partition UUID: 4fd84c93-54ef-463f-a7ef-ae25ff887087 - "fip-b" partition UUID: 09c54952-d5bf-45af-acee-335303766fb3 This check is done with a new partition type "FIP" associated at the FIP UUID. The A/B partition UUID is detected by the partition name: "fip-a", "fip-b". Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
This commit is contained in:

committed by
Patrice Chotard

parent
49d0ecb123
commit
2a4fe0ee48
@@ -62,6 +62,28 @@ static const efi_guid_t uuid_mmc[3] = {
|
|||||||
ROOTFS_MMC2_UUID
|
ROOTFS_MMC2_UUID
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* FIP type partition UUID used by TF-A*/
|
||||||
|
#define FIP_TYPE_UUID "19D5DF83-11B0-457B-BE2C-7559C13142A5"
|
||||||
|
|
||||||
|
/* unique partition guid (uuid) for FIP partitions A/B */
|
||||||
|
#define FIP_A_UUID \
|
||||||
|
EFI_GUID(0x4FD84C93, 0x54EF, 0x463F, \
|
||||||
|
0xA7, 0xEF, 0xAE, 0x25, 0xFF, 0x88, 0x70, 0x87)
|
||||||
|
|
||||||
|
#define FIP_B_UUID \
|
||||||
|
EFI_GUID(0x09C54952, 0xD5BF, 0x45AF, \
|
||||||
|
0xAC, 0xEE, 0x33, 0x53, 0x03, 0x76, 0x6F, 0xB3)
|
||||||
|
|
||||||
|
static const char * const fip_part_name[] = {
|
||||||
|
"fip-a",
|
||||||
|
"fip-b"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const efi_guid_t fip_part_uuid[] = {
|
||||||
|
FIP_A_UUID,
|
||||||
|
FIP_B_UUID
|
||||||
|
};
|
||||||
|
|
||||||
/* order of column in flash layout file */
|
/* order of column in flash layout file */
|
||||||
enum stm32prog_col_t {
|
enum stm32prog_col_t {
|
||||||
COL_OPTION,
|
COL_OPTION,
|
||||||
@@ -405,6 +427,8 @@ static int parse_type(struct stm32prog_data *data,
|
|||||||
part->bin_nb =
|
part->bin_nb =
|
||||||
dectoul(&p[7], NULL);
|
dectoul(&p[7], NULL);
|
||||||
}
|
}
|
||||||
|
} else if (!strcmp(p, "FIP")) {
|
||||||
|
part->part_type = PART_FIP;
|
||||||
} else if (!strcmp(p, "System")) {
|
} else if (!strcmp(p, "System")) {
|
||||||
part->part_type = PART_SYSTEM;
|
part->part_type = PART_SYSTEM;
|
||||||
} else if (!strcmp(p, "FileSystem")) {
|
} else if (!strcmp(p, "FileSystem")) {
|
||||||
@@ -1056,9 +1080,10 @@ static int create_gpt_partitions(struct stm32prog_data *data)
|
|||||||
char uuid[UUID_STR_LEN + 1];
|
char uuid[UUID_STR_LEN + 1];
|
||||||
unsigned char *uuid_bin;
|
unsigned char *uuid_bin;
|
||||||
unsigned int mmc_id;
|
unsigned int mmc_id;
|
||||||
int i;
|
int i, j;
|
||||||
bool rootfs_found;
|
bool rootfs_found;
|
||||||
struct stm32prog_part_t *part;
|
struct stm32prog_part_t *part;
|
||||||
|
const char *type_str;
|
||||||
|
|
||||||
buf = malloc(buflen);
|
buf = malloc(buflen);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
@@ -1100,33 +1125,46 @@ static int create_gpt_partitions(struct stm32prog_data *data)
|
|||||||
part->addr,
|
part->addr,
|
||||||
part->size);
|
part->size);
|
||||||
|
|
||||||
if (part->part_type == PART_BINARY)
|
switch (part->part_type) {
|
||||||
offset += snprintf(buf + offset,
|
case PART_BINARY:
|
||||||
buflen - offset,
|
type_str = LINUX_RESERVED_UUID;
|
||||||
",type="
|
break;
|
||||||
LINUX_RESERVED_UUID);
|
case PART_FIP:
|
||||||
else
|
type_str = FIP_TYPE_UUID;
|
||||||
offset += snprintf(buf + offset,
|
break;
|
||||||
buflen - offset,
|
default:
|
||||||
",type=linux");
|
type_str = "linux";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
offset += snprintf(buf + offset,
|
||||||
|
buflen - offset,
|
||||||
|
",type=%s", type_str);
|
||||||
|
|
||||||
if (part->part_type == PART_SYSTEM)
|
if (part->part_type == PART_SYSTEM)
|
||||||
offset += snprintf(buf + offset,
|
offset += snprintf(buf + offset,
|
||||||
buflen - offset,
|
buflen - offset,
|
||||||
",bootable");
|
",bootable");
|
||||||
|
|
||||||
|
/* partition UUID */
|
||||||
|
uuid_bin = NULL;
|
||||||
if (!rootfs_found && !strcmp(part->name, "rootfs")) {
|
if (!rootfs_found && !strcmp(part->name, "rootfs")) {
|
||||||
mmc_id = part->dev_id;
|
mmc_id = part->dev_id;
|
||||||
rootfs_found = true;
|
rootfs_found = true;
|
||||||
if (mmc_id < ARRAY_SIZE(uuid_mmc)) {
|
if (mmc_id < ARRAY_SIZE(uuid_mmc))
|
||||||
uuid_bin =
|
uuid_bin = (unsigned char *)uuid_mmc[mmc_id].b;
|
||||||
(unsigned char *)uuid_mmc[mmc_id].b;
|
}
|
||||||
uuid_bin_to_str(uuid_bin, uuid,
|
if (part->part_type == PART_FIP) {
|
||||||
UUID_STR_FORMAT_GUID);
|
for (j = 0; j < ARRAY_SIZE(fip_part_name); j++)
|
||||||
offset += snprintf(buf + offset,
|
if (!strcmp(part->name, fip_part_name[j])) {
|
||||||
buflen - offset,
|
uuid_bin = (unsigned char *)fip_part_uuid[j].b;
|
||||||
",uuid=%s", uuid);
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (uuid_bin) {
|
||||||
|
uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
|
||||||
|
offset += snprintf(buf + offset,
|
||||||
|
buflen - offset,
|
||||||
|
",uuid=%s", uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += snprintf(buf + offset, buflen - offset, ";");
|
offset += snprintf(buf + offset, buflen - offset, ";");
|
||||||
|
@@ -94,9 +94,10 @@ struct stm32_header_v2 {
|
|||||||
/* partition type in flashlayout file */
|
/* partition type in flashlayout file */
|
||||||
enum stm32prog_part_type {
|
enum stm32prog_part_type {
|
||||||
PART_BINARY,
|
PART_BINARY,
|
||||||
|
PART_FIP,
|
||||||
PART_SYSTEM,
|
PART_SYSTEM,
|
||||||
PART_FILESYSTEM,
|
PART_FILESYSTEM,
|
||||||
RAW_IMAGE
|
RAW_IMAGE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* device information */
|
/* device information */
|
||||||
|
Reference in New Issue
Block a user