blk: blkmap: add ramdisk creation utility function

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.kojima@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
Masahisa Kojima 2023-11-10 13:25:36 +09:00 committed by Ilias Apalodimas
parent 8cf18da1a9
commit d822255d65
4 changed files with 84 additions and 16 deletions

View File

@ -15,7 +15,8 @@ obj-$(CONFIG_RKMTD) += rkmtd.o
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_$(SPL_TPL_)BLKMAP) += blkmap.o
obj-$(CONFIG_$(SPL_TPL_)BLKMAP) += blkmap_helper.o
obj-$(CONFIG_EFI_MEDIA) += efi-media-uclass.o
obj-$(CONFIG_EFI_MEDIA_SANDBOX) += sb_efi_media.o

View File

@ -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));

View File

@ -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, ulong 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;
}

View File

@ -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, ulong image_size,
struct udevice **devp);
#endif /* _BLKMAP_H */