9.12. 模块设备
此可选设备是一个容器对象,在命名空间中充当总线节点。它可以包含作为设备或总线的子对象。模块设备使用 ACPI0004 硬件标识符(HID)声明。
如果模块设备包含 _CRS 对象,则认为该对象所描述的总线具有这些资源可供其子设备使用。如果存在 _CRS 对象,则任何未在模块设备的 _CRS 对象中产生的资源都不得分配给子设备。
在某些模块设备中,提供 _CRS 对象并不可取。例如,考虑一个用于描述附加板卡的模块设备,该板卡包含多个主桥但没有任何共享资源译码逻辑。在这种情况下,主桥可用的资源范围不受驻留在该附加板卡上的任何实体控制,这意味着关联模块设备中的 _CRS 对象并未描述底层硬件的任何真实特性。如果设备包含任何 PCI 主桥设备,则模块设备必须包含 _CRS 对象。
为考虑此类情况,系统设计者可以选择省略模块设备的 _CRS 对象。如果不存在 _CRS 对象,OSPM 将假定该模块设备是一个简单的容器对象,不产生其子设备所消耗的资源。在这种情况下,OSPM 将像对待模块设备父对象的直接子对象那样为这些子设备分配资源。
例如,在模块设备存在 _CRS 对象的情况下,考虑一个包含三个子内存设备的模块设备。如果该模块设备的 _CRS 对象包含从 2 GB 到 6 GB 的内存,则子内存设备只能被分配该范围内的地址。
示例:
Device (\_SB.NOD0) {
Name (_HID, "ACPI0004") // Module device
Name (_UID, 0)
Name (_PRS, ResourceTemplate() {
WordIO (
ResourceProducer,
MinFixed, // \_MIF
MaxFixed,,, // \_MAF
0x0000, // \_GRA
0x0000, // \_MIN
0x7FFF, // \_MAX
0x0, // \_TRA
0x8000) // \_LEN
DWordMemory (
ResourceProducer,, // For Main Memory + PCI
MinNotFixed, // _MIF
MaxNotFixed, // _MAF
Cacheable, // _MEM
ReadWrite, // _RW
0x0FFFFFFF, // _GRA
0x40000000, // _MIN
0x7FFFFFFF, // _MAX
0x0, // _TRA
0x00000000) // _LEN
})
Method (_SRS, 1) { ... }
Method (_CRS, 0) { ... }
Device (MEM0) { // Main Memory (256MB module)
Name (_HID, EISAID("PNP0C80"))
Name (_UID, 0)
Method (_STA, 0) { // If memory not present --> Return(0x00),
// Else if memory is disabled --> Return(0x0D),
// Else --> Return(0x0F)
}
Name (_PRS, ResourceTemplate () {
DWordMemory (,,,,
Cacheable, // _MEM
ReadWrite, // _RW
0x0FFFFFFF, // _GRA
0x40000000, // _MIN
0x7FFFFFFF, // _MAX
0x0, // _TRA
0x10000000) // _LEN
})
Method (_CRS, 0) { ... }
Method (_SRS, 1) { ... }
Method (_DIS, 0) { ... }
}
Device (MEM1) { // Main Memory (512MB module)
Name (_HID, EISAID("PNP0C80"))
Name (_UID, 1)
Method (_STA, 0) { // If memory not present --> Return(0x00)
// Else if memory is disabled --> Return(0x0D)
// Else --> Return(0x0F)
}
Name (_PRS, ResourceTemplate () {
DWordMemory (,,,,
Cacheable, // _MEM
ReadWrite, // _RW
0x1FFFFFFF, // _GRA
0x40000000, // _MIN
0x7FFFFFFF, // _MAX
0x0, // _TRA
0x20000000) // _LEN
})
Method (_CRS, 0) { ... }
Method (_SRS, 1) { ... }
Method (_DIS, 0) { ... }
}
Device (PCI0) { // PCI Root Bridge
Name (_HID, EISAID("PNP0A03"))
Name (_UID, 0)
Name (_BBN, 0x00)
Name (_PRS, ResourceTemplate () {
WordBusNumber (
ResourceProducer,
MinFixed, // _MIF
MaxFixed,, // _MAF
0x00, // _GRA
0x00, // _MIN
0x7F, // _MAX
0x0, // _TRA
0x80) // _LEN
WordIO (
ResourceProducer,
MinFixed, // _MIF
MaxFixed,,, // _MAF
0x0000, // _GRA
0x0000, // _MIN
0x0CF7, // _MAX
0x0, // _TRA
0x0CF8) // _LEN
WordIO (
ResourceProducer,
MinFixed, // _MIF
MaxFixed,,, // _MAF
0x0000, // _GRA
0x0D00, // _MIN
0x7FFF, // _MAX
0x0, // _TRA
0x7300) // _LEN
DWordMemory (
ResourceProducer,,
MinNotFixed, // _MIF
MaxNotFixed, // _MAF
NonCacheable, // _MEM
ReadWrite, // _RW
0x0FFFFFFF, // _GRA
0x40000000, // _MIN
0x7FFFFFFF, // _MAX
0x0, // _TRA
0x00000000) // _LEN
})
Method (_CRS, 0) { ... }
Method (_SRS, 1) { ... }
}
}