最近在跟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定义:
- Message Control:该字段存放当前PCIe设备使用MSI-x机制进行中断请求的状态与控制信息,存放内容如下表:
- 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组成,其组成结构如下图所示:
- 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(是不是中断使用方式很简单)。
值得注意的是,最开始以为Per Vector Mask位可以用来在Host系统在收到中断后屏蔽该中断向量避免中断淹没,奈何Spec里明确指出不能这么干!
MSI-X 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位清零。
在硬件实现中,Pending Table实现与否对于中断功能使用影响不大。
PCIe的MSI-X中断使用对于硬件逻辑设计而言着重在于对上述协议的实现,下篇文章将就以FPGA实现MSI-X功能进行说明。
END
作者:玉骐
原文链接:https://mp.weixin.qq.com/s/vPj226V2PcDTbYHpkzyLEQ
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。