PCI-E配置MSI中断流程解析

   在传统的pci中断体系中,每一个pci总线上的设备被分配一个特定的中断号,然后当设备需要中断cpu时,设备直接发出int信号,然后在cpu的inta引脚拉低的时候将自己的中断号放在数据总线上,一切都要设备自己负责,这一切的缘由一部分就是因为pci的并行性,实现事务很复杂,而pcie是串行的,很容易定义协议包,因此很容易就实现了由root complex代理中断的功能,因此设备也就可以动态的分配独占的中断号了,因为中断号的分配完全是软件解决的,而不再像传统pci那样是硬件解决的了,软件的最大特点就是其灵活性,因此pcie更适合大量设备的环境,中断处理程序再也不需要大量遍历共享中断号的设备来确定中断源了。

在调试PCI-E的MSI中断前,需要先保证将传统中断调通,然后再调试这个。MSI中断究其本质,就是一个存储器读写事件。将MSI Address设置为内存中的某个地址(可以为64位),产生MSI中断时,中断源会在MSI Address所在的地址写入MSI Data。也就是说,如果有四条MSI中断线,就会依次写入Data、Data+1、Data+2、Data+3在内存中,依次来区分中断源设备。

设备端的定义
    设备在自己的配置空间定义了自己的Capabilities list. 如果该设备支持MSI中断,在此capabilities list其中必定有一个节点的Capabilities ID=0x5D(0x5D 表明是MSI中断节点,其位置由设备自定义)

主控制器
1> 主控制器的工作是扫描到该设备后顺藤摸瓜,沿着Capabilities List找到MSI中断节点.

2> 主控制器给设备上的Address Register和data register俩寄存器赋值(以MPC8548E为例,该值是中断控制器的MSI中断寄存器定义决定);
设备
    MSI中断, 本质上是一个内存写事务,该事务的payload部分都由MSI Capabilities 寄存器的值组成。

The key points here are:
1> Device prepare the capabilities list and the MSI node
2> Controller assign a value to the address register, which is inside the MSI capability node, and the value assigned is the kernel virtual address of the MSI interrupt description register inside the interrupt controller.
3> As well, the value assigned to the data register is defined by the MSI registers inside the interrupt controller.

    Capabilites list 指针位于config space的 0x34 偏移量处,它是所有capabilities 节点的根节点。

    和传统中断在系统初始化扫描PCI bus tree时就已自动为设备分配好中断号不同,MSI中断是在设备驱动程序初始化时调用pci_enable_msi() kernel API 时才分配中断号的。所以如果使用传统中断,在设备驱动程序中直接调用request_irq(pDev->irq, handler,...) 注册设备中断处理函数即可。而使用MSI中断的话,需先调用pci_enable_msi() 初始化设备MSI 结构,分配MSI中断号,并替换INTx中断号,再调用request_irq(pDev->irq, handler,...) 注册设备中断处理函数。除了卸载中断处理函数需要相应地调用pci_diable_msi()外,其他的处理完全相同。下面的Linux 内核代码详细描述了这一过程:

[cpp] view plaincopy

  1. int pci_enable_msi(struct pci_dev* dev)  
  2. {  
  3.     int status;  
  4.   
  5.     status = pci_msi_check_device(dev, 1, PCI_CAP_ID_MSI);  
  6.     if (status)  
  7.         return status;  
  8.   
  9.     WARN_ON(!!dev->msi_enabled);  
  10.   
  11.      
  12.     if (dev->msix_enabled) {  
  13.         dev_info(&dev->dev, "can't enable MSI "  
  14.              "(MSI-X already enabled)\n");  
  15.         return -EINVAL;  
  16.     }  
  17.     status = msi_capability_init(dev);//此函数会配置设备MSI结构并分配替换MSI中断号  
  18. }  
  19.   
  20. static int msi_capability_init(struct pci_dev *dev)  
  21. {  
  22.     struct msi_desc *entry;  
  23.     int pos, ret;  
  24.     u16 control;  
  25.     ......  
  26.     msi_set_enable(dev, 0);  
  27.      
  28.     pci_intx_for_msi(dev, 0);// disable INTx interrupts     
  29.     msi_set_enable(dev, 1);  
  30.     dev->msi_enabled = 1;  
  31.   
  32.     dev->irq = entry->irq;     
  33.     return 0;  
  34. }  
时间: 2024-09-20 00:55:56

PCI-E配置MSI中断流程解析的相关文章

EDKII Build Process:EDKII项目源码的配置、编译流程[三]

