/*******************************************************************************
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 "mvCommon.h"
#include "mvBoardEnvLib.h"
#include "mvBoardEnvSpec.h"
#include "twsi/mvTwsi.h"
#include "pex/mvPexRegs.h"

#define ARRSZ(x)	(sizeof(x)/sizeof(x[0]))

/***************************************** Customer Boards ****************************************/
/*******************************************************************************
	Bobcat2 board - Based on BOBCAT2-DB-DX
*******************************************************************************/
#define BOBCAT2_CUSTOMER_0_BOARD_NAND_READ_PARAMS	0x000C0282
#define BOBCAT2_CUSTOMER_0_BOARD_NAND_WRITE_PARAMS	0x00010305
/*NAND care support for small page chips*/
#define BOBCAT2_CUSTOMER_0_BOARD_NAND_CONTROL		0x01c00543

#define BOBCAT2_CUSTOMER_0_BOARD_NOR_READ_PARAMS	0x403E07CF
#define BOBCAT2_CUSTOMER_0_BOARD_NOR_WRITE_PARAMS	0x000F0F0F

MV_BOARD_TWSI_INFO	bobcat2_customer_board_0_InfoBoardTwsiDev[] = {
/* {{MV_BOARD_DEV_CLASS	devClass, MV_U8	twsiDevAddr, MV_U8 twsiDevAddrType}} */
	{BOARD_DEV_TWSI_PLD, 0x30, ADDR7_BIT},		/* Access to control PLD reg file */
	{BOARD_DEV_TWSI_ZARLINK, 0x18, ADDR7_BIT},		/* Access to Zarlink */
	{BOARD_DEV_TWSI_SATR, 0x4C, ADDR7_BIT},         /* SatR bios 0		*/
	{BOARD_DEV_TWSI_SATR, 0x4D, ADDR7_BIT},         /* SatR bios 1		*/
	{BOARD_DEV_TWSI_SATR, 0x4E, ADDR7_BIT},          /* SatR bios 2		*/
	{BOARD_DEV_TWSI_SATR, 0x4F, ADDR7_BIT},          /* SatR bios 3		*/
	{BOARD_DEV_TWSI_INIT_EPROM, 0x50, ADDR7_BIT},          /* Serial Ini EPROM	*/
	{BOARD_DEV_TWSI_PCA9555_IO_EXPANDER, 0x20, ADDR7_BIT},          /* Qsgmii/sfp mux control PCA9555 IO expander */
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x70, ADDR7_BIT},          /* PCA9548 I2C mux 0	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x71, ADDR7_BIT},          /* PCA9548 I2C mux 1	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x75, ADDR7_BIT}          /* PCA9548 I2C mux 2	*/
};

MV_BOARD_MAC_INFO bobcat2_customer_board_0_InfoBoardMacInfo[] = {
	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_32 boardEthSmiAddr , MV_32 boardEthSmiAddr0;}} */
	{BOARD_MAC_SPEED_AUTO, 0x0, 0x0 },
	{BOARD_MAC_SPEED_AUTO, 0x1, 0x1 },
};

MV_BOARD_MODULE_TYPE_INFO bobcat2_customer_board_0_InfoBoardModTypeInfo[] = {
	{
		.boardMppMod		= MV_BOARD_AUTO,
	}
};

MV_DEV_CS_INFO bobcat2_customer_board_0_InfoBoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busWidth, busNum, active }*/
#if defined(MV_INCLUDE_SPI)
	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8, 8, 0, MV_TRUE}, /* SPI DEV */
#endif
#if defined(MV_INCLUDE_NOR)
	{DEV_BOOCS, N_A, BOARD_DEV_NOR_FLASH, 16, 16, 0, MV_TRUE} /* NOR DEV */
#endif
};

MV_BOARD_MPP_INFO bobcat2_customer_board_0_InfoBoardMppConfigValue[] = {
	{ {
	BOBCAT2_CUSTOMER_0_MPP0_7,
	BOBCAT2_CUSTOMER_0_MPP8_15,
	BOBCAT2_CUSTOMER_0_MPP16_23,
	BOBCAT2_CUSTOMER_0_MPP24_31,
	BOBCAT2_CUSTOMER_0_MPP32_39,
	} },
};

