http://guliqun1983.blog.163.com/blog/static/501116852011730535314/
全部博文(120)
分类: 嵌入式
2013-06-24 10:55:10
内核选项为:CONFIG_PCI_MSI
MSI(Message Signaled Interrupts),MSI是设备端通过向Host发MSG的方式产生IRQ request,在送达Host/PCI桥之前它和普通的Memory Write 并没有区别,Host收到以后再将该Memory Write转化成Interrupt送到各个CPU。
为什么使用MSI:
基于管脚的PCI中断要经常在几个设备间共享,内核必须调用该中断相关的每个中断处理函数,这样会降低系统的整体性能,MSI不是共享的,就没有这个问题。
当设备要写数据到内存时,这时产生了一个基于引脚的中断,这时候会产生一种情况就是中断已经到达CPU了,但是数据还没有完全写入到内存中。
PCI的传输顺序规则要求所有要写入内存的数据,要在产生中断的寄存器返回之前完成(有返回值)。
所以为了保证所有数据正确的写入到内存,中断处理函数必须去读取产生中断的寄存器,确保这个中断寄存器没有返回,在返回之前将数据写完。
然而MSI就没有这个问题,因为“中断的产生的写”是一定在数据写入到内存之后,所以当中断产生的时候,驱动就知道所有的数据已经写到内存了。
PCI的每个功能设备只支持一个基于引脚的中断,驱动需要查询设备来确定发生的事件,降低了中断处理的效率,通过MSI,一个设备支持多个中断,这样可以为不同的功能使用不同的中断。