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 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 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