MV_BOARD_INFO bobcat2_customer_board_0_Info = {
	.boardName			= "BOBCAT2-Customer-Board-0",
	.numBoardMppTypeValue		= ARRSZ(bobcat2_customer_board_0_InfoBoardModTypeInfo),
	.pBoardModTypeValue		= bobcat2_customer_board_0_InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(bobcat2_customer_board_0_InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= bobcat2_customer_board_0_InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(bobcat2_customer_board_0_InfoBoardDeCsInfo),
	.pDevCsInfo			= bobcat2_customer_board_0_InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(bobcat2_customer_board_0_InfoBoardTwsiDev),
	.pBoardTwsiDev			= bobcat2_customer_board_0_InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(bobcat2_customer_board_0_InfoBoardMacInfo),
	.pBoardMacInfo			= bobcat2_customer_board_0_InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin			= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= BOBCAT2_CUSTOMER_0_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= BOBCAT2_CUSTOMER_0_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= BOBCAT2_CUSTOMER_0_GPP_OUT_VAL_LOW,
	.gppOutValMid			= BOBCAT2_CUSTOMER_0_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= BOBCAT2_CUSTOMER_0_GPP_POL_LOW,
	.gppPolarityValMid		= BOBCAT2_CUSTOMER_0_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= BOBCAT2_CUSTOMER_0_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= BOBCAT2_CUSTOMER_0_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= BOBCAT2_CUSTOMER_0_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams		= BOBCAT2_CUSTOMER_0_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= BOBCAT2_CUSTOMER_0_BOARD_NOR_WRITE_PARAMS
};

MV_BOARD_INFO *customerBC2BoardInfoTbl[] = {
	&bobcat2_customer_board_0_Info,
	&bobcat2_customer_board_0_Info,
};


/*******************************************************************************
	Alleycat3 board - Based on BOBCAT2-DB-DX
*******************************************************************************/
#define ALLEYCAT3_CUSTOMER_0_BOARD_NAND_READ_PARAMS		0x000C0282
#define ALLEYCAT3_CUSTOMER_0_BOARD_NAND_WRITE_PARAMS	0x00010305
/*NAND care support for small page chips*/
#define ALLEYCAT3_CUSTOMER_0_BOARD_NAND_CONTROL			0x01c00543

#define ALLEYCAT3_CUSTOMER_0_BOARD_NOR_READ_PARAMS		0x403E07CF
#define ALLEYCAT3_CUSTOMER_0_BOARD_NOR_WRITE_PARAMS		0x000F0F0F

MV_BOARD_TWSI_INFO	alleycat3_customer_board_0_InfoBoardTwsiDev[] = {
/* {{MV_BOARD_DEV_CLASS	devClass, MV_U8	twsiDevAddr, MV_U8 twsiDevAddrType}} */
	{BOARD_DEV_TWSI_PLD, 0x30, ADDR7_BIT},		/* Access to control PLD reg file */
	{BOARD_DEV_TWSI_ZARLINK, 0x18, ADDR7_BIT},		/* Access to Zarlink */
	{BOARD_DEV_TWSI_SATR, 0x4C, ADDR7_BIT},         /* SatR bios 0		*/
	{BOARD_DEV_TWSI_SATR, 0x4D, ADDR7_BIT},         /* SatR bios 1		*/
	{BOARD_DEV_TWSI_SATR, 0x4E, ADDR7_BIT},          /* SatR bios 2		*/
	{BOARD_DEV_TWSI_SATR, 0x4F, ADDR7_BIT},          /* SatR bios 3		*/
	{BOARD_DEV_TWSI_INIT_EPROM, 0x50, ADDR7_BIT},          /* Serial Ini EPROM	*/
	{BOARD_DEV_TWSI_PCA9555_IO_EXPANDER, 0x20, ADDR7_BIT},          /* Qsgmii/sfp mux control PCA9555 IO expander */
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x70, ADDR7_BIT},          /* PCA9548 I2C mux 0	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x71, ADDR7_BIT},          /* PCA9548 I2C mux 1	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x75, ADDR7_BIT}          /* PCA9548 I2C mux 2	*/
};

MV_BOARD_MAC_INFO alleycat3_customer_board_0_InfoBoardMacInfo[] = {
/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_32 boardEthSmiAddr , MV_32 boardEthSmiAddr0;}} */
	{BOARD_MAC_SPEED_AUTO, -1, -1 },
	{BOARD_MAC_SPEED_AUTO, -1, -1 }
};

MV_BOARD_MODULE_TYPE_INFO alleycat3_customer_board_0_InfoBoardModTypeInfo[] = {
	{
		.boardMppMod		= MV_BOARD_AUTO,
	}
};

MV_DEV_CS_INFO alleycat3_customer_board_0_InfoBoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busWidth, busNum, active }*/
#if defined(MV_INCLUDE_SPI)
	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8, 8, 0, MV_TRUE}, /* SPI DEV */
#endif
#if defined(MV_INCLUDE_NOR)
	{DEV_BOOCS, N_A, BOARD_DEV_NOR_FLASH, 16, 16, 0, MV_TRUE} /* NOR DEV */
