1. 硬件架构

  arm64

2. 内核版本

  4.19

3. 分析相关函数

  setup_arch()

    -> psci_dt_init()

      -> psci_0_2_init()

        -> get_set_conduit_method()

          -> of_property_read_string(np, "method", &method))

          -> set_conduit(PSCI_CONDUIT_HVC) 或set_conduit(PSCI_CONDUIT_SMC),根据设备树中的method属性来设定,

            设定invoke_psci_fn回调函数(__invoke_psci_fn_smc或者__invoke_psci_fn_hvc)

        -> psci_probe()

  __invoke_psci_fn_smc()

    -> arm_smccc_smc(),这是个宏定义,如下;

      #define arm_smccc_smc(...) __arm_smccc_smc(__VA_ARGS__, NULL)

      ->__arm_smccc_smc(),定义在arch/arm64/kernel/smccc-call.S中:

          .macro SMCCC instr
          .cfi_startproc
          \instr #0
          ldr x4, [sp]
          stp x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
          stp x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
          ldr x4, [sp, #8]
          cbz x4, 1f /* no quirk structure */
          ldr x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
          cmp x9, #ARM_SMCCC_QUIRK_QCOM_A6
          b.ne 1f
          str x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
          1: ret
          .cfi_endproc
          .endm


        /*
        * void arm_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
        * unsigned long a3, unsigned long a4, unsigned long a5,
        * unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
        * struct arm_smccc_quirk *quirk)
        */

       
       ENTRY(__arm_smccc_smc)
      SMCCC smc
       ENDPROC(__arm_smccc_smc)

4. 相关变量

  4.1 suspend_state_t mem_sleep_default = PM_SUSPEND_MAX; (kernel/power/suspend.c)

    PM_SUSPEND_MAX的定义:   

      #define PM_SUSPEND_MAX          ((__force suspend_state_t) 4)

    所以默认mem_sleep_default = 4;

  4.2 suspend_state_t mem_sleep_current = PM_SUSPEND_TO_IDLE;   

    PM_SUSPEND_TO_IDLE的定义:   

      #define PM_SUSPEND_TO_IDLE          ((__force suspend_state_t) 1)

    所以默认mem_sleep_current = 1;

  4.3 那么在哪里将mem_sleep_current的值改变了呢?

      在suspend_set_ops()中改变了此值,调用路径如下:

      psci_init_system_suspend()

        -> psci_features()

        -> suspend_set_ops()

  4.4 psci的版本号是从哪里获取的?

    是从TF-A获取的

  4.5 TF-A中psci固件的版本获取

    相关代码在TF-A仓库的lib/psci/psci_main.c文件中     

    unsigned int psci_version(void)
    {
  return PSCI_MAJOR_VER | PSCI_MINOR_VER;
    }

     调用路径如下:

     psci_smc_handler()

      -> psci_version()

    

    

  

      

最新文章

  1. 动态令牌-(OTP,HOTP,TOTP)-基本原理
  2. CSS中LI圆点样式li {list-style-type:符号名称}
  3. JAVA GC 简单总结
  4. phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
  5. 使用Python创建简单的HTTP和FTP服务
  6. unreal3的坐标系统和vector/rotator
  7. AppStore 相关
  8. python super
  9. CoreOS 835.12.0 稳定版安装
  10. SlidingPaneLayout的基本使用
  11. 使用源代码安装lnmp
  12. Codeforces Round #372 (Div. 1) B. Complete The Graph (枚举+最短路)
  13. 在Outlook中设置QQ邮箱
  14. U6Linux的文件权限与目录配置
  15. VS2008--无法找到“XXX.exe”的调试信息,或者调试信息不匹配
  16. UVA11125 - Arrange Some Marbles(dp)
  17. 线程带参数的Udp接收
  18. springboot+ibatis 多数据源配置
  19. “PurMVC”在Unity中的应用
  20. Java多线程(四)—— synchronized关键字续

热门文章

  1. Windows——Office使用激活工具激活后仍提示激活
  2. Vue 中的Vue Router一级路由,二级路由,三级路由以及跳转
  3. webpack中bundler源码编写2
  4. unity协程要点
  5. ES6中let、const和var的区别
  6. vue 关于vuex
  7. bloomberg bulkfile【一】 文件的分类
  8. WARNING: 'automake-1.14' is missing on your system.
  9. 【转载】浅谈HTTPS以及Fiddler抓取HTTPS协议
  10. 神经网络(2)---neurons and the brain