PCIe link up bug 分析


Xilinx兩塊開發版PCIe link up時間相差很大,Virtex-6開發版PCIe link up時間超過60ms,而Virtex-7 PCIe link up時間只有~25ms.
 
分析過程:
1. 對比Virtex-6和Virtex-7兩塊開發板上電過程的LTSSM狀態機。
首先看一下,Virtex-6開發版的LTSSM狀態機,發現在多了一次Polling->Dectect的轉換過程。
 
再來看Virtex-7開發版的LTSSM狀態機,不同狀態之間的轉換符合PCIe Spec標准。
 
發現LTSSM狀態機的異常點之后,然后結合詳細的PCIe trace找到root cause.
 
2. 從Trace中看到,Upstream(Virtex-6)在Detect狀態檢查到RX存在之后,進入了Polling.Active狀態,但是,之后由於一直未收到從Downstream下發的TS1序列,於是,就進入了Polling.Compliance狀態. 此時,Upstream Lanes處於Electrical Idle。
 
3. 經過一段時間之后,Upstream Lanes看到EIOS之后,開始退出Polling.Compliance狀態, 進入Polling.Active狀態.
 
4. 接着,Downstream lanes進入Polling.Active狀態,然后開始發送TS1序列。
 
5. 經過一段時間后,Upstream也進入了Polling.Active狀態,然后開始發送TS1序列。
 
6. Upstream在Polling.Active狀態實現了Bit Lock和Symbol Lock, 就轉換進入到Polling.Configuration狀態,並開始發送TS2序列。
 
7. 但是,問題來了,Downstream在Polling.Active狀態未能成功實現了Bit Lock和Symbol Lock,在24ms
 timeout之后回到了Detect狀態。
 
8. 此時,Upstream處於Polling.Configuration狀態,在等待Downstream的TS2序列。由於Downstream已經回到Dectect狀態了,Upstream在48ms內沒有收到Downstream下發的TS2序列,也跟着返回Detect狀態。
 
9. Downstream回到Dectect狀態之后,就開始重新進行鏈路訓練,在重新鏈路訓練中,這次在Polling.Active狀態成功實現了Bit Lock和Symbol Lock, 然后進入Polling.Configuration狀態。最終成功實現PCIe鏈路訓練。
 
從上面的分析過程中,我們看到,第7/8步中有兩個timeout時間,分別是24ms和48ms,正是因為這兩個timeout的存在,造成了Virtex-6開發版link up時間超過60ms。
 
Root Cause:
最后發現root cause是由於英特爾處理器中的一個bug造成的。如Intel Errata中的描述,由於Rx端過載保護電路的存在,可能會導致某些Device異常進入Polling.Compliance, 最后導致Downstream和Upstream之間狀態出現偏差,引起Bit Lock/Symbol Lock錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM