一、背景
在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