s32 bsp_ipc_int_send(IPC_INT_CORE_E enDstCore, IPC_INT_LEV_E ulLvl) { unsigned long flags = 0,ret = 0; /*如果是modem处于复位状态,则调用AP侧IPC*/ /*ap receive mabx 0,send mbx 13*/ rproc_msg_t msg[2] ; /*发送标志,用于LPM3上接收时解析*/ msg[0]=(0<<24|9<<16|3<<8|14); if(!bsp_reset_ccpu_status_get()) { if(enDstCore!=IPC_CORE_MCORE) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC," only can send to mcore\n"); return ERROR; } msg[1]=(rproc_msg_t)(1<<(u32)ulLvl); ret = RPROC_ASYNC_SEND(HISI_RPROC_LPM3 , msg ,2,ASYNC_MSG, NULL, NULL); } else { IPC_CHECK_PARA(ulLvl,IPC_INT_BUTTOM); IPC_CHECK_PARA(enDstCore,IPC_CORE_BUTTOM); /*写原始中断寄存器,产生中断*/ spin_lock_irqsave(&ipc_ctrl.lock,flags); writel((u32)1 << ulLvl,(volatile void *)(ipc_ctrl.ipc_base + BSP_IPC_CPU_RAW_INT(enDstCore))); spin_unlock_irqrestore(&ipc_ctrl.lock,flags); ipc_debug.u32RecvIntCore = enDstCore; ipc_debug.u32IntSendTimes[enDstCore][ulLvl]++; } return OK; }
s32 bsp_ipc_int_send(IPC_INT_CORE_E enDstCore, IPC_INT_LEV_E ulLvl) { unsigned long flags = 0; unsigned int n = ulLvl/INTSRC_NUM; IPC_CHECK_PARA(ulLvl,(INTSRC_NUM*IPCM_NUM)); IPC_CHECK_PARA(enDstCore,IPC_CORE_BUTTOM); /*写原始中断寄存器,产生中断*/ spin_lock_irqsave(&ipc_ctrl.lock,flags); #ifdef CONFIG_IPCM_USE_FPGA_VIC if (IPC_CORE_MCORE == enDstCore) { writel((u32)1 << (ulLvl%INTSRC_NUM), g_p532_asic_ipcm_virt_addr + BSP_IPC_CPU_RAW_INT(enDstCore)); } else { writel((u32)1 << (ulLvl%INTSRC_NUM),ipc_ctrl.ipc_base[n] + BSP_IPC_CPU_RAW_INT(enDstCore)); } #else writel((u32)1 << (ulLvl%INTSRC_NUM),ipc_ctrl.ipc_base[n] + BSP_IPC_CPU_RAW_INT(enDstCore)); #endif #ifdef CONFIG_P531_DRX_IPC switch(ulLvl) { case IPC_INT_DICC_RELDATA: case IPC_ACPU_INT_SRC_CCPU_MSG: case IPC_ACPU_INT_SRC_CCPU_NVIM: case IPC_INT_DICC_USRDATA: case IPC_ACPU_INT_SRC_CCPU_ICC: case IPC_ACPU_INT_SRC_ICC_PRIVATE: case IPC_ACPU_SRC_CCPU_DUMP: writel(1<<IPC_MCU_INT_SRC_CCPU_DRX,ipc_ctrl.ipc_base[n] + BSP_IPC_CPU_RAW_INT(IPC_CORE_MCORE)); break; default: break; } #endif spin_unlock_irqrestore(&ipc_ctrl.lock,flags); ipc_debug.u32RecvIntCore = enDstCore; ipc_debug.u32IntSendTimes[enDstCore][ulLvl]++; return MDRV_OK; }
s32 bsp_ipc_int_send(IPC_INT_CORE_E enDstCore, IPC_INT_LEV_E ulLvl) { unsigned int flags=0; IPC_CHECK_PARA(ulLvl,IPC_INT_BUTTOM); IPC_CHECK_PARA(enDstCore,IPC_CORE_BUTTOM); if(ipc_modem_reset_flag) /* 核间信息不可以交互 */ { return IPC_ERR_MODEM_RESETING; } /*写原始中断寄存器,产生中断*/ local_irq_save(flags); writel((u32)1 << (u32)ulLvl,ipc_ctrl.ipc_base + BSP_IPC_CPU_RAW_INT(enDstCore)); local_irq_restore(flags); #ifdef IPC_DEBUG_FEATURE ipc_debug.u32RecvIntCore = enDstCore; ipc_debug.u32IntSendTimes[enDstCore][ulLvl]++; #endif return OK; }