blob: efab128a1e0ff2e7e6babc1984e750a0bed7a107 [file] [log] [blame]
/*
* 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);
}