]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
f4d8de48 HN |
2 | /* |
3 | * Copyright (C) 2013 Henrik Nordstrom <henrik@henriknordstrom.net> | |
f4d8de48 HN |
4 | */ |
5 | ||
d678a59d | 6 | #include <common.h> |
40fd0508 SG |
7 | #include <blk.h> |
8 | #include <dm.h> | |
9 | #include <fdtdec.h> | |
f4d8de48 HN |
10 | #include <part.h> |
11 | #include <os.h> | |
12 | #include <malloc.h> | |
95201811 | 13 | #include <sandbox_host.h> |
401d1c4f | 14 | #include <asm/global_data.h> |
336d4615 | 15 | #include <dm/device_compat.h> |
40fd0508 | 16 | #include <dm/device-internal.h> |
95201811 | 17 | #include <linux/errno.h> |
f4d8de48 | 18 | |
40fd0508 SG |
19 | DECLARE_GLOBAL_DATA_PTR; |
20 | ||
40fd0508 SG |
21 | static unsigned long host_block_read(struct udevice *dev, |
22 | unsigned long start, lbaint_t blkcnt, | |
23 | void *buffer) | |
24 | { | |
95201811 SG |
25 | struct blk_desc *desc = dev_get_uclass_plat(dev); |
26 | struct udevice *host_dev = dev_get_parent(dev); | |
27 | struct host_sb_plat *plat = dev_get_plat(host_dev); | |
f4d8de48 | 28 | |
95201811 | 29 | if (os_lseek(plat->fd, start * desc->blksz, OS_SEEK_SET) == -1) { |
7ded959e | 30 | printf("ERROR: Invalid block %lx\n", start); |
f4d8de48 HN |
31 | return -1; |
32 | } | |
95201811 | 33 | ssize_t len = os_read(plat->fd, buffer, blkcnt * desc->blksz); |
f4d8de48 | 34 | if (len >= 0) |
95201811 SG |
35 | return len / desc->blksz; |
36 | ||
37 | return -EIO; | |
f4d8de48 HN |
38 | } |
39 | ||
40fd0508 SG |
40 | static unsigned long host_block_write(struct udevice *dev, |
41 | unsigned long start, lbaint_t blkcnt, | |
42 | const void *buffer) | |
43 | { | |
95201811 SG |
44 | struct blk_desc *desc = dev_get_uclass_plat(dev); |
45 | struct udevice *host_dev = dev_get_parent(dev); | |
46 | struct host_sb_plat *plat = dev_get_plat(host_dev); | |
7ded959e | 47 | |
95201811 | 48 | if (os_lseek(plat->fd, start * desc->blksz, OS_SEEK_SET) == -1) { |
7ded959e | 49 | printf("ERROR: Invalid block %lx\n", start); |
f4d8de48 HN |
50 | return -1; |
51 | } | |
95201811 | 52 | ssize_t len = os_write(plat->fd, buffer, blkcnt * desc->blksz); |
f4d8de48 | 53 | if (len >= 0) |
95201811 | 54 | return len / desc->blksz; |
297b8b3e | 55 | |
95201811 | 56 | return -EIO; |
297b8b3e HS |
57 | } |
58 | ||
40fd0508 SG |
59 | static const struct blk_ops sandbox_host_blk_ops = { |
60 | .read = host_block_read, | |
61 | .write = host_block_write, | |
62 | }; | |
63 | ||
64 | U_BOOT_DRIVER(sandbox_host_blk) = { | |
65 | .name = "sandbox_host_blk", | |
66 | .id = UCLASS_BLK, | |
67 | .ops = &sandbox_host_blk_ops, | |
40fd0508 | 68 | }; |