PCI相关(6)- PCIe中断-MSI/MSIX

在 PCI 总线中,通过INTx 引脚提交中断请求,而 MSI 机制是一个可选机制。而在 PCIe 总线中,PCIe 设备必须支持 MSI 或者 MSI-X 中断请求机制,而可以不支持 INTx 中断消息。

在 PCIe 总线中,MSI 和 MSI-X 中断机制使用存储器写请求 TLP 向处理器提交中断请求。不同的处理器使用了不同的机制处理这些 MSI/MSI-X 中断请求,如 PowerPC 处理器使用 MPIC 中断控制器处理 MSI/MSI-X 中断请求;而 x86处理器使用 FSB Interrupt Message 方式处理 MSI/MSI-X 中断请求。

在提交 MSI中断请求时,都是向 MSI/MSI-X Capability 结构中的 Message Address 的地址写 MessageData 数据,从而组成一个存储器写 TLP,向处理器提交中断请求。

与 Legacy 中断方式相比,PCIe 设备使用 MSI 或者 MSI-X 中断机制,可以消除 INTx 这个边带信号,而且可以更加合理地处理 PCIe 总线的“序”。

MSI 中断机制最多只能支持32个中断请求,而且要求中断向量连续,而 MSI-X 中断机制可以支持更多的中断请求,而并不要求中断向量连续。与 MSI 中断机制相比,MSI-X 中断机制更为合理。

一、MSI/MSI-X Capability 结构

PCIe 设备可以使用 MSI 或者 MSI-X 报文向处理器提交中断请求,但是对于某个具体的PCIe 设备,可能仅支持一种报文。在 PCIe 设备中含有两个 Capability 结构,一个是 MSI Capability 结构,另一个是 MSI-X Capability 结构。通常情况下一个 PCIe 设备仅包含一种结构,或者为 MSI Capability 结构,或者为 MSI-X Capability 结构。

1.1 MSI Capability 结构

MSI Capability 结构共有四种组成方式,分别是32和64位的 Message 结构,32位和64位带中断 Masking 的结构。MSI 报文可以使用32位地址或者64位地址,而且可以使用 Masking机制使能或者禁止某个中断源。MSI Capability 寄存器的结构如下图。

 

Capability ID 字段记载 MSI Capability 结构的 ID 号,其值为0x05。在 PCIe 设备中,每一个 Capability 结构都有唯一的 ID 号。

Next Pointer 字段存放下一个 Capability 结构的地址。

Message Control 字段。该字段存放当前 PCIe 设备使用 MSI 机制进行中断请求的状态与控制信息。具体可参照PCI Local Bus Specification, Revision 3.0.

Message Address 字段。当 MSI Enable 位有效时,该字段存放 MSI 存储器写事务的目的地址的低32位。该字段的31:2字段有效,系统软件可以对该字段进行读写操作;该字段的第1~0位为0。

Message Upper Address 字段。如果64 bit Address Capable 位有效,该字段存放 MSI存储器写事务的目的地址的高32位。

Message Data 字段,该字段可读写。当 MSI Enable 位有效时,该字段存放 MSI 报文使用的数据。该字段保存的数值与处理器系统相关,在 PCIe 设备进行初始化时,处理器将初始化该字段,而且不同的处理器填写该字段的规则并不相同。如果 Multiple Message Enable 字段不为0b000时(即该设备支持多个中断请求时),PCIe 设备可以通过改变 Message Data 字段的低位数据发送不同的中断请求。

Mask Bits 字段。Mask Bits 字段由32位组成,其中每一位对应一种中断请求。当相应位为1时表示对应的中断请求被屏蔽,为0时表示允许该中断请求。该字段和 Pending Bits 字段对于 MSI 中断机制是可选字段,但是 PCIe 总线规范强烈建议所有 PCIe 设备支持这两个字段。

Pending Bits 字段。该字段对于系统软件是只读位,PCIe 设备内部逻辑可以改变该字段的值。该字段由32位组成,并与 PCIe 设备使用的 MSI 中断一一对应。该字段需要与Mask Bits 字段联合使用。当 Mask Bits 字段的相应位为1时,即禁止对应中断,如果 PCIe 设备需要发送对应的中断请求时,PendingBits 字段的对应位将被 PCIe 设备的内部逻辑置1,此时 PCIe 设备并不会使用 MSI 报文向中断控制器提交中断请求;当系统软件将 Mask Bits 字段的相应位从1改写为0时,即使能对应中断后,PCIe 设备将发送 MSI 报文向处理器提交中断请求,同时将 Pending Bit 字段的对应位清零。在设备驱动程序的开发中,有时需要联合使用 Mask Bits 和 Pending Bits 字段防止处理器丢弃中断请求。

1.2 MSI-X Capability 结构

