声明:此文章为原创,转载请注明 转自https://blog.csdn.net/weixin_48180416/article/details/115739848
PCIe支持传统中断、MSI中断、MSI-X中断。每个Function必须实现MSI或MSI-X,或两者同时支持。
PCIe最大支持32个MSI中断,2048个MSI-X中断。
以下介绍MSI中断
MSI Capability Structure是PCI-Compliance的配置空间
MSI Capability有四种形式: 32bit地址、64bit地址、带或不带Pending Mask
Message Control Register 包含总开关使能不使能MSI,支持多少个MSI,是32bit还是64bit,每个Vector是否屏蔽;
Mask Bit: 屏蔽对应vector的中断;bit[0]为1时屏蔽message 0
Pending Bit: 记录Pending中断,一旦Mask Bit变为0,就自动发pending bit对应vector的中断
配置MSI寄存器过程:
发起MSI过程:发起1DW长度的中断,data高16bit填0,低16bit来自于message data寄存器+Vector, 地址= message address
注: MSI中断的event id,即data字段必须是连续的,最多支持32个
以下介绍MSI-X中断
MSI-X相比于MSI的优点:
MSI-X是PCIe Extend Capability的配置空间
BIR指的是相对哪个BAR,Offset是相对于这个BAR多少偏移可以找到MSI-X Table或PBA Table
MSI-X Table格式如下:
Vector Control字段bit0表示此Entry是否mask
Message Data和Address表示要发送的MSI中断的地址和数据(MSI-X配置发送的也是MSI TLP,实质就是一个MWr TLP)
以S家IP为例:
默认情况下,Table BIR、PBA BIR可以绑定到BAR0(修改配置也可以绑定到其他BAR)
内部集成了一个MSI-X发送模块
软件Doorbell有两种方法:
注意:
Vector指的Entry的索引,而Table中的Vec bit[0]为Mask bit,用于屏蔽每个Entry,不要混淆。
Pending Bit每个bit位对应的是Table的一个Entry
MSI/MSI-X Order问题:
Producer-Consumer模型:在下图这种模型的条件下,CPL不能超越P,否则数据还没有完全写入CPU就会开始Consume(处理)
这种中断方式属于轮询,MSI为MWr,与Posted data同属于Posted TLP,是不会发生乱序的情况的,也不需要其他规则
“与Posted data同属于Posted TLP,是不会发生乱序的情况的”是有前提的:
MSI和Posted Data必须有相同的TC,这样它们映射到同一个VC,才会有order的关系,不同的VC是没有order的
如果没有相同的TC,需要与Posted Data相同TC的"dummy read",保证Posted Data传输完毕(因为Non-P不可以超越P)
MSI TLP中的no-snoop和relaxed-ordering bit 必须是0