#endif
};

MV_BOARD_MPP_INFO alleycat3_customer_board_0_InfoBoardMppConfigValue[] = {
	{ {
	ALLEYCAT3_CUSTOMER_0_MPP0_7,
	ALLEYCAT3_CUSTOMER_0_MPP8_15,
	ALLEYCAT3_CUSTOMER_0_MPP16_23,
	ALLEYCAT3_CUSTOMER_0_MPP24_31,
	ALLEYCAT3_CUSTOMER_0_MPP32_39,
	} },
};

MV_BOARD_INFO alleycat3_customer_board_0_Info = {
	.boardName			= "ALLEYCAT3-Customer-Board-0",
	.numBoardMppTypeValue		= ARRSZ(alleycat3_customer_board_0_InfoBoardModTypeInfo),
	.pBoardModTypeValue		= alleycat3_customer_board_0_InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(alleycat3_customer_board_0_InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= alleycat3_customer_board_0_InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(alleycat3_customer_board_0_InfoBoardDeCsInfo),
	.pDevCsInfo			= alleycat3_customer_board_0_InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(alleycat3_customer_board_0_InfoBoardTwsiDev),
	.pBoardTwsiDev			= alleycat3_customer_board_0_InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(alleycat3_customer_board_0_InfoBoardMacInfo),
	.pBoardMacInfo			= alleycat3_customer_board_0_InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin			= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= ALLEYCAT3_CUSTOMER_0_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= ALLEYCAT3_CUSTOMER_0_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= ALLEYCAT3_CUSTOMER_0_GPP_OUT_VAL_LOW,
	.gppOutValMid			= ALLEYCAT3_CUSTOMER_0_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= ALLEYCAT3_CUSTOMER_0_GPP_POL_LOW,
	.gppPolarityValMid		= ALLEYCAT3_CUSTOMER_0_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= ALLEYCAT3_CUSTOMER_0_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= ALLEYCAT3_CUSTOMER_0_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= ALLEYCAT3_CUSTOMER_0_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams		= ALLEYCAT3_CUSTOMER_0_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= ALLEYCAT3_CUSTOMER_0_BOARD_NOR_WRITE_PARAMS
};

MV_BOARD_INFO *customerAC3BoardInfoTbl[] = {
	&alleycat3_customer_board_0_Info,
	&alleycat3_customer_board_0_Info
};

/***************************************** Marvell Boards *****************************************/
/***********************/
/* BOBCAT2-DB-DX BOARD */
/***********************/
#define DB_DX_BC2_BOARD_NAND_READ_PARAMS	0x000C0282
#define DB_DX_BC2_BOARD_NAND_WRITE_PARAMS	0x00010305
/*NAND care support for small page chips*/
#define DB_DX_BC2_BOARD_NAND_CONTROL		0x01c00543

#define DB_DX_BC2_BOARD_NOR_READ_PARAMS	0x403E07CF
#define DB_DX_BC2_BOARD_NOR_WRITE_PARAMS	0x000F0F0F

MV_BOARD_TWSI_INFO	db_dx_bc2InfoBoardTwsiDev[] = {
/* {{MV_BOARD_DEV_CLASS	devClass, MV_U8	twsiDevAddr, MV_U8 twsiDevAddrType}} */
	{BOARD_DEV_TWSI_PLD, 0x30, ADDR7_BIT},		/* Access to control PLD reg file */
	{BOARD_DEV_TWSI_ZARLINK, 0x18, ADDR7_BIT},		/* Access to Zarlink 	*/
	{BOARD_DEV_TWSI_SATR, 0x4C, ADDR7_BIT},         /* SatR bios 0		*/
	{BOARD_DEV_TWSI_SATR, 0x4D, ADDR7_BIT},         /* SatR bios 1		*/
	{BOARD_DEV_TWSI_SATR, 0x4E, ADDR7_BIT},          /* SatR bios 2		*/
	{BOARD_DEV_TWSI_SATR, 0x4F, ADDR7_BIT},          /* SatR bios 3		*/
	{BOARD_DEV_TWSI_INIT_EPROM, 0x50, ADDR7_BIT},          /* Serial Ini EPROM	*/
	{BOARD_DEV_TWSI_PCA9555_IO_EXPANDER, 0x20, ADDR7_BIT},          /* Qsgmii/sfp mux control PCA9555 IO expander */
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x70, ADDR7_BIT},          /* PCA9548 I2C mux 0	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x71, ADDR7_BIT},          /* PCA9548 I2C mux 1	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x75, ADDR7_BIT}          /* PCA9548 I2C mux 2	*/
};

