用户应用首先断言 cfg_interrupt_msi_int
上的值有效,如前图所示。核会断言 cfg_interrupt_msi_sent
有效,以指示已接受中断,并且核会发送 MSI 存储器写入 TLP。
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
}
例如:
- 如果
cfg_interrupt_mmenable[2:0] == 000b
,即启用 1 个 MSI 矢量,那么cfg_interrupt_msi_int = 01h;
- 如果
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”(掩码寄存器)中未屏蔽所示矢量。具体操作方法是在配置接口上读取该寄存器(核不查看掩码寄存器)。