我们今天简单讲讲一下PCIe 链路的L1低功耗状态,包括L1.0, L1.1, L1.2,讲解一下当初为什么引入这些,在PCIe哪个代际引入的?以及这三者的主要区别包括功耗状态。我们这个公众号的很多人都是从事SSD开发/验证/测试的,那么我们经常听说的L1.2低功耗目前的应用主要是NVMe SSD吗?还包括其它一些我们常见的消费类的应用场景吗?
最后,我们也会从底层物理层和协议层角度简单讲解一下,一个NVMe SSD如何和CPU之间没有流量交互的情况下,是如何一步一步地进入低功耗,然后如果CPU和SSD在需要沟通的情况下,包括CPU主动发起、以及SSD主动需要发起沟通两种情况下,一步一步地如何退出低功耗的。
后面,我们看有时间的话,将专门拍摄几个笔记本电脑下面PCIe M.2 SSD典型的进、出低功耗L1.2的视频,这样大家可以有非常直观针对该概念和技术的理解。同时,我们也打算拍个视频,看一下一颗M.2 SSD在Windows 10/11的L1.2低功耗下面,跟在Linux下面(没有低功耗,或者陷入L0s下面)在读写数据时候内核的差别以及效率对比。这些都将大大加深各位对于低功耗、非低功耗、OS内核针对SSD的传输有效性的理解。
针对下面我们今天涉及的内容,先上一张图。后续我们将通过视频讲解通过SerialTek PCIe协议分析仪抓取的真实L1.2的流量进行讲解。
1) L1 低功耗家族:L1.0 / L1.1 / L1.2 到底是什么
L1.0(通常就叫 L1)
定位:ASPM(Active State Power Management)里的“深一点”的低功耗状态(比 L0s 深)。
核心动作:链路进入Electrical Idle(电气空闲),不再传输高速信号;但参考时钟/PLL 不一定关闭(是否关闭取决于后续的 Clock Power Management / L1 Substates 能力与平台策略)。
代价:退出到 L0 需要一定时间(L1 Exit Latency)。PCI-SIG FAQ 也强调:Link Capabilities 里报的 L1 Exit Latency 是L1/L1.0→L0的延迟,不包含 L1.1/L1.2 额外延迟。
L1.1 / L1.2(统称 L1 Substates)
定位:对 L1 的进一步细分(更省电,但通常更慢)。
来源:L1 Substates 是 PCI-SIG 通过 ECN (engineering change notice)引入的增强;业内也明确提到新增 “pseudo sub-states” L1.1 与 L1.2,用于关闭 PHY 里更多模拟电路。
关键外部信号:大量平台用CLKREQ#(Clock Request)来实现参考时钟的请求/撤销;很多资料直接把 L1.2 的退出时序描述为“CLKREQ# 触发 → REFCLK 恢复”。REFCLK 概念不清楚的话可以参考Saniffer公众号之前发的文章:PCIe 里的 RefClk (Reference Clock) 到底是干什么的?以及PCIe 里的 RefClk (Reference Clock) 到底是干什么的(二)?
2) 这三者为什么被引入?各自解决什么矛盾
为什么要有 L1(L1.0)
PCIe 链路在“无数据时”也会消耗动态功耗(SerDes、均衡、CDR、PLL 等)。L1 的初衷就是让链路在空闲期进入更低功耗,而不是一直保持全速模拟电路活跃(ASPM 的总体目标就是“链路越不活跃,功耗越低”)。
为什么还要 L1.1 / L1.2
L1.0 省电仍然不够(尤其移动/客户端、SSD 这类对毫瓦级差异敏感的设备)。L1 Substates 的目标是:
让 PHY 里更多“吃电”的模拟模块可以关掉;
在不完全断链的前提下,把“空闲功耗”进一步压下去。
为什么 L1.2 特别重要
L1.2 往往与参考时钟可被移除(Refclk Off)强绑定,因此功耗能下得更狠;但退出时延也更显著(具体值因平台而异,可能是几十 ms、也可能更长,测量方式常见就是“CLKREQ# → REFCLK valid”)。
3) L1.0/L1.1/L1.2引入的“时间/代际”
L1(L1.0):属于 PCIe 早期 ASPM 定义的一部分(这个能在几乎所有 PCIe 代际里看到 L0s/L1 这种 ASPM 术语)。
L1.1 / L1.2(L1 Substates):通过 PCI-SIG 的L1 Substates ECN引入(后续被合入更高版本 base spec 的修订中)。
小结:“L1.1/L1.2 属于 PCI-SIG 后续对 L1 的增强(L1 Substates),在 PC/移动平台与 NVMe SSD 时代被大规模启用”。
4) 三者主要区别(功耗形态/退出代价)
下面这张表抓住“工程上最关键的差异”:电气是否 Idle、PLL/Refclk 是否可关、退出路径复杂度。
| 状态 | 逻辑链路 | 电气层 | Refclk/PLL | 典型特征 | 退出到 L0 |
|---|---|---|---|---|---|
| L1.0 | Link 仍存在 | Electrical Idle | 通常保持(或可配合 CPM) | “进入 L1 省电,但不一定关时钟” | 相对较快;Link Capabilities 报的 L1 Exit Latency 指的是 L1/L1.0→L0 |
| L1.1 | Link 仍存在 | Electrical Idle | 关更多 PHY 模拟电路,但一般保持一定偏置/共模 | 比 L1.0 更省电,延迟更大 | 需要更多恢复步骤(但通常比 L1.2 快) |
| L1.2 | Link 仍存在 | Electrical Idle | 可到 Refclk Off / PLL off(依平台与能力) | 省电最狠,退出最慢;常由 CLKREQ#/Refclk 恢复触发测量 | 先恢复时钟/PLL,再回到 L0(可能几十 ms 量级或更高) |
注:不同厂商 SSD 白皮书里会给出“功耗 vs 延迟”的量级示例(比如把 L1.2 与其它状态做对比)。
5) 这些链路低功耗只用在 NVMe SSD 吗?还有哪些场景
NVMe SSD 的确是L1.2 最典型、最常被讨论的应用(因为客户端 SSD 空闲时间长、功耗敏感)。但并不止于此:
Wi-Fi/BT、以太网 NIC、USB/Thunderbolt 控制器、读卡器等外设控制器:很多 PCIe 外设都支持 L1.2(我们甚至能在一些以太网芯片 datasheet 里看到 “ASPM L1.2 Supported” 等表述)。
移动/笔电平台的各类 PCIe 端点:只要是“长时间 idle、偶尔突发传输”的设备,都很适合深 L1。
部分低功耗加速器/桥接芯片/嵌入式模块:同理。
6) 从物理层 + 协议层视角:NVMe SSD 如何“无包交互”进入 L1.x
先给一个关键前提(很容易被忽略):
6.1 “没有 packet 交互”并不等于“什么都不发生”
进入 L1.x 往往是链路层/物理层的自动管理(ASPM):当双方都判断“链路空闲、无待发数据、无未完成事务”,会触发进入低功耗。它不需要 OS 每次发指令,但需要:
设备/Root Port 支持 ASPM/L1 Substates;
BIOS/OS 把相应策略打开;
满足进入条件(无 pending TLP/DLLP、队列空闲等)。
6.2 典型进入路径(抽象成“步骤”)
以下是我们经常在协议分析/平台调试(例如SerialTek PCIe协议分析仪)时最常用的“可观察步骤”(不同实现细节会略有差异,但逻辑一致):
进入 L1.0(L1)
Traffic Idle:没有新的 TLP/DLLP,链路空闲
ASPM 条件满足:双方允许进入 L1(策略/能力 OK)
进入 Electrical Idle:Tx 进入电气 Idle,链路不再传高速符号
LTSSM 显示到 L1(很多工具会显示 L1 或 L1 Idle)
从 L1.0 进一步到 L1.1 / L1.2
若启用L1 Substates:PHY 继续关闭更多模拟模块
若进入L1.2且平台允许Refclk Off:参考时钟可能被移除;此时SerialTek PCIe协议分析仪往往会出现“时钟丢失/无法锁定”的现象(这与Saniffer之前写的文章和拍摄视频解释的 L1.2 trace 解码观察完全一致)
7) “需要沟通时”如何退出:CPU 发起 vs SSD 发起
这里最重要的一点是:退出低功耗需要“唤醒链路”,而唤醒链路通常先发生在物理层(恢复 Refclk/PLL/Tx),然后才回到能传 TLP 的 L0。
7.1 CPU 主动发起(Host 想读/写 SSD)
典型流程(尤其涉及 L1.2):
Host 侧产生事务需求(例如要发 NVMe SQ Doorbell 的 MMIO write,或要做一次 DMA 相关操作)
触发 Exit:Host/Root Port 通过平台机制发起退出(常见就是把CLKREQ# 拉到有效状态以请求时钟恢复)
REFCLK 恢复:参考时钟恢复、PLL/CDR 重新锁定(这段时间就是我们测到的几十 ms 量级“黑洞期”之一,具体由平台/器件决定)
链路回到可传输状态:LTSSM 从 L1.x → Recovery(可能)→ L0
Host 发送 TLP:包括 doorbell 的 MemWr、或其它 MMIO/配置访问等
SSD 响应/开始 DMA:后续就进入正常数据通道
7.2 SSD 主动发起(Device 需要“叫醒”Host)
SSD 主动唤醒的常见原因:
异步事件(AER/PME 等电源管理相关事件)
需要上报状态变化(如温度、错误、热管理相关)
设备内部需要恢复/通知
典型流程:
SSD 侧检测到需要唤醒链路/Host
通过 CLKREQ#(或等效机制)请求时钟/退出 L1.2(很多资料明确:退出序列可由任一端发起,并使用 CLKREQ# 作为关键握手信号)
REFCLK 恢复、链路回到 L0
SSD 才能发出相应的 TLP/Message/中断(MSI/MSI-X)等,Host 侧接收处理
直觉化总结:L1.2 像“把路灯/电闸也关了”,要先把电闸拉上(时钟/PLL 恢复),路上才能走车(TLP)。
8) 做 NVMe / 主板调试时碰到L1.2低功耗最该盯的“验证点”
配置空间能力位:Root Port 与 Endpoint 是否都宣称支持 ASPM L1 与 L1 Substates
OS/BIOS 策略是否开启:很多平台默认会因兼容性把 ASPM 关掉
CLKREQ# / REFCLK 行为:退出 L1.2 的关键证据(Quarch公司PAM - Power Analysis Module + SerialTek PCIe协议分析联动最有效)
退出延迟:关注 L1.2→L0 的“额外延迟”,因为 PCI-SIG FAQ 说 Link Capabilities 的 L1 Exit Latency 不含这部分额外延迟
业务是否导致频繁进出:例如系统轻载时出现频繁唤醒,会影响时延与体验(我们之前文章视频讲解 trace 里看到的“短周期唤醒”就是典型)