/*******************************************************************************
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/sys/mvCpuIf.h"
#include "cpu/mvCpu.h"
#include "boardEnv/mvBoardEnvLib.h"
#include "ctrlEnv/mvUnitMap.h"

static MV_BOOL mv_rsrc_limited = MV_FALSE;
static MV_RES_MAP mv_res_table[] = {
	/* Dividable units */
	{0, "uart0"},
	{0, "uart1"},
	{0, "pex0"},
	{0, "pex1"},
	{0, "pex2"},
	{0, "pex3"},
	{0, "eth0"},
	{0, "eth1"},
	{0, "eth2"},
	{0, "eth3"},
	{0, "xor0"},
	{0, "xor1"},
	{0, "usb0"},
	{0, "usb1"},
	{0, "usb2"},
	{0, "i2c0"},
	{0, "i2c1"},
	/* Single Allocation units */
	{0, "sata"},
	{0, "cesa"},
	{0, "nor"},
	{0, "nand"},
	{0, "spi"},
	{0, "tdm"},
	{0, "sdio"},
	{0, "lcd"},
	{0, "hwmon"},
	{0, "rtc"},
	{0, "gpio"},
	{0, "mstr"},
	{-1, "last"}
};

MV_BOOL mvUnitMapIsRsrcLimited(void)
{
	return mv_rsrc_limited;
}

MV_VOID mvUnitMapSetRsrcLimited(MV_BOOL isLimited)
{
	mv_rsrc_limited = isLimited;
}

MV_BOOL mvUnitMapIsMine(MV_SOC_UNIT unitIdx)
{
	return mv_res_table[unitIdx].isMine;
}

MV_BOOL mvUnitMapIsPexMine(int pciIf)
{
	MV_SOC_UNIT unitIdx;

	/* Map line Number to PEX unit number */
	/* This is compatible to mvCtrlSerdesPhyConfig in BoardEnvLib.c */
	if(pciIf < PEX1_0x4)
		unitIdx = PEX0;
	else if(pciIf < PEX2_0x4)
		unitIdx = PEX1;
	else if(pciIf < PEX3_0x4)
		unitIdx = PEX2;
	else
		unitIdx = PEX3;	

	return mv_res_table[unitIdx].isMine;
}

MV_VOID mvUnitMapSetMine(MV_SOC_UNIT unitIdx)
{
	if (MV_TRUE == mv_res_table[unitIdx].isMine)
		return;

	mv_res_table[unitIdx].isMine = 1;
}

MV_BOOL mvUnitMapSetup(char* cmdLine, STRSTR_FUNCPTR strstr_func)
{
	int unitIdx;
	char* match;

	for (unitIdx = 0; mv_res_table[unitIdx].isMine != (-1); unitIdx++) {
		char *unitName = mv_res_table[unitIdx].unitName;
		int len;
		match = strstr_func(cmdLine, unitName);
		if (!match) continue;
		/*Look for start delimiter*/
		if (match > cmdLine) {
			if (match[-1] != ' ' && match[-1] != ':') {
				continue;
			}
		}
		/* Calc string length without using strlen() */
		while (*unitName++ != '\0');
		len = unitName - mv_res_table[unitIdx].unitName - 1;		
		/*Look for end delimiter*/
		if (match[len] != ' ' && match[len] != ':' && match[len] != '\0') {
			continue;
		}
		mvUnitMapSetMine(unitIdx);
	}
	return MV_TRUE;
}

MV_U32 mvSocUnitMapFillFlagFormTable(void)
{
	int i;
	MV_U32 flag = 0;
	for (i = 0; mv_res_table[i].cpuId != -1; i++) 
	{
	    if (mvSocUnitMapGet(i) == 0)//SLAVE_CPU)
	    {
		switch (i)
		{
		case UART0:  flag |= UART0_T0_CPU1;   	break;        
		case UART1:  flag |= UART1_TO_CPU1;   	break;       
		case PEX00:  flag |= PEX0_TO_CPU1;    	break;       
		case PEX10:  flag |= PEX1_TO_CPU1;    	break;       
		case GIGA0:  flag |= GIGA0_TO_CPU1;   	break;       
		case GIGA1:  flag |= GIGA1_TO_CPU1;   	break;       
		case GIGA2:  flag |= GIGA2_TO_CPU1;   	break;       
		case GIGA3:  flag |= GIGA3_TO_CPU1;   	break;       
		case SATA:   flag |= SATA_TO_CPU1;    	break;        
		case XOR:    flag |= XOR_TO_CPU1;	break;         
		case IDMA:   flag |= IDMA_TO_CPU1;    	break;        
		case USB0:   flag |= USB0_TO_CPU1;    	break;        
		case USB1:   flag |= USB1_TO_CPU1;    	break;        
		case USB2:   flag |= USB2_TO_CPU1;    	break;        
		case CESA:   flag |= CESA_TO_CPU1;    	break;        
		case NOR_FLASH: flag |= NOR_TO_CPU1;   break;
		case NAND_FLASH: flag |= NAND_TO_CPU1;   break;
		case SPI_FLASH: flag |= SPI_TO_CPU1;   break;
		case TDM: flag |= TDM_TO_CPU1;   break;
		default: 				
			break;
		}
	    }
	}

	return flag;
}*/
MV_VOID mvUnitMapSetAllMine()
{
	int unitIdx;
	for (unitIdx = 0; mv_res_table[unitIdx].isMine != (-1); unitIdx++) {
		mvUnitMapSetMine(unitIdx);
	}
}

MV_VOID mvUnitMapPrint()
{
	int unitIdx;
	mvOsPrintf("  AMP: Resources ");
	for (unitIdx = 0; mv_res_table[unitIdx].isMine != -1; unitIdx++) {
		if (mv_res_table[unitIdx].isMine) {
			mvOsPrintf("- %s ", mv_res_table[unitIdx].unitName);
		}
	}
	mvOsPrintf("\n");
}
