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

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
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.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	    this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above copyright
	notice, this list of conditions and the following disclaimer in the
	documentation and/or other materials provided with the distribution.

    *   Neither the name of Marvell nor the names of its contributors may be
	used to endorse or promote products derived from this software without
	specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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

#include "ctrlEnv/mvCtrlEnvLib.h"
#include "ctrlEnv/mvCtrlEnvSpec.h"
#include "boardEnv/mvBoardEnvLib.h"
#include "ctrlEnv/sys/mvCpuIf.h"
#include "cpu/mvCpu.h"
#include "cntmr/mvCntmr.h"
#include "gpp/mvGpp.h"
#include "twsi/mvTwsi.h"
#include "pex/mvPex.h"
#include "device/mvDevice.h"
#include "neta/gbe/mvEthRegs.h"

#if defined(CONFIG_MV_ETH_NETA)
#include "neta/gbe/mvEthRegs.h"
#endif

#include "gpp/mvGppRegs.h"

/* defines  */
#undef MV_DEBUG
#ifdef MV_DEBUG
#define DB(x)	x
#define DB1(x)	x
#else
#define DB(x)
#define DB1(x)
#endif

extern MV_BOARD_INFO *marvellBC2BoardInfoTbl[];
extern MV_BOARD_INFO *customerBC2BoardInfoTbl[];
extern MV_BOARD_INFO *marvellAC3BoardInfoTbl[];
extern MV_BOARD_INFO *customerAC3BoardInfoTbl[];
/* Global variables should be removed from BSS (set to a non-zero value)
   for avoiding memory corruption during early access upon code relocation */
static MV_BOARD_INFO *board = (MV_BOARD_INFO *)-1;

/* Locals */
static MV_DEV_CS_INFO *mvBoardGetDevEntry(MV_32 devNum, MV_BOARD_DEV_CLASS devClass);
/*******************************************************************************
* mvBoardisUsbPortConnected
*
* DESCRIPTION:
*	return True if requested USB type and port num exists on current board
*
* INPUT:
*	usbTypeID       - requested USB type : USB3_UNIT_ID / USB_UNIT_ID
*	usbPortNumbder  - requested USB port number (according to xHCI MAC port num)
*
* OUTPUT: None
*
* RETURN: MV_TRUE if requested port/type exist on board

*******************************************************************************/
MV_BOOL mvBoardIsUsbPortConnected(MV_UNIT_ID usbTypeID, MV_U8 usbPortNumber)
{
	MV_U16 family = mvCtrlDevFamilyIdGet(0);

	if (family == MV_BOBCAT2_DEV_ID)
		return MV_FALSE;/*BobCat2 SoC has no usb port*/

	if (family == MV_ALLEYCAT3_DEV_ID && usbTypeID == USB_UNIT_ID && usbPortNumber == 0)
		return MV_TRUE; /*AlleyCat3 SoC board has only one usb2 port */

	return MV_FALSE;
}

/*******************************************************************************
* mvBoardIdIndexGet
*
* DESCRIPTION:
*	returns an index for board arrays with direct memory access, according to board id
*
* INPUT:
*       boardId.
*
* OUTPUT:
*       direct access index for board arrays
*
* RETURN:
*       None.
*
*******************************************************************************/
MV_U32 mvBoardIdIndexGet(MV_U32 boardId)
{
/* Marvell Boards use 0x10 as base for Board ID: mask MSB to receive index for board ID*/
	return boardId & (BOARD_ID_INDEX_MASK - 1);
}

/*******************************************************************************
* mvBoardEnvInit - Init board
*
* DESCRIPTION:
*		In this function the board environment take care of device bank
*		initialization.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       None.
*
*******************************************************************************/
MV_VOID mvBoardEnvInit(MV_VOID)
{
	MV_U32 nandDev;
	MV_U32 norDev;

	mvBoardSet(mvBoardIdGet());

	nandDev = mvBoardGetDevCSNum(0, BOARD_DEV_NAND_FLASH);
	if (nandDev != 0xFFFFFFFF) {
		/* Set NAND interface access parameters */
		nandDev = BOOT_CS;
		MV_REG_WRITE(DEV_BANK_PARAM_REG(nandDev), board->nandFlashReadParams);
		MV_REG_WRITE(DEV_BANK_PARAM_REG_WR(nandDev), board->nandFlashWriteParams);
		MV_REG_WRITE(DEV_NAND_CTRL_REG, board->nandFlashControl);
	}

	norDev = mvBoardGetDevCSNum(0, BOARD_DEV_NOR_FLASH);
	if (norDev != 0xFFFFFFFF) {
		/* Set NOR interface access parameters */
		MV_REG_WRITE(DEV_BANK_PARAM_REG(norDev), board->norFlashReadParams);
		MV_REG_WRITE(DEV_BANK_PARAM_REG_WR(norDev), board->norFlashWriteParams);
		MV_REG_WRITE(DEV_BUS_SYNC_CTRL, 0x11);
	}

	/* Set GPP Out value */
	MV_REG_WRITE(GPP_DATA_OUT_REG(0), board->gppOutValLow);
	MV_REG_WRITE(GPP_DATA_OUT_REG(1), board->gppOutValMid);

	/* set GPP polarity */
	mvGppPolaritySet(0, 0xFFFFFFFF, board->gppPolarityValLow);
	mvGppPolaritySet(1, 0xFFFFFFFF, board->gppPolarityValMid);

	/* Set GPP Out Enable */
	mvGppTypeSet(0, 0xFFFFFFFF, board->gppOutEnValLow);
	mvGppTypeSet(1, 0xFFFFFFFF, board->gppOutEnValMid);

#ifndef CONFIG_CUSTOMER_BOARD_SUPPORT
	mvBoardOobPortCfgSet();
#endif

}

/*******************************************************************************
* mvBoardModelGet - Get Board model
*
* DESCRIPTION:
*       This function returns 16bit describing board model.
*       Board model is constructed of one byte major and minor numbers in the
*       following manner:
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       String describing board model.
*
*******************************************************************************/
MV_U16 mvBoardModelGet(MV_VOID)
{
	MV_U8 modelId;
	if (MV_ERROR == mvBoardTwsiRead(BOARD_DEV_TWSI_PLD, 0, 0, &modelId)) {
		mvOsWarning();
		return INVALID_BOARD_ID;
	}

	return (MV_U16)modelId;
}
/*******************************************************************************
* mbBoardRevlGet - Get Board revision
*
* DESCRIPTION:
*       This function returns a 32bit describing the board revision.
*       Board revision is constructed of 4bytes. 2bytes describes major number
*       and the other 2bytes describes minor munber.
*       For example for board revision 3.4 the function will return
*       0x00030004.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       String describing board model.
*
*******************************************************************************/
MV_U16 mvBoardRevGet(MV_VOID)
{
	return mvBoardIdIndexGet(mvBoardIdGet()) & 0xFFFF;
}
/*******************************************************************************
* mvBoardNameGet - Get Board name
*
* DESCRIPTION:
*       This function returns a string describing the board model and revision.
*       String is extracted from board I2C EEPROMboard.
*
* INPUT:
*       None.
*
* OUTPUT:
*       pNameBuff - Buffer to contain board name string. Minimum size 32 chars.
*
* RETURN:
*
*       MV_ERROR if informantion can not be read.
*******************************************************************************/
MV_STATUS mvBoardNameGet(char *pNameBuff)
{
	mvOsSPrintf(pNameBuff, "%s", board->boardName);
	return MV_OK;
}

/*******************************************************************************
* mvBoardIsEthConnected - detect if a certain Ethernet port is Connected
*
* DESCRIPTION:
*	This routine returns true if a certain Ethernet port is Connected
*
* INPUT:
*	ethNum - index of the ethernet port requested
*
* OUTPUT:
*	None.
*
* RETURN:
*	MV_TRUE if the requested ethernet port is connected.
*
*******************************************************************************/
MV_BOOL mvBoardIsEthConnected(MV_U32 ethNum)
{
	if (ethNum <= mvCtrlEthMaxPortGet())
		return MV_TRUE;

	return MV_FALSE;
}

/*******************************************************************************
* mvBoardIsEthActive - this routine indicate which ports can be used by U-Boot
*
* DESCRIPTION:
*	This routine returns true if a certain Ethernet port is
*	Active and usable as a regular eth interface
*
* INPUT:
*	ethNum - index of the ethernet port requested
*
* OUTPUT:
*	None.
*
* RETURN:
*	MV_TRUE if the requested ethernet port is Active and usable.
*
*******************************************************************************/
MV_BOOL mvBoardIsEthActive(MV_U32 ethNum)
{
	/* for Msys, all connected ports are Active and usabe */
	return mvBoardIsEthConnected(ethNum);
}

