通用队列设计 - 5.0 简体中文

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

Document ID
PG302
Release Date
2023-10-18
Version
5.0 简体中文

QDMA Subsystem for PCIe 的多队列 DMA 引擎使用成对的 RDMA 模型队列支持用户逻辑中的 RNIC 实现。每个队列组均由主机到卡 (H2C)、卡到主机 (C2H) 和 C2H 串流完成 (CMPT) 组成。每个队列的元素均为描述符。

H2C 和 C2H 始终由驱动程序/软件写入;硬件始终从这些队列中读取。H2C 承载的描述符用于执行来自主机的 DMA 读取操作。C2H 承载的描述符则用于对主机执行 DMA 写入操作。

在内部模式下,H2C 描述符承载地址和长度信息,被称为聚集描述符。这些描述符支持 32 位元数据,这些元数据可随每个描述符一起从软件传递到硬件。根据上下文设置,描述符可作为存储器映射(承载主机地址、卡地址和 DMA 传输长度)描述符,或者也可以作为串流(仅承载主机和 DMA 传输长度)描述符。通过描述符旁路可定义任意描述符格式,以便软件将即时数据和/或附加元数据随包一起传递。

C2H 队列存储器映射描述符包含卡地址、主机地址和长度。在串流内部缓存模式下,描述符仅承载主机地址。描述符的缓冲器大小由驱动程序编程,对于整个队列,其大小应固定不变。实际传输中,与每个描述符关联的数据并不一定必须是缓冲器大小的完整长度。

软件通过向硬件写入其生产者索引 (PIDX) 来为 H2C 和 C2H 队列播发有效描述符。状态描述符是描述符环(C2H 串流环除外)的最后一个条目。状态描述符承载硬件的使用者索引 (CIDX),以便驱动程序知晓何时回收描述符并在主机中取消分配缓冲器。

对于 C2H 串流模式,C2H 描述符将根据 CMPT 队列条目进行回收。通常情况下,每个 C2H 包承载一个条目,表示耗用一个或多个 C2H 描述符。CMPT 队列条目承载有足够的信息,可供软件申领所耗用的所有描述符。通过外部逻辑可将其扩展到承载其他种类的完成或信息,以提供给主机。

驱动程序可使用描述符中的颜色位或 CMPT 环末端的状态描述符来检测由硬件写入环中的 CMPT 条目。每个 CMPT 条目均可承载 C2H 串流包的元数据,并可充当用户应用的定制完成或即时通知。

所有环形缓冲器(H2C、C2H 和 CMPT)的基址都应对齐到 4 KB 地址。

图 1. 队列环结构

该软件可按 16 种不同的环大小进行编程。可从上下文编程中选择每个队列的环大小。最后一个队列条目是描述符状态,允许的条目数为(队列大小 - 1)。

例如,如果队列大小为 8,其中包含条目索引 0 到 7,那么最后一个条目(索引 7)保留用于表示状态。无论如何,此索引都不应该用于 PIDX 更新,PIDX 更新也不应该等于 CIDX。在此情况下,如果 CIDX 为 0,最大 PIDX 更新将为 6。

在以上示例中,如果流量已启动,并且 CIDX 为 4,那么最大 PIDX 更新为 3。