s32 bsp_ipc_spin_lock_timeout(u32 u32SignalNum, u32 TimeoutMs)
{
	u32 u32HsCtrl = 0;
	u32 start_time = 0, end_time = 0, elapsed = 0;
	IPC_CHECK_PARA(u32SignalNum,IPC_SEM_BUTTOM);

	start_time = bsp_get_slice_value();
	elapsed = TimeoutMs * bsp_get_slice_freq() / 1000; /*lint !e647 */

	/* coverity[no_escape] */
	for(;;)
	{
		u32HsCtrl = readl(ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_HS_CTRL(ipc_ctrl.core_num, u32SignalNum));
		if (0 == u32HsCtrl)
		{
			ipc_debug.u32SemTakeTimes[u32SignalNum]++;
			ipc_debug.u32SemId = u32SignalNum;
			break;
		}

		end_time = bsp_get_slice_value();
		if(get_timer_slice_delta(start_time, end_time) > elapsed)
		{
			ipc_debug.u32SemCore = readl(ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_HS_STAT(ipc_ctrl.core_num, u32SignalNum));
			return MDRV_ERROR;
		}
	}
	return MDRV_OK;
}
Ejemplo n.º 2
0
/*lint -restore +e550*/
void ipc_modem_reset(void)
{
    u32 i = 0,ret = 0;
	for(i=0;i<32;i++)
	{
		ret = readl((const volatile void *)(ipc_ctrl.ipc_base + BSP_IPC_HS_STAT(ipc_ctrl.core_num,i)));
		if(ret == 0x9)
			writel(0,(volatile void *)(ipc_ctrl.ipc_base + BSP_IPC_HS_CTRL(IPC_CORE_CCORE, i)));
	}
	return  ;
}
static s32 ipc_suspend_late(struct dpm_device *dev)
{
	u32 i = 0,ret = 0;
	for(i=0;i<32;i++)
	{
		ret = readl(ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_HS_STAT(ipc_ctrl.core_num,i));
		if(ret==0x9)
		{
			//printksync("ipc signum id = %d is occupied\n",i);
			return MDRV_ERROR;
		}
	}
	return MDRV_OK;
}
Ejemplo n.º 4
0
static s32 ipc_suspend_noirq(struct device *dev)
{
	u32 i = 0,ret = 0;
	for(i=0;i<32;i++)
	{
		ret = readl((const volatile void *)(ipc_ctrl.ipc_base + BSP_IPC_HS_STAT(ipc_ctrl.core_num,i)));
		if(ret==0x8)
		{
			bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"signum id = %d is occupied\n",i);
			return ERROR;
		}
	}
	return OK;
}
static void ipc_free_sem_taked(u32 core_id)
{
    u32 i = 0;
    u32 ret = 0;

    for(i = 0; i < 32; i++)
    {
        /*判断资源锁占用,如果占用,则释放*/
        ret = readl((unsigned long)(ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_HS_STAT(core_id, i)));
        ret &= 0xf;/*取低4bit*/
        if (ret == ((1 << 3) | core_id))
        {
            writel(0, (unsigned long)(ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_HS_CTRL(core_id, i)));
        }
    }
}
void ipc_modem_reset_cb(DRV_RESET_CALLCBFUN_MOMENT stage, int userdata)
{
    u32 i = 0,ret = 0;
	unsigned long flags=0;
	local_irq_save(flags);
	if (DRV_RESET_CALLCBFUN_RESET_BEFORE == stage)
	{
		for(i=0;i<32;i++)
		{
			do{
				ret = readl(ipc_ctrl.ipc_base + BSP_IPC_HS_STAT(ipc_ctrl.core_num,i));
			}while(ret == 0xa);
			ipc_modem_reset_flag = 1;
		}
	}
	if (DRV_RESET_CALLCBFUN_RESETING == stage)
	{
		ipc_modem_reset_flag = 0;
	}
	local_irq_restore(flags);
	return;
}