电源管理入门-21 SoC芯片中的电源管理

这里以ARM为例来进行说明,我们在做驱动软件的时候,就需要跟硬件SoC里面的IP打交道,通过操作寄存器来实现硬件功能。之前的文章XXX中3和4章节已经进行了简单介绍,这里再重点参考"老秦谈芯"进行一下补充。

1. 关于PCSA和SCP

参考:ARM系列 -- PCSA(一) ARM系列 -- PCSA(二)ARM系列 -- PPU

SCP直接控制SoC的电源和时钟,而AP通过硬件和软件接口协同管理。

芯片设计,要完成整个芯片的电源管理,需要软硬件结合。一般,上层软件部分交给操作系统(Linux和Android等);下层软件由固件(Firmware)实现;硬件部分由SCP,MHU,PPU这些模块构成,当然Core也需要有相关的硬件支持。这也就是所谓的分层管理机制。

ARM官方PCSA规定了SCP: PCSA ARM官方文档

在PCSA里面,主要规范的是逻辑实现,物理实现部分并没有在文档中过多的体现。换句话说,PCSA是给芯片架构师和前端设计师看的。至于物理实现,遵循S家和C家的流程。

在SCP中完成SoC的功耗管理(当然,SCP不仅仅完成这个工作)。为此,ARM又定义了一大堆的接口,组件和协议来配合,统称为"功耗控制框架(power control framework,以下简称PCF)"。

上层的应用处理器(application processor,简称AP)可以通过软件来给SCP发起服务(service)请求,左边Agent我们可以理解为其它子系统或者IP。作为中间层的SCP是由一个M系列的处理器构成的子系统,负责运行固件软件(firmware),向上可与AP通过设定好的接口/协议通信,接收服务请求,向下控制硬件单元,监控传感器,控制时钟和复位,管理电源等等。有了SCP,就能把一些任务从OSPM中抽离出来,更好的把软件和硬件隔离,增加了灵活性和安全性。

主要分为两部分,AP的功耗管理和设备的功耗管理。其中AP的功耗管理又分为idle管理和DVFS两部分。首先看idle管理,当AP处于idle状态时,OSPM可以根据需要关断时钟,下电且retention,或完全断电等多种操作。此时要保证断电的内核仍然可由操作系统进行调度,并且可以被中断唤醒。还有另外一种技术hot-plug。在这种情况下,AP核心将从操作系统可用于调度的池中移除。通过这种技术,内核被关闭,所有中断和软件线程被迁移到其它内核。这种技术既可以按需求比例使用,也可以在计算能力因功耗或散热受到限制的情况下使用。

根据ARM的定义,功耗控制框架(PCF)是标准基础设施组件、接口和相关方法的集合,可用于构建SoC功耗管理所需的基础设施。标准的基础设施组件包括电源、时钟和接口组件。上图中的LPI(low power interface)主要是指ARM的Q-channel和P-channel,PPU(power policy unit)是一个硬件组件,支持SCP通过软件接口编程。

对于不同的设备,可能需要的电源控制场景不尽相同,比如有的模块可能只做时钟关断(clock gating),有的模块需要实现电源关断(power gating),在关闭设备电源的情况下,又可以区分多种细分需求,比如是不是要做逻辑或者存储的状态保留(retention);逻辑和存储是不是可以分别关断等等。各种条件做一下排列组合,可能会有很多种需求。举个例子,拿CMN中的系统缓存(HN-F)来说,逻辑部分,snoop filter(SF)部分,SLC RAM部分的电源可以分别控制;SLC RAM部分支持ON/OFF/RET三种电源状态,而且SLC RAM在物理上分为两个bank,可以选择开一个bank,也可以选择两个bank全开;SF部分也支持MEM_RET。

从上图可以看出,SCP是一个完整的小系统,该有的组件一个都不少。首先,SCP里面要有一个处理器,并且要具备足够的处理能力。比如要能够管理AP在idle状态下的功耗;要能支持中断,以及中断优先级排序;要支持调试功能;要能够可信操作,等等。既然有了处理器,那就要有ROM,用于安全启动,还要有RAM,运行固件时需要。如果要支持DVS,就要有图中的Voltage Regulator Control单元。为了配合DFS,还要有时钟控制单元,用于管理PLL以及输出时钟信号。Messaging interface适用于OSPM和SCP之间通信的接口,常用的有mailbox和doorbell两种方式。关于AP与SCP通信,有一套完整的协议来支持

