/src/u-boot/drivers/block/blkmap_helper.c
Line | Count | Source |
1 | | // SPDX-License-Identifier: GPL-2.0+ |
2 | | /* |
3 | | * blkmap helper function |
4 | | * |
5 | | * Copyright (c) 2023, Linaro Limited |
6 | | */ |
7 | | |
8 | | #include <blk.h> |
9 | | #include <blkmap.h> |
10 | | #include <dm/device.h> |
11 | | #include <dm/device-internal.h> |
12 | | |
13 | | int blkmap_create_ramdisk(const char *label, ulong image_addr, ulong image_size, |
14 | | struct udevice **devp) |
15 | 0 | { |
16 | 0 | int ret; |
17 | 0 | lbaint_t blknum; |
18 | 0 | struct blkmap *bm; |
19 | 0 | struct blk_desc *desc; |
20 | 0 | struct udevice *bm_dev; |
21 | |
|
22 | 0 | ret = blkmap_create(label, &bm_dev); |
23 | 0 | if (ret) { |
24 | 0 | log_err("failed to create blkmap\n"); |
25 | 0 | return ret; |
26 | 0 | } |
27 | | |
28 | 0 | bm = dev_get_plat(bm_dev); |
29 | 0 | desc = dev_get_uclass_plat(bm->blk); |
30 | 0 | blknum = image_size >> desc->log2blksz; |
31 | 0 | ret = blkmap_map_pmem(bm_dev, 0, blknum, image_addr, true); |
32 | 0 | if (ret) { |
33 | 0 | log_err("Unable to map %#llx at block %d : %d\n", |
34 | 0 | (unsigned long long)image_addr, 0, ret); |
35 | 0 | goto err; |
36 | 0 | } |
37 | 0 | log_info("Block %d+0x" LBAF " mapped to %#llx\n", 0, blknum, |
38 | 0 | (unsigned long long)image_addr); |
39 | |
|
40 | 0 | ret = device_probe(bm->blk); |
41 | 0 | if (ret) |
42 | 0 | goto err; |
43 | | |
44 | 0 | if (devp) |
45 | 0 | *devp = bm_dev; |
46 | |
|
47 | 0 | return 0; |
48 | | |
49 | 0 | err: |
50 | 0 | blkmap_destroy(bm_dev); |
51 | |
|
52 | 0 | return ret; |
53 | 0 | } |