/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.

*******************************************************************************/

#include <common.h>
#if defined(CONFIG_CMD_RCVR)
#include "boardEnv/mvBoardEnvLib.h"

/*******************************************************************************
* parseIntFromString
*
* DESCRIPTION: parse string from prefix to suffix - extract size to integer format
*
* INPUT:	str - string
*		prefix - prefix char of the requested size
*		suffix - suffix char of the requested size
*
* OUTPUT: None
*
* RETURN:
*        size/offset integer - scaled to bytes (to be directly used as load address and size)
*
*******************************************************************************/
MV_U32 parseIntFromString(char *str, char prefix, char suffix)
{
	char *strStart, *strEnd, *strSize = NULL;

	if (!str) {
		mvOsPrintf("%s:Error: requested variable ('mtdparts') does not exists.\n", __func__);
		return -1;
	}

	strStart = strchr(str, prefix) + 1;
	strEnd = strchr(strStart, suffix);
	if (strStart == NULL || strEnd == NULL) {
		mvOsPrintf("%s:Error: Incorrect format of 'mtdparts' variable.\n", __func__);
		return -1;
	}
	strncpy(strSize , strStart, (strEnd - strStart));

	return simple_strtoul(strSize, NULL, 0) * _1M;

}

void recoveryHandle(cmd_tbl_t *cmdtp)
{
	char cmd[256];
	char img[10];
	char * args_to_func[3];
	char *str;
	MV_U32 uImageAddr, uImageSize;

	/* read 'mtdparts' to extract load address and size of uImage from NAND - in linux partition
	 * expected syntax for example :"mtdparts=armada-nand:4m(boot)ro,8m@4m(kernel),-(rootfs)" */
	str = getenv("mtdparts");

	/* Parse uImage offset and address from mtdparts */
	uImageAddr = parseIntFromString(str, ':' , 'm');
	uImageSize = parseIntFromString(str, ',' , 'm');

	if (uImageAddr == -1 || uImageSize == -1) {
		mvOsPrintf("%s:Error: Incorrect format of 'mtdparts' variable.\n",__func__);
		return;
	}
	sprintf(cmd, "setenv bootargs ${console} ${mtdparts} ubi.mtd=2 root=ubi0:rootfsU rootfstype=ubifs ${mvNetConfig}; nand read.e ${loadaddr} 0x%x 0x%x; bootm ${loadaddr};", uImageAddr, uImageSize);

	/* Load recovery image from tftp, according to env. variables */
	args_to_func[0] = "tftp";
	args_to_func[1] = getenv("loadaddr");;
	args_to_func[2] = getenv("rcvr_image");
	if ( !args_to_func[1] || !args_to_func[2]) {
		mvOsPrintf("%s:Error: requested variables ('loadaddr' and 'rcvr_image' ) does not exists.\n",__func__);
		return;
	}

	if (do_tftpb(cmdtp, 1, 3,args_to_func) != 0) {
		printf("\nError: Failed to receive recovery image. Aborting recovery process.\n");
		return;
	}

	mvOsDelay(100);

	/* after loading image and setting recovery boot command, save it for after reset */
	setenv("bootcmd",cmd);
	setenv("console","console=ttyS0,115200");
	saveenv();

	printf("\nPermanent bootcmd: %s\n", getenv("bootcmd"));
	printf("\nPermanent console: %s\n", getenv("console"));


	/* set temporary boot command, for recorvery process usage only */
	sprintf(cmd,"setenv bootargs ${console} ${mtdparts} root=/dev/ram0 ${mvNetConfig} recovery=static rcvrip=%s:%s%s  ethact=${ethact} ethaddr=%s eth1addr=%s; bootm ${loadaddr};", getenv("ipaddr"), getenv("serverip"), getenv("bootargs_end"), getenv("ethaddr"), getenv("eth1addr"));
	setenv("bootcmd", cmd);
	printf("\nRecovery bootcmd: %s\n", cmd);

	printf("Booting recovery image at: [%s]...\n", getenv("loadaddr"));
	sprintf(cmd, "boot");
	sprintf(img, "%s", getenv("loadaddr"));
	args_to_func[0] = cmd;
	args_to_func[1] = img;

	do_bootd(NULL, 0, 2, args_to_func);
}

int do_rcvr (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	recoveryHandle(cmdtp);
	return 1;
}

U_BOOT_CMD(
	rcvr,	3,	1,	do_rcvr,
	"rcvr\t- Start recovery process (with TFTP server)\n",
	"\n"
);
#endif
