这篇是ARM电源管理系列文章中的一篇。
开始之前,介绍一个Linux电源管理概念,Operating Performance Points(OPPs)。在大规模SoC设计中,不是所有的模块都工作在同一个电压和频率上,比如一些SoC的重要模块可能要工作在高电压高频率下,而一些低速模块则可以工作在低电压低频率下。拿多核处理器来说,可能每个处理器核的电压和频率都不完全相同。这些芯片上可以支持的电压和频率的离散元组(tuple)的集合称为OPPs。比如,一个处理器核支持在1V电压下跑3GHz,在0.9V电压下跑2GHz,那么用{Hz,uV}的形式来表示OPP元组,就是:
{3000000000, 1000000}
{2000000000, 900000}
对于我们做ASIC设计的工程师来说,需要知道的是OPP library会提供一系列辅助函数去管理和查询设备的OPP信息,不用去深究这些底层的函数是什么。在我们的SoC中,如果支持DVFS,那么要把全部的OPP信息能够呈现给Linux。
还是先放下面这张图,方便大家对ARM电源管理有一个整体认识。图中的PSCI在前面已经分析完,《ARM系列 -- PSCI》。
通过前面的学习,我们知道了SCP(System Control Processor)包含很多的子模块,在系统中负责上电启动和运行维护,比如初始化配置,电源和时钟的管理,传感器管理等等工作。有一些运行管理工作也需要AP(Application Processor)参与,比如动态调频调压(DVFS)。但是出于隔离,安全等多种因素考虑,不会允许AP直接操作SCP中的控制模块。所以SCP会以服务的方式来支持AP参与运行管理,这也就需要SCP和AP之间有一个通信接口。这个通信接口在硬件上可以通过共享存储和MHU(Message Handling Unit)实现;在软件上,通过定义一组通信协议来实现。
先来看硬件部分,MHU传输层(MHU Transport Layer)定义了两个概念:物理通道和虚拟通道。
所谓物理通道,是指它们的实现在硬件中是固定的。每个物理通道都是单向的(SCP到AP,或AP到SCP)。每个物理通道包含:一个32bit的只读STATUS寄存器;一个32bit的只写SET寄存器;一个32bit的只写CLEAR寄存器;一条中断线,用来通知接收方有事务需要处理。SCP将STATUS寄存器中的每个bit视为可映射到虚拟通道的插槽(slot)。Slot 31是保留的,因为MHU硬件使用这个bit来指示非安全访问,所以可用的插槽数总共是31。STATUS寄存器的插槽位的状态用来充当发送方和接收方之间的信令。如果发送方要通过虚拟通道传输消息,它必须首先检查与该通道关联的插槽位的状态。如果插槽位已清除,则发送方可以安全地启动新的通信。如果插槽位已设置,则表示关联的虚拟通道正在使用中。发送方必须等待插槽清除后才能写入新消息。
所谓虚拟信道,是一种软件结构,意在增加通信系统的灵活性。虚拟通道协议规定了:将协议特定数据写入的共享存储区域;用于在虚拟通道上通信的协议;映射到用于信令的物理信道。共享存储区域的大小和位置根据具体需求来确定。SCP和AP都必须能够读取该共享存储区域;如果与虚拟通道关联的协议是双向的,则SCP和AP也必须能够写入该区域;如果在平台软件中实现了适当的仲裁,那么也可以在多个虚拟通道之间共享单个存储区域。下图是ARM文档中展示的一个例子,在该实例中,这个物理通道支持占用插槽0、1和30的三个虚拟通道,需要保留三个共享存储区域,每个虚拟通道一个。这三个独立的虚拟通道共享与一个物理通道中断线。同一软件域中的不同实体可以同时访问虚拟通道。这种共享访问方式实现了更大的灵活性。
通信流程如下(以slot 0为例)。
发送消息:
- 发送方即检测STAT[0]是否为低电平,来确定slot 0是否空闲,若STAT[0]为高电平,则发送方必须等到STAT[0]清零之后才能进行消息的传递。
- 发送方向STAT[0]代表的虚拟通道所对应的共享存储中写入要传输的消息,消息的内容和大小由具体的协议决定,发送方必须确保写入的消息对接收方是可见的。
- 发送方对SET[0]写1,从而使STAT[0]置位,表示STAT[0]代表的虚拟通道正在传输消息,与此同时报一个中断信号给接收方,通知接收方有新的消息在slot 0上等待处理。
接收消息:
- 接收方接收到物理通道发送过来的中断信号后,读STAT寄存器,确定消息传输所使用的虚拟通道,STAT寄存器的哪一位为高电平,就是使用的该位所对应的虚拟通道。
- 接收方访问STAT[0]代表的虚拟通道所对应的共享存储区域,该共享存储区域中的消息数据在通道被释放之前都是有效的,当该通道再次被占用时,共享存储区域中的数据就会被覆盖。
- 接收方对CLEAR [0]写1,从而使STAT[0]清零,表示STAT[0]代表的虚拟通道被释放,发送方所发送的消息被成功接收,但是并不一定被处理,该虚拟通道被释放,可以接收下一条消息。
看完了硬件协议,再来看软件协议。SCPI(System Control and Power Interface)是基于ARM CSS(Compute Subsystem SCP)平台中SCP的主要接口之一。它用于AP访问向其公开的许多服务,这是因为在CSS平台中,为了安全等多种因素考虑,AP通常是没有权限直接访问SCP中的系统控制模块,比如电源,时钟和传感器。
在系统引导过程完成后,SCP通常就将处于空闲状态,并在大部分时间内等待SCPI命令。SCPI命令由强制的数据报头和可选的数据负载组成。数据报头和数据负载被写入共享存储器区域,虚拟信道利用这块共享存储区域来传递消息。SCP或AP都可以在任何时间点发送消息。SCPI通信是异步和双向的。
SCPI的数据报头是64-bit的结构,如下图:
从低位开始算,数据报头的前7bit是命令ID号,指明此次发送的是什么命令。第8bit是Set ID,0表示标准命令,1表示是用户自己扩展的命令。紧接着是Sender ID,AP在发送SCPI命令时可以设置不同的SenderID,这使AP上的平台软件能够将响应与其他传入消息区分开来。如果SCP向AP发送的消息不是对命令的响应,例如周期性温度传感器读数,则它会使用Sender ID 0来标识自身。但是,SCPI协议并没有为此明确保留ID为0。如果AP软件不需要此功能,则可以将其命令的Sender ID保留为0。然后是9bit的数据负载大小指示,SCPI协议规定,最大的数据负载不超过512-Byte,正好可以用这9bit表示,在实际的系统实现时可以规定数据负载小于512-Byte,如果超过规定,将得到SCPI\_E\_SIZE响应;最后的32bit是命令状态,用于指示命令执行的结果,命令状态字段值仅在AP从SCP接收消息时有效,反过来AP设置的任何状态值都将被SCP忽略。这好理解,SCPI的用途就是提供一个接口给AP去间接调用SCP中的模块,也就是说AP是请求方,而SCP是执行方。执行方需要返回状态给请求方,且不需要获得请求方的状态。
在任何时间点,只有一个软件实体(OS, firmware,bootloader)拥有一个虚拟通道。通道的所有者负责在多个请求之间进行仲裁,例如,通过任何适当的锁定机制,从内核或线程进行仲裁。
SCPI的标准命令有二十多条,归纳在下面的表格,至于每个命令的具体数据负载格式需要去参考ARM的文档,不再详细介绍。
最后,再来看一下基于MHU的引导启动(Boot Over MHU,BOM)协议。基于ARM CSS的平台中的BOM协议由AP使用,以在引导过程中将RAM固件映像传输到SCP。该协议基于两个安全物理通道(AP到SCP,SCP到AP,每个方向一个)、两个虚拟通道和16字节的共享存储区域。这16字节中,4字节存储命令头,8字节存储负载,4字节用作保留。由于协议在两个虚拟通道之间共享单个存储区域,因此需要仲裁机制以防止SCP覆盖AP写入的数据或AP覆盖SCP写入的数据。写入命令后,SCP和AP必须等待对其命令的响应,然后才能再次写入下一条命令。BOM协议支持两个命令:
- Info,包含有关正在传输的固件映像的信息
- Data,用于指示SCP跨固件映像的一个或多个部分复制到其内部RAM中
下图展示BOM协议:
固件映像可以通过单个数据命令完全复制,并将块大小设置为总映像大小。也可以通过使用具有较小块大小值的多个数据命令来复制它。
SCP使用状态值响应每个命令,该状态值为0表示成功,非0值表示失败。当发生失败时,SCP要求重新发出上一个失败的命令。SCP允许的最大失败命令数以来具体的平台实现。一旦失败次数超过系统限制,则认为引导过程失败,并执行特定于平台的响应。BOM协议不强制执行任何特定的操作过程,然而,一些合适的做法是:
- 复位平台。
- 重新启动整个引导过程。
- 协商其它替代启动方案。
SCP ROM固件实现Adler-32校验和算法,该算法用于验证RAM固件映像。校验和仅用于确保接收到的图像没有受到硬件或软件的任何损坏,不能将其视为身份验证(authentication)。如果平台需要身份验证,AP安全固件必须在将SCP RAM固件映像发送到SCP之前对其进行身份验证。
引导启动协议流程如下图:
Info和Data命令共有的命令头写在专用于BOM协议的共享存储的开头,后面是作为有效负载的单个命令。
一般,一个复杂系统的启动顺序是这样的:
至此,今天关于SCP和AP通信的MHU就介绍完了。这部分对于理解ARM体系中的电源管理是比较重要的。
原文链接:老秦谈芯
作者:老秦谈芯
推荐阅读
更多IC设计技术干货请关注IC设计技术专栏。