PCIe总线的电源管理包括两方面的内容:

  • 一是基于软件控制的PCI-PM电源管理机制,这部分与PCI总线兼容;

  • 二是基于硬件控制的ASPM电源管理机制, 不需要Host端软件口控制,PCIe链路自主管理。

注: ASPM= Active State Power Management.

在本文中,我们就针对这两种电源管理机制展开介绍。

1. PCI-PM电源管理

PCI-PM电源管理机制是系统软件通过修改寄存器中的电源管理字段,使PCIe设备进入D状态。D状态总共有四种:D0,D1,D2,D3.

  • D0: 这个状态属于"全马力"工作状态,不考虑任何电源节省的因素。D0又有两个子状态: D0-Uninitialized和D0 Active.

    a, D0-Unintialized: 这时PCIe还没有被激活,只能接受Configure Write/Read TLP请求,仍不能正常工作。比如设备刚被Reset后进入D0-Unintialized。

    b, D0 Active: PCIe设备已经被成功激活,可以正常工作。

  • D1: PCIe设备进入"浅睡眠"状态;

  • D2: PCIe设备进入"深度睡眠"状态;

  • D3: 这个状态是电源管理中最低功耗的状态。有两个子状态: D3-hot和D3-cold。

    a, D3-hot: 此时与D1/D2的功能类似,但是D3-hot只能返回到D0-Unitialized。

    b, D3-cold: 当PCIe设备的VCC电源被移除时,PCIe设备进入此状态。

值得注意的是,PCIe设备必须支持D0和D3,但是D1/D2是选择性的。所以在目前市面的SSD PCIe主控,一般都只是支持D0/D3,并不支持D1/D2。当PCIe设备处于D0状态时,ASPM可以改变PCIe链路的电源状态。

介绍ASPM之前,我们先认识一下PCIe定义的有关PCIe链路的电源状态:

  • L0: 这个状态属于PCIe设备的工作状态,与D0对应;

  • L0s: PCIe设备进入Standby状态;

  • L1: PCIe设备进入比L0s更低功耗的Standby状态;L1状态有两个子状态L1.1和L1.2;

  • L2/L3 Ready: 这两个状态是PCIe设备准备进入L2/L3前的预备状态;

  • L2: 比L1功耗更低的深度省电状态;

  • L3: 此时PCIe链路出于关闭状态,PCIe设备的VCC电源也被移除;

  • LDn: 这个状态不具有实际意义,只是L2/L3返回L0状态时所需要用的中间过渡状态;

PCIe设备的D状态与PCIe链路电源状态相辅相成,不是单独存在的。亲密关系如下表:

了解了PCIe设备D状态与PCIe链路的电源状态,我们接下来看看"一号主人公"ASPM.

2. ASPM电源管理

ASPM是基于硬件自主控制的链路电源管理机制,只有在PCIe设备处于D0状态是才可以应用ASPM机制。与ASPM有关的链路状态只有L0s和L1。

在L0s和L1状态下,PCIe链路均进入Electrical Idle. 此时,链路中差分信号D+和D-没有压差,也就代表没有信号传输。Electical Idle状态的进入和退出会用到数据流的Ordered sets(TS1/TS2, EIOS, FTS, EIEOS等),有关数据流的相关内容请见前面的文章"物理层数据流解析", 在这里不再展开介绍。

我们这里主要介绍一下L0s和L1的状态转换。

从上面ASPM链路状态装换图(蓝色部分)中,我们可以看到:

  • L0s与L0之间可以相互转换;

  • L1返回L0时不能直接返回,需要先进入Recovery状态;

  • L0s与L1之间不能之间转换,要切换状态,必须先回到L0状态。

L0s状态的进入:

L0s状态的进入是根据设备所处空闲时间的长短决定的。PCIe Sec规定,如果PCIe设备在7us之内,没有TLPs或者DLLPs要传输,那么PCIe设备发送端就可以决定是否要进入L0s状态。

不过,这个不是强制性的,如果你任性的坚持即使超过7us没有TLPs/DLLPs传输也不进入L0s,也是可以接受的~但这样的话就失去了ASPM的意义咯~

当PCIe设备发送端决定进入L0s时,发送端会停止数据输出,并给接收端发送Ordered set "EIOS",之后,发送端就进入Electrical Idle状态。接收端接收到EIOS序列之后,在经过一段延时(最短20ns)后,也进入Electrical Idle状态。此时,发送端和接收端均进入L0s状态。