PPU是为了控制SoC电源域用的,具体的数量和位置可以根据实际需要来定,比如可以做成分级式的或者分布式的。首先,PPU要提供一个配置接口给SCP,用于功耗策略控制和配置,目前用的是APB。其次,PPU与设备之间的控制接口,包括低功耗接口(low power interface,简称LPI),若干组Q-channel和一组P-channel,还有时钟/复位控制。最后,还有一个与功耗状态机之间的接口,P-channel。

PPU支持的power mode如下,其中ON/OFF/Warm Reset是必须支持的,其它备选。各种mode之间的切换,PPU配置,寄存器说明等细节请参考PPU的文档。

电源控制部分和时钟部分类似,就是多了一个上面提到的PPU。多提一句,PPU可以与被控制部分放在一起,也就是分布式设计

Cluster的上电过程如下上图,图中的delay取决于具体设计需要:

  1. SCP发出唤醒;
  2. SCP拉低ACINACTM或SINACT;
  3. SCP对PPU操作:
      1. PPU打开cluster的电源开关
      1. PPU拉高ISOLATEn,无效isolation cell
      1. PPU拉高CLKEN,使能clock gating
      1. PPU拉低RESETn,使cluster进入复位
      1. PPU发出Q-channel静止退出的请求
      1. PPU拉高RESETn
      1. PPU等待Q-channel握手返回
      1. PPU发中断给SCP9) SCP拉低AINACTS

关于SCP的系统启动:

2. 关于PSCI和SCMI

参考:PSCI官方文档 SCMI官方文档 ARM系列 -- PSCI
ARM系列 -- CSS Message Interface Protocols
ARM系列 -- SCMI

PSCI(Power State Coordination Interface),翻译一下就是"电源状态协作接口"。从名字就能直观看出来,PSCI是一套电源管理的标准接口,可用于操作系统在ARM设备上以不同权限级别监控管理电源。

PSCI提供一套API来协调电源管理,如下:

  • PSCI_VERSION:可以调用此API得到当前PSCI的版本信息;
  • CPU_SUSPEND:OSPM调用此API使处理器核进入低功耗模式;
  • CPU_OFF:此API用于hotplug,从系统中动态移除某个处理器核。被CPU_OFF移除的处理器核只能通过CPU_ON再次加载。与CPU_SUSPEND不同的是,这个接口函数不需要返回值;
  • CPU_ON:此API用于动态加载处理器核;
  • AFFINITY_INFO:此API允许调度方查询亲和实体(affinity instance)的状态;
  • MIGRATE:用于将受信任的操作系统(trusted OS)迁移到另一个处理器核,从而原处理器核可以调用CPU_OFF关闭电源;
  • MIGRATE_INFO_TYPE:允许调用方识别受信任操作系统中存在的多核支持级别,通过返回值可以判定受信任操作系统是否必须运行在单一处理器上,是否支持迁移;
  • MIGRATE_INFO_UP_CPU:指示受信任的操作系统当前的位置;
  • SYSTEM_OFF:系统关闭;
  • SYSTEM_RESET:系统冷复位;
  • SYSTEM_RESET2:此API是对SYSTEM_RESET的扩展;
  • MEM_PROTECT:此API确保内存在交给操作系统加载程序之前被重写,从而提供防止冷重启攻击的保护;
  • MEM_PROTECT_CHECK_RANGE:此API用于检查某段内存范围是否受MEM_PROTECT保护;
  • PSCI_FEATURES:此API允许调用方检测已实现的PSCI函数及其属性;
  • CPU_FREEZE:此API将处理器核设置于低功耗状态(依赖具体设计实现)。与CPU_SUSPEND和CPU_DEFAULT_SUSPEND不同,中断不能唤醒该处理器;与CPU_OFF也不同,不需要迁移;
  • CPU_DEFAULT_SUSPEND:此API将处理器核设置于低功耗状态(依赖具体设计实现),与CPU_FREEZE的调用参数不同;
  • NODE_HW_STATE:此API允许直接从电源控制器或电源控制逻辑确定节点的电源状态。与AFFINITY_INFO不同,此API返回电源状态的物理视图;
  • SYSTEM_SUSPEND:此API相当于CPU_SUSPEND到最深的低功耗状态,但实际系统中有可能实现比CPU_SUSPEND更深的低功耗状态,比如支持RAM挂起;
  • PSCI_SET_ SUSPEND_MODE:此API允许设置CPU_SUSPEND用于协调电源状态的模式;
  • PSCI_STAT_RESIDENCY:此API返回自冷启动后平台处于某个电源状态的时间;
  • PSCI_STAT_COUNT:此API返回自冷启动后平台使用某个电源状态的次数;

