6 D状态
D0
所有function必须支持D0。D0有两个不同的子状态,D0uninitialized和D0active。
D0uninitialized
当一个组件施放conventional reset后,该组件的所有function进入D0uninitialized状态。
当function完成FLR后,该funciton进入D0uninitialized状态。
D0active
配置完成后,function进入D0active状态,即PCIe功能完全运行状态。
spec里对“配置完成”的定义:A Function enters the D0active state whenever any single or combination of the Function's Memory Space Enable, I/O Space Enable, or Bus Master Enable bits have been Set.
D1/D2
D1/D2是可选支持状态。
非D0的所有状态都只能接收configuration和message类型的TLP。
D1/D2比较简单,主要信息见后文的图表。
D3
D3是必须支持的状态。
Function可以通过软件或通过物理移除其电源而转换到D3。在这个意义上,D3被指定成两种状态D3hot和D3cold,前者表示主电源在位,后者表示主电源移除。
D3hot的function可以以软件方式,即写入function的PMCSR寄存器,来转换到D0状态。这个D0可以是D0uninitialized也可以是D0active,取决于软件是否选择保留配置信息(PMCSR中的No_Soft_Reset bit置1表示保留,置0表示不保留)。
D3cold的function可以通过施加主电源并assert fundamental reset,来转换到D0uninitialized状态。
如上,spec的3个图表,对D状态的转换、延时以及跟L状态的关联,梳理得很清楚。
7 链路唤醒
从链路L2重新组建电源和时钟,称为唤醒。
因为L2下设备的主电源处于下电状态,唤醒机制的运作通常需要Vaux。
唤醒的整个需求和流程我总结如下:
- 软件需要把Vaux相关的寄存器配好,通常是使能Vaux的使用,并配置需要的电流
- 软件使能PMCSR寄存器中的PME_En
- 使用两种唤醒机制中的一种触发唤醒动作
唤醒机制有两种:Beacon和WAKE#
Beacon机制使用inband信令来实现唤醒功能,即在TX RX管脚上传递相对低频信号,通常速率在30k到500MHz。
WAKE#机制利用sideband信号来实现唤醒功能,WAKE#是一个OD信号,由请求唤醒的组件发起。
4.发送PM_PME告诉主机是自己是唤醒源
8 PM系统Message及DLLP
上表中,
PM_Enter_L1和PM_Request_Ack用于协商进L1;
PM_Enter_L23和PM_Request_Ack用于协商进L2/L3 Ready;
PM_PME的功能上文介绍唤醒的部分已解释,用于唤醒完成后告诉RC唤醒源;
PME_Turn_Off和PME_TO_Ack用于UC向DC广播关闭PM_PME的发送,然后将链路置入L2/L3 Ready。