MV_BOARD_MAC_INFO db_dx_bc2InfoBoardMacInfo[] = {
	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_32 boardEthSmiAddr , MV_32 boardEthSmiAddr0;}} */
	{BOARD_MAC_SPEED_AUTO, -1, -1 },
	{BOARD_MAC_SPEED_AUTO, -1, -1 },
};

MV_BOARD_MODULE_TYPE_INFO db_dx_bc2InfoBoardModTypeInfo[] = {
	{
		.boardMppMod		= MV_BOARD_AUTO,
	}
};

MV_DEV_CS_INFO db_dx_bc2InfoBoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busWidth, busNum, active }*/
#if defined(MV_INCLUDE_SPI)
	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8, 8, 0, MV_TRUE}, /* SPI DEV */
#endif
#if defined(MV_INCLUDE_NOR)
	{DEV_BOOCS, N_A, BOARD_DEV_NOR_FLASH, 8, 8, 0, MV_TRUE} /* NOR DEV */
#endif
};

MV_BOARD_MPP_INFO db_dx_bc2InfoBoardMppConfigValue[] = {
	{ {
#if defined(MV_INCLUDE_NOR)
	DB_DX_BC2_NOR_MPP0_7,
	DB_DX_BC2_NOR_MPP8_15,
#else
	DB_DX_BC2_MPP0_7,
	DB_DX_BC2_MPP8_15,
#endif
	DB_DX_BC2_MPP16_23,
	DB_DX_BC2_MPP24_31,
	DB_DX_BC2_MPP32_39,
	} },
};

MV_BOARD_INFO db_dx_bc2Info = {
	.boardName			= "DB-DXBC2-MM",
	.numBoardMppTypeValue		= ARRSZ(db_dx_bc2InfoBoardModTypeInfo),
	.pBoardModTypeValue		= db_dx_bc2InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(db_dx_bc2InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= db_dx_bc2InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(db_dx_bc2InfoBoardDeCsInfo),
	.pDevCsInfo			= db_dx_bc2InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(db_dx_bc2InfoBoardTwsiDev),
	.pBoardTwsiDev			= db_dx_bc2InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(db_dx_bc2InfoBoardMacInfo),
	.pBoardMacInfo			= db_dx_bc2InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin			= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= DB_DX_BC2_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= DB_DX_BC2_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= DB_DX_BC2_GPP_OUT_VAL_LOW,
	.gppOutValMid			= DB_DX_BC2_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= DB_DX_BC2_GPP_POL_LOW,
	.gppPolarityValMid		= DB_DX_BC2_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= DB_DX_BC2_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= DB_DX_BC2_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= DB_DX_BC2_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams		= DB_DX_BC2_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= DB_DX_BC2_BOARD_NOR_WRITE_PARAMS
};

/**********************************************************************************/
/***********************/
/* BOBCAT2-RD-DX BOARD */
/***********************/
#define RD_DX_BC2_BOARD_NAND_READ_PARAMS		0x000C0282
#define RD_DX_BC2_BOARD_NAND_WRITE_PARAMS	0x00010305
/*NAND care support for small page chips*/
#define RD_DX_BC2_BOARD_NAND_CONTROL			0x01c00543

MV_BOARD_MAC_INFO rd_dx_bc2InfoBoardMacInfo[] = {
	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_32 boardEthSmiAddr , MV_32 boardEthSmiAddr0;}} */
	{BOARD_MAC_SPEED_1000M, 0x0, 0x0 },
	{BOARD_MAC_SPEED_1000M, 0x1, 0x1 },
};

MV_BOARD_MODULE_TYPE_INFO rd_dx_bc2InfoBoardModTypeInfo[] = {
	{
		.boardMppMod		= MV_BOARD_AUTO,
	}
};

MV_DEV_CS_INFO rd_dx_bc2InfoBoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busNum, active}*/
#if defined(MV_INCLUDE_SPI)
	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8, 0, MV_TRUE} /* SPI DEV */
#endif
};

MV_BOARD_MPP_INFO rd_dx_bc2InfoBoardMppConfigValue[] = {
	{ {
		RD_DX_BC2_MPP0_7,
		RD_DX_BC2_MPP8_15,
		RD_DX_BC2_MPP16_23,
		RD_DX_BC2_MPP24_31,
		RD_DX_BC2_MPP32_39,
	} }
};

