[收集] ACPI 入門相關資料

ACPI簡介

出處: http://frankuefi.blogspot.tw/2012/05/acpi.html

ACPI (Advanced Configuration and Power Interface),故名思義是對硬體的電源管理和設定的介面。它是由Intel、Microsoft、Phoenix、Toshiba等不同領域的製造商所訂定,它的目的就是讓OS可以對hardware做以上的動作。它的架構主要都在BIOS階段會建立起來,所以我們必須熟悉這本ACPI spec, 目前最新的版本是5.0a.

前六章是ACPI最基本的部分,要觀念清楚,一定要照著順序看,而且要熟讀它。後面章節可以跳著看,也就是當作工具書來查,如果懂得愈多,對未來處理ACPI的問題也就更容易解決! 當然,要支援ACPI除了hardware , OS也必須支援ACPI, 而在ACPI訂定之前有個APM,這裡指的legacy OS或legacy hardware就是指APM的OS或不支援ACPI的OS或hardware,它將不符合ACPI,所以不在這裡討論。

ACPI既不是軟體的spec,也不是硬體的spec,它包括了軟體和硬體的元素,目的上面也說過,它是讓OS可以對Hardware做電源管理和設定的介面。如圖紅色部分就是ACPI的範圍:


ACPI可以做的事情很多,大致可分為十大類:

System power management: 整個系統的電源管理,ACPI定義了許多Sleep狀態,如S1、S3、S4、S5等,可以在Sleep狀態被Device喚醒,Sleep狀態數字愈高表示睡得越深、耗的電量越少,需要被喚醒的時間也越長。

Device power management: 週邊裝置的電源管理,ACPI定義D0、D1、D2、D3…,數字越大表示耗電量越少,D0表示週邊裝置運作中。ACPI Table也定義了週邊裝置的相關電源控制,可以在OS端透過AP將週邊裝置設定較省電的模式。

Processor power management: 處理器的電源管理,ACPI定義了當CPU不在Sleep狀態時且閒置時,可以進入low power 狀態,也就是C State,數字越大表示越省電,C0表示運作中。

Device and processor performance management: 週邊裝置和處理器的效能管理,ACPI定義為當CPU和設備在動作的時候(C0或D0),做改變效能的動作,這裡指的是P State,它的狀態改變會影響運作的效能,通常是降頻來動作,也可以達到省電的功能。

介紹完四個功能,發現了許多狀態,這是屬於Power State的部份,下面以G State圖表示可以看得更清楚。G0表示系統在工作中,G1為Sleeping, G2為soft off (S5), G3為Mech off(電源斷開).

Configuration / Plug and Play: 組態和隨插即用,ACPI提供了介面讓OSPM可以把資源在插入和移除之間做組態。這些組態將定義在DSDT和SSDT中,它將有一個ID來代表它的Device.

System Event: 糸統事件,ACPI定義了通用的事件模組,如Plug and Ply、Power management、Thermal 等。當系統事件發生時,core logic會設定一個bit在Status Register中來表示事件發生,如果對應的Bit在enable register 被設定,那麼會發出SCI來告訴OS. 當OS 收到SCI事件時,它會去找該事件所對應的control method. 這些control method會以AML的方式告訴OS做什麼事,我們則要用ASL來撰寫它。

Battery management: 電池管理,支援ACPI的電池裝置它是透過OS且以EC來控制,或者由電池的control method來控制。這邊的control method也是由ASL來實作它。

Thermal management: 熱的管理,對於Device的熱管理也是在ACPI定義的範圍,它提供了簡單的、可調整的模組來給OEM定義其Thermal zone、Thermal indicator和method for cooling thermal zones.

Embedded Controller: ACPI定義了標凖的硬體的和軟體的溝通介面給OS bus enumerator和EC之間來做溝通,也就是說可以由Driver來存取EC的資源,讓OEM可以提供platform features給OS的AP使用。

SMBus Controller: ACPI定義了標凖的硬體的和軟體的溝通介面給OS bus enumerator和SMBus Controller之間來做溝通,也就是說可以由Driver來存取SMBus device的資源,讓OEM可以提供platform features給OS的AP使用。

==============================================

ACPI Table 基本知識

出處:http://biosengineer.blogspot.tw/2007/10/acpi-table.html

ACPI Table基本知識(BIOS觀點):

1.包在BIOS ROM中 的 ASL Code 就是ACPI Table,而ACPI Table有分成不同類型的Table(RSDT/FADT/DSDT…etc.)。

2.像是我們比較常使用的DSDT Table就是放了一些event code,簡單說就是當某個H/W event 發生後,系統OS會去依照描述在這個DSDT Table中的ASL Code去執行,而這些Acpi Table包在BIOS ROM中的形式是AML Code (類似機器碼)。

3.BIOS在開機過程中會把包在BIOS ROM中的Acpi Table 載入到RAM 中,然後留下一些資訊給OS來找到他們,最簡單的例子就是RSDP Table會放在1M以下的某個位址(一般都是在E0000h~FFFFFh),然後OS就可以透過搜尋”Signature”(某個標記字)的方式來找到其他的Acpi Table entry point。

