sylixos 下 t3 多核启动流程

在主核启动后,通知其它核进行启动:

for (ulCPUId = 1; ulCPUId < LW_NCPUS; ulCPUId++) {       /*  启动其它 CPU                */
        API_CpuUp(ulCPUId);
}
bspCpuUpSync();

/********************************************************************/


LW_API  
ULONG  API_CpuUp (ULONG  ulCPUId)
{
    INTREG          iregInterLevel;
    PLW_CLASS_CPU   pcpu;

    if ((ulCPUId == 0) || (ulCPUId >= LW_NCPUS)) {
        _ErrorHandle(EINVAL);
        return  (EINVAL);
    }
    
    KN_SMP_MB();
    pcpu = LW_CPU_GET(ulCPUId);
    if (LW_CPU_IS_ACTIVE(pcpu) ||                         // 判读是否激活
        (LW_CPU_GET_IPI_PEND2(pcpu) & LW_IPI_DOWN_MSK)) {
        return  (ERROR_NONE);
    }
    
    iregInterLevel = KN_INT_DISABLE();                    // 关总中断
    bspCpuUp(ulCPUId);                                    // 启核
    KN_INT_ENABLE(iregInterLevel);                        // 开总中断
    
    return  (ERROR_NONE);
}


VOID   bspCpuUp (ULONG  ulCPUId)
{
    INTREG  iregInterLevel;

    iregInterLevel = KN_INT_DISABLE();                   // 关总中断           

    _G_ulHoldingPen[ulCPUId] = 0;

    KN_SMP_MB();

    bspCpuUpSyncPoint1((PVOID)ulCPUId);                 // 数据cache 同步      

    sunxiSetSecondaryEntry((PVOID)BSP_CFG_RAM_BASE);    // 设置该核启动地址

    sunxiEnableCpu(ulCPUId);                            // 激活该核

    bspCpuUpSyncPoint2((PVOID)ulCPUId);

    KN_INT_ENABLE(iregInterLevel);                      // 开总中断 
}

VOID  bspCpuUpSync (VOID)
{
    INT              i;
    LW_CLASS_CPUSET  cpuset;

    LW_CPU_ZERO(&cpuset);

    LW_CPU_FOREACH (i) {
        LW_CPU_SET(i, &cpuset);
    }

    API_CacheBarrier(bspCpuCacheSync, LW_NULL, sizeof(cpuset), &cpuset); //多核cache 处理
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值