上一章节讨论了PCIe拓扑结构中事务对排序的要求。这些规则是继承自 PCI 的,它们许多都受到“生产者/消费者(Producer/Consumer)”程序设计模型的推动,因此在上一章描述了这个模型的机制原理。原始的规则中还考虑了那些必须要避免的死锁情况。
本章将会描述 Data Link Layer Packet(DLLP,数据链路层包)。我们将会描述其用途、格式以及DLLP数据包类型的定义,也将会对其相关字段的细节进行描述介绍。DLLP可以被用来支持 Ack/Nak 协议、电源管理、流控机制,还可用来实现一些厂商自定义的用途。
下一章将描述数据链路层的关键特性之一:基于硬件的链路间 TLP 自动可靠传输机制。Ack DLLP 用于确认一次正常 TLP 的接收,而 Nak DLLP 则表示一次 TLP 传输错误。我们将讨论没有侦测到 TLP 和 DLLP 错误时的正常传输行为的规则,也会讨论 TLP 或者 DLLP 错误发生时的错误恢复机制。
数据链路层可以被认为是更低逻辑层次上的链路协议管理者。数据链路层的主要职责是确保 TLP 在设备之间的完整传输,并且也参与到 TLP 流量控制、链路初始化、功耗管理以及为其上层的事务层和下层的物理层之间传递信息等功能。数据链路层通过与其他设备之间交换 DLLP(Data Link Layer Packet),数据链路层包,来完成上述功能。DLLP 会在各个设备的数据链路层之间传输通信,图 9-1 展示了 DLLP 在设备间的传输路径。
图 9-1 数据链路层发送 DLLP 示意图
DLLP 的数据包格式非常简单,算上组帧字节,整个 DLLP 的长度固定为 8 字节。与 TLP 不同,DLLP 不携带任何目的地址或者路由信息,因为他们只用于本地相邻设备之间的直接通信,无需进行路由。同时,DLLP 对于上层的事务层也是不可见的,因为他们不会参与设备事务层间的信息交换。
当接收方收到 DLLP 之后,会根据以下规则进行处理:
- DLLP 会在收到后被立即处理,无需受到 TLP 的流量控制机制的管理
- DLLP 会受到物理层和数据链路层的两次错误检测。链路层会重新计算包的 CRC 校验结果,并将其和包自身携带的 16 比特 CRC 结果进行比较。校验失败的 DLLP 会被丢弃。那么问题来了:链路如何从 DLLP 校验错误中恢复?答案是后续的 DLLP 仍然会周期性地到达,接下来接收的同类 DLLP 会更新缺失的信息。
- DLLP 与 TLP 不同,没有接收确认 Ack 机制,取而代之的是协议定义的超时机制。超时机制负责从 DLLP 接收错误中恢复。
- 校验通过的 DLLP 将根据其类型,传输给相应的内部逻辑,完成如下功能
- 通知 TLP Ack/Nak 状态的更新
- 通知流量控制机制中的可用缓存大小信息的更新
- 电源管理设置
- 厂商自定义信息管理
发送方在数据链路层生成 DLLP 包,然后将其传输给物理层。如果是 Gen1/Gen2 模式,使用 8b/10b 编码,那么会在 DLLP 的开头和结尾都加上组帧符号。在 Gen3 模式中,2字节的 SDP 令牌会被添加到 DLLP 前部,但是不会在结尾处添加 END 符号。图 9-2 描述了一个 Gen1/Gen2 模式的 DLLP 发送过程,可以看到在 DLLP 的内容前后加上了组帧符号。
图 9-2 原生数据链路层数据包格式
DLLP 包固定为 8 字节大小,无论是在 8b/10b 或者128b/130b 编码方式下,其包括以下组成部分:
- 1DW(4byte)的 DLLP 核心字段,包括 1 字节的 DLLP 类型与另外 3 字节属性字段。属性字段含义随 DLLP 类型而变化
- 2 字节 CRC 字段,基于 DLLP 核心字段内容计算。重要的一点是,此处的 CRC 和 TLP 的 LCRC 字段不同。DLLP CRC 仅有 16 比特,并且其计算方式也与 32 比特的 LCRC 不同。2 字节 CRC 字段附于 4 字节核心字段之后,共计 6 字节内容会被传递给物理层。
- 使用 8b/10b 编码时,一个 SDP (Start of DLLP)和 END (End Good) 控制符号会被添加到包的开头与结尾。自然地,这些字节会在发送前编码为 10-bit 符号。
- Gen3 使用 128b/130b 编码时, 2 字节 SDP 令牌会被添加到 DLLP 包之前构成 8 字节的数据包,此时不会添加 END 符号或者令牌。
注意,DLLP 永远不会携带数据载荷,信息全部位于 4 字节核心字段内。
DLLP 包共有 4 种类型,分别用于 Ack/Nak、电源管理、流控以及厂商自定义功能。其中部分类型还有一些变体。表 9-1 总结了这些 DLLP 类型及其变体的编码方式。
表 9-1 DLLP 类型
用于通知对端设备,确认接收(Ack)或者接收错误(Nak)的 DLLP 报文格式如图 9-3 所示。 Ack/Nak DLLP 字段用于表示对于 TLP 报文的 Ack 或者 Nak。关于 Ack/Nak 协议的更多细节,可以参照 Chapter 10, ʺAck/Nak Protocolʺ ,此处不再展开描述相关的字段含义。
表 9-2 Ack/Nak DLLP 字段
图 9-4 是电源管理相关的 DLLP 包格式信息,表 9-3 是它的字段描述信息。关于 电源管理的更多细节,可以参照 Chapter 16, ʺPower Managementʺ ,此处不再展开描述相关的字段含义。
图 9-4 电源管理相关的 DLLP 包格式信息,表 9-3 字段描述信息
和其他许多串行传输协议类似, PCIe 通过基于 credit 的流量控制机制提高了传输的效率。相关的话题在 Chapter 6, ʺFlow Controlʺ 中进行了讨论。DLLP 在流量控制机制中用于通信双方 credit 信息的交换。有多种不同的 DLLP 包用于流量控制机制的 credit 信息初始化,以及另一类用于传输过程中 credit 更新的 DLLP,当接收方缓存恢复时,将用这类 DLLP 通知对端 credit 信息的更新。共有两种流控初始化 DLLP,分别为 InitFC1 和 InitFC2,以及一种流控更新 DLLP,称为 UpdateFC。
图 9-5 是流控相关的 DLLP 包格式信息,表 9-4 是它的字段描述信息。
图 9-5 流控相关的 DLLP 包格式信息,表 9-4 字段描述信息。
最后一类 DLLP 用于厂商定制化用途。因此,协议只定义了此类 DLLP 的类型字段值(0011 0000b),剩下的属性字段的含义留给厂商自行定义。
图 9-5 厂商自定义 DLLP 包格式信息
原文: Mindshare
译者: LJGibbs
校对:
欢迎参与 《Mindshare PCI Express Technology 3.0 一书的中文翻译计划》
https://gitee.com/ljgibbs/chinese-translation-of-pci-express-technology