[勘誤] 應該是RSDP Structure 不是 RSDP Table ,打錯了 >.< ,感謝糾正! 這個Struct內的RSD PTR欄位會指向RSDT Table ,而如何找這個Struct的方式就是在1M以下的地方找”RSD PTR”,有興趣的自己用Debug.com 找看看吧 ^^。 4. OS 需要有一個 AML 翻譯器去翻譯這些AML Code,然後執行他們。 5. 每個Platform 的Host Controller 的暫存器位址會不同,所以BIOS需要透過ACPI Table來告知OS這些暫存器的位址,這樣子做的好處是OS不需要知道你是在什麼Platform,因為他只單純看BIOS所提供的H/W 資訊。 6. ACPI Table還可以用來當作OS 啟動金鑰,例如SLIC Table就是一個例子,OS透過檢查包在BIOS ROM中的ACPI Table的內容來決定是不是一個台OEM 電腦。 其他詳細介紹請參閱ACPI Spec 3.0b 以及微軟網站介紹,下圖為參考微軟文件說明:

======================================================================

ACPI和APIC有什麽關系?[轉貼]
資料來源 : http://mlsx.xplore.cn/2006/01/12/what-difference-between-acpi-and-apic.html


很多人問道了什麽ACPI,什麽是APIC,他們有没有關系?名字這麽相近。下面給出我對其的一些理解,具體的解釋可以查看内核文檔庫的内核參數文件:
/usr/src/`uname -r`/Documents/kernel-parameters.txt

ACPI就是Advanced Configuration and Power Interface的縮寫,意思是“高級配置與電源接口”。這是英特爾、微軟和東芝共同開發的一種電源管理標准。
ACPI可實現以下功能:   
1、用户可以使外設在指定時間開關;   
2、使用筆記本電腦的用户可以指定計算機在低電壓的情况下進入低功耗狀態,以保證重要的應用程序運行;   
3、操作系統可以在應用程序對時間要求不高的情况下降低時鐘頻率;
4、操作系統可以根據外設和主板的具體需求為它分配能源;
5、在無人使用計算機時可以使計算機進入休眠狀態,但保證一些通信設備打開;
6、即插即用設備在插入時能够由ACPI來控制。
不 過,ACPI和其他的電源管理方式一様,要想享受到上面這些功能,必須要有軟件和硬件的支持。在軟件方面,Windows 98及其後續産品和Windows 2000都對ACPI給予了全面的支持;而Linux的内核目前對此支持得并不是太理想。硬件方面比較麻煩,除了要求主板、顯卡和網卡等外設要支持 ACPI外,還需要機箱電源的配合。電源在提供5伏電壓給主板的同時,還必須使電流穩定在720毫安以上才可以,這様它才能够實現電腦的“睡眠”和“唤醒 ”。
ACPI共有六種狀態,分別是S0到S5,它們代表的含義分別是:
S0–實際上這就是我們平常的工作狀態,所有設備全開,功耗一般會超過80W;
S1–也稱為POS(Power on Suspend),這時除了通過CPU時鐘控制器將CPU關閉之外,其他的部件仍然正常工作,這時的功耗一般在30W以下;(其實有些CPU降温軟件就是利用這種工作原理)
S2–這時CPU處於停止運作狀態,總線時鐘(Bus Clock)也被關閉,但其餘的設備仍然運轉;
S3–這就是我們熟悉的STR(Suspend to RAM),這時的功耗不超過10W;
S4–也稱為STD(Suspend to Disk),這時系統主電源關閉,但是硬碟仍然帶電並可以被唤醒 再進入系統時需重跑BIOS,如同WindowsXP的睡眠模式行為;
S5–這種狀態是最乾脆的,就是連電源在内的所有設備全部關閉,功耗為0。
我們最常用到的是S3狀態,即Suspend to RAM(載入到記憶體)狀態,簡稱STR。顧名思義,STR就是把系統進入STR前的工作狀態數據都存放到記憶體中去。在STR狀態下,電源仍然繼續為記憶體等 最必要的設備供電,以確保數據不丢失,而其他設備均處於關閉狀態,系統的耗電量極低。一旦我們按下Power按鈕(主機電源開關),系統就被唤醒,馬上從 内存中讀取數據並恢復到STR之前的工作狀態。記憶體的讀寫速度極快,因此我們感到進入和離開STR狀態所花費的時間不過是幾秒鐘而已;而S4狀態,即 STD(載入到硬盤)與STR的原理是完全一様的,只不過數據是保存在硬盤中。由於硬盤的讀寫速度比内存要慢得多,因此用起來也就没有STR那麽快了。 STD的優點是只通過軟件就能實現,比如Windows 2000就能在不支持STR的硬件上實現STD。
之前的電源管理是APM(Advanced Power Management),那麽ACPI和APM相比有什麽區別呢?

2、ACPI與APM比較
APM 1.0&1.1:由BIOS執行電源管理;
APM 1.2:操作系統定義電源管理時間,由BIOS負責執行;
ACPI:BIOS收集硬件信息,定義電源管理方案;由操作系統負責執行。
APM是一種軟件解决方案,因此是與操作系統有關的, 而ACPI是工業標准,包括了軟件和硬件方面的規範。

APIC (高級可編程中斷控制器)對計算機來講有兩個作用,
一是管理IRQ的分配,可以把傳統的16個IRQ擴展到24個(傳統的管理方式叫PIC),以適應更多的設備。
二是管理多CPU。由於Nf2主板并不支持多CPU,所以,APIC關閉直接的影響是减少了可用的IRQ。
不過,如果板卡不是非常多的話,關閉 APIC對系統是没有什麽影響的。
要實現SMP功能,我們使用的CPU必須具備以下要求:
CPU 内部必須内置APIC單元。Intel 多處理規範的核心就是高級可編程中斷控制器(Advanced Programmable Interrupt Controllers–APICs)的使用。CPU通過彼此發送中斷來完成它們之間的通信。通過給中斷附加動作(actions),不同的CPU可以在 某種程度上彼此進行控制。每個CPU有自己的APIC(成為那個CPU的本地APIC),並且還有一個I/O APIC來處理由I/O設備引起的中斷,這個I/O APIC是安裝在主板上的,但每個CPU上的APIC則不可或缺,否則將無法處理多CPU之間的中斷協調。
APIC可能遇到的問題,很多這類問題可以通過BIOS更新來解决。
下面的是通過更改HAL類型來解决
  CPU實際運行頻率與BIOS設定頻率不符
  NF2的用户大约有10%的會出現CPU實際運行頻率與BIOS設定頻率不符的問題。我們稱之為“頻率不對”。
  這種現象帶來的直接後果就是在測試3dmark或跑3D游戲的時候,會感覺不流暢,也稱之為“頓”。
   一般在更改BIOS設置後、更新驅動後重啓時,用測試軟件如Aida32、MBM5等可以看到CPU的運行頻率和你在BIOS裏設置得不一様,而且差距 很大。這個時候,用super pi測試CPU速度,會比平常花費時間長好幾秒,用3dmark跑測試,會比平常低幾百分甚至上千分。在3dmark中看到的CPU頻率,也與BIOS設 定不符合。
  如果出現這種情况,則屬於我們所討論的“頻率不對”的問題。
  不過,不是所有的3D游戲“頓”都是這個原因。判斷的方法是:如果你只有個別游戲“頓”,或者用上述軟件測試頻率正確,就不是此問題。
  如果判斷確實屬此問題,解决的方法也很簡單,經過網友討論,只要關閉APIC功能即可。(注意,是APIC,不是ACPI)。

有一些服務器(比如IBM的,HP的),安裝LINUX時,會給出内核的錯誤,導致無法安裝,這個時候可以在安裝的時候輸入linux acpi=off noapic應該是安裝上的。

=============================================

ACPI Overview

出處:http://blog.csdn.net/celiaqianhj/article/details/6740124

最近有些时间,重温了一下ACPI SPEC Rev4.0,发现之前无法理解的东西,现在也不是那么难懂了。现整理一下笔记。
先来明确两个概念:ACPI,OSPM
ACPI:Advanced Configuration and Power Interface 高级配置和电源接口
OSPM:Operation System directed configuration and Power Management 操作系统直接电源管理
在ACPI SPEC中,随处可见OSPM,那么OSPM到底是什么呢?
原来,在早期的电脑中,电源管理完全是由通过APM(Advanced Power Management)来实现的,OS对此一无所知也无从干预。这种管理方式存在很多的缺陷,且BIOS维护APM代码和功能需要非常大的精力。ACPI规范就是为了解决APM的缺陷而问世的,它允许操作系统来控制电源管理,从而解放了BIOS。但是ACPI只是一个接口规范,除了硬件Support、BIOS support之外,OS 也需要support。支持ACPI的OS就可以叫做OSPM。 OSPM的最低要求如下:
1). 在Intel架构的系统上使用system address map reporting interface来得到system address map
      a. INT15H,E820H
       b. EFI GetMemoryMap() Boot Service Function
2).Find and consume the ACPI System Description Tables.
3). 安装启用一个支持所有已定义的AML语法元素的AML interpreter(翻译器)。
4). 支持ACPI Event programming model,包含handing SCI interrupt,managing fixed events/general-propose events/embedded controller interrupt /dynamic device support.
5). 枚举和配置ACPI Namespace中描述的主板设备。
6). 实现以下ACPI devices的支持:Embedded Controller Device/GPE Block Device/Module Device。
7). 安装ACPI Thermal Model。
8). 支持acquisition(获得) and release(释放) Global Lock。
9).  支持OS-directed power management.(设备驱动负责维护device context)。
ACPI的结构
ACPI包含三个run-time Components:
1.       ACPI Tables
         主要描述一个Platform上的硬件界面资讯,这些描述包含了一些固定的寄存器的位置,或是说明一些Register Blocks,另外ACPI Tables还包含了一些OS可以执行的AML Code,OS会透过自己的AML Interpreter来执行这些AML Code。
2.       ACPI Registers
        在ACPI Register中是实体的硬件界面,这些寄存器就是被描述在ACPI Tables中的那些。
3.       ACPI BIOS
        符合ACPI规范的BIOS,典型情况下,他会做系统开关机的动作以及实做Sleep界面的支援(BIOS支援S3/S4/…)。
ACPI可以实现的功能

1. 系统电源管理 System Power Management
     Global Power State:
          G0: Working –S0
          G1: Sleeping –S1/S3/S4
          G2: Soft off –S5
          G3: Mechanical off        
       
