/*******************************************************************************
   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_SAR)
#include "cpu/mvCpu.h"
#include "ctrlEnv/mvCtrlEnvRegs.h"
#include "ctrlEnv/mvCtrlEnvLib.h"
#include "boardEnv/mvBoardEnvLib.h"

extern MV_BOARD_INFO *marvellAC3BoardInfoTbl[];

/*
   bc2 sample and reset register
#     4f       #     4e       #     4d       #      4c      #
#              #              #              #              #
#--|--|--|--|--#--|--|--|--|--#--|--|--|--|--#--|--|--|--|--#
#  |  |  |  |  #  |  |  |  |  #  |  |  |  |  #  |  |  |  |  #
#--|--|--|--|--#--|--|--|--|--#--|--|--|--|--#--|--|--|--|--#
#  |           #  |        |  #     |        #              #
#-P|-R|bootsel-#-R|-TM-f---|-CPU-f--|-CORE-f-#-----devid----#
*/

enum { /* Update defaultValue[] if any change to this enum has made!*/
	CMD_CORE_CLK_FREQ = 0,
	CMD_CPU_DDR_REQ,
#ifdef CONFIG_BOBCAT2
	CMD_TM_FREQ,
	CMD_JTAG_CPU,
	CMD_PTP_PLL,
	CMD_OOB0_CON,
	CMD_OOB1_CON,
	CMD_PEX_GEN1,
#elif defined(CONFIG_ALLEYCAT3)
	CMD_PCIE_CLOCK,
	CMD_PLL_CLOCK,
	CMD_AVS_MODE,
	CMD_SLAVE_ADDR,
	CMD_DEVICE_NUM,
	CMD_BOARD_ID,
	CMD_DDR_ECC_EN,
#endif
	CMD_PCIE_MODE,
	CMD_BOOTSRC,
	CMD_DEVICE_ID,
	CMD_DUMP,
	CMD_DEFAULT,
	CMD_UNKNOWN
};


#ifdef CONFIG_BOBCAT2
	int defaultValue[] = { 0,	/* Core clock */
						   3,	/* CPU/DDR clock */
						   3,	/* TM frequency */
						   1,	/* JTAG CPU 1 == MSYS */
						   0,	/* PTP PLL */
						   0,	/* OOB0 connection */
						   0,	/* OOB1 connection */
						   0,	/* Force AMC RC GEN1 PCIe */
						   1,	/* PCIe mode */
						   3,	/* Boot source */
						   0 };	/* Device ID */
	MV_U32 coreClockTbl[] = MV_CORE_CLK_TBL_BC2;
	MV_CPUDDR_MODE cpuDdrClkTbl[] = MV_CPU_DDR_CLK_TBL_BC2;
#elif defined(CONFIG_ALLEYCAT3)
	int defaultValue[] = { 4,	/* Core clock */
						   3,	/* CPU/DDR clock */
						   0,	/* PCIe clock */
						   1,	/* PLL clock */
						   1,	/* AVS Mode */
						   1,	/* I2C/SMI Slave address */
						   0,	/* Device number */
						   0,	/* Board ID */
						   0,	/* DDR ECC enable */
						   0,	/* PCIe mode */
						   3,	/* Boot source */
						   0 };	/* Device ID */

	MV_U32 coreClockTbl[] = MV_CORE_CLK_TBL_AC3;
	MV_CPUDDR_MODE cpuDdrClkTbl[] = MV_CPU_DDR_CLK_TBL_AC3;
#else
#error "Unknown MSYS family!"
#endif

MV_TM_MODE tmClkTbl[] = MV_TM_CLK_TBL;

typedef struct {
	char bootstr[80];
	MV_STATUS internalFreq;
} MV_BOOT_SRC;

