Пример #1
0
int his_modem_ipc_send(void)
{
    int ret = 0;

    ret = bsp_ipc_int_send(IPC_CORE_MCORE, IPC_MCU_INT_SRC_CCPU_START);
#if 0
    rproc_msg_t msg = 5;

    ret = RPROC_ASYNC_SEND(HISI_RPROC_LPM3, &msg, 4, ASYNC_MSG, NULL, NULL);
#endif

    return ret;
}
/********************************ST BEGIN****************************************/
s32 ipc_test_case01(void)
{
	s32 ret=0;
	ret = bsp_ipc_sem_create(IPC_SEM1_IPC_TEST);
	if(OK!=ret)
	{
		bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"[%s], bsp_ipc_sem_create error\n",__FUNCTION__);
		return ERROR;
	}
	ret = bsp_ipc_sem_take(IPC_SEM1_IPC_TEST,10);
	if(OK!=ret)
	{
		bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"[%s], bsp_ipc_sem_take error\n",__FUNCTION__);
		return ERROR;
	}
	ret = bsp_ipc_sem_give(IPC_SEM1_IPC_TEST);
	if(OK!=ret)
	{
		bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"[%s], sem_give error\n",__FUNCTION__);
		return ERROR;
	}
	ret = bsp_ipc_int_send(DEST_CORE,TEST_INT_NUM);
	if(OK!=ret)
	{
		bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"[%s], int send error\n",__FUNCTION__);
		return ERROR;
	}
	delay(100);
	ret = bsp_ipc_sem_take(IPC_SEM1_IPC_TEST,10);
	if(OK!=ret)
	{
		ret = bsp_ipc_sem_delete(IPC_SEM1_IPC_TEST);
		if(OK!=ret)
		{
			bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"[%s], bsp_ipc_sem_delete error\n",__FUNCTION__);
			return ERROR;
		}
		return OK;
	}
	else
	{
		ret = bsp_ipc_sem_delete(IPC_SEM1_IPC_TEST);
		if(OK!=ret)
		{
			bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"[%s], bsp_ipc_sem_delete error\n",__FUNCTION__);
			return ERROR;
		}
		return ERROR;
	}	
}
s32 do_power_off(u16 action)
{
	u32 msg = 0;
	s32 ret = RESET_ERROR;
	u32 ack_val = 0xff;

	/* 设置启动模式为C核单独复位 */
	bsp_reset_bootflag_set(CCORE_IS_REBOOT);
	g_modem_reset_ctrl.boot_mode = readl((volatile const void *)SCBAKDATA13);
	reset_print_debug("(%d) set boot mode:0x%x\n", ++g_reset_debug.main_stage, g_modem_reset_ctrl.boot_mode);

	/* 唤醒ccore */
	ret = bsp_ipc_int_send(IPC_CORE_CCORE, g_modem_reset_ctrl.ipc_send_irq_wakeup_ccore);
	if(ret != 0)
	{
		reset_print_err("wakeup ccore failt\n");
	}

	/* 复位前各组件回调 */
	ret = invoke_reset_cb(DRV_RESET_CALLCBFUN_RESET_BEFORE);
	if(ret < 0)
	{
		reset_reboot_system(RESET_TYPE_CB_INVOKE_BEFORE);
		return RESET_ERROR;
	}

	/* 阻止核间通信 */
	ccore_msg_switch_off(g_modem_reset_ctrl.multicore_msg_switch, CCORE_STATUS);
	reset_print_debug("(%d) switch off msg connect:%d\n", ++g_reset_debug.main_stage, g_modem_reset_ctrl.multicore_msg_switch);

	/* 通知hifi,停止与modem交互 */
	ret = send_msg_to_hifi(DRV_RESET_CALLCBFUN_RESET_BEFORE);
	if(ret < 0)
	{
		reset_print_err("send_msg_to_hifi=0x%x fail\n", ret);
		reset_reboot_system(RESET_TYPE_SEND_MSG2_M3_FAIL_BEFORE);
		return RESET_ERROR;
	}
	/*  等待hifi处理完成 */
	if (osl_sem_downtimeout(&(g_modem_reset_ctrl.wait_hifi_reply_sem), msecs_to_jiffies((u32)RESET_WAIT_RESP_TIMEOUT)))/*lint !e713 */
	{
		reset_print_err("waiting the reply from hifi timeout(%d), but not reboot system!\n", RESET_WAIT_RESP_TIMEOUT);
	}
	reset_print_debug("(%d) has received the reply from hifi\n", ++g_reset_debug.main_stage);

	/* 通知modem master进idle态,并等待ccore回复 */
	let_modem_master_in_idle();
	ret = osl_sem_downtimeout(&(g_modem_reset_ctrl.wait_modem_master_in_idle_sem),
		msecs_to_jiffies(RESET_WAIT_MODEM_IN_IDLE_TIMEOUT));/*lint !e713 */
	if (ret)
	{
		reset_print_debug("(%d) let modem master in idle timeout\n", ++g_reset_debug.main_stage);
		master_in_idle_timestamp_dump();
	}
	else
	{
		reset_print_debug("(%d) let modem master in idle successfully\n", ++g_reset_debug.main_stage);
	}

	/* 通知m3进行复位前辅助处理 */
	msg = RESET_INFO_MAKEUP(action, DRV_RESET_CALLCBFUN_RESET_BEFORE); /*lint !e701 */
	ret = RESET_ERROR;

	/* 复位解复位modem子系统期间不接收ipc消息 */
	disable_ipc_irq();
	ret = send_sync_msg_to_mcore(msg, &ack_val);
	if(ret)
	{
		reset_print_err("send_sync_msg_to_mcore(0x%x) before reset fail!\n", ret);
		reset_reboot_system(RESET_TYPE_SEND_MSG2_M3_FAIL_BEFORE);
		return RESET_ERROR;
	}
	else if(RESET_MCORE_BEFORE_RESET_OK != ack_val)
	{
		reset_print_err("bus error probed on m3, ack_val=0x%x, %s\n!\n", ack_val, 
			lpm3_err[ack_val-RESET_MCORE_BEFORE_AP_TO_MDM_BUS_ERR]);
		reset_reboot_system(RESET_TYPE_SEND_MSG2_M3_FAIL_BEFORE);
		return RESET_ERROR;
	}
	enable_ipc_irq();
	reset_print_debug("(%d) before reset stage has communicated with lpm3 succeed\n", ++g_reset_debug.main_stage);

	return RESET_OK;
}
Пример #4
0
/********************************************************
*函数名   : mbb_common_ipc_send
*函数功能 : 向C核发送消息
*输入参数 : u32 flag
*输出参数 : 无
*返回值   : 执行成功返回0,失败返回非0值
*修改历史 :
*           2013-11-25 徐超 初版作成
********************************************************/
void mbb_common_ipc_send(u32 flag)
{
    SRAM_SMALL_SECTIONS * sram_mem = ((SRAM_SMALL_SECTIONS * )SRAM_SMALL_SECTIONS_ADDR);
    sram_mem->SRAM_MBB_COMMON = flag;
    bsp_ipc_int_send(IPC_CORE_CCORE,IPC_CCPU_INT_SRC_ACPU_MBB_COMM);
}
Пример #5
0
BSP_S32 BSP_IPC_IntSend(IPC_INT_CORE_E enDstCore, IPC_INT_LEV_E ulLvl)
{
	return bsp_ipc_int_send(enDstCore, ulLvl);
}
int mdrv_ipc_int_send(IPC_INT_CORE_E enDstCore, IPC_INT_LEV_E ulLvl)
{
	return bsp_ipc_int_send(enDstCore, ulLvl);
}
s32 bsp_ipc_test_to_m(void)
{
	(void)bsp_ipc_int_send(IPC_CORE_MCORE,IPC_MCU_INT_SRC_TEST);
	return OK;
}