]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
drivers: fwu: add the size parameter to the metadata access API's
authorSughosh Ganu <sughosh.ganu@linaro.org>
Fri, 22 Mar 2024 10:57:16 +0000 (16:27 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 24 May 2024 19:40:03 +0000 (13:40 -0600)
In version 2 of the metadata structure, the size of the structure
cannot be determined statically at build time. The structure is now
broken into the top level structure which contains a field indicating
the total size of the structure.

Add a size parameter to the metadata access API functions to indicate
the number of bytes to be accessed. This is then used to either read
the entire structure, or only the top level structure.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
Tested-by: Michal Simek <michal.simek@amd.com>
drivers/fwu-mdata/fwu-mdata-uclass.c
drivers/fwu-mdata/gpt_blk.c
drivers/fwu-mdata/raw_mtd.c
include/fwu.h

index 0a8edaaa418fdf24c0aa984ada7a560980751637..145479bab0fab2d2d5ed476fa3da5b66c9accb91 100644 (file)
@@ -20,7 +20,8 @@
  *
  * Return: 0 if OK, -ve on error
  */
-int fwu_read_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary)
+int fwu_read_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary,
+                  uint32_t size)
 {
        const struct fwu_mdata_ops *ops = device_get_ops(dev);
 
@@ -29,7 +30,7 @@ int fwu_read_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary)
                return -ENOSYS;
        }
 
-       return ops->read_mdata(dev, mdata, primary);
+       return ops->read_mdata(dev, mdata, primary, size);
 }
 
 /**
@@ -37,7 +38,8 @@ int fwu_read_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary)
  *
  * Return: 0 if OK, -ve on error
  */
-int fwu_write_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary)
+int fwu_write_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary,
+                   uint32_t size)
 {
        const struct fwu_mdata_ops *ops = device_get_ops(dev);
 
@@ -46,7 +48,7 @@ int fwu_write_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary)
                return -ENOSYS;
        }
 
-       return ops->write_mdata(dev, mdata, primary);
+       return ops->write_mdata(dev, mdata, primary, size);
 }
 
 UCLASS_DRIVER(fwu_mdata) = {
index c7284916c4e05c9b05d29921fb0143866721c3e6..97eac3611f7b60d06392316c11d67446d366ff8e 100644 (file)
@@ -81,15 +81,14 @@ static int gpt_get_mdata_disk_part(struct blk_desc *desc,
        return -ENOENT;
 }
 
-static int gpt_read_write_mdata(struct blk_desc *desc,
-                               struct fwu_mdata *mdata,
-                               u8 access, u32 part_num)
+static int gpt_read_write_mdata(struct blk_desc *desc, struct fwu_mdata *mdata,
+                               u8 access, u32 part_num, u32 size)
 {
        int ret;
        u32 len, blk_start, blkcnt;
        struct disk_partition info;
 
-       ALLOC_CACHE_ALIGN_BUFFER_PAD(struct fwu_mdata, mdata_aligned, 1,
+       ALLOC_CACHE_ALIGN_BUFFER_PAD(u8, mdata_aligned, size,
                                     desc->blksz);
 
        if (!mdata)
@@ -101,7 +100,7 @@ static int gpt_read_write_mdata(struct blk_desc *desc,
                return -ENOENT;
        }
 
-       len = sizeof(*mdata);
+       len = size;
        blkcnt = BLOCK_CNT(len, desc);
        if (blkcnt > info.size) {
                log_debug("Block count exceeds FWU metadata partition size\n");
@@ -114,7 +113,7 @@ static int gpt_read_write_mdata(struct blk_desc *desc,
                        log_debug("Error reading FWU metadata from the device\n");
                        return -EIO;
                }
-               memcpy(mdata, mdata_aligned, sizeof(struct fwu_mdata));
+               memcpy(mdata, mdata_aligned, size);
        } else {
                if (blk_dwrite(desc, blk_start, blkcnt, mdata) != blkcnt) {
                        log_debug("Error writing FWU metadata to the device\n");
@@ -164,7 +163,7 @@ static int fwu_mdata_gpt_blk_probe(struct udevice *dev)
 }
 
 static int fwu_gpt_read_mdata(struct udevice *dev, struct fwu_mdata *mdata,
-                             bool primary)
+                             bool primary, u32 size)
 {
        struct fwu_mdata_gpt_blk_priv *priv = dev_get_priv(dev);
        struct blk_desc *desc = dev_get_uclass_plat(priv->blk_dev);
@@ -177,11 +176,13 @@ static int fwu_gpt_read_mdata(struct udevice *dev, struct fwu_mdata *mdata,
        }
 
        return gpt_read_write_mdata(desc, mdata, MDATA_READ,
-                                   primary ? g_mdata_part[0] : g_mdata_part[1]);
+                                   primary ?
+                                   g_mdata_part[0] : g_mdata_part[1],
+                                   size);
 }
 
 static int fwu_gpt_write_mdata(struct udevice *dev, struct fwu_mdata *mdata,
-                              bool primary)
+                              bool primary, u32 size)
 {
        struct fwu_mdata_gpt_blk_priv *priv = dev_get_priv(dev);
        struct blk_desc *desc = dev_get_uclass_plat(priv->blk_dev);
@@ -194,7 +195,9 @@ static int fwu_gpt_write_mdata(struct udevice *dev, struct fwu_mdata *mdata,
        }
 
        return gpt_read_write_mdata(desc, mdata, MDATA_WRITE,
-                                   primary ? g_mdata_part[0] : g_mdata_part[1]);
+                                   primary ?
+                                   g_mdata_part[0] : g_mdata_part[1],
+                                   size);
 }
 
 static const struct fwu_mdata_ops fwu_gpt_blk_ops = {
index 17e45179738517b8c1e2aa2d0e466b3af1556655..9f3f1dc21311ce8fead1fb458da426c1e4d24763 100644 (file)
@@ -97,22 +97,24 @@ lock:
        return ret;
 }
 
