1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2018 Rockchip Electronics Co., Ltd 4 */ 5 6 #include <common.h> 7 #include <dm.h> 8 #include <dm/device-internal.h> 9 #include <dm/lists.h> 10 #include <dm/root.h> 11 #include <ramdisk.h> 12 13 DECLARE_GLOBAL_DATA_PTR; 14 15 static ulong ramdisk_ro_bread(struct blk_desc *desc, lbaint_t start, 16 lbaint_t blkcnt, void *dst) 17 { 18 unsigned long b_size, b_start; 19 20 /* Byte */ 21 b_start = start * desc->blksz; 22 b_size = blkcnt * desc->blksz; 23 24 if ((ulong)dst != (ulong)b_start) 25 memcpy((char *)dst, (char *)b_start, b_size); 26 else 27 debug("%s: skip memcpy at: 0x%08lx\n", __func__, (ulong)b_start); 28 29 debug("%s: b_start=0x%lx, b_size=0x%lx. dst=%p\n", 30 __func__, b_start, b_size, dst); 31 32 return blkcnt; 33 } 34 35 static int ramdisk_ro_bind(struct udevice *dev) 36 { 37 struct udevice *bdev; 38 int ret; 39 40 ret = blk_create_devicef(dev, "ramdisk_blk", "blk", 41 IF_TYPE_RAMDISK, 0, 512, 0, &bdev); 42 if (ret) { 43 debug("Can't create block device\n"); 44 return ret; 45 } 46 47 return 0; 48 } 49 50 static const struct ramdisk_ops ramdisk_ro_ops = { 51 .read = ramdisk_ro_bread, 52 }; 53 54 static const struct udevice_id ramdisk_ro_ids[] = { 55 { .compatible = "ramdisk-ro" }, 56 { } 57 }; 58 59 U_BOOT_DRIVER(ramdisk_ro) = { 60 .name = "ramdisk-ro", 61 .id = UCLASS_RAMDISK, 62 .ops = &ramdisk_ro_ops, 63 .of_match = ramdisk_ro_ids, 64 .bind = ramdisk_ro_bind, 65 }; 66 67 U_BOOT_DEVICE(ramdisk_ro) = { 68 .name = "ramdisk-ro", 69 }; 70