H2C/C2H 队列是位于主机存储器中的环。对于这两种类型的队列,生产者是软件,使用者则是描述符引擎。软件负责维护生产者索引 (PIDX) 和硬件使用者索引 (HW CIDX) 的副本,以避免覆盖未读取的描述符。描述符引擎还负责维护使用者索引 (CIDX) 和 SW PIDX 的副本,以确保引擎不会读取未写入的描述符。队列中的最后一个条目专用于状态描述符,引擎会在该状态描述符中写入 HW CIDX 和其他状态。
引擎在本地存储器中维护总计 2048 个 H2C 上下文和 2048 个 C2H 上下文。上下文负责存储队列的属性,例如,队列的基址 (BADDR)、SW PIDX、CIDX 和深度。
图 1. 简单的 H2C 和 C2H 队列
上图显示了 H2C 和 C2H 的提取操作。
- 对于 H2C,驱动程序会将有效载荷写入主机缓冲器,与有效载荷缓冲器信息一起构成 H2C 描述符,并将其放入 PIDX 位置处的 H2C 队列中。对于 C2H,驱动程序以保留的可用缓冲器空间来构成描述符,以便接收来自 DMA 的包写入。
- 驱动程序会将转发的写入发送到描述符引擎中的 PIDX 寄存器中,以获取关联的队列 ID (QID) 及其当前 PIDX 值。
- 在接收到 PIDX 更新后,引擎会根据地址偏移和功能 ID 来计算指针更新的绝对 QID。通过使用 QID,引擎将从与 QDMA Subsystem for PCIe 关联的存储器提取绝对 QID 的上下文。
- 引擎会根据上下文判定允许提取的描述符数量。引擎会使用基址 (BADDR)、CIDX 和描述符大小来计算描述符地址,然后引擎会发出 DMA 读取请求。
- 描述符引擎从主机存储器接收到读取完成后,就会将其交付至内部模式下的 H2C 引擎或 C2H 引擎。对于旁路,描述符将传出至关联描述符旁路输出接口。
- 对于编程为内部模式的存储器映射或 H2C 串流队列,在完全处理完提取的描述符后,引擎会将 CIDX 值写入状态描述符。对于编程为旁路模式的队列,用户逻辑会通过接口中的旁路来控制写回。状态描述符可根据上下文设置进行调节。对于完成,C2H 串流队列始终使用 CMPT 环。
对于 C2H,通过 CMPT 环来隐式完成提取操作。