PCI IRQ Routing
1. Why IRQ Routing
在计算机发展的历史中,很多技术的出现都是为了解决当前所面临的问题而产生和发展出来的,PCI IRQ Routing也不例外,随着计算机系统的功能需求的增加,越来越多的PCI/PCIE设备被加入到系统中来,可是PIC mode下却只有15 个IRQ可供使用(即使是APIC,目前也只是有24个INTIN),而且在早期device都是直接拉线到8259 IRQ,所以一旦确定就没法改变,没有灵活性。于是中断共享就是这种情况下解决这一问题的一个方法(当然其他的方法如使用MSI,SIRQ等也都可以实现中断的复用),可是中断共享了以后又会有新的问题出现 那就是如何分配这些中断的使用 才能够达到负载均衡(Loading Banlance),上述的这些问题就使得PCI IRQ Routing应运而生了。
2. How to Routing
1. Routing for Internal Device
新的chipset为了Internal Device Interrupt Routing有更大的灵活性,在chipset内部加入了以下几个新的register 为方便SBIOS去配置;这几个register分别是D**IP(Intertupt Pin Register)用于设定对应的device所使用的Interupt Pin;D**IR(Interrupt Router Register)用于设定Interrupt Pin所使用的Interrupt Router(PIRQA#-H#);PIRQ_ROUT (Routing Control Register),用于设定PCI Device Interrupt Pin INTA#-H# 连接到具体PIC controller的IRQ*上,在8259 PIC Mode下SBIOS需要去设置PIRQ_ROUT的register 用于指定具体的IRQ;APIC Mode PIRQ_ROUT则是固定的连接到APIC INTIN pin上,PIRQA#-H#分别连接到INTIN16-INT23。比如我们想配置Device31 Function2 也就是Sata Controller 1的IRQ Routing 是使用INTA# PIRQA# 最终接到PIC 的IRQ5,那么我们需要做的配置将会如下图所示:
2. Routing for PCIE Root Ports
PCIE Root Ports扮演的是一个P2P bridge的角色,Root Ports自身产生的Intterupts的处理方式和Internal Devices处理方式一样;Root Ports所接入的设备所产生的Intterupts,则会有Root Ports转发给上一级的Root Complex去处理。为了Intterupt Sharing更加的均衡合理, 在转发给Root Complex之前这些来自Downstream PCIE Devices产生的Intterupt将会被chipset内部的称之为swizzling的一个机制处理过之后再丢给Root Complex,这个部分就是完全的HW机制,它的基本原理就是将来自Downstream PCIE Devices INTA#=H# 产生的中断请求 再转化一遍,比如接在Root Ports 2上的INTA#将会被转成INTB# 然后再丢给上层的Root Complex。经过Swizzling之后,INTA#-H# 会被分别连接到PIRQA#-H#.
3. Routing for PCI Expansion Slots
PCI Expansion Slots通常是指通过PNP Bridge扩展出来的PCI 插槽(slots),在这些slots上可以接入PCI Device。这些PCI Expansion Slots的 IRQ Routing和PCIE Root Ports非常接近,主要的区别可能就是swizzling的部分需要HW自己去拉,实现的原理和chipset 内置的swizzling应该是类似的。最终PCI Slot上的device经过swizzling之后 ,INTA#-H#会被分别连接到PIRQA#-H#.
3. Reporting IRQ Routing to OS
SBIOS将PCI IRQ Routing