2. 设备电源管理 Device Power Management
              PCI, PCI Express, CardBus, USB, IEEE 1394
       Device Power State:
           D0: fully on 设备可以完全回应,正常工作
           D1: 不同Device Class有不同规范,一般会节省一些电源
           D2: 不同Device Class有不同规范,但并非大多数设备都有支援,比D1更省电,通常会关闭一些设备上的功能来达到省电的目的。
           D3hot: 不同Device Class有不同规范,当要转到D0 状态是,OS SW要重新初始化该设备
           D3: off 电源完全从设备移除
3. 处理器电源管理 Processor Power Management
       在G0状态下,Processor Power State:C0, C1, C2, C3…
4. 设备和处理器性能管理 Device and Processor Performance Management
       在C0/D0状态下,Device/Processor Performance State: P0, P1, P2, P3…
5. 配置/即插即用 Configuration/Plug and Play
6. 系统事件 System Events
7. 电池管理 Battery Management
8. 温度管理 Thermal Management
9. 嵌入式控制器 Embedded Controller
10. SMBus控制器 SMBus Controller
 ==============================================================================
APM全称Advanced Power Management,中文名称高级电源管理,目前最新的APM标准是1.2,它是一种基于BIOS的系统电源管理方案,它提供了CPU和设备电源管理并通过设备工作超时设定来决定何时将设备转换到低耗能状态。
    1.由于基于APM的BIOS都有它自己的电源管理方案,使得计算机与计算机之间缺乏一致性,每个BIOS开发者必须精心维护自己的APM BIOS代码和功能。     2.系统进入挂起的原因无法知晓。用户是否按了进入睡眠按钮,还是BIOS认为系统已进入了空闲状态,或者电池电压过低,这些信息APM都无法知道,但是Windows必须要知道挂起的原因,即使系统没有进入空闲状态。     3.BIOS无法知道用户在干什么,只有通过监视中断和I/O端口来猜测用户的活动。有时,BIOS会使系统处于完全混乱的状态,当系统没有空闲时将系统挂起或者当系统处于空闲状态时,却不进入挂起状态。     4.早期版本的BIOS APM(1.0和1.1)不提供任何系统性能信息,系统是否支持睡眠状态就只有尝试将系统转入睡眠模式才知道。如果BIOS不支持睡眠模式,那将导致死机。BIOS APM 1.2解决了这个缺陷。     5.BIOS对USB设备、加插的电脑配件卡和IEEE1394设备全然不知,导致当以上设备没有进入空闲状态,而BIOS却认为系统已经进入空闲状态,从而发生冲突,使这些设备无法正常使用或系统死机。
    由于APM有以上不足,因此ACPI应运而生。
    ACPI全称Advanced Configuration Power Interface,中文名称高级配置电源界面,ACPI是为了解决APM的缺陷而问世的。它定义了许多新的规范:     1.ACPI将现有的电源管理BIOS代码、APM应用编程接口、PNP BIOS应用编程接口、多处理器规范表格等集合成一种新的电源管理和配置接口规范。     2.ACPI允许操作系统(不是BIOS)控制电源管理,这点与APM不相同。     3.ACPI标准定义了硬件寄存器、BIOS接口(包含配置表格、控制方法以及主板设备列举和配置)、系统和设备的电源状态和ACPI热模型。     4.BIOS支持的代码不是用汇编语言而是用AML(ACPI Machine Language,ACPI机器语言)编写的。BIOS不能决定用于电源管理或资源管理的策略或超时。     5.使用ACPI系统的所有设备可以互相通信来了解彼此的使用情况,并且都受操作系统的控制,操作系统对正在运行的系统状态了如指掌,所以操作系统处于执行电源管理的最佳位置。
    综上所述,ACPI与APM有着很多的优势,推荐使用ACPI来管理系统。
    下面通过WinXP关机问题来进一步探讨它们之间的区别与应用。有人问为什么在WinXP的控制面板→电源选项中没有高级电源管理选项页和启用高级电源管理支持选项,从而使系统无法正常关机。其实在2000年以后出现的主板BIOS大都支持ACPI管理,因此当Power Management Setup中的ACPI function设为Enabled时,WinXP已经接管和控制了电源管理。所以系统中不会出现APM的选项页,当然也就不会出现启用高级电源管理支持选项。大多数的WinXP是可以正常关机,如果不能关机,原因可能是ACPI存在兼容性问题,解决的方法是升级最新的BIOS文件。如果还是不行,就把Power Management Setup中的ACPI function设为Disabled,并将PM Control by APM设为Yes。然后重启进入WinXP就会发现在控制面板→电源选项中多出了高级电源管理选项页(APM)和启用高级电源管理支持选项,只要勾选启用高级电源管理支持,并且在注册表的HKEY_LOCAL_MACHINE/SOFTWARE /Microsoft/Windows NT/CurrentVersion/ Winlogon中找到PowerdownAfterShut- down,并将值设为1,再重启,通常问题就可解决。

========================================================================

ACPI Tables
出處:http://blog.csdn.net/celiaqianhj/article/details/6742852

