9.20.6. 热插拔支持
本节描述 ACPI 名称空间中 NVDIMM 内存热插拔的表示方式。NVDR 设备是 NVDIMM 根设备,NVD1 和 NVD2 是 NVDIMM 设备,MEM0 是对应于 NVD1 和 NVD2 设备的内存模块设备。NVDR 设备下的 _FIT 方法返回所有 NFIT 条目,包括热添加的设备。
Device (NVDR) // Root device
{
Name (_HID, "ACPI0012")
Method (_STA) {...}
Method (_FIT) {...}
Method (_DSM, ...) {
...
}
Device (NVD1) // NVDIMM1
{
Name(_ADR, h1) // where h1 is NFIT Device Handle for this NVDIMM1
Method (_DSM, ...) {
...
}
}
Device (NVD2) // NVDIMM2
{
Name(_ADR, h2) // where h2 is NFIT Device Handle for this NVDIMM2
Method (_DSM, ...) {
...
}
}
}
Device (MEM0) // Memory module
{
Name (_HID, EISAID ("PNP0C80"))
Method (_STA) {...}
Method (_CRS) {...}
}
Scope (\_GPE)
{
Method (_L00) {
Notify (\_SB.NVDR, 0x80) // Notify to NVDIMM root device
Notify (\_SB.MEM0, 1) // Device Check to Memory Module
}
}
热插拔的内存通过具有 PNPID 为 PNP0C80 的 ACPI 名称空间设备向 OS 指示。由热插拔 NVDIMM 创建的 NFIT 条目通过带有 ACPI0012 的 ACPI 名称空间设备进行传达。
NVDIMM 热添加流程:
在 NVDIMM 热添加之前,相应的 ACPI 名称空间设备 NVD1、NVD2 从 _ADR 对象返回一个地址(NFIT 设备句柄),该地址与 NFIT 中存在的任何条目(无论是静态的还是来自 _FIT 的)都不匹配,这表明相应的 NVDIMM 不存在。此外,ACPI 名称空间设备 MEM0 返回 _STA 状态 0,表示这些设备不存在、未启用且不工作。
在热添加时:
a. 向 NVDR 发送 Notify 0x80,以使 NVDIMM 总线驱动程序枚举根层级下的所有设备
b. NVDIMM 总线驱动程序对 NVDR 设备下的 _FIT 方法求值,并识别当前存在的 NVDIMM 设备的变化(通过识别新添加的 NFIT 设备句柄)。
c. NVDIMM 总线驱动程序现在为 NVD1 和 NVD2 的 _ADR 对象返回的地址找到匹配条目,并加载相应的驱动程序。
d. 向 MEM0 发送 Notify 设备检查,以导致设备重新枚举,从而使内存管理器将 _CRS 范围添加到内存池中。
- MEM0 现在将报告所有当前已创建并变为可见的内存范围。