那天和一个朋友讨论了一下MSI/MSIX方面的问题,下面是对讨论内容的整理:
1.MSI-X Table和PBA结构太大,MSIX Capability又只能放到配置空间64-255这个区域,所以只能把Table和PBA放到设备内存空间了。MSIX Capability存着BAR的编号和偏移量来从配置空间索引Table和PBA。
2. MSI capability里“消息地址”字段在PCI规范里没有格式定义,这是因为PCI规范需要支持多种平台。在x86上和在SPARC上,消息地址的定义是不同的。
3. x86上MSI”消息地址“(64或32位)在Intel 系统编程卷里定义, Solaris是用本地APIC的基地址0xfee00000按位或8位目标处理器ID再或1位RH(取值0),或1位DM(取值0),得到的地址就是设备发中断用的内存地址。
4. x86上MSI“消息数据”(16位)的定义比较简单, Solaris使用边缘触发方式,投递模式是固定,最后低8位是中断向量地址。 关于“消息地址”和“消息数据”,Solaris请参考apic_pci_msi_enable_vector。
5. 需要注意的是,MSI“消息数据"的低3位是要根据MSI控制寄存器的Multiple Message Enable位来由设备动态修改的,所以一个”消息数据“寄存器可以被最多32个向量共用。
6. MSI capability里支持最多32个向量,但由于这32个向量共享一个“消息地址”。而在x86上,这个"消息地址"用来决定发送到哪一个CPU的本地APIC,所以32个向量只能绑定在同一个CPU了。
7. MSIX capability指向了Table和PBA表在哪一个BAR对应的内存空间里。Table里包含了“消息地址”和”消息数据“, x86下格式和MSI的完全一样。PBA指示了是否有待处理的中断消息。
8. 一 个设备理论上最多分配32个MSI中断, 向量数大于1时,需要分配连续相邻的向量,这是MSI capability里”消息数据“和”Multiple Message Enable“的定义决定的。Solaris可参考apic_alloc_msi_vectors的实现。
9. 一个设备理论上最多可以分配2K个MSIX中断, 而且每个中断向量可以是不连续的, 因为Table的大小是11位二进制表示的, 其中每个表项都有独立的”消息地址“和“消息数据”。Solaris可参考apic_alloc_msix_vectors。
10. 因为每个向量对应独立的“消息地址”和“消息数据”, MSIX可以让一个设备多至2K个中断独立的绑定在不同的CPU上,CPU足够多的时候它们互相不影响,所以Intel的SRIOV 1/10G卡的VF都只支持MSIX而不是MSI。
PCI规范学习笔记(2)
最新推荐文章于 2022-10-19 10:54:35 发布