6.2.13. _PRT(PCI 路由表)
PCI 中断本质上是非分层的。PCI 中断引脚连接到中断控制器的中断输入。_PRT 对象提供从 PCI 中断引脚到中断控制器中断输入的映射。所有 PCI 根桥下都必须有 _PRT 对象。_PRT 求值为一个包,其中包含一组包列表,每个包描述一个 PCI 中断引脚的映射。
参数:
无
返回值:
一个 Package,包含如下所述的可变长度 PCI 中断映射包列表
注
_PRT 包中的 Address 字段里的 PCI 功能号必须为 0xFFFF,表示“任意”功能号或“所有功能”。
_PRT 映射包具有下表列出的字段。
表 6.16 映射字段
| 字段 | 类型 | 描述 |
|---|---|---|
| Address | DWORD | 设备地址(使用与 _ADR 相同的格式)。 |
| Pin | Byte | 设备的 PCI 引脚编号(0-INTA,1-INTB,2-INTC,3-INTD)。 |
| Source | NamePath Or Byte | 为上述引脚所连接的中断分配中断资源的设备名称。该名称可以是完全限定路径、相对路径,或利用命名空间搜索规则的简单名称段。注:此字段是 NamePath,而不是 String 字面量,这意味着它不应被引号包围。如果此字段是整数常量 Zero(或值为 0 的 Byte),则该中断从全局中断池中分配。 |
| Source Index | DWORD | 指示该中断从 Source 字段所指向设备的资源模板中哪个资源描述符分配而来的索引。如果 Source 字段是值为零的 Byte,则此字段是该引脚所连接到的全局系统中断号。 |
_PRT 有两种使用方式。通常,给定 PCI 中断所连接的中断输入是可配置的。例如,在 8259 中断控制器上,某个给定的 PCI 中断可以被配置为 IRQ 10 或 11。在这种模型中,每个中断在 ACPI 命名空间中都表示为一个 PCI 中断链接设备。
这些对象具有 _PRS、_CRS、_SRS 和 _DIS 控制方法来分配中断。然后,OSPM 处理这些中断时,不是将它们视为中断控制器上的中断输入,而是将其视为 PCI 中断引脚。驱动程序会在 _PRT 中查找设备的引脚,以确定哪些设备对象分配这些中断。为了将 PCI 中断移动到中断控制器上的不同中断输入,OSPM 会对 PCI 中断链接设备使用 _PRS、_CRS、_SRS 和 _DIS 控制方法。
在第二种模型中,PCI 中断被硬连线到中断控制器上的特定中断输入,并且不可配置。在这种情况下,_PRT 中的 Source 字段不引用设备,而是包含值零,Source Index 字段则包含该 PCI 中断硬连线到的全局系统中断。
6.2.13.1. 示例:使用 _PRT 描述 PCI IRQ 路由
以下示例描述了两个 PCI 插槽和一个 PCI 视频芯片。请注意,这两个 PCI 插槽上的中断采用不同的布线方式(barber-poled):
Scope(\_SB) {
Device(LNKA){
Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link
Name(_UID, 1)
Name(_PRS, ResourceTemplate(){
Interrupt(ResourceProducer,...) {10,11} // IRQs 10,11
})
Method(_DIS) {...}
Method(_CRS) {...}
Method(_SRS, 1) {...}
}
Device(LNKB){
Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link
Name(_UID, 2)
Name(_PRS, ResourceTemplate(){
Interrupt(ResourceProducer,...) {11,12} // IRQs 11,12
})
Method(_DIS) {...}
Method(_CRS) {...}
Method(_SRS, 1) {...}
}
Device(LNKC){
Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link
Name(_UID, 3)
Name(_PRS, ResourceTemplate(){
Interrupt(ResourceProducer,...) {12,14} // IRQs 12,14
})
Method(_DIS) {...}
Method(_CRS) {...}
Method(_SRS, 1) {...}
}
Device(LNKD){
Name(_HID, EISAID("PNP0C0F")) // PCI interrupt link
Name(_UID, 4)
Name(_PRS, ResourceTemplate(){
Interrupt(ResourceProducer,...) {10,15} // IRQs 10,15
})
Method(_DIS) {...}
Method(_CRS) {...}
Method(_SRS, 1) {...}
}
Device(PCI0){
...
Name(_PRT, Package{ // A fully qualified pathname can be used, or a
// osimple name segment utilizing the search rules.
Package{0x0004FFFF, 0, \\_SB_.LNKA, 0}, // Slot 1, INTA
Package{0x0004FFFF, 1, \\_SB_.LNKB, 0}, // Slot 1, INTB
Package{0x0004FFFF, 2, \\_SB_.LNKC, 0}, // Slot 1, INTC
Package{0x0004FFFF, 3, \\_SB_.LNKD, 0}, // Slot 1, INTD
Package{0x0005FFFF, 0, LNKB, 0}, // Slot 2, INTA
Package{0x0005FFFF, 1, LNKC, 0}, // Slot 2, INTB
Package{0x0005FFFF, 2, LNKD, 0}, // Slot 2, INTC
Package{0x0005FFFF, 3, LNKA, 0}, // Slot 2, INTD
Package{0x0006FFFF, 0, LNKC, 0} // Video, INTA
})
}
}