factoryBurn: dnl: add burn single bootloader cpy [1/1]

PD#SWPL-196940

Problem:
need support burn only one bootloader copy

Solution:
add support part bootloader-user/boot0/boot1

Verify:
t950d5

Change-Id: Ieb700423f54501a73235d95bc8234d73eb948997
Signed-off-by: yihui wu <yihui.wu@amlogic.com>
diff --git a/cmd/amlogic/bootloader_status.c b/cmd/amlogic/bootloader_status.c
index fdfac02..d78c529 100644
--- a/cmd/amlogic/bootloader_status.c
+++ b/cmd/amlogic/bootloader_status.c
@@ -364,12 +364,14 @@
 		return -1;
 	}
 
+#ifdef CONFIG_MESON_S7D
 	iret = update_boot_hdr_4_s7d_reva(buffer, BOOTLOADER_MAX_SIZE - BOOTLOADER_OFFSET, 0);
 	if (iret) {
 		printf("Failed to write s7d reva boot0\n");
 		free(buffer);
 		return -1;
 	}
+#endif//#ifdef CONFIG_MESON_S7D
 
 	iret = store_boot_write("bootloader", i, BOOTLOADER_MAX_SIZE - BOOTLOADER_OFFSET, buffer);
 	if (iret) {
diff --git a/cmd/amlogic/store_wrapper.c b/cmd/amlogic/store_wrapper.c
index c07f6d3..213c529 100644
--- a/cmd/amlogic/store_wrapper.c
+++ b/cmd/amlogic/store_wrapper.c
@@ -9,6 +9,7 @@
 #include <asm/amlogic/arch/cpu_config.h>
 #include <amlogic/store_wrapper.h>
 #include <u-boot/sha256.h>
+#include <amlogic/aml_mmc.h>
 
 #define debugP(fmt...) //printf("Dbg[WRP]L%d:", __LINE__),printf(fmt)
 #define errorP(fmt...) printf("Err[WRP]L%d:", __LINE__),printf(fmt)
@@ -150,6 +151,113 @@
 	return ret;
 }
 
+#ifdef CONFIG_CMD_MMC
+static int _amlmmc_rdwr_bootloader(int dev, int map, unsigned int size, void *src, int iswrite)
+{
+	int ret = 0, i, count = 3;
+	unsigned long n;
+	char *partname[3] = {"user", "boot0", "boot1"};
+	struct mmc *mmc = NULL;
+	lbaint_t start = 1, blkcnt;
+
+	mmc = find_mmc_device(dev);
+	if (!mmc) {
+		printf("%s() %d: not valid emmc %d\n", __func__, __LINE__, dev);
+		return -1;
+	}
+	/* make sure mmc is initialized! */
+	ret = mmc_init(mmc);
+	if (ret) {
+		printf("%s() %d: emmc %d init %d\n", __func__, __LINE__, dev, ret);
+		return -2;
+	}
+
+	blkcnt = (size + mmc->read_bl_len - 1) / mmc->read_bl_len;
+
+	/* erase bootloader in user/boot0/boot1 */
+	for (i = 0; i < count; i++) {
+		if (map & (1 << i)) {
+			if (blk_select_hwpart_devnum(UCLASS_MMC, 1, i)) {
+				printf("%s() %d: switch dev %d to %s fail\n",
+						__func__, __LINE__, dev, partname[i]);
+				ret = -3;
+				break;
+			}
+
+			printf("To %s " LBAFU " blocks at " LBAFU " @%s\n",
+				iswrite ? "Write" : "Read", blkcnt, start, partname[i]);
+			if (iswrite)
+				n = blk_dwrite(mmc_get_blk_desc(mmc), start, blkcnt, src);
+			else
+				n = blk_dread(mmc_get_blk_desc(mmc), start, blkcnt, src);
+			if (n != blkcnt) {
+				printf("mmc rd/wr %s failed\n", partname[i]);
+				ret = -4;
+				break;
+			}
+		}
+	}
+
+	/* try to switch back to user. */
+	if (blk_select_hwpart_devnum(UCLASS_MMC, 1, 0)) {
+		errorP("Fail switch to user\n");
+		return -5;
+	}
+	return ret;
+}
+#else
+static int _amlmmc_rdwr_bootloader(int dev, int map, unsigned int size, void *src, int iswrite)
+{
+	errorP("MMC not enable\n");
+	return -1;
+}
+#endif// #ifdef CONFIG_CMD_MMC
+
+static int _amlmmc_write_bootloader(int dev, int map, unsigned int size, void *src)
+{
+	return _amlmmc_rdwr_bootloader(dev, map, size, src, 1);
+}
+
+static int _amlmmc_read_bootloader(int dev, int map, unsigned int size, void *src)
+{
+	return _amlmmc_rdwr_bootloader(dev, map, size, src, 0);
+}
+
+int store_bootloader_ops(int ops, const char *name, void *pdata, unsigned int szdata)
+{
+	int map = 0;
+	int cpy = 0;
+	int ret = -1;
+	const int DEV = 1;
+	const char *_names[] = {"bootloader-user", "bootloader-boot0", "bootloader-boot1"};
+
+	for (; cpy < ARRAY_SIZE(_names); ++cpy) {
+		if (!strcmp(_names[cpy], name))
+			break;
+	}
+	if (cpy > 2) {
+		errorP("inval cpy %d\n", cpy);
+		return -__LINE__;
+	}
+	map = (1<<cpy);
+	switch (ops) {
+	case _STORE_BOOT_OP_WRITE: {
+		ret = _amlmmc_write_bootloader(DEV, map, szdata, pdata);
+		break;
+	}
+	case _STORE_BOOT_OP_READ: {
+		ret = _amlmmc_read_bootloader(DEV, map, szdata, pdata);
+		break;
+	}
+	case _STORE_BOOT_OP_ERASE:
+	default:
+		errorP("inval op:%d\n", ops);
+		return -__LINE__;
+	}
+
+	return ret;
+}
+
 #ifndef CONFIG_AML_V3_FACTORY_BURN//storage wrapper
 #define FB_ERR(fmt ...) printf("[ERR]%s:L%d:", __func__, __LINE__), printf(fmt)
 #define FB_EXIT(fmt ...) do { FB_ERR(fmt); return -__LINE__; } while (0)
diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c
index a6a1664..5650311 100644
--- a/drivers/fastboot/fb_command.c
+++ b/drivers/fastboot/fb_command.c
@@ -610,12 +610,14 @@
 		char *slot_name = NULL;
 		char partname[32] = {0};
 
+#ifdef CONFIG_MESON_S7D
 		ret = update_boot_hdr_4_s7d_reva(fastboot_buf_addr, image_size, 0);
 		if (ret) {
 			printf("Failed to write s7d reva boot0\n");
 			fastboot_fail("Failed to write s7d reva boot0", response);
 			return;
 		}
+#endif//#ifdef CONFIG_MESON_S7D
 
 		slot_name = env_get("active_slot");
 		if (slot_name && (strcmp(slot_name, "_a") == 0))
@@ -807,12 +809,14 @@
 		strcpy(name, "dtb");
 	} else if (!strcmp(cmd_parameter, "bootloader-boot0") ||
 		!strcmp(cmd_parameter, "bootloader-boot1")) {
+#ifdef CONFIG_MESON_S7D
 		ret = update_boot_hdr_4_s7d_reva(fastboot_buf_addr, image_size, 0);
 		if (ret) {
 			printf("Failed to write s7d reva boot0\n");
 			fastboot_fail("Failed to write s7d reva boot0-1", response);
 			return;
 		}
+#endif//#ifdef CONFIG_MESON_S7D
 		strlcpy(name, cmd_parameter, 31);
 	} else {
 		strlcpy(name, cmd_parameter, 31);
diff --git a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c
index ab6208a..a5ad2bb 100644
--- a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c
+++ b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_buff_manager.c
@@ -82,6 +82,9 @@
 	if (!strcmp("bootloader", part)) {
 		ret = bootloader_read(vryBuff, 0, imgTotalLen);
 		sha1_update(&ctx, vryBuff, imgTotalLen);
+	} else if (!strncmp("bootloader-", part, strnlen("bootloader-", 12))) {
+		ret = store_bootloader_ops(_STORE_BOOT_OP_READ, part, vryBuff, imgTotalLen);
+		sha1_update(&ctx, vryBuff, imgTotalLen);
 	} else if (!strcmp("_aml_dtb", part)) {
 		ret = store_dtb_rw(vryBuff, imgTotalLen, 2);
 		sha1_update(&ctx, vryBuff, imgTotalLen);
@@ -283,6 +286,7 @@
 
 		if (strcmp("bootloader", cmnInf->partName) &&
 		    strcmp("_aml_dtb", cmnInf->partName) &&
+		    strncmp("bootloader-", cmnInf->partName, strnlen("bootloader-", 12)) &&
 		    strcmp("gpt", cmnInf->partName))
 			_usbDownInf.dataSize = _mymin(leftLen, _RAW_IMG_TRANSFER_LEN);
 		else
@@ -398,6 +402,9 @@
 		case V3TOOL_MEDIA_TYPE_STORE: {
 			if (!strcmp("bootloader", partName)) {
 				ret = bootloader_write(dataBuf, 0, thisTransferLen);
+			} else if (!strncmp("bootloader-", partName, strnlen("bootloader-", 12))) {
+				FB_MSG("write %s \n", partName);
+				ret = store_bootloader_ops(_STORE_BOOT_OP_WRITE, partName, dataBuf, thisTransferLen);
 			} else if (!strcmp("_aml_dtb", partName)) {
 				ret = store_dtb_rw(dataBuf, thisTransferLen, 1);
 			} else if (!strcmp("gpt", partName)) {
@@ -483,12 +490,16 @@
 	case V3TOOL_MEDIA_TYPE_STORE: {
 		if (!strcmp("bootloader", partName)  ||
 		    !strcmp("_aml_dtb", partName) ||
+		    !strncmp("bootloader-", partName, strnlen("bootloader-", 12)) ||
 		    !strcmp("gpt", partName)) {
 			_usbUpInf.dataSize = leftLen;
 			dataSize = leftLen;
 		}
 		if (!strcmp("bootloader", partName)) {
 			ret = bootloader_read(dataBuf, 0, dataSize);
+		} else if (!strncmp("bootloader-", partName, strnlen("bootloader-", 12))) {
+			FB_MSG("write %s \n", partName);
+			ret = store_bootloader_ops(_STORE_BOOT_OP_READ, partName, dataBuf, dataSize);
 		} else if (!strcmp("_aml_dtb", partName)) {
 			//'2' means using 'store dtb iread' rather than 'read'
 			ret = store_dtb_rw(dataBuf, dataSize, 2);
diff --git a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c
index 30e046f..37cb3c7 100644
--- a/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c
+++ b/drivers/usb/gadget/v3_burning/v3_common/v3_tool_media.c
@@ -340,6 +340,7 @@
 	return 0;
 }
 
+#ifdef CONFIG_MESON_S7D
 int update_boot_hdr_4_s7d_reva(u8 *data_buf, unsigned int binsz, int isread)
 {
 	const cpu_id_t cpuid = get_cpu_id();
@@ -394,6 +395,7 @@
 	FB_MSG("boot hdr changed\n");
 	return 0;
 }
+#endif//#ifdef CONFIG_MESON_S7D
 
 int bootloader_write(u8 *dataBuf, unsigned off, unsigned binsz)
 {
@@ -403,10 +405,12 @@
 	//_bl2x_mode_check_header(pInfo);
 	if (is_bootloader_discrte(&discreteMode))
 		return -__LINE__;
+#ifdef CONFIG_MESON_S7D
 	if (update_boot_hdr_4_s7d_reva(dataBuf, binsz, 0)) {
 		FB_ERR("Fail in update x5m inf\n");
 		return -__LINE__;
 	}
+#endif//#ifdef CONFIG_MESON_S7D
 	if (!discreteMode) {
 		return _bootloader_write(dataBuf, off, binsz, "bootloader");
 	} else {
@@ -569,10 +573,13 @@
 		memcpy(pBuf, src_data, binsz);
 	}
 #endif//#ifdef CONFIG_UPDATE_UBOOT_NOCS
+#ifdef CONFIG_MESON_S7D
 	if (update_boot_hdr_4_s7d_reva(pBuf, binsz, 1)) {
 		FB_ERR("Fail in update x5m inf\n");
 		return -__LINE__;
 	}
+#endif//#ifdef CONFIG_MESON_S7D
+
 	return 0;
 }
 
@@ -613,11 +620,14 @@
 #endif// #if 1//storage wrapper
 
 
-int v3tool_media_check_image_size(int64_t imgsz, const char *part)
+int v3tool_media_check_image_size(int64_t imgsz, const char *_part)
 {
 	int ret = 0;
 	u64 partcap = 0;
+	const char *part = _part;
 
+	if (!strncmp("bootloader-", part, strnlen("bootloader-", 11)))
+		part = "bootloader";
 	if (!strcmp("bootloader", part)) {
 		const unsigned int bootSz = bootloader_copy_sz();
 		if (imgsz > bootSz)
@@ -800,7 +810,8 @@
 			FB_MSG("remain bootloader as nocs scs chip\n");
 			ret = usb_burn_erase_data(1);
 		} else {
-			if (v3tool_work_mode_get() == V3TOOL_WORK_MODE_USB_PRODUCE) {
+			if (v3tool_work_mode_get() == V3TOOL_WORK_MODE_USB_PRODUCE ||
+				store_get_type() != BOOT_EMMC) {
 				ret = store_erase(NULL, 0, 0, 0);
 			} else {
 				FB_MSG("remain bootloader as not usb boot\n");
diff --git a/include/amlogic/store_wrapper.h b/include/amlogic/store_wrapper.h
index 6a38566..a520402 100644
--- a/include/amlogic/store_wrapper.h
+++ b/include/amlogic/store_wrapper.h
@@ -19,6 +19,15 @@
 
 int store_boot_copy_enable(int id);
 
+enum {
+	_STORE_BOOT_OP_WRITE = 0,
+	_STORE_BOOT_OP_READ,
+	_STORE_BOOT_OP_ERASE,
+	_STORE_BOOT_OP_NUM
+};
+
+int store_bootloader_ops(int ops, const char *name, void *pdata, unsigned int szdata);
+
 int update_boot_hdr_4_s7d_reva(u8 *data_buf, unsigned int binsz, int isread);
 #ifdef CONFIG_CMD_MMC
 int usb_burn_erase_data(unsigned char init_flag);