From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 386EFC6FA8B for ; Thu, 22 Sep 2022 08:59:43 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id B1F2884CAD; Thu, 22 Sep 2022 10:59:40 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="euaWX/tK"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id AB5E684CAD; Thu, 22 Sep 2022 10:59:38 +0200 (CEST) Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id E5F76848DB for ; Thu, 22 Sep 2022 10:59:35 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-wm1-x329.google.com with SMTP id d12-20020a05600c3acc00b003b4c12e47f3so871679wms.4 for ; Thu, 22 Sep 2022 01:59:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date; bh=XOi5tPqkfat1Gg3GNPVwNl32siihFUAdoNZ/Mieoqi8=; b=euaWX/tKAi1ftS6+ZrJnuS2hXO79bmSrB9q5A7oDho85GyZLEpFXAT+VWJalCXNqwV mdJHvWLqi0nGb327LN0jk1VPGxzcQjAgPJe5kpsFgQbhILtGdmewS8WOlVbsrhApz3jN wCQ3R7oqsuz2TKjNzWjWyUkbODdQi89xhtxv7oCanOHv7+ncxS8E6cLMELF95N0yaLlH qYuxGmxbLAbjgJPI3wsS4EXXxILLeZHF+gAJlq7tJO3NAkQnM0vKiJW8fzxk5qByCH5U TKd1S/LZO0qaP58XajqWPtxjQubWEqa+GZbccLQON+3WLv9IHUdEmvxSDWlky3b527fR nLOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date; bh=XOi5tPqkfat1Gg3GNPVwNl32siihFUAdoNZ/Mieoqi8=; b=xxLHPQczrG7SQXZAOCYJ/9tyjfybAz+Petsuwdbq+SeuXpL/1Y8gMWSH5cpqRCp5Zj LIV06qVbIHJ9ERixRtQjTaqOgefIOttihuD5BgtpkRZjUhwvaglgORenI7Kn4ig7Mj4Y rmBbesJ5COyvfbqlPrj/hFUOPHMdXQmyI6u8BsQLAZGq6XyY7+NM6E1Zh93Ne7dEtFFi k4uj7gHyHMJ341KOl2aOH/UO7EpEc+OdutSz6Qn7zb0anOxT0LLWuE8a3pFOZZu3oIcS LM1DH3hACDJh4sER3ocCMqh+kyFNvBvFDCOODiXHmft3HV9WfHarc7pXJETPmlYMp1Re SLqg== X-Gm-Message-State: ACrzQf2dm2lMyb3oTb0WTdA+68XD4qmbYDjXGmfKJzx5g7O5LMAwxMNG CC2PlGzdUCkfkhBfupRH6CACbQ== X-Google-Smtp-Source: AMsMyM5MkL0hNpZqdFvDCdrgLCZvM795IpnfOVdxLnBbYNWgN2jesBMibQprIrXDSsrz6EbhABmE3w== X-Received: by 2002:a05:600c:216:b0:3b4:874c:61e6 with SMTP id 22-20020a05600c021600b003b4874c61e6mr8856671wmi.116.1663837175460; Thu, 22 Sep 2022 01:59:35 -0700 (PDT) Received: from hades ([46.103.15.185]) by smtp.gmail.com with ESMTPSA id n18-20020a05600c465200b003b4e009deb2sm5536567wmo.41.2022.09.22.01.59.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Sep 2022 01:59:35 -0700 (PDT) Date: Thu, 22 Sep 2022 11:59:32 +0300 From: Ilias Apalodimas To: Sughosh Ganu Cc: u-boot@lists.denx.de, Heinrich Schuchardt , Takahiro Akashi , Patrick Delaunay , Patrice Chotard , Simon Glass , Bin Meng , Tom Rini , Etienne Carriere , Michal Simek , Jassi Brar Subject: Re: [PATCH v10 06/15] FWU: Add helper functions for accessing FWU metadata Message-ID: References: <20220915081451.633983-1-sughosh.ganu@linaro.org> <20220915081451.633983-7-sughosh.ganu@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220915081451.633983-7-sughosh.ganu@linaro.org> X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean Hi Sughosh On Thu, Sep 15, 2022 at 01:44:42PM +0530, Sughosh Ganu wrote: > Add weak functions for getting the update index value and dfu > alternate number needed for FWU Multi Bank update > functionality. > > The current implementation for getting the update index value is for > platforms with 2 banks. If a platform supports more than 2 banks, it > can implement it's own function. The function to get the dfu alternate > number has been added for platforms with GPT partitioned storage > devices. Platforms with other storage partition scheme need to > implement their own function. > > Signed-off-by: Sughosh Ganu > Reviewed-by: Patrick Delaunay > Acked-by: Etienne Carriere > --- > Changes since V9: > * Remove unneeded braces as suggested by Ilias > > include/fwu.h | 29 ++++++++++ > lib/fwu_updates/fwu.c | 27 +++++++++ > lib/fwu_updates/fwu_gpt.c | 114 ++++++++++++++++++++++++++++++++++++++ > 3 files changed, 170 insertions(+) > create mode 100644 lib/fwu_updates/fwu_gpt.c > > diff --git a/include/fwu.h b/include/fwu.h > index 1e16253f69..3ff37c628b 100644 > --- a/include/fwu.h > +++ b/include/fwu.h > @@ -215,4 +215,33 @@ int fwu_accept_image(efi_guid_t *img_type_id, u32 bank); > */ > int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank); > > +/** > + * fwu_plat_get_alt_num() - Get the DFU Alt Num for the image from the platform > + * @dev: FWU device > + * @image_guid: Image GUID for which DFU alt number needs to be retrieved > + * @alt_num: Pointer to the alt_num > + * > + * Get the DFU alt number from the platform for the image specified by the > + * image GUID. > + * > + * Return: 0 if OK, -ve on error > + * > + */ > +int fwu_plat_get_alt_num(struct udevice *dev, efi_guid_t *image_guid, > + u8 *alt_num); > + > +/** > + * fwu_plat_get_update_index() - Get the value of the update bank > + * @update_idx: Bank number to which images are to be updated > + * > + * Get the value of the bank(partition) to which the update needs to be > + * made. > + * > + * Note: This is a weak function and platforms can override this with > + * their own implementation for selection of the update bank. > + * > + * Return: 0 if OK, -ve on error > + * > + */ > +int fwu_plat_get_update_index(uint *update_idx); > #endif /* _FWU_H_ */ > diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c > index fb9dbca307..8e91b7aeae 100644 > --- a/lib/fwu_updates/fwu.c > +++ b/lib/fwu_updates/fwu.c > @@ -331,3 +331,30 @@ int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank) > return fwu_clrset_image_accept(img_type_id, bank, > IMAGE_ACCEPT_CLEAR); > } > + > +/** > + * fwu_plat_get_update_index() - Get the value of the update bank > + * @update_idx: Bank number to which images are to be updated > + * > + * Get the value of the bank(partition) to which the update needs to be > + * made. > + * > + * Note: This is a weak function and platforms can override this with > + * their own implementation for selection of the update bank. > + * > + * Return: 0 if OK, -ve on error > + * > + */ > +__weak int fwu_plat_get_update_index(uint *update_idx) > +{ > + int ret; > + u32 active_idx; > + > + ret = fwu_get_active_index(&active_idx); > + if (ret < 0) > + return -1; > + > + *update_idx = (active_idx + 1) % CONFIG_FWU_NUM_BANKS; > + > + return ret; > +} > diff --git a/lib/fwu_updates/fwu_gpt.c b/lib/fwu_updates/fwu_gpt.c > new file mode 100644 > index 0000000000..a1b0f3bea7 > --- /dev/null > +++ b/lib/fwu_updates/fwu_gpt.c > @@ -0,0 +1,114 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (c) 2022, Linaro Limited > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +static int get_gpt_dfu_identifier(struct blk_desc *desc, efi_guid_t *image_guid) > +{ > + int i; > + struct disk_partition info; > + efi_guid_t unique_part_guid; > + > + for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) { > + if (part_get_info(desc, i, &info)) > + continue; > + uuid_str_to_bin(info.uuid, unique_part_guid.b, > + UUID_STR_FORMAT_GUID); > + > + if (!guidcmp(&unique_part_guid, image_guid)) > + return i; > + } > + > + log_err("No partition found with image_guid %pUs\n", image_guid); > + return -ENOENT; > +} > + > +static int fwu_gpt_get_alt_num(struct blk_desc *desc, efi_guid_t *image_guid, > + u8 *alt_num, unsigned char dfu_dev) > +{ > + int ret = -1; > + int i, part, dev_num; > + int nalt; > + struct dfu_entity *dfu; > + > + dev_num = desc->devnum; > + part = get_gpt_dfu_identifier(desc, image_guid); > + if (part < 0) > + return -ENOENT; > + > + dfu_init_env_entities(NULL, NULL); > + > + nalt = 0; > + list_for_each_entry(dfu, &dfu_list, list) > + nalt++; > + > + if (!nalt) { > + log_warning("No entities in dfu_alt_info\n"); > + dfu_free_entities(); > + return -ENOENT; > + } > + > + for (i = 0; i < nalt; i++) { > + dfu = dfu_get_entity(i); > + > + if (!dfu) > + continue; > + > + /* > + * Currently, Multi Bank update > + * feature is being supported > + * only on GPT partitioned > + * MMC/SD devices. > + */ > + if (dfu->dev_type != dfu_dev) > + continue; > + > + if (dfu->layout == DFU_RAW_ADDR && > + dfu->data.mmc.dev_num == dev_num && > + dfu->data.mmc.part == part) { > + *alt_num = dfu->alt; > + ret = 0; > + break; I get that we only currently support it on mmc, but the if above is not going to scale as we add devices. Is there something better we can come up with? Probably a helper in the dfu layer? Cheers /Ilias > + } > + } > + > + dfu_free_entities(); > + > + return ret; > +} > + > +/** > + * fwu_plat_get_alt_num() - Get the DFU alt number > + * @dev: FWU metadata device > + * @image_guid: GUID value of the image for which the alt num is to > + * be obtained > + * @alt_num: The DFU alt number for the image that is to be updated > + * > + * Get the DFU alt number for the image that is to be updated. The > + * image is identified with the image_guid parameter that is passed > + * to the function. > + * > + * Note: This is a weak function and platforms can override this with > + * their own implementation for obtaining the alt number value. > + * > + * Return: 0 if OK, -ve on error > + * > + */ > +__weak int fwu_plat_get_alt_num(struct udevice *dev, efi_guid_t *image_guid, > + u8 *alt_num) > +{ > + struct fwu_mdata_gpt_blk_priv *priv = dev_get_priv(dev); > + > + return fwu_gpt_get_alt_num(dev_get_uclass_plat(priv->blk_dev), > + image_guid, alt_num, DFU_DEV_MMC); > +} > -- > 2.34.1 >