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 memcpy((char *)dst, (char *)b_start, b_size); 24 25 debug("%s: b_start=0x%lx, b_size=0x%lx. dst=%p\n", 26 __func__, b_start, b_size, dst); 27 28 return blkcnt; 29 } 30 31 static int ramdisk_ro_bind(struct udevice *dev) 32 { 33 struct udevice *bdev; 34 int ret; 35 36 ret = blk_create_devicef(dev, "ramdisk_blk", "blk", 37 IF_TYPE_RAMDISK, 0, 512, 0, &bdev); 38 if (ret) { 39 debug("Can't create block device\n"); 40 return ret; 41 } 42 43 return 0; 44 } 45 46 static const struct ramdisk_ops ramdisk_ro_ops = { 47 .read = ramdisk_ro_bread, 48 }; 49 50 static const struct udevice_id ramdisk_ro_ids[] = { 51 { .compatible = "ramdisk-ro" }, 52 { } 53 }; 54 55 U_BOOT_DRIVER(ramdisk_ro) = { 56 .name = "ramdisk-ro", 57 .id = UCLASS_RAMDISK, 58 .ops = &ramdisk_ro_ops, 59 .of_match = ramdisk_ro_ids, 60 .bind = ramdisk_ro_bind, 61 }; 62