/*******************************************************************************
* mvBoardIsPortInSgmii -
*
* DESCRIPTION:
*       This routine returns MV_TRUE for port number works in SGMII or MV_FALSE
*	For all other options.
*
* INPUT:
*       ethPortNum - Ethernet port number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_TRUE - port in SGMII.
*       MV_FALSE - other.
*
*******************************************************************************/
MV_BOOL mvBoardIsPortInSgmii(MV_U32 ethPortNum)
{
	return MV_TRUE;
}
/*******************************************************************************
* mvBoardIsPortInGmii -
*
* DESCRIPTION:
*       This routine returns MV_TRUE for port number works in GMII or MV_FALSE
*	For all other options.
*
* INPUT:
*       ethPortNum - Ethernet port number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_TRUE - port in SGMII.
*       MV_FALSE - other.
*
*******************************************************************************/
MV_BOOL mvBoardIsPortInGmii(MV_U32 ethPortNum)
{
	return MV_FALSE;
}

/*******************************************************************************
* mvBoardPortTypeGet
*
* DESCRIPTION:
*       This routine returns port type
*
* INPUT:
*       ethPortNum - Ethernet port number.
*
* OUTPUT:
*       None
*
* RETURN:
*       Mode of the port
*
*******************************************************************************/
MV_U32 mvBoardPortTypeGet(MV_U32 ethPortNum)
{
	if (mvBoardIsPortInSgmii(ethPortNum))
		return MV_PORT_TYPE_SGMII;
	else
		return MV_PORT_TYPE_RGMII;
}

/*******************************************************************************
* mvBoardIsPortInMii
*
* DESCRIPTION:
*	This routine returns MV_TRUE for port number works in MII or MV_FALSE
*	For all other options.
*
* INPUT:
*       ethPortNum - Ethernet port number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_TRUE - port in MII.
*       MV_FALSE - other.
*
*******************************************************************************/
MV_BOOL mvBoardIsPortInMii(MV_U32 ethPortNum)
{
	return MV_FALSE;
}
/*******************************************************************************
* mvBoardSwitchCpuPortGet - Get the the Ethernet Switch CPU port
*
* DESCRIPTION:
*       This routine returns the Switch CPU port.
*
* INPUT:
*       switchIdx - index of the switch. Only 0 is supported.
*
* OUTPUT:
*       None.
*
* RETURN:
*       the Switch CPU port, -1 if the switch is not connected.
*
*******************************************************************************/
MV_32 mvBoardSwitchCpuPortGet(MV_U32 switchIdx)
{
	if ((board->switchInfoNum == 0) || (switchIdx >= board->switchInfoNum))
		return -1;

	return board->pSwitchInfo[switchIdx].cpuPort;
}

/*******************************************************************************
* mvBoardPhyAddrGet - Get the phy address
*
* DESCRIPTION:
*       This routine returns the Phy address of a given ethernet port.
*
* INPUT:
*       ethPortNum - Ethernet port number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       32bit describing Phy address, -1 if the port number is wrong.
*
*******************************************************************************/
MV_32 mvBoardPhyAddrGet(MV_U32 ethPortNum)
{
	return board->pBoardMacInfo[ethPortNum].boardEthSmiAddr;
}

MV_BOOL mvBoardIsPortInRgmii(MV_U32 ethPortNum)
{
	return !mvBoardIsPortInGmii(ethPortNum) && !mvBoardIsPortInSgmii(ethPortNum);
}
/*******************************************************************************
* mvBoardQuadPhyAddr0Get - Get the PHY address
*
* DESCRIPTION:
*       This routine returns the PHY address of a given Ethernet port.
*       Required to initialize QUAD PHY through a specific PHY address
*
* INPUT:
*       ethPortNum - Ethernet port number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       32bit describing PHY address, -1 if the port number is wrong.
*
*******************************************************************************/
MV_32 mvBoardQuadPhyAddr0Get(MV_U32 ethPortNum)
{
	if (ethPortNum >= board->numBoardMacInfo) {
		DB(mvOsPrintf("%s: Error: invalid ethPortNum (%d)\n", __func__, ethPortNum));
		return MV_ERROR;
	}

	return board->pBoardMacInfo[ethPortNum].boardEthSmiAddr0;
}

/*******************************************************************************
* mvBoardMacSpeedGet - Get the Mac speed
*
* DESCRIPTION:
*       This routine returns the Mac speed if pre define of a given ethernet port.
*
* INPUT:
*       ethPortNum - Ethernet port number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_BOARD_MAC_SPEED, -1 if the port number is wrong.
*
*******************************************************************************/
MV_BOARD_MAC_SPEED mvBoardMacSpeedGet(MV_U32 ethPortNum)
{
	return board->pBoardMacInfo[ethPortNum].boardMacSpeed;
}

/*******************************************************************************
* mvBoardTclkGet - Get the board Tclk (Controller clock)
*
* DESCRIPTION:
*       This routine extract the controller core clock.
*       This function uses the controller counters to make identification.
*		Note: In order to avoid interference, make sure task context switch
*		and interrupts will not occure during this function operation
*
* INPUT:
*       countNum - Counter number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       32bit clock cycles in Hertz.
*
*******************************************************************************/
MV_U32 mvBoardTclkGet(MV_VOID)
{
	return 200000000; /* constant Tclock @ 200MHz (not Sampled@Reset)  */
}

/*******************************************************************************
* mvBoardSysClkGet - Get the board SysClk (CPU bus clock , i.e. DDR clock)
*
* DESCRIPTION:
*       This routine extract the CPU bus clock.
*
* INPUT:
*       countNum - Counter number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       32bit clock cycles in Hertz.
*
*******************************************************************************/
MV_U32 mvBoardSysClkGet(MV_VOID)
{
	MV_U32		idx;
	MV_U32		freq_tbl_bc2[] = MV_CORE_CLK_TBL_BC2;
	MV_U32		freq_tbl_ac3[] = MV_CORE_CLK_TBL_AC3;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	idx = MSAR_CORE_CLK(MV_DFX_REG_READ(DFX_DEVICE_SAR_REG(0)), MV_DFX_REG_READ(DFX_DEVICE_SAR_REG(1)));

	if (idx >= 7)
		return 0xFFFFFFFF;

	if (family == MV_BOBCAT2_DEV_ID)
		return freq_tbl_bc2[idx] * 1000000;
	else if (family == MV_ALLEYCAT3_DEV_ID)
		return freq_tbl_ac3[idx] * 1000000;
	else
		return 0xFFFFFFFF;
}

/*******************************************************************************
* mvBoarGpioPinGet - mvBoarGpioPinGet
*
* DESCRIPTION:
*
* INPUT:
*		gppClass - MV_BOARD_GPP_CLASS enum.
*
* OUTPUT:
*		None.
*
* RETURN:
*       GPIO pin number. The function return -1 for bad parameters.
*
*******************************************************************************/
MV_32 mvBoarGpioPinNumGet(MV_BOARD_GPP_CLASS gppClass, MV_U32 index)
{
	MV_U32 i, indexFound = 0;

	for (i = 0; i < board->numBoardGppInfo; i++) {
		if (board->pBoardGppInfo[i].devClass == gppClass) {
			if (indexFound == index)
				return (MV_U32) board->pBoardGppInfo[i].gppPinNum;
			else
				indexFound++;
		}
	}
	return MV_ERROR;
}

/*******************************************************************************
* mvBoardReset - mvBoardReset
*
* DESCRIPTION:
*			Reset the board
* INPUT:
*		None.
*
* OUTPUT:
*		None.
*
* RETURN:
*       None
*
*******************************************************************************/
MV_VOID mvBoardReset(MV_VOID)
{
	MV_32 resetPin;

	/* Get gpp reset pin if define */
	resetPin = mvBoardResetGpioPinGet();
	if (resetPin != MV_ERROR)
		MV_REG_BIT_RESET(GPP_DATA_OUT_REG((int)(resetPin/32)), (1 << (resetPin % 32)));
	else {
		/* No gpp reset pin was found, try to reset using system reset out */
		MV_REG_BIT_SET( CPU_RSTOUTN_MASK_REG , BIT0);
		MV_REG_BIT_SET( CPU_SYS_SOFT_RST_REG , BIT0);
	}
}

