首页 理论教育PCIExpressIRQ号的使用方法

PCIExpressIRQ号的使用方法

【摘要】:源代码15-6 PCI插槽使用中断请求信号在ACPI规范中,PCI插槽的中断请求信号的标识符“PNP0C0F”。_PRS描述PCI插槽的中断请求信号可能使用的中断资源,对于PIRQA而言,可能使用的irq号为{3,4,5,7,9,10,11,12}。源代码15-7 acpi_pci_link_init函数acpi_pci_link_init函数调用acpi_bus_register_driver→...→acpi_pci_link_add函数将LPC的PIRQA~H引脚与irq号对应在一起。如果一个处理器系统使能了I/O APIC,acpi_pci_link_init函数的执行结果并不重要,因为PCI设备在执行pci_enable_de-vice函数后,该设备使用的irq号,还将发生变化。

在x86处理器系统中,还有一类特殊的PCI设备,即PCI插槽。PCI插槽无法确定其上的PCI设备如何使用INTA#~INTD#信号,因此必须处理全部中断请求引脚,而在其上的PCI设备有选择地使用这些信号。

PCI插槽使用的中断请求信号将与LPC的PIRQA~F相连,如果处理器系统使能了I/O APIC,LPC的这些中断请求引脚将与IRQ_PIN16~23相连,否则中断控制器8259A将管理这些中断引脚。在ACPI表中含有对这些PCI插槽中断请求信号的描述,这些描述主要针对处理器系统没有使用I/O APIC的处理情况,如源代码15-6所示。

源代码15-6 PCI插槽使用中断请求信号

在ACPI规范中,PCI插槽的中断请求信号的标识符“PNP0C0F”。在这段源代码中LN-KA与LPC的PIRQA引脚对应,这段代码的作用是描述LPC的PIRQA引脚。在ICH中,使用PIRQA_ROUT寄存器描述PIRQA引脚。在以上这段源程序中,“_STA”、“_DIS”、“_CRS”、“_PRS”和“_SRS”可以操作PIRQA_ROUT寄存器,具体含义如下所示。

_STA用来测试当前PIRQA引脚的状态,这段代码判断PIRQA_ROUT寄存器的第7位是否为1,如果为1表示当前PIRQ引脚并没有与8259A相连,此时I/O APIC将管理该引脚,_STA将返回0x09表示PIRQA没有与8259A相连;否则返回0x0B,表示PIRQA与8259A相连。_STA的返回值在ACPI规范中具有明确的定义。

_DIS用来关闭PIRQA引脚与8259A的联系,即使用I/O APIC管理该引脚。_DIS的作用是将PIRQA_ROUT寄存器的第7位置1。

_CRS用来获得当前资源的描述,对于PIRQA引脚而言,这段描述表示PIRQA引脚使用“低电平有效的共享中断请求”,随后通过PIRQ[A]_ROUT寄存器的最高位判断,该中断信号是由8259A中断控制器还是APIC中断控制器接管,最后将IRQW根据PIRQ[A]_ROUT寄存器的IRQ Routing字段赋值,IRQ Routing字段可以使用的资源在{3,4,5,7,9,10,11,12}集合中。

_PRS描述PCI插槽的中断请求信号可能使用的中断资源,对于PIRQA而言,可能使用的irq号为{3,4,5,7,9,10,11,12}。这些irq号由x86处理器系统规定,这些irq号与ISA总线兼容,如果一个系统使用了I/O APIC,这些规定将不再有效。

在Linux系统中,acpi_pci_link_init函数处理PCI插槽的中断请求,该函数在./drivers/acpi/pci_link.c文件中,其实现如源代码15-7所示。

源代码15-7 acpi_pci_link_init函数

acpi_pci_link_init函数调用acpi_bus_register_driver→...→acpi_pci_link_add函数将LPC的PIRQA~H引脚与irq号对应在一起。acpi_pci_link_add函数的执行过程较为简单,首先该函数调用acpi_pci_link_get_possible函数,运行_PRS代码获得{3,4,5,7,9,10,11,12}这个集合;之后调用acpi_pci_link_get_current函数,运行_CRS代码并从{3,4,5,7,9,10,11,12}集合中获得irq号。acpi_pci_link_init函数执行完毕后,Linux系统将显示以下信息。(www.chuimin.cn)

ACPI:PCI Interrupt Link[LNKA](IRQs 3457910*11 12)

ACPI:PCI Interrupt Link[LNKB](IRQs 34579*1011 12)

ACPI:PCI Interrupt Link[LNKC](IRQs 3457910*11 12)

ACPI:PCI Interrupt Link[LNKD](IRQs 3457910*11 12)

ACPI:PCI Interrupt Link[LNKE](IRQs 3457*91011 12)

ACPI:PCI Interrupt Link[LNKF](IRQs 34579*1011 12)

ACPI:PCI Interrupt Link[LNKG](IRQs 3457*91011 12)

ACPI:PCI Interrupt Link[LNKH](IRQs 3457910*11 12)

其中LNKA使用IRQ11,LNKB使用IRQ10,并以此类推。如果一个处理器系统使能了I/O APIC,acpi_pci_link_init函数的执行结果并不重要,因为PCI设备在执行pci_enable_de-vice函数后,该设备使用的irq号,还将发生变化。

目前Linux x86系统在大多数情况下,都会使能I/O APIC,在这种情况下,即便不执行acpi_pci_link_add函数对系统也没有什么影响,也正是基于这个考虑,本节对acpi_pci_link_init函数并不做深入研究。