ACPI SPEC定义了ACPI-compatible OS与BIOS之间的接口,ACPI Tables就是BIOS提供给OS的硬件配置数据,包括系统硬件的电源管理和配置管理。
BIOS在POST过程中,将RSDP存在0xE0000–0xFFFFF的内存空间中,然后Move RSDT/XSDT, FADT, DSDT到ACPI Recleam Area, Move FACS到ACPI NVS Area,最后填好表的Entry链接和Checksum。
控制权交给OS之后,由OS来开启ACPI Mode,首先在内存中搜寻ACPI Table,然后写ACPI_Enable到SMI_CMD,SCI_EN也会被HW置起来。
ACPI Tables根据存储的位置,可以分为:
1).  RSDP位于F段,用于OSPM搜索ACPI Table,RSDP可以定位其他所有ACPI Table
2).  FACS位于ACPI NVS内存,用于系统进行S3保存的恢复指针,内存为NV Store
3). 剩下所有ACPI Table都位于ACPI Reclaim内存,进入OS后,内存可以释放
ACPI Table根据版本又分为1.0B,2.0,3.0,4.0。
2.0以后,支持了64-bit的地址空间,因此几个重要的Table会不大一样,比如:RSDP,RSDT,FADT,FACS。简单的列举一下不同版本的ACPI Table:
1) ACPI 1.0B:RSDP1,RSDT,FADT1,FACS1,DSDT,MADT,SSDT,HPET,MCFG等
2) ACPI 3.0 :RSDP3,RSDT,XSDT,FADT3,FACS3,DSDT,MADT,HPET,MCFG,SSDT等
以系统支持ACPI3.0为例子,说明系统中ACPI table之间的关系如图:
 其中绿色代表在内存F段,蓝色是ACPI Reclaim内存,红色是NV store内存
RSDP:Root System Description Pointer
OSPM获得RSDP的方式:
a>. 在Legacy系统下,在Memory Space 0xE0000—0xFFFFF中 Search RSDP的signature: “RSD PTR ”。
b>. 在UEFI系统下, 在EFI System Table里的EFI Configuration Table中Search RSDP的GUID。
1.       RSDT(Root System Description Table)              Signature: ‘RSDT’
         为了兼容ACPI1.0而存在,XSDT取代了RSDT的功能。 如果XSDT存在,ACPI-compatible OS 必须使用XSDT。
2.       XSDT(Extended System Description Table)      Signature: ‘XSDT’
          一组64bit的物理指针,指明其他system description tables的Address。         
3.       FADT(Fixed ACPI Description Table)            Signature: ‘FACP’
          FADT包含了OS直接管理ACPI Hardware Register Blocks所必须的Fixed Hardware ACPI information,比如PM1a_EVT_BLK, PM1b_EVT_BLK, PM1a_CNT_BLK, PM1b_CNT_BLK, PM2_CNT_BLK, PM_TMR_BLK, GPE0_BLK, and GPE1_BLK这些的base address。
          通过FADT可以找到FACS和DSDT。
4.       FACS(Firmware ACPI Control Structure)              Signature: ‘FACS’
          The FACS contains the system’s hardware signature at last boot, the firmware waking vector, and the Global Lock。
hardware signature:由BIOS搜集,当系统从S4唤醒的时候,OSPM通过比较当前的和已保存的hardware signature是否一致来确定系统能否恢复
firmware waking vector:在休眠之前,OSPM来填写这一项,在POST时,BIOS来确定这一项是否不为空,若不为空则通过jump到这个Address来把控制权交给OSPM。
5.       DSDT(Differentiated System Description Table)                 Signature: ‘DSDT’
          DSDT包含了Differentiated Definition Block, 它们包含了整个系统的实现和配置信息。OS在系统启动的过程中将DSDT的information插入到ACPI Namespace, 而且从不会被移除。
6.       SSDT(Secondary System Description Table)                Signature: ‘SSDT’
         SSDT是DSDT的继续。可以有多个SSDT存在。OSPM在Load DSDT 创建出ACPI Namespace之后,会去逐个Load SSDT。注意:附加的tables 只能add data, 而不能override data。
7.       MADT(Multiple APIC Description Table)              Signature: ‘APIC’
        描述OS支持APIC/SAPIC所必须的information,比如IO-APIC address/Local-APIC address等等。
8.       SBST(Smart Battery Table)            Signature: ‘SBST’
         如果系统支持符合Smart Battery Specification V1.0 1.1的电池,则SBST就会存在。主要用来指明:
               Warning Energy Level:Warning时的Energy Level
               Low Energy Level: OSPM即将进入Sleep状态时的Energy Level
              Critical Energy Level: OSPM将要执行紧急关机时的Energy Level
9.       MCFG(PCI-Memory Mapped Configuration table and sub-table)          Signature: ‘MCFG’

         PCI Express memory mapped configuration space base address Description Table

================================================================================

ACPI NameSpace
出處:http://blog.csdn.net/celiaqianhj/article/details/6749801