MV_BOARD_INFO rd_dx_bc2Info = {
	.boardName			= "RD-DXBC2-48G-12XG2XLG",
	.numBoardMppTypeValue		= ARRSZ(rd_dx_bc2InfoBoardModTypeInfo),
	.pBoardModTypeValue		= rd_dx_bc2InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(rd_dx_bc2InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= rd_dx_bc2InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(rd_dx_bc2InfoBoardDeCsInfo),
	.pDevCsInfo			= rd_dx_bc2InfoBoardDeCsInfo,
	.numBoardTwsiDev		= 0,
	.pBoardTwsiDev			= NULL,
	.numBoardMacInfo		= ARRSZ(rd_dx_bc2InfoBoardMacInfo),
	.pBoardMacInfo			= rd_dx_bc2InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin			= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= RD_DX_BC2_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= RD_DX_BC2_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= RD_DX_BC2_GPP_OUT_VAL_LOW,
	.gppOutValMid			= RD_DX_BC2_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= RD_DX_BC2_GPP_POL_LOW,
	.gppPolarityValMid		= RD_DX_BC2_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo			= NULL,
	.switchInfoNum			= 0,

	 /* NAND init params */
	.nandFlashReadParams		= RD_DX_BC2_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= RD_DX_BC2_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= RD_DX_BC2_BOARD_NAND_CONTROL
};

/**********************************************************************************/
/*****************************/
/* BobCat2 RD BC2_MTL BOARD */
/*****************************/
#define RD_MTL_BC2_BOARD_NAND_READ_PARAMS		0x000C0282
#define RD_MTL_BC2_BOARD_NAND_WRITE_PARAMS	0x00010305
/*NAND care support for small page chips*/
#define RD_MTL_BC2_BOARD_NAND_CONTROL			0x01c00543

MV_BOARD_TWSI_INFO	bc2_rd_mtlInfoBoardTwsiDev[] = {
/* {{MV_BOARD_DEV_CLASS	devClass, MV_U8	twsiDevAddr, MV_U8 twsiDevAddrType}} */
	{BOARD_DEV_TWSI_PLD, 0x77, ADDR7_BIT},				/* Access to control PLD reg file */
	{BOARD_DEV_TWSI_INIT_EPROM, 0x50, ADDR7_BIT},		/* Serial Ini EPROM	*/
};

MV_BOARD_MAC_INFO bc2_rd_mtlInfoBoardMacInfo[] = {
	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_32 boardEthSmiAddr , MV_32 boardEthSmiAddr0;}} */
	{BOARD_MAC_SPEED_1000M, 0x0, 0x0 },
};

MV_BOARD_MODULE_TYPE_INFO bc2_rd_mtlInfoBoardModTypeInfo[] = {
	{
		.boardMppMod		= MV_BOARD_AUTO,
	}
};

MV_DEV_CS_INFO bc2_rd_mtlInfoBoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busNum, active}*/
#if defined(MV_INCLUDE_SPI)
	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8, 0, MV_TRUE} /* SPI DEV */
#endif
};

MV_BOARD_MPP_INFO bc2_rd_mtlInfoBoardMppConfigValue[] = {
	{ {
		RD_MTL_BC2_MPP0_7,
		RD_MTL_BC2_MPP8_15,
		RD_MTL_BC2_MPP16_23,
		RD_MTL_BC2_MPP24_31,
		RD_MTL_BC2_MPP32_39,
	} }
};

MV_BOARD_INFO bc2_rd_mtlInfo = {
	.boardName					= "RD-MTL-BC2-48G-12XG2XLG",
	.numBoardMppTypeValue		= ARRSZ(bc2_rd_mtlInfoBoardModTypeInfo),
	.pBoardModTypeValue			= bc2_rd_mtlInfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(bc2_rd_mtlInfoBoardMppConfigValue),
	.pBoardMppConfigValue		= bc2_rd_mtlInfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(bc2_rd_mtlInfoBoardDeCsInfo),
	.pDevCsInfo				= bc2_rd_mtlInfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(bc2_rd_mtlInfoBoardTwsiDev),
	.pBoardTwsiDev			= bc2_rd_mtlInfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(bc2_rd_mtlInfoBoardMacInfo),
	.pBoardMacInfo			= bc2_rd_mtlInfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin				= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= RD_MTL_BC2_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= RD_MTL_BC2_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= RD_MTL_BC2_GPP_OUT_VAL_LOW,
	.gppOutValMid			= RD_MTL_BC2_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= RD_MTL_BC2_GPP_POL_LOW,
	.gppPolarityValMid		= RD_MTL_BC2_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams	= RD_MTL_BC2_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams	= RD_MTL_BC2_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= RD_MTL_BC2_BOARD_NAND_CONTROL
};

