/*******************************************************************************
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 "mvSysHwConfig.h"
#include "mvOs.h"
#include "ctrlEnv/mvCtrlEnvSpec.h"
#include "mvSata3Regs.h"
#include "mvSata3.h"

/* defines  */

/* #define MV_DEBUG */

#ifdef MV_DEBUG
#define DB(x)	x
#else
#define DB(x)
#endif

/* BITs in Windows 0-3 Control and Base Registers */
#define MV_SATA3_WIN_ENABLE_BIT               0
#define MV_SATA3_WIN_ENABLE_MASK              (1<<MV_SATA3_WIN_ENABLE_BIT)

#define MV_SATA3_WIN_TARGET_OFFSET            4
#define MV_SATA3_WIN_TARGET_MASK              (0xF<<MV_SATA3_WIN_TARGET_OFFSET)

#define MV_SATA3_WIN_ATTR_OFFSET              8
#define MV_SATA3_WIN_ATTR_MASK                (0xFF<<MV_SATA3_WIN_ATTR_OFFSET)

#define MV_SATA3_WIN_SIZE_OFFSET              16
#define MV_SATA3_WIN_SIZE_MASK                (0xFFFF<<MV_SATA3_WIN_SIZE_OFFSET)

#define MV_SATA3_WIN_BASE_OFFSET              4
#define MV_SATA3_WIN_BASE_MASK                (0xFFFFFFF<<MV_SATA3_WIN_BASE_OFFSET)

#define MV_SATA3_WIN_SIZE_ALIGN		    _64K

MV_TARGET sata3AddrDecPrioTab[] = {
#if defined(MV_INCLUDE_SDRAM_CS0)
	SDRAM_CS0,
#endif
#if defined(MV_INCLUDE_SDRAM_CS1)
	SDRAM_CS1,
#endif
#if defined(MV_INCLUDE_SDRAM_CS2)
	SDRAM_CS2,
#endif
#if defined(MV_INCLUDE_SDRAM_CS3)
	SDRAM_CS3,
#endif
	TBL_TERM
};

static MV_SATA3_HAL_DATA sata3HalData;

MV_STATUS mvSata3HalInit(MV_SATA3_HAL_DATA *halData)
{
	mvOsMemcpy(&sata3HalData, halData, sizeof(MV_SATA3_HAL_DATA));
	return MV_OK;
}

/*******************************************************************************
* sataWinOverlapDetect - Detect SATA address windows overlapping
*
* DESCRIPTION:
*       An unpredicted behaviur is expected in case SATA address decode
*       windows overlapps.
*       This function detects SATA address decode windows overlapping of a
*       specified window. The function does not check the window itself for
*       overlapping. The function also skipps disabled address decode windows.
*
* INPUT:
*       winNum      - address decode window number.
*       pAddrDecWin - An address decode window struct.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_TRUE if the given address window overlap current address
*       decode map, MV_FALSE otherwise, MV_ERROR if reading invalid data
*       from registers.
*
*******************************************************************************/
static MV_STATUS sata3WinOverlapDetect(int dev, MV_U32 winNum, MV_ADDR_WIN *pAddrWin)
{
	MV_U32 winNumIndex;
	MV_UNIT_WIN_INFO addrDecWin;

	for (winNumIndex = 0; winNumIndex < MV_SATA3_MAX_ADDR_DECODE_WIN; winNumIndex++) {
		/* Do not check window itself       */
		if (winNumIndex == winNum)
			continue;

		/* Get window parameters    */
		if (MV_OK != mvSata3WinRead(dev, winNumIndex, &addrDecWin)) {
			mvOsPrintf("%s: ERR. mvSata3WinGet failed\n", __func__);
			return MV_ERROR;
		}

		/* Do not check disabled windows    */
		if (addrDecWin.enable == MV_FALSE)
			continue;

		if (MV_TRUE == mvWinOverlapTest(pAddrWin, &(addrDecWin.addrWin)))
			return MV_TRUE;
	}
	return MV_FALSE;
}