另外,需要提一点:发送端与接收端有可能出于不同的链路状态。比如,进行DMA操作时,发送端一直处于工作状态L0,而接收端在长时间内无事可做,将自主进入L0s状态,此时不需要发送端同步进入L0s。

L0s状态的退出:

当PCIe设备的发送端检测到空闲状态的条件(7us之内没有TLPs或者DLLPs要传输)不再满足时,就会从L0s退回L0状态。此时,发送端会向接收端发送N_FTS(Link Training时设定)个FTS和1个SOS,之后进入L0状态。接收端收到满足要求的FTS后,再接收1个SOS序列,然后也进入L0状态。

与L0s相比,L1的功耗更低。同时L1状态的进入与退出都比L0s要复杂。

L1状态的进入:

L1要求PCIe链路两端的设备均进入L1状态。重要的是,只有下游设备(EP活着Switch上游端口,如下图红色框)可以主动要求进入L1状态。上游设备在接收到下游设备的请求之后,根据自身状态决定是否接收上游设备的请求。

其实,下游设备也不是很任性的随时可以请求进入L1状态,也需要满足几个条件:

  • PCIe设备没有TLP和DLLP需要传输;

  • PCIe设备支持L1状态;

  • 如果是Switch作为下游设备启动L1状态,前提是Switch下游端口必须处于L1或者比L1更高的省电状态(比如,L2/L3).

那么,我们就详细解读下游设备是如何启动请求进入L1状态的。

1. 当下游设备准备启动进入L1状态时,会先暂停安排新的TLP;

2. 在发送进入L1状态请求之前,必须接收到暂停TLP传输前的最后一个TLP的Ack回报,确保其已被正确接收;

3. 另外,还要确保Flow Control积分单元可以满足最大TLP传输的需要。这个主要是为了设备退出L1状态之后可以立刻开始TLP传输工作;

4. 在前面的准备工作完成之后,此时就可以放心的给上游设备发送进入L1状态的请求咯。在这个过程中,下游设备会一直发送PM_Active_State_Request L1 DLLP,知道收到对方的"接收函"PM_Request_ACK DLLP。

5. 上游设备接收到进入L1状态的请求。

6-8. 上游设备在接收到L1请求之后会重复类似上游设备的准备工作(Step 1-3)。

9. 上游设备的准备工作完成后,会给下游设备下发"接收函"PM_Request_ACK DLLP,同意下游设备的请求。

10. 下游设备接收到上游的接收函之后,停止TLP和DLLP的传输。

11. 下游设备发送端发送EIOS序列,然后进入Electrical Idle状态。

12.  上游设备收到下游设备的EIOS序列后,知道下游设备已进入L1状态。此时,上游设备也停止TLP和DLLP的传输。

13. 接着上游设备的发送端也进入Electrical Idle状态,代表了上游设备也进入L1状态。

其实,上述的过程是一种比较理想的状态,就是假设在下游设备发送进入L1请求的时候,双方均已完成事务传输,并且没有新的事务传输需求。

生活不可能总是一帆风顺。下游设备的进入L1请求也有可能被上游设备拒绝:

1. 当下游设备准备启动进入L1状态时,会先暂停安排新的TLP;

2. 在发送进入L1状态请求之前,必须接收到暂停TLP传输前的最后一个TLP的Ack回报,确保其已被正确接收;

3. 另外,还要确保Flow Control积分单元可以满足最大TLP传输的需要。这个主要是为了设备退出L1状态之后可以立刻开始TLP传输工作;

4. 在前面的准备工作完成之后,此时就可以放心的给上游设备发送进入L1状态的请求咯。在这个过程中,下游设备会一直发送PM_Active_State_Request L1 DLLP,知道收到对方的"接收函"PM_Request_ACK DLLP。

5. 上游设备接收到进入L1状态的请求。

6. 上游设备在接收到L1请求之后,发现自身情况并不能满足L1的要求,并回复 PM_Active_State_Nak TLP,告知下游设备目前无法进入L1状态。

7. 下游设备接收到上游的拒绝信。

8. 因为无法进入L1状态,下游设备会退而求其次,在满足L0s时先进入L0s状态。

L1状态的退出:

与L1状态的进入步骤相比,L1状态的退出相对简单很多了。L1状态的退出请求可以有任何一方提出。不像L1状态的进入,只有下游设备才能请求进入L1状态。

