blob: c4f4bd2e482f0cf2734c9ec3d3df1699b3df24d8 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Afzal Mohammede3c687a2013-09-18 01:15:24 +05302/*
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>
Afzal Mohammede3c687a2013-09-18 01:15:24 +05309 */
10
11#include <common.h>
12#include <malloc.h>
Heinrich Schuchardt8784b0b2020-07-22 17:46:02 +020013#include <mapmem.h>
Afzal Mohammede3c687a2013-09-18 01:15:24 +053014#include <errno.h>
15#include <dfu.h>
Simon Glassbdd5f812023-09-14 18:21:46 -060016#include <linux/printk.h>
Afzal Mohammede3c687a2013-09-18 01:15:24 +053017
18static 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) {
Masahiro Yamada81e10422017-09-16 14:10:41 +090022 pr_err("unsupported layout: %s\n", dfu_get_layout(dfu->layout));
Afzal Mohammede3c687a2013-09-18 01:15:24 +053023 return -EINVAL;
24 }
25
26 if (offset > dfu->data.ram.size) {
Masahiro Yamada81e10422017-09-16 14:10:41 +090027 pr_err("request exceeds allowed area\n");
Afzal Mohammede3c687a2013-09-18 01:15:24 +053028 return -EINVAL;
29 }
30
31 if (op == DFU_OP_WRITE)
Heinrich Schuchardt8784b0b2020-07-22 17:46:02 +020032 memcpy(map_sysmem(dfu->data.ram.start + offset, 0), buf, *len);
Afzal Mohammede3c687a2013-09-18 01:15:24 +053033 else
Heinrich Schuchardt8784b0b2020-07-22 17:46:02 +020034 memcpy(buf, map_sysmem(dfu->data.ram.start + offset, 0), *len);
Afzal Mohammede3c687a2013-09-18 01:15:24 +053035
36 return 0;
37}
38
39static 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
Patrick Delaunayf4e934f2017-07-19 16:39:23 +020045int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
Stephen Warren020e6f32014-06-11 12:47:27 -060046{
Patrick Delaunay5ea9b892017-07-19 16:39:22 +020047 *size = dfu->data.ram.size;
48
49 return 0;
Stephen Warren020e6f32014-06-11 12:47:27 -060050}
51
Afzal Mohammede3c687a2013-09-18 01:15:24 +053052static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
53 void *buf, long *len)
54{
Afzal Mohammede3c687a2013-09-18 01:15:24 +053055 return dfu_transfer_medium_ram(DFU_OP_READ, dfu, offset, buf, len);
56}
57
Masami Hiramatsufa4282a2022-01-31 11:52:37 +090058int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char **argv, int argc)
Afzal Mohammede3c687a2013-09-18 01:15:24 +053059{
Masami Hiramatsufa4282a2022-01-31 11:52:37 +090060 char *s;
Mugunthan V N4fb47432016-04-22 14:19:25 +053061
Masami Hiramatsufa4282a2022-01-31 11:52:37 +090062 if (argc != 3) {
63 pr_err("Invalid number of arguments.\n");
64 return -EINVAL;
Mugunthan V N4fb47432016-04-22 14:19:25 +053065 }
Afzal Mohammede3c687a2013-09-18 01:15:24 +053066
67 dfu->dev_type = DFU_DEV_RAM;
Mugunthan V N4fb47432016-04-22 14:19:25 +053068 if (strcmp(argv[0], "ram")) {
Masahiro Yamada81e10422017-09-16 14:10:41 +090069 pr_err("unsupported device: %s\n", argv[0]);
Afzal Mohammede3c687a2013-09-18 01:15:24 +053070 return -ENODEV;
71 }
72
73 dfu->layout = DFU_RAM_ADDR;
Masami Hiramatsufa4282a2022-01-31 11:52:37 +090074 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;
Afzal Mohammede3c687a2013-09-18 01:15:24 +053080
81 dfu->write_medium = dfu_write_medium_ram;
Stephen Warren020e6f32014-06-11 12:47:27 -060082 dfu->get_medium_size = dfu_get_medium_size_ram;
Afzal Mohammede3c687a2013-09-18 01:15:24 +053083 dfu->read_medium = dfu_read_medium_ram;
84
85 dfu->inited = 0;
86
87 return 0;
88}