/*******************************************************************************
* mvSata3WinWrite - Set SATA target address window
*
* DESCRIPTION:
*       This function sets a peripheral target (e.g. SDRAM bank0, PCI_MEM0)
*       address window, also known as address decode window.
*       After setting this target window, the SATA will be able to access the
*       target within the address window.
*
* INPUT:
*       winNum      - SATA target address decode window number.
*       pAddrDecWin - SATA target window data structure.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_ERROR if address window overlapps with other address decode windows.
*       MV_BAD_PARAM if base address is invalid parameter or target is
*       unknown.
*
*******************************************************************************/
MV_STATUS mvSata3WinWrite(MV_U32 dev, MV_U32 winNum, MV_UNIT_WIN_INFO *pAddrDecWin)
{
	MV_U32 sizeReg, baseReg, ctrlReg;

	/* Parameter checking   */
	if (winNum >= MV_SATA3_MAX_ADDR_DECODE_WIN) {
		mvOsPrintf("%s: ERR. Invalid win num %d\n", __func__, winNum);
		return MV_BAD_PARAM;
	}

	/* Check if the requested window overlapps with current windows         */
	if (MV_TRUE == sata3WinOverlapDetect(dev, winNum, &pAddrDecWin->addrWin)) {
		mvOsPrintf("%s: ERR. Window %d overlap\n", __func__, winNum);
		return MV_ERROR;
	}

	/* check if address is aligned to the size */
	if (MV_IS_NOT_ALIGN(pAddrDecWin->addrWin.baseLow, pAddrDecWin->addrWin.size)) {
		mvOsPrintf("mvSata3WinSet:Error setting SATA window %d.\n"
			   "Address 0x%08x is unaligned to size 0x%llx.\n",
			   winNum, pAddrDecWin->addrWin.baseLow, pAddrDecWin->addrWin.size);
		return MV_ERROR;
	}

	baseReg = pAddrDecWin->addrWin.baseLow & MV_SATA3_WIN_BASE_MASK;
	sizeReg = (pAddrDecWin->addrWin.size / MV_SATA3_WIN_SIZE_ALIGN) - 1;
	sizeReg = sizeReg << MV_SATA3_WIN_SIZE_OFFSET;

	/* set attributes */
	ctrlReg = (pAddrDecWin->attrib << MV_SATA3_WIN_ATTR_OFFSET);

#ifdef MV88F68XX
	/* Temp WA for A38x: set attribute with IOCC bit enabled:
	 * When using Dual CS, disk detection fails without using IOCC bit enabled */
	ctrlReg |= BIT12;
#endif

	/* set target ID */
	ctrlReg &= ~MV_SATA3_WIN_TARGET_MASK;
	ctrlReg |= (pAddrDecWin->targetId << MV_SATA3_WIN_TARGET_OFFSET);

	if (pAddrDecWin->enable == MV_TRUE)
		ctrlReg |= MV_SATA3_WIN_ENABLE_MASK;
	else
		ctrlReg &= ~MV_SATA3_WIN_ENABLE_MASK;

	MV_REG_WRITE(MV_SATA3_WIN_CTRL_REG(dev, winNum), ctrlReg);
	MV_REG_WRITE(MV_SATA3_WIN_BASE_REG(dev, winNum), baseReg);
	MV_REG_WRITE(MV_SATA3_WIN_SIZE_REG(dev, winNum), sizeReg);

	return MV_OK;
}

