]> git.ipfire.org Git - thirdparty/u-boot.git/blame - include/dfu.h
iopoll: Add dealy to read poll
[thirdparty/u-boot.git] / include / dfu.h
CommitLineData
83d290c5 1/* SPDX-License-Identifier: GPL-2.0+ */
f22b11c1
ŁM
2/*
3 * dfu.h - DFU flashable area description
4 *
5 * Copyright (C) 2012 Samsung Electronics
6 * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
7 * Lukasz Majewski <l.majewski@samsung.com>
f22b11c1
ŁM
8 */
9
10#ifndef __DFU_ENTITY_H_
11#define __DFU_ENTITY_H_
12
13#include <common.h>
14#include <linux/list.h>
15#include <mmc.h>
6f12ebf6 16#include <spi_flash.h>
a6921adc 17#include <linux/usb/composite.h>
f22b11c1
ŁM
18
19enum dfu_device_type {
20 DFU_DEV_MMC = 1,
21 DFU_DEV_ONENAND,
22 DFU_DEV_NAND,
a9479f04 23 DFU_DEV_RAM,
6f12ebf6 24 DFU_DEV_SF,
6015af28 25 DFU_DEV_MTD,
ec44cace 26 DFU_DEV_VIRT,
f22b11c1
ŁM
27};
28
29enum dfu_layout {
30 DFU_RAW_ADDR = 1,
31 DFU_FS_FAT,
32 DFU_FS_EXT2,
33 DFU_FS_EXT3,
34 DFU_FS_EXT4,
a9479f04 35 DFU_RAM_ADDR,
f22b11c1
ŁM
36};
37
5a127c84
AM
38enum dfu_op {
39 DFU_OP_READ = 1,
40 DFU_OP_WRITE,
0e285b50 41 DFU_OP_SIZE,
5a127c84
AM
42};
43
f22b11c1 44struct mmc_internal_data {
dd64827e
SW
45 int dev_num;
46
f22b11c1
ŁM
47 /* RAW programming */
48 unsigned int lba_start;
49 unsigned int lba_size;
50 unsigned int lba_blk_size;
51
c8151b4a
ŁM
52 /* eMMC HW partition access */
53 int hw_partition;
54
f22b11c1
ŁM
55 /* FAT/EXT */
56 unsigned int dev;
57 unsigned int part;
58};
59
6015af28
PD
60struct mtd_internal_data {
61 struct mtd_info *info;
62
63 /* RAW programming */
64 u64 start;
65 u64 size;
d5640f70
PD
66 /* for ubi partition */
67 unsigned int ubi;
6015af28
PD
68};
69
c6631764
PA
70struct nand_internal_data {
71 /* RAW programming */
72 u64 start;
73 u64 size;
74
75 unsigned int dev;
76 unsigned int part;
815c30b2
HS
77 /* for nand/ubi use */
78 unsigned int ubi;
c6631764
PA
79};
80
a9479f04
AM
81struct ram_internal_data {
82 void *start;
83 unsigned int size;
84};
85
6f12ebf6
SW
86struct sf_internal_data {
87 struct spi_flash *dev;
88
89 /* RAW programming */
90 u64 start;
91 u64 size;
cb986ba0
PD
92 /* for sf/ubi use */
93 unsigned int ubi;
6f12ebf6
SW
94};
95
ec44cace
PD
96struct virt_internal_data {
97 int dev_num;
98};
99
a24c3155 100#define DFU_NAME_SIZE 32
e7e75c70
HS
101#ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
102#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
103#endif
ea2453d5 104#ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE
7a813d5b 105#define CONFIG_SYS_DFU_MAX_FILE_SIZE CONFIG_SYS_DFU_DATA_BUF_SIZE
ea2453d5 106#endif
33fac4a6
ŁM
107#ifndef DFU_DEFAULT_POLL_TIMEOUT
108#define DFU_DEFAULT_POLL_TIMEOUT 0
109#endif
001a8319
HS
110#ifndef DFU_MANIFEST_POLL_TIMEOUT
111#define DFU_MANIFEST_POLL_TIMEOUT DFU_DEFAULT_POLL_TIMEOUT
112#endif
f22b11c1
ŁM
113
114struct dfu_entity {
115 char name[DFU_NAME_SIZE];
116 int alt;
117 void *dev_private;
f22b11c1
ŁM
118 enum dfu_device_type dev_type;
119 enum dfu_layout layout;
7ac1b410 120 unsigned long max_buf_size;
f22b11c1
ŁM
121
122 union {
123 struct mmc_internal_data mmc;
6015af28 124 struct mtd_internal_data mtd;
c6631764 125 struct nand_internal_data nand;
a9479f04 126 struct ram_internal_data ram;
6f12ebf6 127 struct sf_internal_data sf;
ec44cace 128 struct virt_internal_data virt;
f22b11c1
ŁM
129 } data;
130
15970d87 131 int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
0e285b50 132
ea2453d5
PA
133 int (*read_medium)(struct dfu_entity *dfu,
134 u64 offset, void *buf, long *len);
135
136 int (*write_medium)(struct dfu_entity *dfu,
137 u64 offset, void *buf, long *len);
138
139 int (*flush_medium)(struct dfu_entity *dfu);
fc25fa27 140 unsigned int (*poll_timeout)(struct dfu_entity *dfu);
f22b11c1 141
cb7bd2e0
SW
142 void (*free_entity)(struct dfu_entity *dfu);
143
f22b11c1 144 struct list_head list;
ea2453d5
PA
145
146 /* on the fly state */
147 u32 crc;
148 u64 offset;
149 int i_blk_seq_num;
150 u8 *i_buf;
151 u8 *i_buf_start;
152 u8 *i_buf_end;
15970d87 153 u64 r_left;
ea2453d5
PA
154 long b_left;
155
c6631764
PA
156 u32 bad_skip; /* for nand use */
157
ea2453d5 158 unsigned int inited:1;
f22b11c1
ŁM
159};
160
899a5282
PM
161#ifdef CONFIG_SET_DFU_ALT_INFO
162void set_dfu_alt_info(char *interface, char *devstr);
163#endif
9ada6830
PD
164int dfu_alt_init(int num, struct dfu_entity **dfu);
165int dfu_alt_add(struct dfu_entity *dfu, char *interface, char *devstr, char *s);
dd64827e 166int dfu_config_entities(char *s, char *interface, char *devstr);
f22b11c1
ŁM
167void dfu_free_entities(void);
168void dfu_show_entities(void);
169int dfu_get_alt_number(void);
170const char *dfu_get_dev_type(enum dfu_device_type t);
171const char *dfu_get_layout(enum dfu_layout l);
172struct dfu_entity *dfu_get_entity(int alt);
173char *dfu_extract_token(char** e, int *n);
fed936ed 174int dfu_get_alt(char *name);
dd64827e 175int dfu_init_env_entities(char *interface, char *devstr);
7ac1b410 176unsigned char *dfu_get_buf(struct dfu_entity *dfu);
d4278263 177unsigned char *dfu_free_buf(void);
4fb12789 178unsigned long dfu_get_buf_size(void);
1cc03c5c 179bool dfu_usb_get_reset(void);
f22b11c1 180
98a8f445
AS
181#ifdef CONFIG_DFU_TIMEOUT
182unsigned long dfu_get_timeout(void);
183void dfu_set_timeout(unsigned long);
184#endif
185
f22b11c1
ŁM
186int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
187int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
a2199afe 188int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
2092e461 189
067c13c7
PD
190/**
191 * dfu_initiated_callback - weak callback called on DFU transaction start
192 *
193 * It is a callback function called by DFU stack when a DFU transaction is
194 * initiated. This function allows to manage some board specific behavior on
195 * DFU targets.
196 *
197 * @param dfu - pointer to the dfu_entity, which should be initialized
198 *
199 */
200void dfu_initiated_callback(struct dfu_entity *dfu);
201/**
202 * dfu_flush_callback - weak callback called at the end of the DFU write
203 *
204 * It is a callback function called by DFU stack after DFU manifestation.
205 * This function allows to manage some board specific behavior on DFU targets
206 *
207 * @param dfu - pointer to the dfu_entity, which should be flushed
208 *
209 */
210void dfu_flush_callback(struct dfu_entity *dfu);
211
fc18f8d1
ŁM
212/*
213 * dfu_defer_flush - pointer to store dfu_entity for deferred flashing.
214 * It should be NULL when not used.
215 */
216extern struct dfu_entity *dfu_defer_flush;
217/**
218 * dfu_get_defer_flush - get current value of dfu_defer_flush pointer
219 *
220 * @return - value of the dfu_defer_flush pointer
221 */
222static inline struct dfu_entity *dfu_get_defer_flush(void)
223{
224 return dfu_defer_flush;
225}
226
227/**
228 * dfu_set_defer_flush - set the dfu_defer_flush pointer
229 *
230 * @param dfu - pointer to the dfu_entity, which should be written
231 */
232static inline void dfu_set_defer_flush(struct dfu_entity *dfu)
233{
234 dfu_defer_flush = dfu;
235}
236
2092e461
LM
237/**
238 * dfu_write_from_mem_addr - write data from memory to DFU managed medium
239 *
240 * This function adds support for writing data starting from fixed memory
241 * address (like $loadaddr) to dfu managed medium (e.g. NAND, MMC, file system)
242 *
243 * @param dfu - dfu entity to which we want to store data
244 * @param buf - fixed memory addres from where data starts
245 * @param size - number of bytes to write
246 *
247 * @return - 0 on success, other value on failure
248 */
249int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size);
250
f22b11c1 251/* Device specific */
2d59ec84 252#if CONFIG_IS_ENABLED(DFU_MMC)
dd64827e 253extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s);
f22b11c1 254#else
dd64827e
SW
255static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr,
256 char *s)
f22b11c1
ŁM
257{
258 puts("MMC support not available!\n");
259 return -1;
260}
261#endif
c6631764 262
2d59ec84 263#if CONFIG_IS_ENABLED(DFU_NAND)
dd64827e 264extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s);
c6631764 265#else
dd64827e
SW
266static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr,
267 char *s)
c6631764
PA
268{
269 puts("NAND support not available!\n");
270 return -1;
271}
272#endif
273
2d59ec84 274#if CONFIG_IS_ENABLED(DFU_RAM)
dd64827e 275extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s);
a9479f04 276#else
dd64827e
SW
277static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr,
278 char *s)
a9479f04
AM
279{
280 puts("RAM support not available!\n");
281 return -1;
282}
283#endif
284
2d59ec84 285#if CONFIG_IS_ENABLED(DFU_SF)
6f12ebf6
SW
286extern int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s);
287#else
288static inline int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr,
289 char *s)
290{
291 puts("SF support not available!\n");
292 return -1;
293}
294#endif
295
6015af28
PD
296#if CONFIG_IS_ENABLED(DFU_MTD)
297int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char *s);
298#else
299static inline int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr,
300 char *s)
301{
302 puts("MTD support not available!\n");
303 return -1;
304}
305#endif
306
ec44cace
PD
307#ifdef CONFIG_DFU_VIRT
308int dfu_fill_entity_virt(struct dfu_entity *dfu, char *devstr, char *s);
309int dfu_write_medium_virt(struct dfu_entity *dfu, u64 offset,
310 void *buf, long *len);
311int dfu_get_medium_size_virt(struct dfu_entity *dfu, u64 *size);
312int dfu_read_medium_virt(struct dfu_entity *dfu, u64 offset,
313 void *buf, long *len);
314#else
315static inline int dfu_fill_entity_virt(struct dfu_entity *dfu, char *devstr,
316 char *s)
317{
318 puts("VIRT support not available!\n");
319 return -1;
320}
321#endif
322
2d50d68a
LM
323/**
324 * dfu_tftp_write - Write TFTP data to DFU medium
325 *
326 * This function is storing data received via TFTP on DFU supported medium.
327 *
328 * @param dfu_entity_name - name of DFU entity to write
329 * @param addr - address of data buffer to write
330 * @param len - number of bytes
331 * @param interface - destination DFU medium (e.g. "mmc")
332 * @param devstring - instance number of destination DFU medium (e.g. "1")
333 *
334 * @return 0 on success, otherwise error code
335 */
2d59ec84 336#if CONFIG_IS_ENABLED(DFU_TFTP)
2d50d68a
LM
337int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len,
338 char *interface, char *devstring);
339#else
340static inline int dfu_tftp_write(char *dfu_entity_name, unsigned int addr,
341 unsigned int len, char *interface,
342 char *devstring)
343{
344 puts("TFTP write support for DFU not available!\n");
345 return -ENOSYS;
346}
347#endif
348
a6921adc 349int dfu_add(struct usb_configuration *c);
f22b11c1 350#endif /* __DFU_ENTITY_H_ */