MSI under Linux
什么是MSI
MSI(Message Signaled Interrupts)是一种中断形式, 依靠设备将约定数据写入指定地址来通知CPU中断的产生.
MSI从PCI 2.2开始支持, 在PCI 3.0中得到扩展. 支持更多中断以及拥有独立配置各个中断能力的MSI-X则从PCI 3.0开始被支持.
MSI的优点
相对基于引脚的中断响应方式, 首先MSI支持更多的中断且不需要复用, 其次启用MSI的设备的数据写入和中断触发是串行的, 驱动接收到中断信号的时候就可以确定数据已经准备就绪, 而不需要检查相应设备的寄存器, 这提升了性能.
如何在Linux下使用MSI
PCI设备默认以基于引脚的中断响应方式初始化, 然后由驱动来检测是否支持MSI并决定是否启用, 如果启用MSI失败则会回退到基于引脚的中断响应方式. 下面是关于MSI的几个重要的内核函数:
启用MSI并给设备分配一个中断:
int pci_enable_msi(struct pci_dev *dev)
允许驱动申请minvec至maxvec个中断:
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
获取设备申请的中断向量个数:
int pci_msi_vec_count(struct pci_dev *dev)
禁用MSI, 回退到基于引脚的中断响应方式:
void pci_disable_msi(struct pci_dev *dev)
ref:
1, https://en.wikipedia.org/wiki/Message_Signaled_Interrupts
2, https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt