1. 基本概念区分
1.1 PCIe 电源状态(Device Power State, D-States)
由 PCI Power Management(PM) 定义,作用对象是 Function / Device 本身。
- D0
- 全功能工作态
- 配置空间和 BAR 可访问
- D1 / D2
- 可选状态(多数 Root Port/Endpoint 不支持)
- 部分功能关闭
- D3hot
- 逻辑上仍供电
- 配置空间仍可访问
- D3cold
- 功能与配置空间全部不可访问
- 物理断电(retention 视平台实现)
1.2 PCIe 链路状态(Link Power State, L-States)
由 PCIe Link Layer / PHY + ASPM 定义,作用对象是 Link 本身(Root Port ↔ Endpoint)。
- L0
- 正常数据传输
- L0s
- 单向低功耗(快速恢复)
- L1
- 双向低功耗
- L1 Substates
- L1.1 / L1.2(更深度的 PHY 省电)
- L2 / L3 Ready
- 用于链路关闭(配合 D3)
- Detect / Disabled
- 链路不活动或被禁用
2. 电源状态与链路状态的核心关系
2.1 核心原则(规范级)
电源状态决定“设备是否可用”
链路状态决定“物理传输是否活跃”
两者是正交(Orthogonal)*关系,但存在*强约束依赖。
3. 各 D-State 对链路状态的要求与影响
3.1 D0 ↔ Link State
| Device Power State | 允许的 Link State |
|---|---|
| D0 | L0 / L0s / L1 / L1.x |
说明:
- 设备处于 D0 时:
- 链路可以动态进入 ASPM(L0s/L1/L1.x)
- 由 OS policy + hardware 能力决定
- ASPM 仅在 D0 有意义
3.2 D1 / D2(可选)
| Device Power State | Link 行为 |
|---|---|
| D1 / D2 | 仍在 L0/L1 范围 |
说明:
- 很少在 SoC / 手机平台使用
- 不涉及链路关闭
3.3 D3hot ↔ Link State
| Device Power State | Link State |
|---|---|
| D3hot | L1 / L2 Prepared |
关键点:
- 进入 D3hot 前:
- 必须停止正常 link traffic
- 常见流程: L0 → L1 → L2 (Ready)
- 链路仍可能保持 逻辑存在
- 配置空间仍可访问(PCI config read/write)
3.4 D3cold ↔ Link State(强绑定)
| Device Power State | Link State |
|---|---|
| D3cold | L2 / Disabled / Detect |
这是最重要的强约束关系:
- 进入 D3cold 的前提:
- Link 必须先进入 L2 或 Disabled
- 进入 D3cold 后:
- PHY 可能被完全断电
- LTSSM 回到 Detect
- 配置空间不可访问
4. 关系总结(一句话)
浅电源态(D0/D3hot) → 链路仍存在
深电源态(D3cold) → 链路必须关闭
5. 实际系统中的典型对应关系(Linux / Android / SoC)
5.1 Runtime PM(pm_runtime)常见组合
| Runtime PM 状态 | Device D-State | Link State |
|---|---|---|
| active | D0 | L0/L1 |
| runtime suspend | D3hot 或 D3cold | L1/L2/Detect |
- 是否进 D3cold:
- 取决于:
supports D3cold- 平台电源域
bridge_d3是否允许
- 取决于:
5.2 Root Port 的特殊点
- Root Port 本身也有 D-States
- 常见 SoC 行为:
- Endpoint → D3cold
- Root Port → clock gated + link down
- Root Port 进入 D3cold:
- 必然导致整个 link down
6. ASPM 与电源状态的关系
6.1 ASPM 不等于设备低功耗
- ASPM(L0s/L1/L1.x):
- 只降低 Link PHY 功耗
- 不改变 Device D-State
- 设备仍然是 D0
6.2 进入 D3 必然影响链路,但反之不成立
- ✅ D3cold → Link down
- ❌ Link L1/L1.2 ≠ Device 不可用
7. 状态转换流程示例
7.1 正常 Suspend 流程(Endpoint)
D0 / L0↓ (ASPM)
D0 / L1↓ (system suspend / runtime suspend)
D3hot / L1↓ (platform power off)
D3cold / L2 → Detect
7.2 Resume 流程
Power on↓
Link Detect → Polling → L0↓
Device enters D0↓
Config Restore + Driver Resume