L1状态的退出是通过重新Link Training实现的。因为发送TS1序列之后,设备退出Electrical Idle状态,也即退出L1,进入Recovery状态,进而回到L0状态。

上面介绍了ASPM相关的链路状态,是不是觉得ASPM挺好玩的呢?

如果我们要在SSD中应用ASPM功能,其实还有两项工作:

  1. 在Link Control Register中,将ASPM的功能打开:

  2. 在Link Capabilities Register中,对ASPM进行具体的设定.

此外,除了上述通过软件修改Link Control Register的方式打开ASPM功能外,现在很多主板BIOS中可以修改ASPM的设定。

PCIe系列专题之五:PCIe总线电源管理相关推荐

  1. PCIe系列专题之一:PCIe技术概述

    SSD的协议标准除了SATA,还有一个更先进的协议标准,就是PCIe.PCIe总线使用了高速差分总线,并采用了端到端的连接方式. 两个设备之间的的传输通道,称为Link,由1,2, 4, 8, 16, ...

  2. PCIe系列专题之二:2.5 Flow Control缓存架构及信用积分

    一.故事前传 之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transacti ...

  3. PCIe系列专题之二:2.8 事务排序机制

    一.故事前传 之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transacti ...

  4. PCIe系列专题之二:2.3 TLP结构解析

    一.故事前传 之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transacti ...

  5. PCIe系列专题之二:2.1 TLP的前世今生

    一.故事前传 之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transacti ...

  6. PCIe系列专题之三:3.0 数据链路层概述

    一.故事前传 之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transacti ...

  7. PCIe系列专题之七:PCIe热插拔

    当你准备在不断电的情况下插拔一块PCIe SSD时,你要小心了.如果在PCIe设备不支持热插拔的条件下,很可能会对主板或PCIe插槽造成损毁. 为了放置意外的发生,PCIe Spec设计了一种&quo ...

  8. SATA系列专题之五:Link Power Management解析

    一.故事前传 在之前的文章中, 我们已经针对SATA的主要结构进行了较为详细的解析,详见前期文章: 1,浅析SATA Physical Layer物理层OOB信号: 2,SATA Link Layer ...

  9. NVMe系列专题之二:队列(Queue)管理

    转载链接:https://mp.weixin.qq.com/s?__biz=MzIwNTUxNDgwNg==&mid=2247484355&idx=1&sn=04f0617bf ...

最新文章

  1. 人脸检测识别文献代码
  2. WCF服务的REST / SOAP端点
  3. python什么是交换算法_python算法-015将链表元素两两交换元素(交换值、就地翻转)...
  4. boost::dynamic_bitset模块实现ambiguous set的测试程序
  5. 985高校6年招聘8000多青年人才引热议!高校割起年轻博士的韭菜有多疯狂?
  6. C# 8.0的三个令人兴奋的新特性 1
  7. PID控制器开发笔记之二:积分分离PID控制器的实现
  8. 区块链将如何影响你的生活?链圈大佬、美图董事长蔡文胜这样说
  9. 与AI人才有关的讨论
  10. 坚守本心,你公司的OA解决了以下问题吗?
  11. 【随机过程】随机过程之更新过程(1)
  12. 初探内联方式的 onload=doSomething()为何要加()?而js代码的 onload=doSomething 和 addEventListener 为何不加()?...
  13. 刷脸支付打造了一个无卡交易的时代
  14. Android第四次作业
  15. Linux内核学习(一)编译内核并运行一个最小系统
  16. 彻底掌握Quartus——基础篇
  17. 企业局域网即时通讯软件存在是必然趋势
  18. 红糖水白糖水的转换--郝汉森
  19. 浅谈统一权限管理平台
  20. HashSet集合保证元素唯一性原理分析

热门文章

  1. 如何批量处理/修改文件的后缀名(使用批处理.bat进行)
  2. pytorch忽略user warning
  3. 网狐荣耀斗地主等15合1(美女图)
  4. Unity3D 解决检测碰撞某类物体的一种方法
  5. Unity射线与UI碰撞检测
  6. 淘宝api,custom - 淘宝官方订单API操作
  7. AR培训丨零基础制作第一个AR应用——AR绘本
  8. choco设置后续软件默认安装路径
  9. .env .env.development .env.production 配置说明
  10. ubuntu企业微信和微信无法发送和显示图片和截图问题