/*********************************************************************************/
/***********************/
/* ALLEYCAT3-DB-DX BOARD */
/***********************/
#define DB_DX_AC3_BOARD_NAND_READ_PARAMS	0x000C0282
#define DB_DX_AC3_BOARD_NAND_WRITE_PARAMS	0x00010305
/*NAND care support for small page chips*/
#define DB_DX_AC3_BOARD_NAND_CONTROL		0x01c00543

#define DB_DX_AC3_BOARD_NOR_READ_PARAMS		0x403E07CF
#define DB_DX_AC3_BOARD_NOR_WRITE_PARAMS	0x000F0F0F

MV_BOARD_TWSI_INFO db_dx_ac3InfoBoardTwsiDev[] = {
/* {{MV_BOARD_DEV_CLASS	devClass, MV_U8	twsiDevAddr, MV_U8 twsiDevAddrType}} */
	{BOARD_DEV_TWSI_PLD, 0x18, ADDR7_BIT},			/* Access to control PLD reg file */
	{BOARD_DEV_TWSI_SATR, 0x4C, ADDR7_BIT},			/* SatR bios 0		*/
	{BOARD_DEV_TWSI_SATR, 0x4D, ADDR7_BIT},			/* SatR bios 1		*/
	{BOARD_DEV_TWSI_SATR, 0x4E, ADDR7_BIT},			/* SatR bios 2		*/
	{BOARD_DEV_TWSI_SATR, 0x4F, ADDR7_BIT},			/* SatR bios 3		*/
	{BOARD_DEV_TWSI_INIT_EPROM, 0x50, ADDR7_BIT},	/* Serial Ini EPROM	*/
	{BOARD_DEV_TWSI_PCA9555_IO_EXPANDER, 0x20, ADDR7_BIT},	/* Qsgmii/sfp mux control PCA9555 IO expander */
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x70, ADDR7_BIT},		/* PCA9548 I2C mux 0	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x71, ADDR7_BIT},		/* PCA9548 I2C mux 1	*/
	{BOARD_DEV_TWSI_PCA9548_IO_MUX, 0x75, ADDR7_BIT}		/* PCA9548 I2C mux 2	*/
};

MV_BOARD_MAC_INFO db_dx_ac3InfoBoardMacInfo[] = {
/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_32 boardEthSmiAddr , MV_32 boardEthSmiAddr0;}} */
	{BOARD_MAC_SPEED_AUTO, -1, -1 },
	{BOARD_MAC_SPEED_AUTO, -1, -1 }
};

MV_BOARD_MODULE_TYPE_INFO db_dx_ac3InfoBoardModTypeInfo[] = {
	{
		.boardMppMod		= MV_BOARD_AUTO,
	}
};

MV_DEV_CS_INFO db_dx_ac3InfoBoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busWidth, busNum, active }*/
#if defined(MV_INCLUDE_SPI)
	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8, 8, 0, MV_TRUE}, /* SPI DEV */
#endif
#if defined(MV_INCLUDE_NOR)
	{DEV_BOOCS, N_A, BOARD_DEV_NOR_FLASH, 16, 16, 0, MV_TRUE} /* NOR DEV */
#endif
};

MV_BOARD_MPP_INFO db_dx_ac3InfoBoardMppConfigValue[] = {
	{ {
	DB_DX_AC3_MPP0_7,
	DB_DX_AC3_MPP8_15,
	DB_DX_AC3_MPP16_23,
	DB_DX_AC3_MPP24_31,
	DB_DX_AC3_MPP32_39,
	} },
};

