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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值