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狀態。
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錯誤。