Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83
系统重启调用和rk3288基本类似,只是rk3399平台对应的arm_pm_restart不同了。
rk3288的可参考
[RK3288][Android6.0] 系统重启调用过程小结
调用流程:
KEYWORD(powerctl, COMMAND, 1, do_powerctl) -> //keywords.h 根据传进来的字符串转换命令。
android_reboot -> //android_reboot.c
__reboot -> //reboot.h 系统调用,陷入内核。
SYSCALL_DEFINE4 -> //kernel/sys.c
kernel_restart ->
machine_restart -> //arch/arm64/kernel/process.c
arm_pm_restart
arm_pm_restart使用PSCI模块处理。
PSCI: Power State Coordination Interface。
ARMv7之后,由于架构复杂,传统的像rk3288平台上的reset机制已经无法满足reset/shutdown这类行为操作了。
可以认为PSCI是一套系统通用电源管理API,另外还有一种方法叫”spin_table”.
PSCI在rk3399.dtsi中定义:
psci {
compatible = "arm,psci-1.0";
method = "smc";
};
对应driver在psci.c中:
psci_dt_init ->
of_find_matching_node_and_match
init_fn ->
psci_0_2_init ->
psci_probe ->
psci_0_2_set_functions ->
arm_pm_restart = psci_sys_reset
psci_sys_reset():
static void psci_sys_reset(enum reboot_mode reboot_mode, const char *cmd)
{
invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
}
PSCI_0_2_FN_SYSTEM_RESET的定义:
#define PSCI_0_2_FN_SYSTEM_RESET PSCI_0_2_FN(9)
#define PSCI_0_2_FN(n) (PSCI_0_2_FN_BASE + (n))
#define PSCI_0_2_FN_BASE 0x84000000
代码的控制也是和PSCI文档是一致的。
参考:
Power_State_Coordination_Interface_PDD_v1_1_DEN0022D.pdf
Linux CPU core的电源管理(3)_cpu ops