/*lint -save -e18 -e516 */ s32 bsp_socp_get_write_buff(u32 u32SrcChanID, SOCP_BUFFER_RW_STRU *pBuff) { u32 u32ChanID; u32 u32ChanType; SOCP_RING_BUF_S pTempBuff; /* 判断是否已经初始化 */ SOCP_CHECK_INIT(); /* 判断参数有效性 */ SOCP_CHECK_PARA(pBuff); /* 判断通道ID是否有效 */ u32ChanID = SOCP_REAL_CHAN_ID(u32SrcChanID); u32ChanType = SOCP_REAL_CHAN_TYPE(u32SrcChanID); if(SOCP_CODER_SRC_CHAN != u32ChanType) { printk("get_write_buf:wrong chan id\n"); return BSP_ERROR; } /* 根据读写指针获取buffer */ SOCP_REG_READ(SOCP_REG_ENCSRC_BUFADDR(u32ChanID), pTempBuff.u32Start); SOCP_REG_READ(SOCP_REG_ENCSRC_BUFCFG0(u32ChanID), pTempBuff.u32Length); SOCP_REG_READ(SOCP_REG_ENCSRC_BUFRPTR(u32ChanID), pTempBuff.u32Read); SOCP_REG_READ(SOCP_REG_ENCSRC_BUFWPTR(u32ChanID), pTempBuff.u32Write); pTempBuff.u32IdleSize = 0; pTempBuff.u32End = pTempBuff.u32Start+pTempBuff.u32Length-1; socp_get_idle_buffer(&pTempBuff, pBuff); return BSP_OK; }
/***************************************************************************** * 函 数 名 : bsp_socp_write_done * * 功能描述 : 写数据完成函数 * * 输入参数 : u32SrcChanID 源通道ID u32WrtSize 写入数据的长度 * * 输出参数 : * * 返 回 值 : 操作完成与否的标识码 *****************************************************************************/ s32 bsp_socp_write_done(u32 u32SrcChanID, u32 u32WrtSize) { u32 u32ChanID; u32 u32ChanType; u32 u32WrtPad; SOCP_BUFFER_RW_STRU RwBuff; SOCP_RING_BUF_S pTempBuff; /* 判断是否已经初始化 */ SOCP_CHECK_INIT(); /* 判断参数有效性 */ SOCP_CHECK_PARA(u32WrtSize); /* 判断通道ID是否有效 */ u32ChanID = SOCP_REAL_CHAN_ID(u32SrcChanID); u32ChanType = SOCP_REAL_CHAN_TYPE(u32SrcChanID); if(SOCP_CODER_SRC_CHAN != u32ChanType) { printk("write_done:wrong chan id\n"); return BSP_ERROR; } u32WrtPad = u32WrtSize % 8; if (0 != u32WrtPad) { u32WrtSize += (8 - u32WrtPad); } SOCP_REG_READ(SOCP_REG_ENCSRC_BUFADDR(u32ChanID), pTempBuff.u32Start); SOCP_REG_READ(SOCP_REG_ENCSRC_BUFCFG0(u32ChanID), pTempBuff.u32Length); SOCP_REG_READ(SOCP_REG_ENCSRC_BUFRPTR(u32ChanID), pTempBuff.u32Read); SOCP_REG_READ(SOCP_REG_ENCSRC_BUFWPTR(u32ChanID), pTempBuff.u32Write); pTempBuff.u32IdleSize = 0; pTempBuff.u32End = pTempBuff.u32Start+pTempBuff.u32Length-1; socp_get_idle_buffer(&pTempBuff, &RwBuff); if(RwBuff.u32Size + RwBuff.u32RbSize <u32WrtSize) { printk("write_done:write_len>idle_len\n"); return BSP_ERROR; } /* 设置读写指针 */ socp_write_done(&pTempBuff, u32WrtSize); /* 写入写指针到写指针寄存器*/ SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFWPTR(u32ChanID), pTempBuff.u32Write); return BSP_OK; }
BSP_U32 DRV_SOCP_INIT_LTE_DSP(BSP_U32 ulChanId,BSP_U32 ulPhyAddr,BSP_U32 ulSize) { SOCP_ENCSRC_FIXCHAN_S *pChan; SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFADDR(ulChanId),(BSP_U32)ulPhyAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFWPTR(ulChanId),(BSP_U32)ulPhyAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFRPTR(ulChanId), (BSP_U32)ulPhyAddr); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0(ulChanId), 0, 27, ulSize); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0(ulChanId), 27, 5, 0); /*配置SOCP 参数*/ SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 1, 2, SOCP_ENCSRC_CHNMODE_CTSPACKET); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 4, 4, SOCP_DSPLOG_DST_BUFID); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 8, 2, SOCP_CHAN_PRIORITY_0); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 10, 1, SOCP_ENCSRC_BYPASS_DISABLE); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 16, 8, SOCP_DATA_TYPE_0); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 11, 1, SOCP_DATA_TYPE_EN); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 31, 1, SOCP_ENC_DEBUG_DIS); /* 使能中断*/ SOCP_REG_SETBITS(SOCP_REG_ENC_RAWINT1, ulChanId, 1, 1); SOCP_REG_SETBITS(SOCP_REG_APP_MASK1, ulChanId, 1, 0); /* 保存参数到全局变量*/ pChan = &g_stEncSrcFixChan[ulChanId]; pChan->u32ChanID = ulChanId; pChan->u32DestChanID = SOCP_DSPLOG_DST_BUFID; pChan->eChnMode = SOCP_ENCSRC_CHNMODE_CTSPACKET; pChan->eDataType = SOCP_DATA_TYPE_0; pChan->ePriority = SOCP_CHAN_PRIORITY_0; pChan->sEncSrcBuf.u32Start = (BSP_U32)ulPhyAddr; pChan->sEncSrcBuf.u32Write = (BSP_U32)ulPhyAddr; pChan->sEncSrcBuf.u32End = (BSP_U32)(ulPhyAddr+ulSize); pChan->sEncSrcBuf.u32Read = (BSP_U32)ulPhyAddr; pChan->sEncSrcBuf.u32Length = (BSP_U32)ulSize; pChan->u32ChanEn = SOCP_CHN_ENABLE; return BSP_OK; }
/***************************************************************************** * 函 数 名 : bsp_socp_drx_restore_reg * * 功能描述 : * * 返 回 值 : *****************************************************************************/ __ao_func void bsp_socp_drx_restore_reg(void) { u32 i = 0; u32 *g_pu32SocpDrxGlobal = (u32 *)(SOCP_DRX_BACKUP_DDR_ADDR); SOCP_DRX_ENCSRC_S *a_SocpDrxEncSrc; SOCP_DRX_ENCDST_S *a_SocpDrxEncDst; SOCP_DRX_DECSRC_S *a_SocpDrxDecSrc; SOCP_DRX_DECDST_S *a_SocpDrxDecDst; /* backup regs: global and int */ socp_memcpy((u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_GBLRST), g_pu32SocpDrxGlobal, SOCP_DRX_REG_GBLRST_NUM); g_pu32SocpDrxGlobal += SOCP_DRX_REG_GBLRST_NUM; socp_memcpy((u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_GBL_INTSTAT), g_pu32SocpDrxGlobal, SOCP_DRX_REG_ENCINT_NUM); g_pu32SocpDrxGlobal += SOCP_DRX_REG_ENCINT_NUM; socp_memcpy((u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_DEC_CORE0MASK0), g_pu32SocpDrxGlobal, SOCP_DRX_REG_DECINT_NUM); g_pu32SocpDrxGlobal += SOCP_DRX_REG_DECINT_NUM;; /*lint -save -e740*/ /* resume regs: channel type */ for(i=0;i<SOCP_MAX_ENCDST_CHN;i++) { a_SocpDrxEncDst = (SOCP_DRX_ENCDST_S *)g_pu32SocpDrxGlobal; SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFADDR(i), a_SocpDrxEncDst->u32StartAddr); SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFRPTR(i), a_SocpDrxEncDst->u32ReadAddr); SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFWPTR(i), a_SocpDrxEncDst->u32WriteAddr); SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFCFG(i), a_SocpDrxEncDst->u32Config); SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFTHRH(i), a_SocpDrxEncDst->u32Thrh); SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFTHRESHOLD(i), a_SocpDrxEncDst->u32Threshold); /* clean buffer for encdst 1 */ g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_ENCDST_S)/sizeof(u32)); } for(i=0;i<SOCP_MAX_DECDST_CHN;i++) { a_SocpDrxDecDst = (SOCP_DRX_DECDST_S *)g_pu32SocpDrxGlobal; SOCP_REG_WRITE(SOCP_REG_DECDEST_BUFADDR(i), a_SocpDrxDecDst->u32StartAddr); SOCP_REG_WRITE(SOCP_REG_DECDEST_BUFRPTR(i), a_SocpDrxDecDst->u32ReadAddr); SOCP_REG_WRITE(SOCP_REG_DECDEST_BUFWPTR(i), a_SocpDrxDecDst->u32WriteAddr); SOCP_REG_WRITE(SOCP_REG_DECDEST_BUFCFG(i), a_SocpDrxDecDst->u32Config); g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_DECDST_S)/sizeof(u32)); } for(i=0;i<SOCP_MAX_ENCSRC_CHN;i++) { a_SocpDrxEncSrc= (SOCP_DRX_ENCSRC_S *)g_pu32SocpDrxGlobal; SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFADDR(i), a_SocpDrxEncSrc->u32StartAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFWPTR(i), a_SocpDrxEncSrc->u32WriteAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFRPTR(i), a_SocpDrxEncSrc->u32ReadAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFCFG0(i), a_SocpDrxEncSrc->u32Config0); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQADDR(i), a_SocpDrxEncSrc->u32RDStartAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQRPTR(i), a_SocpDrxEncSrc->u32RDReadAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQWPTR(i), a_SocpDrxEncSrc->u32RDWriteAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQCFG(i), a_SocpDrxEncSrc->u32RDConfig); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFCFG1(i), a_SocpDrxEncSrc->u32Config1); g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_ENCSRC_S)/sizeof(u32)); } for(i=0;i<SOCP_MAX_DECSRC_CHN;i++) { a_SocpDrxDecSrc = (SOCP_DRX_DECSRC_S *)g_pu32SocpDrxGlobal; SOCP_REG_WRITE(SOCP_REG_DECSRC_BUFADDR(i), a_SocpDrxDecSrc->u32StartAddr); SOCP_REG_WRITE(SOCP_REG_DECSRC_BUFWPTR(i), a_SocpDrxDecSrc->u32WriteAddr); SOCP_REG_WRITE(SOCP_REG_DECSRC_BUFRPTR(i), a_SocpDrxDecSrc->u32ReadAddr); SOCP_REG_WRITE(SOCP_REG_DECSRC_BUFCFG0(i), a_SocpDrxDecSrc->u32Config ); g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_DECSRC_S)/sizeof(u32)); } /*lint -restore*/ #ifdef CONFIG_DEFLATE (void)bsp_deflate_drx_restore_reg(); #endif return ; }
/***************************************************************************** * 函 数 名 : socpInit * * 功能描述 : 模块初始化函数 * * 输入参数 : 无 * * 输出参数 : 无 * * 返 回 值 : 初始化成功的标识码 *****************************************************************************/ void socp_m3_init(void) { u32 i; u32 u32ResetValue = 0; u32 u32BufAddr = 0; struct device_node* dev = NULL; #ifdef CONFIG_DEFLATE struct device_node* dev1 = NULL; #endif u32 version; #if 1 s32 ret; #endif #if(FEATURE_SOCP_ON_DEMAND == FEATURE_ON) if(BSP_OK != socp_icc_chan_init()) { return; } #endif if (BSP_TRUE == g_strSocpStat.bInitFlag) { return ; } memset(&g_strSocpStat, 0, sizeof(SOCP_GBL_STATE)); dev = of_find_compatible_node(NULL,NULL,"hisilicon,socp_balong_lpm3"); if(NULL == dev) { return ; } g_strSocpStat.baseAddr = (u32)of_iomap(dev,0); printk("socp base addr :0x%x\n",g_strSocpStat.baseAddr); if(0 == g_strSocpStat.baseAddr) { return ; } #ifdef CONFIG_DEFLATE dev1 = of_find_compatible_node(NULL,NULL,"hisilicon,deflate_balong_lpm3"); if(NULL == dev1) { printk("Socpdeflate dev find failed!\n"); return ; } g_strDeflateStat.baseAddr = (u32)of_iomap(dev1,0); //printk("socp base addr :0x%x\n",g_strDeflateStat.baseAddr); if(0 == g_strDeflateStat.baseAddr) { printk("base addr is error!\n"); return ; } #endif /* 对全局寄存器进行复位 */ SOCP_REG_WRITE(SOCP_REG_GBLRST, 1); /* 等待通道复位状态自清 */ for(i=0; i<SOCP_RESET_TIME; i++) { SOCP_REG_READ(SOCP_REG_GBLRST, u32ResetValue); if(0 == u32ResetValue) { break; } if((SOCP_RESET_TIME -1) == i) { return ; } } /* 增加ram中寄存器的复位操作*/ for(i=0; i<SOCP_MAX_ENCSRC_CHN; i++) { SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFADDR(i),0); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFCFG0(i),0); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQWPTR(i),0); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQRPTR(i),0); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQADDR(i),0); SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQCFG(i),0); } for(i=0; i<SOCP_MAX_ENCDST_CHN; i++) { SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFADDR(i),0); } /* 配置传输中断超时时间和buffer溢出超时时间 */ SOCP_REG_WRITE(SOCP_REG_INTTIMEOUT, SOCP_TRANS_TIMEOUT_DEFAULT); SOCP_REG_SETBITS(SOCP_REG_BUFTIMEOUT, 31, 1, 0); SOCP_REG_SETBITS(SOCP_REG_BUFTIMEOUT, 0, 16, SOCP_OVERFLOW_TIMEOUT_DEFAULT); /* 配置解码通路包长度配置寄存器*/ SOCP_REG_SETBITS(SOCP_REG_DEC_PKTLEN, 0, 12, SOCP_DEC_PKTLGTH_MAX); SOCP_REG_SETBITS(SOCP_REG_DEC_PKTLEN, 12, 5, SOCP_DEC_PKTLGTH_MIN); /* 时钟门控,空闲时时钟自动关闭 */ writel(0xffffffff, SOCP_REG_BASEADDR + 0x14); /* 屏蔽中断 */ SOCP_REG_SETBITS(SOCP_REG_ENC_MASK0, 0, 7, 0x7f); SOCP_REG_WRITE(SOCP_REG_APP_MASK1, 0xffffffff); SOCP_REG_SETBITS(SOCP_REG_ENC_MASK2, 0, 7, 0x7f); SOCP_REG_SETBITS(SOCP_REG_ENC_MASK2, 16, 7, 0x7f); SOCP_REG_WRITE(SOCP_REG_APP_MASK3, 0xffffffff); SOCP_REG_SETBITS(SOCP_REG_DEC_CORE0MASK0, 0, 16, 0xffff); SOCP_REG_SETBITS(SOCP_REG_DEC_MASK1, 0, 24, 0xffffff); SOCP_REG_SETBITS(SOCP_REG_DEC_CORE0MASK2, 0, 16, 0xffff); for (i = 0; i < SOCP_ENCSRC_M3_NUM; i++) { u32BufAddr = SOCP_M3_LPM3_ENCSRC_ADDR + i*SOCP_M3_CHN_SIZE; SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFADDR((i + SOCP_ENCSRC_LPM3_BASE)), u32BufAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFWPTR((i + SOCP_ENCSRC_LPM3_BASE)), u32BufAddr); SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFRPTR((i + SOCP_ENCSRC_LPM3_BASE)), u32BufAddr); /*config0 */ SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0((i + SOCP_ENCSRC_LPM3_BASE)), 0, 27, SOCP_M3_CHN_SIZE); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0((i + SOCP_ENCSRC_LPM3_BASE)), 27, 5, 0); /*配置SOCP 参数*/ SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 0, 1, 0); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 1, 2, 1); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 4, 4, SOCP_CODER_DST_OM_IND); if(0==i) { SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 8, 2, 1); } else { SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 8, 2, 0); } SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 10, 1, 0); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 11, 1, 0); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 16, 8, 0); SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 31, 1, 0); /* 使能中断*/ SOCP_REG_SETBITS(SOCP_REG_ENC_RAWINT1, (SOCP_ENCSRC_LPM3_BASE + i), 1, 1); SOCP_REG_SETBITS(SOCP_REG_APP_MASK1, (SOCP_ENCSRC_LPM3_BASE + i), 1, 0); g_strSocpStat.u32IntEncDstTfr = 0; } SOCP_REG_READ(SOCP_REG_SOCP_VERSION, version); if(version >= SOCP_NEW_VERSION) { /*新逻辑统一配置编码源安全使能*/ /*0~3、10号通道为非安全通道,其它均为安全通道*/ SOCP_REG_WRITE(SOCP_REG_ENCDEST_SEC_CTRL, 0xffff7bf0); } g_socp_rsracc_device.reg_addr = (u32*)(g_strSocpStat.baseAddr); if (bsp_rsracc_support()) { printk("bsp_rsracc_register socp 0x%x.\n", (u32)g_socp_rsracc_device.reg_addr); ret = bsp_rsracc_register(&g_socp_rsracc_device, 1); if(ret) { printk("bsp_rsracc_register socp failed.\n"); } } /* 设置初始化状态 */ g_strSocpStat.bInitFlag = BSP_TRUE; return ; }