小華的部落格: ACPI Spec Overview

搜尋此網誌

網頁

星期三, 11月 07, 2007

ACPI Spec Overview

這篇文章最主要是說明一些ACPI Spec中基本架構的概念與一些基本的省電作法。

在系統中,硬體在正常情況下就會指示出電源系統進入Sleep時可以支援的省電層級,ㄧ個具有ACPI 功能的OS 是可以透過下列幾個項目來決定系統電源最低能夠支援的省電層級:

1. ACPI’s DSDT
2. ACPI’s SSDT
3. ACPI’s PSDT

一般來說OS與BIOS會依照ACPI規範去實做這部份的省電層級Sx。


ACPI Overview
ACPI 規範在OSPM中是一個主要的技術,ACPI主要有3個Runtime 元件:
1.ACPI Tables
在ACPI Tables中最主要是描述一個Platform上面的硬體介面資訊,這些描述包含了一些固定的暫存器位址,或是說明一些Register Blocks,另外ACPI Tables 中還包含了一些OS可以執行的AML code ,OS會透過自己的AML Interpreter 來執行這些AML code。

2.ACPI Registers
在ACPI Registers中是實體的硬體介面,這些暫存器就是被描述在ACPI Tables中的那ㄧ些。

3.ACPI BIOS
在ACPI BIOS中,他是一個符合ACPI規範下的BIOS,典型情況下,他會做系統開機的動作以及實做Sleep 介面的支援(BIOS支援S3/S4/…)

OSPM 最小需求
OSPM的最小需求為:
1.Power Management Timer 用來提供時間的計數,用來檢查系統是否在閒置。
2.一個Power 或是Sleep Button
3.一個real time clock alarm ,用來從Sleep state產生硬體Wakeup event
4.實做一個支援到某個Sleep State層級的OS系統
5.可以經由SCI 發出中斷事件
6.有GPE 硬體暫存器來產生一些通用硬體事件
7.ACPI BIOS有提供ACPI Tables
8.有一個”User-accessible fail-safe”機制,讓系統Reset 或是Shutdown
9.所有的Root PCI Bridge都要有 _PRT Method 來設定PCI interrupt pin to interrupt vector

Power States
在OSPM架構下,作業系統可以直接的對所有系統和設備做Power States 轉換,不過這部份就與使用者如何判定,以及應用程式如何控制,或是OS如何將設備轉換進入低電源狀態或是離開有關,另外還有設備如果沒在使用的情況下就把電源關閉…等的情況。一般來說,OS都是參考應用程式的設定或是使用者的設定來當作進入省電模式的依據,OS使用ACPI去控制硬體的電源狀態(Power-states)。

Global Power States
從使用者可見的環境下,系統電源狀態分成G0/G1/G2和G3 ,而這些狀態切換參考是依據:
a) 應用程式還在執行嗎 ?
b) 外部事件與應用程式回應的時間長短多長? 過長可能就沒在用了
c) 電源消耗量為何?
d)OS 重新開機後要求要回到工作狀態G0 ?
e) 是否安全的拆卸系統 ?
f) 電源狀態是否經由電氣的改變可以進入或是離開電源狀態? (是否硬體支援切換?)

而個別的States如下所示:
G0—Working
G1—Sleeping
G2 (or S5)--Soft Off
G3--Mechanical Off


Working & Sleeping States
在一般環境下,系統介於Working & Sleeping States的切換較多(G0<-->G1 互換),其中當系統在Sleep States(G1)時又要分成兩部分來談,分別是
a) Device 支援的電源省電層級(Dx-States)
b) Processor 支援的省電層級 (Cx-States)

因為不同的情況下,可能要省電的是設備、處理器或是兩個設備都要,所以底下分別談論他們的省電狀態。

Device Power States
i) D0--Fully-On : 設備可以完全回應,正常工作
ii) D1 : 依照不同Device class有不同規範,一般都是會節省一些電源
iii) D2: 依不同Device class有不同規範,但並非大多數設備都有支援,而這階段除了節省電源外,通常會關閉一些設備上的功能來達到更省電的情況。
iv) D3—Off : 把電源從設備移除,完全關閉設備電源,一般重新啟動設備通常會需要比較長的時間。
不同的設備通常會有不同的電源省電狀態,通常這些電源狀態的切換都可以經由他們的驅動程式或是軟體來切換,一般都是經由設備驅動程式送Command 到設備來切換他們的模式。