ACPI NameSpace(命名空间)
概念
ACPI NameSpace是存在于OS-Controlled内存中的,包含命名对象(Named Objects)的,一个分层的树状结构。
1、 这些Objects包含:data objects, control method objects, bus/device package objects, 等等。
2、ACPI NameSpace中所有的信息都来自于DSDT(Differentiated System Description Table)。DSDT中包含有Differentiated Definition Block, and one or more other definition blocks. Definition Block包含着硬件实现和配置的详细信息。
3、在Runtime阶段,OS通过loading and/or unloading ACPI Tables中的definition blocks来动态的改变NameSpace的内容。
4、OS枚举主板上的设备,就是通过读ACPI NameSpace来寻找包含有HardwareIDs的Devices。
5、每个ACPI列举的device在ACPI NameSpace中都有一个ACPI-defined Object,它报告了这个device能够占用的Hardware Resource。
6、ACPI主要用来列举和配置没有其他硬件规范的MB Devices。例如,ACPI不会列举主板上的PCI Devices,这些设备的Plug and Play信息就不会包含在ACPI NameSpace中,但是他们的Power Managed的信息和insertion/removal控制信息仍会存在于NameSpace中。
命名规则
1、固定长度为32bits
2、第一个Byte包含’A’-‘Z’,’_’  (0x41-0x5A,0x31–0x39,0x5F)
3、剩下三个Byte包含含’A’-‘Z’,’0’–‘9’,’_’ (0x41-0x5A,0x31–0x39 ,0x5F)
4、若不足四个字符,AML编译器会自动在末尾补‘_’
5、以‘_’开头的名字是为这份Spec中保留的,Defination Blocks只能使用以‘_’开头的名字
6、以‘’开头,后接name,说明这个name参考the root of the namespace。
7、以‘^’开头,后接name,说明这个name参考the parent of current namespace。
预定义的Root Namespace
Pridefined Objects
System Configuration Object
_PIC Method
================================================================================

ACPI Hardware Specification

出處:http://blog.csdn.net/celiaqianhj/article/details/6752499

ACPI 定义了ACPI-Compatible OS控制和管理ACPI-Compatible Hardware平台的标准接口机制。 在这里,ACPI定义“Hardware”为一个programming model及其behavior。
ACPI Hardware分类
Fixed和Generic。Fixed类的Hardware符合ACPI Spec定义的Programming和Behavior;而Generic类的Hareware在实现上则更具灵活性。
ACPI Hardware Feature分类
Fixed Hardware Feature有如下规定:
1. 性能相关的feature
2. 唤醒过程中driver需要的feature
3. 允许从灾难性的OS软件失败恢复所需要的feature
Generic Hardware Feature是由ACPI Namespace中的ACPI Control method所控制的,比较灵活。
ACPI定义了实现Generic Hardware时可以使用的八种Address space:
1. System I/O
2. System Memory
3. PCI Configuration Space
4. Embedded Controller
5. SMBus
6. CMOS
7. PCI  Bar Target
8. IPMI(Intelligent Platform Management Interface)
ACPI Register Model
Fixed Hardware Register, 是实现ACPI-defined interface所必须的。在FADT中由OEM定义,是固定的,不能再改变。
                    
Generic Hardware Register,是Value-added Hardware 产生的events所必须的。
================================================================================
ACPI中ASL的简单介绍
ACPI(Advanced Configuration and Power Interface)中,一个特色是有自己专门的一个语言来编写ACPI的那些表。这个语言叫做:ASL(ACPI Source Language). ASL在经过编译器编译后,变成AML(ACPI Machine Language)。然后由OSPM(一般也就是OS)来执行。

AML是一种BYTECODE,类似JAVA BYTECODE。也就是说,他并不是直接在机器上执行的2进制代码,而是需要OS来解释后执行。这样做的好处是方便错误检查,减少由于代码没写好而带来的负面影响。

本文主要介绍下ASL,并把他和其他常见的编程语言,比如C,C++,JAVA,PERL之类的进行对比。适合初学者。另外,作者本人也是刚刚学ACPI, ASL,所以文中也许有不对的地方,欢迎大家指正。

在学ASL之前,我也学过一些编程语言,比如C,C++,JAVA,PERL之类。所以在开始学ASL的时候,有意无意的同这些以前学的语言进行比较。慢慢的,我发现ASL同前面提的这些语言差别还是很大的。下面简要介绍下ASL的特性和差别。

1、ACPI NAMESPACE与一般的常量,变量的区别。
一般的编程语言中操作的是常量和变量。这些变量之间一般没啥关系,可以说是一堆平行(有序或者随机排列的)的内存地址而已。而在ACPI中,这个发生了明显变化。ACPI引入了一个NAMESPACE的观念。也就是说所有的OBJECT之间是有等级关系的。类似一个文件或者注册表系统,各个ACPI OBJECT(类似常量)之间都存在于一个路径下面,其中的根目录就是以符号“”来表示。然后上下级目录之间用“.”来连接起来。

比如_SB_. FOO.BAR 就表示根目录下的_SB_这个OBJECT下的FOO OBJECT下的BAR OBJECT.

因此,在ACPI中,很多操作都是作用在这个NAME SPACE 中的某个OBJECT上面。并由此引入了一系列相关概念。比如SCOPE。

为什么要这样设计呢?因为ACPI本身是一个针对性很强的规范,就是电源管理。因此把这些常用的OBJECT排列好,分类好。处理起来也方便。灵活性比一般的编程语言差了,但是简单,并且能满足设计要求。

2、ASL中有大量的OPERATOR(操作符)。
基本上看一段ASL代码,其中操作符占掉了大部分。比如ASL中很多都是如下形式:Device(PCI0)。一般在小括号前面的都是操作符,也就是预先定义好的。这也是因为ASL本身的目的就很简单,所以很多东西可以先定好。

参考资料:
ACPI SPEC 4.0, CHAPTER 5, 18.

