Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
a9479f04 AM |
2 | /* |
3 | * (C) Copyright 2013 | |
4 | * Afzal Mohammed <afzal.mohd.ma@gmail.com> | |
5 | * | |
6 | * Reference: dfu_mmc.c | |
7 | * Copyright (C) 2012 Samsung Electronics | |
8 | * author: Lukasz Majewski <l.majewski@samsung.com> | |
a9479f04 AM |
9 | */ |
10 | ||
d678a59d | 11 | #include <common.h> |
a9479f04 | 12 | #include <malloc.h> |
73f4ebb6 | 13 | #include <mapmem.h> |
a9479f04 AM |
14 | #include <errno.h> |
15 | #include <dfu.h> | |
1e94b46f | 16 | #include <linux/printk.h> |
a9479f04 AM |
17 | |
18 | static int dfu_transfer_medium_ram(enum dfu_op op, struct dfu_entity *dfu, | |
19 | u64 offset, void *buf, long *len) | |
20 | { | |
21 | if (dfu->layout != DFU_RAM_ADDR) { | |
9b643e31 | 22 | pr_err("unsupported layout: %s\n", dfu_get_layout(dfu->layout)); |
a9479f04 AM |
23 | return -EINVAL; |
24 | } | |
25 | ||
26 | if (offset > dfu->data.ram.size) { | |
9b643e31 | 27 | pr_err("request exceeds allowed area\n"); |
a9479f04 AM |
28 | return -EINVAL; |
29 | } | |
30 | ||
31 | if (op == DFU_OP_WRITE) | |
73f4ebb6 | 32 | memcpy(map_sysmem(dfu->data.ram.start + offset, 0), buf, *len); |
a9479f04 | 33 | else |
73f4ebb6 | 34 | memcpy(buf, map_sysmem(dfu->data.ram.start + offset, 0), *len); |
a9479f04 AM |
35 | |
36 | return 0; | |
37 | } | |
38 | ||
39 | static int dfu_write_medium_ram(struct dfu_entity *dfu, u64 offset, | |
40 | void *buf, long *len) | |
41 | { | |
42 | return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len); | |
43 | } | |
44 | ||
15970d87 | 45 | int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size) |
0e285b50 | 46 | { |
4de51201 PD |
47 | *size = dfu->data.ram.size; |
48 | ||
49 | return 0; | |
0e285b50 SW |
50 | } |
51 | ||
a9479f04 AM |
52 | static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset, |
53 | void *buf, long *len) | |
54 | { | |
a9479f04 AM |
55 | return dfu_transfer_medium_ram(DFU_OP_READ, dfu, offset, buf, len); |
56 | } | |
57 | ||
53b40636 | 58 | int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char **argv, int argc) |
a9479f04 | 59 | { |
53b40636 MH |
60 | char *s; |
61 | ||
62 | if (argc != 3) { | |
63 | pr_err("Invalid number of arguments.\n"); | |
64 | return -EINVAL; | |
e1b0f6fe | 65 | } |
a9479f04 AM |
66 | |
67 | dfu->dev_type = DFU_DEV_RAM; | |
e1b0f6fe | 68 | if (strcmp(argv[0], "ram")) { |
9b643e31 | 69 | pr_err("unsupported device: %s\n", argv[0]); |
a9479f04 AM |
70 | return -ENODEV; |
71 | } | |
72 | ||
73 | dfu->layout = DFU_RAM_ADDR; | |
53b40636 MH |
74 | dfu->data.ram.start = hextoul(argv[1], &s); |
75 | if (*s) | |
76 | return -EINVAL; | |
77 | dfu->data.ram.size = hextoul(argv[2], &s); | |
78 | if (*s) | |
79 | return -EINVAL; | |
a9479f04 AM |
80 | |
81 | dfu->write_medium = dfu_write_medium_ram; | |
0e285b50 | 82 | dfu->get_medium_size = dfu_get_medium_size_ram; |
a9479f04 AM |
83 | dfu->read_medium = dfu_read_medium_ram; |
84 | ||
85 | dfu->inited = 0; | |
86 | ||
87 | return 0; | |
88 | } |