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 <ramdisk.h> 9 #include <dm/device-internal.h> 10 #include <dm/lists.h> 11 #include <dm/root.h> 12 #include <asm/arch/rk_atags.h> 13 14 DECLARE_GLOBAL_DATA_PTR; 15 16 static ulong ramdisk_bread(struct udevice *dev, lbaint_t start, 17 lbaint_t blkcnt, void *dst) 18 { 19 const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent); 20 struct blk_desc *desc = dev_get_uclass_platdata(dev); 21 22 if (!blkcnt) 23 return 0; 24 25 if (!ops->read) 26 return -ENOSYS; 27 28 return ops->read(desc, start, blkcnt, dst); 29 } 30 31 static ulong ramdisk_bwrite(struct udevice *dev, lbaint_t start, 32 lbaint_t blkcnt, const void *src) 33 { 34 const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent); 35 struct blk_desc *desc = dev_get_uclass_platdata(dev); 36 37 if (!blkcnt) 38 return 0; 39 40 if (!ops->write) 41 return -ENOSYS; 42 43 return ops->write(desc, start, blkcnt, src); 44 } 45 46 static ulong ramdisk_berase(struct udevice *dev, 47 lbaint_t start, lbaint_t blkcnt) 48 { 49 const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent); 50 struct blk_desc *desc = dev_get_uclass_platdata(dev); 51 52 if (!blkcnt) 53 return 0; 54 55 if (!ops->erase) 56 return -ENOSYS; 57 58 return ops->erase(desc, start, blkcnt); 59 } 60 61 int dm_ramdisk_is_enabled(void) 62 { 63 return (atags_is_available() && atags_get_tag(ATAG_RAM_PARTITION)); 64 } 65 66 static const struct blk_ops ramdisk_blk_ops = { 67 .read = ramdisk_bread, 68 #ifndef CONFIG_SPL_BUILD 69 .write = ramdisk_bwrite, 70 .erase = ramdisk_berase, 71 #endif 72 }; 73 74 U_BOOT_DRIVER(ramdisk_blk) = { 75 .name = "ramdisk_blk", 76 .id = UCLASS_BLK, 77 .ops = &ramdisk_blk_ops, 78 }; 79 80 UCLASS_DRIVER(ramdisk) = { 81 .id = UCLASS_RAMDISK, 82 .name = "ramdisk", 83 .flags = DM_UC_FLAG_SEQ_ALIAS, 84 }; 85