从 SATA 链路、PCIe 链路、NVMe 协议以及 SSD 内部主控管理等方面介绍 SSD 上的电源管理技术。
8.1 SATA 省电模式 Partial 和 Slumber
PHY:物理层。
1. SATA 提供了两种低功耗模式,Partial 和 Slumber:
(1) Partial
PHY 处于低功耗状态,退出时间要求 < 10 μs。Partial 是让部分物理层电流进入休眠模式,能够在 10 μs 内被唤醒,让链路在不太影响性能的情况下休息一下。
(2)Slumber
PHY 处于更低功耗状态,要求退出时间 < 10 ms。与 Partial 模式相比,Slumber 模式下会关闭更多的电路,因此恢复要慢一些。当预测有一段相对长的 Idle 时间时,会让链路好好休息一下。
2. 发起
主机和设备都可以发起链路电源管理,但需要对方配合才能进入 Partial 或 Slumber 模式。主机发起称为 HIPM(Host Initiated Power Management),设备发起称为 DIPM(Device Initiated Power Management)。
PMREQ_P:请求进入 Partial 模式;
PMREQ_S:请求进入 Slumber 模式。
PMACK:同意请求;
PMNAK:不同意请求。
Listen Mode(侦听模式):AHCI 支持让没有接盘的端口进入侦听模式,此时该端口的功耗水平相当于 Slumber,但是该端口可以识别新接入的盘;
Auto Partial to Slumber:可以让链路不需要回到 Active 状态,直接从 Partial 进入 Slumber 模式。
以主机发起为例,阐述发起过程:
(1)主机发送一个 PMREQ_P 给设备;
(2)设备回复 PMACK 或者 PMNAK;
(3)如果设备回复同意,两边一起进 Partial(一般接收方会发送多个 PMACK 以确保发起方收到);如果设备回复不同意,那就什么都不发生。
如果需要退出 Partial 或 Slumber,需要通过 OOB(Out of Band,传输层协议使用带外数据) 重新建立连接。
8.2 SATA 超级省电模式 DevSlp
DevSlp:Device Sleep,设备睡眠,是一个信号,通过发送这个信号可以让盘进入一个非常省电的状态。
Partial 或 Slumber 省电模式下,盘都必须让自己的传输电路保持在工作状态,以便 SATA 主机需要的时候能把盘唤醒。如下图,进入 Partial 或 Slumber 后,SATA 总线的发送模块和接收模块仍处于工作状态,因此盘睡得并不安稳,省电效果不够好。
DevSlp 就是把这个传输电路完全关掉,然后专门加了一个低俗的管脚来负责接收唤醒通知:
DevSlp 注意事项:
8.3 SATA 终极省电模式 RTD3
DevSlp 虽然功耗小,恢复时间也还行,但进入 DevSlp 的时候 Vcc 还在,这样还是会有功耗。
要求:设置在长期 Idle 后,要把 Power 完全关掉。于是,RTD3 出现了!!!
在主机,也就是系统处于 S0 的情况下,如何让 SATA SSD 进入 D3 Cold 状态,这个就是 Runtime D3,简称 RTD3。
ACPI 规定的 Device Power State:
Partial 和 Slumber 模式都是只针对 SATA 链路,而 D State 是针对整个 SSD。
8.4 PCIe 省电模式 ASPM
ASPM:Active State Power Management。
ASPM 让 PCIe SSD 在某种情况下,能够从工作模式(D0 状态)通过把自身 PCIe 链路切换到低功耗模式,并且通知对方(主机)也这么干,从而达到降低整条链路功耗的目的。
ASPM 定义的低功耗模式有两种:L0s 和 L1,
上图中,各个状态的定义如下:
8.5 PCIe 其他省电模式
PCIe 链路在 L2 状态下,所有的时钟和电源全部关闭,能够保证最大的省电效果。但同时,L2 的退出时间相应也增加了很多。
8.6 NVMe 动态电源管理
NVMe 协议中的动态电源管理框图如下:
功耗目标和性能目标作为系统应用层面的输入,发送给主机端的 NVMe 驱动。
NVMe Power State:NVMe 规定最多支持 32 个 Power State Descriptor(电源状态描述符),其中 Power State Descriptor 0 是必须支持的。
8.7 Power Domain
Power Domain:电源域,简称 PD。