MSI 模式 - 1.3 简体中文

UltraScale+ 器件 Integrated Block for PCI Express 产品指南 (PG213)

Document ID
PG213
Release Date
2022-11-16
Version
1.3 简体中文

用户应用首先断言 cfg_interrupt_msi_int 上的值有效,如前图所示。核会断言 cfg_interrupt_msi_sent 有效,以指示已接受中断,并且核会发送 MSI 存储器写入 TLP。

图 1. MSI 模式

MSI 请求是 32 位可寻址存储器写入 TLP 或 64 位可寻址存储器写入 TLP。此地址取自“MSI Capability Structure”(MSI 功能结构)的“Message Address”(报文地址)字段和“Message Upper Address”(报文上位地址)字段,而有效载荷则取自“Message Data”(报文数据)字段。这些值由系统软件通过将配置写入 MSI 功能结构来进行编程。当核配置为多矢量 MSI 时,系统软件可通过在“Multiple Message Enable”(多报文使能)字段中编程非 0 值来允许多矢量 MSI 报文。

发送的 MSI TLP 类型(32 位可寻址或 64 位可寻址)取决于 MSI 功能结构中的“Upper Address”(上位地址)字段的值。默认情况下,MSI 报文作为 32 位可寻址存储器写入 TLP 来发送。仅当系统软件在上位地址寄存器中编程非 0 值时,MSI 报文才会使用 64 位可寻址存储器写入 TLP。

当启用多矢量 MSI 报文时,用户应用可以覆盖每个已发射的 MSI TLP 的“报文数据”字段中的 1 个或多个低阶位以便区分上游发送的多条 MSI 报文。“Message Data”(报文数据)字段中可供用户应用使用的低阶位数量判定方式为:取 IP 目录中所设置的“Multiple Message Capable”(多报文支持)字段与系统软件所设置的“Multiple Message Enable”(多报文使能)字段之间较小的值,并可作为 cfg_interrupt_msi_mmenable[2:0] 核输出以供使用。该核会屏蔽 cfg_interrupt_msi_select 中系统软件未通过“Multiple Message Enable”配置的所有位。

以下伪代码可显示所需的处理:

// Value MSI_Vector_Num must be in range: 0 £ MSI_Vector_Num £ (2^cfg_interrupt_mmenable)-1

if (cfg_interrupt_msienable) {       // MSI Enabled
  if (cfg_interrupt_mmenable > 0) {  // Multi-Vector MSI Enabled
    cfg_interrupt_msi_int[MSI_Vector_Num] = 1;
  } else {                           // Single-Vector MSI Enabled
    cfg_interrupt_msi_int[MSI_Vector_Num] = 0;
  }
} else {
  // Legacy Interrupts Enabled
}

例如:

  1. 如果 cfg_interrupt_mmenable[2:0] == 000b,即启用 1 个 MSI 矢量,那么 cfg_interrupt_msi_int = 01h;
  2. 如果 cfg_interrupt_mmenable[2:0] == 101b,即启用 32 个 MSI 矢量,那么 cfg_interrupt_msi_int = {32'b1 << {MSI_Vector#}}

其中,MSI_Vector# 为 5 位值,并且允许的范围为 00000b ≤ MSI_Vector# ≤ 11111b

如果启用“Per-Vector Masking”(按矢量屏蔽),那么请首先验证“Mask register”(掩码寄存器)中未屏蔽所示矢量。具体操作方法是在配置接口上读取该寄存器(核不查看掩码寄存器)。