Linux BSP实战课(电源驱动篇):电源子系统的 runtime pm

科技   2024-03-25 08:08   四川  
  • 什么是 runtime pm

  • runtime pm 在内核中的作用

    • runtime pm 和驱动的关系

    • runtime pm 和 power domain 的关系

    • runtime pm 的 sysfs

  • runtime pm 的软件流程

    • 初始化过程

    • poweroff/reboot 过程

  • suspend/resume 的过程

什么是 runtime pm

runtime pm 框架是指在设备不运行时,通过关闭设备的时钟和电源来降低系统的功耗。这一框架采用分而治之的管理思想,将功耗控制策略和权力下放给各个驱动程序。这样,在设备不需要工作时,各个驱动程序可以实施低功耗控制,从而在保证系统正常运行的同时最大限度地降低系统的功耗,与系统休眠唤醒式的电源管理相比,runtime pm 框架更加灵活和高效。

在设计 SoC 时,为了最大限度地降低功耗,会根据业务场景将功能划分为不同的 power domain。通常,每个power domain 包含多个功能 IP,这样在不同场景下可以根据需要关闭未被使用的 power domain,以实现功耗的最小化。

可以看出,power domain 是对外设做开和关的模块,runtime pm 提供了如何使用 power domain 的统一方法。结合内核的 suspend、runtime pm、clock framework、regulator framework 等机制,以非常巧妙、灵活的方式,管理系统功耗,以达到高效、节能的目的。

runtime pm 在内核中的作用

我们先来看下 runtime pm 与内核中各个子系统的关系,如下所示:

runtime pm 和驱动的关系

在驱动初始化设备时,通过调用 pm_runtime_enable() 来启用设备的 runtime pm 功能。当设备被卸载时,在 remove 函数中调用 pm_runtime_disable() 来关闭设备的 runtime pm 功能。这两个接口的实现中,使用一个变量(dev->power.disable_depth)来记录 disable 的深度。只要 disable_depth 大于零,就表示 runtime pm 功能已关闭,此时 runtime pm 相关的 API 调用(如suspend/resume/put/get等)会返回失败 EACCES。在 runtime pm 初始化时,会将所有设备的 disable_depth 设置为1,即为 disable 状态。在驱动初始化时,在 probe 函数的结尾根据需要调用 pm_runtime_enable 来启用 runtime pm,在驱动的 remove 函数中调用 pm_runtime_disable 来关闭 runtime pm。

此外,还提供了 get 和 put 类接口给设备驱动,用于确定何时进入或恢复设备的低功耗状态。当设备驱动调用这些接口后,runtime pm 会调用各个设备驱动实现的 runtime_suspend/runtime_resume 接口。

  • 进入低功耗

当驱动认为设备不需要工作(进入低功耗)时,会调用 pm_runtime_put() 或 pm_runtime_put_sync(),向 runtime pm 核心请求将设备置于低功耗状态。如果条件符合,runtime pm 核心会调用驱动的 runtime_suspend 回调函数,将设备配置为低功耗状态。

  • 退出低功耗

人人极客社区
工程师们自己的Linux底层技术社区,分享体系架构、内核、网络、安全和驱动。
 最新文章