=================================================================================
DSDT: DSDT 称做 Differentiated Definition Block,存在于 BIOS 中并与当前的硬件平台兼容的,提供了系统的硬件特性(例如某些设备的内部寄存器和存储器)的应用策略和配置,在系统初始化的时候,DSDT 被当前系统启动时初始化到名字空间中。
  
  FADT:FADT 中包含了 ACPI 的硬件寄存器组(GPE)的应用和配置(包含它们的硬件地址)也包括DSDT表的硬件地址。
  
  ACPI Namespace: 对于ACPI层来说,内存维持了一个目录形式的指向每个设备,以及 GPE 的名字空间,这个名字树是通过初始化的时候由 DSDT 创建的,名字树可以通过 loadtable 方法从 BIOS 中载入 DSDT 改变,而每个设备在 ACPI 层中都被描述成一个对象,包含有对这个设备特性和操作策略的描述列表,系统所有类型设备都是保存在同一个名字树下。在 ACPI OS 层上调用 _ADR 来获得 Namesapce 的设备名,Namespace 的例子见例 1-1:
  
  OSPM(OS-directed Power Management):OSPM 操作系统支持 ACPI 的一个部分,操作系统(OS)可以从操作系统下驱动程序的角度控制 ACPI 子模块,同时支持 ACPI 包括 SCI 中断,设备事件,系统事件模式,这些事件模式可以充分支持 Hot-plug 方式。
  
  SCI 中断:(System Control Interrupt) 系统控制中断,SCI 中断是一种源自 ACPI 兼容芯片系统中断,系统映射不同的 ACPI 事件中断向量以便共享此中断,当底层硬件产生 SCI 中断的时候(例如设备插入事件引发中断),根据通知 OSPM 层处理相对应的 ACPI 事件,OSPM 层会调用预先安装的中断句柄。
  
  GPE Block Device 和 GPE 事件:GPE Block Device 是平台设计者可按照 FADT(Fixed ACPI Descriptor Table) 描述表中响应 GPE 的寄存器组,GPE 的输入脚。作为 GPE 设备描述块中的地址存在于 FADT 中,每个 GPE Block Device 可以容纳 128 个 GPE 事件,ACPI 层上提供两个通用目标寄存器组–GPE0_BLK 和 GPE1_BLK,(也就是说可以响应 256 个 GPE 事件)每个寄存器组中包含两个等长度的寄存器 GPEx_STS,GPEx_EN,他们的系统地址(硬件地址)都保存在 FADT 中,作为 GPE Blocks 的行为(或者是操作)描述部分存在于 ACPI 名字空间中;用于指示当前的设备的事件,例如设备插入/拔除事件发生的时候,相关的状态位(GPEx_STS中的位,这个是在硬件设计的时候相关设备的事件信号会连接到这些状态位)会被外部的事件所置位,生成 SCI,让 OSPM 层运行相关的控制程方法通知 ACPI 层;GPEx_EN 表示每个事件的使能位,一般说来在南桥(ICH4)中有这几个寄存器,它们的硬件地址保存在 FADT 中。
  
  GPE 事件就是通过 GPE 寄存器组引发 SCI 中断后,通告 OSPM 层有关设备的事件,例如下面介绍 Hot-Plug 的时候会详细或者简略地介绍到总线枚举,设备检查,设备唤醒,设备弹出几个事件。
  
 
  ACPI” Source Language(ASL):ASL 语言是 ACPI 层用于描述特定的 ACPI 对象的 ACPI 专用语言,并且包括了 ACPI 对象的控制方法(Control method),OEM 厂商和 BIOS 设计者在 BIOS 中使用 ASL 定义所有的设备为 ACPI 对象,并且可以生成 ASL 格式的专门的控制方法,1-1 例就是关于 ASL 的例子:
  ASL 的语法规参看 ACPI Specification Revision 2.0
  AML 和 AML 分析器:AML 是 ACPI 控制方法的虚拟机器语言,AML 执行过程也就是 ACPI 核心驱动层,ACPI 控制方法使用 AML 来进行编写,但是通常而言对编写者来说是写成 ASL 的方式,通过 AML 翻译器进行翻译,AML 翻译器不但具备 ASL 的翻译的功能,而且可以执行 AML 方法,当用 ASL 编写的 DSDT 表被载入到名字空间的时候,将会被 AML 翻译器翻译成执行时候可以辨别的机器码,例如关键字 SCOPE 在进入 AML 编译器之前中是以一个 ACSII 编码保存在 DSDT 中,但 DSDT 被载入名字空间之后将变成 0×10 的单字节数值(AML 操作值为 ScopeOP)。对 AML 的编译过程和转换方式,ASL 中的关键字可以参看 ACPI Specification Revision 2.0 中 section 17 。

=======================================================================

Note: 淺談 _GPE of ACPI

出處:http://kunyichen.wordpress.com/2011/03/22/note-%E6%B7%BA%E8%AB%87-_gpe-of-acpi/

在ACPI 的 DSDT Table 會有一個 _GPE Object 是用來讓OSPM 做 General-Purpose Event Handling (see Section 5.6.4 in ACPI 4.0a spec.)的動作指引.

這裏是用 Thinkpad X60 當做解說材料, 對應到 ICH7 (Intel ICH7 datasheet), Dump ACPI的方法可以參考之前的 Note: Dump ACPI Tables , iasl 我現在用的是 Intel 20090730 版本

