PCIe Link training时width是如何协商的?
PCIe链路训练中的宽度协商是一个自动、硬件主导的过程,发生在设备上电或复位后,目的是在两个连接的对等设备(通常是Root Complex和Endpoint)之间建立物理层连接。宽度协商的目标是确定双方都能可靠支持的最高有效通道数量。
链路训练状态机 (LTSSM) 与宽度协商
宽度协商主要发生在LTSSM的两个阶段:
-
Polling 状态:
- 设备开始在所有可能的通道上发送TS1 (Training Sequence 1) 有序集。
- 发送的TS1中包含一个非常重要的字段:Link Num (LN)。
- 发送方在TS1的LN字段中宣告自己支持的最大通道数。例如,一个x8设备在初始TS1中会在所有8个通道的LN字段都设置为
0000(代表x1协商起点) 或更常见的策略是直接宣告自己的能力(但标准允许从x1开始)。
- 发送方在TS1的LN字段中宣告自己支持的最大通道数。例如,一个x8设备在初始TS1中会在所有8个通道的LN字段都设置为
- 接收方同时监听所有通道上的信号:
- 检测到有效的TS1序列,表明通道物理连接存在且信号基本可识别。
- 接收方会检查TS1中的LN字段,得知发送方支持的宽度信息。
- 接收方自身也知道自己支持的最大宽度。
-
Configuration 状态:
- 这是宽度协商实际达成一致的关键阶段。
- 设备继续交换TS1/TS2序列。
- 双方基于在Polling阶段了解到的对方能力和自身能力,开始进行Lane数量协商:
- 每个设备会根据自己检测到的对方最大支持宽度和自己支持的最大宽度,取最小值作为目标宽度。
- 例如:一个RC支持x16,一个EP支持x8。RC在Polling阶段检测到EP只在8个通道上发来有效TS1(或TS1中LN表明最大x8),就知道对方是x8设备。EP检测到RC在16个通道发来TS1(或TS1中LN表明最大x16),就知道对方是x16设备。双方各自计算:
min(16, 8) = 8,因此目标宽度是x8。
- 协商过程还涉及:
- Lane Reversal (通道反转): 协商是否需要翻转通道顺序(例如,设备A的TX Lane 0连接到设备B的RX Lane 7)。通过TS1/TS2中的特定字段(如Symbol 5的比特4)来协商和确认。
- Polarity Inversion (极性反转): 协商是否需要反转差分信号的极性(解决PCB布线时P/N反接的问题)。通过TS1/TS2中的特定字段(如Symbol 5的比特5)来协商和确认。
- 在Configuration.Substates (如Configuration.Linkwidth.Start/Accept/Complete) 中:
- 发起方(通常是下游设备EP)会通过TS1提议一个宽度(在LN字段中设置)。
- 响应方(通常是上游设备RC)检查提议的宽度是否在自己可接受的范围内(小于等于双方各自计算出的最小值)。如果接受,它会在回复的TS1中设置相同的LN值。
- 双方需要在所有目标通道上确认相同的LN值。
- 未被选中的通道会被禁用(进入电气空闲状态)。
- 协商成功后,双方进入Configuration.Idle状态,然后进入L0状态(正常工作状态),链路将以协商确定的宽度运行。
影响宽度协商结果的关键因素
-
设备本身的能力 (Fundamental Capability):
- 最大支持宽度 (Max Width Supported): 这是最根本的限制因素。一个设计为x4的设备永远无法协商出x8的链路。协商结果不能超过双方设备最大支持宽度的最小值。例如,RC最大x16,EP最大x4,最终只能是x4。
-
物理层信号完整性 (Physical Layer Signal Integrity):
- 通道质量差: 这是导致链路无法达到设备标称最大宽度的最常见原因。原因包括:
- PCB走线过长、过细、阻抗不匹配、串扰过大。
- 连接器(插槽、金手指)接触不良、污染、氧化、磨损。
- 参考时钟抖动过大或质量差。
- 电源噪声干扰。
- 影响机制: 在Polling状态,如果某个通道的信号质量太差(误码率高、眼图张开度不足),接收端可能无法正确解码该通道上的TS1序列。该通道会被接收端标记为“未检测到有效信号”或“训练失败”。即使设备物理上连接了16个通道,如果只有8个通道能稳定识别TS1,那么最终协商的宽度可能只有x8或更低。物理层问题可能导致链路“降速又降宽”。
- 通道质量差: 这是导致链路无法达到设备标称最大宽度的最常见原因。原因包括:
-
链路训练参数与容错性 (Training Parameters & Tolerance):
- 接收端均衡器能力: 发送端的预加重/去加重设置和接收端的均衡器(CTLE, DFE)需要协同工作来补偿通道损耗。如果接收端均衡器无法有效补偿特定通道的损耗,可能导致该通道训练失败。
- 信号检测阈值: 接收端检测有效信号的电平和时间窗口设置。过于宽松可能导致误判有问题的通道,过于严格可能导致好的通道被忽略。
- 训练序列错误容忍度: 在Polling和Configuration阶段允许的TS1/TS2错误数量。如果某个通道错误率过高,超过了容忍度,该通道会被禁用。
-
固件/BIOS 配置 (Firmware/BIOS Settings):
- 主板BIOS或设备固件有时会提供选项来强制限制PCIe链路的运行宽度(即使物理连接和设备能力支持更高)。例如,出于稳定性、调试或特定兼容性考虑,BIOS可能强制将x16插槽配置为运行在x8或x4模式。这会覆盖硬件自动协商的结果。
-
协议要求与错误恢复 (Protocol Requirements & Error Recovery):
- Link Equalization: 虽然主要协商速率,但均衡失败也可能间接影响宽度稳定性(如果某些通道均衡不达标)。
- 错误恢复机制: 如果链路在L0状态(正常工作状态)下频繁发生严重错误,LTSSM可能会触发链路重训练(Recovery状态)。在重训练过程中,如果问题持续存在,协商逻辑可能会尝试降低宽度(或速率)来恢复一个更稳定的连接。这属于运行时的动态调整。
-
通道映射问题 (Lane Mapping Issues):
- 虽然Lane Reversal和Polarity Inversion是协商的一部分,但如果实现有缺陷或连接极其混乱(超出了标准允许的Reversal范围),可能导致某些通道无法被正确识别和纳入有效宽度。
总结
- PCIe链路宽度协商是一个硬件自动协商的过程,核心发生在Polling和Configuration状态。
- 协商依据是双方设备各自检测到的对方最大支持宽度和自身最大支持宽度,取最小值。
- 影响结果的最关键因素是:
- 设备本身的最大物理通道数限制。
- 物理层信号完整性: 差的信号质量会导致通道训练失败,从而降低有效宽度。
- 固件/BIOS设置: 可强制限制运行宽度。
- 链路训练参数的容错性。
- 协议层面的错误恢复机制可能导致动态降宽。
- 协商成功的标志是双方在Configuration状态下,在所有选定的有效通道上确认了相同的Link Num值,并完成了Lane Reversal和Polarity Inversion的协商。
排查宽度协商问题(如链路达不到标称宽度)时,应优先检查物理层信号质量和BIOS设置。 使用示波器进行眼图测试和协议分析仪捕获LTSSM状态及TS1/TS2序列是常用的调试手段。
本文来自博客园,作者:闹闹爸爸,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/18946244

浙公网安备 33010602011771号