PCI Express(简称PCIe或PCI-E)是一种高速串行计算机总线,是PCI标准的替代品。它的主要优点是高带宽、低延迟和可靠性。与传统的PCI总线相比,PCIe提供了更高的数据传输速率,并且支持多种不同类型的设备,如网卡、显卡、声卡等。

PCIe的硬件原理是基于包交换(packet switching)的思想。在PCIe中,数据是以包的形式发送和接收的。每个包都包含有关发送者、接收者和数据内容的信息。这些信息是通过帧头(header)和帧尾(trailer)的形式发送的。帧头和帧尾还包含有关CRC(循环冗余校验)、包长度和其他错误检测信息的信息。

在PCIe中,数据包在通道上传输。通道是由一组线路(通常是双绞线或铜线)组成的。一个通道由一对设备连接,一个是发送者,另一个是接收者。通道的带宽取决于通道上线路的数量和宽度。在PCIe中,通道有多种不同的版本,每个版本都提供了不同的带宽。

PCIe支持电源管理,PCIe电源管理主要由两部分组成:L1 间断性电源管理和L2 睡眠电源管理。

  • L1 间断性电源管理是通过在L1 状态下关闭通信信号,来降低通信电流的一种方式。这个状态下Link Training和Link Active Reporting Protocol(LARP)都会被禁止,但是通信仍然能够恢复。
  • L2 睡眠电源管理是在L2状态下关闭电源并禁止所有通信信号,来降低电源电流的一种方式。这个状态下,Link Training和LARP都会被禁止,并且通信也无法恢复。

在PCIe中,电源管理是由设备端口(Endpoint)来控制的,而Root Complex通常是不具备电源管理能力的。设备端口可以通过控制电压和电流来实现电源管理。在pcie中,设备端口可以通过使用电压状态转换器(Voltage State Converter,VSC)和电流状态转换器(Current State Converter,CSC)来实现电源管理。VSC可以将电压调整到不同的水平以满足不同状态下的电力需求,而CSC则可以将电流调整到不同水平以满足不同状态下的电力需求。

PCIe的电源管理也分为如下两部分,一部分是Link Power Management(LPM),另一部分是Active State Power Management(ASPM)。

  • Link Power Management(LPM)是用来管理PCIe链路的电源状态的。LPM允许PCIe设备在链路上进行睡眠和唤醒操作,从而节省电力。LPM通过控制Link电源状态来实现电源管理,可以将Link电源状态分为三种:L0、L1、L2。L0是正常工作状态,L1是睡眠状态,L2是更深度的睡眠状态。
  • Active State Power Management(ASPM)是用来管理PCIe设备的电源状态的。ASPM可以控制PCIe设备的电源状态,可以将PCIe设备的电源状态分为两种:Active和Idle。Active状态是设备正在工作状态,Idle状态是设备休眠状态。

在进行电源管理时,设备驱动程序需要在设备上设置一些寄存器来控制电源状态。例如,在LPM中,驱动程序需要设置Link Control 2寄存器来控制Link电源状态。在ASPM中,驱动程序需要设置Link Control寄存器来控制设备电源状态。

需要注意的是,在进行电源管理时,需要考虑硬件和软件的兼容性。

PCI-PM电源管理状态图

PCI-PM (Power Management for PCI) 是一种 PCI 的电源管理标准,它提供了许多状态来管理 PCI 设备的电源。主要的状态有 D0 (工作状态)、D1、D2 和 D3 (睡眠状态)。

  • D0 状态是工作状态,在这种状态下,PCI 设备可以正常工作。
  • D1 状态是第一级睡眠状态,在这种状态下,PCI 设备可以继续处理本地请求,但不能处理来自系统总线的请求。
  • D2 状态是第二级睡眠状态,在这种状态下,PCI 设备不能处理本地请求和系统总线的请求。
  • D3 状态是第三级睡眠状态,在这种状态下,PCI 设备不能处理任何请求,并且最大限度地减少电源消耗。

linux内核中,具体的实现可以参考drivers/pci/pci-driver.c和drivers/pci/pci-sysfs.c等文件。

PCIe的链路电源状态:

