内部和旁路模式 - 5.0 简体中文

QDMA Subsystem for PCI Express 产品指南 (PG302)

Document ID
PG302
Release Date
2023-05-16
Version
5.0 简体中文

QDMA Subsystem for PCIe 中的每个队列均可在两种 H2C 串流模式下进行编程:内部模式和旁路模式。在队列上下文中即可指定模式。H2C 串流引擎已知当前正在处理的描述符对应的是内部模式下的队列还是旁路模式下的队列。

下图显示了内部模式和旁路模式的流程。

图 1. H2C 内部模式流程
图 2. H2C 旁路模式流程

对于内部模式下的队列,从主机提取描述符后,会将其直接馈送给 H2C 串流引擎以供处理。在此情况下,数据包不得跨多个描述符。因此,对于内部模式下的队列,每个描述符在 QDMA H2C AXI4‑Stream 输出上都仅生成一个 AXI4‑Stream 包。如果此包存在于主机存储器中的非连续空间内,那么必须以多个描述符来对其进行定义,这就要求在旁路模式下对此队列进行编程。

在旁路模式下,从主机提取描述符后,会使用 QDMA 旁路输出端口将其直接发送给用户逻辑。QDMA 不会对这些描述符进行任何解析。用户逻辑可以存储这些描述符,然后使用 QDMA H2C 串流描述符旁路输入接口将所需信息从这些描述符发送回 QDMA。QDMA 会使用此信息来构建描述符,然后将其馈送给 H2C 串流引擎以供处理。

在软件上下文中启用 fcrd_en 时,DMA 将等待用户应用提供信用值,即上图中的“信用值返回”。如果 fcrd_en 未置位,那么 DMA 会使用指针更新、提取描述符并发出描述符。用户应用不应传入信用值。在此情况下,上图中的“信用值返回”并不适用。

以下是使用旁路模式的优点:

  • 用户逻辑可采用定制描述符格式。原因是 QDMA Subsystem for PCIe 不会对旁路模式下队列的描述符进行解析。在 H2C 串流旁路输入接口上,用户逻辑会对这些描述符进行解析,并提供 QDMA 所需的信息。
  • 即时数据可从软件传递至用户逻辑,无需 DMA 操作。
  • 用户逻辑准备好灌入所有数据时,即可通过将描述符发送至 QDMA 来执行流量管理。描述符可缓存在本地 RAM 中。
  • 执行地址转换。

使用旁路模式时,对用户逻辑会施加一些要求。由于旁路模式允许包跨多个描述符,因此用户逻辑需向 QDMA 指明哪个描述符用于标记包起始 (SOP),哪个描述符用于标记包结束 (EOP)。在 QDMA H2C 串流旁路输入接口中,用户逻辑需要提供的信息包括但不限于:地址、长度、SOP 和 EOP。当用户逻辑将 SOP 描述符信息馈入 QDMA 后,它最终还必须馈入 EOP 描述符信息。这些多描述符数据包的描述符必须按顺序馈入。不属于该包的其他描述符不得在多描述符包中进行交织。用户逻辑必须将描述符累积到 EOP 描述符,然后再将其反馈给 QDMA。否则会导致挂起。一旦 QDMA 为 EOP 描述符发出最后一拍后,QDMA 就会在 QDMA H2C AXI4‑Stream 数据输出上生成 TLAST。这是必然的,因为用户需按顺序提交给定包的描述符。

H2C 串流接口由所有队列共享,如果用户逻辑没有预留空间用于灌入该包,则可能会出现队头阻塞问题。如果包尺寸很大,则服务质量可能会受到严重影响。串流引擎旨在为大小低至 128B 的包实现 PCIe 饱和,因此 AMD 建议您将包大小限制为主机页面大小,或用户应用所需的最大传输单元。

H2C 串流引擎中提供的性能控制能力是指,当 H2C 串流引擎发现 PCIe 侧未完成的数据达到一定量之后,即停止向 PCIe RQ/RC 发出请求。要使用此功能特性,软件必须在 H2C_REQ_THROT(0xE24) 寄存器中对阈值进行编程。H2C 串流引擎所含待交付至用户逻辑的未完成数据量超过此阈值后,它就会停止向 PCIe RQ/RC 发送更多读取请求。默认情况下禁用此功能特性,可使用 H2C_REQ_THROT (0xE24) 寄存器将其启用。此功能特性有助于提升 C2H 串流性能,因为 H2C 串流引擎提交请求的速度比 C2H 串流引擎快得多。这可能会耗尽 PCIe 侧的 H2C 流量资源,导致对 C2H 流量产生不利影响。H2C_REQ_THROT (0xE24) 寄存器还允许软件单独启用并编程 H2C 串流引擎中可包含的未完成读取请求的最大数量阈值。因此,该寄存器可用于单独启用和编程 H2C 串流引擎中未完成的请求和数据的阈值。