MV_BOOT_SRC bootSrcTbl[] = {
	{ "BootROM enabled, Boot from Device (NOR) flash",			MV_FALSE },
	{ "BootROM enabled, Boot from NAND flash (on DEV_CSn[0])",	MV_FALSE },
	{ "BootROM enabled, Boot from UART",						MV_FALSE },
	{ "BootROM enabled, Boot from SPI0 (CS0)",					MV_FALSE },
	{ "Reserved. BootROM enabled, Boot from PCIe",				MV_TRUE	},
	{ "BootROM enabled,Standby slave. Must set PCI-E as endpoint",	MV_FALSE },
	{ "BootROM enabled, UART debug prompt mode",				MV_FALSE },
	{ "Reserved BootROM disabled, Boot from SPI 0(CS0)",		MV_TRUE	}
};

void SatR_usage(void);

static int sar_cmd_get(const char *cmd)
{
#if defined CONFIG_ALLEYCAT3
	MV_U32 revId = mvCtrlRevGet();
#endif

	if (strcmp(cmd, "coreclock") == 0)
		return CMD_CORE_CLK_FREQ;
	if (strcmp(cmd, "freq") == 0)
		return CMD_CPU_DDR_REQ;
#ifdef CONFIG_BOBCAT2
	if (strcmp(cmd, "tmfreq") == 0)
		return CMD_TM_FREQ;
	if (strcmp(cmd, "jtagcpu") == 0)
		return CMD_JTAG_CPU;
	if (strcmp(cmd, "ptppll") == 0)
		return CMD_PTP_PLL;
	if (strcmp(cmd, "oob0con") == 0)
		return CMD_OOB0_CON;
	if (strcmp(cmd, "oob1con") == 0)
		return CMD_OOB1_CON;
	if (strcmp(cmd, "pciegen1") == 0)
		return CMD_PEX_GEN1;
#elif defined CONFIG_ALLEYCAT3
	if (strcmp(cmd, "pciclock") == 0)
		return CMD_PCIE_CLOCK;
	if (revId == MV_ALLEYCAT3_A0_ID) {
		if (strcmp(cmd, "pllclock") == 0)
			return CMD_PLL_CLOCK;
	} else {
		if (strcmp(cmd, "avsmode") == 0)
			return CMD_AVS_MODE;
	}
	if (strcmp(cmd, "slaveaddr") == 0)
		return CMD_SLAVE_ADDR;
	if (strcmp(cmd, "devicenum") == 0)
		return CMD_DEVICE_NUM;
	if (strcmp(cmd, "boardid") == 0)
		return CMD_BOARD_ID;
	if (strcmp(cmd, "ddreccenable") == 0)
		return CMD_DDR_ECC_EN;
#endif
	if (strcmp(cmd, "pcimode") == 0)
		return CMD_PCIE_MODE;
	if (strcmp(cmd, "bootsrc") == 0)
		return CMD_BOOTSRC;
	if (strcmp(cmd, "deviceid") == 0)
		return CMD_DEVICE_ID;
	if (strcmp(cmd, "dump") == 0)
		return CMD_DUMP;
	if (strcmp(cmd, "default") == 0)
		return CMD_DEFAULT;
	return CMD_UNKNOWN;
}

