author | Sam Wu <yihui.wu@amlogic.com> | 2019-12-06 08:34:17 (GMT) |
---|---|---|
committer | Yihui Wu <yihui.wu@amlogic.com> | 2019-12-10 02:20:53 (GMT) |
commit | dcc1845a3257df79496383e374edde13f9539878 (patch) | |
tree | 2d39e478619e700944da03506fc63bdf1d3164de | |
parent | 02981b179b4509fd259524571da0ab30affc7110 (diff) | |
download | uboot-dcc1845a3257df79496383e374edde13f9539878.zip uboot-dcc1845a3257df79496383e374edde13f9539878.tar.gz uboot-dcc1845a3257df79496383e374edde13f9539878.tar.bz2 |
factoryBurn: usb disk: burn aml_upgrade_package improve [1/1]
PD#SWPL-17922
Problem:
1, speed up usb disk read speed when burn img
don't erase bootloader when usb disk upgrade
2, default erase flash but not no erase bootloader
Solution:
enlarge fatload buffer per-time read image
support calculate cost time
Verify:
u200 / txhd /tl1
tested x301 usb read time saved about half when upgrade
Change-Id: I511cb3773279cc77cb5c68908e8b23fffbb5a520
Signed-off-by: Sam Wu <yihui.wu@amlogic.com>
11 files changed, 145 insertions, 46 deletions
diff --git a/common/store_interface.c b/common/store_interface.c index 68f71e3..f152877 100644 --- a/common/store_interface.c +++ b/common/store_interface.c @@ -1134,7 +1134,8 @@ E_SWITCH_BACK: else if(device_boot_flag==EMMC_BOOT_FLAG){ store_dbg("MMC BOOT,erase data : %s %d off =%llx ,size=%llx",__func__,__LINE__, off, size); off = size =0; - ret = run_command("amlmmc erase 1",0); //whole + MsgP("amlmmc erase non_loader\n"); + ret = run_command("amlmmc erase non_loader",0); //whole if (ret != 0) { store_msg("amlmmc cmd %s failed ",cmd); return -1; diff --git a/drivers/usb/gadget/v2_burning/v2_common/amlImage_if.h b/drivers/usb/gadget/v2_burning/v2_common/amlImage_if.h index f77af43..aa31fb9 100644 --- a/drivers/usb/gadget/v2_burning/v2_common/amlImage_if.h +++ b/drivers/usb/gadget/v2_burning/v2_common/amlImage_if.h @@ -139,5 +139,8 @@ int get_total_itemnr(HIMAGE hImg); u64 optimus_img_decoder_get_data_parts_size(HIMAGE hImg, int* hasBootloader); + +unsigned image_get_crc(HIMAGE hImg); + #endif//ifndef __AMLIMAGE_IF_H__ diff --git a/drivers/usb/gadget/v2_burning/v2_common/optimus_buffer_manager.c b/drivers/usb/gadget/v2_burning/v2_common/optimus_buffer_manager.c index a80751f..d09622d 100644 --- a/drivers/usb/gadget/v2_burning/v2_common/optimus_buffer_manager.c +++ b/drivers/usb/gadget/v2_burning/v2_common/optimus_buffer_manager.c @@ -83,6 +83,10 @@ int optimus_buf_manager_init(const unsigned mediaAlignSz) return OPT_DOWN_FAIL; } _bufManager.mediaAlignSz = mediaAlignSz; + *(u32*)(&_bufManager.transferUnitSz) = (OPTIMUS_WORK_MODE_USB_PRODUCE >= optimus_work_mode_get()) + ? OPTIMUS_DOWNLOAD_SLOT_SZ : OPTIMUS_LOCAL_UPGRADE_SLOT_SZ; + _bufManager.writeBackUnitSz = _bufManager.transferUnitSz; + DWN_DBG("transfer=0x%p, transferBufSz=0x%x, transferUnitSz=0x%x, writeBackUnitSz=0x%x, totalSlotNum=%d\n", _bufManager.transferBuf, _bufManager.transferBufSz, _bufManager.transferUnitSz, _bufManager.writeBackUnitSz, _bufManager.totalSlotNum); @@ -131,6 +135,7 @@ int optimus_buf_manager_tplcmd_init(const char* mediaType, const char* partName _bufManager.destMediaType = !strcmp("mem", mediaType) ? OPTIMUS_MEDIA_TYPE_MEM : OPTIMUS_MEDIA_TYPE_STORE ; if ( !cacheAll2Mem ) cacheAll2Mem = !strcmp("mem", mediaType) ; + if ( !cacheAll2Mem ) cacheAll2Mem = (pktSz4BufManager <= _bufManager.transferUnitSz); if (cacheAll2Mem) { writeBackUnitSz = pktSz4BufManager + _bufManager.transferUnitSz - 1; @@ -149,7 +154,7 @@ int optimus_buf_manager_tplcmd_init(const char* mediaType, const char* partName return OPT_DOWN_FAIL; } if (_bufManager.transferUnitSz > writeBackUnitSz) { - DWN_ERR("write back size %d < align size %d\n", writeBackUnitSz, _bufManager.mediaAlignSz); + DWN_ERR("write back size %d < align size %d\n", writeBackUnitSz, _bufManager.transferUnitSz); return OPT_DOWN_FAIL; } DWN_DBG("writeBackUnitSz = 0x%x, pktSz4BufManager = %lld\n", writeBackUnitSz, pktSz4BufManager); @@ -197,7 +202,7 @@ int optimus_buf_manager_get_buf_for_bulk_transfer(char** pBuf, const unsigned wa (u8*)(u64)_bufManager.partBaseOffset ; if (wantSz < _bufManager.transferUnitSz && !isLastTransfer) { - DWN_ERR("only last transfer can less 64K, this index %d at size 0x%u illegle\n", totalSlotNum + 1, wantSz); + DWN_ERR("only last transfer can less 64K, this index %d at size 0x%x illegle\n", totalSlotNum + 1, wantSz); return OPT_DOWN_FAIL; } @@ -215,12 +220,12 @@ int optimus_buf_manager_get_buf_for_bulk_transfer(char** pBuf, const unsigned wa //prepare data for upload if (!bufSzNotDisposed && _bufManager.isUpload) { - u32 dataSz4Up = (leftPktSz > _bufManager.writeBackUnitSz) ? _bufManager.writeBackUnitSz : ((u32)leftPktSz); - DWN_DBG("want size 0x%x\n", dataSz4Up); + u32 wantSz = (leftPktSz > _bufManager.writeBackUnitSz) ? _bufManager.writeBackUnitSz : ((u32)leftPktSz); + DWN_DBG("want size 0x%x\n", wantSz); - u32 readSz = optimus_dump_storage_data((u8*)BufBase, dataSz4Up, errInfo); - if (readSz != dataSz4Up) { - DWN_ERR("Want read %u, but %u\n", dataSz4Up, readSz); + u32 readSz = optimus_dump_storage_data((u8*)BufBase, wantSz, errInfo); + if (readSz != wantSz) { + DWN_ERR("Want read %u, but %u\n", wantSz, readSz); return OPT_DOWN_FAIL; } } diff --git a/drivers/usb/gadget/v2_burning/v2_common/optimus_download.c b/drivers/usb/gadget/v2_burning/v2_common/optimus_download.c index 1d546f9..d8cb2ee 100644 --- a/drivers/usb/gadget/v2_burning/v2_common/optimus_download.c +++ b/drivers/usb/gadget/v2_burning/v2_common/optimus_download.c @@ -57,6 +57,18 @@ int v2_key_command(const int argc, char * const argv[], char *info) } #endif//#ifndef CONFIG_UNIFY_KEY_MANAGE +#if SUM_FUNC_TIME_COST +static inline int +store_read_ops_(unsigned char *partition_name,unsigned char * buf, uint64_t off, uint64_t size) +{ + int ret = 0; + _func_cost_utime_yret(FlashRdTime, ret, store_read_ops, partition_name, buf, off, size); + return ret; +} +#else +#define store_read_ops_ store_read_ops +#endif//#if SUM_FUNC_TIME_COST + static unsigned long _dtb_is_loaded = 0; @@ -247,7 +259,11 @@ static int optimus_verify_bootloader(struct ImgBurnInfo* pDownInfo, u8* genSum) } +#if SUM_FUNC_TIME_COST +static u32 _optimus_cb_simg_write_media(const unsigned destAddrInSec, const unsigned dataSzInBy, const char* data) +#else u32 optimus_cb_simg_write_media(const unsigned destAddrInSec, const unsigned dataSzInBy, const char* data) +#endif//#if SUM_FUNC_TIME_COST { int ret = OPT_DOWN_OK; unsigned char* partName = (unsigned char*)OptimusImgBurnInfo.partName; @@ -269,6 +285,16 @@ u32 optimus_cb_simg_write_media(const unsigned destAddrInSec, const unsigned dat return dataSzInBy; } +#if SUM_FUNC_TIME_COST +u32 optimus_cb_simg_write_media(const unsigned destAddrInSec, const unsigned dataSzInBy, const char* data) +{ + extern unsigned long FlashWrTime; + u32 ret = 0; + _func_cost_utime_yret(FlashWrTime, ret, _optimus_cb_simg_write_media, destAddrInSec, dataSzInBy, data); + return ret; +} +#endif//#if SUM_FUNC_TIME_COST + //return value: the data size disposed static u32 optimus_download_sparse_image(struct ImgBurnInfo* pDownInfo, u32 dataSz, const u8* data) { @@ -286,10 +312,14 @@ static u32 optimus_download_sparse_image(struct ImgBurnInfo* pDownInfo, u32 data return dataSz - unParsedDataLen; } +#if SUM_FUNC_TIME_COST +static u32 _optimus_download_normal_image(struct ImgBurnInfo* pDownInfo, u32 dataSz, const u8* data) +#else //Normal image can write directly to NAND, best aligned to 16K when write //FIXME: check it aligned to 16K when called //1, write to media 2 -- save the verify info static u32 optimus_download_normal_image(struct ImgBurnInfo* pDownInfo, u32 dataSz, const u8* data) +#endif//#if SUM_FUNC_TIME_COST { int ret = 0; u64 addrOrOffsetInBy = pDownInfo->nextMediaOffset; @@ -308,6 +338,16 @@ static u32 optimus_download_normal_image(struct ImgBurnInfo* pDownInfo, u32 data return dataSz; } +#if SUM_FUNC_TIME_COST +static u32 optimus_download_normal_image(struct ImgBurnInfo* pDownInfo, u32 dataSz, const u8* data) +{ + extern unsigned long FlashWrTime; + u32 ret = 0; + _func_cost_utime_yret(FlashWrTime, ret, _optimus_download_normal_image, pDownInfo, dataSz, data); + return ret; +} +#endif// #if SUM_FUNC_TIME_COST + static int optimus_storage_open(struct ImgBurnInfo* pDownInfo, const u8* data, const u32 dataSz) { int ret = OPT_DOWN_OK; @@ -538,7 +578,7 @@ static int optimus_storage_read(struct ImgBurnInfo* pDownInfo, u64 addrOrOffsetI } else { - ret = store_read_ops(partName, buff, addrOrOffsetInBy, (u64)readSzInBy); + ret = store_read_ops_(partName, buff, addrOrOffsetInBy, (u64)readSzInBy); platform_busy_increase_un_reported_size(readSzInBy); } if (ret) { diff --git a/drivers/usb/gadget/v2_burning/v2_common/optimus_download.h b/drivers/usb/gadget/v2_burning/v2_common/optimus_download.h index b5e0cbd..a0a10eb 100644 --- a/drivers/usb/gadget/v2_burning/v2_common/optimus_download.h +++ b/drivers/usb/gadget/v2_burning/v2_common/optimus_download.h @@ -95,6 +95,7 @@ unsigned v2_key_burn(const char* keyName, const u8* keyVal, const unsigned keyVa #define OPTIMUS_DOWNLOAD_TRANSFER_BUF_ADDR (OPTIMUS_SPARSE_IMG_LEFT_DATA_ADDR_LOW + OPTIMUS_SPARSE_IMG_LEFT_DATA_MAX_SZ) #define OPTIMUS_DOWNLOAD_SLOT_SZ (64<<10) //64K +#define OPTIMUS_LOCAL_UPGRADE_SLOT_SZ (OPTIMUS_DOWNLOAD_SLOT_SZ * 16) //1M per time for fatload #define OPTIMUS_DOWNLOAD_SLOT_SZ_SHIFT_BITS (16) //64K #define OPTIMUS_DOWNLOAD_SLOT_NUM (OPTIMUS_DOWNLOAD_TRANSFER_BUF_TOTALSZ/OPTIMUS_DOWNLOAD_SLOT_SZ) @@ -215,5 +216,28 @@ int optimus_work_mode_set(int workmode); //cannot called nested as it shares the same buffer const char* getenv_optimus(const char* name); +#ifdef CONFIG_AML_FACTORY_BURN_LOCAL_UPGRADE +#define SUM_FUNC_TIME_COST 0 +#if SUM_FUNC_TIME_COST +#define _func_cost_utime_yret(sum, ret, func, ...) do {\ + unsigned long uTime = timer_get_us(); \ + ret = func(__VA_ARGS__); \ + sum += timer_get_us() - uTime; \ +} while(0) + +#define _func_cost_utime_nret(sum, func, ...) do {\ + unsigned long uTime = timer_get_us(); \ + func(__VA_ARGS__); \ + sum += timer_get_us() - uTime; \ +} while(0) + +extern unsigned long ImageRdTime; +extern unsigned long FlashRdTime; +extern unsigned long FlashWrTime; + +#else +#endif//#if SUM_FUNC_TIME_COST +#endif//#ifdef CONFIG_AML_FACTORY_BURN_LOCAL_UPGRADE + #endif//ifndef __OPTIMUS_DOWNLOAD_H__ diff --git a/drivers/usb/gadget/v2_burning/v2_common/optimus_fat.c b/drivers/usb/gadget/v2_burning/v2_common/optimus_fat.c index 0c28ed3..57e647e 100644 --- a/drivers/usb/gadget/v2_burning/v2_common/optimus_fat.c +++ b/drivers/usb/gadget/v2_burning/v2_common/optimus_fat.c @@ -1174,9 +1174,13 @@ unsigned do_fat_get_bytesperclust(int fd) return bytesperclust; } +#if SUM_FUNC_TIME_COST +static long _do_fat_fread(int fd, __u8 *buffer, unsigned long maxsize) +#else // clusters need to read: // data moddule: <first cluser not engouh cluster> + <n * Consecutive clusters > + <last cluster not engouh cluster> long do_fat_fread(int fd, __u8 *buffer, unsigned long maxsize) +#endif// #if SUM_FUNC_TIME_COST { if (fd < 0) { FAT_ERROR("Invalid fd %d\n", fd); @@ -1352,6 +1356,16 @@ exit: return gotsize; } +#if SUM_FUNC_TIME_COST +long do_fat_fread(int fd, __u8 *buffer, unsigned long maxsize) +{ + extern unsigned long ImageRdTime; + long ret = 0; + _func_cost_utime_yret(ImageRdTime, ret, _do_fat_fread, fd, buffer, maxsize); + return ret; +} +#endif//#if SUM_FUNC_TIME_COST + void do_fat_fclose(int fd) { diff --git a/drivers/usb/gadget/v2_burning/v2_common/optimus_img_decoder.c b/drivers/usb/gadget/v2_burning/v2_common/optimus_img_decoder.c index 9df7fcd..a1fbbdb 100644 --- a/drivers/usb/gadget/v2_burning/v2_common/optimus_img_decoder.c +++ b/drivers/usb/gadget/v2_burning/v2_common/optimus_img_decoder.c @@ -128,6 +128,12 @@ _err: return NULL; } +unsigned image_get_crc(HIMAGE hImg) +{ + ImgInfo_t* imgInfo = (ImgInfo_t*)hImg; + return imgInfo->imgHead.crc; +} + //close a Amlogic firmware image int image_close(HIMAGE hImg) diff --git a/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_ini__aml_sdc_burn.c b/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_ini__aml_sdc_burn.c index 337b0f8..5eb4d2c 100644 --- a/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_ini__aml_sdc_burn.c +++ b/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_ini__aml_sdc_burn.c @@ -49,8 +49,8 @@ ConfigPara_t g_sdcBurnPara = { }, .custom = { - .eraseBootloader = 1,//default to erase bootloader! - .eraseFlash = 0,//default no erase flash for usb disk upgrade + .eraseBootloader = 1,//default to erase bootloader! no effect for usb_upgrade + .eraseFlash = 1,//default erase flash for all cases .bitsMap.eraseBootloader = 1, .bitsMap.eraseFlash = 1, }, @@ -323,7 +323,7 @@ static int parse_burn_parts(const char* key, const char* strVal) partName = (char*)pBurnParts->burnParts[burnIndex]; if (!strVal) { - err("value of %s can't empty\n", strVal); + err("value of %s can't empty\n", key); return __LINE__; } diff --git a/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_sdc_burn.c b/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_sdc_burn.c index e94d32f..bacf90c 100644 --- a/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_sdc_burn.c +++ b/drivers/usb/gadget/v2_burning/v2_sdc_burn/optimus_sdc_burn.c @@ -140,7 +140,7 @@ static int optimus_burn_one_partition(const char* partName, HIMAGE hImg, __hdle u32 thisReadLen = 0; __hdle hImgItem = NULL; char* downTransBuf = NULL;//get buffer from optimus_buffer_manager - const unsigned ItemReadBufSz = OPTIMUS_DOWNLOAD_SLOT_SZ;//read this size from image item each time + const unsigned ItemReadBufSz = OPTIMUS_LOCAL_UPGRADE_SLOT_SZ;//read this size from image item each time unsigned sequenceNo = 0; const char* fileFmt = NULL; /*static */char _errInfo[512]; @@ -489,7 +489,10 @@ static int sdc_burn_aml_keys(HIMAGE hImg, const int keyOverWrite) const char** pCurKeysName = NULL; unsigned index = 0; - rc = run_command("aml_key_burn probe vfat sdc", 0); + if (strcmp("1", getenv("usb_update"))) + rc = run_command("aml_key_burn probe vfat sdc", 0); + else + rc = run_command("aml_key_burn probe vfat udisk", 0); if (rc) { DWN_ERR("Fail in probe for aml_key_burn\n"); return __LINE__; @@ -591,6 +594,12 @@ static int sdc_burn_aml_keys(HIMAGE hImg, const int keyOverWrite) #define sdc_burn_aml_keys(fmt...) 0 #endif// #if CONFIG_SUPPORT_SDC_KEYBURN +#if SUM_FUNC_TIME_COST +unsigned long ImageRdTime = 0; +unsigned long FlashRdTime = 0; +unsigned long FlashWrTime = 0; +#endif//#if SUM_FUNC_TIME_COST + int optimus_burn_with_cfg_file(const char* cfgFile) { extern ConfigPara_t g_sdcBurnPara ; @@ -604,6 +613,7 @@ int optimus_burn_with_cfg_file(const char* cfgFile) u64 datapartsSz = 0; int eraseFlag = pSdcCfgPara->custom.eraseFlash; + optimus_buf_manager_init(16*1024); hImg = image_open("mmc", "0", "1", cfgFile); if (!hImg) { DWN_MSG("cfg[%s] not valid aml pkg, parse it as ini\n", cfgFile); @@ -693,7 +703,16 @@ int optimus_burn_with_cfg_file(const char* cfgFile) eraseFlag = 0; DWN_MSG("Disable erase as data parts size is 0\n"); } - ret = optimus_storage_init(eraseFlag); + if (eraseFlag && !strcmp("1", getenv("usb_update"))) { + ret = optimus_storage_init(0); + if (ret) { + DWN_ERR("FAil in init flash for usb upgrade\n"); + return __LINE__; + } + ret = run_command("store erase data", 0);//erase after bootloader + } + else + ret = optimus_storage_init(eraseFlag); if (ret) { DWN_ERR("Fail to init stoarge for sdc burn\n"); ret = __LINE__; goto _finish; @@ -759,6 +778,9 @@ int optimus_burn_with_cfg_file(const char* cfgFile) _finish: image_close(hImg); +#if SUM_FUNC_TIME_COST + DWN_MSG("[ms]ImageRdTime %ld, FlashRdTime %ld, FlashWrTime %ld\n", ImageRdTime/1000, FlashRdTime/1000, FlashWrTime/1000); +#endif//#if SUM_FUNC_TIME_COST if (hUiProgress) optimus_progress_ui_report_upgrade_stat(hUiProgress, !ret); optimus_report_burn_complete_sta(ret, pSdcCfgPara->custom.rebootAfterBurn); if (hUiProgress) optimus_progress_ui_release(hUiProgress); diff --git a/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/optimus_key_burn.c b/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/optimus_key_burn.c index 0c6778c..cc02dfc 100644 --- a/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/optimus_key_burn.c +++ b/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/optimus_key_burn.c @@ -101,11 +101,13 @@ static int do_opt_keysburn_probe(cmd_tbl_t *cmdtp, int flag, int argc, char * co if (!_udiskProbe) { +#if 0 rc = run_command("usb start 0", 0); if (rc) { _AML_KEY_ERR("Fail in mmcinfo\n"); return __LINE__; } +#endif rc = optimus_device_probe("usb", "0"); if (rc) { _AML_KEY_ERR("Fail to detect device mmc 0\n"); @@ -170,39 +172,18 @@ static int optimus_read_keyfile_2_mem(const char* filePath, u8* buf, unsigned* k { int rc = 0; unsigned keySz = 0; + char cmd[128]; if (DEV_FILE_FMT_VFAT == _optKeyInfo.fileFmt) { - long hFile = -1; - unsigned readSz = 0; - -#if 1//FIXME: remove this mmcinfo - /*rc = run_command("mmcinfo 0", 0);*/ - rc = optimus_sdc_burn_switch_to_extmmc(); - if (rc) { - DWN_ERR("Fail in mmcinfo\n"); - return __LINE__; - } -#endif// - keySz = (unsigned)do_fat_get_fileSz(filePath);//can support both sdc and udisk - if (!keySz) { - DWN_ERR("size is 0 of file [%s]\n", filePath); - return __LINE__; - } - - hFile = do_fat_fopen(filePath); - if (hFile < 0) { - DWN_ERR("Fail to open file[%s]\n", filePath); - return __LINE__; - } - - readSz = do_fat_fread(hFile, buf, keySz); - if (readSz != keySz) { - DWN_ERR("Want read %d bytes, but %d\n", keySz, readSz); - return __LINE__; - } - - do_fat_fclose(hFile); + if (strcmp("1", getenv("usb_update"))) + sprintf(cmd, "fatload mmc 0 %p %s", buf, filePath); + else + sprintf(cmd, "fatload usb 0 %p %s", buf, filePath); + rc = run_command(cmd, 0); + if (rc) { + DWN_ERR("Fail in load key cmd[%s]\n", cmd); + } } *keyValLen = keySz; diff --git a/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/sdc_keysprovider.c b/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/sdc_keysprovider.c index 91914fe..075b1d8 100644 --- a/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/sdc_keysprovider.c +++ b/drivers/usb/gadget/v2_burning/v2_sdc_burn/sdc_burnkeys/sdc_keysprovider.c @@ -400,7 +400,10 @@ static int get_key_val_for_fmt_onlyone(const char* licenseName, u8* keyVal, unsi optimus_sdc_burn_switch_to_extmmc(); - sprintf(_cmd, "fatload mmc 0:1 0x%p %s", keyVal, licenseName); + if (strcmp("1", getenv("usb_update"))) + sprintf(_cmd, "fatload mmc 0:1 0x%p %s", keyVal, licenseName); + else + sprintf(_cmd, "fatload usb 0:1 0x%p %s", keyVal, licenseName); rc = run_command(_cmd, 0); if (rc) { errorP("failed in cmd[%s]\n", _cmd); |