PCI Express (PCIe) 状态转换指的是在不同状态之间转换的过程。PCIe通信包括L0,L0s,L1,L2,L3五种状态,其中L0是工作状态,L0s是睡眠状态,L1是低功耗状态,L2是更低的功耗状态,L3是更低的功耗状态.

在L0和L0s之间,转换是通过L0s Entry和L0s Exit来实现的。在L1和L0之间,转换是通过L1 Entry和L1 Exit来实现的。在L2和L0之间,转换是通过L2 Entry和L2 Exit来实现的。在L3和L0之间,转换是通过L3 Entry和L3 Exit来实现的。

这些转换需要符合PCI-PM电源管理规范中的条件,并由硬件和软件协调实现。

PCIe的链路电源状态主要有L0、L0s、L1、L2、L3五种状态:

  • L0状态:链路处于传输数据的状态,与D0对应。
  • L0s状态:链路处于休眠状态,但是仍然能够接收数据。

L0s状态是PCI Express链路的一种睡眠状态,在这种状态下,链路上的电源消耗最小。在L0s状态下,链路上的数据传输和错误检测仍然可用,但是链路上的带宽降低了。进入L0s状态可以通过降低链路的时钟频率和电压来实现。在L0s状态下,链路上的设备可以在需要时快速返回L0状态。

  • L1状态:链路处于休眠状态,并且能够接收数据。

L1是PCI Express链路电源管理的一种状态,指的是链路中的设备在空闲状态下的高休眠状态。在L1状态下,链路上的设备会减少对系统的电力消耗,但同时也会增加唤醒时间。使用L1状态可以在保证系统性能的同时降低电力消耗。

  • L2状态:链路处于电源管理状态。

L2状态(Link Power Management State L2),是PCI Express链路电源管理的一种状态,表示链路处于睡眠状态。在L2状态下,链路的发送和接收单元都被禁止工作。这个状态的目的是节省链路的电力消耗。L2状态可能是由系统设计者来设置的,也可能是由设备驱动程序来设置的。在L2状态下,链路上的所有通信都被暂停,并且链路上的所有信号都被禁止。

  • L3状态:链路处于关机状态。

这些状态之间能够进行状态转换:

在L0状态下可以进入L0s、L1、L2、L3状态,L1状态可以进入L0、L2、L3,以此类推。而L2和L3状态只能进入L0状态。

PCIe L状态转换是环形的。L0状态可以转换到L1状态,L1状态可以转换到L2状态,L2状态又可以转换回L0状态。

需要注意的是,进入L1状态需要符合一些额外的条件,进入L2状态需要符合更多的条件。

在进入L1状态和L2状态时,需要满足一些先决条件,例如设备必须支持L1和L2状态,并且连接必须支持L1和L2状态。而且L1状态不能直接进入L0状态,需要先进入L0s然后进入L0状态。

L0与D0的状态区别:

  • L0状态和D0状态都是PCI-PM电源管理标准中的状态,但它们有一些区别。
  • L0状态是PCIe通信线路上的最高速状态,在这种状态下,数据传输是最快的。
  • D0状态是PCI设备的正常工作状态,在这种状态下,设备消耗最大电力,并且它可能正在执行某些操作。

总而言之,L0状态是指PCIe通信线路上的状态,而D0状态是指PCI设备的状态。

下面是PCIe设备的D状态和PCIe链路电源状态的对应关系表格:

D状态

链路电源状态

描述

D0

L0/L0s

活动状态,设备正在工作

D1

L1

低功耗状态,设备仍在工作但是功耗较低

D2

L2

更低功耗状态,设备仍在工作但是功耗更低

D3

L3

最低功耗状态,设备已经关闭,没有工作

请注意,不是所有的PCIe设备都支持所有的D状态和L状态,具体的支持情况取决于设备的硬件和驱动程序的实现。

linux内核源码中,PCIe的驱动代码位于drivers/pci/aspm.c中。驱动代码实现了PCIe总线的配置和状态管理。这个驱动实现了PCIe电源管理功能,以确保PCIe从控制器在需要时处于工作状态,并在不需要时进入睡眠状态,从而减少电源消耗。