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

    

    

  

      

linux内核是如何支持深度睡眠(deep sleep)方式的?的更多相关文章

  1. [转帖]Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有

    Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有 之前用 千兆的机器 下载速度 一般只能到 50MB 左右 没法更高 万兆的话 可能也就是 200MB左右的速度 很难更高 不知道后续的服 ...

  2. [转贴]Linux内核LTS长期支持版生命周期

    Linux内核LTS长期支持版生命周期 https://blog.51cto.com/dangzhiqiang/1894026 搞不懂长期支持版本的特点和区别. 党志强关注0人评论4371人阅读201 ...

  3. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  4. 基于tiny4412的Linux内核移植(支持device tree)(三)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  5. 基于tiny4412的Linux内核移植(支持device tree)(一)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  6. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  7. Linux内核DTB文件启动的几种方式

      版权:  凌云物网智科实验室< www.iot-yun.com > 声明:  本文档由凌云物网智科实验室郭工编著! 作者:  郭文学< QQ: 281143292  guowen ...

  8. 获取Linux内核未导出符号的几种方式

    从Linux内核的2.6某个版本开始,内核引入了导出符号的机制.只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用.然而,内核并没有导出所 ...

  9. 基于tiny4412的Linux内核移植(支持device tree)(二)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

随机推荐

  1. 【OF框架】在Visual Studio中发布Docker镜像,推送镜像到Azure容器注册表

    准备 拥有Azure账号,已经创建 Azure容器注册表,获得注册表地址.账号.密码 本地已经在Visual Studio登录Azure账号. 本地已经拥有Docker环境 注意:首次发布Docker ...

  2. HTML主体标签

    HTML标签 在HTML结构代码中可以看到非常多的<>,这就是html的标签.整块html代码几乎就是由各种各样的标签与标签内容构成,每一个标签对应一个网页上的一个小模块,如一段文字1,一 ...

  3. PS批量制作获奖证书并导出PNG

    其实方法和"使用PS批量制作视频字幕"的方法类似.区别在于制作视频字幕时导出成psd格式就可以直接导入Premiere中使用了,而获奖证书考虑到打印设备有无PS的不确定性,可能需要 ...

  4. 修改gitlab配置文件指定服务器ip和自定义端口:

    修改gitlab配置文件指定服务器ip和自定义端口: vim /etc/gitlab/gitlab.rb gitlab-ctl reconfiguregitlab-ctl restart 查看与rpm ...

  5. nexus私服搭建及信息配置

    nexus私服搭建及信息配置 下载 登录nexus官网下载nexus安装包https://help.sonatype.com/repomanager2/download/download-archiv ...

  6. 【克鲁斯卡尔蒜法-最小生成树算法】-zzuli-2271 -Problem -E-魔法交流活动

    问题 E: 魔法交流活动 题目描述 魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接起来,形成一个魔法阵.魔法链是做法成功与否 ...

  7. P2458 [SDOI2006]保安站岗[树形dp]

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

  8. Robot Framework--RIDE面板与库的说明

    Robot Framework的测试用例是以project作为单位进行管理的.一个project可以包含多个Test Suite文件,每一个Test Suite可以包含多条测试用例一个Test Sui ...

  9. eclipse中导入一个web项目

    首先 一般会因为环境不同而出错 所以还需要进一步配置,项目上右键properties

  10. SpringBoot项目mysql配置文件密码加密(jasypt)

    起因:因为我个人微博想要公开源码,但数据库配置文件会暴露在外面,又不想生产跟开发环境建来回切换,所以想到了加密数据库密码,于是问了群里的一个朋友小XX(原谅我不识字) 经过: 简单粗暴,直接上代码: ...