1.3 地址空间与事务路由
1.3.1 两种类型的本地链路流量
本地流量出现在一台设备的发送接口和其相邻设备的接收接口之间,目的是管理链路。这种流量从不会被转发或进行流控制;一旦发送,就必须接受。本地流量又可以仅有分为在两台设备物理层之间交换的有序集和在两台设备数据链路层之间交换的数据链路层数据包(DLLP)。
有序集:有序集由发送器的物理层发送至相应接收器的物理层,用于发起链路定向、补偿时钟容差,或转换链路至电气空闲状态和脱离电气空闲状态。如下表所示,有 5 种类型的有序集。
有序集的类型 | 符号 | 用途 |
快速定向序列 (FTS) | COM 3FTS | 在离开 L0s 电源状态时,快速同步比特流定向 |
定向序列1 (TS1) | COM Lane ID 14more | 用于链路定向,用来在启动时校正和同步输入比特流、传送复位、其他功能 |
定向序列2 (TS2) | COM Lane ID 14more | 参见 TS1 |
电气空闲 (IDLE) | COM 3IDL | 指出链路应该进入低功耗状态(L0s、L1、L2) |
跳过 (SKIP) | COM 3 SKP | 定期插入,用于补偿时钟容差 |
每类有序集由物理层内创建的 10 比特(K)符号构成。这些符号有一个通用名以及一个字母数字代码,用来定义组成它们的 10 比特 1、0 模式。例如,SKIP 符号的 10 比特数值表示为 K28.0。
下图展示了有序集的发送过程。有序集的大小是固定的,由 4 或 16 个字符组成。另外,要求接收器像发送它们那样使用它们。COM 控制符号(K28.5)可以用来表示有序集的开始。
数据链路层数据包:数据链路层数据包源于数据链路层而不是物理层,但也可以用于链路管理。DLLP 的主要功能是为链路电源管理、TLP 流控制和通过链路成功传送 TLP 的确认提供方便。
DLLP | 用途 |
确认(Ack) | 接收器的数据链路层发送 Ack,表示收到的 TLP 中没有 CRC 错误或其它错误。发送器在收到 Ack 之前,一直保留 TLP 的副本 |
否认(Nak) | 接收器的数据链路层发送 Nak,表示收到的 TLP 中有 CRC 错误或其它错误。所有保留在发送器重放缓冲区中的 TLP 必须按照原来的顺序重发 |
PM_Enter_L1; PM_Enter_L23 | 按照软件配置空间访问引起设备电源管理事件,下游设备要求进入链路 L1 或L2-3状态 |
PM_Active_State_Req_L1 | 下游设备自主请求 L1 活动状态 |
PM_Request_Ack | 上游设备确认转换到了 L1 状态 |
Vendo-Specific DLLP | 保留,为厂商专用 |
DLLPInitFC1-P InitFC1-NP InitFC1-Cpl | 裁决报告(P),非报告(NP)或完成(cpl)流控制信用的流控制初始化类型 1 DLLP |
InitFC2-P InitFC2-NP InitFC2-Cpl | 确认 InitFC1 的报告(P),非报告(NP)或完成(cpl)流控制信用的裁决情况的流控制初始化类型 2 DLLP |
UpdateFC-P UpdateFC-NP UpdateFC-Cpl | 裁决报告(P),非报告(NP)或完成(cpl)流控制信用的流控制信用更新 DLLP |
与有序集不同,DLLP 总是携带 16bit 的 CRC,接收器对它进行校验之后才能进行必须的操作。如果 DLLP 接收器检测到一个错误,就丢弃该 DLLP。即使没有确认 DLLP,规范内置的超时机制也能够恢复由于 CRC 错误而丢弃的 DLLP。
1.3.2 处理层数据包路由基础
为了降低请求-完成延迟,消息和某些写事务是报告类型(posted)的,指的是发送写请求时,只要将请求发送离开出端口,从请求者的角度看事务就完成了,传送的责任现在就成了下一台设备的问题。在多级拓扑结构中,这样做的优点时比等待整个请求-完成发送的速度要快,但同所有报告方案一样,事务何时在最终接收者那里成功完成存在不确定性。
请求 | 处理请求的方法 |
存储器写 | 所有存储器写请求都是报告事务,没有预计或发送完成数据包 |
存储器读 锁定存储器读 | 所有存储器读请求时非报告事务,完成者将返回一个带数据的完成来携带请求的数据并报告存储器读操作的情况 |
IO 写 | 所有 IO 写请求时非报告事务,完成者将返回没有数据的完成来报告 IO 写操作的情况 |
IO 读 | 所有 IO 读请求时非报告事务,完成者将返回一个带数据的完成来携带请求的数据报告 IO 读操作的情况 |
配置写类型 0 或类型 1 | 所有配置写请求时非报告事务,完成者将返回没有数据的完成来报告配置空间写操作的情况 |
配置读类型 0 或类型 1 | 所有配置读请求时非报告事务,完成者将返回一个带数据的完成来携带请求的数据并报告读操作的情况 |
消息 带数据的消息 | 尽管路由方法不同,但处理所有消息事务的方式与处理存储器写的方式相同,因为消息写事务也被认为时报告请求 |
TLP 路由的 3 种方法:所有 TLP 变体,都可以利用 3 种可能的方案来路由: 地址路由、ID 路由和隐式路由。下表给出了 TLP 的头类型变体和每种变体使用的路由方法。
TLP 的类型 | 使用的路由方法 |
Mrd、MRdLk、MWr | 地址路由 |
IORd、IOWr | 地址路由 |
CfgRd0/1、CfgWr0/1 | ID 路由 |
Msg、MsgD | 地址路由、ID 路由或隐式路由 |
Cpl、CplD | ID 路由 |
每个处理层数据包中含有 3 或 4 个双字的头。3DW 或 4DW 的头含有两个字段:类型(type)和格式(Fmt),它们定义头剩余部分的格式,以及整个 TLP 在 PCIe 拓扑结构中的设备之间传输时用来路由它们的方法。
使用 TLP 的头信息:当 TLP 到达入端口时,首先在接收器的物理层和数据链路层检查错误。假设没有错误,则执行对 TLP 的路由,基本步骤包括:①检查 TLP 头第一个双字中的类型和格式字段,确定该数据包剩余部分的大小和格式。②根据与该数据包有关的陆哟方法,设备将确定它是否为预期的接收者。如果是,它将接收该 TLP。如果它不是接收者,并且时一台多端口设备,则它将转发该 TLP 至合适的出端口-遵守这个出端口的顺序及流控制规则。③如果该设备就不是预期的接收者,也不是接收者路径上的一台设备,则一半把它作为不支持的请求而拒绝该数据包。
下表总结了 TLP 头类型/格式字段使用的编码。这两个字段一起使用可以指出 TLP 的格式以及路由至接收器的方法。
TLP | FMT[1:0] | TYPE[4:0] |
MRd | 00-3DW,没有数据 01-4DW,没有数据 | 0 0000 |
MRdLk | 00-3DW,没有数据 01-4DW,没有数据 | 0 0001 |
MWr | 10-3DW,有数据 11-4DW,有数据 | 0 0000 |
IORd | 00-3DW,没有数据 | 0 0010 |
IOWr | 10-3DW,有数据 | 0 0010 |
CfgRd0 | 00-3DW,没有数据 | 0 0100 |
CfgWr0 | 10-3DW,有数据 | 0 0100 |
CfgRd1 | 00-3DW,没有数据 | 0 0101 |
CfgWr1 | 10-3DW,有数据 | 0 0101 |
Msg | 01-4DW,没有数据 | 10RRR |
MsgD | 11-4DW,有数据 | 10RRR |
Cpl | 00-3DW,没有数据 | 0 1010 |
CplD | 10-3DW,有数据 | 0 1010 |
CplLk | 00-3DW,没有数据 | 0 1011 |
CplDLk | 00-3DW,有数据 | 0 1011 |
1.3.3 应用路由机制
地址路由用于传送数据至存储器、存储器映射的 IO 或 IO 单元,或者由存储器、存储器映射的 IO 或 IO 单元传送数据。存储器事务请求可能使用 3DW TLP 头格式来携带 32 比特地址,或用 4DW TLP 头格式来携带 64 比特地址。IO 事务请求限定使用 3DW TLP 头格式来携带 32 比特地址,且目标只能是传统设备。
ID 路由以 PCIe 拓扑结构中的某一设备功能的逻辑位置(总线号、设备号、功能号)为基础。ID 路由也可以用来路由完成或消息。
一个系统中最多有 256 条总线/链路,包括由桥建立的到其它 PCI 兼容协议的总线;每条总线/链路最多支持 32 台设备;每个设备最多有 8 种内部功能。
只有消息可以使用隐式路由, PCIe 协议取消了许多边带信号,需要有替代的方法来通知主机系统什么时候需要对设备中断、错误、电源管理等进行服务。目前定义的消息组包括:电源管理、INTx 传统中断信号、错误信令、锁定的事务支持、热插拔信号、供应商专用信息、插槽电源限制消息。