psci

在setup_arch 中会启动psci的init
    if (acpi_disabled)
        psci_dt_init();
    else
        psci_acpi_init();
可见dtb和acpi分别调用不同的函数初始,以acpi为例
int __init psci_acpi_init(void)
{
    if (!acpi_psci_present()) {
        pr_info("is not implemented in ACPI.\n");
        return -EOPNOTSUPP;
    }

    pr_info("probing for conduit method from ACPI.\n");

    if (acpi_psci_use_hvc())
        invoke_psci_fn = __invoke_psci_fn_hvc;
    else
        invoke_psci_fn = __invoke_psci_fn_smc;

    return psci_probe();
}
其中psci和atf有两种方式,一种是hvc,一种是smc,主流是smc,具体是通过acpi_psci_use_hvc来判断。
bool __init acpi_psci_use_hvc(void)
{
    return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
}
可见是通过FADT表中的flag决定得。
最后调用psci_probe
static int __init psci_probe(void)
{
    u32 ver = psci_get_version();

    psci_0_2_set_functions();
    return 0;
}
在psci_probe 中调用psci_0_2_set_functions来设定psci执行函数
static void __init psci_0_2_set_functions(void)
{
    pr_info("Using standard PSCI v0.2 function IDs\n");
    psci_function_id[PSCI_FN_CPU_SUSPEND] =
                    PSCI_FN_NATIVE(0_2, CPU_SUSPEND);
    psci_ops.cpu_suspend = psci_cpu_suspend;

    psci_function_id[PSCI_FN_CPU_OFF] = PSCI_0_2_FN_CPU_OFF;
    psci_ops.cpu_off = psci_cpu_off;

    psci_function_id[PSCI_FN_CPU_ON] = PSCI_FN_NATIVE(0_2, CPU_ON);
    psci_ops.cpu_on = psci_cpu_on;

    psci_function_id[PSCI_FN_MIGRATE] = PSCI_FN_NATIVE(0_2, MIGRATE);
    psci_ops.migrate = psci_migrate;

    psci_ops.affinity_info = psci_affinity_info;

    psci_ops.migrate_info_type = psci_migrate_info_type;

    arm_pm_restart = psci_sys_reset;

    pm_power_off = psci_sys_poweroff;
}
主要是填充psci_ops这个结构体。
后续就可以直接调用psci_ops来处理问题
static int cpu_psci_cpu_boot(unsigned int cpu)
{
    int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_entry));
    if (err)
        pr_err("failed to boot CPU%d (%d)\n", cpu, err);

    return err;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值