MV_BOARD_INFO db_dx_ac3Info = {
	.boardName			= "DB-XC3-24G4XG",
	.numBoardMppTypeValue		= ARRSZ(db_dx_ac3InfoBoardModTypeInfo),
	.pBoardModTypeValue		= db_dx_ac3InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(db_dx_ac3InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= db_dx_ac3InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(db_dx_ac3InfoBoardDeCsInfo),
	.pDevCsInfo			= db_dx_ac3InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(db_dx_ac3InfoBoardTwsiDev),
	.pBoardTwsiDev			= db_dx_ac3InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(db_dx_ac3InfoBoardMacInfo),
	.pBoardMacInfo			= db_dx_ac3InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin			= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= DB_DX_AC3_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= DB_DX_AC3_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= DB_DX_AC3_GPP_OUT_VAL_LOW,
	.gppOutValMid			= DB_DX_AC3_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= DB_DX_AC3_GPP_POL_LOW,
	.gppPolarityValMid		= DB_DX_AC3_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= DB_DX_AC3_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= DB_DX_AC3_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= DB_DX_AC3_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams		= DB_DX_AC3_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= DB_DX_AC3_BOARD_NOR_WRITE_PARAMS
};

/*********************************************************************************/
/******************************/
/* ALLEYCAT3-RD-MTL-4XG BOARD */
/******************************/
MV_BOARD_MPP_INFO rd_mtl_4xg_ac3InfoBoardMppConfigValue[] = {
	{ {
	RD_MTL_4XG_AC3_MPP0_7,
	RD_MTL_4XG_AC3_MPP8_15,
	RD_MTL_4XG_AC3_MPP16_23,
	RD_MTL_4XG_AC3_MPP24_31,
	RD_MTL_4XG_AC3_MPP32_39,
	} },
};

MV_BOARD_INFO rd_mtl_4xg_ac3Info = {
	.boardName			= "RD-XC3-48G4XG-A",
	.numBoardMppTypeValue		= ARRSZ(db_dx_ac3InfoBoardModTypeInfo),
	.pBoardModTypeValue		= db_dx_ac3InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(rd_mtl_4xg_ac3InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= rd_mtl_4xg_ac3InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(db_dx_ac3InfoBoardDeCsInfo),
	.pDevCsInfo				= db_dx_ac3InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(db_dx_ac3InfoBoardTwsiDev),
	.pBoardTwsiDev			= db_dx_ac3InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(db_dx_ac3InfoBoardMacInfo),
	.pBoardMacInfo			= db_dx_ac3InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin				= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= RD_MTL_4XG_AC3_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= RD_MTL_4XG_AC3_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= RD_MTL_4XG_AC3_GPP_OUT_VAL_LOW,
	.gppOutValMid			= RD_MTL_4XG_AC3_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= RD_MTL_4XG_AC3_GPP_POL_LOW,
	.gppPolarityValMid		= RD_MTL_4XG_AC3_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= DB_DX_AC3_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= DB_DX_AC3_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= DB_DX_AC3_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams		= DB_DX_AC3_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= DB_DX_AC3_BOARD_NOR_WRITE_PARAMS
};
/*********************************************************************************/
/***********************************/
/* ALLEYCAT3-RD-MTL-2XXG-2XG BOARD */
/***********************************/
MV_BOARD_MPP_INFO rd_mtl_2xxg_2xg_ac3InfoBoardMppConfigValue[] = {
	{ {
	RD_MTL_4XG_AC3_MPP0_7,
	RD_MTL_4XG_AC3_MPP8_15,
	RD_MTL_4XG_AC3_MPP16_23,
	RD_MTL_4XG_AC3_MPP24_31,
	RD_MTL_4XG_AC3_MPP32_39,
	} },
};

MV_BOARD_INFO rd_mtl_2xxg_2xg_ac3Info = {
	.boardName			= "RD-XC3-48G2XG2XXG-A",
	.numBoardMppTypeValue		= ARRSZ(db_dx_ac3InfoBoardModTypeInfo),
	.pBoardModTypeValue		= db_dx_ac3InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(rd_mtl_2xxg_2xg_ac3InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= rd_mtl_2xxg_2xg_ac3InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(db_dx_ac3InfoBoardDeCsInfo),
	.pDevCsInfo				= db_dx_ac3InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(db_dx_ac3InfoBoardTwsiDev),
	.pBoardTwsiDev			= db_dx_ac3InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(db_dx_ac3InfoBoardMacInfo),
	.pBoardMacInfo			= db_dx_ac3InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin				= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= RD_MTL_4XG_AC3_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= RD_MTL_4XG_AC3_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= RD_MTL_4XG_AC3_GPP_OUT_VAL_LOW,
	.gppOutValMid			= RD_MTL_4XG_AC3_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= RD_MTL_4XG_AC3_GPP_POL_LOW,
	.gppPolarityValMid		= RD_MTL_4XG_AC3_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= DB_DX_AC3_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= DB_DX_AC3_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= DB_DX_AC3_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams		= DB_DX_AC3_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= DB_DX_AC3_BOARD_NOR_WRITE_PARAMS
};

/*********************************************************************************/
/***********************************/
/* ALLEYCAT3-RD-MTL-2XXG-2XG BOARD */
/***********************************/
MV_BOARD_MPP_INFO db_misl_24G_46_ac3InfoBoardMppConfigValue[] = {
	{ {
	DB_MISL_24G46_AC3_MPP0_7,
	DB_MISL_24G46_AC3_MPP8_15,
	DB_MISL_24G46_AC3_MPP16_23,
	DB_MISL_24G46_AC3_MPP24_31,
	DB_MISL_24G46_AC3_MPP32_39,
	} },
};

MV_BOARD_INFO db_misl_24G_4xg_ac3Info = {
	.boardName			= "DB-XC3-24G-4G",
	.numBoardMppTypeValue		= ARRSZ(db_dx_ac3InfoBoardModTypeInfo),
	.pBoardModTypeValue		= db_dx_ac3InfoBoardModTypeInfo,
	.numBoardMppConfigValue		= ARRSZ(db_misl_24G_46_ac3InfoBoardMppConfigValue),
	.pBoardMppConfigValue		= db_misl_24G_46_ac3InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(db_dx_ac3InfoBoardDeCsInfo),
	.pDevCsInfo				= db_dx_ac3InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(db_dx_ac3InfoBoardTwsiDev),
	.pBoardTwsiDev			= db_dx_ac3InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(db_dx_ac3InfoBoardMacInfo),
	.pBoardMacInfo			= db_dx_ac3InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin				= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= DB_MISL_24G46_AC3_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= DB_MISL_24G46_AC3_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= DB_MISL_24G46_AC3_GPP_OUT_VAL_LOW,
	.gppOutValMid			= DB_MISL_24G46_AC3_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= DB_MISL_24G46_AC3_GPP_POL_LOW,
	.gppPolarityValMid		= DB_MISL_24G46_AC3_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= DB_DX_AC3_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= DB_DX_AC3_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl			= DB_DX_AC3_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams			= DB_DX_AC3_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= DB_DX_AC3_BOARD_NOR_WRITE_PARAMS
};

/*********************************************************************************/
/***********************************/
/* ALLEYCAT3-RD-MTL-24G BOARD     */
/***********************************/
MV_BOARD_MPP_INFO rd_mtl_24G_ac3InfoBoardMppConfigValue[] = {
	{ {
	RD_MTL_24G_AC3_MPP0_7,
	RD_MTL_24G_AC3_MPP8_15,
	RD_MTL_24G_AC3_MPP16_23,
	RD_MTL_24G_AC3_MPP24_31,
	RD_MTL_24G_AC3_MPP32_39,
	} },
};

MV_BOARD_INFO rd_mtl_24G_ac3Info = {
	.boardName				= "RD-XC3-24G-4SFP",
	.numBoardMppTypeValue	= ARRSZ(db_dx_ac3InfoBoardModTypeInfo),
	.pBoardModTypeValue		= db_dx_ac3InfoBoardModTypeInfo,
	.numBoardMppConfigValue	= ARRSZ(rd_mtl_24G_ac3InfoBoardMppConfigValue),
	.pBoardMppConfigValue	= rd_mtl_24G_ac3InfoBoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(db_dx_ac3InfoBoardDeCsInfo),
	.pDevCsInfo				= db_dx_ac3InfoBoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(db_dx_ac3InfoBoardTwsiDev),
	.pBoardTwsiDev			= db_dx_ac3InfoBoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(db_dx_ac3InfoBoardMacInfo),
	.pBoardMacInfo			= db_dx_ac3InfoBoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= NULL,
	.activeLedsNumber		= 0,
	.pLedGppPin				= NULL,
	.ledsPolarity			= 0,

	/* GPP values */
	.gppOutEnValLow			= RD_MTL_24G_AC3_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= RD_MTL_24G_AC3_GPP_OUT_ENA_MID,
	.gppOutEnValHigh		= 0,
	.gppOutValLow			= RD_MTL_24G_AC3_GPP_OUT_VAL_LOW,
	.gppOutValMid			= RD_MTL_24G_AC3_GPP_OUT_VAL_MID,
	.gppOutValHigh			= 0,
	.gppPolarityValLow		= RD_MTL_24G_AC3_GPP_POL_LOW,
	.gppPolarityValMid		= RD_MTL_24G_AC3_GPP_POL_MID,
	.gppPolarityValHigh		= 0,

	/* External Switch Configuration */
	.pSwitchInfo = NULL,
	.switchInfoNum = 0,

	/* NAND init params */
	.nandFlashReadParams		= DB_DX_AC3_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= DB_DX_AC3_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= DB_DX_AC3_BOARD_NAND_CONTROL,
	/* NOR init params */
	.norFlashReadParams		= DB_DX_AC3_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= DB_DX_AC3_BOARD_NOR_WRITE_PARAMS
};

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

MV_BOARD_INFO *marvellBC2BoardInfoTbl[] = {
	&db_dx_bc2Info,
	&rd_dx_bc2Info,
	&bc2_rd_mtlInfo
};

MV_BOARD_INFO *marvellAC3BoardInfoTbl[] = {
	&db_dx_ac3Info,
	&rd_mtl_4xg_ac3Info,
	&rd_mtl_2xxg_2xg_ac3Info,
	&db_misl_24G_4xg_ac3Info,
	&rd_mtl_24G_ac3Info
};
