PCIe专题学习——5.0(总线电源管理)

2023-11-08

之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transaction layer), 数据链路层(Data link layer)和物理层(Physical layer)

一:电源管理

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

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

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

注: ASPM= Active State Power Management,

一: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定义的有关链路的电源状态:

  • 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

二: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状态。

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

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

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

L0s状态的退出:

当PCIe设备的发送端检测到空闲的条件(7us之内没有TLPs或者DLLPs要传输)不再满足时,就会从L0s退回L0状态,此后,发送端会向接收端发送N_FTS(Link Traning时设定)个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的设定。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCIe专题学习——5.0(总线电源管理) 的相关文章

  • linux pcie RC 框架

    1 linux pcie rc framework Following is a brief explanation of layers shown in the diagram There are different drivers fo
  • pci和pcie的区别

    原文地址 xff1a https blog csdn net u013253075 article details 80835489 最近在学习驱动开发过程中涉及到PCI相关知识 xff0c 在网上看了很多文章 xff0c 良莠不齐 xff
  • NGFF、M.2、PCIe、NVMe概念区分以及PCIEx1 x4 x8 x16区别

    对于NGFF M 2 PCIe NVMe等概念的说明 解决方案 NGFF Next Generation Form Factor xff0c 顾名思义 xff0c 是物理外形 Form Factor 的标准 与 NGFF 并列的是 2 5
  • FPGA基于XDMA实现PCIE X8通信方案测速 提供工程源码和QT上位机程序和技术支持

    目录 1 前言2 我已有的PCIE方案3 PCIE理论4 总体设计思路和方案5 vivado工程详解6 驱动安装7 QT上位机软件8 上板调试验证9 福利 xff1a 工程代码的获取 1 前言 PCIE xff08 PCI Express
  • FPGA基于XDMA实现PCIE X8的HDMI视频采集 提供工程源码和QT上位机程序和技术支持

    目录 1 前言2 我已有的PCIE方案3 PCIE理论4 总体设计思路和方案5 vivado工程详解6 驱动安装7 QT上位机软件8 上板调试验证9 福利 xff1a 工程代码的获取 1 前言 PCIE xff08 PCI Express
  • Zynq实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持

    目录 1 前言2 我已有的SDI编解码方案3 我已有的PCIE方案4 基于zynq架构的PCIE5 总体设计思路和方案SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缓存PCIE发送通路SDI同步输出通
  • FPGA实现MPEG2视频压缩PCIe传输 提供软硬件工程源码和技术支持

    目录 1 前言2 MPEG2视频压缩实现3 我已有的FPGA图像视频编解码方案4 我已有的PCIE方案5 MPEG2视频压缩PCIE传输设计方案FPGA硬件设计软件设计 6 Vivado工程详解7 Linux下的XDMA驱动安装8 上板调试
  • 【PCIe】1: PCIe 硬件时序初始化过程

    目录 1 前言 2 PCIe理论带宽 3 PCIe连接器引脚定义 4 关键信号描述 4 1 PERST 4 2 REFCLK 和REFCLK 信号
  • PCI-E

    PCI E 1 简介 PCI E PCI Express的所写 是最新的总线和接口标准 它原来的名称为 3GIO 是由英特尔提出的 很明显英特尔的意思是它代表着下一代I O接口标准 交由PCI SIG PCI特殊兴趣组织 认证发布后才改名为
  • CXL 2.0 Device配置空间寄存器组成

    目录 1 配置空间 1 1 PCI Power Management Capability Structure 1 2 PCI Express Capability Structure 2 扩展配置空间 2 1 Virtual Channe
  • PCIE专题学习——1.0

    PCIE基础概念 一 1 PCIe的概念 PCIe是一种全双工 差分 端对端 串行告诉接口协议 PCI是并行处理的机制 差分可以提高传输的稳定性 全双工意味着发送端在发送的同时 也可以接收 问题在于串行会比并行处理快吗 当然不一定 这和系统
  • PCIE结构拓扑(RC、EP、SWITCH)介绍

    1 PCIE典型结构拓扑 1 个人理解 红色方框部分一般是在芯片内部集成 对外可提供多个PCIE接口 2 芯片提供的PCIE接口 可以接EP设备 PCI桥 Switch设备 2 RC Root Complex 个人理解 RC在功能上和Swi
  • PCIe专题学习——2.1

    之前我们对PCIe的一些基础概念做了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link layer
  • PCIe专题学习——2.5(Flow control缓存架构及信用积分)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • PCIe专题学习——5.0(总线电源管理)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • PCIe 总线上的写入是原子的吗?

    我是 PCIe 的新手 所以这可能是一个愚蠢的问题 这似乎是询问有关 PCIe 接口的相当基本的信息 但我无法找到答案 因此我猜测我缺少一些使答案显而易见的信息 我有一个系统 其中有一个 ARM 处理器 主机 通过 PCIe 设备 与 Xi
  • macOS DriverKit:制作 PCI dext 来替换内置驱动程序

    我正在尝试在 DriverKit 中编写一个用户空间 PCI 驱动程序 用于教育 研究目的 我找到了一个来自 WorthDoingBadly 的示例其中包含 PCI 设备 dext 的样板代码 我已删除了漏洞利用代码 我已将其修改为通过以下
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • 在用户空间中启用写组合 IO 访问

    我有一个带有用户空间驱动程序的 PCIe 设备 我通过 BAR 向设备写入命令 这些命令对延迟敏感并且数据量很小 64 字节 因此我不想使用 DMA 如果我使用以下命令重新映射内核中 BAR 的物理地址ioremap wc然后将64字节写入

随机推荐