/*******************************************************************************
* mvBoardResetGpioPinGet - mvBoardResetGpioPinGet
*
* DESCRIPTION:
*
* INPUT:
*		None.
*
* OUTPUT:
*		None.
*
* RETURN:
*       GPIO pin number. The function return -1 for bad parameters.
*
*******************************************************************************/
MV_32 mvBoardResetGpioPinGet(MV_VOID)
{
	return mvBoarGpioPinNumGet(BOARD_GPP_RESET, 0);
}

/*******************************************************************************
* mvBoardSDIOGpioPinGet - mvBoardSDIOGpioPinGet
*
* DESCRIPTION:
*	used for hotswap detection
* INPUT:
*	type - Type of SDIO GPP to get.
*
* OUTPUT:
*	None.
*
* RETURN:
*       GPIO pin number. The function return -1 for bad parameters.
*
*******************************************************************************/
MV_32 mvBoardSDIOGpioPinGet(MV_BOARD_GPP_CLASS type)
{
	if ((type != BOARD_GPP_SDIO_POWER) && (type != BOARD_GPP_SDIO_DETECT) && (type != BOARD_GPP_SDIO_WP))
		return MV_FAIL;

	return mvBoarGpioPinNumGet(type, 0);
}

/*******************************************************************************
* mvBoardGpioIntMaskGet - Get GPIO mask for interrupt pins
*
* DESCRIPTION:
*		This function returns a 32-bit mask of GPP pins that connected to
*		interrupt generating sources on board.
*		For example if UART channel A is hardwired to GPP pin 8 and
*		UART channel B is hardwired to GPP pin 4 the fuinction will return
*		the value 0x000000110
*
* INPUT:
*		None.
*
* OUTPUT:
*		None.
*
* RETURN:
*		See description. The function return -1 if board is not identified.
*
*******************************************************************************/
MV_U32 mvBoardGpioIntMaskGet(MV_U32 gppGrp)
{
	switch (gppGrp) {
	case (0):
		return board->intsGppMaskLow;
		break;
	case (1):
		return board->intsGppMaskMid;
		break;
	case (2):
		return board->intsGppMaskHigh;
		break;
	default:
		return MV_ERROR;
	}
}

/*******************************************************************************
* mvBoardMppGet - Get board dependent MPP register value
*
* DESCRIPTION:
*	MPP settings are derived from board design.
*	MPP group consist of 8 MPPs. An MPP group represents MPP
*	control register.
*       This function retrieves board dependend MPP register value.
*
* INPUT:
*       mppGroupNum - MPP group number.
*
* OUTPUT:
*       None.
*
* RETURN:
*       32bit value describing MPP control register value.
*
*******************************************************************************/
MV_32 mvBoardMppGet(MV_U32 mppGroupNum)
{
	MV_U32 mppMod;

	mppMod = board->pBoardModTypeValue->boardMppMod;
	if (mppMod >= board->numBoardMppConfigValue)
		mppMod = 0; /* default */

	return board->pBoardMppConfigValue[mppMod].mppGroup[mppGroupNum];
}

/*******************************************************************************
* mvBoardGppConfigGet
*
* DESCRIPTION:
*	Get board configuration according to the input configuration GPP's.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*	The value of the board configuration GPP's.
*
*******************************************************************************/
MV_U32 mvBoardGppConfigGet(void)
{
	MV_U32 gpp, i, result = 0;

	for (i = 0; i < board->numBoardGppInfo; i++) {
		if (board->pBoardGppInfo[i].devClass == BOARD_GPP_CONF) {
			gpp = board->pBoardGppInfo[i].gppPinNum;
			result <<= 1;
			result |= (mvGppValueGet(gpp >> 5, 1 << (gpp & 0x1F)) >> (gpp & 0x1F));
		}
	}
	return result;

}

/*******************************************************************************
* mvBoardIsGbEPortConnected
*
* DESCRIPTION:
*	Checks if a given GbE port is actually connected to the GE-PHY, internal Switch or any RGMII module.
*
* INPUT:
*	port - GbE port number (0 or 1).
*
* OUTPUT:
*       None.
*
* RETURN:
*	MV_TRUE if port is connected, MV_FALSE otherwise.
*
*******************************************************************************/
MV_BOOL mvBoardIsGbEPortConnected(MV_U32 ethPortNum)
{
	if ((ethPortNum + 1) <= board->numBoardMacInfo)
		return MV_TRUE;
	else
		return MV_FALSE;
}

/*******************************************************************************
* mvBoardCpldConfigurationGet
*
* DESCRIPTION:
*	build a string with CPLD configuration: Board and CPLD revision.
*
* INPUT:
*	None.
*
* OUTPUT:
*       None.
*
* RETURN:
*	string in the following format: ", Rev <BOARD_REV>, CPLD Rev <CPLD_REV>"
*
*******************************************************************************/
MV_VOID mvBoardCpldConfigurationGet(char *str)
{
	MV_U8 cpldTwsiDev, cpldConfig;
	MV_U8 cpldBoardRevReg = CPLD_BOARD_REV_REG;
	MV_U16 boardModel;

	/* Prevent the caller function from printing the same string twice if this function fails */
	*str = 0;

	cpldTwsiDev = mvBoardTwsiAddrGet(BOARD_DEV_TWSI_PLD, 0);

	/* verify that CPLD device is available on current board, else return*/
	if (cpldTwsiDev == 0xff || mvTwsiProbe(cpldTwsiDev, mvBoardTclkGet()) != MV_TRUE)
		return;

	boardModel = mvBoardModelGet();
	if (boardModel == RD_MTL_BC2_PCB_ID)
		cpldBoardRevReg = CPLD_RD_MTL_BC2_BOARD_REV_REG;

	/* Read Board Revision */
	if (MV_ERROR == mvBoardTwsiRead(BOARD_DEV_TWSI_PLD, 0, cpldBoardRevReg, &cpldConfig)) {
		mvOsPrintf("\n%s: Error: failed reading board Revision from CPLD.\n", __func__);
		return;
	}
	sprintf(str, ", Rev %d" , cpldConfig & CPLD_BOARD_REV_MASK);

	/* Read CPLD Revision */
	if (boardModel != RD_MTL_BC2_PCB_ID) {
		if (MV_ERROR == mvBoardTwsiRead(BOARD_DEV_TWSI_PLD, 0, CPLD_REV_REG, &cpldConfig)) {
			mvOsPrintf("\n%s: Error: failed reading CPLD Revision from CPLD.\n", __func__);
			return;
		}
		sprintf(str, "%s, CPLD Rev %d", str, cpldConfig & CPLD_BOARD_REV_MASK);
	}
}

/* Board devices API managments */

/*******************************************************************************
* mvBoardGetDeviceNumber - Get number of device of some type on the board
*
* DESCRIPTION:
*
* INPUT:
*		devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*       None.
*
* RETURN:
*       If the device is found on the board the then the functions returns the
*		number of those devices else the function returns 0
*
*
*******************************************************************************/
MV_32 mvBoardGetDevicesNumber(MV_BOARD_DEV_CLASS devClass)
{
	MV_U32 foundIndex = 0, devNum;

	for (devNum = START_DEV_CS; devNum < board->numBoardDeviceIf; devNum++) {
		if (board->pDevCsInfo[devNum].devClass == devClass)
			foundIndex++;
	}

	return foundIndex;
}

/*******************************************************************************
* mvBoardGetDeviceBaseAddr - Get base address of a device existing on the board
*
* DESCRIPTION:
*
* INPUT:
*       devIndex - The device sequential number on the board
*		devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*       None.
*
* RETURN:
*       If the device is found on the board the then the functions returns the
*	Base address else the function returns 0xffffffff
*
*
*******************************************************************************/
MV_32 mvBoardGetDeviceBaseAddr(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_DEV_CS_INFO *devEntry;

	devEntry = mvBoardGetDevEntry(devNum, devClass);
	if (devEntry != NULL)
		return mvCpuIfTargetWinBaseLowGet(DEV_TO_TARGET(devEntry->deviceCS));

	return 0xFFFFFFFF;
}

/*******************************************************************************
* mvBoardGetDeviceBusWidth - Get Bus width of a device existing on the board
*
* DESCRIPTION:
*
* INPUT:
*       devIndex - The device sequential number on the board
*		devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*       None.
*
* RETURN:
*       If the device is found on the board the then the functions returns the
*		Bus width else the function returns 0xffffffff
*
*
*******************************************************************************/
MV_32 mvBoardGetDeviceBusWidth(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_DEV_CS_INFO *devEntry;

	devEntry = mvBoardGetDevEntry(devNum, devClass);
	if (devEntry != NULL)
		return devEntry->busWidth;

	return 0xFFFFFFFF;
}

