L1 ASPM默认是disabled。
Upstream Port启动ASPM L1 entry流程。
一种情况是当US port的RX和TX都处在L0s状态,并超过一定时间,US Port将会开始进入L1。
还有一种情况是,当不支持L0s时,US Port在L0并处于IDLE状态超过一定时间后,会开始进入L1。
有三种DLLP用于ASPM L1 Entry的协商过程:
PM_Active_State_Request_L1
PM_Request_Ack
PM_Active_State_Nak
下游设备开启与上游设备的L1 entry negotiation.
DS Port只有当以下条件满足了,才会接受L1 entry请求:
DS Port支持ASPM L1,并且已enabled;
没有TLP要发送;
没有Ack或Nak需要发送。
注意Software只有在上游设备enable ASPM L1的前提下才会enable下游设备的ASPM L1。
ASPM L1 negotiation规则:
1. 下游设备在收集到发送最大的FC包所需的最少credit之前,不能开始ASPM L1entry。
2. 在准备进入low power状态后,下游设备必须中止将任何包(包括completion)从Transaction层转移至Data Link层。
如果在进入L1的过程中,下游设备有Transaction层有TLP需要发送,下游设备首先得先进入L1,然后再进行从L1退出到L0的操作。
3. 下游设备必须等到上个TLP的Ack,如果有需要还得从retry buffer重新发送这个TLP。
4. 然后,下游设备通过发送PM_Active_State_Request_L1 DLLP来开始ASPM L1协商。
下游设备持续不断地发送PM_Active_State_Request_L1 DLLP,直到收到上游设备的回复,相邻DLLP之间有不超过4个symbol时间的idle(对于128B130B是16个symbol time)。
在发送PM_Active_State_Request_L1之间,下游设备也可以按协议要求发送其他的DLLP或者SKP OS,并且不受上面所提到的idle time的限制。
在等待上游设备回复的过程中,下游设备不能发送TLP包,但仍可以接收上游设备的TLP和DLLP,对于接收到的TLP,先储存起来,等到以后再返回response。
下游设备可以响应收到的DLLP,包括FC update DLLP。
5. 上游设备必须及时响应进入L1的请求,要么接受,要么拒绝。
Rejection L1 request的原则:
1. 上游端口应该尽快通过发送PM_Active_State_Nak给下游设备来拒绝L1 Request。一旦此Nak发出之后,上游设备允许发送任何TLP和DLLP。
2. 如果L1 Request被拒绝,一般建议下游设备及时将其发送端切换至L0s状态,如果条件满足的话。
3. 在收到L1 Request Rejectin之后,下游端口需要进入和退出L0s,或者等待10us,才能再次进行L1 request,这是为了避免当两次L1 Request离得太紧而产生混乱。所以上游端口也会通过时间来判断收到的L1 Request是否是新的request。