[RK3399][Android7.1] 系统重启调用过程(PSCI)

https://blog.csdn.net/kris_fei/article/details/81207133

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
--------------------- 
 

你可能感兴趣的:(linux_uboot,rockchip)