/*******************************************************************************
* mvSata3WinRead - Get SATA peripheral target address window.
*
* DESCRIPTION:
*       Get SATA peripheral target address window.
*
* INPUT:
*       winNum - SATA target address decode window number.
*
* OUTPUT:
*       pAddrDecWin - SATA target window data structure.
*
* RETURN:
*       MV_ERROR if register parameters are invalid.
*
*******************************************************************************/
MV_STATUS mvSata3WinRead(MV_U32 dev, MV_U32 winNum, MV_UNIT_WIN_INFO *pAddrDecWin)
{
	MV_U32 sizeReg, baseReg, ctrlReg;
	MV_U32 sizeRegVal;

	/* Parameter checking   */
	if (winNum >= MV_SATA3_MAX_ADDR_DECODE_WIN) {
		mvOsPrintf("%s (dev=%d): ERR. Invalid winNum %d\n", __func__, dev, winNum);
		return MV_NOT_SUPPORTED;
	}

	baseReg = MV_REG_READ(MV_SATA3_WIN_BASE_REG(dev, winNum));
	sizeReg = MV_REG_READ(MV_SATA3_WIN_SIZE_REG(dev, winNum));
	ctrlReg = MV_REG_READ(MV_SATA3_WIN_CTRL_REG(dev, winNum));

	/* Extract base address and size    */
	sizeRegVal = (sizeReg & MV_SATA3_WIN_SIZE_MASK) >> MV_SATA3_WIN_SIZE_OFFSET;
	pAddrDecWin->addrWin.size = (sizeRegVal + 1) * MV_SATA3_WIN_SIZE_ALIGN;
	pAddrDecWin->addrWin.baseLow = baseReg & MV_SATA3_WIN_BASE_MASK;
	pAddrDecWin->addrWin.baseHigh = 0;

	/* attrib and targetId              */
	pAddrDecWin->attrib = (ctrlReg & MV_SATA3_WIN_ATTR_MASK) >> MV_SATA3_WIN_ATTR_OFFSET;
	pAddrDecWin->targetId = (ctrlReg & MV_SATA3_WIN_TARGET_MASK) >> MV_SATA3_WIN_TARGET_OFFSET;

	/* Check if window is enabled       */
	if (ctrlReg & MV_SATA3_WIN_ENABLE_MASK)
		pAddrDecWin->enable = MV_TRUE;
	else
		pAddrDecWin->enable = MV_FALSE;
	return MV_OK;
}

/*******************************************************************************
* mvSata3WinInit - Initialize the integrated SATA target address window.
*
* DESCRIPTION:
*       Initialize the SATA peripheral target address window.
*
* INPUT:
*
*
* OUTPUT:
*
*
* RETURN:
*       MV_ERROR if register parameters are invalid.
*
*******************************************************************************/
MV_STATUS mvSata3WinInit(MV_UNIT_WIN_INFO *addrWinMap)
{
	MV_U32 winNum, unit;
	MV_UNIT_WIN_INFO *addrDecWin;
	MV_U32 winPrioIndex = 0;

	/* Initiate Sata address decode */

	/* First disable all address decode windows */
	for (unit = 0; unit < SATA3_NUM_OF_PORTS; unit++) {
		if (MV_FALSE == sata3HalData.unitActive[unit])
			continue;
		for (winNum = 0; winNum < MV_SATA3_MAX_ADDR_DECODE_WIN; winNum++) {
			MV_U32 regVal = MV_REG_READ(MV_SATA3_WIN_CTRL_REG(unit, winNum));
			regVal &= ~MV_SATA3_WIN_ENABLE_MASK;
			MV_REG_WRITE(MV_SATA3_WIN_CTRL_REG(unit, winNum), regVal);
		}
	}
	for (unit = 0; unit < SATA3_NUM_OF_PORTS; unit++) {
		if (MV_FALSE == sata3HalData.unitActive[unit])
			continue;
		winNum = 0;
		winPrioIndex = 0;
		while ((sata3AddrDecPrioTab[winPrioIndex] != TBL_TERM) && (winNum < MV_SATA3_MAX_ADDR_DECODE_WIN)) {
			addrDecWin = &addrWinMap[sata3AddrDecPrioTab[winPrioIndex]];
			if (addrDecWin->enable == MV_TRUE) {
				if (MV_OK != mvSata3WinWrite(unit , winNum, addrDecWin))
					return MV_ERROR;

				winNum++;
			}
			winPrioIndex++;
		}
	}
	return MV_OK;
}
