/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#include "api_avio_dhub.h"

HDL_dhub2d AG_dhubHandle;
HDL_dhub2d VPP_dhubHandle;

DHUB_channel_config  VPP_config[VPP_NUM_OF_CHANNELS] =
{
    // BANK0
    { avioDhubChMap_vpp128b_MV_R0, VPP_DHUB_BANK0_START_ADDR, VPP_DHUB_BANK0_START_ADDR+64, 64, (1024*11-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    { avioDhubChMap_vpp128b_VMM_VX_R, VPP_DHUB_BANK0_START_ADDR+1024*11, VPP_DHUB_BANK0_START_ADDR+1024*11+64, 64, (1024+512-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    // BANK1
    { avioDhubChMap_vpp128b_MV_R1, VPP_DHUB_BANK1_START_ADDR, VPP_DHUB_BANK1_START_ADDR+64, 64, (1024*4-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    { avioDhubChMap_vpp128b_DINT_W, VPP_DHUB_BANK1_START_ADDR+1024*4, VPP_DHUB_BANK1_START_ADDR+1024*4+64, 64, (1024*4-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    { avioDhubChMap_vpp128b_DINT0_R, VPP_DHUB_BANK1_START_ADDR+1024*8, VPP_DHUB_BANK1_START_ADDR+1024*8+64, 64, (1024*4+512-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    //BANK2
    { avioDhubChMap_vpp128b_GFX_PIP_R0, VPP_DHUB_BANK2_START_ADDR, VPP_DHUB_BANK2_START_ADDR+64, 64, (1024*8-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    { avioDhubChMap_vpp128b_PIP_R1, VPP_DHUB_BANK2_START_ADDR+1024*8, VPP_DHUB_BANK2_START_ADDR+1024*8+64, 64, (1024*4+512-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    //BANK3
    { avioDhubChMap_vpp128b_GFX_R1, VPP_DHUB_BANK3_START_ADDR, VPP_DHUB_BANK3_START_ADDR+64, 64, (1024*6-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    { avioDhubChMap_vpp128b_DINT1_R, VPP_DHUB_BANK3_START_ADDR+1024*6, VPP_DHUB_BANK3_START_ADDR+1024*6+64, 64, (1024*2+512-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    { avioDhubChMap_vpp128b_1DSCL_W0, VPP_DHUB_BANK3_START_ADDR+1024*8+512, VPP_DHUB_BANK3_START_ADDR+1024*8+512+64, 64, (1024*2-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
    { avioDhubChMap_vpp128b_1DSCL_W1, VPP_DHUB_BANK3_START_ADDR+1024*10+512, VPP_DHUB_BANK3_START_ADDR+1024*10+512+64, 64, (1024*2-64), dHubChannel_CFG_MTU_128byte, 1, 0, 1},
};

DHUB_channel_config  AG_config[AG_NUM_OF_CHANNELS] =
{
    // Bank0
    { avioDhubChMap_aio64b_MA0_R, AG_DHUB_BANK0_START_ADDR, AG_DHUB_BANK0_START_ADDR+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_MA1_R, AG_DHUB_BANK0_START_ADDR+256, AG_DHUB_BANK0_START_ADDR+256+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_MA2_R, AG_DHUB_BANK0_START_ADDR+256*2, AG_DHUB_BANK0_START_ADDR+256*2+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_MA3_R, AG_DHUB_BANK0_START_ADDR+256*3, AG_DHUB_BANK0_START_ADDR+256*3+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_SA_R, AG_DHUB_BANK0_START_ADDR+256*4, AG_DHUB_BANK0_START_ADDR+256*4+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_PDM_MIC_CH1_W, AG_DHUB_BANK0_START_ADDR+256*5, AG_DHUB_BANK0_START_ADDR+256*5+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_PDM_MIC_CH2_W, AG_DHUB_BANK0_START_ADDR+256*6, AG_DHUB_BANK0_START_ADDR+256*6+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_HDMI_R, AG_DHUB_BANK0_START_ADDR+256*7, AG_DHUB_BANK0_START_ADDR+256*7+32, 32, (512-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_BCM_R, AG_DHUB_BANK0_START_ADDR+256*9, AG_DHUB_BANK0_START_ADDR+256*9+128, 128, (512-128), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_TT_R, AG_DHUB_BANK0_START_ADDR+256*11, AG_DHUB_BANK0_START_ADDR+256*11+32, 32, (256-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_HDMIRX_CH3_W, AG_DHUB_BANK0_START_ADDR+512*6, AG_DHUB_BANK0_START_ADDR+512*6+32, 32, (512-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_HDMIRX_CH4_W, AG_DHUB_BANK0_START_ADDR+512*7, AG_DHUB_BANK0_START_ADDR+512*7+32, 32, (512-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_HDMIRX_CH5_W, AG_DHUB_BANK0_START_ADDR+512*8, AG_DHUB_BANK0_START_ADDR+512*8+32, 32, (512-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_HDMIRX_CH6_W, AG_DHUB_BANK0_START_ADDR+512*9, AG_DHUB_BANK0_START_ADDR+512*9+32, 32, (512-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_SPDIF_R, AG_DHUB_BANK0_START_ADDR+512*10, AG_DHUB_BANK0_START_ADDR+512*10+32, 32, (512-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
    { avioDhubChMap_aio64b_SPDIF_W, AG_DHUB_BANK0_START_ADDR+512*11, AG_DHUB_BANK0_START_ADDR+512*11+32, 32, (512-32), dHubChannel_CFG_MTU_128byte, 0, 0, 1},
};

/******************************************************************************
 *      Function: GetChannelInfo
 *      Description: Get the Dhub configuration of requested channel.
 *      Parameter : pdhubHandle ----- pointer to 2D dhubHandle
 *             IChannel        ----- Channel of the dhub
 *             cfg        ----- Configuration need to be updated here.
 *      Return:  0     ----    Success
*******************************************************************************/
int getDhubChannelInfo(HDL_dhub2d *pdhubHandle, SIGN32 IChannel,
		T32dHubChannel_CFG *cfg) {

	DHUB_channel_config *dhub_config;

	/*Get the Dhub Config array from the received handle*/
	if (pdhubHandle == &VPP_dhubHandle)
			dhub_config = VPP_config;
	if (pdhubHandle == &AG_dhubHandle)
			dhub_config = AG_config;

	/*Update the MTU, QOS and self loop paramteres.*/
	cfg->uCFG_MTU = dhub_config[IChannel].chanMtuSize;
	cfg->uCFG_QoS =  dhub_config[IChannel].chanQos;
	cfg->uCFG_selfLoop = dhub_config[IChannel].chanSelfLoop;
	return 0;
}
/******************************************************************************
 *    Function: DhubInitialization
 *    Description: Initialize DHUB .
 *    Parameter : cpuId ------------- cpu ID
 *             dHubBaseAddr -------------  dHub Base address.
 *             hboSramAddr ----- Sram Address for HBO.
 *             pdhubHandle ----- pointer to 2D dhubHandle
 *             dhub_config ----- configuration of AG
 *             numOfChans     ----- number of channels
 *    Return:        void
******************************************************************************/
void DhubInitialization(SIGN32 cpuId, UNSG32 dHubBaseAddr,
		UNSG32 hboSramAddr, HDL_dhub2d *pdhubHandle,
		DHUB_channel_config *dhub_config,
		SIGN32 numOfChans, DHUB_TYPE dHubType)
{
	HDL_semaphore *pSemHandle;
	SIGN32 i;
	SIGN32 chanId;
	SIGN32 cmdDiv = 8;
    (void)cpuId;

	if (dHubType == DHUB_TYPE_128BIT)
			cmdDiv = 16;
	else
			cmdDiv = 8;

	/*Initialize HDL_dhub with a $dHub BIU instance.*/

	dhub2d_hdl(hboSramAddr,
	     dHubBaseAddr,
	     pdhubHandle
	);

	/*set up semaphore to trigger cmd done interrupt
	note that this set of semaphores are different from the HBO semaphores
	the ID must match the dhub ID because they are hardwired.*/
	pSemHandle = dhub_semaphore(&pdhubHandle->dhub);

	for (i = 0; i < numOfChans; i++) {
			chanId = dhub_config[i].chanId;

			dhub_channel_cfg(
			    &pdhubHandle->dhub,
			    chanId,
			    dhub_config[i].chanCmdBase,
			    dhub_config[i].chanDataBase,
			    dhub_config[i].chanCmdSize/cmdDiv,
			    dhub_config[i].chanDataSize/cmdDiv,
			    dhub_config[i].chanMtuSize,
			    dhub_config[i].chanQos,
			    dhub_config[i].chanSelfLoop,
			    dhub_config[i].chanEnable,
			    0
			    );
			/* setup interrupt for channel chanId */
			/*configure the semaphore depth to be 1 */
			semaphore_cfg(pSemHandle, chanId, 1, 0);
	}
}

/******************************************************************************
 *    Function: DhubChannelClear
 *    Description: Clear corresponding DHUB channel.
 *    Parameter:    hdl  ---------- handle to HDL_dhub
 *            id   ---------- channel ID in dHubReg
 *            cfgQ ---------- pass null to directly init dhub, or pass
 *                            non-zero to receive programming sequence in
 *                            (adr, data) pairs
 *    Return:        void
******************************************************************************/
void DhubChannelClear(void *hdl, SIGN32 id, T64b cfgQ[])
{
	UNSG32    cmdID = dhub_id2hbo_cmdQ(id);
	UNSG32    dataID = dhub_id2hbo_data(id);
	HDL_dhub *dhub = (HDL_dhub *)hdl;
	HDL_hbo *hbo = &(dhub->hbo);

	hbo_queue_enable(hbo, cmdID, 0, cfgQ);
	dhub_channel_enable(dhub, id, 0, cfgQ);
	dhub_channel_clear(dhub, id);
	dhub_channel_clear_done(dhub, id);
	hbo_queue_enable(hbo, cmdID, 0, cfgQ);
	hbo_queue_clear(hbo, cmdID);
	hbo_queue_clear_done(hbo, cmdID);
	hbo_queue_enable(hbo, dataID, 0, cfgQ);
	hbo_queue_clear(hbo, dataID);
	hbo_queue_clear_done(hbo, dataID);
	dhub_channel_enable(dhub, id, 1, cfgQ);
	hbo_queue_enable(hbo, cmdID, 1, cfgQ);
	hbo_queue_enable(hbo, dataID, 1, cfgQ);
}

