第四章 ACPI硬件规范... 2
4.1 Hardware-Reduced ACPI 3
4.1.1 Hardware-Reduced事件... 3
4.1.1.1 GPIO提示事件或中断提示事件... 3
4.1.1.2基于中断的唤醒事件... 4
4.2 Fixed Hardware编程模型... 4
4.3通用硬件编程模型... 4
4.4图例... 6
4.5寄存器位符号... 7
4.6 ACPI硬件型号... 7
4.6.1硬件预留位... 11
4.6.2硬件忽略位... 11
4.6.3硬件只写位... 11
4.6.4跨设备依赖关系... 11
4.6.4.1例一:相关设备干扰... 11
4.6.4.2例二:设备不相关干扰... 11
4.7 ACPI硬件特性... 12
4.8 ACPI寄存器模型... 13
4.8.1 ACPI Register Summary. 16
4.8.1.1 PM1事件寄存器... 17
4.8.1.2 PM1控制寄存器... 17
4.8.1.3 PM2控制寄存器... 17
4.8.1.4 PM定时器寄存器... 18
4.8.1.5处理器控制块(P_BLK) 18
4.8.1.6通用事件寄存器... 18
4.8.2Fixed Hardware特性... 18
4.8.3电源管理定时器... 18
4.8.3.1控制台按钮... 19
4.8.3.1.1电源按钮... 20
4.8.3.1.1.1固定电源按钮... 20
4.8.3.1.1.2控制方法电源按钮... 20
4.8.3.1.1.3电源按钮覆盖... 22
4.8.3.1.2睡眠按钮... 22
4.8.3.1.2.1修复硬件休眠按钮... 23
4.8.3.1.2.2控制方法休眠按钮... 23
4.8.3.2睡眠/唤醒控制... 24
4.8.3.3实时时钟告警... 25
4.8.3.4 Legacy/ACPI选择和SCI中断... 27
4.8.3.5处理器控制... 28
4.8.4Fixed Hardware寄存器... 29
4.8.4.1 PM1事件分组... 29
4.8.4.1.1 PM1状态寄存器... 29
4.8.4.1.2 PM1Enable寄存器... 31
4.8.4.2 PM1控制分组... 32
4.8.4.2.1 PM1控制寄存器... 32
4.8.4.3 Power Management Timer (PM_TMR)告警解释... 33
4.8.4.4 PM2控制(PM2_CNT) 34
4.8.4.5处理器寄存器块(P_BLK) 35
4.8.4.5.1处理器控制(P_CNT): 32. 35
4.8.4.5.2处理器LVL2寄存器(P_LVL2) 35
4.8.4.5.3处理器LVL3寄存器(P_LVL3): 8. 36
4.8.4.6重置注册... 36
4.8.4.7睡眠控制和状态寄存器... 36
4.8.5通用硬件寄存器... 37
4.8.5.1通用事件注册块... 39
4.8.5.1.1通用事件0注册块... 39
4.8.5.1.1.1通用事件0状态寄存器... 39
4.8.5.1.1.2通用事件0启用注册... 39
4.8.5.1.2通用事件1注册块... 40
4.8.5.1.2.1通用事件1状态寄存器... 40
4.8.5.1.2.2通用事件1启用注册... 40
4.8.5.2通用设备示例... 40
4.8.5.2.1盖开关... 41
4.8.5.2.2嵌入式控制器... 42
4.8.5.2.3风扇... 43
第四章 ACPI硬件规范
ACPI定义了标准接口机制,允许ACPI兼容的操作系统控制ACPI兼容的硬件平台并与之通信。这些接口机制是可选的(参见下面的“Hardware-Reduced ACPI”)。但是,如果实现了ACPI硬件规范,平台必须符合本节的要求。
这一章用来介绍ACPI的硬件特性。
ACPI将“硬件”定义为编程模型及其行为。ACPI努力保持现有传统编程模型的大部分相同;然而,为了满足某些特性的目标,指定的特性必须遵循特定的寻址和编程方案。属于这一类的硬件被称为“固定的”。
尽管ACPI努力最小化这些更改,但硬件工程师应该仔细阅读本节,以理解将仅传统硬件模型转换为ACPI/传统硬件模型或仅ACPI硬件模型所需的更改。
ACPI将硬件分为两类:Fixed Hardware和通用硬件。属于固定类别的硬件符合ACPI的编程和行为规范。属于通用类别的硬件在实现方面具有很大程度的灵活性。
4.1 Hardware-Reduced ACPI
对于某些类型的系统,ACPI硬件规范可能是不够的。例子包括带有最新处理器的无传统的、基于uefi的平台,以及那些实现移动平台架构的平台。对于这样的平台,定义了一种减少硬件的ACPI模式。在这个定义下,ACPI Fixed Hardware接口没有实现,取而代之的是使用它所支持的许多特性的软件替代品。但是请注意,减少硬件的ACPI并不打算支持目前可以构建的所有可能的ACPI系统。相反,它打算引入新的系统,从一开始就被设计为HW-reduced。如果平台不能在没有ACPI HW规范的情况下工作,则应该使用ACPI HW规范。具体来说,HW-reduced定义不支持以下功能:
•全局锁,SMI_CMD, ACPI Enable和ACPI Disable。精简的ACPI系统始终以ACPI模式启动,不支持与其他异步运行环境(如UEFI Runtime Services或System Management mode)共享硬件资源。
•总线主加载和仲裁禁用。不支持依赖于操作系统使用这些位元来跨处理器休眠状态保持缓存一致性的系统。
•不支持gpe块设备。
需要上述特性的平台必须实现ACPI硬件规范。
为硬件简化ACPI定义设计的平台必须实现修订5或更大版本的固定ACPI描述符表,并且必须在Flags字段中设置HW_REDUCED_ACPI标志。
注:FFH允许并适用于完整ACPI和HW-reduced ACPI实现。
4.1.1 Hardware-Reduced事件
减少了HW的ACPI平台需要替代ACPI HW规范中支持的一些特性,而这些特性目前还不存在。有两个领域需要这样的替代方案:ACPI平台事件模型和系统及设备唤醒。
4.1.1.1 GPIO提示事件或中断提示事件
通用输入/输出(GPIO)硬件可用于信令平台事件。GPIO HW是GPE模型的一般化,是许多应用程序使用的共享硬件资源。连接资源一节描述了对GPIO的ACPI支持。ACPI 6.1引入了通过中断发出事件信号的功能。有关更多细节,请参阅中断信号ACPI事件。
基于GPIO的事件信令是通过GPIO中断连接提供的,GPIO中断连接描述了到GPIO控制器和引脚的连接,并通过ACPI事件信息命名空间对象(_AEI)映射到ACPI事件处理机制。OSPM处理_AEI中列出的GPIO中断连接和处理SCI中断完全一样:它执行与特定事件相关的Event Method。要运行的方法的名称由GPIO中断连接资源中包含的引脚信息决定。详情请参阅GPIO信号的ACPI事件。
GPIO信号的事件也可以是唤醒事件,就像传统ACPI平台上的GPE事件一样。通过使用的GPIO中断连接资源的属性来指定唤醒事件。设备可以使用_PRW来管理唤醒事件,如_PRW(唤醒电源资源)所述。
基于中断的事件信令遵循类似的方法,声明一个通用事件设备(GED),它反过来描述与事件生成相关的所有中断。中断在_CRS对象中列出。当一个中断被触发,OSPM将执行在GED对象中声明的事件方法(_EVT),并指定中断标识符作为参数。通过这种方式,中断可以与特定的平台事件相关联。
4.1.1.2基于中断的唤醒事件
HW-reduced ACPI平台上的唤醒事件总是由到达处理器的中断引起的。因此,从休眠或低功耗空闲状态唤醒系统或从低功耗状态唤醒设备有两个要求。首先,中断线必须具有唤醒能力。能够唤醒的中断被设计成能够从低功耗状态发送到处理器。这意味着它还必须使处理器和任何需要的平台硬件启动,以便中断服务例程可以运行。其次,在进入低功耗状态之前,或者在OSPM将系统进入休眠或低功耗空闲状态之前,操作系统驱动程序必须启用中断。
能够唤醒的中断在其扩展中断或GPIO中断连接资源描述符中被指定为这样的中断。
4.2 Fixed Hardware编程模型
由于将传统硬件迁移到固定类别所需的更改,ACPI限制了Fixed Hardware指定的特性。Fixed Hardware特性的定义标准如下:
•性能敏感特性
•驱动在唤醒时需要的功能
•支持灾难性操作系统软件故障恢复的功能
ACPI定义了用于Fixed Hardware的基于寄存器的接口。CPU时钟控制和电源管理定时器被定义为Fixed Hardware,以减少访问该硬件的性能影响,这将导致更快地降低热条件或延长电池寿命。例如,如果允许这个逻辑驻留在PCI配置空间中,那么将调用多个驱动程序层来访问这个地址空间。这将花费很长时间,并且会对系统的功耗(当试图进入低功耗状态时)或事件的准确性(当试图获取时间戳值时)产生不利影响。
通过对Fixed Hardware的访问,可以实现对尾流进程的控制,而不需要加载整个操作系统。例如,如果需要访问PCI配置空间,则使用枚举器使用的所有驱动程序加载总线枚举器。在Fixed Hardware地址中定义这些接口,使OSPM可以在没有任何其他驱动程序帮助的情况下通信,允许OSPM在决定是继续加载整个操作系统还是让它回到休眠状态之前收集信息。
如果操作系统的某些元素出现故障,那么OSPM可以访问不需要驱动程序支持的地址空间。在这种情况下,OSPM将尝试接受固定的电源按钮请求,将系统转换到G2状态。当OSPM事件处理程序不再能够响应电源按钮事件时,电源按钮覆盖特性提供了一种备份机制,可以无条件地将系统切换到软关闭状态。
4.3通用硬件编程模型
尽管Fixed Hardware编程模型要求在特定地址位置定义硬件寄存器,但通用硬件编程模型允许硬件寄存器驻留在大多数地址空间,并为系统原始设备制造商在硬件中实现特定功能提供了很大程度的灵活性。OSPM直接访问Fixed Hardware寄存器,但依赖OEM提供的ACPI机器语言(AML)代码访问通用硬件寄存器。
AML代码允许OEM为OSPM提供控制通用硬件特性的控制和事件逻辑的方法。
标题为“ACPI源语言参考”的章节描述了ACPI源语言(ASL)——一种原始设备制造商用来创建AML的编程语言。ASL语言提供了许多常见的面向对象编程语言中的操作符,但它已经过优化,以支持平台电源管理和配置硬件的描述。一个ASL编译器将ASL源代码转换为AML,这是一个非常紧凑的机器语言,ACPI AML代码解释器执行。
AML做了两件事:
•从OSPM中抽象硬件
•缓冲来自不同操作系统实现的OEM代码
ACPI的目标之一是允许OEM“增值”硬件在ACPI配置中基本保持不变。增值硬件的一个特点是它的实现方式各不相同。为了使OSPM能够在不同类型的增值硬件上正确执行,ACPI定义了更高级别的“控制方法”,它调用这些方法来执行操作。OEM提供与控制方法相关联的AML代码,由OSPM执行。通过提供AML代码,通用硬件几乎可以采用任何形式。
ACPI的另一个重要目标是提供操作系统独立性。要做到这一点,OEM AML代码必须在任何ACPI兼容的操作系统下执行相同的操作。ACPI通过将AML代码解释器作为OSPM的一部分来实现这一点。这允许OSPM处理每个特定操作系统的同步和阻塞问题。
通用特征模型如下图所示。在这个模型中,通用特性是通过AML代码向OSPM描述的。该描述采用位于ACPI命名空间中的对象的形式,该名称空间与它要为其增值的硬件相关联。
Fig. 4.1: Generic Hardware Feature Model
作为通用硬件控制特性的一个例子,一个平台可能被设计成IDE HDD的D3状态具有增值硬件来移除驱动器上的电源。IDE驱动器将在其名称空间中有一个AML PowerResource对象的引用(该对象控制增加的电源平面),并与该对象相关联的是OSPM调用的控制方法,以控制驱动器的D3状态:
•_PS0:一种将IDE驱动器转换为D0状态的控制方法。
•_PS3:将IDE驱动器按顺序排列到D3状态的控制方法。
•_PSC:返回IDE驱动器状态(开或关)的控制方法。
该对象下的控制方法在OSPM和硬件之间提供了一个抽象层。OSPM了解如何通过其定义的PowerResource对象控制电源平面(打开或关闭电源平面或获取电源平面的状态),而硬件具有特定于平台上的AML代码(包含在适当的控制方法中)来执行所需的功能。在本例中,平台将通过编写并放置AML代码来关闭_PS3控制方法中的硬件,从而向ACPI操作系统描述其硬件。这将启用以下顺序:
当OSPM决定将IDE驱动器置于D3状态时,它调用IDE驱动程序,并告诉它将驱动器置于D3状态(此时驱动程序保存设备的上下文)。
当IDE驱动返回控制时,OSPM将驱动器置于D3状态。
OSPM找到与HDD关联的对象,然后在该对象中找到与D3状态关联的任何AML代码。
OSPM执行适当的_PS3控制方法来控制增值的“通用”硬件,使HDD处于更低的电源状态。
作为通用事件特性的一个例子,平台可能具有中继功能。在本例中,它将希望生成一个事件。注意,所有ACPI事件都会生成一个SCI,它可以映射到任何可共享的系统中断。在中继的情况下,当检测到中继或用户请求取消对系统的中继时,将生成事件。这将启用以下顺序:
OSPM响应SCI并调用与该通用事件关联的AML代码事件处理程序。ACPI表将硬件事件与AML代码事件处理程序关联起来。
AML代码事件处理程序收集适当的信息,然后执行AML Notify命令,向OSPM指示某个特定总线需要重新枚举。
下面几节描述ACPI的固定和通用硬件特性集。这些章节使读者能够理解以下内容:
•当平台类的设计指南要求ACPI特性、概念或接口时,哪些硬件寄存器是必需的或可选的
•如何设计Fixed Hardware功能
•如何设计通用的硬件特性
•ACPI事件模型
4.4图例
硬件部分使用简化的逻辑图表示硬件的某些方面是如何实现的。逻辑图中使用下列符号来表示程序位:
- 只写控制位
- 启用、控制或状态位
- 粘性状态位
- 查询值
带有倒“V”的半圆形符号表示只写控制位。这个位的行为是当它被设置时生成它的控制函数。读到只写位被软件视为忽略(位的位置被屏蔽并忽略)。
带“X”的圆形符号代表一个编程位。作为启用或控制位,软件设置或清除该位将导致该位被读取为设置或清除(除非另有说明)。作为状态位,它直接表示信号的值。
方形符号表示粘性状态位。粘性状态位由硬件信号的电平(而不是边缘)设置(高电平或低电平)。只有在软件向其位位置写入一个“1”时,位才会被清除。
矩形符号表示来自嵌入式控制器的查询值。这是嵌入式控制器在响应SCI事件的查询命令时返回给系统软件的值。查询值与计划在嵌入式控制器事件上执行的事件控制方法相关联。
4.5寄存器位符号
在本节中,有一些逻辑图引用寄存器中的位。这些图使用了一种易于引用寄存器名称和位位置的符号。记法如下:
Registername位
Registername包含在本规范中出现的寄存器名称
位包含位位置的基于零的十进制值
例如,SLP_EN位位于PM1x_CNT寄存器位13中,可以用图表表示法表示为:
SLP_EN
PM1x_CNT.13
4.6 ACPI硬件型号
ACPI硬件模型被定义为允许OSPM通过操作定义的接口在各种全局系统状态(G0-G3)之间对平台进行转换,如下图所示。当第一次上电时,平台发现自己处于全局系统状态G3或“Mechanical Off”。这种状态被定义为一个功耗非常接近于零的状态——电源插头已经被移除;然而,实时时钟设备仍然是靠电池运行的。任何电源故障都会进入G3状态,定义为意外掉电或用户主动掉电。
根据平台支持的情况,G3状态会转换为G0工作状态或Legacy状态。如果平台是一个仅ACPI平台,那么它允许通过总是返回状态位SCI_EN set(1)直接引导到G0工作状态(更多信息,参见Legacy/ACPI Select and the SCI Interrupt)。如果平台同时支持传统操作和ACPI操作(这对于支持非ACPI操作系统是必要的),那么它将始终引导到传统状态(通过返回SCI_EN clear(0)来说明)。在这两种情况下,从G3状态转换都需要完全启动OSPM。
Legacy系统状态是非ACPI操作系统执行时的全局状态。只有当硬件同时支持Legacy和ACPI模式时,才可以从G3的“Mechanical Off”、G2的“Soft Off”或G0的“Working”状态进入此状态。在Legacy状态下,ACPI事件模型被禁用(不生成SCIs),硬件使用传统电源管理和配置机制。当处于Legacy状态时,兼容ACPI的操作系统可以通过执行ACPI模式请求请求转换到G0工作状态。OSPM通过将ACPI_ENABLE值写入SMI_CMD来执行此转换,SMI_CMD向硬件生成一个事件,以将平台转换为ACPI模式。当硬件完成转换时,它设置SCI_EN位并将控制返回给OSPM。当在G0“工作状态”时,OSPM可以通过将ACPI_DISABLE值写入SMI_CMD寄存器请求转换到Legacy模式,这将导致硬件进入Legacy模式并将SCI_EN位重置为LOW(更多信息,请参阅Legacy/ACPI Select和SCI Interrupt)。
G0“Working”状态表示ACPI系统的正常运行环境。在这种状态下,不同的设备在各自的电源状态(D0、D1、D2、D3hot或D3)之间动态切换,处理器在各自的电源状态(C0、C1、C2或C3)之间动态切换。在这种状态下,OSPM可以做出一个策略决策,将平台置于系统G1“休眠”状态。平台一次只能进入单一睡眠状态(称为全局G1状态);然而,硬件可以提供多达四种系统休眠状态,它们有不同的功率和退出延迟,由S1、S2、S3或S4状态表示。当OSPM决定进入睡眠状态时,它会选择硬件支持的最合适的睡眠状态(操作系统策略检查哪些设备启用了唤醒事件以及这些设备支持哪些睡眠状态)。OSPM通过启用适当的唤醒事件,然后用所需的睡眠状态对SLP_TYPx字段编程,然后设置SLP_ENx位来启动睡眠转换。然后系统将进入睡眠状态;当一个启用的唤醒事件发生时,它会将系统转换回工作状态(有关更多信息,请参阅Waking and Sleeping)。
当G0处于“工作”状态时,另一个全局状态转换选项是进入G2“软关闭”或G3“机械关闭”状态。这些转换代表一种受控的转换,允许OSPM以有序的方式关闭系统(卸载应用程序、关闭文件等)。这些类型转换的策略可以与ACPI电源按钮相关联,当按下该按钮时,将向电源按钮驱动程序生成一个事件。当OSPM完成对电源丢失的操作环境的准备后,它会弹出一个提示用户删除电源的提示,以进入G3的“机械关闭”状态,或者它会通过将S5“软off”系统状态的值写入SLP_TYPx寄存器并设置SLP_EN位来启动G2“软off”转换。
G1休眠状态由硬件支持的四种可能的休眠状态表示。每种睡眠状态都有不同的能量和唤醒潜伏期特征。睡眠状态不同于工作状态,因为用户的操作环境处于低功耗状态,直到被启用的唤醒事件唤醒。在这种状态下不执行任何工作,也就是说,处理器不执行指令。每个系统休眠状态都要求谁负责系统上下文和唤醒序列(有关更多信息,请参阅唤醒和睡眠)。
G2“soft off”状态是指操作系统主动关闭系统。这个状态的初始化类似于睡眠状态转换(将SLP_TYPx设置为S5值,并设置SLP_EN位开始序列)。退出G2软关机状态需要重新启动系统。在这种情况下,仅ACPI系统将直接重新进入G0状态(硬件返回SCI_EN位集),而ACPI/Legacy系统将转换到Legacy状态(SCI_EN位是清晰的)。
Fig. 4.2: Global States and Their Transitions
ACPI体系结构定义了硬件生成事件和控制逻辑以实现此行为模型的机制。事件用于通知OSPM需要执行某些操作,控制逻辑用于引起某些状态转换。ACPI定义的事件是“硬件”或“中断”事件。硬件事件是导致硬件无条件执行某些操作的事件。例如,任何唤醒事件都会将系统从休眠状态(全局G1状态中的S1、S2、S3和S4)转换到G0工作状态(参见示例休眠状态)。
中断事件导致事件处理程序(AML代码或ACPI感知驱动程序)的执行,这允许软件基于事件做出策略决策。对于ACPI固定特性事件,OSPM或支持ACPI的驱动程序充当事件处理程序。对于一般逻辑事件,OSPM将安排与事件相关的原始设备制造商提供的AML控制方法的执行。
对于传统系统,事件通常生成os透明中断,如系统管理中断或SMI。对于ACPI系统,中断事件需要生成一个os可见的可共享中断;边缘式中断不起作用。希望同时支持传统操作系统和ACPI系统的硬件平台支持在ACPI和传统模型之间切换时在SMIs和scsi之间重新映射中断事件的方法。下面的框图说明了这一点。
此示例逻辑说明了支持传统事件模型和ACPI事件模型的示例平台的事件模型。此示例平台支持许多与电源相关的外部事件(电源按钮、LID开/关、热、环指示)或即插即用相关的事件(dock、状态更改)。逻辑代表了三种不同类型的事件:
操作系统透明的事件
这些事件表示没有OS支持的特定于OEM的功能,并使用可以以OS透明方式操作的软件(即SMIs)。
中断事件
这些事件表示ACPI兼容操作系统支持的特性,但传统操作系统不支持这些特性。当加载传统OS时,这些事件被映射到透明中断(本例中为SMI#),而在ACPI模式下,它们被映射到OS可见的可共享中断(SCI#)。此逻辑通过解码器路由事件逻辑来表示,当SCI_EN位被清除时,解码器将事件路由到SMI#仲裁器,或当SCI_EN位被设置时路由到SCI#仲裁器。
Fig. 4.3: Example Event Structure for a Legacy/ACPI Compatible Event Model
硬件事件
这些事件被用来触发硬件来启动一些硬件序列,如唤醒、重置或无条件地使系统进入睡眠状态。
在本例中,传统电源管理事件逻辑用于根据设备空闲计时器、设备陷阱和全局备用计时器来确定设备/系统活动或空闲。旧的电源管理模型使用空闲计时器来决定设备什么时候应该处于低功耗状态,因为它是空闲的——也就是说,设备在编程的时间内没有被访问。设备告警用于标识低功耗设备是否被OSPM访问。全局备用计时器用于确定什么时候应该允许系统进入休眠状态,因为它是空闲的——也就是说,用户界面没有被用于编程的时间量。
在ACPI模式下,OSPM不使用这些传统的空闲定时器、trap监控器和全局备用定时器。这项工作在ACPI兼容的操作系统中由不同的软件结构来处理。例如,ACPIccompatible OS的驱动模型负责将其设备置于低功耗状态(D1、D2、D3hot或D3),并在需要时将其转换回On状态(D0)。OSPM负责通过分析系统(使用PM Timer)和通过其操作结构环境(操作结构环境因操作系统而异)获得的其他知识来确定系统何时处于空闲状态。当系统进入ACPI模式时,这些事件不再产生SMIs,由OSPM处理。这些事件是通过一些OEM专有方法禁用的。
另一方面,ACPI和传统模型(对接、电源按钮等)之间共享许多硬件事件,当启用ACPI时,这种类型的中断事件将更改为SCI事件。ACPI操作系统将生成一个请求到平台运行时固件以进入ACPI模式。固件设置SCI_EN位来指示系统已经成功进入ACPI模式,所以这是一个方便的机制来映射这些事件所需的中断(SMI或SCI)(如图4-3所示)。
ACPI体系结构指定了一些传统硬件模型中没有的专用硬件:电源管理计时器(PM timer)。这是ACPI OS用来分析系统活动的免费运行计时器。此定时器的频率在本规范中明确定义,必须按照描述实现。
尽管ACPI体系结构按原样重用了大多数传统硬件,但它对编程模型生成的位置和方式施加了限制。如果使用,所有Fixed Hardware特性都按照本规范实现,这样OSPM就可以直接访问Fixed Hardware特性寄存器。
一般硬件特性是由位于ACPI名称空间中的ACPI控制方法操作的。这些接口可以非常灵活;但是,它们的使用受到定义的ACPI控制方法的限制(有关更多信息,请参阅ACPI定义的设备和特定于设备的对象)。通用硬件通常控制电源平面、缓冲区隔离和设备复位资源。此外,“子”中断状态位可以通过通用硬件接口访问;然而,它们在GP_STS寄存器中有一个“父”中断状态位。ACPI定义了八个可以被通用硬件实现访问的地址空间。这些包括:
- System I/O space 系统io空间
- System memory space 系统内存空间
- PCI configuration space PCI配置空间
- Embedded controller space 嵌入式控制器空间
- System Management Bus (SMBus) space系统管理总线(SMBus)空间
- CMOS 互补金属氧化物半导体
- PCI BAR Target
- IPMI space
- Platform Communication Channel
一般的硬件电源管理特性可以通过访问位于这些地址空间中的空闲I/O端口来实现。ACPI规范定义了与这些关联的地址空间通信所需的可选嵌入式控制器和SMBus接口。
4.6.1硬件预留位
ACPI硬件寄存器的设计使保留位总是返回0,对它们的数据写入没有副作用。OSPM实现必须将0写入启用寄存器和状态寄存器中的保留位,并保留控制寄存器中的位,这些位将被忽略。
4.6.2硬件忽略位
ACPI硬件寄存器被设计成忽略位是未定义的,并且被软件忽略。硬件忽略的位可以返回0或1。当软件读取带有忽略位的寄存器时,它会在对结果进行操作之前屏蔽掉忽略位。当软件写入带有被忽略的位域的寄存器时,它会保留被忽略的位域。
4.6.3硬件只写位
ACPI硬件定义了一些只写控制位。这些位通过软件在其位上写一个1来激活。读到只写位的位置会产生未定义的结果。在读取寄存器的写位时,软件屏蔽掉所有写位。
4.6.4跨设备依赖关系
跨设备依赖是指对一个设备的操作会干扰其他不相关设备的操作,或者允许其他不相关设备干扰该设备的行为。这种情况是不可支持的,可能会导致平台故障。ACPI不支持跨设备依赖关系,并建议设备设计时不要表现出这种行为。下面两个例子描述了跨设备依赖关系:
4.6.4.1例一:相关设备干扰
这个例子说明了一个跨设备依赖关系,其中一个设备干扰了其他不相关设备的正常操作。设备A有一个依赖关系,当它被配置时,它阻塞了所有通常针对设备B的访问。因此,当设备A被配置时,设备B的设备驱动程序不能访问设备B;因此,它需要与设备a的驱动程序同步访问。高性能的多线程操作系统无法在不严重影响性能的情况下执行这种同步。
为了进一步说明这一点,假设设备A是一个串行端口,设备B是一个硬盘控制器。如果这些设备演示了这种行为,那么当一个软件驱动配置串口时,访问硬盘驱动器需要阻塞。只有当硬盘驱动程序将对磁盘控制器的访问与串行驱动程序同步时,才能做到这一点。如果没有这种同步,在配置串口时,硬盘数据将丢失。
4.6.4.2例二:设备不相关干扰
这个例子演示了一个跨设备依赖关系,其中一个设备演示了允许其他不相关设备干扰其正常操作的行为。设备A显示了一个编程行为,它需要原子的背对背写访问来成功地写到它的寄存器;如果任何其他平台访问能够在背靠背访问之间中断,那么对设备A的写入是不成功的。如果设备A驱动程序不能生成对其设备的原子背靠背访问,那么它依赖于软件与系统中其他驱动程序同步访问它的设备;那么就创建了一个设备交叉依赖,平台很容易出现设备A故障。
4.7 ACPI硬件特性
介绍ACPI接口定义的不同硬件特性。这些特征分为以下几类:
•Fixed Hardware特性
•通用硬件特性
Fixed Hardware特性驻留在ACPI编程模型所描述位置的许多ACPI定义的地址空间中。通用硬件特性驻留在四个地址空间(系统I/O、系统内存、PCI配置、嵌入式控制器或串行设备I/O空间)中的一个,并通过AML控制方法的声明由ACPI命名空间描述。
Fixed Hardware特性对其实现有精确的定义。尽管许多Fixed Hardware特性是可选的,但如果实现它们,就必须按照描述的方式实现,因为OSPM操作Fixed Hardware设备的寄存器并期望定义的行为。功能Fixed Hardware提供了通用硬件编程模型中描述的Fixed Hardware特征接口的功能等效物
通用硬件特性的实现是灵活的。此逻辑由OEM提供的AML代码控制(有关更多信息,请参阅ACPI软件编程模型),可以编写这些代码以支持各种各样的硬件。此外,ACPI还提供专门的控制方法,为专门的设备提供功能。例如,可以使用Notify命令从通用硬件事件处理程序(控制方法)通知OSPM发生了对接或热事件。理解本节和该规范的ACPI软件编程模型将使设计人员很好地理解如何设计硬件以充分利用ACPI兼容的操作系统。
请注意,列出的通用特性只是为了演示,ACPI规范可以支持许多未列出的硬件类型。
Table 4.1: Feature-Programming Model Summary
Feature Name | Description | Programming Model |
Power Management Timer | 24-bit or 32-bit free running timer. | Fixed Hardware Feature Control Logic |
Power Button | User pushes button to switch the system between the working and sleeping/soft-off states. | Fixed Hardware Event and Control Logic or Generic Hardware Event and Logic |
Sleep Button | User pushes button to switch the system between the working and sleeping/soft-off states. | Fixed Hardware Event and Control Logic or Generic Hardware Event and Logic |
Power Button Over- ride | User sequence (press the power button for 4 seconds) to turn off a hung system. |
|
Real Time Clock Alarm | Programmed time to wake the system. | Optional Fixed Hardware* |
Sleep/Wake Control Logic | Logic used to transition the system between the sleeping and working states. | Fixed Hardware Control and Event Logic |
Embedded Con- troller Interface | ACPI Embedded Controller protocol and interface, as described in the ACPI Embedded Controller Interface Specification. | Generic Hardware Event Logic, must reside in the general-purpose register block |
Legacy/ACPI Select | Status bit that indicates the system is using the legacy or ACPI power management model (SCI_EN). | Fixed Hardware Control Logic |
Lid switch | Button used to indicate whether the system’s lid is open or closed (mobile systems only) | Generic Hardware Event Feature |
C1 Power State | Processor instruction to place the processor into a low-power state. | Processor ISA |
C2 Power Control | Logic to place the processor into a C2 power state. | Fixed Hardware Control Logic |
C3 Power Control | Logic to place the processor into a C3 power state. | Fixed Hardware Control Logic |
Thermal Control | Logic to generate thermal events at specified trip points. | Generic Hardware Event and Control Logic (See description of thermal logic in Thermal Management Concepts) |
Device Power Management | Control logic for switching between different device power states. | Generic Hardware control logic |
AC Adapter | Logic to detect the insertion and removal of the AC adapter. | Generic Hardware event logic |
Docking/device insertion and removal | Logic to detect device insertion and removal events. | Generic Hardware event logic |
*需要RTC唤醒报警;Fixed Hardware特性状态位是可选的。
4.8 ACPI寄存器模型
ACPI硬件驻留在六个地址空间之一:
•系统I / O
•系统内存
•PCI配置
•SMBUS
•嵌入式控制器
•Fixed Hardware功能
不同的实现将导致不同的地址空间被用于不同的功能。ACPI规范由Fixed Hardware寄存器和通用硬件寄存器组成。实现ACPI定义的接口需要Fixed Hardware寄存器。由增值硬件生成的任何事件都需要通用硬件寄存器。
ACPI定义了寄存器块。ACPI兼容的系统提供一个ACPI表(FADT,在启动时内置在内存中),该表包含一个指向OSPM使用的不同Fixed Hardware寄存器块的指针列表。这些寄存器中的位具有为给定寄存器块定义的属性。ACPI定义的寄存器类型有:
•控制寄存器
如果一个寄存器块是状态/启用类型,那么它将包含一个带有状态位的寄存器和一个对应的带有启用位的寄存器。状态位和启用位有一个需要遵循的精确的实现定义(除非另有说明),如下图所示:
Fig. 4.4: Block Diagram of a Status/Enable Cell
注意,状态位(在本例中由硬件设置的事件输入)只能通过软件向其位位置写入1来清除。同样,启用位对状态位的设置或重置没有影响;它只确定SET状态位是否将生成一个“事件输出”,如果它的启用位被设置,则在设置时生成一个SCI。
ACPI还定义了寄存器分组。一个寄存器组由两个寄存器块组成,两个指针指向两个不同的寄存器块,其中寄存器组中的每个位位置是固定的,不能改变。一个寄存器组中的位具有固定的位位置,可以在两个寄存器块之间分割。这允许一个寄存器组中的位驻留在一个或两个寄存器块中,促进了将几个不同芯片中的位映射到同一个寄存器的能力,从而提供了具有单个寄存器组位结构的编程模型。
OSPM将一个寄存器分组视为一个单独的寄存器;但位于多个地方。为了读取一个寄存器分组,OSPM将读取“a”寄存器块,然后读取“B”寄存器块,然后在逻辑上“OR”这两个结果(SLP_TYP字段是这个规则的一个例外)。寄存器块中的保留位或未使用位对于读总是返回0,对于写没有副作用(这是必需的)。
对于每个寄存器分组,SLP_TYPx字段可以是不同的。各自的休眠对象\_Sx包含一个SLP_TYPa和一个SLP_TYPb字段。也就是说,该对象返回一个包,其中包含两个0-7的整数值。OSPM总是将SLP_TYPa值写入“A”寄存器块,然后将字段中的SLP_TYPb值写入“B”寄存器块。所有其他位将被写入相同的值。另外,OSPM不会读取SLP_TYPx值,而是将其丢弃。
Fig. 4.5: Example Fixed Hardware Feature Register Grouping
作为一个例子,上面的图代表了一个由寄存器块a和寄存器块b组成的寄存器组。“a”和“d”是在寄存器块b中实现的,并且寄存器块a对这些位返回一个零。位“b”,“c”和“e”在寄存器块A中实现,寄存器块b对这些位返回一个零。所有保留位或忽略位返回它们定义的ACPI值。
当访问这个寄存器组时,OSPM必须先读a寄存器块,然后读b寄存器块,然后对这两个寄存器做逻辑或,然后对结果进行操作。
写入到该寄存器组时,OSPM先将需要的值写入到A寄存器组,再将相同的值写入到B寄存器组。
ACPI定义了以下Fixed Hardware寄存器块。每个寄存器块从FADT获得一个单独的指针。这些地址由OEM设置为静态资源,因此它们永远不会被更改——OSPM不能重新映射ACPI资源。定义了以下寄存器块:
Fig. 4.6: Register Blocks versus Register Groupings
PM1 EVT分组由PM1a_EVT和PM1b_EVT寄存器块组成,其中包含Fixed Hardware特征事件位。每个事件寄存器块(如果实现了)包含两个寄存器:一个状态寄存器和一个启用寄存器。每个寄存器组都有一个定义的不能更改的位位置;但是,位可以在寄存器块(A或B)中实现。事件的A和B寄存器块允许芯片组将事件划分为两个或多个芯片。对于读操作,OSPM将生成对关联的a和B寄存器的读操作,或这两个值,然后对这个结果进行操作。对于写操作,OSPM将值写入两个寄存器块中关联的寄存器。因此,在实现事件寄存器时需要遵循两个规则:
•保留位或未实现位总是返回零(控制或启用)。
•写入保留位或未实现位没有影响。
PM1 CNT组包含Fixed Hardware特征控制位,由PM1a_CNT_BLK和PM1b_CNT_BLK寄存器块组成。每个寄存器块与单个控制寄存器相关联。每个寄存器组都有一个定义的不能更改的位位置;然而,位可以在寄存器块(A或B)中实现。当实现CNT寄存器时,有两个规则要遵循:
•保留位或未实现位总是返回零(控制或启用)。
•写入保留位或未实现位没有影响。
PM2_CNT_BLK寄存器块目前包含一个用于仲裁禁用功能的位。通用事件寄存器包含通用特性的事件编程模型。与固定事件一样,所有通用事件都会生成SCI。一般的事件状态位可以驻留在任何地方;但是,顶级通用事件驻留在一个通用寄存器块中。任何不在通用目的寄存器空间中的通用特性事件状态都被视为子状态位或兄弟状态位,其父状态位在通用目的事件寄存器空间中。请注意,在达到GPE事件状态之前,可能有N级通用事件。
通用的事件寄存器由两个寄存器块描述:GPE0_BLK或GPE1_BLK。每个寄存器块分别从FADT中指向。每个寄存器块进一步分解为两个寄存器:GPEx_STS和GPEx_EN。通用事件寄存器中的状态寄存器和启用寄存器遵循Fixed Hardware事件寄存器的事件模型。
4.8.1 ACPI Register Summary
下表总结了ACPI寄存器:
Table 4.2: PM1 Event Registers
Register | Size (Bytes) | Address (relative to register block) |
PM1a_STS | PM1_EVT_LEN/2 | <PM1a_EVT_BLK> |
PM1a_EN | PM1_EVT_LEN/2 | <PM1a_EVT_BLK>+PM1_EVT_LEN/2 |
PM1b_STS | PM1_EVT_LEN/2 | <PM1b_EVT_BLK> |
PM1b_EN | PM1_EVT_LEN/2 | <PM1b_EVT_BLK>+PM1_EVT_LEN/2 |
Table 4.3: PM1 Control Registers
Register | Size (Bytes) | Address (relative to register block) |
PM1_CNTa | PM1_CNT_LEN | <PM1a_CNT_BLK> |
PM1_CNTb | PM1_CNT_LEN | <<PM1b_CNT_BLK> |
Table 4.4: PM2 Control Register
Register | Size (Bytes) | Address (relative to register block) |
PM2_CNT | PM2_CNT_LEN | <PM2_CNT_BLK> |
Table 4.5: PM Timer Register
Register | Size (Bytes) | Address (relative to register block) |
PM_TMR | PM_TMR_LEN | <PM_TMR_BLK> |
Table 4.6: Processor Control Registers
Register | Size (Bytes) | Address (relative to register block) |
P_CNT | 4 | Either <P_BLK> or specified by the PTC object - see Processor Throttling Controls |
P_LVL2 | 1 | <P_BLK>+4h |
P_LVL3 | 1 | <P_BLK>+5h |
Table 4.7: General-Purpose Event Registers
Register | Size (Bytes) | Address (relative to register block) |
GPE0_STS | GPE0_LEN/2 | <GPE0_BLK> |
GPE0_EN | GPE0_LEN/2 | <GPE0_BLK>+GPE0_LEN/2 |
GPE1_STS | GPE1_LEN/2 | <GPE1_BLK> |
GPE1_EN | GPE1_LEN/2 | <GPE1_BLK>+GPE1_LEN/2 |
4.8.1.1 PM1事件寄存器
PM1事件寄存器组包含两个寄存器块:当特定于类的平台设计指南需要以下ACPI接口类别时,PM1a_EVT_BLK是一个必需的寄存器块:
•电源管理定时器控制/状态
•处理器电源状态控制/状态
•全局锁相关接口
•电源或休眠按钮(固定寄存器接口)
•系统电源状态控制(睡眠/唤醒控制)
PM1b_EVT_BLK是一个可选的寄存器块。每个寄存器块在固定ACPI表(FADT)中有一个唯一的32位指针,以允许PM1事件位在两个芯片之间被分区。如果不支持PM1b_EVT_BLK,它的指针在FADT中包含一个零值。
PM1事件分组中的每个寄存器块包含两个需要具有相同大小的寄存器:
PM1x_STS和PM1x_EN(其中x可以是a或b)。寄存器的长度是可变的,由FADT中的PM1_EVT_LEN字段描述,该字段以字节表示寄存器块的总长度。因此,如果长度为“4”,这表示每个寄存器包含两个字节的I/O空间。PM1事件寄存器块的最小大小为4字节。
4.8.1.2 PM1控制寄存器
PM1控制寄存器组包含两个寄存器块:当特定类的平台设计指南需要以下ACPI接口类别时,PM1a_CNT_BLK是一个必需的寄存器块:
SCI /SMI路由控制/电源管理和通用事件的状态
•处理器电源状态控制/状态
•全局锁相关接口
•系统电源状态控制(睡眠/唤醒控制)
PM1b_CNT_BLK是一个可选的寄存器块。每个寄存器块在固定ACPI表(FADT)中有一个唯一的32位指针,以允许PM1事件位在两个芯片之间被分区。如果PM1b_CNT_BLK不被支持,它的指针在FADT中包含一个零值。
PM1控制组中的每个寄存器块包含一个寄存器:PM1x_CNT。寄存器的长度是可变的,由FADT中的PM1_CNT_LEN字段描述,该字段以字节表示寄存器块的总长度。PM1控制寄存器块的最小大小必须为2字节。
4.8.1.3 PM2控制寄存器
PM2控制寄存器包含在PM2_CNT_BLK寄存器块中。FADT包含该寄存器块(PM2_CNT_LEN)的长度变量,该变量等于PM2_CNT寄存器(该寄存器块中唯一的寄存器)的字节大小。这个寄存器块是可选的,如果不支持,它的块指针和长度包含一个零值。
4.8.1.4 PM定时器寄存器
PM定时器寄存器包含在PM_TMR_BLK寄存器块中。它是一个可选的寄存器块,当特定于类的平台设计指南要求电源管理定时器控制/状态ACPI接口类别时,必须实现它。
如果已定义,则该寄存器块包含返回电源管理计时器的运行值的寄存器。FADT还包含这个寄存器块(PM_TMR_LEN)的长度变量,该变量等于PM_TMR寄存器(该寄存器块中唯一的寄存器)的字节大小。
4.8.1.5处理器控制块(P_BLK)
系统中每个处理器都有一个可选的处理器控制寄存器块。由于这是一个同构特性,所有处理器必须具有相同级别的支持。ACPI操作系统将恢复到处理器控制块支持的最低公分母。处理器控制块包含处理器控制寄存器(p_cnt -一个32位的性能控制配置寄存器),以及P_LVL2和P_LVL3 CPU睡眠状态控制寄存器。32位P_CNT寄存器控制该处理器的处理器时钟逻辑的行为,P_LVL2寄存器用于将CPU置于C2状态,P_LVL3寄存器用于将处理器置于C3状态。
4.8.1.6通用事件寄存器
通用事件寄存器包含所有通用特性的根级别事件。为了提高分区根事件的灵活性,ACPI提供了两个不同的通用事件块:GPE0_BLK和GPE1_BLK。它们是单独的寄存器块,而不是一个寄存器分组,因为不需要维护正交的位排列。此外,每个寄存器块在FADT中包含自己的长度变量,其中GPE0_LEN和GPE1_LEN表示每个寄存器块的字节长度。
每个寄存器块包含两个相同长度的寄存器:GPEx_STS和GPEx_EN(其中x为0或1)。GPE0_STS和GPE0_EN寄存器的长度等于GPE0_LEN的一半。GPE1_STS和GPE1_EN寄存器的长度等于GPE1_LEN的一半。如果不支持泛型寄存器块,那么FADT表中对应的块指针和块长度值都为零。GPE0_LEN和GPE1_LEN的大小不需要相同。
4.8.2Fixed Hardware特性
介绍ACPI定义的Fixed Hardware特性。
4.8.3电源管理定时器
ACPI规范定义了一个可选的电源管理计时器,它提供了一个精确的时间值,系统软件可以使用该时间值来测量和分析系统空闲(以及其他任务)。电源管理定时器在系统工作(G0)状态下提供精确的时间功能。为了允许软件扩展定时器的位数,电源管理定时器在定时器的最后一位改变(从0到1或1到0)时产生一个中断。ACPI支持24位或32位电源管理定时器。PM Timer由OSPM直接访问,其编程模型包含在固定的寄存器空间中。编程模型最多可以被划分到三个不同的寄存器块中。事件位包含在PM1_EVT寄存器组中,该寄存器组有两个寄存器块,定时器值可以通过PM_TMR_BLK寄存器块访问。电源管理定时器的框图如下图所示。
Fig. 4.7: Power Management Timer
电源管理定时器是一个24位或32位固定速率自由运行计数定时器,运行3.579545 MHz时钟。ACPI操作系统通过检测FADT来确定PM Timer是32位还是24位定时器。PM Timer的编程模型由事件逻辑和计数器值的读端口组成。事件逻辑由事件状态和启用位组成。状态位在定时器的最后一位(第23位或第31位)从set到clear或clear到set的任何时候被设置。如果设置了TMR_EN位,那么TMR_STS的设置将在PM1_EVT寄存器分组中生成一个ACPI事件(在图中称为PMTMR_PME)。事件逻辑仅用于模拟较大的计时器。
OSPM使用只读的TMR_VAL字段(在PM TMR寄存器分组中)读取定时器的当前值。
OSPM从不假设TMR_VAL字段的初始值;相反,它在加载OSPM时读取一个初始的TMR_VAL,并假定定时器正在计数。允许在系统过渡出工作(G0/S0)状态时停止Timer。唯一的定时器复位要求是定时器在工作状态下起作用。
PM定时器的编程模型被实现为一个Fixed Hardware功能,以提高读取定时器的准确性。
4.8.3.1控制台按钮
ACPI定义用户发起的事件,请求OSPM在G0工作状态和G1休眠、G2软关闭和G3机械关闭状态之间转换平台。ACPI还定义了一种推荐机制,可以无条件地将平台从挂起的G0工作状态过渡到G2软关闭状态。
ACPI操作系统使用电源按钮事件来确定用户何时出现。因此,这些ACPI事件与ACPI规范中的按钮相关联。
ACPI规范支持两种按钮模型:
•一个为睡眠和进入软关闭状态生成事件的单按钮模型。该功能可以通过OSPM界面进行配置。
•一个双按钮模型,其中电源按钮产生一个软关闭过渡请求和睡眠按钮产生一个睡眠过渡请求。按钮的类型意味着按钮的功能。
这些按钮事件的控制要么通过Fixed Hardware编程模型,要么通过通用的硬件编程模型(基于控制方法)。Fixed Hardware编程模型的优点是,OSPM可以在任何时候访问按钮,包括系统崩溃时。在一个带有Fixed Hardware电源按钮的崩溃系统中,OSPM可以“最好”地确定是否按下了电源按钮,从而将系统过渡到软关闭状态,因为它不需要AML解释器访问事件位。
4.8.3.1.1电源按钮
电源按钮逻辑可用于两种型号之一:单按钮或双按钮。在单按钮模型中,用户按钮既是用于在G0和G2状态之间转换系统的电源按钮,也是用于在G0和G1状态之间转换系统的睡眠按钮。用户按下按钮的动作由软件策略或用户设置决定。在双按钮模式中,有单独的按钮用于睡眠和电源控制。虽然按钮仍然会产生事件,导致软件采取行动,但按钮的功能现在是专用的:睡眠按钮产生一个睡眠请求到OSPM,电源按钮产生一个唤醒请求。
对电源按钮的支持由PWR_BUTTON标志和电源按钮设备对象的组合表示,如下所示:
Table 4.8: Power Button Support
Indicated Support | PWR_BUTTON Flag | Power Button Device Object |
Fixed hardware power button | Clear | Absent |
Control method power button | Set | Present |
电源按钮还可以无条件地将系统从挂起工作状态过渡到G2软关闭状态。当OSPM事件处理程序不再能够响应电源按钮事件时,电源按钮覆盖特性提供了一种备份机制,可以无条件地将系统切换到软关闭状态。当平台没有机械关闭按钮时,可以使用此功能,后者也可以提供此功能。ACPI定义了保持电源按钮处于活动状态4秒或更长时间将生成电源按钮覆盖事件。
4.8.3.1.1.1固定电源按钮
Fig. 4.8: Fixed Power Button Logic
Fixed Hardware电源按钮在PM1x_EVT_BLK中有其事件编程模型。该逻辑由单个启用位和粘性状态位组成。用户按下电源按钮时,无条件设置电源按钮状态位(PWRBTN_STS)。当系统处于G0状态时,如果按下按钮,设置了电源按钮使能位(PWRBTN_EN),设置了电源按钮状态位(PWRBTN_STS),则生成SCI。OSPM以清除PWRBTN_STS位作为对该事件的响应。电源按钮逻辑提供跳出逻辑,设置按钮按下“edge”时的PWRBTN_STS位。
虽然G1和G2的系统全局状态(S1, S2、S3、S4或S5状态),任何进一步的电源按钮按下按钮按下后,系统进入睡眠状态转换无条件设置电源按钮状态和唤醒系统,无论价值的电源按钮启用。OSPM的响应是清除电源按钮状态位并唤醒系统。
4.8.3.1.1.2控制方法电源按钮
电源按钮编程模型也可以使用通用硬件编程模型。这允许电源按钮驻留在任何通用硬件地址空间(例如,嵌入式控制器),而不是固定空间。如果电源按钮是使用通用硬件实现的,那么OEM需要将电源按钮定义为一个_HID对象值为“PNP0C0C”的设备,然后将该设备标识为OSPM的电源按钮。然后,AML事件处理程序生成Notify命令来通知OSPM电源按钮事件生成。当系统处于工作状态时,按下电源按钮是用户将系统过渡到休眠(G1)或软关闭(G2)状态的请求。在这些情况下,电源按钮事件处理程序使用特定于设备的代码0x80发出Notify命令。这表明OSPM将控制传递给电源按钮驱动程序(PNP0C0C),同时知道正在请求从G0状态转换。当从G1休眠状态中醒来时,AML事件处理程序生成一个代码为0x2的通知命令,以表明它负责唤醒系统。
电源按钮设备需要声明为平台的ACPI命名空间中的设备,并且只需要一个_HID。下面是一个定义示例。
这个例子ASL代码执行如下:
•创建名为“PWRB”的设备,并关联“PNP0C0C”的即插即用标识符(通过_HID对象)。
•即插即用标识符将该设备对象与电源按钮驱动程序关联。
•为控制方法电源按钮的编程模型创建一个操作区域:0x200的系统I/O空间。
•不被访问的字段被写为0。这些状态位在向其位位置写入1时被清除,因此在这种情况下保存将失败。
•在操作区域内为电源按钮状态位(称为PBP)创建一个字段。在这种情况下,电源按钮状态位是通用事件状态位0的子位。设置该位后,由ASL-code负责清除该位(OSPM清除通用状态位)。状态位的地址是0x200.0(地址0x200的第0位)。
•为电源按钮唤醒事件创建一个额外的状态位PBW。这是下一个位,它的物理地址是0x200.1(地址0x200的第1位)。
•为连接到通用事件状态寄存器0的0位的电源按钮生成一个事件处理器。事件处理程序执行以下操作:
•清除硬件中的电源按钮状态位(向其写入1)。
•通过发送电源按钮对象和设备对应的事件指示灯0x80,调用Notify命令通知OSPM事件。
// Define a control method power button Device(\_SB.PWRB) { Name(_HID, EISAID("PNP0C0C")) Name(_PRW, Package(){0, 0x4}) OperationRegion(\PHO, SystemIO, 0x200, 0x1) Field(\PHO, ByteAcc, NoLock, WriteAsZeros) { PBP, 1, // sleep/off request PBW, 1 // wakeup request } } Scope(\_GPE) // Root level event handlers { Method(_L00) { // uses bit 0 of GP0_STS register If (PBP) { PBP = One // clear power button status Notify(\_SB.PWRB, 0x80) // Notify OS of event } If (\PBW) { PBW = One Notify(\_SB.PWRB, 0x2) } } } |
4.8.3.1.1.3电源按钮覆盖
ACPI规范还允许,当系统处于工作状态时,如果用户按电源按钮的时间超过4秒,就会生成一个硬件事件,系统将过渡到软关闭状态。这个硬件事件称为电源按钮覆盖。作为电源按钮覆盖事件的反应,硬件清除电源按钮状态位(PWRBTN_STS)。
4.8.3.1.2睡眠按钮
当使用两个按钮模型时,ACPI支持第二个按钮,当按下该按钮时,将请求OSPM在G0工作状态和G1睡眠状态之间转换平台。对睡眠按钮的支持是通过SLEEP_BUTTON标志和睡眠按钮设备对象的组合来表示的:
Table 4.9: Sleep Button Support
Indicated Support | SLEEP_BUTTON Flag | Sleep Button Device Object |
No sleep button | Set | Absent |
Fixed hardware slee button | Clear | Absent |
Control method sleep button | Set | Present |
4.8.3.1.2.1修复硬件休眠按钮
图4.9:Fixed Hardware休眠按钮逻辑
Fixed Hardware休眠按钮在PM1x_EVT_BLK中有其事件编程模型。该逻辑由单个启用位和粘性状态位组成。当用户按下休眠键时,无条件设置休眠键状态位SLPBTN_STS。此外,当系统处于G0状态时,如果设置了休眠按钮使能位(SLPBTN_EN),并且设置了休眠按钮状态位(SLPBTN_STS,由于按下按钮),则生成SCI。OSPM通过清除SLPBTN_STS位来响应该事件。休眠按钮逻辑提供跳出逻辑,用于设置按钮按下“edge”时的SLPBTN_STS位。
当系统处于睡眠状态(S0、S1、S2、S3或S4状态)时,任何进一步的睡眠按钮按下(在导致系统过渡到睡眠状态的按钮按下之后)都会设置睡眠按钮状态位(SLPBTN_STS),如果设置了SLP_EN位,则会唤醒系统。OSPM的响应是清除休眠按钮状态位并唤醒系统。
4.8.3.1.2.2控制方法休眠按钮
睡眠按钮编程模型也可以使用通用硬件编程模型。这允许睡眠按钮驻留在任何通用硬件地址空间(例如,嵌入式控制器),而不是固定空间。如果休眠按钮是通过通用硬件实现的,那么OEM需要将休眠按钮定义为一个_HID对象值为“PNP0C0E”的设备,然后将该设备标识为休眠按钮给OSPM。然后,AML事件处理程序生成一个Notify命令来通知OSPM生成了一个休眠按钮事件。当处于工作状态时,按下睡眠按钮是用户将系统转换到睡眠(G1)状态的请求。在这些情况下,睡眠按钮事件处理程序使用特定于设备的代码0x80发出Notify命令。这将指示OSPM将控制传递给睡眠按钮驱动程序(PNP0C0E),同时知道用户正在请求从G0状态转换。当从G1休眠状态中唤醒时,AML事件处理程序生成一个代码为0x2的Notify命令,以表明它负责唤醒系统。
睡眠按钮设备需要声明为平台的ACPI命名空间中的设备,并且只需要一个_HID。下面显示了一个示例定义。
AML代码如下所示:
•创建名为“SLPB”的设备,并关联“PNP0C0E”的即插即用标识符(通过_HID对象)。
•即插即用标识符将该设备对象与休眠按钮驱动程序关联。
•为控制方法睡眠按钮的编程模型创建一个操作区域:0x201的系统I/O空间。
•不被访问的字段被写为“1”(这些状态位在它们的位位置写“1”时被清除,因此在这种情况下保留会失败)。
•在操作区域内为睡眠按钮状态位(称为PBP)创建一个字段。在这种情况下,睡眠按钮状态位是通用状态位0的子位。当设置了这个位时,AML代码负责清除它(OSPM清除通用状态位)。状态位的地址是0x201.0(地址0x201的第0位)。
•为睡眠按钮唤醒事件创建一个名为PBW的附加状态位。这是下一个位,它的物理地址是0x201.1(地址0x201的第1位)。
•为连接到通用状态寄存器的0位的睡眠按钮生成一个事件处理器
0. 事件处理程序执行以下操作:
•清除硬件中的睡眠按钮状态位(写入一个“1”)。
•通过调用Notify命令,传递休眠按钮对象和设备相关的事件指示器0x80,通知OSPM该事件。
// Define a control method sleep button Device(\_SB.SLPB) { Name (_HID, EISAID("PNP0C0E")) Name (_PRW, Package(){0x01, 0x04}) OperationRegion (\Boo, SystemIO, 0x201, 0x1) Field (\Boo, ByteAcc, NoLock, WriteAsZeros) { SBP, 1, // sleep request SBW, 1 // wakeup request } } Scope (\_GPE) // Root level event handlers { Method (_L01) // uses bit 1 of GP0_STS register { If (\SBP) { \SBP = One // clear sleep button status Notify(\_SB.SLPB, 0x80) // Notify OS of event } If (\SBW) { \SBW = One Notify(\_SB.SLPB, 0x2) } } } |
4.8.3.2睡眠/唤醒控制
睡眠/唤醒逻辑由以下逻辑组成:将系统按顺序进入低功耗硬件休眠状态(S1-S4)或软关闭状态(S5),并在唤醒事件发生时将系统唤醒回工作状态。请注意,S4BIOS状态是以不同的方式输入的(有关更多信息,请参阅S4BIOS Transition)。
Fig. 4.10: Sleeping/Wake Logic
逻辑是通过两个位域控制的:Sleep Enable (SLP_EN)和Sleep Type (SLP_TYPx)。所需的睡眠或软关闭状态的类型被编程到SLP_TYPx字段中,根据SLP_EN的状态,硬件将系统按顺序进入所定义的睡眠状态。OSPM从静态定义块中定义的\_Sx对象中获取SLP_TYPx字段的值。如果该对象缺失,则OSPM认为硬件不支持该休眠状态。在进入睡眠状态之前,OSPM将读取指定的\_Sx对象,并将该值放入SLP_TYP字段。
此外,ACPI定义了一种故障安全关闭协议,称为“电源按钮覆盖”,它允许用户在系统软件无法恢复系统(系统挂起)的情况下启动关闭序列。ACPI定义了这个序列是由用户按电源按钮超过4秒发起的,在这一点上硬件无条件地将系统排到Off状态。这个逻辑由进入睡眠逻辑的PWRBTN_OR信号表示。
当处于任何睡眠状态(G1)时,启用的“唤醒”事件将导致硬件对系统进行时序控制,使其回到工作状态(G0)。设置SLP_EN/SLP_TYP位字段后,为OSPM“spin-on”提供“Wake Status”位(WAK_STS)。当从S1休眠状态唤醒时,执行控制将立即返回给OSPM,而当从S2-S4状态唤醒时,执行控制将传递给平台引导固件(执行从CPU的重置向量开始)。WAK_STS位提供了一种机制,用于在S1序列中分离OSPM的休眠和唤醒代码。当硬件将系统转换到睡眠状态(这里定义为处理器不再能够执行指令)时,允许任何启用的唤醒事件设置WAK_STS位并将系统转换回(G0状态)。如果系统不支持S1休眠状态,WAK_STS位可以总是返回0。
如果支持不止一个睡眠状态,那么需要睡眠/唤醒逻辑能够在不同的睡眠状态之间动态转换。这是通过唤醒系统来实现的;OSPM将新的休眠状态写入SLP_TYP字段,然后设置SLP_EN位,使系统再次进入休眠状态。
4.8.3.3实时时钟告警
如果实现了RTC (Real Time Clock)告警,则在睡眠状态下必须产生一个硬件唤醒事件。RTC可以被编程来产生警报。启用RTC告警可以在系统处于休眠状态时产生唤醒事件。ACPI提供了额外的硬件来支持OSPM确定RTC是尾流事件的来源:RTC_STS和RTC_EN位。尽管这些位是可选的,但如果支持它们,就必须按照这里描述的方式实现它们。
如果不支持RTC_STS和RTC_EN位,OSPM将尝试识别RTC为可能的尾流源;然而,它可能会错过某些唤醒事件。如果实现了,RTC唤醒功能需要在以下睡眠状态下工作:S1-S3。S4唤醒是可选的,通过FADT中的RTC_S4标志(如果设置,则平台在S4状态下支持RTC唤醒)*来支持。
注:* G2/S5的“软关闭”和G3的“机械关闭”状态不是睡眠状态。在进入G2/S5或G3状态前,系统会关闭RTC_EN位。
当RTC生成唤醒事件时,将设置RTC_STS位。如果设置了RTC_EN位,将产生一个RTC硬件电源管理事件(它将系统从睡眠状态唤醒,如果电池低信号不触发)。
Fig. 4.11: RTC Alarm
RTC唤醒事件状态和使能位是一个可选的Fixed Hardware特性,FADT内的一个标志(FIX_RTC)表示该寄存器位是否将被OSPM使用。如果RTC唤醒事件的状态和使能位是在Fixed Hardware中实现的,则OSPM可以在不加载整个操作系统的情况下判断该RTC是否是唤醒事件的源。这也使平台能够在不消耗GPE位的情况下指示RTC尾流源,如果RTC尾流不是使用Fixed HardwareRTC特性实现的,这将是必需的。如果不支持Fixed Hardware特性事件位,那么OSPM将尝试通过读取RTC的状态字段来确定这一点。如果平台实现了RTCFixed Hardware特性,并且这个硬件消耗了资源,那么可以使用_FIX方法将这些资源与Fixed Hardware关联起来。请参阅_FIX(固定注册资源提供程序),了解详细信息。
OSPM对现有RTC设备(仅支持99年日期和24小时告警)进行了增强。可选扩展提供了以下特性:
DAY_ALRM字段指向一个可选的CMOS RAM位置,它选择一个月内的哪一天产生RTC告警。
MON_ALRM字段指向一个可选的CMOS RAM位置,该位置选择一年中产生RTC告警的月份。
Centenary值CENT字段指向一个可选的CMOS RAM位置,它代表日期(数千年和数百年)的Centenary值。
RTC_STS位可以通过RTC中断(IA-PC体系结构中的IRQ8)来设置。OSPM将确保在休眠前禁用周期性和更新中断源。这允许RTC的中断引脚作为RTC_STS位生成的源。但是请注意,如果RTC中断引脚用于生成RTC_STS,则从S4唤醒时RTC_STS位值可能不准确。如果从S4唤醒时该值是准确的,那么平台应该设置S4_RTC_STS_VALID标志,以便OSPM可以利用RTC_STS信息。
Table 4.10: Alarm Field Decodings within the FADT
Field | Value | Address (Location) in RTC CMOS RAM (Must be Bank 0) |
DAY_ALRM | 8位值,在BCD中表示0x01-0x31天,在二进制中表示0x01-0x1F天。该字段的第6位和第7位被软件视为忽略。初始化RTC,以便当平台固件从传统模式切换到ACPI模式时,该字段包含一个“don’t care”值。不关心值可以是任何未使用的值(不是0x1-0x31 BCD或0x01-0x1F十六进制),RTC将其恢复为24小时警报。 | FADT中的DAY_ALRM字段将包含一个非零值,该值表示RTC的CMOS RAM区域的偏移量,该区域包含日告警值。DAY_ALRM值为0表示不支持日告警特性。 |
MON_ALRM | 8位值,在BCD中表示01-12个月,在二进制中表示0x01-0xC个月。初始化RTC,以便当平台固件从传统模式切换到ACPI模式时,该字段包含一个“不关心”值。一个“不关心”值可以是任何未使用的值(不是1-12 BCD或x01-xC十六进制),RTC恢复到24小时报警和/或31天报警)。 | FADT中的MON_ALRM字段将 包含一个非零值,该值表示RTC的CMOS RAM区域的偏移量,该区域包含月告警值。MON_ALRM值为0表示不支持月告警特性。如果支持月告警,还需要支持日告警功能。 |
CENTURY | 8位BCD或二进制值。这个值表示BCD中日期的千年和百年 (Centenary)变量(本世纪19个,下个世纪20个)或二进制(本世纪x13个,下个世纪x14个)。 | FADT中的CENTURY字段 将包含一个非零值,该值表示RTC的CMOS RAM区域的偏移量,该区域包含该日期的Centenary值。CENTURY字段 的值为零表示该RTC不支持百年值。 |
4.8.3.4 Legacy/ACPI选择和SCI中断
如前所述,产生电源管理事件是为了启动中断或硬件序列。ACPI操作系统使用SCI中断处理程序来响应事件,而传统系统使用某种类型的透明中断处理程序来响应这些事件(即SMI中断处理程序)。ACPI兼容的硬件可以选择同时支持传统和ACPI模式,或者只支持ACPI模式。对于非ACPI兼容的操作系统,需要使用传统硬件来支持这些特性。当ACPI OS加载时,它扫描平台固件表,以确定硬件支持ACPI,然后如果它发现SCI_EN位重置(表示ACPI未启用),就通过SMI命令端口向SMI处理程序发出ACPI激活命令。平台固件通过设置SCI_EN位(这个位也可以用来切换事件机制,如下图所示)来确认切换到电源管理的ACPI模型:
Fig. 4.12: Power Management Events to SMI/SCI Control Logic
中断事件(在传统模式下生成SMIs和ACPI模式下生成SCI的事件)通过一个由SCI_EN位控制的解码器发送。对于传统模式,这个位是重置的,它将中断事件路由到SMI中断逻辑。对于ACPI模式,设置此位,将中断事件路由到SCI中断逻辑。对于不支持传统电源管理模式的ACPI兼容硬件,该位总是返回set(换句话说,该位被连接为读取为“1”并忽略写操作)。
SCI中断被定义为一个可共享中断,并且连接到一个使用可共享协议的OS可见中断。FADT有一个条目,指示SCI中断映射到哪个中断(参见系统描述表头)。
如果ACPI平台同时支持传统模式和ACPI模式,那么它有一个可以生成硬件事件的寄存器(例如,用于IA-PC处理器的SMI)。OSPM使用该寄存器使硬件切换到ACPI模式。在FADT中有三个值,它们表示该端口的地址(SMI_CMD)和为启用ACPI状态(ACPI_ENABLE)和禁用ACPI状态(ACPI_DISABLE)而写入的数据值。
要将ACPI/Legacy平台从Legacy模式转换为ACPI模式,需要执行以下操作:
•ACPI驱动检查SCI_EN位是否为零,是否处于Legacy模式。
•OSPM使用FADT的ACPI_ENABLE字段中的数据向SMI_CMD端口发送一个OUT。
•OSPM轮询SCI_EN位,直到其被采样为SET。
要将ACPI/Legacy平台从ACPI模式转换为Legacy模式,将会发生以下情况:
•ACPI驱动检查SCI_EN位为1,并且处于ACPI模式。
•OSPM使用FADT的ACPI_DISABLE字段中的数据向SMI_CMD端口发送一个OUT。
•OSPM轮询SCI_EN位,直到其被采样为RESET。
只支持ACPI的平台总是返回1表示SCI_EN位。在这种情况下,OSPM跳过了上面提到的Legacy到ACPI的转换。
4.8.3.5处理器控制
ACPI规范定义了几种处理器控制,包括电源状态控制、节流控制和性能状态控制。有关处理器控件的完整描述,请参阅处理器配置和控制。
4.8.4Fixed Hardware寄存器
Fixed Hardware寄存器由OSPM直接操作。以下部分描述了编程模型下的Fixed Hardware特性。OSPM拥有所有Fixed Hardware资源寄存器;这些寄存器不能由AML代码操作。访问寄存器的宽度不超过其寄存器宽度(字节粒度)。
4.8.4.1 PM1事件分组
PM1事件分组有一组位,可以分布在两个不同的寄存器块之间。这使得这些寄存器可以在两个芯片之间进行分区,或者全部放在一个芯片中。虽然位可以在两个寄存器块之间分割(每个寄存器块在FADT中有一个唯一的指针),但位的位置是保持的。带有未实现位的寄存器块(即在另一个寄存器块中实现的位)总是返回0,写操作没有副作用。
4.8.4.1.1 PM1状态寄存器
寄存器位置:<PM1a_EVT_BLK / PM1b_EVT_BLK>系统I/O或内存空间
默认值:00 h
属性:读/写
大小:PM1_EVT_LEN / 2
PM1状态寄存器包含Fixed Hardware特性状态位。位可以在两个寄存器之间分割:PM1a_STS或PM1b_STS。每个寄存器分组可以在不同的32位对齐地址,并由PM1a_EVT_BLK或PM1b_EVT_BLK指向。这些指向寄存器空间的指针的值可以在FADT中找到。对PM1状态寄存器的访问是通过字节或字访问完成的。
对于ACPI/传统系统,当从传统系统过渡到G0工作状态时,这个寄存器在设置SCI_EN位之前被平台固件清除(从而将控制传递给OSPM)。对于只有ACPI平台(SCI_EN总是设置),当从机械关闭(G3)或软关闭状态过渡到G0工作状态时,该寄存器在进入G0工作状态之前被清除。
该寄存器包含在FADT中启用或禁用的可选功能。如果FADT表明该功能不支持作为Fixed Hardware功能,则软件将忽略这些位。
Table 4.11: PM1 Status Registers Fixed Hardware Feature Status Bits
Bit | Name | Description |
0 | TMR_STS | 这是定时器携带状态位。当24/32位计数器的最有效位从清除变为设置或设置为清除时,此位将被设置。当设置TMR_EN和TMR_STS时,将引发中断事件。 |
1-3 | Reserved | Reserved |
4 | BM_STS | 这是总线主状态位。这个位是在系统总线主程序请求系统总线时设置的,并且只能通过在这个位上写一个“1”来清除。注意,这个位反映总线主活动,而不是CPU活动(这个位监视任何总线主,当总线主执行内存事务时,可能导致C3状态下的处理器的不一致缓存)。 |
Bit | Name | Description |
5 | GBL_STS | 这个位是在生成SCI时设置的,因为平台运行时固件需要SCI处理程序的注意。平台运行时固件将有一个控制位(在其地址空间的某个地方),它将引发一个SCI并设置这个位。这个位的设置是为了响应平台运行时固件释放对全局锁的控制,并且看到了挂起位的设置。 |
6-7 | Reserved | Reserved. These bits always return a value of zero. |
8 | PWRBTN_STS | 这个可选位是在按下电源按钮时设置的。在系统工作状态下,当PWRBTN_EN和PWRBTN_STS同时设置时,触发中断事件。在休眠或软关闭状态下,当按下电源按钮时(不管PWRBTN_EN位的设置如何)会产生一个唤醒事件。这个位只能由硬件设置,并且只能通过软件向这个位位置写入一个“1”来复位。ACPI定义了一种可选机制,用于将从G0工作状态停止工作的系统无条件过渡到G2软关闭状态,称为电源按钮覆盖。如果电源按钮处于激活状态超过4秒,该位将被硬件清除,系统将无条件切换到G2/S5软关闭状态。支持电源按钮是由FADT复位(0)中的PWR_BUTTON标志指示的。如果设置了PWR_BUTTON标志或ACPI Namespace中有电源按钮设备对象,则该bit字段将被OSPM忽略。如果电源按钮是引起尾流(从S1-S4状态)的原因,则在将控制返回给OSPM之前设置该位。 |
9 | SLPBTN_STS | 这个可选位是在按下休眠按钮时设置的。在系统工作状态下,当SLPBTN_EN和SLPBTN_STS同时设置时,触发一个中断事件。在休眠或软关闭状态下,当按下休眠按钮并设置SLPBTN_EN位时,将生成一个唤醒事件。这个位只能由硬件设置,并且只能通过软件向这个位位置写入一个“1”来复位。对睡眠按钮的支持是由正在重置的FADT中的SLP_BUTTON标志指示的(0)。如果设置了SLP_BUTTON标志或ACPI命名空间中存在休眠按钮设备对象,则该bit字段将被OSPM忽略。如果sleep按钮是唤醒的原因(从S1-S4状态),那么在将控制返回给OSPM之前设置该位。 |
10 | RTC_STS | 当RTC产生告警(断言RTC IRQ信号)时设置此可选位。此外,如果设置了RTC_EN位,那么RTC_STS位的设置将产生一个电源管理事件(SCI、SMI或resume事件)。这个位只能由硬件设置,并且只能通过软件向这个位位置写入一个' 1 '来复位。如果RTC是引起尾流(从S1-S3状态)的原因,则在将控制返回给OSPM之前设置该位。如果在FADT中设置了RTC_S4标志,并且RTC是导致S4状态唤醒的原因),那么在将控制返回给OSPM之前设置该位。 |
11 | Ignore | This bit field is ignored by software. |
12-14 | Reserved | Reserved. These bits always return a value of zero. |
Bit | Name | Description |
14 | PCIEXP_WAKE_STS | 这个位对于实现PCI Express的芯片组是可选的。该位由硬件设置,以指示系统因PCI Expressv唤醒事件而唤醒。PCI Express唤醒事件定义为:PCI Express WAKE# pin处于活动状态,一个或多个PCI Express端口处于信标状态,或在根端口收到PCI Express PME消息。只有当其中一个事件导致系统从非S0系统电源状态过渡到S0系统电源状态时,才应该设置此位。该位的设置与PCIEXP_WAKE_DIS位的状态无关。软件写一个1来清除这个位。如果#销之后仍然活跃在写,一个或多个PCI Express港口在灯塔状态或中外消息收到指示没有清除根端口,然后点仍将活跃levelsensitive(即所有输入到这一点)。注意:该位本身并不引起唤醒事件或阻止进入睡眠状态。因此,如果位是1,系统进入睡眠状态,系统将不会自动唤醒。 |
15 | WAK_STS | 当系统处于睡眠状态并启用唤醒事件时设置此位。设置后,该位系统将过渡到工作状态。这个位是由硬件设置的,只能通过软件向这个位位置写入一个“1”来清除。 |
4.8.4.1.2 PM1Enable寄存器
寄存器位置:<<PM1a_EVT_BLK / PM1b_EVT_BLK> + PM1_EVT_LEN / 2系统I/O或内存空间
默认值:00 h
属性:读/写
大小:PM1_EVT_LEN / 2
PM1使能寄存器包含Fixed Hardware特性使能位。位可以在两个寄存器之间分割:PM1a_EN或PM1b_EN。每个寄存器分组可以在不同的32位对齐地址,并由PM1a_EVT_BLK或PM1b_EVT_BLK指向。这些指向寄存器空间的指针的值可以在FADT中找到。对PM1使能寄存器的访问是通过字节或字访问完成的。
对于ACPI/传统系统,当从传统系统过渡到G0工作状态时,在设置SCI_EN位之前,平台固件会清除启用(从而将控制传递给OSPM)。对于仅ACPI平台(始终设置SCI_EN),当从机械关闭(G3)或软关闭状态过渡到G0工作状态时,该寄存器在进入G0工作状态之前被清除。
该寄存器包含在FADT中启用或禁用的可选功能。如果FADT表示不支持该特性作为Fixed Hardware特性,则软件将启用位视为写入。
Table 4.12: PM1 Enable Registers Fixed Hardware Feature Enable Bits
Bit | Name | Description |
0 | TMR_EN | 这是定时器携带中断使能位。如果设置了这个位,那么在设置TMR_STS位时就会生成一个SCI事件。当重置该位时,设置TMR_STS位时不会产生中断。 |
1-4 | Reserved | Reserved. These bits always return a value of zero. |
5 | GBL_EN | The global enable bit. When both the GBL_EN bit and the GBL_STS bit are set, an SCI is raised. |
Bit | Name | Description |
6-7 | Reserved | Reserved |
8 | PWRBTN_EN | 这个可选位用于使PWRBTN_STS位的设置能够产生电源管理事件(SCI或wake)。PWRBTN_STS位在电源按钮断言时被设置。不需要通过电源按钮的断言来设置PWRBTN_STS位的使能位(参见电源按钮硬件的描述)。支持电源按钮是由FADT复位(0)中的PWR_BUTTON标志指示的。如果设置了PWR_BUTTON标志或ACPI Namespace中有电源按钮设备对象,则该bit字段将被OSPM忽略。 |
9 | SLPBTN_EN | 这个可选位用于设置SLPBTN_STS位来产生电源管理事件(SCI或wake)。SLPBTN_STS位在断言休眠按钮时设置。不需要通过休眠按钮的主动断言来设置启用位来启用SLPBTN_STS位(请参阅休眠按钮硬件的描述)。对睡眠按钮的支持是由正在重置的FADT中的SLP_BUTTON标志指示的(0)。如果设置了SLP_BUTTON标志或ACPI命名空间中存在休眠按钮设备对象,则该bit字段将被OSPM忽略。 |
10 | RTC_EN | 这个可选位用于启用RTC_STS位的设置以生成唤醒事件。RTC_STS位在RTC产生告警时设置。 |
11-13 | Reserved | Reserved. These bits always return a value of zero. |
14 | PCIEXP_WAKE_DIS |
|
15 | Reserved | Reserved. These bits always return a value of zero. |
4.8.4.2 PM1控制分组
PM1控制组有一组位,可以分布在两个不同的寄存器之间。这使得这些寄存器可以在两个芯片之间进行分区,或者全部放在一个芯片中。虽然位可以在两个寄存器块之间分割(每个寄存器块在FADT中有一个唯一的指针),但这里指定的位位置是保持的。带有未实现位的寄存器块(即在另一个寄存器块中实现的位)返回0,写操作没有副作用。
4.8.4.2.1 PM1控制寄存器
寄存器位置:<PM1a_CNT_BLK / PM1b_CNT_BLK>系统I/O或内存空间
默认值:00 h
属性:读/写
大小:PM1_CNT_LEN
PM1控制寄存器包含Fixed Hardware特征控制位。这些位可以在两个寄存器之间分割:PM1a_CNT或PM1b_CNT。每个寄存器组可以位于不同的32位对齐地址,并由PM1a_CNT_BLK或PM1b_CNT_BLK指向。这些指向寄存器空间的指针的值可以在FADT中找到。对PM1控制寄存器的访问通过字节和字访问进行访问。
该寄存器包含在FADT中启用或禁用的可选功能。如果FADT表明该功能不支持作为Fixed Hardware功能,则软件将忽略这些位。
Table 4.13: PM1 Control Registers Fixed Hardware Feature Control Bits
Bit | Name | Description |
0 | SCI_EN | 选择电源管理事件为下列事件的SCI或SMI中断。当设置这个位时,电源管理事件将产生一个SCI中断。当该位复位时,电源管理事件将产生SMI中断。硬件负责设置或重置这个位。OSPM总是保持这个位位置。 |
1 | BM_RLD | 当设置此位时,允许生成总线主请求以使C3状态的任何处理器转换为C0状态。当这个位被重置时,总线主请求的生成不会影响任何处于C3状态的处理器。 |
2 | GBL_RLS | ACPI软件使用这个只写位向平台运行时固件发出一个事件,也就是说,生成一个SMI来将执行控制传递给IA-PC平台的平台运行时固件。平台运行时固件软件有相应的启用和状态位来控制其接收ACPI事件的能力(例如,BIOS_EN和BIOS_STS)。GBL_RLS位由OSPM设置,表示释放全局锁,并在FACS内存结构中设置挂起位。 |
8:3 | Reserved | Reserved. These bits are reserved by OSPM. |
9 | Ignore | Software ignores this bit field. |
12:10 | SLP_TYPx | 定义当SLP_EN位设置为1时系统进入的休眠或软关闭状态的类型。这个3位字段定义了当SLP_EN位被设置时,系统进入的硬件休眠状态的类型。_Sx对象包含与各自睡眠状态相关的3位二进制值(由该对象描述)。OSPM从_Sx对象中获取这两个值,并将它们分别编写到各自的SLP_TYPx字段中。 |
13 | SLP_EN | 这是一个只写位,读它总是返回0。设置这个位将导致系统进入与使用_Sx对象的值编程的SLP_TYPx字段相关联的睡眠状态。+
|
15:14 | Reserved | Reserved. This field always returns zero. |
4.8.4.3 Power Management Timer (PM_TMR)告警解释
寄存器位置:<PM_TMR_BLK>系统I/O或内存空间
默认值:00 h
属性:只读
长度:32位
这个可选的只读寄存器返回电源管理计时器(PM计时器)的当前值,如果它是在平台上实现的。FADT有一个称为TMR_VAL_EXT的标志,OEM将其设置为指示32位PM计时器或重置为指示24位PM计时器。当定时器的最后一位进行切换时,设置TMR_STS位。该寄存器以32位访问。
该寄存器包含在FADT中启用或禁用的可选功能。如果FADT表明该功能不支持作为Fixed Hardware功能,则软件将忽略这些位。
Table 4.14: PM Timer Bits
Bit | Name | Description |
TMR_VAL | 23:0 | 这个只读字段返回电源管理定时器的运行计数。这是一个24位计数器,运行3.579545 mhz时钟,在S0工作系统状态下计数。定时器的起始值未定义,因此允许定时器从任何其他状态过渡到S0状态时被重置(或不重置)。定时器被重置(到任何初始值),然后继续计数,直到系统的14.31818 MHz时钟在进入它的Sx状态时停止。如果时钟没有复位而重新启动,那么计数器将从它停止的地方继续计数。 |
E_TMR_VAL | 31:24 | 这个只读字段返回32位电源管理定时器的上8位。如果硬件支持32位定时器,那么该字段将返回上8位;如果硬件支持24位定时器,那么该字段返回全部零。 |
4.8.4.4 PM2控制(PM2_CNT)
寄存器位置:<PM2_CNT_BLK>系统I/O,系统内存,或功能性
Fixed Hardware空间
默认值:00 h
属性:读/写
大小:PM2_CNT_LEN
该寄存器块是自然对齐的,并基于其长度访问。对于ACPI 1.0,该寄存器是按字节对齐的,并作为字节访问。
该寄存器包含在FADT中启用或禁用的可选功能。如果FADT表明该功能不支持作为Fixed Hardware功能,则软件将忽略这些位。
Table 4.15: PM2 Control Register Bits
Bit | Name | Description |
0 | ARB_DIS | 这个位用于启用和禁用系统仲裁器。当此位为CLEAR时,系统仲裁器被启用,仲裁器可以将总线授予其他总线主。当该位设置为SET时,系统仲裁器将被禁用,默认CPU拥有系统的所有权。当使用C0、C1和C2电源状态时,OSPM清除该位。 |
>0 | Reserved | Reserved |
4.8.4.5处理器寄存器块(P_BLK)
这个可选的寄存器块用于控制系统中的每个处理器。在系统中,每个处理器有一个唯一的处理器寄存器块。有关控制处理器和可用于控制处理器的控制方法的更多信息,请参阅处理器配置和控制。
4.8.4.5.1处理器控制(P_CNT): 32
寄存器位置:<P_BLK>:系统I/O空间或由_PTC对象指定:系统I/O,系统内存,或
功能Fixed Hardware空间
默认值:00 h
属性:读/写
长度:32位
该寄存器作为DWORD访问。CLK_VAL字段是由FADT中的DUTY_WIDTH和DUTY_OFFSET值所描述的节流硬件的职责设置所在。软件将所有其他CLK_VAL位视为忽略(那些没有被值域设置值使用的)。
Table 4.16: Processor Control Register Bits
Bit | Name | Description |
3:0 | CLK_VAL | Possible locations for the clock throttling value. |
4 | THT_EN | 此位允许对CLK_VAL字段中设置的时钟进行时钟节流。当改变 CLK_VAL字段(改变duty设置)时,THT_EN位必须重置为LOW。 |
31:5 | CLK_VAL | Possible locations for the clock throttling value. |
4.8.4.5.2处理器LVL2寄存器(P_LVL2)
寄存器位置:<P_BLK> + 4:系统I/O空间或由_CST对象指定:系统I/O,系统内存,或
功能Fixed Hardware空间
默认值:00 h
属性:只读
长度:8位
该寄存器作为一个字节被访问。
Table 4.17: Processor LVL2 Register Bits
Bit | Name | Description |
7:0 | P_LVL2 | 读到这个寄存器返回全部零;写入到这个寄存器没有效果。读到这个寄存器也会产生一个“输入C2电源状态”的时钟控制逻辑。 |
4.8.4.5.3处理器LVL3寄存器(P_LVL3): 8
寄存器位置:<P_BLK> + 5:系统I/O空间或由_CST对象指定:系统I/O,系统内存,或
功能Fixed Hardware空间
默认值:00 h
属性:只读
长度:8位
该寄存器作为一个字节被访问。
Table 4.18: Processor LVL3 Register Bits
Bit | Name | Description |
7:0 | P_LVL3 | 读到这个寄存器返回全部零;写入到这个寄存器没有效果。读到这个寄存器也产生一个时钟控制逻辑“输入C3电源状态”。 |
4.8.4.6重置注册
可选的ACPI复位机制指定了提供完整系统复位的标准机制。当实现时,这个机制必须重置整个系统。这包括处理器、核心逻辑、所有总线和所有外设。从OSPM的角度来看,主动复位机制在逻辑上等同于系统的功率循环。在重新启动后获得控制后,OSPM将以类似于冷启动的方式执行操作。
复位机制是通过FADT中RESET_REG描述的8位寄存器实现的(总是通过RESET_REG描述的自然对齐和大小访问)。要重置系统,软件将写入一个值(在FADT的RESET_VALUE中指示)到重置寄存器。FADT中的RESET_REG字段表示重置寄存器的位置。
复位寄存器可能只存在于I/O空间,内存空间,或在总线0的一个函数上的PCI配置空间。因此,RESET_REG中的Address_Space_ID值必须设置为System I/O空间、System Memory空间或PCI Configuration空间(总线号为0),因为寄存器只有8位,所以Register_Bit_Width必须为8,Register_Bit_Offset必须为0。
系统必须在写入寄存器后立即重置。OSPM假设处理器不会在写指令之外执行。在写入寄存器之后,OSPM应该在系统的cpu上执行自旋循环。
4.8.4.7睡眠控制和状态寄存器
可选的ACPI睡眠寄存器(SLEEP_CONTROL_REG和SLEEP_STATUS_REG)为HW-Reduced ACPI系统上的系统睡眠状态条目指定了一种标准机制。当实现时,Sleep寄存器可以替代PM1_BLK中的SLP_TYP、SLP_EN和WAK_STS寄存器。这些寄存器的使用由OSPM决定。OSPM可以根据LOW_POWER_S0_IDLE_CAPABLE标志来决定是否进入休眠状态。即使实现了,OSPM也可能使用其他提供的选项来休眠和关闭(例如UEFI ResetSystem())。
HW-reduced Sleep机制是通过两个8位寄存器实现的,由FADT中的SLEEP_CONTROL_REG和SLEEP_STATUS_REG描述(总是通过SLEEP_*_REG描述的自然对齐和大小访问)。为了使系统进入睡眠状态,软件会将HW-reduced sleep Type值(从DSDT中的\_Sx对象获得)和SLP_EN位写入睡眠控制寄存器。然后,OSPM轮询SLEEP_STATUS_REG的WAK_STS位,等待它为1(1),表明系统已经转换回Working状态。
睡眠寄存器可能只存在于I/O空间,内存空间,或PCI配置空间上的功能在总线0。因此,Address_Space_ID必须设置为System I/O空间、SystemMemory空间或PCI Configuration空间(总线号为0)。由于寄存器只有8位,所以Register_Bit_Width必须为8,Register_Bit_Offset必须为0。
Table 4.19: Sleep Control Register
Field Name | Bit Length | Bit Offset | Description |
Reserved | 1 | 0 | Reserved. This bit is reserved by OSPM. |
Ignore | 1 | 1 | Software ignores this bit field. |
SLP_TYPx | 3 | 2 | 定义当SLP_EN位设置为1时系统进入的休眠状态类型。这个3位字段定义了当SLP_EN位被设置时,系统进入的硬件休眠状态的类型。_Sx对象包含与各自睡眠状态相关的3位二进制值(由该对象描述)。OSPM从_SX对象中获取HW-reduced Sleep Type值,并将其编程到SLP_TYPx字段中。 |
SLP_EN | 1 | 5 | 这是一个只写位,读它总是返回0。设置这个位将导致系统进入与使用_Sx对象的值编程的SLP_TYPx字段相关联的睡眠状态。 |
Reserved | 2 | 6 | Reserved. This field always returns zero. |
Table 4.20: Sleep Status Register
Field Name | Bit Length | Bit Offset | Description |
Ignore | 4 | 0 | Software ignores this bit field. |
Reserved | 2 | 4 | Reserved. These bits always return a value of zero. |
Ignore | 1 | 6 | Software ignores this bit field. |
WAK_STS | 1 | 7 | 当系统处于睡眠状态并启用唤醒事件时设置此位。设置后,该位系统将过渡到工作状态。这个位是由硬件设置的,只能通过软件向这个位位置写入一个“1”来清除。 |
4.8.5通用硬件寄存器
ACPI提供了一种机制,允许在ACPI命名空间中向OSPM描述唯一的“增值”硬件。在设计与ACPI兼容的硬件时,需要遵循许多规则。
编程位可以驻留在任何已定义的通用硬件地址空间(系统I/O、系统内存、PCI配置、嵌入式控制器或SMBus)中,但顶级事件位包含在通用事件寄存器中。通用事件寄存器由GPE0_BLK和GPE1_BLK寄存器块指向,通用硬件寄存器可以位于任何已定义的ACPI地址空间中。设备的通用硬件编程模型是通过ACPI命名空间中的一个关联对象来描述的,该对象指定位的功能、位置、地址空间和地址位置。
设备的编程模型通常分为状态和控制功能。状态位用来产生一个事件,允许OSPM调用与状态位关联的控制方法。然后,被调用的控制方法可以通过操纵硬件控制位或调查子状态位并调用它们各自的控制方法来控制硬件。ACPI要求顶层“父”事件状态和启用位驻留在GPE0_STS或GPE1_STS寄存器中,而“子”事件状态位驻留在通用地址空间中。
下面的示例说明了其中一些概念。上面的图显示了逻辑是如何划分为两个芯片的:一个芯片组和一个嵌入式控制器。
•包含中断逻辑芯片组、执行电源按钮(这是固定的一部分注册空间,并且不是这里讨论),盖子开关(用于笔记本电脑显示当蛤壳盖子打开或关闭),国际扶轮#功能(可用于之后的睡眠系统)。
•嵌入式控制器芯片用于执行交流电源检测和dock/undock事件逻辑。此外,嵌入式控制器使用嵌入式控制器中的os透明中断(由EXTSMI#信号表示)来支持一些系统管理功能。
在顶层,GPEx_STS寄存器中的通用事件是:
•嵌入式控制器中断,包含两个查询事件:一个用于AC检测,一个用于对接(对接查询事件在对接芯片中有子中断状态位)。
•铃声表示状态(用于唤醒系统)。
•盖状态。
嵌入式控制器事件状态位(EC_STS)用于指示两个查询事件中的一个是活动的。
•当AC#信号被触发时,会产生一个查询事件。嵌入式控制器返回一个查询值34(任何字节数都可以使用)在一个查询命令响应这个事件;然后,OSPM将计划执行与查询值34关联的控制方法。
另一个查询事件是针对生成对接事件的对接芯片的。在这种情况下,嵌入式控制器将在系统软件响应嵌入式控制器SCI的查询命令时返回一个查询值35。然后,OSPM将计划执行与查询值35关联的控制方法,该方法为对接事件提供服务。
对于GPEx_STS寄存器中的每个状态位,GPEx_EN寄存器中都有一个相应的启用位。注意,子状态位不一定需要启用位(请参阅DOCK_STS位)。
lid逻辑包含一个控制位,用于确定当lid为打开(设置LID_POL并设置lid)或关闭(LID_POL为清除且lid为清除)时,它的状态位是设置的。这个控制位驻留在通用I/O空间中(在本例中,是系统I/O空间33h的第2位),可以通过与lid对象关联的控制方法进行操作。
与Fixed Hardware事件一样,OSPM将清除GPEx寄存器块中的状态位。然而,AML代码清除通用硬件中的所有兄弟状态位。
通用硬件特性由OEM提供的控制方法控制,并以AML编码。ACPI为这些特性的开发提供了事件和控制模型。ACPI规范还提供了特定的控制方法,用于通知OSPM某些电源管理和即插即用事件。ACPI软件编程模型提供了关于支持不同类型子系统的硬件功能类型的信息。下面是ACPI支持的特性列表。这个列表不打算是完整的或全面的。
Fig. 4.13: Example of General-Purpose vs.
•设备插入/弹出(例如,对接,设备隔间,空调适配器
•平台热子系统
•开启/关闭电源资源
•移动盖子接口
•嵌入式控制器
•系统指标
•OEM特定的唤醒事件
•即插即用配置
注意:* ACPI操作系统假定使用智能电池系统实现者论坛定义的电池标准,称为“智能电池规范”(SBS)。ACPI提供了一套控制方法,供使用专有的“控制方法”电池接口的OEM使用。
4.8.5.1通用事件注册块
ACPI最多支持FADT(参见ACPI软件编程模型)中描述的两个通用寄存器块,以及任意数量的附加GPE块,这些块被描述为ACPI名称空间中的设备。每个寄存器块包含两个寄存器:启用寄存器和状态寄存器。每个寄存器块是32位对齐的。块中的每个寄存器都作为一个字节被访问。这取决于特定的设计来确定这些位是否在休眠或软关闭状态下保留它们的上下文。如果它们在休眠或软关闭状态中丢失了上下文,那么平台引导固件在将控制传递给操作系统之前会重置相应的启用位。
4.8.5.1.1通用事件0注册块
这个寄存器块由两个寄存器组成:GPE0_STS和GPE0_EN寄存器。每个寄存器的长度被定义为GPE0寄存器块长度的一半,并在ACPI FADT的GPE0_BLK和GPE0_BLK_LEN操作符中进行描述。通用事件资源由OSPM拥有,这些位仅由OSPM操作;AML代码无法访问通用事件寄存器。
设想芯片组将包含GPE事件寄存器,为各种事件提供GPE输入引脚。
然后,平台设计者将GPEs连接到各种增值事件硬件,并且AML代码将向OSPM描述如何利用这些事件。因此,可能会出现这样的情况:平台具有没有连接到任何东西的GPE事件(它们存在于芯片集中),但不被平台利用,也没有相关的AML代码。在这种情况下,这些事件引脚被绑定为非活动的,这样GPE寄存器中相应的SCI状态位就不会由浮动输入引脚设置。
4.8.5.1.1.1通用事件0状态寄存器
寄存器位置:<GPE0_STS>系统I/O或系统内存空间
默认值:00 h
属性:读/写
大小:GPE0_BLK_LEN / 2
通用事件0状态寄存器包含通用事件状态位在通用寄存器的银行0中。该寄存器中的每个可用状态位对应于GPE0_EN寄存器中具有相同位位置的位。这个寄存器中的每个可用状态位都是在事件激活时设置的,并且只能通过软件在其相应的位上写一个“1”来清除。对于通用的事件寄存器,未实现的位会被OSPM忽略。
每个状态位可以选择唤醒系统,如果触发,当系统处于睡眠状态,其各自的启用位设置。OSPM通过字节访问GPE寄存器(与字节长度无关)。
4.8.5.1.1.2通用事件0启用注册
寄存器位置:<GPE0_EN>系统I/O或系统内存空间
默认值:00 h
属性:读/写
大小:GPE0_BLK_LEN / 2
通用事件0使能寄存器包含通用事件使能位。该寄存器中的每个可用启用位对应于GPE0_STS寄存器中具有相同位位置的位。使能位的工作原理类似于固定事件寄存器中的使能位的定义:当使能位被设置时,相应状态位中的一个设置状态位将生成一个SCI位。OSPM通过字节访问GPE寄存器(与字节长度无关)。
4.8.5.1.2通用事件1注册块
这个寄存器块由两个寄存器组成:GPE1_STS和GPE1_EN寄存器。每个寄存器的长度被定义为GPE1寄存器块长度的一半,并在ACPI FADT的GPE1_BLK和GPE1_BLK_LEN操作符中进行描述。
4.8.5.1.2.1通用事件1状态寄存器
寄存器位置:<GPE1_STS>系统I/O或系统内存空间
默认值:00 h
属性:读/写
大小:GPE1_BLK_LEN / 2
通用事件1状态寄存器包含通用事件状态位。该寄存器中的每个可用状态位对应于GPE1_EN寄存器中具有相同位位置的位。这个寄存器中的每个可用状态位都是在事件激活时设置的,并且只能通过软件在其相应的位上写一个“1”来清除。对于通用的事件寄存器,操作系统会忽略未实现的位。
每个状态位可以选择唤醒系统,如果触发,当系统处于睡眠状态,其各自的启用位设置。
OSPM通过字节访问GPE寄存器(与字节长度无关)。
4.8.5.1.2.2通用事件1启用注册
寄存器位置:<GPE1_EN>系统I/O或系统内存空间
默认值:00 h
属性:读/写
大小:GPE1_BLK_LEN / 2
通用事件1启用寄存器包含通用事件启用。该寄存器中的每个可用的启用位对应于GPE1_STS寄存器中具有相同位位置的位。使能位的工作原理类似于固定事件寄存器中的使能位的定义:当使能位被设置时,相应状态位中的一个设置状态位将生成一个SCI位。
OSPM通过字节访问GPE寄存器(与字节长度无关)。
4.8.5.2通用设备示例
本节指出具有特定ACPI驱动程序支持的通用设备。
4.8.5.2.1盖开关
盖子开关是一个可选的功能,目前在大多数“蛤壳”风格的移动电脑。它可以被操作系统用作休眠系统的策略输入,或者从休眠状态唤醒系统。如果使用,则OEM需要将盖子开关定义为一个_HID对象值为“PNP0C0D”的设备,该设备标识为向OSPM发送的盖子开关。Lid设备需要包含一个返回其状态的控制方法。Lid事件处理程序AML代码重新配置Lid硬件(如果需要的话),以生成另一个方向的事件,清除状态,然后通知OSPM该事件。
示例硬件和ASL代码如下所示。
Fig. 4.14: Example Generic Address Space Lid Switch Logic
这个逻辑将在按钮被按下或释放时设置Lid状态位(取决于LID_POL位)。
下面的ASL代码定义了以下内容:
•一个操作区域,其中盖子极性驻留在地址空间中寄存器0x201的系统地址空间。
允许AML代码访问此位的字段操作符:极性控制位(LID_POL)被称为LPOL,在0x201.0被访问。
•名为\_SB的设备。LID附有以下文件:
•即插即用标识符“PNP0C0D”,将OSPM与该节点关联起来。
定义一个对象,该对象指定了盖子状态位的变化可以从S4睡眠状态和所有更高的睡眠状态(S1, S2或S3)唤醒系统。
盖子开关事件处理程序做以下事情:
•将lid状态位(LID_STS)定义为通用事件0寄存器位1的子对象。
定义lid的事件处理程序(只有在这个状态位上的事件处理程序),它做以下事情:
•翻转LPOL位的极性(使事件在相反的条件下产生)。
•为操作系统生成一个通知:
•传递\_SB。控制对象。
•设备相关事件(notify值0x80)。
// Define a Lid switch OperationRegion (\PHO, SystemIO, 0x201, 0x1) Field (\PHO, ByteAcc, NoLock, Preserve) { LPOL, 1 // Lid polarity control bit } Device (\_SB.LID) { Name (_HID, EISAID ("PNP0C0D")) Method (_LID) { Return(LPOL) } Name (_PRW, Package (2){ 1, // bit 1 of GPE to enable Lid wakeup 0x04}) // can wakeup from S4 state } Scope(\_GPE) { Method(_L01) // uses bit 1 of GP0_STS register { LPOL ~= LPOL // Flip the lid polarity bit Notify (\_SB.LID, 0x80) // Notify OS of event } } |
4.8.5.2.2嵌入式控制器
ACPI提供了一个标准接口,使AML代码能够在“嵌入式控制器空间”中定义和访问通用逻辑。这支持当前的计算机模型,其中大部分增值硬件包含在嵌入式控制器中,同时允许AML代码以抽象的方式访问该硬件。
•嵌入式控制器被定义为一个设备,必须包含一定数量的控制方法:
•_HID值为PNP0C09,用于将该设备与ACPI的嵌入式控制器驱动程序关联起来。
•_CRS返回被嵌入式控制器消耗的资源。
•_GPE,返回这个嵌入式控制器连接到的通用事件位。
此外,每个嵌入式控制器最多支持255个通用事件,称为查询事件。这些查询事件句柄在嵌入式控制器的设备中定义为控制方法。下面是一个定义嵌入式控制器设备的例子:
Device(EC0) { // PnP ID Name(_HID, EISAID("PNP0C09")) // Returns the "Current Resources" of EC Name (_CRS, ResourceTemplate() { IO(Decode16, 0x62, 0x62, 0, 1) IO(Decode16, 0x66, 0x66, 0, 1) }) // Indicate that the EC SCI is bit 0 of the GP_STS register Name (_GPE, 0) // embedded controller is wired to bit 0 of GPE OperationRegion (\EC0, EmbeddedControl, 0, 0xFF) Field (EC0, ByteAcc, Lock, Preserve) { // Field units of EC0 } // Query methods Method(_Q00) { ... } Method(_QFF) { ... } } |
有关嵌入式控制器的更多信息,请参阅ACPI嵌入式控制器接口规范
4.8.5.2.3风扇
ACPI有一个设备驱动程序来控制平台中的风扇(主动冷却设备)。风扇定义为即插即用ID为“PNP0C0B”的设备。它应该包含用于控制风扇的电源资源列表。
有关更多信息,请参见ACPI定义的设备和特定于设备的对象。