/*******************************************************************************
   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"

#if defined CONFIG_ALLEYCAT3
	extern MV_BOARD_INFO *marvellAC3BoardInfoTbl[];
	MV_BOARD_INFO **mvMsysBoardInfoTbl = marvellAC3BoardInfoTbl;
#else
	extern MV_BOARD_INFO *marvellBC2BoardInfoTbl[];
	MV_BOARD_INFO **mvMsysBoardInfoTbl = marvellBC2BoardInfoTbl;
#endif
/*
   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_DDR_ECC_EN,
#endif
	CMD_BOARD_ID,
	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 */
						   0,	/* Board ID */
						   0,	/* 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,	/* DDR ECC enable */
						   0,	/* Board ID */
						   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, "ddreccenable") == 0)
		return CMD_DDR_ECC_EN;
#endif
	if (strcmp(cmd, "boardid") == 0)
		return CMD_BOARD_ID;
	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_DEVICE_NUM:
		printf("Determines the device number (0-3)\n");
		break;
#endif
	case CMD_BOARD_ID:
		printf("Determines the board ID (0-7)\n");
		printf("\t| ID  |      Board               |\n");
		printf("\t----------------------------------\n");
		for (i = 0; i < MV_MARVELL_BOARD_NUM ; i++)
			printf("\t|  %d  |  %-22s  |\n", i, mvMsysBoardInfoTbl[i]->boardName );
		printf("\t----------------------------------\n");
		break;
	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;

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

	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_DEVICE_NUM:
		rc = mvBoardDeviceNumSet(tmp);
		break;
#endif
	case CMD_BOARD_ID:
		rc = mvBoardSarBoardIdSet(tmp);
		break;
	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 (i == CMD_BOARD_ID) {
				MV_U32 brdId = mvBoardIdGet();
				if ((brdId < MARVELL_BOARD_ID_BASE) || (brdId >= MV_MAX_MARVELL_BOARD_ID))
					mvOsPrintf("Bad Board ID returned - %d! Assigning default value!\n", brdId);
				else
					defaultValue[i] = brdId - MARVELL_BOARD_ID_BASE; /* Update default value with real board ID*/
			}
			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(mvBoardIdGet() != MV_DEFAULT_BOARD_ID && mode != CMD_BOARD_ID) {
		mvOsPrintf("Error: Sample at reset supports modifying only 'boardid' field for current board\n\n");
		goto usage;
	}

	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"
"\n\tSW SatR fields\n"
"\t--------------\n"
"boardid                    - Board ID\n"
#ifdef CONFIG_ALLEYCAT3
"ddreccenable               - DDR ECC modes\n"
"\t----Legacy fileds----\n"
"pllclock                   - PLL2 VCO clock frequency. Valid for rev.A0 only\n"
#endif
);
#endif /*defined(CONFIG_CMD_SAR)*/
