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; }
/******************************************************** *函数名 : 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); }
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; }