MSI-X Capability 中断机制与 MSI Capability 的中断机制类似。PCIe 总线引出 MSI-X机制的主要目的是为了扩展 PCIe 设备使用中断向量的个数,同时解决 MSI 中断机制要求使用中断向量号连续所带来的问题。

在 MSI-X Capability 结构中,每一个中断请求都使用独立的 Message Address 字段和 Message Data 字段,从而中断控制器可以更加合理地为该设备分配中断资源。

与 MSI Capability 寄存器相比,MSI-X Capability 寄存器使用一个数组存放 Message Address 字段和 Message Data 字段,而不是将这两个字段放入 Capability 寄存器中,这个数组称为 MSI-X Table。从而当 PCIe 设备使用 MSI-X 机制时,每一个中断请求可以使用独立的 Message Address 字段和 Message Data 字段。

除此之外 MSI-X 中断机制还使用了独立的 Pending Table 表,该表用来存放与每一个中断向量对应的 Pending 位。这个 Pending 位的定义与 MSI Capability 寄存器的 Pending 位类似。MSI-X Table 和 Pending Table 存放在 PCIe 设备的 BAR 空间中。MSI-X 机制必须支持这个 Pending Table,而 MSI 机制的 Pending Bits 字段是可选的。

(1)MSI-X Capability 结构

MSI-X Capability 结构比 MSI Capability 结构略微复杂一些。在该结构中,使用 MSI-X Table 存放该设备使用的所有 Message Address 和 Message Data 字段,这个表格存放在该设备的 BAR 空间中,从而 PCIe 设备可以使用 MSI-X 机制时,中断向量号可以并不连续,也可以申请更多的中断向量号。MSI-X Capability 结构的组成方式如下图所示。

 

Capability ID 字段记载 MSI-X Capability 结构的 ID 号,其值为0x11。在 PCIe 设备中。

Next Pointer 字段存放下一个 Capability 结构的地址。

Message Control 字段,该字段存放当前 PCIe 设备使用 MSI-X 机制进行中断请求的状态与控制信息,如下图所示

 

Table BIR(BAR Indicator Register)。该字段存放 MSI-X Table 所在的位置,PCIe 总线规范规定 MSI-X Table 存放在设备的 BAR 空间中。该字段表示设备使用 BAR0~5寄存器中的哪个空间存放 MSI-X table。该字段由三位组成,其中0b000~0b101与 BAR0~5空间一一对应。

Table Offset 字段。该字段存放 MSI-X Table 在相应 BAR 空间中的偏移。

PBA(Pending Bit Array) BIR 字段。该字段存放 Pending Table 在 PCIe 设备的哪个BAR 空间中。在通常情况下,Pending Table 和 MSI-X Table 存放在 PCIe 设备的同一个 BAR 空间中。

PBA Offset 字段。该字段存放 Pending Table 在相应 BAR 空间中的偏移。

(2)MSI-X Table

MSI-X Table 的组成结构如下图所示。

 

由上图可见,MSI-X Table 由多个 Entry 组成,其中每个 Entry 与一个中断请求对应。其中每一个 Entry 中有四个参数,其含义如下所示。

Msg Addr。当 MSI-X Enable 位有效时,该字段存放 MSI-X 存储器写事务的目的地址的低32位。该双字的31:2字段有效,系统软件可读写;1:0字段复位时为0,PCIe 设备可

以根据需要将这个字段设为只读,或者可读写。不同的处理器填入该寄存器的数据并不相同。

Msg Upper Addr,该字段可读写,存放 MSI-X 存储器写事务的目的地址的高32位。

Msg Data,该字段可读写,存放 MSI-X 报文使用的数据。其定义与处理器系统使用的中断控制器和 PCIe 设备相关。

Vector Control,该字段可读写。该字段只有第0位(即 Per Vector Mask 位)有效,其

他位保留。当该位为1时,PCIe 设备不能使用该 Entry 提交中断请求;为0时可以提交中断请求。该位在复位时为0。Per Vector Mask 位的使用方法与 MSI 机制的 Mask 位类

似。

(3)Pending Table

Pending Table 的组成结构如下图所示。

 

如上图所示,在 Pending Table 中,一个 Entry 由64位组成,其中每一位与 MSI-X Table中的一个 Entry 对应,即 Pending Table 中的每一个 Entry 与 MSI-X Table 的64个 Entry对应。与 MSI 机制类似,Pending 位需要与 Per Vector Mask 位配置使用。

当 Per Vector Mask 位为1时, PCIe 设备不能立即发送 MSI-X 中断请求,而是将对应的 Pending位置1;当系统软件将 Per Vector Mask 位清零时,PCIe 设备需要提交 MSI-X 中断请求,同时将 Pending 位清零。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值