一文搞懂linux power domain framework

本文介绍了PowerDomain框架的概念,它是软件层面的管理工具,用于控制SoC上的电源域,减少能耗。文章详细阐述了电源域的定义、划分原因,以及PowerDomain框架如何与runtimepm协作管理电源。此外,还涉及了数据结构和初始化流程,以SCMIPowerDomain驱动框架为例进行说明。
摘要由CSDN通过智能技术生成

1, 介绍

什么是power domain framework?在搞清楚这个问题之前,有必要先弄清楚什么是power domain,以及它解决了什么问题。

从字面上理解,power domain指的是电源域。SOC是由多功能模块组成的一个整体,对于工作在相同电压且功能内聚的功能模块,可以划为一个逻辑组,这样的一个逻辑组就是一个电源域。简单来说,电源域就是逻辑划分,在该逻辑划分中包含了物理实体和电源线的连接关系。电源域之间存在着包含关系,这样就是一个父子关系的电源域。电源域也存在着兄弟关系,这样就是同一级的电源域。因此,SOC上众多电源域组成了一个电源域树,他们之间存在着相互的约束关系,子电源域打开前,需要父电源域打开,父电源域下所有子电源域关闭,父电源域才能关闭。

随着工艺制程越来越小、芯片的规模越来越大,芯片的leakage越来越大。为了减少leakage,很重要的一个优化方式就是划分power domain,根据需要,关闭不用的power domain,从而有效地减少SOC的leakage。

在理解了power domain后,我们再看一下power domain framework。它主要是软件层面的一个概念,用来管理SOC上各power domain的依赖关系及根据需要做开关。它提供了管理和使用系统power domain的统一方法,结合kernel的suspend、runtime pm、clock framework、regulator framework等机制,以非常巧妙、灵活的方式,管理系统功耗,以达到高效、节能的目的。

Power domain framework与runtime power manager之间存在很紧密的关系,前面的《一文搞懂linux runtime pm》的文章里也提到了power domain的管理,并讲述了device在获得自己的power domain后,可以利用pm_runtime_get_xxx/pm_runtime_put_xxx接口,增加或减少引用计数,runtime pm core会在合适的时机,调用pm domain提供的power on/off接口,power on或者power off设备。这篇文章将从提供者(provider)的角度更详细的介绍power domain的实现。

2, 框架

power domain框架

这里主要讲一下power domain framework相关的内容,对于runtime pm/clock framework/regulator framework前面的一系列文章已经讲述。

power domain framework主要管理power domain的状态,为使用它的上游驱动、框架或者用户空间所使用的文件操作节点,提供功能接口,对下层的power domain hardware的开关操作进行封装,然后内部的逻辑,实现具体的初始化、开关等操作。

  • 对底层power domain硬件的操作
    • 对power domain hw的开启操作,包括开钟、上电、解复位、解除电源隔离等操作的功能封装;
    • 对power domain hw的关闭操作,包括关钟、断电、复位、做电源隔离等操作的功能封装;
  • 内部逻辑实现
    • 通过dts描述power domain框架的设备节点,并描述每个power domain节点。提供出一个power domain framework的设备节点,及每个power domain子设备的节点,并指定power-domain-ccell = <1>,这样可以通过power domain framework的设备及power domain的编号查找具体的power domain;
    • 实现dts解析逻辑,获取power domain的配置信息,并通过初始化函数对每个power domain进行初始化,所有的power domain统一的放在一个全局链表中,将power domain下所有的设备,放到其下的一个设备链表中;
    • 为runtime pm、系统休眠唤醒等框架,注册相应的回调函数,并实现具体的回调函数对应的power domain的开关函数;
  • 上层使用power domain的上游驱动、框架及debug fs
    • 使用power domain的上游驱动:power domain内部ip的驱动。比如,dsp子系统power domain下面,有多个dsp核,每个dsp核对应一个power domain。这样,每个dsp核设备驱动都要关联到对应的dsp核power domain上,通过dsp核设备的dts里power-domains的属性引用(power domain framework的节点引用及具体power domain的编号),将dsp核设备与相应的power domain关联起来;
    • 使用power domain的框架:runtime pm/系统休眠唤醒;
      • linux系统的runtime power manager 框架通过提供runtime_pm_get_xxx/runtime_pm_put_xxx类接口给其他的drivers,对设备的开、关做引用计数,当引用计数从1->0时,会进一步调到power domain注册的runtime_suspend回调,回调函数里会先调用设备的runtime_suspend回调,然后判断power domain下的设备链表中所有的设备是否已经suspend,若已经suspend才真正关闭power domain。当引用计数从0->1时,会先调用到power domain使用的runtime_resume回调,回调函数里会先调用power domain的开启操作,然后调用设备注册的runtime_resume回调函数;
      • 系统休眠唤醒在suspend_noirq/resume_noirq时会进行power domain的关闭与开启的操作;
    • power domain也提供了一些debug fs文件节点供用户debug使用,主要就是/sys/kernel/debug/pm_genpd/目录及power domain名字目录下的一些文件节点:
      • pm_genpd_summary:打印所有的power domain、状态及下面所挂的设备状态
      • power_domain名字目录/current_state:power domain当前的状态
      • power_domain名字目录/sub_domains:power domain当前的子power domain有哪些
      • power_domain名字目录/idle_states:power domain对应的所有idle状态及其off状态的时间
      • power_domain名字目录/active_states:power domain处于on状态的时间
      • power_domain名字目录/total_idle_time:power domain所有idle状态的off时间总和
      • power_domain名字目录/devices:power domain下所挂的所有devices
      • power_domain名字目录/perf_state:power domain所处的性能状态

3, 数据结构

power domain framework数据结构

4, 流程

power domain主要依附在runtime pm/系统休眠唤醒框架中,相应的使用流程在前面的《一文搞懂linux runtime pm》、《一文搞懂linux系统休眠唤醒》文章里有介绍,这里我们主要关注他的初始化流程。

以scmi power domain的驱动框架为例:

power domain初始化流程

power domain关闭不使用pd的流程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值