/*******************************************************************************
* mvBoardGetDeviceWidth - Get dev width of a device existing on the board
*
* DESCRIPTION:
*
* INPUT:
*       devIndex - The device sequential number on the board
*		devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*       None.
*
* RETURN:
*       If the device is found on the board the then the functions returns the
*		dev width else the function returns 0xffffffff
*
*
*******************************************************************************/
MV_32 mvBoardGetDeviceWidth(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_DEV_CS_INFO *devEntry;

	devEntry = mvBoardGetDevEntry(devNum, devClass);
	if (devEntry != NULL)
		return devEntry->devWidth;

	return MV_ERROR;
}

/*******************************************************************************
* mvBoardGetDeviceWinSize - Get the window size of a device existing on the board
*
* DESCRIPTION:
*
* INPUT:
*       devIndex - The device sequential number on the board
*		devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*       None.
*
* RETURN:
*       If the device is found on the board the then the functions returns the
*		window size else the function returns 0xffffffff
*
*
*******************************************************************************/
MV_32 mvBoardGetDeviceWinSize(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_DEV_CS_INFO *devEntry;

	devEntry = mvBoardGetDevEntry(devNum, devClass);
	if (devEntry != NULL)
		return mvCpuIfTargetWinSizeGet(DEV_TO_TARGET(devEntry->deviceCS));

	return 0xFFFFFFFF;
}

/*******************************************************************************
* mvBoardGetDevEntry - returns the entry pointer of a device on the board
*
* DESCRIPTION:
*
* INPUT:
*	devIndex - The device sequential number on the board
*	devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*	None.
*
* RETURN:
*	If the device is found on the board the then the functions returns the
*	dev number else the function returns 0x0
*
*******************************************************************************/
static MV_DEV_CS_INFO *mvBoardGetDevEntry(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_U32 foundIndex = 0, devIndex;

	for (devIndex = START_DEV_CS; devIndex < board->numBoardDeviceIf; devIndex++) {
		if (board->pDevCsInfo[devIndex].devClass == devClass) {
			if (foundIndex == devNum)
				return &(board->pDevCsInfo[devIndex]);
			foundIndex++;
		}
	}

	/* device not found */
	return NULL;
}

/*******************************************************************************
* mvBoardGetDevCSNum
*
* DESCRIPTION:
*	Return the device's chip-select number.
*
* INPUT:
*	devIndex - The device sequential number on the board
*	devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*	None.
*
* RETURN:
*	If the device is found on the board the then the functions returns the
*	dev number else the function returns 0x0
*
*******************************************************************************/
MV_U32 mvBoardGetDevCSNum(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_DEV_CS_INFO *devEntry;

	devEntry = mvBoardGetDevEntry(devNum, devClass);
	if (devEntry != NULL)
		return devEntry->deviceCS;

	return 0xFFFFFFFF;
}

/*******************************************************************************
* mvBoardGetDevBusNum
*
* DESCRIPTION:
*	Return the device's bus number.
*
* INPUT:
*	devIndex - The device sequential number on the board
*	devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*	None.
*
* RETURN:
*	If the device is found on the board the then the functions returns the
*	dev bus number else the function returns 0xFFFFFFFF
*
*******************************************************************************/
MV_U32 mvBoardGetDevBusNum(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_DEV_CS_INFO *devEntry = mvBoardGetDevEntry(devNum, devClass);

	if (devEntry)
		return devEntry->busNum;

	return 0xFFFFFFFF;
}

