首页 > 学院 > 开发设计 > 正文

psci

2019-11-09 14:38:34
字体:
来源:转载
供稿:网友
在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_probestatic 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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表