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:
Patrick Delaunay
2022-03-28 19:25:30 +02:00
committed by Patrice Chotard
parent 49d0ecb123
commit 2a4fe0ee48
2 changed files with 59 additions and 20 deletions

View File

@@ -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, ";");

View File

@@ -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 */