天天看點

[RK3399][Android7.1] 系統重新開機調用過程(PSCI)

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文檔是一緻的。

[RK3399][Android7.1] 系統重新開機調用過程(PSCI)
[RK3399][Android7.1] 系統重新開機調用過程(PSCI)

參考:

Power_State_Coordination_Interface_PDD_v1_1_DEN0022D.pdf

Linux CPU core的電源管理(3)_cpu ops

繼續閱讀