<EDKII Build Process:EDKII项目源码的配置.编译流程[3]>博文目录: 3. EDKII Build Process(EDKII项目源码的配置.编译流程)       ->3.1 The General Process Of EDKII Build(EDKII项目源码的配置.编译一般流程)             ->3.1.1 Tool chain:BaseTools             ->3.1.2 Setup build shell env

Spark Streaming + Spark SQL 实现配置化ETL流程

项目地址 前言 传统的Spark Streaming程序需要: 构建StreamingContext 设置checkpoint 链接数据源 各种transform foreachRDD 输出 通常而言,你可能会因为要走完上面的流程而构建了一个很大的程序,比如一个main方法里上百行代码,虽然在开发小功能上足够便利,但是复用度更方面是不够的,而且不利于协作,所以需要一个更高层的开发包提供支持. 如何开发一个Spark Streaming程序 我只要在配置文件添加如下一个job配置,就可以作为标准的

HBase - 数据写入流程解析

众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松地支撑每天10T的写入量.当然,为了支持更高吞吐量的写入,HBase还在不断地进行优化和修正,这篇文章结合0.98版本的源码全面地分析HBase的写入流程,全文分为三个部分,第一部分介绍客户端的写入流程,第二部分介绍服务器端的写入流程,最后再重点分析WAL的工作原理. 客户端流程解析 (1)用户提交put请求后,HBase客户端会将put请求添加到本地buffer中,符合一定条件就会通过A

PS绘制蔷薇玫瑰按摩膏效果图流程解析

  下面为大家介绍PS绘制蔷薇玫瑰按摩膏效果图流程,希望大家喜欢! 教程结束,以上就是PS绘制蔷薇玫瑰按摩膏效果图流程解析,希望对大家有所帮助! 分类: PS图片处理

spring mvc-springMVC配置了JSp视图解析器就不能访问了,求大神支招,新手一枚,拜谢!

问题描述 springMVC配置了JSp视图解析器就不能访问了,求大神支招,新手一枚,拜谢! 项目用的springMVC框架,我配置了JSP的视图解析器,能正常跳转到JSP页面,但是跳转HTML页面就404,请问能够配置另外的视图解析器来区分呢,比如我要跳转到HTML的时候加个标识或什么的,求老司机帮帮忙,拜谢!

spring mvc-springmvc.xml如何配置多个视图解析器实现不同页面的跳转

问题描述 springmvc.xml如何配置多个视图解析器实现不同页面的跳转 解决方案 有一个多视图解析器,你可以看看 解决方案二: ``` 配置两个就好了,找不到第一个就会去找第二个

Apache配置多域名方法解析

apache配置多域名方法解析 apache是最流行的http服务器软件之一,其以快速.可靠(稳定)而著称,并且可通过简单的api扩展,perl/python解释器可被编译到服务器中,完全免费,并且源代码全部开放.如果有自己的服务器或者vps教程,并且不想为了方便而购买昂贵的控制面板的话,那自己动手配置apache就成了一门必修课了.下面简单的介绍了如何通过设置apache的http.conf文件,进行多个域名以及其相关的二级域名的绑定(假设我们要绑定的域名是minidx.com和ntt.cc,

《响应式Web设计全流程解析》一导读

译者序 响应式Web设计全流程解析关于什么是正确的Web设计流程,这个问题没有统一的答案,探其原因,是因为Web设计是一门非常年轻的行业. 十几年前,Web设计是由传统的平面设计师兼职的,在之后十几年变化中,这一职位渐渐分裂为Web设计相关的各个职位,包括用户研究.交互设计.视觉设计.前端开发.这些职位的分割带来了设计流程上的隔阂,每个人成为流水线上的一环,专注于输出自己的"交付物".交互设计师输出线框图.流程图以及可交互的原型.视觉设计师参考交互设计师的交付物,输出精美的视觉设计稿,

《响应式Web设计全流程解析》一第1章 拥抱变化

第1章 拥抱变化 响应式Web设计全流程解析互联网是个神奇的存在,是个不断变化,并且在创新中见证奇迹的地方.如果你记得最早的互联网长什么样,你会有更深刻的感触.1995年建立的网站和那时的"设计",在现在来看可能更像一个笑话. 某种程度上说,现在网站的设计流程已截然不同,但反过来说,却也丝毫未变. 从互联网的伊始,设计师们就在绞尽脑汁将创意落实到浏览器里.最早火起来的互联网设计师是那些爱耍小聪明的家伙,用hacking技巧来帮助自己实现目标.从spacer GIF和表格布局(layou