一、背景
在PCIe總線中,當一個發送端發送數據報文給接收端時,它需要保證接收端有足夠的緩沖區。為了能夠知道接收端還有多少可用的緩沖區,接收端需要通過DLLP (Data Link Layer Packet)隨時匯報可用的緩沖區。
PCIe總線使用的流控算法叫做基于信用的流量控制機制(Credit-based Mechanism)。接收端的可用緩沖數量使用信用積分來表示,接收端通過不斷的發送DLLP告知接收端VC buffer的信用數,當緩沖區用盡時發送端會停止發送TLP以防數據包丟棄和重發。
當出現信用不足現象,需要進一步分析時,可以通過下面手段來收集CPU側的信用值。
二、操作步驟
- 打開bios中的 EV DFX開關
重啟系統后進入bios,找到如下選項并enable。如下圖1所示;
Socket Socket Configuration
->IIO Configuration
->IIO DFX Configuration
->EV DFX Features

圖1
- 顯示BIOS的隱藏選項(如需要)
某些情況下bios設置界面可能沒有步驟1中的菜單,這個可能是bios setup隱藏了選項,這個時候需要使用SCELNX工具來使隱藏選項顯示出來,進入系統后執行命令:
./SCELNX_64 /i /ms DfxAdvanceDebug /qv 0x00
如下圖2所示

圖2
執行完命令后重啟系統,然后就可以在bios設置界面看到EV DFX Features選項。
- Log采集
使用lcpci-vt命令查看PCIE 設備,找到需要查詢信用的設備對應的root port,記錄BDF。
編輯pcie_debug.py腳本,把BDF號修改為實際的BDF。
執行pcie_debug.py,自動生成log。
三、信用分析
如下圖3所示,log記錄了各個請求的信用值,可以直接觀察CPU側的信用是否存在不足現象。
PH緩存存放Memory Writes和Messages請求的TLP 頭
PD緩存存放Memory Writes和Messages請求的TLP 數據;
NPH緩存存放Non-Posted請求的TLP 頭;
NPD緩存存放Non-Posted請求的TLP 數據;
CPLH緩存存放Read/Wirte Completions請求的TLP 頭;
CPLD緩存存放Read/Wirte Completions請求的TLP 數據。

圖3