ACPI 一些备忘

有时候查看 ACPI 时候,为了熟悉他的逻辑,需要学习一些 ACPI 语法,这里是关于 ACPI 语法的备忘录。

本备忘均从 《Advanced Configuration and Power Interface Specification》 查阅,并使用 Google 翻译得来,本人英语极渣故此不确保翻译准确,如有需要请查阅原版文档。

运算符

LEqual(逻辑等)

语法

LEqual(Source1,Source2)=> Boolean Source1 == Source2 => Boolean

参数

Source1和Source2必须各自求值为整数,字符串或缓冲区。 Source1的数据类型指示所需的Source2类型。 如果需要匹配Source1的类型,则会隐式转换Source2。

描述

如果值相等,则返回True; 否则返回False。 对于整数,执行数字比较。 对于字符串和缓冲区,只有当两个长度相同并且逐字节比较的结果表明完全相等时才返回True。

LOr(逻辑或)

语法

LOr(Source1,Source2)=> Boolean Source1 || Source2 => Boolean

参数

Source1和Source2被计算为整数。

描述

如果任一值不为零,则返回True; 否则返回False。

Decrement (整数递减)

语法

Decrement (Minuend) => Integer Minuend-- => Integer

参数

Minuend应该为一个整数。

描述

此操作将Minuend减1,并将结果存储回Minuend。 等效于 Subtract(Minuend,1,Minuend)。 下溢条件被忽略,结果为Ones。


功能

Sleep (毫秒级 Sleep)

语法

Sleep (数值 毫秒)

参数

Sleep项用于实现长期定时要求。 执行被延迟至少所需的毫秒数。

描述

睡眠的实现是将请求舍入直到由OS支持的最接近的睡眠时间并放弃处理器。(The implementation of Sleep is to round the request up to the closest sleep time supported by the OS and relinquish the processor.)

以上我猜测:使用此方法可以将该设备进入休眠状态(切断电源)

Stall (短时间停止)

语法

Stall (微秒=10^6 秒)

参数

Stall项用于实现短期时序要求。 执行被延迟至少所需的微秒数。

描述

Stall的实现是特定于OS的,但不能放弃对处理器的控制。 因此,超过100微秒的延迟必须使用Sleep而不是Stall。

系统保留方法

_INI (init)

_INI是执行设备特定初始化的设备初始化对象。 此控制方法位于设备对象下,并且仅当OSPM加载描述表时运行。 有一些限制,当这个方法被调用和管理写这个方法的代码。 _INI方法只能访问已被指示为可用的操作区域,由_REG方法定义。 _REG方法在第6.5.4节“_REG(Region)”中描述。此控制方法在运行_ADR,_CID,_HID,_SUN和_UID之前运行。

返回值:没有

在评估_INI对象之前,OSPM评估设备的_STA对象。如果设备不存在_STA对象,则假定设备既存在又起作用。如果_STA方法指示设备存在,OSPM将评估设备的_INI(如果存在_INI方法),并将检查_INI方法的设备的每个子项。如果_STA方法指示设备不存在并且不起作用,则OSPM将不运行_INI,并且不会检查设备的_INI方法的子代。如果_STA对象评估指示设备不存在但是功能正常,OSPM将不会评估_INI对象,但会检查设备的每个子对象的_INI对象(有关此特殊情况的说明,请参阅_STA的说明) 。)如果在表已经加载后设备出现,OSPM将不会评估_INI方法,也不会检查_INI方法的子项。

OSPM根据_STA Present和Functional位执行_INI对象操作,总结在下表中。

Table 6-223 OSPM _INI Object Actions

_STA Present Bit _STA 功能Bit 操作
0 0 不要运行_INI,不要检查设备的子项。
0 1 不要运行_INI,检查设备的子项。
1 0 运行_INI,检查设备子项。
1 1 运行_INI,检查设备子项。

_INI控制方法通常用于将设备切换到传统操作模式。 例如,平台引导固件通常将旧式模式下的CardBus控制器配置为支持传统操作系统。 在使用ACPI操作系统枚举设备之前,必须将CardBus控制器初始化为CardBus模式。 对于这样的系统,供应商可以在CardBus控制器下包括_INI控制方法以将设备切换到CardBus模式。

