现在消费级笔记本里搭载SSD已经越来越多,而搭载PCIe SSD也是必经的趋势。
做消费级SSD的厂商辣么多,常见的PCIe主控就那么几款:SMI 2260,PS5007-E7,88SS1093和88NV1140 (三星这个大流氓就不提了)
这些个主控都支持一个叫ASPM的功能,ASPM的全称是Active State Power Management.
Active前面还缺省了两个词,Hardware Initiated — ASPM的第一个重要概念:这是HW也就是主控自己触发的,不需要Host或者FW干涉。(见下图highlight部分)
ASPM让PCIe SSD在某种情况下,能够从工作模式(D0 state)通过把自身PCIe链路切换到低功耗模式,并且通知对方也这么干,从而达到降低整条链路功耗的目的。
ASPM定义的低功耗模式,有两种:L0s和L1 (见下图 – 蓝色部分)
以上各状态的定义如下:
L0: 正常工作状态
L0s:低功耗模式,恢复Latency低
L1: 更低功耗模式,恢复Latency较长
L2/L3 Ready: Power off前的过渡状态
L2: Link处于辅助供电模式,极省电
L3: Link完全没电,功耗为0
LDn:刚上电,LTSSM还未完成前Link所处状态
要看一款SSD是否支持ASPM,你需要查看它的Link Capabilities Register [11:10] (如下图)
仅仅支持是没有用的,你还需要把开关打开, Link Control Register [1:0]
关于ASPM的Control,据PCIe Spec说:
- L0s,即使RC和EP某一方的L0s是关闭的,如果对方要求进入L0s, 本方也要跟着进
- L1,打开时必须先开RC,再开EP,关掉时必须先关EP再关RC
- 如果RC和EP都支持ASPM L1, 那必须把EP的L1打开
L0s的比较简单:
进入:
- SSD可以在直接在Tx lane上启动进入L0s
- 如果SSD的Tx的L0s被关闭,Rx还是接受来自RC的L0s请求
退出:
- 双方都可以启动退出流程
- 发送FTS (Fast Training Sequence),然后发送一个SKP, 对方借此恢复bit and symbol lock
L1的流程上复杂一点:
进入:
EP |
RC |
|
1 |
Block后续的TLP |
|
2 |
确认发送的最后一个TLP已经收到对方的ACK(确保Replay Buffer是空的) |
|
3 |
确认FC Credit足够 (可以满足一个最大size的传输) |
|
4 |
持续发送 PM_Active_State_Request L1 (够白话文吧)给RC,直到RC回复 PM_Request_ACK |
|
5 |
收到PM_Active_State_Request L1 |
|
6 |
Block后续的TLP |
|
7 |
确认发送的最后一个TLP已经收到对方的ACK(确保Replay Buffer是空的) |
|
8 |
确认FC Credit足够 (可以满足一个最大size的传输) |
|
9 |
持续发送PM_Request_ACK,直到EP发送Electrical Idle |
|
10 |
收到PM_Request_ACK, Disable TLP/DLLP包的传输 |
|
11 |
发送Electrical Idle, 进入L1 |
|
12 |
收到Electrical Idle, Disable TLP/DLLP包的传输 |
|
13 |
进入L1 |
退出:
- 双方都可以启动退出流程
- 不是发送FTS,而是重新进行Link Training
- 唤醒发起方,发送TS1,走LTSSM的Recovery stage重新建立连接
最后说一下 Link Control Register [7], Extended Sync
这是一个神奇的bit, 置上以后从L0s和L1退出时,Device会发超多的FTS和TS1,从而让双方有更多的时间谈人生,谈理想,最终”握手”成功。
这个mode是当链路中有额外设备(例如PCIe analyzer)时,为保证能够正常的achieve bit and symbol lock 用的。
但是遇到ASPM L1回不来或者开机找不到PCIe device的情况,也可以通过设置这个bit收集更多的参考数据。