也可以基于PCI Driver提供的现有接口 pci_msix_vec_count (drivers/pci/msi.c),来获取给定PCIE设备支持的 中断向量数目(vector number)。 /*** pci_msix_vec_count - return the number of device's MSI-X table entries* @dev: pointer to the pci_dev data structure of MSI-X device function* This ...
PCIE MSIX: 工作原理:MSIX解决了MSI的设计缺陷,引入了更大规模的中断表和更灵活的中断管理。它支持更多的中断向量,使得设备能够更有效地处理中断。 关键结构: MSIX Capability Structure:包含Table Size、Function Mask和MSIX Enable Bit,用于支持MSIX中断的初始化和管理。 MSIX Table和Pending B...
/** int pci_enable_msi(struct pci_dev *dev)*/首先,调用pci_enable_msi使能msi中断,在这个函数里面,会根据处理器体系结构初始化MSI Capability寄存器,并且分配中断号保存在pci_dev->irq中; 然后,使用request_irq函数即可注册中断处理函数; MSI-X中断使用方法: /** int pci_enable_msix_range(struct pci_dev...
msi domain初始化流程涉及irq_domain结构体的配置,系统在pci_arch_init()中调用x86_create_pci_msi_domain完成初始化。接着,pci_alloc_irq_vectors函数用于MSI/MSIX capability初始化、中断号分配,最终实现中断管理。MSI-X中断软件注册流程与MSI类似,通过pci_alloc_irq_vector函数完成,主要区别在于为设...
MSI-x的软件初始化流程(基于Linux 4.14内核) EP的HOST驱动在probe过程中会调用pci_alloc_irq_vectors();函数用来初始化和申请中断,以下是主要流程 pci_alloc_irq_vectors(); //同时指定中断类型PCI_IRQ_MSIX | PCI_IRQ_MSI | PCI_IRQ_LEGACY pci_alloc_irq_vectors_affinity() ...
RC driver向MSI-X table中填入它所支持的中断向量配置表。 EP driver向EP HW写需要触发的中断号 EP HW查询MSI-X table,从其中取该中断对应的64bit地址信息。 EP HW查询MSI-X table,从期中取该中断的DATA和Control信息。 EP HW构造MSI-X消息,填入上面两个步骤中得到的地址和DATA信息。
MSI-X标准定义了设备如何配置其中断向量数目。通过内核代码,可以读取第一个DWORD中关于中断向量总数的信息,从而了解当前PCIE设备实际支持的中断向量数量。MSIX Table存储所有PCIE设备的中断向量号,位于BAR3的起始地址处,这里是设备内部的寄存器空间。每个中断向量对应一条Entry,包含中断向量号和用于处理中断...
如果是X86的CPU,存放message address和message data的结构struct msi_msg *msg是在irq_msi_compose_msg中初始化的,这个值和CPU架构相关。 desc->mask_base是MSI-X table entry 0对应的虚拟地址,desc->msi_attrib.entry_nr是MSI-X table entry编号。desc->mask_base和desc->msi_attrib.entry_nr都是在msix_set...
PCIe 协议定义了三种中断:INTx (legacy), MSI, MSIX 1.INTx 中断是相对古老的PCIe设备中断方式,整个系统仅支持8个INTx 中断,所有设备共用。PCIe 中的INTx 中断是通过PCIe message发送到 switch 和 IO APIC的。CPU收到 IO APIC 转发到 local APIC 的 INTx 中断后,需要查询ISR确定中断源设备,并进一步查询中断...