邮箱 - 4.0 简体中文

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

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

在虚拟环境中,连接到 PF 的驱动程序有足够的特权来编程和访问 QDMA 寄存器。对于所需特权较少的所有功能,部分 PF 和所有 VF 都必须使用邮箱机制来与有特权的驱动程序进行通信。通信 API 必须由驱动程序来定义。QDMA IP 并不会对其进行定义。

包括 PF 和 VF 在内的每个功能都有一个收件箱和一个发件箱,其中可以容纳大小为 128B 的报文。每个 VF 都各自访问自己的邮箱,每个 PF 不仅可访问其自己的邮箱,也可以访问与该 PF 关联的所有功能(PF 或 VF)。

注释: 启用邮箱将增大 PL 的利用率。

QDMA 邮箱允许以下访问:

  • 从 VF 访问关联的 PF。
  • 从 PF 访问属于其自有虚拟功能组 (VFG) 的任意 VF。
  • 从某个 PF(通常是无权访问 QDMA 寄存器的驱动程序)访问另一个 PF。
图 1. 邮箱

从 VF 到 PF 的报文传递

允许每个 VF 向目标 PF 邮箱发布一条报文,直至目标功能 (PF) 接受此报文为止。在发布报文之前,源功能应确保其 o_msg_status 处于已清零状态,然后 VF 才能将报文写入其传出报文寄存器。报文写入完成后,VF 驱动程序通过在控制/状态寄存器 (CSR) 地址 0x5004 写入 0x1 来发送 msg_send 命令。然后,邮箱硬件通过将 i_msg_status 字段断言有效来通知 PF 驱动程序。

功能驱动程序应启用 i_msg_status 的定期轮询,以检查传入报文的可用性。在 PF 侧,i_msg_status = 0x1 表示有一条或多条报文正在等待 PF 驱动程序提取。“Mailbox Status Register”(邮箱状态寄存器)中的 cur_src_fn 会提供第一条待处理报文的功能 ID。然后,PF 驱动程序应将“Mailbox Target Function Register”(邮箱目标功能寄存器)设置为第一条待处理报文的源功能 ID。随后即可对 PF 的“Incoming Message Registers”(传入报文寄存器)进行间接访问,这意味着邮箱硬件返回的报文字节数将始终与目标函数所发送的字节数相对应。完成报文读取后,PF 驱动程序还应通过在 CSR 地址处写入 0x2 来发送 msg_rcv 命令。硬件将在源功能侧断言 o_msg_status 无效。下图演示了从 VF 到源侧和目标侧的 PF 的报文传递流程。

图 2. 从 VF 到 PF 的报文传递流程

从 PF 到 VF 的报文传递

从 PF 到属于其 VFG 的 VF 的报文传递流程与从 VF 到 PF 的流程略有不同,因为:

PF 可向多个目标功能发送报文,所以它在检查状态时可能会收到多个确认。如下图所示,PF 驱动程序必须先将“Mailbox Target Function Register”(邮箱目标功能寄存器)设置为目标功能 ID,然后才能执行任何报文传递操作;例如,检查传入报文状态、写入报文或发送命令。在 VF 侧(接收侧),每当 VF 驱动程序收到 i_msg_status = 0x1 时,VF 驱动程序都应读取其“Incoming Message Registers”(传入报文寄存器)以提取该报文。根据不同应用,VF 驱动程序可在读取报文后立即发送 msg_rcv,或者在处理完对应报文后再发送。

为了避免逐一轮询传出报文的状态,邮箱硬件为每个 PF 提供了一组“Acknowledge Status Registers (ASR)”(确认状态寄存器)。当邮箱收到来自 VF 的 msg_rcv 命令时,它就会将源 PF 的 o_msg_status 字段断言无效,同时也会在“Acknowledge Status Registers”中设置对应的位。对于功能 ID 为 <N> 的给定 VF,确认状态位于:

  • Acknowledge Status Register 地址:<N> / 32 + <0x22420 寄存器地址>
  • 确认状态位的位置为<N> / 32

只要“Acknowledge Status Register (ASR)”中有任何位已断言有效,邮箱硬件就会将“Status Register”(状态寄存器)(0x22400) 中的 ack_status 断言有效。PF 驱动程序可先轮询 ack_status,而后再实际读出确认状态寄存器。PF 驱动程序可通过一次寄存器访问来检测多个完成情况。PF 驱动程序完成处理后,还应将该值写回同一寄存器地址以清除状态。

图 3. 从 PF 到 VF 的报文传递流程

邮箱中断

邮箱模块支持中断作为备用事件通知机制。每个邮箱都有一个“Interrupt Control Register”(中断控制寄存器),对于 PF,该寄存器位于偏移 0x22410 处,对于 VF,则位于偏移 0x5010 处)。将此寄存器设为1 即可启用中断。启用中断后,只要有任何待处理的事件等待邮箱处理(如任何待处理的传入报文或对应传出报文的任何确认),邮箱都将向 QDMA 发送中断。根据驱动程序配置,通过“Function Interrupt Vector Register”(功能中断矢量寄存器)(对应 PF 为 0x22408,对应 VF 则为 0x5008)来配置中断矢量。

启用中断并不会更改事件记录机制,这意味着用户必须通过读取“Function Interrupt Vector Register”(功能状态寄存器)来检查待处理事件。响应中断请求的第一步是禁用中断。可能待处理事件的实际数量比向邮箱发送中断时的事件数量更多。

在中断控制从禁用变为启用时,邮箱会检查其事件状态。如果在读取中断状态和重新启用中断之间有任何新事件到达邮箱,那么邮箱将立即生成一个新的中断请求。