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