xref: /rk3399_rockchip-uboot/drivers/ram/ramdisk_ro.c (revision e9e0746f312479862275123a4eba3284d05cf37b)
10476014eSJoseph Chen // SPDX-License-Identifier:     GPL-2.0+
20476014eSJoseph Chen /*
30476014eSJoseph Chen  * (C) Copyright 2018 Rockchip Electronics Co., Ltd
40476014eSJoseph Chen  */
50476014eSJoseph Chen 
60476014eSJoseph Chen #include <common.h>
70476014eSJoseph Chen #include <dm.h>
80476014eSJoseph Chen #include <dm/device-internal.h>
90476014eSJoseph Chen #include <dm/lists.h>
100476014eSJoseph Chen #include <dm/root.h>
110476014eSJoseph Chen #include <ramdisk.h>
120476014eSJoseph Chen 
130476014eSJoseph Chen DECLARE_GLOBAL_DATA_PTR;
140476014eSJoseph Chen 
ramdisk_ro_bread(struct blk_desc * desc,lbaint_t start,lbaint_t blkcnt,void * dst)150476014eSJoseph Chen static ulong ramdisk_ro_bread(struct blk_desc *desc, lbaint_t start,
160476014eSJoseph Chen 			      lbaint_t blkcnt, void *dst)
170476014eSJoseph Chen {
180476014eSJoseph Chen 	unsigned long b_size, b_start;
190476014eSJoseph Chen 
200476014eSJoseph Chen 	/* Byte */
210476014eSJoseph Chen 	b_start = start * desc->blksz;
220476014eSJoseph Chen 	b_size = blkcnt * desc->blksz;
23b5d11322SJoseph Chen 
24b5d11322SJoseph Chen 	if ((ulong)dst != (ulong)b_start)
250476014eSJoseph Chen 		memcpy((char *)dst, (char *)b_start, b_size);
26b5d11322SJoseph Chen 	else
27b5d11322SJoseph Chen 		debug("%s: skip memcpy at: 0x%08lx\n", __func__, (ulong)b_start);
280476014eSJoseph Chen 
290476014eSJoseph Chen 	debug("%s: b_start=0x%lx, b_size=0x%lx. dst=%p\n",
300476014eSJoseph Chen 	      __func__, b_start, b_size, dst);
310476014eSJoseph Chen 
320476014eSJoseph Chen 	return blkcnt;
330476014eSJoseph Chen }
340476014eSJoseph Chen 
ramdisk_ro_bind(struct udevice * dev)350476014eSJoseph Chen static int ramdisk_ro_bind(struct udevice *dev)
360476014eSJoseph Chen {
370476014eSJoseph Chen 	struct udevice *bdev;
380476014eSJoseph Chen 	int ret;
390476014eSJoseph Chen 
400476014eSJoseph Chen 	ret = blk_create_devicef(dev, "ramdisk_blk", "blk",
410476014eSJoseph Chen 				 IF_TYPE_RAMDISK, 0, 512, 0, &bdev);
420476014eSJoseph Chen 	if (ret) {
430476014eSJoseph Chen 		debug("Can't create block device\n");
440476014eSJoseph Chen 		return ret;
450476014eSJoseph Chen 	}
460476014eSJoseph Chen 
470476014eSJoseph Chen 	return 0;
480476014eSJoseph Chen }
490476014eSJoseph Chen 
500476014eSJoseph Chen static const struct ramdisk_ops ramdisk_ro_ops = {
510476014eSJoseph Chen 	.read = ramdisk_ro_bread,
520476014eSJoseph Chen };
530476014eSJoseph Chen 
540476014eSJoseph Chen static const struct udevice_id ramdisk_ro_ids[] = {
550476014eSJoseph Chen 	{ .compatible = "ramdisk-ro" },
560476014eSJoseph Chen 	{ }
570476014eSJoseph Chen };
580476014eSJoseph Chen 
590476014eSJoseph Chen U_BOOT_DRIVER(ramdisk_ro) = {
600476014eSJoseph Chen 	.name		= "ramdisk-ro",
610476014eSJoseph Chen 	.id		= UCLASS_RAMDISK,
620476014eSJoseph Chen 	.ops		= &ramdisk_ro_ops,
630476014eSJoseph Chen 	.of_match	= ramdisk_ro_ids,
640476014eSJoseph Chen 	.bind		= ramdisk_ro_bind,
650476014eSJoseph Chen };
66*5d458522SJoseph Chen 
67*5d458522SJoseph Chen U_BOOT_DEVICE(ramdisk_ro) = {
68*5d458522SJoseph Chen 	.name		= "ramdisk-ro",
69*5d458522SJoseph Chen };
70