> -----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)
> +
> +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?
> +
> + ret = part_get_info(desc, part_num, info);
Jason Liu
smime.p7s
Description: S/MIME cryptographic signature