除了设备初始化之外,OSPM在命名空间初始化的开始时无条件地评估\ _SB命名空间下的_INI对象(如果存在)。

_REG(Region)

OS运行_REG控制方法以通知AML代码操作区域的可用性的改变。当操作区域处理程序不可用时,AML无法访问该区域中的数据字段。 (操作区域写入将被忽略,读取将返回不确定的数据。)

参数:(2)

Arg0 - 包含操作区域地址空间ID的整数

Arg1 - 包含处理程序连接代码的整数

0 - 断开处理程序
1 - 连接处理程序

返回值:
没有

除了下面所示的情况,控制方法必须假设所有操作区域都不可访问,直到执行_REG(RegionSpace,1)方法。一旦对特定操作区域执行了_REG,指示操作区域处理程序就绪,则控制方法可以访问操作区域中的字段。相反,当_REG方法执行未指示操作区域处理程序就绪时,控制方法不得访问操作区域中的字段。

例如,在嵌入式控制器驱动程序就绪之前,控制方法无法访问嵌入式控制器。一旦OSPM运行_REG(EmbeddedControl,1),控制方法就可以访问嵌入式控制器地址空间中的操作区域。此外,如果OSPM执行_REG(EmbeddedControl,0),控制方法必须停止访问嵌入式控制器地址空间中的操作区域。

此规则的例外情况如下:

  1. OSPM必须保证以下操作区域始终可访问:
  • 包含_BBN对象的PCI根总线上的PCI_Config操作区域。
  • SystemIO操作区域。
  • 访问系统地址映射报告接口返回的内存时的SystemMemory操作区域。
  1. OSPM必须通过ECDT中描述的嵌入式控制器访问嵌入式控制器操作区域,然后才能执行任何控制方法。 在OSPM运行_REG(EmbeddedControl,0)后,这些操作区域可能无法访问。将_REG放置在与操作区域声明相同的范围中。 当在该范围中声明的操作区域可供使用时,OS将在给定范围中运行_REG。

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Scope(\_SB.PCI0) {
OperationRegion(OPR1, PCI_Config, ...)
Method(_REG, 2) {...} // OSPM在PCIO操作区域处理程序时执行此操作
// 状态更改
Device(PCI1) {
Method(2) {...}
Device(ETH0) {
OperationRegion(OPR2, PCI_Config, ...)
Method(_REG,2) {...}
}
}
Device(ISA0) {
OperationRegion(OPR3, SystemIO, ...)
Method(_REG, 2) {...} // OSPM在ISAO操作区域处理程序时执行此操作
// 状态更改
Device(EC0) {
Name(_HID, EISAID("PNP0C09"))
OperationRegion(OPR4, EmbeddedControl, ...)
Method(_REG, 2) {...} // OSPM在EC操作区域执行此操作
}
}
}

当PCI0操作区域处理程序就绪时,OSPM将运行在PCI0范围中声明的_REG方法,以指示PCI0空间操作区域访问在PCI0范围内可用(换句话说,允许OPR1访问)。

当ISA0操作处理程序就绪时,OSPM将在ISA0作用域中运行_REG方法,以指示I / O空间操作区域访问在该范围内可用(换句话说,允许OPR3访问)。

最后,当嵌入式控制器操作区域处理程序就绪时,OSPM将在EC0作用域中运行_REG方法,以指示EC空间操作区域访问在EC0范围内可用(换句话说,允许OPR4访问)。

应当注意,一旦主控制器或桥控制器已经用总线编号编程,则PCI配置空间操作区就准备就绪。 PCI1的_REG方法将不会运行,直到PCI-PCI桥已正确配置。同时,操作系统也将运行ETH0的_REG方法,因为它的PCI配置空间也可用。当ETH0设备启动时,OS将再次运行ETH0的_REG方法。此外,当主机控制器或桥控制器被关闭或禁用时,子设备的PCI配置空间操作区域不再​​可用。因此,ETH0的_REG方法将在关闭时运行,并在PCI1关闭时再次运行。

注意:操作系统只运行与使用刚刚可用的操作区域类型的操作区域声明出现在相同范围内的_REG方法。 例如,当加载PCI总线驱动程序时,EC设备中的_REG不会运行,因为在EC下声明的操作区域不使用PCI驱动程序提供的任何操作区域类型(即配置空间,I / O ,和存储器)。