之前写过一篇power management的介绍,主要是介绍了一下power management的概念,这次主要是介绍下ASPM和ASPM L1机制。

 1、ASPM介绍

mpls ldp 错误排查_low power

mpls ldp 错误排查_mpls ldp 错误排查_02

    ASPM全称Active State Power Management,是针对Power Management的一种管理机制。所谓“Active State”就是设备在D0状态下进入低功耗模式的管理机制。ASPM是硬件行为,软件只能写function配置空间Link Control Register的ASPM Control比特来disable和允许进入某种L state。

    PCI-PM是软件写function的配置空间的Power Management Control/Status Register来让function进入某种D state。

2、ASPM L1介绍

mpls ldp 错误排查_ASPM_03

    如果设备是支持ASPM L1的(link cap reg的bit11-10),ASPM ctrl字段的L1 entry(link ctrl reg的bit1-0)默认是disable的。只有链路两端的component都支持ASPM L1时,software才能enable downstream component的ASPM L1。

    Software必须先使能upstream component的ASPM L1,然后再使能downtown component的ASPM L1。Disable ASPM L1的时候是相反的操作。这点在link control寄存器的ASPM control字段也有说明。

mpls ldp 错误排查_ci_04

mpls ldp 错误排查_ci_05

3、PCIe协议对ASPM L1协商的规定

mpls ldp 错误排查_ASPM_06

  1. Downstream component必须积累有足够数量的credit才能发起ASPM L1 entry的初始化流程。
  2. 在进入low power link state前,Downstream component必须阻止发送端再从transaction layer发送TLP(包括completion)到data link layer
  3. Downstream component必须等到之前发送的最后一个TLP收到acknowledgement(retry buffer为空)。
  4. Downstream component 反复发送PM_Active_State_Request_L1 DLLP来进行ASPM协商。Downstream component发送PM_Active_State_Request_L1 DLLP的间隔不超过8个(8b/10b)或者32个(128b/130b)idle symbol times。
  5. Downstream component一直发送PM_Active_State_Request_L1 DLLP,直到收到Upstream component回复PM_Request_Ack DLLP或者PM_Active_State_Nak message。在等待Upstream component回复PM_Request_Ack DLLP期间,Downstream component不能发送TLP,可以正常接受Upstream component发送的TLP和DLLP,并回复FC updata DLLP。也就说Downstream component的Transaction Layer进入了inactive,但是data link layer还是active状态。
  6. Upstream component必须立刻响应,接受或者拒绝PM_Active_State_Request_L1请求。Upstream component不停发送PM_Request_Ack DLLP,直到detect 链路进入idle。

mpls ldp 错误排查_PCIe L1_07

mpls ldp 错误排查_ASPM_08

mpls ldp 错误排查_low power_09

mpls ldp 错误排查_mpls ldp 错误排查_10

  4、PCIe EP ASPM L1 entry机制

  1. 当Link的TX端是idle的(例如,client端没有transmit TLP并没有replay TLP pending),EP controller开启ASPM L1 entry timer开始计时,如果client端有TLP要发送,那么timer会被clear。
  2. 当ASPM L1 entry timer达到时间后(ASPM L1 Entry Timeout Delay Register可以设置,默认是750*16ns=12us),EP controller检查是否有足够的credit。
  3. EP controller block新的TLP发送,并且通过TX lane发送PM_Active_State_Request_L1 DLLP。
  4. EP controller持续发送PM_Active_State_Request_L1 DLLP直到收到upstream device的response。
  5. Upstream component必须立刻对EP controller发出的PM_Active_State_Request做出响应(接收或者拒绝)。
  6. 如果Upstream component拒绝EP controller发出的PM_Active_State_Request,则Upstream component发出PM_Active_State_Nak message(注意NAK是message),那么EP controller会abort掉ASPM L1 entry并且继续正常发送TLP。
  7. 如果Upstream component接受EP controller发出的PM_Active_State_Request,则Upstream component发出PM_Request_Ack DLLP(注意ACK是DLLP),然后EP controller会让自己的TX进入electrical idle并进入ASPM L1。
  8. Upstream component detect electrical idle后,让自己的TX进入electrical idle。

mpls ldp 错误排查_low power_11

5、PCIe EP ASPM L1 entry例子

(1)systemBIOS设置CPU支持ASPM L1

    设置完毕后,CPU对应Root Port的link cap就支持ASPM L1

mpls ldp 错误排查_low power_12

mpls ldp 错误排查_ci_13

 (2)设置CPU和EP两个PF的link ctrl为ASPM L1 Enabled

注意顺序:一定要先CPU,后EP的PF0/PF1

设置CPU端口的link ctrl为0x2,L1 Entry Enabled

setpci -s 0:1.0 0x50.b

00

setpci -s 0:1.0 0x50.b=0x2

setpci -s 0:1.0 0x50.b

02

mpls ldp 错误排查_ASPM_14

 设置EP芯片的两个PF的link ctrl为0x2,L1 Entry Enabled

setpci -s 1:0.0 0xd0.b

00

setpci -s 1:0.0 0xd0.b=0x2
setpci -s 1:0.0 0xd0.b

02

setpci -s 1:0.1 0xd0.b

00

setpci -s 1:0.1 0xd0.b=0x2

setpci -s 1:0.1 0xd0.b

02

mpls ldp 错误排查_ASPM_15

 

mpls ldp 错误排查_mpls ldp 错误排查_16

(3)等待链路进入idle状态,从串口查看芯片状态

从pcie_status_0 reg(0x7F00814004)的bit24-21为0100b,知道链路在L1状态了

mpls ldp 错误排查_mpls ldp 错误排查_17

mpls ldp 错误排查_ASPM_18

mpls ldp 错误排查_mpls ldp 错误排查_19

从lower power debug and ctrl reg(0x7F00900C88)的bit26-25为01b,知道是因为ASPM进入的L1。

mpls ldp 错误排查_ASPM_20

(6)退出ASPM L1的方法

只要host端访问一下EP,EP就可以退出ASPM L1进入L0。

mpls ldp 错误排查_PCIe L1_21