static int do_sar_list(int mode)
{
	int i;
#if defined CONFIG_ALLEYCAT3
	MV_U32 revId = mvCtrlRevGet();
#endif

	switch (mode) {
	case CMD_CORE_CLK_FREQ:
		printf("Determines the core clock frequency:\n");
		printf("\t| ID  | Core clock (MHz) |\n");
		printf("\t--------------------------\n");
		for (i = 0; i < 7; i++)
			printf("\t| %2d  |      %4d        |\n", i, coreClockTbl[i]);
		printf("\t--------------------------\n");
		break;
	case CMD_CPU_DDR_REQ:
		printf("Determines the CPU and DDR frequency:\n");
		printf("\t| ID  | CPU Freq (MHz) | DDR Freq (MHz) |\n");
		printf("\t-----------------------------------------\n");
		for (i = 0; i < 7; i++) {
			if (cpuDdrClkTbl[i].internalFreq)
				continue;
			printf("\t| %2d  |      %4d      |      %4d      |\n",
			       i, cpuDdrClkTbl[i].cpuFreq, cpuDdrClkTbl[i].ddrFreq);
		}
		printf("\t-----------------------------------------\n");
		break;
#ifdef CONFIG_BOBCAT2
	case CMD_TM_FREQ:
		printf("Determines the TM frequency:\n");
		printf("\t| ID  | TM Freq (MHz) | DDR Freq (MHz) |\n");
		printf("\t----------------------------------------\n");
		printf("\t|  0  |   Disabled    |                |\n");
		for (i = 1; i < 7; i++) {
			if (tmClkTbl[i].internalFreq)
				continue;
			printf("\t| %2d  |      %4d     |      %4d      |\n",
			       i, tmClkTbl[i].tmFreq, tmClkTbl[i].ddr3Freq);
		}
		printf("\t----------------------------------------\n");
		break;
	case CMD_JTAG_CPU:
		printf("Determines the JTAG to CPU connection:\n");
		printf("\t| ID  | JTAG connection |\n");
		printf("\t------------------------\n");
		printf("\t|  0  |  Cortex-M3      |\n");
		printf("\t|  1  |  MSYS (PJ4B)    |\n");
		printf("\t------------------------\n");
		break;
	case CMD_PTP_PLL:
		printf("Determines the PTP PLL multiplier configurtation:\n");
		printf("\t| ID  |  PTP PLL Multiplier |\n");
		printf("\t----------------------------\n");
		printf("\t|  0  |      20             |\n");
		printf("\t|  1  |      21.875         |\n");
		printf("\t----------------------------\n");
		break;
	case CMD_OOB0_CON:
	case CMD_OOB1_CON:
		printf("Determines the OOB port 0/1 to Physical port connection:\n");
		printf("\t| ID  | OOB port | Physical port   |\n");
		printf("\t-----------------------------------\n");
		printf("\t|  0  |    0     | 20 (back panel) |\n");
		printf("\t|  1  |    0     | 0 (front panel) |\n");
		printf("\t|  2  |    0     | Not connected   |\n");
		printf("\t-----------------------------------\n");
		printf("\t|  0  |    1     | 21 (back panel) |\n");
		printf("\t|  1  |    1     | 1 (front panel) |\n");
		printf("\t|  2  |    1     | Not connected   |\n");
		printf("\t-----------------------------------\n");
		break;
	case CMD_PEX_GEN1:
		printf("Determines the PCIe GEN1 enforcement mode om AMC RC:\n");
		printf("\t| ID  |   Force PCIe GEN1   |\n");
		printf("\t----------------------------\n");
		printf("\t|  0  |   Do not force      |\n");
		printf("\t|  1  |   Force GEN1        |\n");
		printf("\t----------------------------\n");
		break;
#elif defined CONFIG_ALLEYCAT3
	case CMD_DDR_ECC_EN:
		printf("Determines the DDR ECC status:\n");
		printf("\t| ID  |  ECC status    |\n");
		printf("\t------------------------\n");
		printf("\t|  0  |  ECC Disabled  |\n");
		printf("\t|  1  |  ECC Enabled   |\n");
		printf("\t------------------------\n");
		break;
	case CMD_PCIE_CLOCK:
		printf("Determines the PCI-E clock source:\n");
		printf("\t| ID  |           Clock source            |\n");
		printf("\t-------------------------------------------\n");
		printf("\t|  0  |  Internally generated by PLL      |\n");
		printf("\t|  1  |  External 100 MHz from PEX_CLK_P  |\n");
		printf("\t-------------------------------------------\n");
		break;
	case CMD_PLL_CLOCK:
		if (revId == MV_ALLEYCAT3_A0_ID) {
			printf("Determines the PLL VCO clock frequency:\n");
			printf("\t| ID  | Clock freq (GHz) |\n");
			printf("\t--------------------------\n");
			printf("\t|  0  |          1       |\n");
			printf("\t|  1  |         2.5      |\n");
			printf("\t--------------------------\n");
		} else
			printf("The filed is not available on this SoC revision\n");
		break;
	case CMD_AVS_MODE:
		if (revId != MV_ALLEYCAT3_A0_ID) {
			printf("Determines the AVS operation mode:\n");
			printf("\t| ID  |  Mode  |\n");
			printf("\t----------------\n");
			printf("\t|  0  | Slave  |\n");
			printf("\t|  1  | Master |\n");
			printf("\t----------------\n");
		} else
			printf("The filed is not available on this SoC revision\n");
		break;
	case CMD_SLAVE_ADDR:
		printf("Determines the CPU I2C/SMI address:\n");
		printf("\t| ID  | CPU_SMI_I2C_ADDR[2] |\n");
		printf("\t-----------------------------\n");
		printf("\t|  0  |          0          |\n");
		printf("\t|  1  |          1          |\n");
		printf("\t-----------------------------\n");
		break;
	case CMD_BOARD_ID:
		printf("Determines the board ID (0-7)\n");
		printf("\t| ID  |      Board               |\n");
		printf("\t----------------------------------\n");
		for (i = 0; i < AC3_MARVELL_BOARD_NUM ; i++)
			printf("\t|  %d  |  %-22s  |\n", i, marvellAC3BoardInfoTbl[i]->boardName );
		printf("\t----------------------------------\n");
		break;
	case CMD_DEVICE_NUM:
		printf("Determines the device number (0-3)\n");
		break;
#endif
	case CMD_PCIE_MODE:
		printf("Determines the PCI-E mode:\n");
		printf("\t| ID  |       Mode     |\n");
		printf("\t------------------------\n");
		printf("\t|  0  |  Endpoint      |\n");
		printf("\t|  1  |  Root Complex  |\n");
		printf("\t------------------------\n");
		break;
	case CMD_BOOTSRC:
		printf("Determines the Boot source device:\n");
		printf("\t| ID  | Boot Source description                                 |\n");
		printf("\t-----------------------------------------------------------------\n");
		for (i = 0; i < 7; i++) {
			if (bootSrcTbl[i].internalFreq)
				continue;
			printf("\t| %2d  | %s\n", i, bootSrcTbl[i].bootstr);
		}
		printf("\t-----------------------------------------------------------------\n");
		break;
	case CMD_DEVICE_ID:
		printf("Determines the device ID (0-31)\n");
		break;
	case CMD_UNKNOWN:
	default:
		printf("Usage: sar list [options] (see help) \n");
		return 1;
	}
	return 0;
}

