ASPM / L0s / L1 本质就是PCIe 的链路省电机制,但在工程里它经常和建链失败、降速、掉链纠缠在一起。
一、先一句话总览
ASPM 是策略,L0s / L1 是具体的省电状态。
ASPM:Active State Power Management(主动电源管理)
L0s / L1:PCIe 链路在空闲时进入的低功耗状态
二、PCIe 链路的几个关键状态
L0 ←→ L0s ←→ L1 → L2 / L3
| 状态 | 含义 |
|---|---|
| L0 | 正常全速工作 |
| L0s | 浅度省电(快速进出) |
| L1 | 深度省电(慢一些) |
| L2/L3 | 休眠 / 关断 |
三、ASPM 是什么?
ASPM ≠ 一个状态
它是RC(Root Complex)和 EP(设备)之间的协商机制。
ASPM 干的事
判断链路空闲
决定是否允许进入 L0s / L1
决定进入哪一种
协商发生在哪?
Configuration Space
Link Capability
Link Control
📌双方都支持,才能开
只要一方不支持 → 不启用。
四、L0s:浅睡眠(最容易被忽略)
1️⃣ L0s 是什么?
链路“半醒”
关闭发送方向的 SerDes
接收方向保持监听
👉 像 CPU 的 C1 状态
2️⃣ 特点
| 项目 | L0s |
|---|---|
| 唤醒延迟 | 极短(几十 ns) |
| 省电效果 | 小 |
| 对性能影响 | 几乎无 |
| 对 SI 要求 | 高(进出频繁) |
3️⃣ 工程现实
Gen3 以后很多平台直接关 L0s
因为:
省电不多
容易引入链路抖动问题
五、L1:深睡眠(真正省电)
1️⃣ L1 是什么?
TX / RX 都关
PLL 可能关闭
时钟可能停止
👉 类似 CPU 的 C3/C6
2️⃣ 特点
| 项目 | L1 |
|---|---|
| 唤醒延迟 | µs 级 |
| 省电效果 | 明显 |
| 对性能影响 | 有 |
| 对稳定性 | 敏感 |
3️⃣ L1 的“进阶形态”
🔹 L1.1 / L1.2(PCIe 3.0+)
L1.1:保留部分时钟
L1.2:几乎断电
📌对平台设计要求非常高
时钟
电源时序
PM 信号
六、ASPM / L0s / L1 和你调试时的关系(重点)
❗ 1️⃣ 建链异常 / 掉链
某些 EP宣称支持 ASPM,但实现不完整
进入 L1 后唤不回来
👉 现象:
冷启动 OK
运行一段时间后设备消失
❗ 2️⃣ Gen3 / Gen4 降速
ASPM 进出导致EQ 重新训练
SI margin 不够 → 自动降速
❗ 3️⃣ 热插拔 / 复位问题
L1 ↔ L0 切换时
PERST# / REFCLK 时序不稳
七、Linux 下最常用的几个观察点
lspci -vvv -s <bus:dev.func>
重点字段:
ASPM L0s L1 Enabled LnkCtl: ASPM L1 Enabled
强制关闭 ASPM(验证问题神器)
pcie_aspm=off
如果关掉 ASPM 问题消失:
80% 不是协议 bug,而是SI / EP 实现问题;
八、工程经验总结
ASPM 是“锦上添花”,不是“必需品”。
Server / 存储 / 加速卡:
通常关 L0s
L1 谨慎
移动 / 低功耗设备:
ASPM 是刚需
九、一句话对照表
| 名词 | 本质 |
|---|---|
| ASPM | 省电策略 / 协商机制 |
| L0s | 浅睡,快进快出 |
| L1 | 深睡,省电明显 |
| L1.2 | 极深睡,风险最高 |