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

原创 2011年09月03日 20:52:57

    在调试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 内核代码详细描述了这一过程:

int pci_enable_msi(struct pci_dev* dev)
{
    int status;

    status = pci_msi_check_device(dev, 1, PCI_CAP_ID_MSI);
    if (status)
        return status;

    WARN_ON(!!dev->msi_enabled);

   
    if (dev->msix_enabled) {
        dev_info(&dev->dev, "can't enable MSI "
             "(MSI-X already enabled)\n");
        return -EINVAL;
    }
    status = msi_capability_init(dev);//此函数会配置设备MSI结构并分配替换MSI中断号
}

static int msi_capability_init(struct pci_dev *dev)
{
    struct msi_desc *entry;
    int pos, ret;
    u16 control;
    ......
    msi_set_enable(dev, 0);
   
    pci_intx_for_msi(dev, 0);// disable INTx interrupts   
    msi_set_enable(dev, 1);
    dev->msi_enabled = 1;

    dev->irq = entry->irq;   
    return 0;
}

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

在调试PCI-E的MSI中断前,需要先保证将传统中断调通,然后再调试这个。MSI中断究其本质,就是一个存储器读写事件。将MSI Address设置为内存中的某个地址(可以为64位),产生MSI中断时,...
  • mao0514
  • mao0514
  • 2015年01月04日 17:30
  • 6602

PCIE协议解析 synopsys IP MSI-X Capability 读书笔记(12)

1.1.1    PF MSI-X Capability RegisterDetails MSI-XCapability作为是一种可选的capability,与MSIcapability一样都是...
  • yijingjijng
  • yijingjijng
  • 2015年08月30日 15:41
  • 2696

PCIe 驱动流程(LTSSM)

本次的工作是完成刚流片的FPGA中PCIe IP核的bring up,也就是芯片的中PCIe的第一个使用者,将PCIe IP核正常使用起来,并配合公司的EDA团队,完成PCIe IP核到用户的呈现。 ...
  • yijingjijng
  • yijingjijng
  • 2015年09月03日 18:28
  • 9703

PCIe学习记录

PCIe学习记录 学习背景 对PCIe毫无概念的情况下进行的学习,由于目标是写出PCIe的驱动代码,因此对其一些细节(如时序、如何扩展等内容)并没有仔细的去看,只看了一些基本的知识。 PCI总线...
  • cs_dn_hust_qhw
  • cs_dn_hust_qhw
  • 2015年06月03日 00:15
  • 573

PCI MSI MSI-X学习笔记

MSI 出现于PCI2.2中, PCI 3.0中允许针对每个中断设置掩码 MSI-X出现于PCI3.0中,相对MSI,每个设备允许有更多的中断,每个中断都可以独立配置   基本功能 设备通过向...
  • bluesandmetal
  • bluesandmetal
  • 2013年08月21日 21:24
  • 945

pcie的msi与msi-x-串行VS并行

之所以可以实现如此的msi中的message,是因为pcie不仅仅是一条总线,而是一套协议,它是串行的,而非传统总线的并行形式,串行总线最适合定义协议了,然而不管怎样,cpu引脚以及其局部总线(前端总...
  • dog250
  • dog250
  • 2011年04月10日 12:00
  • 6180

关于SMI、MSI、SCI、INTx各种中断小结

MSI VS INTx(Pin-basedinterrupt) MSI的全称是Message Signaled Interrupt.MSI出现在PCI 2.2和PCIe的规范中,是一种内部中断信号机制...
  • huangkangying
  • huangkangying
  • 2013年09月05日 20:59
  • 11741

MSI(Message Signaled Interrupt)/MSI-X

MSI(Message Signaled Interrupt)是PCI2.2提出的新的中断处理形式,即,有中断产生时在系统特定内存地址写入中断数据已通知CPU一个中断。该种方式脱离了中断引脚(PIN)...
  • defeattroy
  • defeattroy
  • 2013年06月03日 16:36
  • 6640

msix中断分析

此文档是基于linux-3.6.10内核代码对msix中断相关进行分析。 PCIe设备可以使用msix报文向处理器提交中断,下面首先看下PCIe设备中的MSXI Capability结构。 此...
  • weijitao
  • weijitao
  • 2015年06月19日 23:18
  • 2711

Linux中断机制之二:初始化

相关概念和关键数据结构1、 irq号:在当前系统中全局唯一,对应内核数据结构struct irq_desc,每个外设的中断有一个irq号(体系结构预留的中断,是没有对应的irq_desc结构和irq...
  • phenix_lord
  • phenix_lord
  • 2015年04月18日 21:13
  • 1758
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PCI-E配置MSI中断流程解析
举报原因:
原因补充:

(最多只允许输入30个字)