INTx中断虽然在PCIe总线内部是基于消息传递的,但最终还是需要通过中断线连接到中断控制器的,这也限制了其中断数量的扩展。MSI中断则与此不同,此时PCIe与中断控制器之间不再需要硬件中断线,而是当中断发生时,PCIe设备只需要向特定地址写入指定的值后,中断控制器就能自动产生一个中断,即它是完全基于消息形式的。显然,若...
#include<linux/pci.h>/* MSI-X registers (in MSI-X capability) */#define PCI_MSIX_FLAGS 2/* Message Control */#define PCI_MSIX_FLAGS_QSIZE 0x07FF/* Table size */structpci_dev*pdev=pci_dev;u16msix_config;intnum_vectors;// pdev 为 PCIE 设备,pdev->msix_cap为设备配置空间中MSIX Ca...
与Legacy中断方式相比,PCIe设备使用MSI或者MSI-X中断机制,可以消除INTx这个边带信号,而且可以更加合理地处理PCIe总线的“序”。目前绝大多数PCIe设备使用MSI或者MSI-X中断机制提交中断请求。 MSI和MSI-X机制的基本原理相同,其中MSI中断机制最多只能支持32个中断请求,而且要求中断向量连续,而MSI-X中断机制可以支持更多的...
PCIE_int_cfg.number_tx_MSI = PCIE_16_MSI;这个结构体里面配置了MSI16这个中断向量。然后工程跑的是loopback模式。调用了这个语句KeyStone_PCIE_RC_MSI_allocate((PCIE_MSI_Regs *)&gpPCIE_EP_regs->MSI_CAP,PCIE_RC_BAR0_ADDRESS+((Uint32)&gpPCIE_app_regs->MSI_IRQ)-(Uint32)gpPCIE_app_regs);,...
x86使用FSB Interrupt Message方式处理MSI/MSI-X中断请求。 PCIe设备在提交MSI中断请求时,都是向MSI/MSI-X Capability结构中的Meaasge Address的地址写Message Data数据,从而组成一个存储器写TLP,向处理器提交存储器写请求。 翻译一下就是说: 由于存储器域和PCIe域地址的相互映射,向MessageAddress地址写数据,也就是...
1、什么是MSI?(Message Signaled Interrupts) 用简单的一句话就可以说明msi的原理:cpu有一段特殊的寄存器空间,往这个寄存器里面写数据,就会触发cpu的中断。pci设备经过配置以后,一旦需要上报中断就会往cpu这种寄存器里面写一个值,触发cpu的中断。 2、PCI/PCIE Device侧关于MSI的配置: ...
status = msi_capability_init(dev);//此函数会配置设备MSI结构并分配替换MSI中断号 } static intmsi_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_...
PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,其中INTx是可选的,MSI/MSI-X是必须实现的。 1.1 什么是MSI中断? MSI, message signal interrupt, 是PCI设备通过写一个特定消息到特定地址,从而触发一个CPU中断。特定消息指的是PCIe总线中的Memory Write TLP, 特定地址一般存放在MSI capability中。 和传统的IN...
MSI-X标准定义了设备如何配置其中断向量数目。通过内核代码,可以读取第一个DWORD中关于中断向量总数的信息,从而了解当前PCIE设备实际支持的中断向量数量。MSIX Table存储所有PCIE设备的中断向量号,位于BAR3的起始地址处,这里是设备内部的寄存器空间。每个中断向量对应一条Entry,包含中断向量号和用于处理中断...