SCP和AP之间有一个通信接口。这个通信接口在硬件上可以通过共享存储和MHU(Message Handling Unit)实现;在软件上,通过定义一组通信协议来实现。关于MHU需要查硬件寄存器手册。

SCMI(System Control and Management Interface)。SCMI是用于系统管理的一组独立于操作系统的软件接口,包括以下几个方面:

  • 电源域管理
  • 性能管理
  • 时钟管理
  • 传感器管理
  • 复位管理
  • 电压域管理

关于传输,可以用共享存储方式来保存AP与SCP之间的消息。通信的流程可以采用中断,doorbell的方式,也可以采用轮询的方式去主动查询消息通道的状态。采用中断方式的通信流程如下图:

其他的一些硬件参考: SoC设计之功耗 -- Q channelSoC设计之功耗 -- DVFS
SoC设计之功耗 -- Clock Gating
SoC设计之功耗 -- Multi Voltage
SoC设计之功耗 -- Power Gating
SoC设计之功耗 -- UPFSoC设计之功耗 -- RTL/netlist功耗计算
SoC设计之功耗 -- RTL功耗计算(二)
SoC设计之功耗 -- IR dropSoC设计之功耗 -- IR drop(二)
SoC设计之功耗 -- 电迁移(EM)

3. 关于芯片设计中电源管理的一些要点

  • SCP子系统一般是在Always-on区域,也就是休眠的时候不下电,除非整机关机才下电。
  • SCP有独立的M核硬件,所以需要设计中断,RAM内存区域的使用
  • SCP会通过I2C连接PMIC硬件对系统中其他硬件模块上电,一般按照电源域为单位,按一定顺序上电
  • SCP通过Mailbox跟AP或者其他异构核子系统通信,软件上使用SCMI+SMT,硬件上使用MHU或者PL320,主要就是为了触发中断+共享内存
  • 设计SCP的硬件接口,例如I2C四根线,占四个接口
  • 低功耗主要就是休眠省电模式的设计,需要分析出来耗电多的子系统进行关闭,一般通过PMIC电源开关,clock的开关,模块自动低功耗模式设置等
  • 对于A核的休眠需要注意DDR中的数据,可以有DDR PHY硬件控制进入retention mode,一些开机DDR训练参数输出保存到Always-on的RAM中去。

参考:

1.ARM系列 -- 电源和时钟管理

后记

对于软件人员去钻研硬件知识比较吃力,因为硬件很多程度上就是经验和套路,门槛高,入门难。会三脚猫功夫的多,高手少,而且高手基本都是海归,整词都是英文的,工资巨高。充分说明高端产业在欧美。靠硬件就需要有人带,不然无师自通还是有点慢。自学可以什么概念不懂就直接去ARM官网搜:developer.arm.com

干啥都能干,干啥啥不是,

专业入门劝退,堪称程序员杂家"。

欢迎各位有自己公众号的留言:申请转载,多谢!

后续会继续更新,纯干货分析,欢迎分享给朋友,欢迎点赞、收藏、在看、划线和评论交流!

相关推荐
止语Lab1 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活1 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困1 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn1 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530141 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908401 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金1 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛2 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
IT_陈寒2 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
卷无止境2 小时前
提升 Python 代码健壮性的方法大盘点
后端·python