MSI 与 MSIX

PCI 规范2.2 描述了MSI, optional

 

MSI 目的:1. 允许一个设备申请多个中断,避免了共享中断,提高了效率,(最多32, 必须是2的倍数,MSIX则最多2048个);2. 当设备写入内存数据然后发起中断的时候有可能数据并未写入,CPU必须读设备的寄存器才能确定写完了;但是如果MSI中断,同样是写操作,中断肯定在数据写完以后才能收到;

MSI操作: 在configration time(应该是系统上电的时候),systemsoftware(OS)会读取设备的PCI空间的MSI capability structure, 然后设置对应的control,address和data register(driver不能修改的)。工作是PCI function 需要发起中断,则将data register的内容write到address register指定的地址。如果支持多个interrupt,则可以修改data register的内容的最后几个bit。设备对某些地址的写操作,会引起CPU的中断

pci_enable_msi 的时候要初始化设备的msi capability structure,设置ctrl、addr和data register。给设备分配一个中断,在dev->irq中返回(尽管设备支持多个MSI中断),禁用中断引脚,中断模式由引脚中断改成MSI模式。

 

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) 的时候, 设置irqaction的dev->dev_id = dev;  在64位系统中最后由handle_edge_irq调用到irqaction->handler(irq, action->dev_id);   即调用 handler(irq, dev)

 

一个PCI function可以申请多个irq,那么CPU怎么识别irq号呢?在发起中断以前,设备向data register写的data最后面8位为中断向量(0x10~0xFE)。在FreeScale的powerPC处理器使用的MPIC通用中断控制器上,中断控制器向CPU提交中断后,CPU再读ACK寄存器得到中断向量;P4080处理器对此做出了改进,在提交中断的同时提交中断向量,缩短了中断延时。

x86处理器使用FSB Interrupt Message总线事务转发MSI/MSI-X中断请求。使用这种方法的优点是向CPU内核提交中断请求的同时,提交PCIe设备使用的中断向量,从而CPU不需要使用中断响应周期从寄存器中获得中断向量。

 

X86平台在2.6.38才增加了对msi的支持:native_setup_msi_irqs

你可能感兴趣的:(MSI 与 MSIX)