H2C 和 C2H 队列 - 5.0 简体中文

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

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

H2C/C2H 队列是位于主机存储器中的环。对于这两种类型的队列,生产者是软件,使用者则是描述符引擎。软件负责维护生产者索引 (PIDX) 和硬件使用者索引 (HW CIDX) 的副本,以避免覆盖未读取的描述符。描述符引擎还负责维护使用者索引 (CIDX) 和 SW PIDX 的副本,以确保引擎不会读取未写入的描述符。队列中的最后一个条目专用于状态描述符,引擎会在该状态描述符中写入 HW CIDX 和其他状态。

引擎在本地存储器中维护总计 2048 个 H2C 上下文和 2048 个 C2H 上下文。上下文负责存储队列的属性,例如,队列的基址 (BADDR)、SW PIDX、CIDX 和深度。

图 1. 简单的 H2C 和 C2H 队列

上图显示了 H2C 和 C2H 的提取操作。

  1. 对于 H2C,驱动程序会将有效载荷写入主机缓冲器,与有效载荷缓冲器信息一起构成 H2C 描述符,并将其放入 PIDX 位置处的 H2C 队列中。对于 C2H,驱动程序以保留的可用缓冲器空间来构成描述符,以便接收来自 DMA 的包写入。
  2. 驱动程序会将转发的写入发送到描述符引擎中的 PIDX 寄存器中,以获取关联的队列 ID (QID) 及其当前 PIDX 值。
  3. 在接收到 PIDX 更新后,引擎会根据地址偏移和功能 ID 来计算指针更新的绝对 QID。通过使用 QID,引擎将从与 QDMA Subsystem for PCIe 关联的存储器提取绝对 QID 的上下文。
  4. 引擎会根据上下文判定允许提取的描述符数量。引擎会使用基址 (BADDR)、CIDX 和描述符大小来计算描述符地址,然后引擎会发出 DMA 读取请求。
  5. 描述符引擎从主机存储器接收到读取完成后,就会将其交付至内部模式下的 H2C 引擎或 C2H 引擎。对于旁路,描述符将传出至关联描述符旁路输出接口。
  6. 对于编程为内部模式的存储器映射或 H2C 串流队列,在完全处理完提取的描述符后,引擎会将 CIDX 值写入状态描述符。对于编程为旁路模式的队列,用户逻辑会通过接口中的旁路来控制写回。状态描述符可根据上下文设置进行调节。对于完成,C2H 串流队列始终使用 CMPT 环。

对于 C2H,通过 CMPT 环来隐式完成提取操作。