完成状态/中断调节 - 4.0 简体中文

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

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

QDMA Subsystem for PCIe 提供了一种按队列调节完成中断和完成状态写操作的方法。该软件可以为每个队列选择五种模式之一。为队列选择的模式存储在该队列的完成环上下文的 QDMA Subsystem for PCIe 中。为队列选择一种模式后,驱动程序在向 QDMA 发送完成环 CIDX 更新时始终可以选择另一种模式。

完成中断调节由完成引擎处理。完成引擎会存储所有队列的完成环上下文。每个队列的中断和完成状态的发送都可以单独启用或禁用,此信息存储在完成环上下文中。请注意,此处描述的模式不仅可以调节中断,还可以调节完成状态写操作。此外,由于可以为每个队列单独启用/禁用中断和完成状态写操作,因此仅当在该队列的完成上下文中启用中断/完成状态时,这些模式才有效。

针对每个队列,QDMA Subsystem for PCIe 只保留一个未完成的中断。即使该模式已满足发送中断的所有其它条件,QDMA 也会强制执行此策略。QDMA Subsystem for PCIe 根据从驱动程序接收该队列的 CIDX 更新来判定中断已处理完成。

所有中断调节模式遵循的基本策略是:当队列没有未完成的中断时,QDMA Subsystem for PCIe 会持续监控该模式要满足的触发条件。一旦满足条件,就会传出中断。当 QDMA 子系统等待要处理的中断时,会时刻警惕要满足的中断条件并记住它们。当收到 CIDX 更新时,QDMA 子系统会评估是否仍然满足条件。如果仍然满足,则传出另一个中断。如果不满足,则不会传出中断,并且 QDMA 会重新开始监控要满足的条件。

请注意,QDMA 子系统提供的中断调节模式不一定精确。因此,如果用户应用发送两个带有发送中断指示的 CMPT 包,并不表示必然会生成两个中断。此行为的主要原因是当驱动程序被中断以读取完成环时,它没有义务准确读取到生成中断的完成。因此,驱动程序可能不会读取到中断完成,或者如果有要读取的有效描述符,它甚至可能会读取至中断完成描述符范围之外。此行为要求 QDMA Subsystem for PCIe 每次从驱动程序接收 CIDX 更新时都重新评估触发条件。

每种模式的详细描述如下:

TRIGGER_EVERY
这种模式在中断频率方面是最高的。这种模式的策略是每当完成引擎确定完成环中存在未读的完成描述符时就发送中断。
TRIGGER_USER
QDMA Subsystem for PCIe 提供了一种方法,可向子系统发送 CMPT 包,并在其中包含如下指示,当该子系统完成向主机发送包后,就传出中断。这使用户应用能够在 TRIGGER_USER 模式置位的情况下执行中断调节。
TRIGGER_USER_COUNT
这种模式使 QDMA Subsystem for PCIe 对两个触发器中的任何一个都保持敏感。用户会将其中任一触发器随 CMPT 包一起发送。另一个触发器的条件是硬件发现完成环中未读完成条目数超出编程阈值。该阈值可由驱动程序按队列进行编程。检测到上述任一触发器时,QDMA 会评估是否发送中断。如前所述,除了满足触发器条件外,还必须满足其它条件才能发送中断。
TRIGGER_USER_TIMER
采用此模式时,QDMA Subsystem for PCIe 对两个触发器中的任何一个保持敏感。用户会将其中任一触发器随 CMPT 包一起发送。另一个触发器的条件是与 CMPT 队列关联的定时器到期。定时器的周期可由驱动程序按队列进行编程。检测到上述任一触发器时,QDMA 会评估是否发送中断。如前所述,除了满足触发器条件外,还必须满足其它条件才能发送中断。如需了解更多信息,请参阅 完成定时器
TRIGGER_USER_TIMER_COUNT
这种模式使 QDMA Subsystem for PCIe 对三个触发器中的任何一个都保持敏感。第一个触发器随 CMPT 包一起由用户发送。第二个触发器的条件是与 CMPT 队列关联的定时器到期。定时器的周期可由驱动程序按队列进行编程。第三个触发器的条件是硬件发现完成环中未读完成条目数超出编程阈值。该阈值可由驱动程序按队列进行编程。检测到上述任一触发器时,QDMA 会评估是否发送中断。如前所述,除了满足触发器条件外,还必须满足其它条件才能发送中断。
TRIGGER_DIS
采用此模式时,QDMA Subsystem for PCIe 不会发送完成中断,无论是否针对给定队列启用中断都是如此。在这种情况下,驱动程序读取完成环的唯一方法是定期轮询该环。如果设置了这种模式,驱动程序必须使用完成环中提供的颜色位功能,因为此模式还会禁用将任何完成状态描述符发送到完成环。

在 TRIGGER_USER_TIMER_COUNT 模式下对队列进行编程时,软件可以选择不读取完成环中由中断(或完成状态写操作)所指示的所有可用完成条目。在这种情况下,软件可以提供完成 CIDX 更新以执行部分读取。这是可行的,因为 QDMA 将在接收到 CIDX 更新后重新启动定时器,一旦定时器到期,将生成另一个中断。此过程将重复直至读取完所有完成条目为止。

但是,在 TRIGGER_EVERY、TRIGGER_USER 和 TRIGGER_USER_COUNT 模式下,仅当 QDMA 接收到来自用户逻辑的完成包时,才会发送中断。对于用户逻辑生成的每个中断发送请求,QDMA 都会发送一个仅且一个中断。因此,在这种情况下,如果软件并未读取可供读取的所有完成条目,并且用户逻辑不再发送任何完成请求中断,则 QDMA 不会再生成任何中断。这将导致剩余的完成无限期地留在完成环中。为避免发生这种情况,在 TRIGGER_EVERY、TRIGGER_USER 和 TRIGGER_USER_COUNT 模式下,软件必须读取完成环中由中断(或完成状态写操作)所指示的所有完成条目。

以下是不同模式的流程图。这些流程图反映的是完成引擎的视角。完成包从用户逻辑传入,并写入完成环。软件 (SW) 更新是指从软件发送到硬件的完成环 CIDX 更新。

图 1. EVERY 模式的流程图
图 2. USER 模式的流程图
图 3. USER_COUNT 模式的流程图
图 4. USER_TIMER 模式的流程图
图 5. USER_TIMER_COUNT 模式的流程图