Processor Power States
處理器的電源狀態(Power States),Cx States 是指處理器的電源耗損以及Thermal 管理,而這些都是在G0 States 內所定義的:
a)C0 Processor Power State : 處理器正常處理Instructions。
b)C1 Processor Power State: 處理器有比較低的Latency,此時的硬體Latency 只保留足夠OS在不考慮Latency 情況下可以正常執行軟體,而當處理器進入這個”non-executing”狀態時,只有他自己知道,而沒有軟體會顯示這個狀態。
c)C2 Processor Power State: 處理器最差的Latency會定義在FADT Table,OS自己會決定何時要用C2來取代C1 以達到更省電的狀態,而當處理器進入這個”non-executing”狀態時,只有他自己知道,而沒有軟體會顯示這個狀態。
d)C3 Processor Power State : C3 狀態中的最差的Latency 也是定義在FADT Table,OS自己會去切換狀態,當處理器在C3狀態時,原本處理器負責的Cache狀態會忽略任何的探測(Cache snoop),所以OS要自己負責。

ASL Code Overview
Device Power Management Objects
1) 前面說過,每個Device支援的省電狀態不同,所以必須告訴OS在Sx與Dx的對應關係,而這部份是透過"_SxD"來決定。

2) 而設備的電源管理是透過"_PRx" 對應”_PSx”來決定,另外”_PRW”則不對應”_PSx”,而”_PRW”是一個控制物件,控制設備是否Enable/Disable從Sx Wakeup功能

附錄APPENDIX
Device Power Management Child Objects & Object Description

_IRC Object that signifies the device has a significant inrush
current draw.
_PRW Object that evaluates to the device's power requirements in order
to wake the system from a system sleeping state.
_PR0 Object that evaluates to the device's power requirements in
the D0 device state (device fully on).
_PR1 Object that evaluates to the device's power requirements in
the D1 device state. The only devices that supply this
level are those which can achieve the defined D1 device
state according to the related device class.
_PR2 Object that evaluates to the device's power requirements in
the D2 device state. The only devices that supply this
level are those which can achieve the defined D2 device state
according to the related device class.
_PSC Object that evaluates to the device's current power state.
_PSW Control method that enables or disables the device's
WAKE function.
_PS0 Control method that puts the device in the D0 device state
(device fully on).
_PS1 Control method that puts the device in the D1 device state.
_PS2 Control method that puts the device in the D2 device state.
_PS3 Control method that puts the device in the D3 device state
(device off).
_S0D Highest D-State supported by the device in the S0 state
_S1D Highest D-State supported by the device in the S1 state
_S2D Highest D-State supported by the device in the S2 state
_S3D Highest D-State supported by the device in the S3 state
_S4D Highest D-State supported by the device in the S4 state
_S5D Highest D-State supported by the device in the S5 state

上述都只是些基本概念,也是我自己的心得筆記,希望能夠給大家多一點ACPI認識,如資料有誤也請各位先進不吝指教,謝謝!

Reference
Acpi Spec3.0b

6 則留言:

匿名 提到...

看完你的解釋,對於ACPI比較有概念了。
關於Gx State,有個小地方有誤。
G State只有G0/G1/G2/G3,沒有G4。
謝謝!!!

匿名 提到...

您好~~最近遇到一個問題,就是當NB電池電量不足,讓OS進入到待命模式,直到電量嚴重不足時,BIOS會自動喚醒OS進入休眠。主要問題是,我們在OS中可以設定電量嚴重不足的百分比,預設是3%,但是假如我設定5%,而讓OS進入待命狀態,BIOS是要如何知道OS所設定的這個值而在電量到達(假設5%)時自動喚醒進入休眠,是OS在設定百分比的時候,會透過ACPI通知EC設定這個值嗎???

小華的部落格 提到...

BIOS控制?? 我認知中BIOS不會去控制這部份啦!我的認知如下:

1.OS控制系統的所有行為模式
2.BIOS只負責提供資訊(透過 ASL code)

所以OS會去呼叫ASL code來得到目前電量,而得到電量後OS要幹麻就看你的設定而已。

而市面上有種NB有自己提供ㄧ個系統管理的軟體工具,而這種方式是透過EC偵測電量然後告知BIOS,接著BIOS再告知此系統軟體工具,而當此系統軟體工具收到event後,他會呼叫系統API來讓系統進入S3/S4,這種方式就是屬於一種客制的Feature

除此之外目前BIOS都是只負責回傳資訊給OS而已。

匿名 提到...

Hi~Sir ,
請教您~
如何知道Devices Power States 有沒有support D3 呢 ?

Thank you ~
/ Ken

Wang 提到...

你好,我把你的这篇文章转贴到一个论坛了(biosren.com). 多谢

小魚 提到...

您好, 小弟剛開始接觸bios, 您這一系列bios文章使我獲益良多, 請問一下, processor的power state Cx根據acpi spec 2.5節中似乎是在 G0 working state當中 transition, 而不是 G1 sleeping state?