Detect:使用电气的方法检测对端是否有设备存在。
Polling:
Bit Lock
Symbol Lock or Block Lock
Lane极性反转
获知可用的速率,但不做速率切换
Detect状态
Detect.Quiet
发送端进入Electrical Idle状态,当检测到接受端有lane处于Electrical Idle状态或者12ms的timeout,状态机会由该状态跳转到Detect.Active状态。
Detect.Active
在该状态下,发送端会产生一个0~3.6V的共模电压,通过检测共模电压的上升率,来判断是否有设备与之对接,如果超过12ms还未检测到有任何设备存在就退回到Detect.Quiet状态,如果检测到有设备就进入Polling状态
Polling状态
在进入该状态后,首先link均处于electrical idle状态,在这个状态下会通过交换TS1s和TS2s来建立bit和symbol lock以及极性问题。具体过程是在Polling.Active状态下,两边互相发送1024个带有PAD(link num和lane num未知)的TS1序列,当收到8个TS1或者TS2(因为存在两边状态机不一致的情况,有可能对端会提前)进入Polling.Configuration状态,在收到8个TS1或者TS2的过程中,先完成bit/Symbol Lock。当状态机进入Polling.Configuration后开始发送16个带PAD信息的TS2,当接收到8个TS2时,进入configuration状态,在Polling Configuration状态下依靠接收到的8个TS2来完成需要的极性反转(Polarity inversion)功能。
综上所述,在Polling状态下,链路通过互相交换被PAD的TS1和TS2来完成bit/symbol lock以及极性反转(Polarity inversion),主要的两个状态Polling.Active和Polling.Configuration。
如下图所示,在1.0的Spec时期,Polling状态还有一个Polling.Speed状态,原本是为了给更高速率预留的,想尽快在Polling状态下切换到更高速率,但是在实际使用中,考虑到需要动态变化速率来达到功耗管理的目的,如果放在Polling状态就需要将link num以及lane num都被抹掉,也增加了延迟,所以将速率切换移到了Recovery状态。
Configuration状态
该状态的主要目标是识别port的连接方式以及Lane number的分配。例如可用的8lanes但是只有2lanes处于真正可用状态(active),又或者Lanes可以被分为2个x4links。不同于其他状态,Ports在面对upstream或者downstream时会有不同的角色。在该状态下,Downstream Port是一个“leader”角色,而Upstream Port是一个“follower”角色。Downstream Port给Upstream Port指定link和lane num,Upstream Port只是简单的回复相同的值以达到确认的目的,有冲突的情况除外,link/lane numbers会包含在TS1s的交互过程中,如下图所示:
下面举三个例子来理解一下正常的链路训练过程
Link Configuration Example 1
如下图所示,DP和UP可以使用的lane sizes是x4,x2,x1。Lane number的分配是设备内部固定的,必须从0开始分配。正常来说顺序都是一一对应的,但是也不排除会有相反的顺序。
Link Number Negotiation
- 在本例中只有一个link,所以,DP口首先发送TS1s,该TS1s中Link Number为N,所有的Lane Numbers都被PAD。
- 在Configuration state下,UP也会同时发送TS1s,但是在TS1s中,Link Number和Lane Number都被PAD。如果UP接收到了DP发来的TS1s,会提取其中的Link Number,UP就会转而回复带有Link Number的TS1s,在本例中,会有4个lane收到DP发来的相同Link number的TS1s,UP就会用4条lane回复包含相同link number的TS1s
Lane Number Negotiation
- DP开始发送TS1,在TS1中,每条lane的Link Number相同,lane number从左至右分别对应0,1,2,3.
- UP收到TS1s后,需要确认每条lane对应的Lane Number是否一致,在本例中Lane Number是一致的,所以UP会回复相同的TS1s。如果lane的数量不一致,则下一步需要进行Link width调整,如果出现了Lane reversed,则要首先看UP是否支持Lane Reversal特性,如果不支持则看DP是否支持,下个例子会有详细说明。
Confirming Link and Lane Numbers
- 因为发送和接收的link/lane numbers都匹配,所以DP需要通过发送TS2来指示协商过程完成可以进入L0
- UP收到了TS2s后会再回复TS2s。
- 一旦任意端口在发送了16个TS2s和收到了8个TS2s后,就会发送logical idle并且进入L0
Link Configuration Example 2
本例是一个有4条lane的DP,该DP支持1个X4,2个x2,4个x1,。
Link Number Negotiation
- DP会为每条lane顺序分配不同的Link Number,起始值为N,并发送TS1s,因为此时DP是不知道下面连接的设备类型和结构,该过程是为了确定这个事情。
- UP会按照下图的方式返回TS1s,当DP收到返回的TS1s时,就能确认两件事情:a,所有的4条lane都处于可用的工作状态(因为可以返回TS1)b,有两个不同的UP,且每个UP都有2条lane
Lane Number Negotiation
- DP首先发送TS1s,该TS1s包含了lane number,并且link也被分成了两组(一组link值为N,另一组link值为N+2),每组都有自己的lane number顺序(0,1)。
- 在本例中,左下的UP的lane顺序正确,而右下的UP的lane呈现lane reversal状态。对于左下UP来说直接回复对应的TS1s即可;而右下的UP在收到DP的TS1s后意识到出现了Lane Reversal情况
- 如果UP本身支持Lane Reversal特性,它就会主动调整内部的lane顺序,调整完成后回复和DP一致的TS1s,完成UP端的Lane Reversal。如果UP不能支持Lane Reversal,则直接回复自己的TS1s(此例对应的顺序应该是1,0,),DP在收到后则会查看自己是否支持Lane Reversal特性,如果支持就在发送TS2s的时候调整,如果不支持就GG了。
Confirming Link and Lane Numbers
- 假设DP收到了和自己能够匹配(Link num和Lane num一致)的TS1s,则发送TS2s,表示已经准备好进入L0状态。
- UP接收到TS2s后,没有问题就会回复TS2s。
- 两边如果都经历了16个TS2s的发送和8个TS2s的接收后,切换状态到L0。
Link Configuration Example 3:Failed Lane
假设有其中一个lane无法正常工作,如下图中的lane2。此处所说的无法正常工作不是物理性的损坏,而是无法检测到接收器,也就无法认为该lane在Link中。或者即使说lane2连接了,但是也是无法工作的状态。
Link Number Negotiation
- 即使Lane2的在UP的接收端出现了故障,DP还是依然要根据流程进入Configuration状态。该例子中,DP会在所有的lane上用Link number N发送TS1s
- DP的Lan0,1,3都收到了来自UP的non-PAD Link number TS1s,只有lane1未收到正确的TS1s。
- DP会一直等待接收来自Lane2的TS1s,直到timeout,DP就会认为目前的情况只有x2可用,然后给lane0和lane1发送带lane number的TS1s,lane2和3则回到发送PAD Link和Lane number的阶段。
- 当UP收到了带有lane信息(0,1)的TS1s后,然后又看到lane3回到了接收PAD TS1s状态,就会回复能正常工作的通道(0,1)的TS1s
Confirming Link and Lane Numbers
- DP 在接收到UP从lane0/1回复的TS1s后,就会发送TS2然后准备进入L0状态。
- UP收到DP从lane0/1发送的TS2s后,回复TS2s进行确认,一旦两边都完成了16个TS2s的发送和8个TS2s的接收后就会进入L0模式。
完整的Configuration状态机
如下图所示:
L0 State
L0状态可以互相交换Logical Idle,TLP以及DLLP等。退出到Recovery State主要有三种情况:1)改变link速率/位宽;2)有一方的partner进入Recovery;3)Electrical Idle。