/*******************************************************************************
   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 "mvHighSpeedTopologySpec.h"
#include "config_marvell.h"
#include "printf.h"
#include "bin_hdr_twsi.h"

#define MAX_NUMBER_OF_OOB_PORTS 2

/*********************************** Globals **********************************/

#ifdef CONFIG_CUSTOMER_BOARD_SUPPORT

/************************* Load Topology - Customer Boards ****************************/

/* Customer Board 0 Topology */
SERDES_MAP customerBoard0Topology[MAX_SERDES_LANES] =
{
	/* Type		Serdes		Speed			Mode				Swap		Swap */
	/*			Number											RX			TX   */
	{ PEX0,		 0,		__5Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
	{ SGMII0,	20,		__1_25Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
	{ SGMII1,	21,		__1_25Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
};

/* Customer Board 1 Topology */
SERDES_MAP customerBoard1Topology[MAX_SERDES_LANES] =
{
	/* Type		Serdes		Speed			Mode				Swap		Swap */
	/*			Number											RX			TX   */
	{ PEX0,		 0,		__5Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
	{ SGMII0,	20,		__1_25Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
	{ SGMII1,	21,		__1_25Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
};

/* Configuration options */
SERDES_MAP* customerBc2BoardSerdesTopology[] =
{
	customerBoard0Topology, /* Board 0 */
	customerBoard1Topology, /* Board 1 */
};

#else /* CONFIG_CUSTOMER_BOARD_SUPPORT */

/****************************************/
/*  Marvell BC2 DB/RD Topology		    */
/****************************************/

/* Configuration options */
SERDES_MAP bc2SerdesTopology[MAX_SERDES_LANES] =
{ /* BC2 DB/RD */
	/* Type			  Serdes		Speed			Mode				SwapRX		SwapTX */
	{ PEX0,				 0,		__5Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
	{ SGMII0,			20,		__1_25Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
	{ SGMII1,			21,		__1_25Gbps,		SERDES_DEFAULT_MODE,	MV_FALSE,	MV_FALSE },
};

SERDES_MAP* marvellBoardBc2SerdesTopology[] =
{
	bc2SerdesTopology, /* DB */
	bc2SerdesTopology, /* RD */
	bc2SerdesTopology, /* MTL */
};

#endif /* CONFIG_CUSTOMER_BOARD_SUPPORT */
/*************************** Functions implementation *************************/
#ifndef CONFIG_CUSTOMER_BOARD_SUPPORT
MV_STATUS mvHwsSerdesUpdateTopology (SERDES_MAP* SerdesTopologyArr)
{
	MV_TWSI_SLAVE	twsiSlave;
	MV_U8 oobConfig = 0;
	MV_U8 port;
	/* Initializing twsiSlave in order to read from the TWSI address */
	twsiSlave.slaveAddr.address = 0x4c;
	twsiSlave.slaveAddr.type = ADDR7_BIT;
	twsiSlave.validOffset = MV_TRUE;
	twsiSlave.offset = 1;
	twsiSlave.moreThen256 = MV_FALSE;

	if (MV_ERROR == mvTwsiRead(0, &twsiSlave, &oobConfig, 1))
		return MV_FAIL;

	for (port = 0; port < MAX_NUMBER_OF_OOB_PORTS; port++) {
		switch ((oobConfig >> (2 * port)) & 0x3)
		{
		case 0:
			SerdesTopologyArr[port + 1].serdesNum = 20 + port;
			break;
		case 1:
			SerdesTopologyArr[port + 1].serdesNum = port;
			break;
		case 2:
			SerdesTopologyArr[port + 1].serdesType = DEFAULT_SERDES;
			break;
		default:
			mvPrintf("mvHwsSerdesUpdateTopology: Unsupported value for OOB%d \n", port);
			return MV_FAIL;
		}
	}
	return MV_OK;
}
#endif

SERDES_MAP* mvHwsSerdesTopologyGet(MV_U32 boardIdIndex)
{
	SERDES_MAP** topologyArr;
	MV_U32 arrSize;

#ifdef CONFIG_CUSTOMER_BOARD_SUPPORT
	topologyArr = customerBc2BoardSerdesTopology;
	arrSize = sizeof(customerBc2BoardSerdesTopology)/sizeof(SERDES_MAP*);
#else
	topologyArr = marvellBoardBc2SerdesTopology;
	arrSize = sizeof(marvellBoardBc2SerdesTopology)/sizeof(SERDES_MAP*);

		/*Update topology data*/
	if(MV_OK != mvHwsSerdesUpdateTopology(topologyArr[boardIdIndex])){
		mvPrintf("Failed update serdes Topology\n");
		return NULL;
	}
#endif

	if (boardIdIndex >= arrSize)
	{
		mvPrintf("Error: mvHwsSerdesTopologyGet: board index %d is not valid\n", boardIdIndex);
		return NULL;
	}

	return topologyArr[boardIdIndex];
}


