1f22b11c1SLukasz Majewski /* 2f22b11c1SLukasz Majewski * dfu.h - DFU flashable area description 3f22b11c1SLukasz Majewski * 4f22b11c1SLukasz Majewski * Copyright (C) 2012 Samsung Electronics 5f22b11c1SLukasz Majewski * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 6f22b11c1SLukasz Majewski * Lukasz Majewski <l.majewski@samsung.com> 7f22b11c1SLukasz Majewski * 81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 9f22b11c1SLukasz Majewski */ 10f22b11c1SLukasz Majewski 11f22b11c1SLukasz Majewski #ifndef __DFU_ENTITY_H_ 12f22b11c1SLukasz Majewski #define __DFU_ENTITY_H_ 13f22b11c1SLukasz Majewski 14f22b11c1SLukasz Majewski #include <common.h> 15f22b11c1SLukasz Majewski #include <linux/list.h> 16f22b11c1SLukasz Majewski #include <mmc.h> 17f22b11c1SLukasz Majewski 18f22b11c1SLukasz Majewski enum dfu_device_type { 19f22b11c1SLukasz Majewski DFU_DEV_MMC = 1, 20f22b11c1SLukasz Majewski DFU_DEV_ONENAND, 21f22b11c1SLukasz Majewski DFU_DEV_NAND, 22f22b11c1SLukasz Majewski }; 23f22b11c1SLukasz Majewski 24f22b11c1SLukasz Majewski enum dfu_layout { 25f22b11c1SLukasz Majewski DFU_RAW_ADDR = 1, 26f22b11c1SLukasz Majewski DFU_FS_FAT, 27f22b11c1SLukasz Majewski DFU_FS_EXT2, 28f22b11c1SLukasz Majewski DFU_FS_EXT3, 29f22b11c1SLukasz Majewski DFU_FS_EXT4, 30f22b11c1SLukasz Majewski }; 31f22b11c1SLukasz Majewski 32*5a127c84SAfzal Mohammed enum dfu_op { 33*5a127c84SAfzal Mohammed DFU_OP_READ = 1, 34*5a127c84SAfzal Mohammed DFU_OP_WRITE, 35*5a127c84SAfzal Mohammed }; 36*5a127c84SAfzal Mohammed 37f22b11c1SLukasz Majewski struct mmc_internal_data { 38f22b11c1SLukasz Majewski /* RAW programming */ 39f22b11c1SLukasz Majewski unsigned int lba_start; 40f22b11c1SLukasz Majewski unsigned int lba_size; 41f22b11c1SLukasz Majewski unsigned int lba_blk_size; 42f22b11c1SLukasz Majewski 43f22b11c1SLukasz Majewski /* FAT/EXT */ 44f22b11c1SLukasz Majewski unsigned int dev; 45f22b11c1SLukasz Majewski unsigned int part; 46f22b11c1SLukasz Majewski }; 47f22b11c1SLukasz Majewski 48c6631764SPantelis Antoniou struct nand_internal_data { 49c6631764SPantelis Antoniou /* RAW programming */ 50c6631764SPantelis Antoniou u64 start; 51c6631764SPantelis Antoniou u64 size; 52c6631764SPantelis Antoniou 53c6631764SPantelis Antoniou unsigned int dev; 54c6631764SPantelis Antoniou unsigned int part; 55815c30b2SHeiko Schocher /* for nand/ubi use */ 56815c30b2SHeiko Schocher unsigned int ubi; 57c6631764SPantelis Antoniou }; 58c6631764SPantelis Antoniou 59f22b11c1SLukasz Majewski static inline unsigned int get_mmc_blk_size(int dev) 60f22b11c1SLukasz Majewski { 61f22b11c1SLukasz Majewski return find_mmc_device(dev)->read_bl_len; 62f22b11c1SLukasz Majewski } 63f22b11c1SLukasz Majewski 64f22b11c1SLukasz Majewski #define DFU_NAME_SIZE 32 65f22b11c1SLukasz Majewski #define DFU_CMD_BUF_SIZE 128 66e7e75c70SHeiko Schocher #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE 67e7e75c70SHeiko Schocher #define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */ 68e7e75c70SHeiko Schocher #endif 69ea2453d5SPantelis Antoniou #ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE 707a813d5bSLukasz Majewski #define CONFIG_SYS_DFU_MAX_FILE_SIZE CONFIG_SYS_DFU_DATA_BUF_SIZE 71ea2453d5SPantelis Antoniou #endif 72f22b11c1SLukasz Majewski 73f22b11c1SLukasz Majewski struct dfu_entity { 74f22b11c1SLukasz Majewski char name[DFU_NAME_SIZE]; 75f22b11c1SLukasz Majewski int alt; 76f22b11c1SLukasz Majewski void *dev_private; 77f22b11c1SLukasz Majewski int dev_num; 78f22b11c1SLukasz Majewski enum dfu_device_type dev_type; 79f22b11c1SLukasz Majewski enum dfu_layout layout; 80f22b11c1SLukasz Majewski 81f22b11c1SLukasz Majewski union { 82f22b11c1SLukasz Majewski struct mmc_internal_data mmc; 83c6631764SPantelis Antoniou struct nand_internal_data nand; 84f22b11c1SLukasz Majewski } data; 85f22b11c1SLukasz Majewski 86ea2453d5SPantelis Antoniou int (*read_medium)(struct dfu_entity *dfu, 87ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 88ea2453d5SPantelis Antoniou 89ea2453d5SPantelis Antoniou int (*write_medium)(struct dfu_entity *dfu, 90ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 91ea2453d5SPantelis Antoniou 92ea2453d5SPantelis Antoniou int (*flush_medium)(struct dfu_entity *dfu); 93f22b11c1SLukasz Majewski 94f22b11c1SLukasz Majewski struct list_head list; 95ea2453d5SPantelis Antoniou 96ea2453d5SPantelis Antoniou /* on the fly state */ 97ea2453d5SPantelis Antoniou u32 crc; 98ea2453d5SPantelis Antoniou u64 offset; 99ea2453d5SPantelis Antoniou int i_blk_seq_num; 100ea2453d5SPantelis Antoniou u8 *i_buf; 101ea2453d5SPantelis Antoniou u8 *i_buf_start; 102ea2453d5SPantelis Antoniou u8 *i_buf_end; 103ea2453d5SPantelis Antoniou long r_left; 104ea2453d5SPantelis Antoniou long b_left; 105ea2453d5SPantelis Antoniou 106c6631764SPantelis Antoniou u32 bad_skip; /* for nand use */ 107c6631764SPantelis Antoniou 108ea2453d5SPantelis Antoniou unsigned int inited:1; 109f22b11c1SLukasz Majewski }; 110f22b11c1SLukasz Majewski 111f22b11c1SLukasz Majewski int dfu_config_entities(char *s, char *interface, int num); 112f22b11c1SLukasz Majewski void dfu_free_entities(void); 113f22b11c1SLukasz Majewski void dfu_show_entities(void); 114f22b11c1SLukasz Majewski int dfu_get_alt_number(void); 115f22b11c1SLukasz Majewski const char *dfu_get_dev_type(enum dfu_device_type t); 116f22b11c1SLukasz Majewski const char *dfu_get_layout(enum dfu_layout l); 117f22b11c1SLukasz Majewski struct dfu_entity *dfu_get_entity(int alt); 118f22b11c1SLukasz Majewski char *dfu_extract_token(char** e, int *n); 1196bed7ce5SLukasz Majewski void dfu_trigger_reset(void); 1206bed7ce5SLukasz Majewski bool dfu_reset(void); 121765c5ae5SLukasz Majewski int dfu_init_env_entities(char *interface, int dev); 122f22b11c1SLukasz Majewski 123f22b11c1SLukasz Majewski int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 124f22b11c1SLukasz Majewski int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 125f22b11c1SLukasz Majewski /* Device specific */ 126f22b11c1SLukasz Majewski #ifdef CONFIG_DFU_MMC 127f22b11c1SLukasz Majewski extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s); 128f22b11c1SLukasz Majewski #else 129f22b11c1SLukasz Majewski static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s) 130f22b11c1SLukasz Majewski { 131f22b11c1SLukasz Majewski puts("MMC support not available!\n"); 132f22b11c1SLukasz Majewski return -1; 133f22b11c1SLukasz Majewski } 134f22b11c1SLukasz Majewski #endif 135c6631764SPantelis Antoniou 136c6631764SPantelis Antoniou #ifdef CONFIG_DFU_NAND 137c6631764SPantelis Antoniou extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s); 138c6631764SPantelis Antoniou #else 139c6631764SPantelis Antoniou static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) 140c6631764SPantelis Antoniou { 141c6631764SPantelis Antoniou puts("NAND support not available!\n"); 142c6631764SPantelis Antoniou return -1; 143c6631764SPantelis Antoniou } 144c6631764SPantelis Antoniou #endif 145c6631764SPantelis Antoniou 146f22b11c1SLukasz Majewski #endif /* __DFU_ENTITY_H_ */ 147