我们将继续讨论Linux中的电源管理问题。传统的系统控制和管理接口(SCMI)方法在代理和平台之间生成大量的通信,以便在每次系统启动时配置各种平台资源,例如时钟、电源稳压器、物理层和互连框架。这种通信增加了启动时间,这对于需要在启动后两秒钟内准备就绪的汽车应用程序至关重要。减少通信可以提高启动KPI(关键性能指标)。
系统控制和管理接口可以解决的另一个问题是降低外设创建和维护Linux驱动程序的工作量和复杂性。单个外设可能需要用于时钟、电源稳压器、互连框架、通用输入输出/引脚控制、物理层和其他框架的多种驱动程序。对该类驱动程序进行开发、测试、故障排除、升级和维护需要大量的工作,并且必须在每个平台上重复进行。
一种可能的解决方案是利用已经被平台识别的外设的固件,向它发送配置请求,而不是通过Linux驱动程序进行工作。
在高通创新中心(QUIC),我们正在探索Linux中的电源管理,以及通过改变Linux内核对固件中的资源抽象的理念,并利用系统控制和管理接口的电源和性能协议进行外围设备的配置。此类更改可以减少通信并缩短启动时间,还可以消除复杂性并减少开发外设驱动程序所花费的时间。
在本文中,您可以了解到如何利用我们的方法将复杂性从Linux驱动程序(需要为每个平台编写不同的开发程序)转移到固件。由于固件已经适配了平台,因此固件知道需要采取哪些手段来配置外设。您可以了解我们如何定义逻辑性能和电源域,而不是单独处理每个平台资源。您还可以了解到我们如何努力实现这一目标,以及您如何进行尝试并做出贡献。
(这是本人在Linaro Connect大会所做演讲“利用逻辑性能和电源域在系统控制和管理接口上实现资源抽象”的内容总结。有关详情和链接请见下文。)
标准驱动程序的复杂性
下图描述了外设驱动程序的复杂性:
外设驱动程序示意图
单个设备可能与各种资源相互作用,因此需要为每一种相互作用类型提供独有的驱动程序。该设备可属于电源域的组成部分,并且可能出现重置情况。该设备可能需要通过时钟框架与时钟驱动程序进行通信,或者需要与通用输入输出引脚控制和电源稳压器驱动程序相互作用。此外,该设备还可以利用具有自身资源(例如:时钟)的物理层驱动程序。外设驱动程序也可以参与带宽表决并通过互连框架与互连驱动程序相互作用。
平台资源驱动程序进一步增加了每一种外设驱动程序所导致的复杂性。我们的目标是通过减少与资源驱动程序相关的开发工作量来简化这一过程,从而加快产品推出。
使用系统控制和管理接口进行抽象
系统控制和管理接口作为不受任何特定操作系统约束的系统控制管理接口,具有以下架构:
系统控制和管理接口架构示意图
在橙色框内,有两种不同的层次:
1. “协议”一词是指是所提供的各种服务,包括时钟管理、电压调节和电源域控制。
2. 传输是指使两个实体相互作用的方法。其中一个实体是请求Mailbox、SMC/HVC调用和VirtIO等服务的代理,而另一个实体则是提供该类服务的平台。
平台控制器(在上下文中也称为固件)和代理之间的通信通过使用该传输机制的系统控制和管理接口协议进行。
以下为利用系统控制和管理接口进行资源抽象的方法概述:
使用系统控制和管理接口抽象资源示意图
突出显示的蓝色框表示当前正在使用的上游驱动程序及其相关控制器,这意味着该等驱动程序可以抽象固件中的所有资源。因此,在Linux中没有必要编写和维护大量驱动程序。外设驱动程序可以简单地通过该类系统控制和管理接口驱动程序向固件发出请求,以管理资源操作。
但是,应该注意的是,如缺少物理层驱动程序,则无法利用系统控制和管理接口进行抽象(同样,也没有有关互连的定义)。但是,物理层驱动程序可以利用相同的驱动程序,通过将其抽象到固件的方式对资源进行管理。
因此,利用系统控制和管理接口,我们能够减少所需要的开发工作量。尽管如此,每个外设仍然需要与各种内核框架和子系统集成。
改进这一过程的方法是什么?我们可以重点关注电源域、性能域以及复位,以进行过程简化。
电源域、性能域和复位简化示意图
系统控制和管理接口性能域和电源域
我们的方法是定义逻辑(或建模)性能域和电源域。
性能域
以下示例基于本图:
性能域示意图
考虑该外设有两种配置:
L1级:时钟以@f1频率运行,互连带宽为@b1表决,稳压器设置为@m1微伏。
L2级:时钟以@f2频率运行,互连表决@b1,稳压器设置为@m1微伏。
系统控制和管理接口性能域0包括这两种级别。驱动程序可以通过性能协议向固件发送请求,将设备设置为L1级。固件已经知道L1级的含义,因此相应地进行资源表决。
这种方法整合了各种资源,从而可以改进抽象并减少向固件发送的请求数量。这种方法扩展了通常与计算设备相关的传统性能域的应用范围,并且包含了外设。性能域可以通过以下函数指定:
- 动态时钟频率调整(例如,设置速率)
- 动态分配互联带宽
- 即时修改物理层配置
- 动态调整波特率(例如:在异步串口中)
如上所述,该策略将复杂性从驱动程序(需要为每个平台进行大量开发工作)转移到固件。鉴于已经使用有关平台的知识对固件进行了编程,可以有效地管理各种时钟速度、波特率或物理层模式的配置。
电源域
该方法同样适用于对电源域中的开、关操作进行分组,如下所示:
电源域中开关操作分组示意图
电源域可以有两种操作
开机:将时钟设置为启用状态,稳压器处于开启状态,物理电源域处于开启状态,而物理层处于初始化/开启状态。
关机:所有资源按照与开机相反的状态设置。
这种方法将二进制操作聚集在系统控制与管理接口动力域内(类似于性能域),从而显著减少固件通信。考虑采用外设,例如一个有20多个时钟的摄像头;分组请求而不是提交20个单独的时钟请求可以节省大量时间。
Linux中的代码流
我们在Linux中的代码流如下,左边为性能域,右边为电源域:
Linux中代码流示意图
对于性能域而言,外设驱动程序使用操作性能点(OPP)框架应用程序接口设置性能等级。它们调用系统控制与管理接口中性能域提供商的驱动程序scmi_perf_domain.c,然后使用性能协议层将配置传递到固件。
对于电源域,外设驱动程序使用运行时动力管理(PM)框架应用程序接口。它们调用系统控制与管理接口中电源管理域提供商的驱动程序scmi_pm_domain.c,由其使用电源协议层并将配置传递到固件。
截止目前在内核中发布的内容?
- 通过扩展genpd框架(内核6.7),可以将系统控制与管理接口与外设配合使用。
- 扩展操作性能点,以配合使用系统控制与管理接口性能驱动程序(内核6.7)。
- 该方法同时使用了电源域和性能域,并且可以一次使用多个域。因此,我们需要能够在驱动程序中手动连接和分离,而不是使用框架。目前可以使用助手应用程序接口,因此在多个电源域的情况下,不需要手动连接/分离用户驱动程序(内核6.9)。
固件管理资源的架构
以下层次示意图描述了我们在高通SA8775P片上系统(SoC)上的架构:
高通SA8775P片上系统(SoC)架构示意图
SA8775P是一个运行本公司Gunyah™管理程序软件的虚拟化平台。
左侧为固件虚拟机(VM),配备了能够进行对称多处理(SMP)的多线程实时操作系统。该虚拟机具有多个虚拟中央处理器,并托管一个与后端资源驱动程序通信的系统控制与管理接口服务器。
右侧为作为代理的Linux虚拟机。
我们为Linux中的每一台设备建立了单独的系统控制与管理接口通道。例如,UFS有其专用的共享内存以及一对用于接收(RX)和发送(TX)的doorbell寄存器。将RX doorbell转换为中断请求(IRQ),而TX doorbell则由HVC处理。通过这种设置,可确保设备同时向固件发送请求。通过并行处理和极细粒锁定功能(即使在处理共享资源时也是如此),固件可以有效地管理并发请求。
后续步骤
我们目前取得的进展表明,固件虚拟机在本公司架构内的开发接近完成。对于Linux虚拟机,对大多数外设驱动程序的修改正在进行内部审查。
我们已修改或增强了系统控制与管理接口传输驱动程序,使其与本公司的管理程序二进制接口兼容。这些更新内容 已在内核6.6中实施,具体内容可供您查看。
如要了解更多具体内容,请观看本人在2024年Linaro Connect大会上所做演讲“利用逻辑性能和电源域在系统控制和管理接口上实现资源抽象”。视频的最后是随后的问答环节。
阅读有关Linux和高通®Linux®软件堆栈中动力管理的其他文章:
- 推出高通Linux – 在高通科技公司的片上系统进行统一、简化的物联网开发
- 高通Linux应用程序示例 – 物联网应用程序中人工智能推理和视频构建块(第1部分/共2部分)
- 高通Linux应用程序示例 – 人工智能对象检测与并行人工智能融合(第2部分/共2部分)
在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。
骁龙与高通品牌产品属于高通科技公司和/或其子公司产品。
应根据Linux系统基金会的分许可使用Linux®注册商标,Linux系统基金会是林纳斯·托瓦兹的唯一被许可人,以及该商标在全球范围内的所有者。