static int do_sar_read(int mode)
{
	MV_U8 tmp, i;
#if defined CONFIG_ALLEYCAT3
	MV_U32 revId = mvCtrlRevGet();
#endif

	switch (mode) {
	case CMD_CORE_CLK_FREQ:
		if (mvBoardCoreFreqGet(&tmp) == MV_OK)
			printf("coreclock\t\t= %d ==>  Core @ %dMHz\n", tmp, coreClockTbl[tmp]);
		else
			printf("coreclock Error: failed reading Core Clock Frequency (PLL_0)\n");
		break;

	case CMD_CPU_DDR_REQ:
		if (mvBoardCpuFreqGet(&tmp) == MV_OK)
			printf("freq\t\t\t= %d ==>  CPU @ %dMHz DDR @ %dMHz \n", tmp,
			       cpuDdrClkTbl[tmp].cpuFreq, cpuDdrClkTbl[tmp].ddrFreq);
		else
			printf("freq Error: failed reading CPU/DDR Clocks Frequency (PLL_1)\n");
		break;

#ifdef CONFIG_BOBCAT2

	case CMD_TM_FREQ:
		if (mvBoardTmFreqGet(&tmp) == MV_OK)
			printf("tmfreq\t\t\t= %d ==>  TM @ %dMHz DDR3 @ %dMHz \n", tmp, tmClkTbl[tmp].tmFreq, tmClkTbl[tmp].ddr3Freq);
		else
			printf("tmfreq Error: failed reading TM Clock Frequency (PLL_2)\n");
		break;

	case CMD_JTAG_CPU:
		if (mvBoardJtagCpuGet(&tmp) == MV_OK)
			printf("jtagcpu \t\t= %d ==>  %s\n", tmp, ((tmp == 0) ? "Cortex-M3" : "MSYS (PJ4B)"));
		else
			printf("jtagcpu Error: failed reading JTAG connection type\n");
		break;

	case CMD_PTP_PLL:
		if (mvBoardPtpPllGet(&tmp) == MV_OK)
			printf("ptppll \t\t= %d ==>  %s\n", tmp, ((tmp == 0) ? "20" : "21.875"));
		else
			printf("ptppll Error: failed reading PTP PLL multiplier\n");
		break;

	case CMD_OOB0_CON:
	case CMD_OOB1_CON:
		i = mode == CMD_OOB0_CON ? 0 : 1;
		if (mvBoardOobPortConnectionGet(i, &tmp) == MV_OK) {
			if (tmp == 2)
				printf("oob%dcon \t\t= %d ==>  OOB port is disconnected\n", i, tmp);
			else
				printf("oob%dcon \t\t= %d ==>  Physical port %d\n", i, tmp, ((tmp == 1) ? i : (20 + i)));
		} else
			printf("oob%dcon Error: failed reading PTP PLL multiplier\n", i);
		break;

	case CMD_PEX_GEN1:
		if (mvBoardForcePexGen1Get(&tmp) == MV_OK)
			printf("pciegen1 \t\t= %d ==>  %s\n", tmp, ((tmp == 0) ? "Do not enforce GEN1" : "Force GEN1 connection"));
		else
			printf("pciegen1 Error: failed reading PCIe GEN1 enforcement mode\n");
		break;

#elif defined CONFIG_ALLEYCAT3
	case CMD_DDR_ECC_EN:
		if (mvBoardDdrEccEnableGet(&tmp) == MV_OK)
			printf("ddreccenable \t\t= %d ==>  %s\n", tmp,
				   ((tmp == 0) ? "ECC Disabled" : "ECC Enabled"));
		else
			printf("ddreccenable Error: failed reading DDR Bus Width\n");
		break;

	case CMD_PCIE_CLOCK:
		if (mvBoardPcieClockGet(&tmp) == MV_OK)
			printf("pciclock \t\t= %d ==>  %s\n", tmp,
				   ((tmp == 0) ? "Internally generated by PLL" : "External 100MHz from PEX_CLK_P"));
		else
			printf("pciclock Error: failed reading PCI-E clock\n");
		break;

	case CMD_PLL_CLOCK:
		if (revId == MV_ALLEYCAT3_A0_ID) {
			if (mvBoardPllClockGet(&tmp) == MV_OK)
				printf("pllclock (PLL2 VCO)\t= %d ==>  %s\n", tmp, ((tmp == 0) ? "1GHz" : "2.5GHz"));
			else
				printf("pllclock (PLL2 VCO) Error: failed reading PLL VCO clock\n");
		} else
			printf("pllclock (PLL2 VCO)\t    ==>  <<Not available in this SoC revision>>\n");
		break;

	case CMD_AVS_MODE:
		if (revId != MV_ALLEYCAT3_A0_ID) {
			if (mvBoardAvsModeGet(&tmp) == MV_OK)
				printf("avsmode \t\t= %d ==>  %s\n", tmp, ((tmp == 0) ? "Slave" : "Master"));
			else
				printf("avsmode Error: failed reading AVS mode\n");
		} else
			printf("avsmode \t\t    ==>  <<Not available on this SoC revision>>\n");
		break;

	case CMD_SLAVE_ADDR:
		if (mvBoardSmiI2c2AddrGet(&tmp) == MV_OK)
			printf("slaveaddr \t\t= %d ==>  CPU_SMI_I2C_ADDR[2]=%d\n", tmp, tmp);
		else
			printf("slaveaddr Error: failed reading CPU I2C/SMI Slave address\n");
		break;

	case CMD_DEVICE_NUM:
		if (mvBoardDeviceNumGet(&tmp) == MV_OK)
			printf("devicenum\t\t= %d \n", tmp);
		else
			printf("devicenum Error: failed reading devicenum\n");
		break;

	case CMD_BOARD_ID:
		if (mvBoardSarBoardIdGet(&tmp) == MV_OK)
			printf("boardid\t\t\t= %d ==>  %s\n", tmp, marvellAC3BoardInfoTbl[tmp]->boardName);
		else
			printf("boardid Error: failed reading boardid\n");
		break;

#endif
	case CMD_PCIE_MODE:
		if (mvBoardPcieModeGet(&tmp) == MV_OK)
			printf("pcimode \t\t= %d ==>  %s\n", tmp, ((tmp == 0) ? "Endpoint" : "Root Complex"));
		else
			printf("pcimode Error: failed reading PCI-E mode\n");
		break;

	case CMD_BOOTSRC:
		if (mvBoardBootDevGet(&tmp) == MV_OK)
			printf("bootsrc\t\t\t= %d ==>  %s\n", tmp, bootSrcTbl[tmp].bootstr);
		else
			printf("bootsrc Error: failed reading Boot Source\n");
		break;
	case CMD_DEVICE_ID:
		if (mvBoardDeviceIdGet(&tmp) == MV_OK)
			printf("deviceid\t\t= %d \n", tmp);
		else
			printf("deviceid Error: failed reading deviceid\n");
		break;

	case CMD_DUMP:
	case CMD_UNKNOWN:
		for (i = 0 ; i < CMD_DUMP; i++)
			do_sar_read(i);
		break;
	case CMD_DEFAULT:
		return 0;
	default:
		printf("Usage: sar list [options] (see help)\n");
		return 1;

	}
	return 0;
}

