Bios工程師手邊事—ACPI電源管理

ACPI是高級配置與電源接口(AdvancedConfiguration and Power Interface)的簡稱,它是1997年由Intel、Microsoft、Toshiba,HP,Phoenix所共同制定,提供操作系統應用程序管理所有電源管理的接口。2000年8月推出 ACPI 2.0規範。2004年9月推出 ACPI 3.0規範。2009年6月16日則推出ACPI 4.0規範。最新ACPI版本爲5.0,2011年發佈。電源管理是ACPI中非常重要的一部分。

ACPI中的I是指Interface,它是一系列的表格。這些表格描述了系統信息,特性,以及設定這些特性的方法。SBIOS一般會將這些表格放在F段內存中,供非EFI操作系統讀取。

   

這些表格的結構和聯繫如下所示:

    圖1. RSDP



圖2. 引出的表格



一.G狀態

針對系統整個平臺來定義,肉眼可以識別。我們根據喫電量大小,軟件是否工作,外部事件觸發到工作狀態的延時時間,拆機是否安全等來判斷系統處於哪種狀態。

G0:工作狀態,操作系統分發用戶線程並執行。在此狀態中,外圍設備喫電量可以改變。

G1:顯示器關閉,用戶態線程不再執行。系統狀態S1,S3,S4均屬G1狀態。返回G0狀態用時比G2短。

G2:關機狀態,硬件不會保存軟件環境,需要較長時間才能返回到工作狀態。此狀態也稱爲soft off。

G3:也稱Mechanicaloff,除RTC電開啓外,再無其它電,此種狀態下,我們拆機不會有短路風險。

對於工控機和服務器而言,我們要經常做的一個功能叫AC Power Loss。就是丟失AC電源後,再重新獲得AC電後,平臺電源應該如果設定。AC power Loss後的狀態爲G3,我們可以設定PCH的PMC寄存器位AFTERG3,來告知PCH,平臺重新獲得AC電後,我們需要進入S5狀態或者S0狀態。當然有些筆記本平臺也做這個功能,但筆記本廠商爲了省電並不會像做工控機和服務器一樣去做這個功能,因爲這樣做要開啓ALWAYS電和RSMRST#,這樣如果用戶設定G3After進S5,那麼對鋰電池是一種浪費。所以筆記本如果做這個功能,通常由EC來做。

 

二.S狀態

系統狀態,這種狀態是針對OS所定義。G狀態中除了G3,其餘G0,G1和G2分別有相應的狀態與之相對應。

S狀態的判定:可根據平臺喫電量大小,系統返回工作狀態的延時時間來判定。

操作系統是否支持此種狀態,支持幾種S狀態,要根據SBIOS提供給OS的ACPI接口所定。在表格DSDT中,有如下NAME OBJECT

Name(\_S0, Package(4) {0x0,0x0,0,0})

Name(\_S3, Package(4) {0x5,0x0,0,0})

Name(\_S4, Package(4) {0x6,0x0,0,0})

Name(\_S5, Package(4) {0x7,0x0,0,0})

由此,OS可知此平臺需要支持S0,S3,S4,S5四種S狀態。Package中的第一個元素,是OS進相應狀態時,往FADT中的PM_CNT字段要寫的值。

 

S0:工作狀態,和G0相同。

S1:CPU時鐘信號被停止,CPU有較低的功耗,返回到S0的時間較短。

S3:即我們常說的睡眠狀態。此狀態下,系統環境保存在內存裏面。設備帶電方面:只有內存VCC保留,其餘設備全部關閉。時鐘方面:只有RTC時鐘依然有效,其餘全部關閉。

S4:我們常說的休眠狀態。此狀態下,系統環境保存在硬盤上面。設備帶電方面,所有設備都沒電。時鐘方面,RTC時鐘依然工作。

S5:關機狀態。系統環境不再保存。返回S0時,系統要重新啓動。此狀態下,喫電量和S4喫電量一樣。不同的是,OSPM不會把系統環境保存在硬盤上面。

 

之前,在做一個國產平臺時,CPU廠商讓我配合着做S1。但它們只是讓CPUHALT,讓我把LVDS屏的背光關掉,CPU時鐘信號還是跑得嗷嗷叫。我一直納悶:這哪是S1啊,只能算是比較淺的G1吧,但別人既然這麼叫了,咱也得認不是。

 

作爲ECBIOS,要根據SLP_S4#和SLP_S3#和電平狀態來給平臺供電。至於SLP_S5#,對於ECBIOS來講,沒有什麼意義。至於系統是否處於S1狀態,ECBIOS無法知曉,因爲沒有任意一個PIN給指示。下圖是他們的電平高低所指示的S狀態。

SLP_S3#

SLP_S4#

SLEEP狀態

H

H

S0

L

H

S3

L

L

S4或S5

 

 

三.C狀態

C狀態是G0下的CPU電源狀態。分爲ACTIVE和SLEEP狀態。即C0,C1,C2,C3……Cn。最常用的爲C0和C1。

