首页 理论教育PCIExpress中断路由解析

PCIExpress中断路由解析

【摘要】:I/O APIC最终使用REDIR_TBL表,将来自输入引脚的中断请求发送至Local APIC,并由CPU进一步处理这个中断请求。然而直接使用PCIe总线提供的标准方法会带来一些问题。图15-2 PCI Message中断路由如上图所示,PCIe设备使用的INTx中断请求都最终使用I/O APIC的IRQ_PIN16引脚,从而造成了这个引脚所申请的中断过于密集,因此采用这种中断路由方法并不合理。值得注意的是,每一个HOST主桥和每一条PCI总线都含有一个中断路由表。

在多数x86处理器系统中,PCI设备的INTA~D#四个中断请求信号与LPC接口提供的外部引脚PIRQA~D#相连,之后PIRQA~D#与I/O APIC的中断请求信号IRQ_PIN16~19#相连。如果PCIe设备没有使用MSI中断请求机制,而是使用了Legacy INTx方式[24]模拟INTA~D#信号时,这些Assert INTx和Deassert INTx消息也由Chipset处理,并由Chipset将这些消息转换为一根硬件引脚,然后将这个硬件引脚与I/O APIC的中断输入引脚相连。其连接关系如图15-1所示。I/O APIC最终使用REDIR_TBL表,将来自输入引脚的中断请求发送至Local APIC,并由CPU进一步处理这个中断请求。

978-7-111-29822-9-Part03-67.jpg

图15-1 I/O APIC如何处理PCI设备的中断请求

本书并不关心I/O APIC如何使用APIC Message将中断消息传递给Local APIC,而重点关注PCI和PCIe设备使用的中断信号与I/O APIC输入引脚IRQ_PIN16~19的连接关系。如图15-1所示,LPC的PIRQA~D#分别与IRQ_PIN16~19对应,但是PCI设备的INTA~D#与PIRQA~D#的连接关系并不是唯一的,图15-1所示的PCI设备与中断控制器连接方法只是其中一种连接方法。

而无论硬件采用何种连接结构,系统软件都需要能够正确识别是哪个PCI设备发出的中断请求,为此系统软件使用PCI中断路由表(PCI Interrupt Routing Table)记录PCI设备使用的INTA~D#与I/O APIC中断输入引脚IRQ16~19的对应关系。

如果在x86处理器系统中存在Switch,而这个Switch的每一个端口都相当于一个虚拟PCI桥,此时该Switch的下游端口连接的PCIe设备,在使用PCI Message INTx消息提交中断请求时,虚拟PCI桥可能将其转换为其他PCI Message INTx消息。在虚拟PCI桥中,Primary总线和Secondary总线PCI Message INTx消息的对应关系如表15-1所示。

表15-1 虚拟PCI桥Primary总线与Secondary总线间INTx消息间的映射关系

978-7-111-29822-9-Part03-68.jpg

PCIe设备发送的PCI Message INTx消息首先到达虚拟PCI桥的Secondary总线,之后虚拟PCI桥根据PCIe设备的设备号将这些PCI Message INTx消息转换为Primary总线合适的虚拟中断信号。如设备号为1的PCIe设备使用PCI Message INTA消息进行中断请求时,该消息在通过虚拟PCI桥后,将被转换为PCI Message INTB消息,然后继续传递该消息报文,最终PCI Message INTx消息将到达RC,并由RC将该消息报文转换为虚拟中断信号INTx,并与I/O APIC的中断请求引脚IRQ_PIN16~19相连。(www.chuimin.cn)

然而直接使用PCIe总线提供的标准方法会带来一些问题。因为一条PCIe链路只能挂接一个EP,这个EP的设备号通常为0,而这些设备使用的虚拟中断信号多为INTA#,因此这些PCIe设备通过Switch的虚拟PCI-to-PCI桥进行中断路由后,将使用虚拟中断信号INTA#,并与I/O APIC的IRQ_PIN16引脚相连,并不会使用其他IRQ_PIN引脚,这造成了IRQ_PIN16的负载过重。其连接拓扑结构如图15-2所示。

978-7-111-29822-9-Part03-69.jpg

图15-2 PCI Message中断路由

如上图所示,PCIe设备使用的INTx中断请求都最终使用I/O APIC的IRQ_PIN16引脚,从而造成了这个引脚所申请的中断过于密集,因此采用这种中断路由方法并不合理。为此Intel在5000系列的Chipset中使用了Interrupt Swizzling技术将这些来自PCIe设备的中断请求平均分配到I/O APIC的IRQ_PIN16~19引脚中。

在图15-2中,Chipset设置了一个INTSWZCTRL寄存器,通过这些寄存器可以将PCIe设备提交的中断请求均衡地发送至I/O APIC中。如果一个EP对应的INTSWZCTRL位为0,则该设备的INTA#将与IRQ_PIN16相连;如果为1,将与IRQ_PIN17相连,并以此类推,最终实现中断请求的负载均衡。

在一个x86处理器系统中,PCI设备或者PCIe设备使用的中断信号INTA~D#与I/O A-PIC的IRQ_PIN16~19之间的对应关系并不明确,各个厂商完全可以按照需要定制其映射关系。这为系统软件的设计制造了不小的困难。为此BIOS为系统软件提供了一个PCI中断路由表,存放这个映射关系,ACPI规范将这个中断路由表存放在DSDT中。

值得注意的是,每一个HOST主桥和每一条PCI总线都含有一个中断路由表。在讲述PCI中断路由表之前,我们简要回顾Linux系统如何为PCI设备分配中断向量。