十二 · 2021年10月22日

PCIe之MSI-x中断(一)

最近在跟PCIe中断打交道,而中断部分则是自己之前一直涉猎较少的,本文(分两篇)仅就从硬件实现的角度讲解PCIe中MSI-X硬件协议的实现。

MSI-X Capability

在PCIe的体系结构里,提供了三种中断实现方式,分别为:分别为INTx中断,MSI中断,MSI-X中断,其中INTx是可选的,MSI/MSI-X是必须实现的。相较于MSI中断仅能最多支持32个中断向量,且中断像良好必须分配连续,MSI-x可最多支持2048个中断向量,且中断向量号也无需连续,更具灵活性。

先来看在PCIe体系结构里MSI-X的capability定义:

8db17745218a1011313cbb6845f75d80.jpg

  • Message Control:该字段存放当前PCIe设备使用MSI-x机制进行中断请求的状态与控制信息,存放内容如下表:

f44aafba2003eb4fddb89bc10413831d.png

  • Next Pointer:该字段存放下一个Capability结构的地址。
  • Capability ID:该字段记载MSI-X Capability结构的ID号,其值为0x11。
  • Table Offset:该字段存放MSI-X Table在相应Bar空间中的偏移。
  • Table BIR:该字段存放MSI-X Table所在的位置,即位于哪个Bar空间下。
  • PBA offest:该字段存放Pending Table在相应Bar空间中的偏移。
  • PBA BIR:该字段存放Pending Table位于PCIe设备的哪个Bar空间中。通常情况下MSI-X Pending Table和MSI-X Table存放在PCIe设备的同一个BAR空间中。

在linux中,通过lspci -xxxvvvs xx:xx.x(设备BDF号)即可查看PCIe设备的配置空间,下图所示为通过该指令查询的某PCIe设备的MSI-X配置情况:

Capabilities: [60] MSI-X: Enable- Count=16 Masked-
    Vector table: BAR=2 offset=00200000
    PBA: BAR=2 offset=00300000

可以看到,该设备支持16个MSI-X中断,Table Offset为0x200000,位于BAR2 空间下,PBA offset 为0x300000,PBA BIR为2。

MSI-X Table

MSI-X Table由多个Entry组成,其组成结构如下图所示:

21cfce64badb9de3a3700440b75916be.jpg

  • Msg Addr:当MSI-X Enable位有效时,该字段存放MSI-X存储器写事务的目的地址低32位,该双字的31:2位有效,系统软件可读可写。
  • Msg Upper Addr:当MSI-X Enable位有效时,该字段存放MSI-X存储器写事务的目的地址高32位。
  • Msg Data:存放MSI-X中断报文使用的数据。该字段包含了一系列中断相关控制位及中断向量号等信息。
  • Vector Control:该字段可读可写,该字段只有第0位(Per Vector Mask)位有效,其他未保留,该位在复位时为0,为1时,PCIe设备不能使用该Entry提交中断请求,与MSI机制中的Mask位类似。

    对于硬件而言,PCIe设备要想使用某个中断向量,首先从查询该中断向量对应的Table Entry,若Per Vector Mask位为0(前提使能MSI-X Enable),即可向Msg Addr、Msg Upper Addr组成的64位地址发送TLP 写报文,写内容为Msg Data(是不是中断使用方式很简单)。
 title=

值得注意的是,最开始以为Per Vector Mask位可以用来在Host系统在收到中断后屏蔽该中断向量避免中断淹没,奈何Spec里明确指出不能这么干!

MSI-X Pending Table

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

 title=

如上图所示,在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位清零。

在硬件实现中,Pending Table实现与否对于中断功能使用影响不大。

PCIe的MSI-X中断使用对于硬件逻辑设计而言着重在于对上述协议的实现,下篇文章将就以FPGA实现MSI-X功能进行说明。

END

作者:玉骐
原文链接:https://mp.weixin.qq.com/s/vPj226V2PcDTbYHpkzyLEQ
微信公众号:
 title=
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息