[ATF]ARMv8 psci cpu off api

本文軟件分析使用arm-trust-firmwire v1.3版本。基於公開的fvp platform分析流程
cpu off的api是提供給hotplug使用的,主要是將cpu core powerdown。
psci 接口cpu off是在32bit的接口裏面,以前沒關注過這些,又翻看來一下kernel psci接口。
如下是kernel的psci接口設置函數,對應cpu off是直接賦予參數PSCI_0_2_FN_CPU_OFF,其他的是通過PSCI_FN_NATIVE接口賦予的。

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_FN_NATIVE區分64bit與32bit,參數的具體定義在kernel psci.h的頭文件中。

#ifdef CONFIG_64BIT
#define PSCI_FN_NATIVE(version, name)   PSCI_##version##_FN64_##name
#else
#define PSCI_FN_NATIVE(version, name)   PSCI_##version##_FN_##name
#endif

分析下來cpu suspend/cpu on/migrate/affinity_info/system_suspend(ver>1.0)等使用64bit api,cpu off/sys_reset/sys_poweroff等使用32bit。kernel的解釋:雖然64bit os可以使用smc32 api,但對於某些調用,有必要使用smc64 api傳遞或返回64bit值。

*具體hotplug cpu off的ATF flow如下:*
psci cpu off

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章