这里以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取决于具体设计需要:
- SCP发出唤醒;
- SCP拉低ACINACTM或SINACT;
- SCP对PPU操作:
-
- PPU打开cluster的电源开关
-
- PPU拉高ISOLATEn,无效isolation cell
-
- PPU拉高CLKEN,使能clock gating
-
- PPU拉低RESETn,使cluster进入复位
-
- PPU发出Q-channel静止退出的请求
-
- PPU拉高RESETn
-
- PPU等待Q-channel握手返回
-
- 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中去。
参考:
后记
对于软件人员去钻研硬件知识比较吃力,因为硬件很多程度上就是经验和套路,门槛高,入门难。会三脚猫功夫的多,高手少,而且高手基本都是海归,整词都是英文的,工资巨高。充分说明高端产业在欧美。靠硬件就需要有人带,不然无师自通还是有点慢。自学可以什么概念不懂就直接去ARM官网搜:developer.arm.com
干啥都能干,干啥啥不是,
专业入门劝退,堪称程序员杂家"。
欢迎各位有自己公众号的留言:申请转载,多谢!
后续会继续更新,纯干货分析,欢迎分享给朋友,欢迎点赞、收藏、在看、划线和评论交流!