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