第四章 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定義的設備和特定于設備的物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/299212.html
標籤:其他
