完成队列 - 4.0 简体中文

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

Document ID
PG302
Release Date
2022-05-20
Version
4.0 简体中文

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

该引擎在本地存储器中总计维护 2048 个 CMPT 上下文。上下文可存储队列的属性,如基址、SW CIDX、PIDX 和队列深度。

图 1. 简单的完成队列流程

C2H 串流应使用 CMPT 队列将完成传输至主机,但它也可以用于其它类型的完成操作或用于向驱动程序发送报文。通过 CMPT 的报文保证不会绕过对应的 C2H 串流包 DMA。

符合上述编号方式的 DMA CMPT 队列操作的简单流程如下所示:

  1. CMPT 引擎通过 CMPT 接口接收完成报文,但完成报文的 QID 来自 C2H 串流接口。该引擎会读取 CMPT 上下文 RAM 的 QID 索引。
  2. DMA 则会将 CMPT 条目写入地址 BASE+PIDX。
  3. 如果所有条件都满足,则可选择将 PIDX 随颜色位一起写入 CMPT 队列的状态描述符中。
  4. 如果启用中断模式,CMPT 引擎会生成中断事件报文并发送给中断模块。
  5. 驱动程序可采用轮询模式或中断模式。无论采用何种方式,驱动程序都会识别新的 CMPT 条目,方法是匹配颜色位,或者将状态描述符中的 PIDX 值与其当前的软件 CIDX 值进行比较。
  6. 驱动程序会为该队列更新 CIDX。这样硬件即可复用描述符。软件完成对 CMPT 的处理后,即在停止轮询或离开中断处理程序之前,驱动程序会对关联队列的 CIDX 更新寄存器发出写入。