/*******************************************************************************
* mvBoardGetDevState
*
* DESCRIPTION:
*	Return the device's activity state.
*
* INPUT:
*	devIndex - The device sequential number on the board
*	devType - The device type ( Flash,RTC , etc .. )
*
* OUTPUT:
*	None.
*
* RETURN:
*	If the device is found on the board the then the functions returns the
*	dev activity state else the function returns 0xFFFFFFFF
*
*******************************************************************************/
MV_BOOL mvBoardGetDevState(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
{
	MV_DEV_CS_INFO *devEntry = mvBoardGetDevEntry(devNum, devClass);

	if (devEntry)
		return devEntry->active;

	return 0xFFFFFFFF;
}

/*******************************************************************************
* mvBoardSetDevState
*
* DESCRIPTION:
*	Sets the device's activity state.
*
* INPUT:
*	devIndex - The device sequential number on the board
*   devType - The device type ( Flash,RTC , etc .. )
*   newState - requested deevice state
*
* OUTPUT:
*	None.
*
* RETURN:
*	If the device is found on the board the then the functions returns
*	MV_OK else MV_ERROR
*
*******************************************************************************/
MV_STATUS mvBoardSetDevState(MV_32 devNum, MV_BOARD_DEV_CLASS devClass, MV_BOOL newState)
{
	MV_DEV_CS_INFO *devEntry = mvBoardGetDevEntry(devNum, devClass);

	if (devEntry) {
		devEntry->active = newState;
		return MV_OK;
	} else
		return MV_ERROR;
}

/*******************************************************************************
* mvBoardTwsiAddrTypeGet -
*
* DESCRIPTION:
*	Return the TWSI address type for a given twsi device class.
*
* INPUT:
*	twsiClass - The TWSI device to return the address type for.
*	index	  - The TWSI device index (Pass 0 in case of a single
*		    device)
*
* OUTPUT:
*       None.
*
* RETURN:
*	The TWSI address type.
*
*******************************************************************************/
MV_U8 mvBoardTwsiAddrTypeGet(MV_BOARD_TWSI_CLASS twsiClass, MV_U32 index)
{
	int i;
	MV_U32 indexFound = 0;

	for (i = 0; i < board->numBoardTwsiDev; i++) {
		if (board->pBoardTwsiDev[i].devClass == twsiClass) {
			if (indexFound == index)
				return board->pBoardTwsiDev[i].twsiDevAddrType;
			else
				indexFound++;
		}
	}
	return (MV_ERROR);
}

/*******************************************************************************
* mvBoardTwsiAddrGet -
*
* DESCRIPTION:
*	Return the TWSI address for a given twsi device class.
*
* INPUT:
*	twsiClass - The TWSI device to return the address type for.
*	index	  - The TWSI device index (Pass 0 in case of a single
*		    device)
*
* OUTPUT:
*       None.
*
* RETURN:
*	The TWSI address.
*
*******************************************************************************/
MV_U8 mvBoardTwsiAddrGet(MV_BOARD_TWSI_CLASS twsiClass, MV_U32 index)
{
	int i;
	MV_U32 indexFound = 0;

	for (i = 0; i < board->numBoardTwsiDev; i++) {
		if (board->pBoardTwsiDev[i].devClass == twsiClass) {
			if (indexFound == index)
				return board->pBoardTwsiDev[i].twsiDevAddr;
			else
				indexFound++;
		}
	}
	return (0xFF);
}

/*******************************************************************************
* mvBoardNandWidthGet -
*
* DESCRIPTION: Get the width of the first NAND device in bytes
*
* INPUT:
*
* OUTPUT:
*       None.
*
* RETURN: 1, 2, 4 or MV_ERROR
*
*
*******************************************************************************/
MV_32 mvBoardNandWidthGet(void)
{
	MV_U32 devNum;
	MV_U32 devWidth;

	for (devNum = START_DEV_CS; devNum < board->numBoardDeviceIf; devNum++) {
		devWidth = mvBoardGetDeviceWidth(devNum, BOARD_DEV_NAND_FLASH);
		if (devWidth != MV_ERROR)
			return (devWidth / 8);
	}

	/* NAND wasn't found */
	return MV_ERROR;
}

/*******************************************************************************
* mvBoardSet - Set Board model
*
* DESCRIPTION:
*	Sets the global board structures and global board ID, according to boardId value
*	1. Detect correct MSYS family(Bobcat2/Alleycat3)
*	2. Detect Marvell/Customer board
*
* INPUT:
*	boardId :
*	- U-Boot : set boardID via mvBoardIdGet() - according to pre-compilation flag.
*	- Kernel : set boardID via tags received from U-Boot .
*
* OUTPUT:
*	None.
*
* RETURN:
*	void
*
*******************************************************************************/
static MV_U32 gBoardId = -1;
MV_VOID mvBoardSet(MV_U32 boardId)
{
	/* Marvell Bobcat2 Boards */
	if (boardId >= BC2_MARVELL_BOARD_ID_BASE && boardId < BC2_MARVELL_MAX_BOARD_ID) { /* Marvell Board */
		board = marvellBC2BoardInfoTbl[mvBoardIdIndexGet(boardId)];
		gBoardId = boardId;
	/* Marvell AlleyCat3 Boards */
	} else if (boardId >= AC3_MARVELL_BOARD_ID_BASE && boardId < AC3_MARVELL_MAX_BOARD_ID) { /* Marvell Board */
		board = marvellAC3BoardInfoTbl[mvBoardIdIndexGet(boardId)];
		gBoardId = boardId;
	/* Customer Bobcat2 Boards */
	} else if (boardId >= BC2_CUSTOMER_BOARD_ID_BASE && boardId < BC2_CUSTOMER_MAX_BOARD_ID) { /* Customer Board */
		board = customerBC2BoardInfoTbl[mvBoardIdIndexGet(boardId)];
		gBoardId = boardId;
	/* Customer AlleyCat3 Boards */
	} else if (boardId >= AC3_CUSTOMER_BOARD_ID_BASE && boardId < AC3_CUSTOMER_MAX_BOARD_ID) { /* Customer Board */
		board = customerAC3BoardInfoTbl[mvBoardIdIndexGet(boardId)];
		gBoardId = boardId;
	} else {
		mvOsPrintf("%s: Error: wrong board Id (%d)\n", __func__, boardId);
#ifdef CONFIG_ALLEYCAT3
		gBoardId = AC3_CUSTOMER_BOARD_ID0;
		board = customerAC3BoardInfoTbl[gBoardId];
#else
		gBoardId = BC2_CUSTOMER_BOARD_ID0;
		board = customerBC2BoardInfoTbl[gBoardId];
#endif
		mvOsPrintf("Applying default Customer board ID (%d: %s)\n", gBoardId, board->boardName);
	}
}

/*******************************************************************************
* mvBoardIdGet - Get Board model
*
* DESCRIPTION:
*       This function returns board ID.
*       Board ID is 32bit word constructed of board model (16bit) and
*       board revision (16bit) in the following way: 0xMMMMRRRR.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       32bit board ID number, '-1' if board is undefined.
*
*******************************************************************************/
MV_U32 mvBoardIdGet(MV_VOID)
{
	if (gBoardId != -1)
		return gBoardId;

#ifdef CONFIG_CUSTOMER_BOARD_SUPPORT

	#if defined CONFIG_ALLEYCAT3
		#ifdef CONFIG_CUSTOMER_BOARD_0
			gBoardId = AC3_CUSTOMER_BOARD_ID0;
		#elif CONFIG_CUSTOMER_BOARD_1
			gBoardId = AC3_CUSTOMER_BOARD_ID1;
		#endif
	#else /* BC2 */
		#ifdef CONFIG_CUSTOMER_BOARD_0
			gBoardId = BC2_CUSTOMER_BOARD_ID0;
		#elif CONFIG_CUSTOMER_BOARD_1
			gBoardId = BC2_CUSTOMER_BOARD_ID1;
		#endif
	#endif

#else	/* !CONFIG_CUSTOMER_BOARD_SUPPORT */

	MV_U8 readValue;
	MV_BOARD_INFO **mvBoardInfoTbl =
	#if defined CONFIG_ALLEYCAT3
		marvellAC3BoardInfoTbl;
	#else
		marvellBC2BoardInfoTbl;
	#endif

	/* Temporarily set generic board struct pointer, to set/get EEPROM i2c address, and read board ID */
	board = mvBoardInfoTbl[mvBoardIdIndexGet(MV_DEFAULT_BOARD_ID)];
	gBoardId = MV_DEFAULT_BOARD_ID; /* Terporary for usage by mvCtrlDevFamilyIdGet */

	if (mvBoardSarBoardIdGet(&readValue) != MV_OK) {
		mvOsPrintf("%s: Error obtaining Board ID from EEPROM (%d)\n", __func__, readValue);
		mvOsPrintf("%s: Setting default board to: %s\n", __func__, board->boardName);
		return MV_DEFAULT_BOARD_ID;
	}
	readValue = readValue & (BOARD_ID_INDEX_MASK - 1);

	if (readValue >= MV_MARVELL_BOARD_NUM) {
		mvOsPrintf("%s: Error: read wrong board ID (%d)\n", __func__, readValue);
		mvOsPrintf("%s: Setting default board to: %s\n", __func__, board->boardName);
		return MV_DEFAULT_BOARD_ID;
	}
	gBoardId = MARVELL_BOARD_ID_BASE + readValue;

#endif /* CONFIG_CUSTOMER_BOARD_SUPPORT */

	return gBoardId;
}

/*******************************************************************************
* mvBoardCpssBoardIdSet - Copy Board ID into Switch register for CPSS usage
*
* DESCRIPTION:
*       This function sets board ID in Switch register for CPSS
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_OK in success
*
*******************************************************************************/
MV_U32 mvBoardCpssBoardIdSet(MV_U8 boardId)
{
	const MV_U32	swBrdIdRegOffset = 0x7C; /* User defined register # 3 */
	const MV_U32	swBrdIdMask = 0xFF;
	MV_U32			swReg;

	if ((boardId & swBrdIdMask) != boardId) {
		mvOsPrintf("%s: Error: Board ID is too large!\n", __func__);
		return MV_ERROR;
	}

	swReg = MV_MEMIO_LE32_READ(SWITCH_REGS_VIRT_BASE | swBrdIdRegOffset);
	swReg |= (boardId & swBrdIdMask);
	MV_MEMIO_LE32_WRITE((SWITCH_REGS_VIRT_BASE | swBrdIdRegOffset), swReg);

	return MV_OK;
}

/*******************************************************************************
* mvBoardTwsiRead -
*
* DESCRIPTION:
*
* INPUT:
*       TWSI class id
*	device num - one of three devices
*	reg num - 0 or 1
*	pointer for output data
* OUTPUT:
*		reg value.
*
* RETURN:
*		status OK or Error
*
*******************************************************************************/
MV_STATUS mvBoardTwsiRead(MV_BOARD_TWSI_CLASS class1, MV_U8 devNum, MV_U8 regNum, MV_U8 *pData)
{
	MV_TWSI_SLAVE twsiSlave;
	MV_TWSI_ADDR slave;

	/* Read MPP module ID */
	DB(mvOsPrintf("Board: Read S@R device read\n"));
	twsiSlave.slaveAddr.address = mvBoardTwsiAddrGet(class1, devNum);
	if (0xFF == twsiSlave.slaveAddr.address)
		return MV_ERROR;
	twsiSlave.slaveAddr.type = mvBoardTwsiAddrTypeGet(class1, devNum);

	/* Use offset as command */
	twsiSlave.offset = regNum;
	twsiSlave.validOffset = MV_TRUE;

	/* in case the offset should be set to a TWSI slave which support
	 * 2 bytes offset, the offset setting will be done in 2 transactions.
	 * For accessing EEPROM, always using 2 bytes address offset
	 */
	if (class1 == BOARD_DEV_TWSI_INIT_EPROM)
		twsiSlave.moreThen256 = MV_TRUE;
	else
		twsiSlave.moreThen256 = MV_FALSE;

	/* TWSI init */
	slave.type = ADDR7_BIT;
	slave.address = 0;
	mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);


	if (MV_OK != mvTwsiRead(0, &twsiSlave, pData, 1)) {
		DB(mvOsPrintf("Board: Read S@R fail\n"));
		return MV_ERROR;
	}
	DB(mvOsPrintf("Board: Read TWSI succeded,(0x%x)\n", *pData));

	return MV_OK;
}
/*******************************************************************************
* mvBoardTwsiWrite -
*
* DESCRIPTION:
*
* INPUT:
*       TWSI class id
*	device num - one of three devices
*	reg num - 0 or 1
*	input reg data
*
* OUTPUT:
*		None.
*
* RETURN:
*		status OK or Error
*******************************************************************************/
MV_STATUS mvBoardTwsiWrite(MV_BOARD_TWSI_CLASS class1, MV_U8 devNum, MV_U8 regNum, MV_U8 regVal)
{
	MV_TWSI_SLAVE twsiSlave;
	MV_TWSI_ADDR slave;

	/* Read MPP module ID */
	twsiSlave.slaveAddr.address = mvBoardTwsiAddrGet(class1, devNum);
	if (0xFF == twsiSlave.slaveAddr.address)
		return MV_ERROR;
	twsiSlave.slaveAddr.type = mvBoardTwsiAddrTypeGet(class1, devNum);
	twsiSlave.validOffset = MV_TRUE;
	DB(mvOsPrintf("Board: Write S@R device addr %x, type %x, data %x\n",
		      twsiSlave.slaveAddr.address, twsiSlave.slaveAddr.type, regVal));
	/* Use offset as command */
	twsiSlave.offset = regNum;

	/* in case the offset should be set to a TWSI slave which support
	 * 2 bytes offset, the offset setting will be done in 2 transactions.
	 * For accessing EEPROM, always using 2 bytes address offset
	 */
	if (class1 == BOARD_DEV_TWSI_INIT_EPROM)
		twsiSlave.moreThen256 = MV_TRUE;
	else
		twsiSlave.moreThen256 = MV_FALSE;

	/* TWSI init */
	slave.type = ADDR7_BIT;
	slave.address = 0;
	mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);

	if (MV_OK != mvTwsiWrite(0, &twsiSlave, &regVal, 1)) {
		DB(mvOsPrintf("Board: Write S@R fail\n"));
		return MV_ERROR;
	}
	DB(mvOsPrintf("Board: Write S@R succeded\n"));

	return MV_OK;
}

