On Thu, 9 Dec 2021 at 15:06, Jason Liu <[email protected]> wrote:
> > > > -----Original Message----- > > From: Sughosh Ganu <[email protected]> > > Sent: 2021年11月25日 15:02 > > To: [email protected] > > Cc: Patrick Delaunay <[email protected]>; Patrice Chotard > > <[email protected]>; Heinrich Schuchardt <[email protected]>; > > Alexander Graf <[email protected]>; Simon Glass <[email protected]>; Bin > > Meng <[email protected]>; Peng Fan <[email protected]>; AKASHI > > Takahiro <[email protected]>; Ilias Apalodimas > > <[email protected]>; Jose Marinho <[email protected]>; > Grant > > Likely <[email protected]>; Jason Liu <[email protected]>; > Sughosh > > Ganu <[email protected]> > > Subject: [RFC PATCH 04/10] FWU: Add metadata access functions for GPT > > partitioned block devices > > > > In the FWU Multi Bank Update feature, the information about the updatable > > images is stored as part of the metadata, on a separate partition. Add > > functions for reading from and writing to the metadata when the updatable > > images and the metadata are stored on a block device which is formated > with > > GPT based partition scheme. > > > > Signed-off-by: Sughosh Ganu <[email protected]> > > --- > > lib/fwu_updates/fwu_metadata_gpt_blk.c | 716 > > +++++++++++++++++++++++++ > > 1 file changed, 716 insertions(+) > > create mode 100644 lib/fwu_updates/fwu_metadata_gpt_blk.c > > > > diff --git a/lib/fwu_updates/fwu_metadata_gpt_blk.c > > b/lib/fwu_updates/fwu_metadata_gpt_blk.c > > new file mode 100644 > > index 0000000000..98cc53f706 > > --- /dev/null > > +++ b/lib/fwu_updates/fwu_metadata_gpt_blk.c > > @@ -0,0 +1,716 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* > > + * Copyright (c) 2021, Linaro Limited > > + */ > > + > > +#include <blk.h> > > +#include <efi_loader.h> > > +#include <fwu_metadata.h> > > +#include <malloc.h> > > +#include <memalign.h> > > +#include <part.h> > > +#include <part_efi.h> > > + > > +#include <linux/errno.h> > > +#include <linux/types.h> > > +#include <u-boot/crc.h> > > + > > +#define PRIMARY_VALID 0x1 > > +#define SECONDARY_VALID 0x2 > > + > > +#define MDATA_READ (u8)0x1 > > +#define MDATA_WRITE (u8)0x2 > > + > > +#define IMAGE_ACCEPT_SET (u8)0x1 > > +#define IMAGE_ACCEPT_CLEAR (u8)0x2 > > Better to define as the followings: > > #define MDATA_READ ((u8)0x1) > #define MDATA_WRITE ((u8)0x2) > > #define IMAGE_ACCEPT_SET ((u8)0x1) > #define IMAGE_ACCEPT_CLEAR ((u8)0x2) > Ilias had suggested using the BIT macros for this. I have made that change. Hope that is fine. > > > + > > +static int gpt_verify_metadata(struct fwu_metadata *metadata, bool > > +pri_part) { > > + u32 calc_crc32; > > + void *buf; > > + > > + buf = &metadata->version; > > + calc_crc32 = crc32(0, buf, sizeof(*metadata) - sizeof(u32)); > > + > > + if (calc_crc32 != metadata->crc32) { > > + log_err("crc32 check failed for %s metadata partition\n", > > + pri_part ? "primary" : "secondary"); > > + return -1; > > + } > > + > > + return 0; > > +} > > + > > +static int gpt_get_metadata_partitions(struct blk_desc *desc, > > + u32 *primary_mpart, > > + u32 *secondary_mpart) > > +{ > > + int i, ret; > > + u32 nparts, mparts; > > + gpt_entry *gpt_pte = NULL; > > + const efi_guid_t fwu_metadata_guid = FWU_METADATA_GUID; > > + > > + ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, > > + desc->blksz); > > + > > + ret = get_gpt_hdr_parts(desc, gpt_head, &gpt_pte); > > + if (ret < 0) { > > + log_err("Error getting GPT header and partitions\n"); > > + ret = -EIO; > > + goto out; > > + } > > + > > + nparts = gpt_head->num_partition_entries; > > + for (i = 0, mparts = 0; i < nparts; i++) { > > + if (!guidcmp(&fwu_metadata_guid, > > + &gpt_pte[i].partition_type_guid)) { > > + ++mparts; > > + if (!*primary_mpart) > > + *primary_mpart = i + 1; > > + else > > + *secondary_mpart = i + 1; > > + } > > + } > > + > > + if (mparts != 2) { > > + log_err("Expect two copies of the metadata instead of > %d\n", > > + mparts); > > + ret = -EINVAL; > > + } else { > > + ret = 0; > > + } > > +out: > > + free(gpt_pte); > > + > > + return ret; > > +} > > + > > +static int gpt_get_metadata_disk_part(struct blk_desc *desc, > > + struct disk_partition *info, > > + u32 part_num) > > +{ > > + int ret; > > + char *metadata_guid_str = "8a7a84a0-8387-40f6-ab41-a8b9a5a60d23"; > > Is this hard-code guid_string intentioned? > Yes, this is mentioned in the FWU spec[1], Table 3, pg 14. -sughosh [1] - https://developer.arm.com/documentation/den0118/a > > > + > > + ret = part_get_info(desc, part_num, info); > > Jason Liu >