static int do_sar_write(int mode, int value)
{
	MV_U8 tmp, i;
	MV_STATUS rc = MV_OK;
#if defined CONFIG_ALLEYCAT3
	MV_U32 revId = mvCtrlRevGet();
#endif

	tmp = (MV_U8)value;
	switch (mode) {
	case CMD_CORE_CLK_FREQ:
		rc = mvBoardCoreFreqSet(tmp);
		break;
	case CMD_CPU_DDR_REQ:
		if (((value < 0) || (value >= ARRAY_SIZE(cpuDdrClkTbl))) ||
			(cpuDdrClkTbl[value].internalFreq != MV_FALSE)) {
			mvOsPrintf("S@R incorrect value for Freq: %d\n", value);
			rc = MV_ERROR;
			break;
		}
		rc = mvBoardCpuFreqSet(tmp);
		break;
#ifdef CONFIG_BOBCAT2
	case CMD_TM_FREQ:
		if (((value < 0) || (value >= ARRAY_SIZE(tmClkTbl))) ||
			(tmClkTbl[value].internalFreq != MV_FALSE)) {
			mvOsPrintf("S@R incorrect value for TM Freq: %d\n", value);
			rc = MV_ERROR;
			break;
		}
		rc = mvBoardTmFreqSet(tmp);
		break;
	case CMD_JTAG_CPU:
		rc = mvBoardJtagCpuSet(tmp);
		break;
	case CMD_PTP_PLL:
		rc = mvBoardPtpPllSet(tmp);
		break;
	case CMD_OOB0_CON:
	case CMD_OOB1_CON:
		rc = mvBoardOobPortConnectionSet((mode == CMD_OOB0_CON ? 0 : 1), tmp);
		break;
	case CMD_PEX_GEN1:
		rc = mvBoardForcePexGen1Set(tmp);
		break;
#elif defined CONFIG_ALLEYCAT3
	case CMD_DDR_ECC_EN:
		rc = mvBoardDdrEccEnableSet(tmp);
		break;
	case CMD_PCIE_CLOCK:
		rc = mvBoardPcieClockSet(tmp);
		break;
	case CMD_PLL_CLOCK:
		if (revId == MV_ALLEYCAT3_A0_ID)
			rc = mvBoardPllClockSet(tmp);
		break;
	case CMD_AVS_MODE:
		if (revId != MV_ALLEYCAT3_A0_ID)
			rc = mvBoardAvsModeSet(tmp);
		break;
	case CMD_SLAVE_ADDR:
		rc = mvBoardSmiI2c2AddrSet(tmp);
		break;
	case CMD_BOARD_ID:
		rc = mvBoardSarBoardIdSet(tmp);
		break;
	case CMD_DEVICE_NUM:
		rc = mvBoardDeviceNumSet(tmp);
		break;
#endif
	case CMD_PCIE_MODE:
		rc = mvBoardPcieModeSet(tmp);
		break;
	case CMD_BOOTSRC:
		rc = mvBoardBootDevSet(tmp);
		break;
	case CMD_DEVICE_ID:
		rc = mvBoardDeviceIdSet(tmp);
		break;
	case CMD_DEFAULT:
		for (i = 0 ; i < CMD_DUMP; i++) {
#if defined CONFIG_ALLEYCAT3
			if (i == CMD_BOARD_ID) {
				MV_U32 brdId = mvBoardIdGet();
				if ((brdId < AC3_MARVELL_BOARD_ID_BASE) || (brdId >= AC3_MARVELL_MAX_BOARD_ID))
					mvOsPrintf("Bad Board ID returned - %d! Assigning default value!\n", brdId);
				else
					defaultValue[i] = brdId - AC3_MARVELL_BOARD_ID_BASE; /* Update default value with real board ID*/
			}
#endif /* CONFIG_ALLEYCAT3 */
			if (1 == do_sar_write(i, defaultValue[i]))
				rc = MV_FALSE;
			do_sar_read(i);
		}
		if (rc == MV_OK)
			mvOsPrintf("\nRestored all S@R default values\n");
		break;
	case CMD_UNKNOWN:
	default:
		printf("Usage: sar list [options] (see help) \n");
		return 1;
	}
	if (rc != MV_OK) {
		mvOsPrintf("Write S@R failed!\n");
		return 1;
	}
	return 0;
}

