| /* |
| * 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); |
| } |
| |