1*0476014eSJoseph Chen // SPDX-License-Identifier: GPL-2.0+ 2*0476014eSJoseph Chen /* 3*0476014eSJoseph Chen * (C) Copyright 2018 Rockchip Electronics Co., Ltd 4*0476014eSJoseph Chen */ 5*0476014eSJoseph Chen 6*0476014eSJoseph Chen #include <common.h> 7*0476014eSJoseph Chen #include <dm.h> 8*0476014eSJoseph Chen #include <dm/device-internal.h> 9*0476014eSJoseph Chen #include <dm/lists.h> 10*0476014eSJoseph Chen #include <dm/root.h> 11*0476014eSJoseph Chen #include <ramdisk.h> 12*0476014eSJoseph Chen 13*0476014eSJoseph Chen DECLARE_GLOBAL_DATA_PTR; 14*0476014eSJoseph Chen 15*0476014eSJoseph Chen static ulong ramdisk_ro_bread(struct blk_desc *desc, lbaint_t start, 16*0476014eSJoseph Chen lbaint_t blkcnt, void *dst) 17*0476014eSJoseph Chen { 18*0476014eSJoseph Chen unsigned long b_size, b_start; 19*0476014eSJoseph Chen 20*0476014eSJoseph Chen /* Byte */ 21*0476014eSJoseph Chen b_start = start * desc->blksz; 22*0476014eSJoseph Chen b_size = blkcnt * desc->blksz; 23*0476014eSJoseph Chen memcpy((char *)dst, (char *)b_start, b_size); 24*0476014eSJoseph Chen 25*0476014eSJoseph Chen debug("%s: b_start=0x%lx, b_size=0x%lx. dst=%p\n", 26*0476014eSJoseph Chen __func__, b_start, b_size, dst); 27*0476014eSJoseph Chen 28*0476014eSJoseph Chen return blkcnt; 29*0476014eSJoseph Chen } 30*0476014eSJoseph Chen 31*0476014eSJoseph Chen static int ramdisk_ro_bind(struct udevice *dev) 32*0476014eSJoseph Chen { 33*0476014eSJoseph Chen struct udevice *bdev; 34*0476014eSJoseph Chen int ret; 35*0476014eSJoseph Chen 36*0476014eSJoseph Chen ret = blk_create_devicef(dev, "ramdisk_blk", "blk", 37*0476014eSJoseph Chen IF_TYPE_RAMDISK, 0, 512, 0, &bdev); 38*0476014eSJoseph Chen if (ret) { 39*0476014eSJoseph Chen debug("Can't create block device\n"); 40*0476014eSJoseph Chen return ret; 41*0476014eSJoseph Chen } 42*0476014eSJoseph Chen 43*0476014eSJoseph Chen return 0; 44*0476014eSJoseph Chen } 45*0476014eSJoseph Chen 46*0476014eSJoseph Chen static const struct ramdisk_ops ramdisk_ro_ops = { 47*0476014eSJoseph Chen .read = ramdisk_ro_bread, 48*0476014eSJoseph Chen }; 49*0476014eSJoseph Chen 50*0476014eSJoseph Chen static const struct udevice_id ramdisk_ro_ids[] = { 51*0476014eSJoseph Chen { .compatible = "ramdisk-ro" }, 52*0476014eSJoseph Chen { } 53*0476014eSJoseph Chen }; 54*0476014eSJoseph Chen 55*0476014eSJoseph Chen U_BOOT_DRIVER(ramdisk_ro) = { 56*0476014eSJoseph Chen .name = "ramdisk-ro", 57*0476014eSJoseph Chen .id = UCLASS_RAMDISK, 58*0476014eSJoseph Chen .ops = &ramdisk_ro_ops, 59*0476014eSJoseph Chen .of_match = ramdisk_ro_ids, 60*0476014eSJoseph Chen .bind = ramdisk_ro_bind, 61*0476014eSJoseph Chen }; 62