_GPE 是HW/SW共同建構的, 主要是用來辨識SCI發生後, 系統需要另外處理的事件, 在Intel platform 裡 ICH 會包含一個 ACPI 對應I/O Registers, ICH7 稱Power Management I/O Registers (see 10.8.3 in Datasheet), 而ICH7 負責GPE的, 是 GPE0_STS/GPE0_EN 兩個暫存器, 這個可以在 FADT/ACPI Table找到對應的 GPE0_BLK (Section 4.7.4 in ACPI 4.0a)

_GPE在Section 5.6.4.1 in ACPI 4.0a 說明了, Event 的種類會有 _Exx/_Lxx/_Qxx 三種, E是Edge的縮寫, L是Level, Q則是 Query (from Query commad 0×84 of EC, Q event 對應 SMBUS Device與EC), 在Intel Platform上用到的主要是L與 Q event

下面是X60 用的 _GPE 描述

Scope (_GPE)
{
Method (_L18, 0, NotSerialized)
{
Store (_SB.PCI0.LPC.EC.HWAK, Local0) // X60 的EC 透過 Read 這各 Byte 來清除 EC的 Wakeup event 處理, see coreboot patch
Store (Local0, RRBF)
Sleep (0x0A)
If (And (Local0, 0×02)) {}
If (And (Local0, 0×04))
{
If (W98F)
{
Notify (_SB.SLPB, 0×02)
}
Else
{
Notify (_SB.LID, 0×02)
}
}

If (And (Local0, 0×10))
{
And (Local0, 0xF7, Local0)
Notify (_SB.SLPB, 0×02)
}

If (And (Local0, 0×08))
{
_SB.GDCK.GGPE ()
Notify (_SB.SLPB, 0×02)
}

If (And (Local0, 0×40)) {}
If (And (Local0, 0×80))
{
Notify (_SB.SLPB, 0×02)
}
}

Method (_L09, 0, NotSerialized)
{
If (_SB.PCI0.EXP0.PSP0)
{
Store (0×01, _SB.PCI0.EXP0.PSP0)
Notify (_SB.PCI0.EXP0, 0×02)
}

If (_SB.PCI0.EXP1.PSP1)
{
Store (0×01, _SB.PCI0.EXP1.PSP1)
Notify (_SB.PCI0.EXP1, 0×02)
}

If (_SB.PCI0.EXP2.PSP2)
{
Store (0×01, _SB.PCI0.EXP2.PSP2)
Notify (_SB.PCI0.EXP2, 0×02)
}

If (_SB.PCI0.EXP3.PSP3)
{
Store (0×01, _SB.PCI0.EXP3.PSP3)
Notify (_SB.PCI0.EXP3, 0×02)
}
}

Method (_L01, 0, NotSerialized)
{
If (_SB.PCI0.EXP2.HPCS)
{
Store (0×01, _SB.PCI0.EXP2.HPCS)
If (_SB.PCI0.EXP2.ABP)
{
Store (0×01, _SB.PCI0.EXP2.ABP)
}

If (_SB.PCI0.EXP2.PDC)
{
Store (0×01, _SB.PCI0.EXP2.PDC)
Store (0×00, _SB.PCI0.EXP2.XCPF)
Notify (_SB.PCI0.EXP2, 0×00)
If (_SB.PCI0.EXP2.PDS)
{
Store (0×01, _SB.PCI0.EXP2.XCPF)
Sleep (0×64)
Notify (_SB.PCI0.EXP2.EXUP, 0×01)
}
}
}
}

Method (_L02, 0, NotSerialized)
{
Store (0×00, _SB.PCI0.LPC.SWGE)
If (_SB.PCI0.LPC.EC.HKEY.DHKC)
{
If (DT02)
{
_SB.PCI0.LPC.EC.HKEY.MHKQ (0×6022)
}
}

Notify (_TZ.THM1, 0×80)
If (OSPX)
{
Notify (_PR.CPU0, 0×80)
If (MPEN)
{
Notify (_PR.CPU1, 0×80)
}
}
}
}

可以看到 _L18 是從EC讀 Wake-up event 產生的原因, 而 _L18 從 ICH7 的Datasheet (Section 10.8.3)看來應該是接到GPIO8

_L09, 則是對應 PCI Express 的PME Event,

_L01 則是PCI 相關的 HotPlug Event, _L02 則是SWGPE Event 看來是 Thermal 的對應策略!

在 Section 5.6.4 in ACPI 4.0a 有描述 OSPM 應該怎樣處理, 節錄於下

OSPM manages the bits in the GPEx blocks directly, although the source to those events is not directly
known and is connected into the system by control methods. When OSPM receives a general-purpose event
(the event is from a GPEx_BLK STS bit), OSPM does the following:
1. Disables the interrupt source (GPEx_BLK EN bit).
2. If an edge event, clears the status bit.
3. Performs one of the following:
 Dispatches to an ACPI-aware device driver.
 Queues the matching control method for execution.
 Manages a wake event using device _PRW objects.
4. If a level event, clears the status bit.
5. Enables the interrupt source.
For OSPM to manage the bits in the GPEx_BLK blocks directly:
 Enable bits must be read/write.
 Status bits must be latching.
 Status bits must be read/clear, and cleared by writing a “1” to the status bit.

未經允許不得轉載:GoMCU » [收集] ACPI 入門相關資料