/*******************************************************************************
* mvBoardTwsiSatRGet -
*
* DESCRIPTION:
*
* INPUT:
*	device num - one of three devices
*	reg num - 0 or 1
*
* OUTPUT:
*		None.
*
* RETURN:
*		reg value
*
*******************************************************************************/
MV_STATUS mvBoardTwsiSatRGet(MV_U8 devNum, MV_U8 regNum, MV_U8 *pData)
{
	return mvBoardTwsiRead(BOARD_DEV_TWSI_SATR, devNum, regNum, pData);
}

/*******************************************************************************
* mvBoardTwsiSatRSet -
*
* DESCRIPTION:
*
* INPUT:
*	devNum - one of three devices
*	regNum - 0 or 1
*	regVal - value
*
*
* OUTPUT:
*		None.
*
* RETURN:
*		reg value
*
*******************************************************************************/
MV_STATUS mvBoardTwsiSatRSet(MV_U8 devNum, MV_U8 regNum, MV_U8 regVal)
{
	return mvBoardTwsiWrite(BOARD_DEV_TWSI_SATR, devNum, regNum, regVal);
}

/*******************************************************************************
* SatR Configuration functions
*******************************************************************************/
MV_STATUS mvBoardCoreFreqGet(MV_U8 *value)
{
	MV_U8		sar0;
	MV_STATUS	rc1;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);
	MV_U32		fieldOffs = (family == MV_BOBCAT2_DEV_ID) ? 0 : 2;

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	rc1 = mvBoardTwsiSatRGet(1, 0, &sar0);
	if (MV_ERROR == rc1)
		return MV_ERROR;

	*value = (sar0 & (0x7 << fieldOffs)) >> fieldOffs;

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardCoreFreqSet(MV_U8 freqVal)
{
	MV_U8		sar0;
	MV_STATUS	rc1;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);
	MV_U32		fieldOffs = (family == MV_BOBCAT2_DEV_ID) ? 0 : 2;

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	rc1 = mvBoardTwsiSatRGet(1, 0, &sar0);
	if (MV_ERROR == rc1)
		return MV_ERROR;

	sar0 &= ~(0x7 << fieldOffs);
	sar0 |= (freqVal & 0x7) << fieldOffs;

	if (MV_OK != mvBoardTwsiSatRSet(1, 0, sar0)) {
		DB(mvOsPrintf("Board: Write core Freq S@R fail\n"));
		return MV_ERROR;
	}


	DB(mvOsPrintf("Board: Write core FreqOpt S@R succeeded\n"));
	return MV_OK;
}
/*******************************************************************************/
MV_STATUS mvBoardCpuFreqGet(MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family == MV_BOBCAT2_DEV_ID) {
		MV_U8		sar2;

		/* BC2 */
		if ((MV_ERROR == mvBoardTwsiSatRGet(1, 0, &sar)) ||
			(MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar2)))
			return MV_ERROR;

		*value = ((((sar2 & 0x1)) << 3) | ((sar & 0x18) >> 3));

	} else if (family == MV_ALLEYCAT3_DEV_ID) {

		/* AC3 */
		if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
			return MV_ERROR;

		*value = sar & 0x7;

	} else {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardCpuFreqSet(MV_U8 freqVal)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family == MV_BOBCAT2_DEV_ID) {
		MV_U8		sar2;
		/* BC2 */
		if ((MV_ERROR == mvBoardTwsiSatRGet(1, 0, &sar)) ||
			(MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar2)))
			return MV_ERROR;

		sar  &= ~0x18;
		sar2 &= ~0x1;
		sar  |= ((freqVal & 0x03) << 3);
		sar2 |= ((freqVal & 0x04) >> 2);

		if (MV_OK != mvBoardTwsiSatRSet(1, 0, sar)) {
			DB(mvOsPrintf("Board: Write CpuFreq(1) S@R fail\n"));
			return MV_ERROR;
		}
		if (MV_OK != mvBoardTwsiSatRSet(2, 0, sar2)) {
			DB(mvOsPrintf("Board: Write CpuFreq(2) S@R fail\n"));
			return MV_ERROR;
		}

	} else if (family == MV_ALLEYCAT3_DEV_ID) {

		/* AC3 */
		if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
			return MV_ERROR;

		sar  &= ~(0x7);
		sar  |= (freqVal & 0x7);

		if (MV_OK != mvBoardTwsiSatRSet(3, 0, sar)) {
			DB(mvOsPrintf("Board: Write CpuFreq S@R fail\n"));
			return MV_ERROR;
		}

	} else {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write CpuFreq S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardTmFreqGet(MV_U8 *value)
{
	MV_U8		sar2;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar2))
		return MV_ERROR;

	*value = ((sar2 & 0x0E) >> 1);

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardTmFreqSet(MV_U8 freqVal)
{
	MV_U8		sar2;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar2))
		return MV_ERROR;

	sar2 &= ~0xE;
	sar2 |= ((freqVal & 0x07) << 1);

	if (MV_OK != mvBoardTwsiSatRSet(2, 0, sar2)) {
		DB(mvOsPrintf("Board: Write TM-Freq S@R fail\n"));
		return MV_ERROR;
	}
	DB(mvOsPrintf("Board: Write TM-Freq S@R succeeded\n"));

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardJtagCpuGet(MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	*value = (sar & 0x8) >> 3;

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardJtagCpuSet(MV_U8 cpu)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x8);
	sar |= ((cpu & 0x1) << 3);

	if (MV_OK != mvBoardTwsiSatRSet(3, 0, sar)) {
		DB(mvOsPrintf("Board: Write JTAG CPU S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write JTAG CPU  S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardPtpPllGet(MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	*value = (sar & 0x10) >> 4;

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardPtpPllSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x10);
	sar |= ((val & 0x1) << 4);

	if (MV_OK != mvBoardTwsiSatRSet(3, 0, sar)) {
		DB(mvOsPrintf("Board: Write PTP PLL S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write PTP PLL  S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardOobPortConnectionGet(MV_U8 port, MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	if (port > 1) {
		DB(mvOsPrintf("%s: Unsupported OOB port number - %d\n", port, __func__));
		return MV_ERROR;
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(0, 1, &sar))
		return MV_ERROR;

	*value = (sar & (0x3 << (port << 1))) >> (port << 1);

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardOobPortConnectionSet(MV_U8 port, MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	if (port > 1) {
		DB(mvOsPrintf("%s: Unsupported OOB port number - %d\n", port, __func__));
		return MV_ERROR;
	}
	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(0, 1, &sar))
		return MV_ERROR;

	sar &= ~(0x3 << (port << 1));
	sar |= ((val & 0x3) << (port << 1));

	if (MV_OK != mvBoardTwsiSatRSet(0, 1, sar)) {
		DB(mvOsPrintf("Board: Write OOB port %d connection S@R fail\n", port));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write OOB port %d connection S@R succeeded\n", port));
	return MV_OK;
}



/*******************************************************************************/
MV_STATUS mvBoardForcePexGen1Get(MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(0, 1, &sar))
		return MV_ERROR;

	*value = (sar & 0x10) >> 4;

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardForcePexGen1Set(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_BOBCAT2_DEV_ID) {
		DB(mvOsPrintf("%s: AC3 controller family is not supported\n", __func__));
		return MV_ERROR; /* AC3 */
	}

	/* BC2 */
	if (MV_ERROR == mvBoardTwsiSatRGet(0, 1, &sar))
		return MV_ERROR;

	sar &= ~(0x10);
	sar |= ((val & 0x1) << 4);

	if (MV_OK != mvBoardTwsiSatRSet(0, 1, sar)) {
		DB(mvOsPrintf("Board: Write Force PCIe GEN1 S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write Force PCIe GEN1 S@R succeeded\n"));
	return MV_OK;
}


/*******************************************************************************/
MV_STATUS mvBoardBootDevGet(MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);
	MV_U8		twsiDevice = (family == MV_BOBCAT2_DEV_ID) ? 3 : 2;

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(twsiDevice, 0, &sar))
		return MV_ERROR;

	*value = (sar & 0x7);

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardBootDevSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);
	MV_U8		twsiDevice = (family == MV_BOBCAT2_DEV_ID) ? 3 : 2;

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(twsiDevice, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x7);
	sar |= (val & 0x7);

	if (MV_OK != mvBoardTwsiSatRSet(twsiDevice, 0, sar)) {
		DB(mvOsPrintf("Board: Write BootDev S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write BootDev S@R succeeded\n"));
	return MV_OK;
}
/*******************************************************************************/
MV_STATUS mvBoardDeviceIdGet(MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(0, 0, &sar))
		return MV_ERROR;

	*value = (sar & 0x1F);

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardDeviceIdSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(0, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x1F);
	sar |= (val & 0x1F);

	if (MV_OK != mvBoardTwsiSatRSet(0, 0, sar)) {
		DB(mvOsPrintf("Board: Write device-id S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write deviceid S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardDeviceNumGet(MV_U8 *value)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(1, 0, &sar))
		return MV_ERROR;

	*value = (sar & 0x3);

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardDeviceNumSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(1, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x3);
	sar |= (val & 0x3);

	if (MV_OK != mvBoardTwsiSatRSet(1, 0, sar)) {
		DB(mvOsPrintf("Board: Write device-id S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write deviceid S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardPcieModeGet(MV_U8 *val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);
	MV_U8		bitOffset = (family == MV_BOBCAT2_DEV_ID) ? 4 : 3;

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar))
		return MV_ERROR;

	*val = (sar & (0x1 << bitOffset)) >> bitOffset;

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardPcieModeSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);
	MV_U8		bitOffset = (family == MV_BOBCAT2_DEV_ID) ? 4 : 3;

	if ((family != MV_ALLEYCAT3_DEV_ID) && (family != MV_BOBCAT2_DEV_ID)) {
		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
		return MV_ERROR;
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x1 << bitOffset);
	sar |= (val & 0x1) << bitOffset;

	if (MV_OK != mvBoardTwsiSatRSet(2, 0, sar)) {
		DB(mvOsPrintf("Board: Write pcimode S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write pcimode S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardPcieClockGet(MV_U8 *val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar))
		return MV_ERROR;

	*val = (sar & (0x1 << 4)) >> 4;

	return MV_OK;
}
/*******************************************************************************/
MV_STATUS mvBoardPcieClockSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(2, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x1 << 4);
	sar |= (val & 0x1) << 4;

	if (MV_OK != mvBoardTwsiSatRSet(2, 0, sar)) {
		DB(mvOsPrintf("Board: Write pciclock S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write pciclock S@R succeeded\n"));
	return MV_OK;
}

/*********************************************************************************/
/* Operates on the same fileds as mvBoardAvsModeGet(), but has different meaning */
/* The Misc. PLL VCO clock configured by this field valid for AC3 rev. A0 only.  */
/*********************************************************************************/
MV_STATUS mvBoardPllClockGet(MV_U8 *val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	*val = (sar & (0x1 << 3)) >> 3;

	return MV_OK;
}

/*********************************************************************************/
/* Operates on the same fileds as mvBoardAvsModeSet(), but has different meaning */
/* The Misc. PLL VCO clock configured by this field valid for AC3 rev. A0 only.  */
/*********************************************************************************/
MV_STATUS mvBoardPllClockSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x1 << 3);
	sar |= (val & 0x1) << 3;

	if (MV_OK != mvBoardTwsiSatRSet(3, 0, sar)) {
		DB(mvOsPrintf("Board: Write pllclock S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write pcllclock S@R succeeded\n"));
	return MV_OK;
}

/**********************************************************************************/
/* Operates on the same fileds as mvBoardPllClockGet(), but has different meaning */
/* The AVS mode configured by this field valid on AC3 platforms starting rev. A1  */
/**********************************************************************************/
MV_STATUS mvBoardAvsModeGet(MV_U8 *val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	*val = (sar & (0x1 << 3)) >> 3;

	return MV_OK;
}

/**********************************************************************************/
/* Operates on the same fileds as mvBoardPllClockSet(), but has different meaning */
/* The AVS mode configured by this field valid on AC3 platforms starting rev. A1  */
/**********************************************************************************/
MV_STATUS mvBoardAvsModeSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x1 << 3);
	sar |= (val & 0x1) << 3;

	if (MV_OK != mvBoardTwsiSatRSet(3, 0, sar)) {
		DB(mvOsPrintf("Board: Write avsmode S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write avsmode S@R succeeded\n"));
	return MV_OK;
}

/**********************************************************************************/
MV_STATUS mvBoardSmiI2c2AddrGet(MV_U8 *val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	*val = (sar & (0x1 << 4)) >> 4;

	return MV_OK;
}

/**********************************************************************************/
MV_STATUS mvBoardSmiI2c2AddrSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(3, 0, &sar))
		return MV_ERROR;

	sar &= ~(0x1 << 4);
	sar |= (val & 0x1) << 4;

	if (MV_OK != mvBoardTwsiSatRSet(3, 0, sar)) {
		DB(mvOsPrintf("Board: Write slaveaddr S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write slaveaddr S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardSarBoardIdGet(MV_U8 *value)
{
	MV_U8		boardId;

	/* The Board Id is taken from the first address-value pair of the EEPROM initialization sequence
	   In order to support normal TWSI init sequence flow, the first pair of DWORDS on EEPROM
	   should contain an address (bytes 0-3) of some scratch pad register (for instance an UART SCR)
	   and a value (bytes 4-7), which will be partially interpreted as Board ID (bits[7:0] of byte 7)
	*/
	if (MV_ERROR == mvBoardTwsiRead(BOARD_DEV_TWSI_INIT_EPROM, 0, 7, &boardId))
		return MV_ERROR;

	*value = (boardId & 0x7);

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardSarBoardIdSet(MV_U8 val)
{
	MV_U8		boardId;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family == MV_ALLEYCAT3_DEV_ID) {
		if (val >= AC3_MARVELL_BOARD_NUM) {
			mvOsPrintf("%s: Error: Unsupported board ID (%d)\n", __func__, val);
			return MV_ERROR;
		}
	} else {
		if (val >= BC2_MARVELL_BOARD_NUM) {
			mvOsPrintf("%s: Error: Unsupported board ID (%d)\n", __func__, val);
			return MV_ERROR;
		}
	}

	/* The Board Id is taken from the first address-value pair of the EEPROM initalization sequnce
	   In order to support normal TWSI init sequnce flow, the first pair of DWORDS on EEPROM
	   should contain an address (bytes 0-3) of some scratch pad register (for instance an UART SCR)
	   and a value (bytes 4-7), which will be partially interpreted as Board ID (bits[7:0] of byte 7)
	*/
	if (MV_ERROR == mvBoardTwsiRead(BOARD_DEV_TWSI_INIT_EPROM, 0, 7, &boardId))
		return MV_ERROR;

	boardId &= ~(0x7);
	boardId |= (val & 0x7);

	if (MV_OK != mvBoardTwsiWrite(BOARD_DEV_TWSI_INIT_EPROM, 0, 7, boardId)) {
		DB(mvOsPrintf("Board: Write boardid S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write boardid S@R succeeded\n"));
	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardDdrEccEnableGet(MV_U8 *val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(1, 1, &sar))
		return MV_ERROR;

	*val = sar & 0x1;

	return MV_OK;
}

/*******************************************************************************/
MV_STATUS mvBoardDdrEccEnableSet(MV_U8 val)
{
	MV_U8		sar;
	MV_U16		family = mvCtrlDevFamilyIdGet(0);

	if (family != MV_ALLEYCAT3_DEV_ID) {
		DB(mvOsPrintf("%s: BC2 controller family is not supported\n", __func__));
		return MV_ERROR; /* Not supported on BC2 */
	}

	if (MV_ERROR == mvBoardTwsiSatRGet(1, 1, &sar))
		return MV_ERROR;

	sar &= ~(0x1);
	sar |= (val != 0) ? 0x1 : 0x0;

	if (MV_OK != mvBoardTwsiSatRSet(1, 1, sar)) {
		DB(mvOsPrintf("Board: Write ddreccenable S@R fail\n"));
		return MV_ERROR;
	}

	DB(mvOsPrintf("Board: Write ddreccenable S@R succeeded\n"));
	return MV_OK;
}


/*******************************************************************************
* End of SatR Configuration functions
*******************************************************************************/

/*******************************************************************************
* mvBoardMppModulesScan
*
* DESCRIPTION:
*	Scan for modules connected through MPP lines.
*
* INPUT:
*	None.
*
* OUTPUT:
*	None
*
* RETURN:
*       MV_STATUS - MV_OK, MV_ERROR.
*
*******************************************************************************/
MV_STATUS mvBoardMppModulesScan(void)
{
	return MV_OK;
}

/*******************************************************************************
* mvBoardOtherModulesScan
*
* DESCRIPTION:
*	Scan for modules connected through SERDES/LVDS/... lines.
*
* INPUT:
*	None.
*
* OUTPUT:
*	None
*
* RETURN:
*       MV_STATUS - MV_OK, MV_ERROR.
*
*******************************************************************************/
MV_STATUS mvBoardOtherModulesScan(void)
{
	return MV_OK;
}
/*******************************************************************************
* mvBoardIsSwitchModuleConnected
*
* DESCRIPTION:
*	Check if switch module is connected to the board.
*
* INPUT:
*	None.
*
* OUTPUT:
*	None
*
* RETURN:
*       MV_TRUE / MV_FALSE
*
*******************************************************************************/
MV_BOOL mvBoardIsSwitchModuleConnected(void)
{
	return MV_FALSE;
}
/*******************************************************************************
* mvBoardPexInfoGet - Get board PEX Info
*
* DESCRIPTION:
*
* INPUT:
*
* OUTPUT:
*       None.
*
* RETURN:
*******************************************************************************/
MV_BOARD_PEX_INFO *mvBoardPexInfoGet(void)
{
	return &board->boardPexInfo;
}

/*******************************************************************************
* mvBoardDebugLeg - Set the board debug Leds
*
* DESCRIPTION: turn on/off status leds.
* 	       Note: assume MPP leds are part of group 0 only.
*
* INPUT:
*       hexNum - Number to be displayed in hex by Leds.
*
* OUTPUT:
*       None.
*
* RETURN:
*       None.
*
*******************************************************************************/
MV_VOID mvBoardDebugLed(MV_U32 hexNum)
{
	MV_U32 val[MV_GPP_MAX_GROUP] = {0};
	MV_U32 mask[MV_GPP_MAX_GROUP] = {0};
	MV_U32 digitMask;
	MV_U32 i, pinNum, gppGroup;

	if (board->pLedGppPin == NULL)
		return;

	hexNum &= (1 << board->activeLedsNumber) - 1;

	for (i = 0, digitMask = 1; i < board->activeLedsNumber; i++, digitMask <<= 1) {
			pinNum = board->pLedGppPin[i];
			gppGroup = pinNum / 32;
			if (hexNum & digitMask)
				val[gppGroup]  |= (1 << (pinNum - gppGroup * 32));
			mask[gppGroup] |= (1 << (pinNum - gppGroup * 32));
	}

	for (gppGroup = 0; gppGroup < MV_GPP_MAX_GROUP; gppGroup++) {
		/* If at least one bit is set in the mask, update the whole GPP group */
		if (mask[gppGroup])
			mvGppValueSet(gppGroup, mask[gppGroup], board->ledsPolarity == 0 ?
					val[gppGroup] : ~val[gppGroup]);
	}

}
/*******************************************************************************
* mvBoardCpuCoresNumGet - Get number of CPU
*
* DESCRIPTION:
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       8bit number of CPU - 0 for UP
*
*******************************************************************************/
MV_U8 mvBoardCpuCoresNumGet(MV_VOID)
{
	return 0;
}

/*******************************************************************************
* mvBoardNandECCModeGet
*
* DESCRIPTION:
*	Obtain NAND ECC mode
*
* INPUT:
*	None.
*
* OUTPUT:
*	None.
*
* RETURN:
*	MV_NFC_ECC_MODE value
*
*******************************************************************************/
MV_NFC_ECC_MODE mvBoardNandECCModeGet()
{
#if defined(MV_NAND_4BIT_MODE)
	return MV_NFC_ECC_BCH_2K;
#elif defined(MV_NAND_8BIT_MODE)
	return MV_NFC_ECC_BCH_1K;
#elif defined(MV_NAND_12BIT_MODE)
	return MV_NFC_ECC_BCH_704B;
#elif defined(MV_NAND_16BIT_MODE)
	return MV_NFC_ECC_BCH_512B;
#else
	return MV_NFC_ECC_DISABLE;
#endif
}
/*******************************************************************************
* mvBoardCompatibleNameGet
*
* DESCRIPTION: return string containing 'compatible' property value
*		needed for Device Tree auto-update parsing sequence
*
* INPUT:  None
* OUTPUT: None.
*
* RETURN: length of returned string (including special delimiters)
*
*******************************************************************************/
MV_U8 mvBoardCompatibleNameGet(char *pNameBuff)
{
	MV_U8 len = 0;
	/* i.e: compatible = "marvell,msys", "marvell,msys-bc2", "marvell,msys-bc2-db", "marvell,armada-370-xp"; */
	len = sprintf(pNameBuff, "marvell,msys") + 1;
	/*
	 * append next strings after the NULL character that the previous
	 * sprintf wrote.  This is how a device tree stores multiple
	 * strings in a property.
	 */
	len += sprintf(pNameBuff + len, "marvell,msys-bc2") + 1;
	len += sprintf(pNameBuff + len, "marvell,msys-bc2-db") + 1;
	len += sprintf(pNameBuff + len, "marvell,armada-370-xp") + 1;

	return len;
}

MV_NAND_IF_MODE mvBoardNandIfGet()
{
	return NAND_IF_NFC;
}

/*******************************************************************************
* mvBoardOobPortCfgSet - Set the OOB ports connection according to SAR
*
* DESCRIPTION:
*		The OOB ports can be wired to either front panel connectors (internal
*		board ports) or to back panel connectors (plug-in module ports).
*		Additionally the OOB port can be disconnected from all board connectors.
*		The front panel connectors are wired to SERDES lines through external
*		analog MUX (located in CPLD), whcih allows either to select copper
*		ports (SMI managable PHYs) or QSGMII GBIC slots (inband managable).
*		When a particular OOB port SERDES is forwarded to front panel connectors
*		the MUX for this SERDES should select QSGMII connection.
*		The MUX configuration should not be altered for OOB port that uses
*		the back panel connector or defined as disconnected.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*
*
*******************************************************************************/
MV_STATUS mvBoardOobPortCfgSet(MV_VOID)
{
	MV_U8		portCfg;
	MV_U8		port;
	MV_STATUS	rVal;

	for (port = 0; port <= 1; port++) {

		rVal = mvBoardOobPortConnectionGet(port, &portCfg);
		if (rVal != MV_OK)
			return rVal;

		/* SAR defines OOB port connection as following:
		   0 - Back panel connectors (physical ports 20 and 21)
		   1 - Front panel connectors (physical ports 0 and 1)
		   2 - OOB [port disconnected
		   3 - Reserved
		*/
		/* Only write to IO expander MUX if the port is using front panel connector */
		if (portCfg == 1) {
			rVal = mvBoardTwsiRead(BOARD_DEV_TWSI_PCA9555_IO_EXPANDER, 0, 2, &portCfg);
			if (rVal != MV_OK) {
				DB(mvOsPrintf("%s: Error reading port %d config from IO expander\n", __func__, port));
				return rVal;
			}

			portCfg |= 0x1 << port; /* Redirect the port to QSGMII */

			rVal = mvBoardTwsiWrite(BOARD_DEV_TWSI_PCA9555_IO_EXPANDER, 0, 2, portCfg);
			if (rVal != MV_OK) {
				DB(mvOsPrintf("%s: Error writing port %d config to IO expander\n", __func__, port));
				return rVal;
			}
		}

	} /* For all OOB ports */

	return MV_OK;
}
/*******************************************************************************
* mvBoardisAmc
* DESCRIPTION: MSYS platform are not AMC compliant - return always false
*
* INPUT:  None
* OUTPUT: None.
* RETURN: MV_FALSE
*******************************************************************************/
MV_BOOL mvBoardisAmc(void)
{
	return MV_FALSE;
}