C0:ACTIVE狀態,此狀態下,CPU執行指令。CPU PSTATE和THROTTLING功能都在此狀態下被調用。

C1:所有的處理器必須支持這種狀態。這種狀態的支持是通過一個本地的處理器指令(HLT或者mwait),並且認爲不需要芯片組的硬件支持,即不需要PMC的支持。這種狀態的硬件延遲必須足夠的低。在C1狀態下,處理器可以保持系統cache裏面的內容。只要系統有任何中斷產生,CPU便從C1返回C0。

    其餘C狀態均不是必須的,但爲了平臺省電功能,也最好加上去。我曾經因爲有些機臺開啓C1以上的狀態時會死機。所以只能開啓C0和C1,其餘C狀態均禁掉。但這樣做,測試結果是:會造成電池耗電量比正常開啓所有支持的C狀態的機臺高一倍,可見C狀態對平臺功耗還是很重要的。如果硬件工程師沒有足夠的經驗支撐,還是不要隨便改動公板有關CPU的線路圖,這個地方出了問題還得重新改板。

 

    有關C狀態的做法,並不複雜。只需要對應文檔,查到CPU所能支持的C狀態。然後在VFR中設定即可。

    在VFR中的相關設定的值,SBIOS一方面會改寫MSR中,另一方面會重新改寫ASL的變量。這樣在OSPM調用_CST時,就會根據ASL的變量作爲判斷,獲取到相應的C狀態package。

 

    圖3. _CST實例



由圖可知,該實例有4個C狀態。因爲其是從ACPI直接截的圖,所以不支持VFR的設定。實際情況可能要比上圖複雜得多,並且有的平臺還要根據AC和Battery的狀態改變,重新通知OSPM來獲取C狀態。

 

一.D狀態

 

D狀態是描述設備電源狀態。OSPM使用它來管理系統,以期達到性能和能耗的折中狀態。

D0:Active狀態,系統爲其供電。此狀態下,用戶可以使用其提供功能。

D3:設備關閉狀態。在此狀態下,電源完全被移除。系統重新爲其供電時,要再次初始化。

爲了提供給OSPM設備的D狀態,我們要在相應的設備下面添加_PS0和_PS3的支持。OSPM調用_PS0和_PS3時,我們的設備電源相關寄存器就會被改寫。

 

二.系統待機流程

在WINDOWS下,執行待機操作。操作系統,SBIOS,ECBIOS依次跑自己的代碼。

1,關機程序取得SE_SHUTDOWN_NAME權限,然後調用時SetSystemPowerState函數。

2,檢查各個設備的喚醒功能(_PRW)和其POWER RESOURCE。

3,設置設備的D狀態,如果其沒有WAKE功能,則將其於D3狀態

4,OSPM執行_PTS來調用BIOS對平臺的設定。

5,OS將Wake function的Wake vector填寫入FACS表中,待系統從S3返回時調用。

6,根據步驟2設置喚醒功能,在GPE0_EN或PM1_EVT裏置相應位。

7, OSPM在FADT中,找到PM1a_CNT_BLK,根據DSDT中的 Name(_S3, Package(4) {0x05, Zero,Zero, Zero}),將(0x05<<10)|(1<<13)寫入PM1a_CNT_BLK中。

8,上述步驟觸發S3SLEEP SMI中斷,CPU進入SMM模式,並執行S3 SMI HANDLE,最後將 PM1a_CNT_BLK的值最低位變1,再次寫入此寄存器。

9,EC檢測到南橋的S3#有效,便把主板上的電逐一拉低,只保留內存電壓。

 

三.系統關機流程

在WINDOWS下,用戶執行軟關機。操作系統,SBIOS,ECBIOS依次跑自己的代碼。

1,取得SE_SHUTDOWN_NAME權限,然後調用時ExitWindowsEx函數。

2,關機指令通知Windows子系統CSRSS.EXE,CSRSS.EXE,收到通知後會和Winlogon.EXE做一個數據交換,再由Winlogon.EXE通知CSRSS.EXE開始關閉系統的流程。

3,Winlogon.EXE調用NtShutdownSystem()函數來最後關機。

4,OSPM執行_PTS來調用BIOS對平臺的設定。

5,OSPM在FADT中,找到PM1a_CNT_BLK,將DSDT中的 Name(_S5, Package(4) {0x07, Zero,Zero, Zero}),將(0x07<<10)|(1<<13)寫入PM1a_CNT_BLK中。

6,步驟5觸發了S5 SMI中斷,CPU跳轉到SMBASE+0x8000處。此處是SMI HANDLE的入口函數,該函數會逐一檢查SMI中斷類型,最後確定爲SLP_SMI_STS。然後BIOS FIRMWARE通過讀取    PM1a_CNT_BLK中的值判定SLP_STYLE爲S5。BIOSFIRMWARE根據註冊的S5 SLEEP HANDLE逐一執行完畢。最後將PM1a_CNT_BLK的值最低位變1,再次寫入此寄存器。

7,此時,南橋S3#,S4#,S5#會依次變低。EC接到信號後,將主板上的信號依次拉低。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章