-static int fwu_mtd_read_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary)
+static int fwu_mtd_read_mdata(struct udevice *dev, struct fwu_mdata *mdata,
+                             bool primary, u32 size)
 {
        struct fwu_mdata_mtd_priv *mtd_priv = dev_get_priv(dev);
        struct mtd_info *mtd = mtd_priv->mtd;
        u32 offs = primary ? mtd_priv->pri_offset : mtd_priv->sec_offset;
 
-       return mtd_io_data(mtd, offs, sizeof(struct fwu_mdata), mdata, FWU_MTD_READ);
+       return mtd_io_data(mtd, offs, size, mdata, FWU_MTD_READ);
 }
 
-static int fwu_mtd_write_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary)
+static int fwu_mtd_write_mdata(struct udevice *dev, struct fwu_mdata *mdata,
+                              bool primary, u32 size)
 {
        struct fwu_mdata_mtd_priv *mtd_priv = dev_get_priv(dev);
        struct mtd_info *mtd = mtd_priv->mtd;
        u32 offs = primary ? mtd_priv->pri_offset : mtd_priv->sec_offset;
 
-       return mtd_io_data(mtd, offs, sizeof(struct fwu_mdata), mdata, FWU_MTD_WRITE);
+       return mtd_io_data(mtd, offs, size, mdata, FWU_MTD_WRITE);
 }
 
 static int flash_partition_offset(struct udevice *dev, const char *part_name, fdt_addr_t *offset)
index eb5638f4f3a05dfd2af4f375e9ada0651e56a790..1815bd0064c8883811324c64283e11ed5863a43b 100644 (file)
@@ -32,20 +32,24 @@ struct fwu_mdata_ops {
         * @dev: FWU metadata device
         * @mdata: Output FWU mdata read
         * @primary: If primary or secondary copy of metadata is to be read
+        * @size: Size in bytes of the metadata to be read
         *
         * Return: 0 if OK, -ve on error
         */
-       int (*read_mdata)(struct udevice *dev, struct fwu_mdata *mdata, bool primary);
+       int (*read_mdata)(struct udevice *dev, struct fwu_mdata *mdata,
+                         bool primary, uint32_t size);
 
        /**
         * write_mdata() - Write the given FWU metadata copy
         * @dev: FWU metadata device
         * @mdata: Copy of the FWU metadata to write
         * @primary: If primary or secondary copy of metadata is to be written
+        * @size: Size in bytes of the metadata to be written
         *
         * Return: 0 if OK, -ve on error
         */
-       int (*write_mdata)(struct udevice *dev, struct fwu_mdata *mdata, bool primary);
+       int (*write_mdata)(struct udevice *dev, struct fwu_mdata *mdata,
+                          bool primary, uint32_t size);
 };
 
 #define FWU_MDATA_VERSION      0x1
@@ -80,12 +84,14 @@ struct fwu_mdata_ops {
 /**
  * fwu_read_mdata() - Wrapper around fwu_mdata_ops.read_mdata()
  */
-int fwu_read_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary);
+int fwu_read_mdata(struct udevice *dev, struct fwu_mdata *mdata,
+                  bool primary, uint32_t size);
 
 /**
  * fwu_write_mdata() - Wrapper around fwu_mdata_ops.write_mdata()
  */
-int fwu_write_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary);
+int fwu_write_mdata(struct udevice *dev, struct fwu_mdata *mdata,
+                   bool primary, uint32_t size);
 
 /**
  * fwu_get_mdata() - Read, verify and return the FWU metadata