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
ramdisk_bread(struct udevice * dev,lbaint_t start,lbaint_t blkcnt,void * dst)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
ramdisk_bwrite(struct udevice * dev,lbaint_t start,lbaint_t blkcnt,const void * src)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
ramdisk_berase(struct udevice * dev,lbaint_t start,lbaint_t blkcnt)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
dm_ramdisk_is_enabled(void)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