[ msi_domain_alloc_irqs ] 中循环每一个中断号,最终调用 __pci_write_msi_msg int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec) { int i, ret, virq; for_each_msi_entry(desc, dev) { virq = desc->irq;// 中断号 irq_data = irq_domain_get_irq_...
Linux提出irq_domain是考虑系统当中存在多个GIC的情况,每个GIC可以独立的进行配置,因此不排除两个GIC会使用同一个INTID来做服务不同的硬件,例如两个GIC都使用了0x260来处理MSI,但是一个是网卡,一个是SATA。那在系统里面就没法保证唯一性。 对于MSI中断而言,是与PCI设备相关的,而PCI的BDF信息在系统是全局,统一编制...
vIOAPIC 的创建主要分作两部分,第一个部分是在内核空间虚拟一个 vIOAPIC 设备,其二是对默认引脚的模拟. Broiler 在初始化阶段通过调用 kvm_init 函数,并使用 iotcl 方式向 KVM 传入命令 KVM_CREATE_IRQCHIP 用于创建 vIOAPIC. KVM 的 kvm_arch_vm_ioctl 函数收到了 Broiler 传递下来的命令,然后找到对应的...
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_domain_alloc_irqs->irq_domain_activate_irq->__irq_domain_activate_irq->msi_domain_activate->irq_chip_write_msi_msg->pci_msi_domain_write_msg->__pci_write_msi_msg Vector Control字段存放的是控制字段,当Mask Bit为1时,PCIe设备不能使用该MSI-X tableentry来发送中断消息。
// irq_chip对应的是pci_msi_create_irq_domain中关联的its_msi_irq_chip +-> data->chip->irq_write_msi_msg(data, msg);+-> pci_msi_domain_write_msg() 从这个流程可以看出,MSI是通过irq_write_msi_msg往一个地址发一个消息来激活一个中断。
static struct msi_domain_info dmar_msi_domain_info = { .ops = &dmar_msi_domain_ops, .chip = &dmar_msi_controller, .flags = MSI_FLAG_USE_DEF_DOM_OPS, }; static struct irq_domain *dmar_get_irq_domain(void) @@ -408,6 +409,7 @@ static struct msi_domain_ops hpet_msi_domain_ops...
intarch_setup_msi_irq(struct pci_dev*pdev,struct msi_desc*desc){struct msi_msg msg;unsigned long dest_phys_id;int irq,vector;irq=create_irq();if(irq<0)returnirq;irq_set_msi_desc(irq,desc);dest_phys_id=cpu_physical_id(cpumask_any_and(&(irq_to_domain(irq)),cpu_online_mask));vec...
And here is my .config file, at the IRQ subsystem: ## IRQ subsystem#CONFIG_GENERIC_IRQ_PROBE=yCONFIG_GENERIC_IRQ_SHOW=yCONFIG_GENERIC_IRQ_SHOW_LEVEL=yCONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=yCONFIG_GENERIC_IRQ_MIGRATION=yCONFIG_HARDIRQS_SW_RESEND=yCONFIG_GENERIC_IRQ_CHIP=yCONFIG_IRQ_DOMAIN=...
@@ -222,4 +228,32 @@ int cdx_msi_domain_alloc_irqs(struct device *dev, unsigned int irq_count); */ int cdx_dev_reset(struct device *dev); /** * cdx_enable_msi - Enable MSI for the CDX device. * @cdx_dev: device pointer * * Return: 0 for success, -errno on failure */...