Home | History | Annotate | Download | only in include
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * dfu.h - DFU flashable area description
      4  *
      5  * Copyright (C) 2012 Samsung Electronics
      6  * authors: Andrzej Pietrasiewicz <andrzej.p (at) samsung.com>
      7  *	    Lukasz Majewski <l.majewski (at) samsung.com>
      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>
     16 #include <spi_flash.h>
     17 #include <linux/usb/composite.h>
     18 
     19 enum dfu_device_type {
     20 	DFU_DEV_MMC = 1,
     21 	DFU_DEV_ONENAND,
     22 	DFU_DEV_NAND,
     23 	DFU_DEV_RAM,
     24 	DFU_DEV_SF,
     25 };
     26 
     27 enum dfu_layout {
     28 	DFU_RAW_ADDR = 1,
     29 	DFU_FS_FAT,
     30 	DFU_FS_EXT2,
     31 	DFU_FS_EXT3,
     32 	DFU_FS_EXT4,
     33 	DFU_RAM_ADDR,
     34 };
     35 
     36 enum dfu_op {
     37 	DFU_OP_READ = 1,
     38 	DFU_OP_WRITE,
     39 	DFU_OP_SIZE,
     40 };
     41 
     42 struct mmc_internal_data {
     43 	int dev_num;
     44 
     45 	/* RAW programming */
     46 	unsigned int lba_start;
     47 	unsigned int lba_size;
     48 	unsigned int lba_blk_size;
     49 
     50 	/* eMMC HW partition access */
     51 	int hw_partition;
     52 
     53 	/* FAT/EXT */
     54 	unsigned int dev;
     55 	unsigned int part;
     56 };
     57 
     58 struct nand_internal_data {
     59 	/* RAW programming */
     60 	u64 start;
     61 	u64 size;
     62 
     63 	unsigned int dev;
     64 	unsigned int part;
     65 	/* for nand/ubi use */
     66 	unsigned int ubi;
     67 };
     68 
     69 struct ram_internal_data {
     70 	void		*start;
     71 	unsigned int	size;
     72 };
     73 
     74 struct sf_internal_data {
     75 	struct spi_flash *dev;
     76 
     77 	/* RAW programming */
     78 	u64 start;
     79 	u64 size;
     80 };
     81 
     82 #define DFU_NAME_SIZE			32
     83 #define DFU_CMD_BUF_SIZE		128
     84 #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
     85 #define CONFIG_SYS_DFU_DATA_BUF_SIZE		(1024*1024*8)	/* 8 MiB */
     86 #endif
     87 #ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE
     88 #define CONFIG_SYS_DFU_MAX_FILE_SIZE CONFIG_SYS_DFU_DATA_BUF_SIZE
     89 #endif
     90 #ifndef DFU_DEFAULT_POLL_TIMEOUT
     91 #define DFU_DEFAULT_POLL_TIMEOUT 0
     92 #endif
     93 #ifndef DFU_MANIFEST_POLL_TIMEOUT
     94 #define DFU_MANIFEST_POLL_TIMEOUT	DFU_DEFAULT_POLL_TIMEOUT
     95 #endif
     96 
     97 struct dfu_entity {
     98 	char			name[DFU_NAME_SIZE];
     99 	int                     alt;
    100 	void                    *dev_private;
    101 	enum dfu_device_type    dev_type;
    102 	enum dfu_layout         layout;
    103 	unsigned long           max_buf_size;
    104 
    105 	union {
    106 		struct mmc_internal_data mmc;
    107 		struct nand_internal_data nand;
    108 		struct ram_internal_data ram;
    109 		struct sf_internal_data sf;
    110 	} data;
    111 
    112 	int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
    113 
    114 	int (*read_medium)(struct dfu_entity *dfu,
    115 			u64 offset, void *buf, long *len);
    116 
    117 	int (*write_medium)(struct dfu_entity *dfu,
    118 			u64 offset, void *buf, long *len);
    119 
    120 	int (*flush_medium)(struct dfu_entity *dfu);
    121 	unsigned int (*poll_timeout)(struct dfu_entity *dfu);
    122 
    123 	void (*free_entity)(struct dfu_entity *dfu);
    124 
    125 	struct list_head list;
    126 
    127 	/* on the fly state */
    128 	u32 crc;
    129 	u64 offset;
    130 	int i_blk_seq_num;
    131 	u8 *i_buf;
    132 	u8 *i_buf_start;
    133 	u8 *i_buf_end;
    134 	u64 r_left;
    135 	long b_left;
    136 
    137 	u32 bad_skip;	/* for nand use */
    138 
    139 	unsigned int inited:1;
    140 };
    141 
    142 #ifdef CONFIG_SET_DFU_ALT_INFO
    143 void set_dfu_alt_info(char *interface, char *devstr);
    144 #endif
    145 int dfu_config_entities(char *s, char *interface, char *devstr);
    146 void dfu_free_entities(void);
    147 void dfu_show_entities(void);
    148 int dfu_get_alt_number(void);
    149 const char *dfu_get_dev_type(enum dfu_device_type t);
    150 const char *dfu_get_layout(enum dfu_layout l);
    151 struct dfu_entity *dfu_get_entity(int alt);
    152 char *dfu_extract_token(char** e, int *n);
    153 void dfu_trigger_reset(void);
    154 int dfu_get_alt(char *name);
    155 int dfu_init_env_entities(char *interface, char *devstr);
    156 unsigned char *dfu_get_buf(struct dfu_entity *dfu);
    157 unsigned char *dfu_free_buf(void);
    158 unsigned long dfu_get_buf_size(void);
    159 bool dfu_usb_get_reset(void);
    160 
    161 int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
    162 int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
    163 int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
    164 
    165 /*
    166  * dfu_defer_flush - pointer to store dfu_entity for deferred flashing.
    167  *		     It should be NULL when not used.
    168  */
    169 extern struct dfu_entity *dfu_defer_flush;
    170 /**
    171  * dfu_get_defer_flush - get current value of dfu_defer_flush pointer
    172  *
    173  * @return - value of the dfu_defer_flush pointer
    174  */
    175 static inline struct dfu_entity *dfu_get_defer_flush(void)
    176 {
    177 	return dfu_defer_flush;
    178 }
    179 
    180 /**
    181  * dfu_set_defer_flush - set the dfu_defer_flush pointer
    182  *
    183  * @param dfu - pointer to the dfu_entity, which should be written
    184  */
    185 static inline void dfu_set_defer_flush(struct dfu_entity *dfu)
    186 {
    187 	dfu_defer_flush = dfu;
    188 }
    189 
    190 /**
    191  * dfu_write_from_mem_addr - write data from memory to DFU managed medium
    192  *
    193  * This function adds support for writing data starting from fixed memory
    194  * address (like $loadaddr) to dfu managed medium (e.g. NAND, MMC, file system)
    195  *
    196  * @param dfu - dfu entity to which we want to store data
    197  * @param buf - fixed memory addres from where data starts
    198  * @param size - number of bytes to write
    199  *
    200  * @return - 0 on success, other value on failure
    201  */
    202 int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size);
    203 
    204 /* Device specific */
    205 #ifdef CONFIG_DFU_MMC
    206 extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s);
    207 #else
    208 static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr,
    209 				      char *s)
    210 {
    211 	puts("MMC support not available!\n");
    212 	return -1;
    213 }
    214 #endif
    215 
    216 #ifdef CONFIG_DFU_NAND
    217 extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s);
    218 #else
    219 static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr,
    220 				       char *s)
    221 {
    222 	puts("NAND support not available!\n");
    223 	return -1;
    224 }
    225 #endif
    226 
    227 #ifdef CONFIG_DFU_RAM
    228 extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s);
    229 #else
    230 static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr,
    231 				      char *s)
    232 {
    233 	puts("RAM support not available!\n");
    234 	return -1;
    235 }
    236 #endif
    237 
    238 #ifdef CONFIG_DFU_SF
    239 extern int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s);
    240 #else
    241 static inline int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr,
    242 				     char *s)
    243 {
    244 	puts("SF support not available!\n");
    245 	return -1;
    246 }
    247 #endif
    248 
    249 /**
    250  * dfu_tftp_write - Write TFTP data to DFU medium
    251  *
    252  * This function is storing data received via TFTP on DFU supported medium.
    253  *
    254  * @param dfu_entity_name - name of DFU entity to write
    255  * @param addr - address of data buffer to write
    256  * @param len - number of bytes
    257  * @param interface - destination DFU medium (e.g. "mmc")
    258  * @param devstring - instance number of destination DFU medium (e.g. "1")
    259  *
    260  * @return 0 on success, otherwise error code
    261  */
    262 #ifdef CONFIG_DFU_TFTP
    263 int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len,
    264 		   char *interface, char *devstring);
    265 #else
    266 static inline int dfu_tftp_write(char *dfu_entity_name, unsigned int addr,
    267 				 unsigned int len, char *interface,
    268 				 char *devstring)
    269 {
    270 	puts("TFTP write support for DFU not available!\n");
    271 	return -ENOSYS;
    272 }
    273 #endif
    274 
    275 int dfu_add(struct usb_configuration *c);
    276 #endif /* __DFU_ENTITY_H_ */
    277