Esempio n. 1
0
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;
}