PCIe链路训练基础(二)一文搞懂Polling和Configuration

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

  1. 在本例中只有一个link,所以,DP口首先发送TS1s,该TS1s中Link Number为N,所有的Lane Numbers都被PAD。
  2. 在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

  1. DP开始发送TS1,在TS1中,每条lane的Link Number相同,lane number从左至右分别对应0,1,2,3.
  2. UP收到TS1s后,需要确认每条lane对应的Lane Number是否一致,在本例中Lane Number是一致的,所以UP会回复相同的TS1s。如果lane的数量不一致,则下一步需要进行Link width调整,如果出现了Lane reversed,则要首先看UP是否支持Lane Reversal特性,如果不支持则看DP是否支持,下个例子会有详细说明。

Confirming Link and Lane Numbers

  1. 因为发送和接收的link/lane numbers都匹配,所以DP需要通过发送TS2来指示协商过程完成可以进入L0
  2. UP收到了TS2s后会再回复TS2s。
  3. 一旦任意端口在发送了16个TS2s和收到了8个TS2s后,就会发送logical idle并且进入L0

Link Configuration Example 2

       本例是一个有4条lane的DP,该DP支持1个X4,2个x2,4个x1,。

       Link Number Negotiation

  1. DP会为每条lane顺序分配不同的Link Number,起始值为N,并发送TS1s,因为此时DP是不知道下面连接的设备类型和结构,该过程是为了确定这个事情。

  1. UP会按照下图的方式返回TS1s,当DP收到返回的TS1s时,就能确认两件事情:a,所有的4条lane都处于可用的工作状态(因为可以返回TS1)b,有两个不同的UP,且每个UP都有2条lane

       Lane Number Negotiation

  1. DP首先发送TS1s,该TS1s包含了lane number,并且link也被分成了两组(一组link值为N,另一组link值为N+2),每组都有自己的lane number顺序(0,1)。
  2. 在本例中,左下的UP的lane顺序正确,而右下的UP的lane呈现lane reversal状态。对于左下UP来说直接回复对应的TS1s即可;而右下的UP在收到DP的TS1s后意识到出现了Lane Reversal情况
  3. 如果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

  1. 假设DP收到了和自己能够匹配(Link num和Lane num一致)的TS1s,则发送TS2s,表示已经准备好进入L0状态。
  2. UP接收到TS2s后,没有问题就会回复TS2s。
  3. 两边如果都经历了16个TS2s的发送和8个TS2s的接收后,切换状态到L0。

Link Configuration Example 3:Failed Lane

       假设有其中一个lane无法正常工作,如下图中的lane2。此处所说的无法正常工作不是物理性的损坏,而是无法检测到接收器,也就无法认为该lane在Link中。或者即使说lane2连接了,但是也是无法工作的状态。

       Link Number Negotiation

  1. 即使Lane2的在UP的接收端出现了故障,DP还是依然要根据流程进入Configuration状态。该例子中,DP会在所有的lane上用Link number N发送TS1s
  2. DP的Lan0,1,3都收到了来自UP的non-PAD Link number TS1s,只有lane1未收到正确的TS1s。

  1. DP会一直等待接收来自Lane2的TS1s,直到timeout,DP就会认为目前的情况只有x2可用,然后给lane0和lane1发送带lane number的TS1s,lane2和3则回到发送PAD Link和Lane number的阶段。
  2. 当UP收到了带有lane信息(0,1)的TS1s后,然后又看到lane3回到了接收PAD TS1s状态,就会回复能正常工作的通道(0,1)的TS1s

       Confirming Link and Lane Numbers

  1. DP 在接收到UP从lane0/1回复的TS1s后,就会发送TS2然后准备进入L0状态。
  2. 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。

  • 26
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中的polling是一种轮询机制,用于等待某个特定条件的满足。它可以在一定的时间间隔内反复检查条件,直到条件满足或超时。使用polling可以避免使用sleep进行等待,提高程序的效率。有几个常见的用法: 1. 等待文件存在:可以使用polling.poll函数等待文件存在,每隔一定时间检查文件是否存在,直到文件存在或超时。 示例代码: ``` file_handle = polling.poll( lambda: open('/tmp/myfile.txt'), ignore_exceptions=(IOError,), timeout=3, step=0.1 ) ``` 2. 轮询selenium webdriver元素:可以使用polling.poll函数等待元素在selenium webdriver中可见,每隔一定时间检查元素是否可见,直到元素可见或超时。 示例代码: ``` search_box = polling.poll( lambda: driver.find_element_by_id('search'), step=0.5, timeout=7 ) ``` 3. 使用自定义条件回调函数:可以使用polling.poll函数根据自定义的回调函数来检查条件是否满足,每隔一定时间执行回调函数,直到条件满足或超时。 示例代码: ``` def is_correct_response(response): return response == 'success' polling.poll( lambda: requests.put('http://mysite.com/api/user', data={'username': 'Jill'}), check_success=is_correct_response, step=1, timeout=10 ) ``` 这些是polling的一些常见用法,它可以帮助我们在需要等待某个条件满足的情况下编写更高效的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python polling轮询函数](https://blog.csdn.net/rhx_qiuzhi/article/details/124740460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值