再来看一下nwl_pcie_enable_msi函数: 在该函数中主要完成的工作就是设置级联的中断处理函数,级联的中断处理函数中最终会去调用具体的设备的中断处理函数; 所以,稍微汇总一下,作为两种不同的中断处理方式,套路都是一样的,都是创建irq_chip中断控制器,为该中断控制器添加irq_domain,具体设备的中断响应流程如下: 设备...
pci_msi_legacy_setup_msi_irqs 该函数的作用很简单:调用arch_setup_msi_irqs方法,去设置msi,然后通过pci_msi_setup_check_result函数去校验设置的结果,看看是否成功,若失败则会到sysfs之中,清除之前设置的一些数据。 arch_setup_msi_irqs 该方法位于pci/msi/legacy.c中,它会去真正调用每个体系结构的处理器特有的...
再来看一下nwl_pcie_enable_msi函数: 在该函数中主要完成的工作就是设置级联的中断处理函数,级联的中断处理函数中最终会去调用具体的设备的中断处理函数; 所以,稍微汇总一下,作为两种不同的中断处理方式,套路都是一样的,都是创建irq_chip中断控制器,为该中断控制器添加irq_domain,具体设备的中断响应流程如下: 设备...
申请多个多个MSI中断向量号的函数为int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec); 下面没有标志出处的源码都出自文件linux-2.6.38.6\drivers\pci\msi.c /** * pci_enable_msi_block - configure device's MSI capability structure * @dev: device to configure * @nvec: number of...
nwl_pcie_init_irq_domain和mwl_pcie_enable_msi与中断级联相关,下个小节介绍; pci_scan_root_bus_bridge:对总线上的设备进行扫描枚举,这个流程在Linux PCI驱动框架分析(二)中分析过。brdige结构体中的pci_ops字段,用于指向PCI的读写操作函数集,当具体扫描到设备要读写配置空间时,调用的就是这个函数,由具体的Con...
再来看一下nwl_pcie_enable_msi函数: 在该函数中主要完成的工作就是设置级联的中断处理函数,级联的中断处理函数中最终会去调用具体的设备的中断处理函数; 所以,稍微汇总一下,作为两种不同的中断处理方式,套路都是一样的,都是创建irq_chip中断控制器,为该中断控制器添加irq_domain,具体设备的中断响应流程如下: ...
return dev_info(&dev->dev,"can't enable MSI " return-EINVAL; } status = msi_capability_init(dev);//此函数会配置设备MSI结构并分配替换MSI中断号 } staticpci_dev *dev) { struct int u16 control; ... msi_set_enable(dev, 0);
和传统中断在系统初始化扫描PCI bus tree时就已自动为设备分配好中断号不同,MSI中断是在设备驱动程序初始化时调用pci_enable_msi() kernel API 时才分配中断号的。所以如果使用传统中断,在设备驱动程序中直接调用request_irq(pDev->irq, handler,...) 注册设备中断处理函数即可。而使用MSI中断的话,需先调用pci_...
6. ioremap():此函数用于映射PCIe设备的IO空间到内核地址空间。在probe函数中,驱动程序会调用pci_iomap函数来映射设备的IO空间。 7. pci_enable_msi():它允许PCI设备使用MSI中断机制,当函数被调用时,它将被指定的PCI设备启用MSI中断,并返回中断号。
再来看一下nwl_pcie_enable_msi函数: 在该函数中主要完成的工作就是设置级联的中断处理函数,级联的中断处理函数中最终会去调用具体的设备的中断处理函数; 所以,稍微汇总一下,作为两种不同的中断处理方式,套路都是一样的,都是创建irq_chip中断控制器,为该中断控制器添加irq_domain,具体设备的中断响应流程如下: ...