int do_sar(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
{
	const char *cmd;
	int mode, value;

	/* need at least two arguments */
	if (argc < 2)
		goto usage;

	cmd = argv[1];
	mode = sar_cmd_get(argv[2]);

#if defined CONFIG_ALLEYCAT3
	if(mvBoardIdGet() != DB_AC3_ID && mode != CMD_BOARD_ID) {
		mvOsPrintf("Error: Sample at reset supports modifying only 'boardid' field for current board\n\n");
		goto usage;
	}
#endif

	if (strcmp(cmd, "list") == 0)
		return do_sar_list(mode);
	else if (strcmp(cmd, "write") == 0) {
		value = simple_strtoul(argv[3], NULL, 10);
		if (do_sar_write(mode, value) == 0)
			do_sar_read(mode);
		return 0;

	} else if (strcmp(cmd, "read") == 0)
		return do_sar_read(mode);

usage:
	cmd_usage(cmdtp);
	return 1;
}

U_BOOT_CMD(SatR, 6, 1, do_sar,
	"Sample At Reset sub-system",
     "list <field>          - list configuration options for <field>\n\n"
"SatR read dump             - print all SatR configuration values\n"
"SatR read <field>          - print the requested <field> value\n\n"
"SatR write default         - restore all SatR fields to their default values\n"
"SatR write <field> <val>   - write the requested <field> <value>\n\n"

"\tHW SatR fields\n"
"\t--------------\n"
"coreclock                  - Core frequency\n"
"freq                       - CPU DDR frequency\n"
"pcimode                    - PCIe mode (EP/RC)\n"
#ifdef CONFIG_BOBCAT2
"tmfreq                     - TM frequency\n"
"jtagcpu                    - JTAG CPU connection\n"
"ptppll                     - PTP PLL multiplier\n"
"oob0con                    - OOB-0 to physical port connection\n"
"oob1con                    - OOB-1 to physical port connection\n"
"pciegen1                   - Force PCIe GEN1 on AMC RC connection\n"
#elif defined CONFIG_ALLEYCAT3
"pciclock                   - PCIe reference clock source\n"
"avsmode                    - Adaptive Voltage Scaling mode. Not valid for rev.A0\n"
"slaveaddr                  - I2C/SMI Slave Address\n"
"devicenum                  - Devicenum\n"
#endif
"bootsrc                    - Boot source\n"
"deviceid                   - Device ID\n"
#ifdef CONFIG_ALLEYCAT3
"\t----Legacy fileds----\n"
"pllclock                   - PLL2 VCO clock frequency. Valid for rev.A0 only\n"
"\n\tSW SatR fields\n"
"\t--------------\n"
"ddreccenable               - DDR ECC modes\n"
"boardid                    - Board ID\n"
#endif
);
#endif /*defined(CONFIG_CMD_SAR)*/
