On Fri, Sep 22, 2023 at 04:11:14PM +0900, Masahisa Kojima wrote: > User needs to call several functions to create the ramdisk > with blkmap. > This adds the utility function to create blkmap device and > mount the ramdisk. > > Signed-off-by: Masahisa Kojima <masahisa.koj...@linaro.org> > Reviewed-by: Simon Glass <s...@chromium.org> > --- > drivers/block/Makefile | 1 + > drivers/block/blkmap.c | 15 ---------- > drivers/block/blkmap_helper.c | 53 +++++++++++++++++++++++++++++++++++ > include/blkmap.h | 29 +++++++++++++++++++ > 4 files changed, 83 insertions(+), 15 deletions(-) > create mode 100644 drivers/block/blkmap_helper.c > > diff --git a/drivers/block/Makefile b/drivers/block/Makefile > index a161d145fd..c3ccfc03e5 100644 > --- a/drivers/block/Makefile > +++ b/drivers/block/Makefile > @@ -15,6 +15,7 @@ endif > obj-$(CONFIG_SANDBOX) += sandbox.o host-uclass.o host_dev.o > obj-$(CONFIG_$(SPL_TPL_)BLOCK_CACHE) += blkcache.o > obj-$(CONFIG_BLKMAP) += blkmap.o > +obj-$(CONFIG_BLKMAP) += blkmap_helper.o > > obj-$(CONFIG_EFI_MEDIA) += efi-media-uclass.o > obj-$(CONFIG_EFI_MEDIA_SANDBOX) += sb_efi_media.o > diff --git a/drivers/block/blkmap.c b/drivers/block/blkmap.c > index 2bb0acc20f..4e95997f61 100644 > --- a/drivers/block/blkmap.c > +++ b/drivers/block/blkmap.c > @@ -66,21 +66,6 @@ struct blkmap_slice { > void (*destroy)(struct blkmap *bm, struct blkmap_slice *bms); > }; > > -/** > - * struct blkmap - Block map > - * > - * Data associated with a blkmap. > - * > - * @label: Human readable name of this blkmap > - * @blk: Underlying block device > - * @slices: List of slices associated with this blkmap > - */ > -struct blkmap { > - char *label; > - struct udevice *blk; > - struct list_head slices; > -}; > - > static bool blkmap_slice_contains(struct blkmap_slice *bms, lbaint_t blknr) > { > return (blknr >= bms->blknr) && (blknr < (bms->blknr + bms->blkcnt)); > diff --git a/drivers/block/blkmap_helper.c b/drivers/block/blkmap_helper.c > new file mode 100644 > index 0000000000..0f80035f57 > --- /dev/null > +++ b/drivers/block/blkmap_helper.c > @@ -0,0 +1,53 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * blkmap helper function > + * > + * Copyright (c) 2023, Linaro Limited > + */ > + > +#include <blk.h> > +#include <blkmap.h> > +#include <dm/device.h> > +#include <dm/device-internal.h> > + > +int blkmap_create_ramdisk(const char *label, ulong image_addr, int > image_size, > + struct udevice **devp) > +{ > + int ret; > + lbaint_t blknum; > + struct blkmap *bm; > + struct blk_desc *desc; > + struct udevice *bm_dev; > + > + ret = blkmap_create(label, &bm_dev); > + if (ret) { > + log_err("failed to create blkmap\n"); > + return ret; > + } > + > + bm = dev_get_plat(bm_dev); > + desc = dev_get_uclass_plat(bm->blk); > + blknum = image_size >> desc->log2blksz; > + ret = blkmap_map_pmem(bm_dev, 0, blknum, image_addr); > + if (ret) { > + log_err("Unable to map %#llx at block %d : %d\n", > + (unsigned long long)image_addr, 0, ret); > + goto err; > + } > + log_info("Block %d+0x" LBAF " mapped to %#llx\n", 0, blknum, > + (unsigned long long)image_addr); > + > + ret = device_probe(bm->blk); > + if (ret) > + goto err; > + > + if (devp) > + *devp = bm_dev; > + > + return 0; > + > +err: > + blkmap_destroy(bm_dev); > + > + return ret; > +} > diff --git a/include/blkmap.h b/include/blkmap.h > index af54583c7d..0d87e6db6b 100644 > --- a/include/blkmap.h > +++ b/include/blkmap.h > @@ -7,6 +7,23 @@ > #ifndef _BLKMAP_H > #define _BLKMAP_H > > +#include <dm/lists.h> > + > +/** > + * struct blkmap - Block map > + * > + * Data associated with a blkmap. > + * > + * @label: Human readable name of this blkmap > + * @blk: Underlying block device > + * @slices: List of slices associated with this blkmap > + */ > +struct blkmap { > + char *label; > + struct udevice *blk; > + struct list_head slices; > +}; > + > /** > * blkmap_map_linear() - Map region of other block device > * > @@ -74,4 +91,16 @@ int blkmap_create(const char *label, struct udevice > **devp); > */ > int blkmap_destroy(struct udevice *dev); > > +/** > + * blkmap_create_ramdisk() - Create new ramdisk with blkmap > + * > + * @label: Label of the new blkmap > + * @image_addr: Target memory start address of this mapping > + * @image_size: Target memory size of this mapping > + * @devp: Updated with the address of the created blkmap device > + * Returns: 0 on success, negative error code on failure > + */ > +int blkmap_create_ramdisk(const char *label, ulong image_addr, int > image_size, > + struct udevice **devp); > + > #endif /* _BLKMAP_H */ > -- > 2.34.1 >
Reviewed-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>