首页 理论教育PCIExpress中断处理导读

PCIExpress中断处理导读

【摘要】:Capric卡一共需要处理三种中断请求,分别为DMA写完成、DMA读完成和错误中断请求。源代码12-9 Capric卡的中断服务例程在capric_probe函数中,capric_interrupt中断服务例程被request_irq函数注册到Linux系统的irq_desc中断描述符表中,并与Linux系统的外部中断处理函数do_IRQ挂接,当Capric卡通过MSI中断方式提交外部中断请求后,do_IRQ函数将最终调用capric_interrupt函数完成相应的中断处理。

Capric卡一共需要处理三种中断请求,分别为DMA写完成、DMA读完成和错误中断请求。Capric卡使用了一个中断服务例程处理这些中断请求,其执行流程如源代码12-9所示。

源代码12-9 Capric卡的中断服务例程

在capric_probe函数中,capric_interrupt中断服务例程被request_irq函数注册到Linux系统的irq_desc中断描述符表中,并与Linux系统的外部中断处理函数do_IRQ挂接,当Capric卡通过MSI中断方式提交外部中断请求后,do_IRQ函数将最终调用capric_interrupt函数完成相应的中断处理。Capric卡处理中断请求的硬件操作流程如第12.1.5节所示。(www.chuimin.cn)

目前Linux系统对MSI机制的支持并不理想,pci_enable_msi函数[98]仅可以获得一个irq号,这为中断服务例程的设计带来了一定的困难。如果pci_enable_msi函数可以获得多个irq号,那么在capric_probe函数中,可以使用多个中断服务程序,其中DMA写完成、读完成和错误处理分别使用三个中断服务例程,而不必使用capric_r32函数读取INT_REG寄存器。在Linux系统中,将pci_enable_msi函数改写为支持多个irq号并不困难。对于许多PCIe设备,这种改写是必须的,因为RC从PCIe设备中读取寄存器的代价是非常昂贵的。