顯示具有 ACPI 標籤的文章。 顯示所有文章
顯示具有 ACPI 標籤的文章。 顯示所有文章

2021年4月27日 星期二

iASL - ASL Optimizing Compiler and Disassembler

參考網站
ACPICA

Errors, Warnings, and Remarks

-ve
只回報Error,忽略Warning及Remark。

編譯 DSDT0000.dsl時只回報 Error iasl.exe -ve DSDT0000.dsl

AML Disassembler

-d <f1 f2 ...>
反組譯 AML檔案回 ASL(*.dsl)

反組譯 DSDT0000.bin回 DSDT0000.dsl 的ASL檔案 iasl.exe -d DSDT0000.bin

-e <f1 f2 ...>
在反組譯AML時,會遇到有些 unresolve external control method,用以指定含有其
external control method的 AML檔

反組譯DSDT0000.bin時,指定 SSDT0000.bin及 SSD10000.bin為含有其
external control method的AML檔
iasl.exe -e SSDT0000.bin SSD10000.bin -d DSDT0000.bin

指定所有 SSD*.bin為含有DSDT0000.bin external control method的AML檔
iasl.exe -e SSD*.bin -d DSDT0000.bin

2021年4月13日 星期二

asl.exe - Microsoft ASL Compiler

參考網站
microsoft-asl-compiler

Windows在使用 ACPI table時,不是每次都從記憶體存取,而是暫存在其登錄檔,透過登錄檔
來存取。可以透過 regedit登錄檔編輯程式來讀取修改 ACPI的登錄檔,其路徑為
Computer\HKEY_LOCAL_MACHINE\HARDWARE\ACPI

而 Microsoft的 WDK提供 asl.exe可以用來取出或取代其中的 ACPI table。

/tab=<TabSig>
將 <TabSig>的 AML反組譯回 ASL檔案,<TabSig>可從 regedit查詢。

取出 DSDT.asl
asl.exe /tab=DSDT

取出所有 ACPI table並存成 ACPI.txt
asl.exe /tab=*

/nologo
不印出logo banner的訊息。

Example 1: without /nologo
asl.exe /tab=DSDT
Output 1:
Microsoft ACPI Source Language Assembler Version 5.0.0NT
Copyright (c) 1996,2014 Microsoft Corporation
Compliant with the ACPI 5.0 Specification

Example 2: with /nologo
asl.exe /nologo /tab=DSDT
Output 2:


/c
將 table存成 .bin檔

取出 DSDT的 AML並存成 DSDT0000.bin
asl.exe /c /tab=DSDT

ACPI-table-load usage


只能用於已存在在系統中的ACPI table

/loadtable
將ACPI table load進 registry中

將 AMLFile load進 registry中
asl.exe /loadtable [-v] [-d] <AMLFile>
-v: verbose mode
-d: 移除先前所 load的 AML檔

在 Windows下修改及替換 DSDT或SSDT table

1. 以DSDT為例,先使用 asl.exe將 DSDT的 AML從 registry取出
asl.exe /tab=DSDT /c
會得到 DSDT0000.BIN。

2. 使用 ASL compiler iasl.exe將 DSDT0000.bin 反組譯。
iasl.exe -d DSDT0000.bin
若是反組譯成功,就會產生 DSDT0000.dsl的 ASL檔。
有時會遇到缺少 external control method的情況導致反組譯失敗,這時就可以使用 -e
參數來 include包含 external control method的 AML檔。

EX: Include SSD0及 SSD1
iasl.exe -e SSD00000.bin SSD10000.bin -d DSDT0000.bin
或是使用 -fe來 include描述 external control method的檔案。

3. 依照需求修改 DSDT0000.dsl

EX: 在 DSDT0000.dsl中加入 Serial port的定義

DefinitionBlock ("", "DSDT", 2, "ACRSYS", "ACRPRDCT", 0x00000000)
{
    External (_GPE.HLVT, MethodObj)    // 0 Arguments
    External (_PR_.BGIA, UnknownObj)
    External (_PR_.BGMA, UnknownObj)
    External (_PR_.BGMS, UnknownObj)
......
    OperationRegion (SERP, SystemIO, 0x3F8, 0x8)
    Field (SERP, ByteAcc, NoLock, Preserve)
    {
      THRR, 8,
      , 8,
      , 8,
      , 8,
      , 8,
      LSRR, 8,
      MSRR, 8
    }

    Name (SS1, Zero)
    Name (SS2, Zero)
......

4. 使用 iasl.exe compile修改過的DSDT0000.dsl
iasl.exe -ve DSDT0000.dsl
成功後就會產生 DSDT0000.aml。
-ve為忽略 warning及 remark,只顯示error。

5. 將DSDT0000.aml load到 registry
asl.exe /loadtable DSDT0000.aml

6. 啟動 Windows test mode
bcdedit /set testsigning on
重新開機以後就能生效。

2019年8月30日 星期五

General-Purpose Event (GPE)


本篇文章參考
ACPI Specification Version 6.3
Vol. 1: Intel® 200 and Z370 Series Chipset Families PCH
Vol. 2: Intel® 200 and Z370 Series Chipset Families PCH

Fixed ACPI Description Table (FADT)

Field   Byte Length   Byte Offset   Description  
Signature   4   0   'FACP'  
......   ......   ......   ......  
GPE0_BLK   4   80   GPE 0 Register Block 的 port address。
若不support,則值為0。
GPE1_BLK   4   84   GPE 1 Register Block 的 port address。
若不support,則值為0。
......   ......   ......   ......  
GPE0_BLK_LEN   1   92   GPE 0 Register Block 所decode 的bytes 長度。
其值必為2的正指數冪。
GPE1_BLK_LEN   1   93   GPE 1 Register Block 所decode 的bytes 長度。
其值必為2的正指數冪。
GPE1_BASE   1   94   GPE1 events在ACPI general-purpose event中
的offset。GPE0 events 的offset為0。
......   ......   ......   ......  

General-Purpose Event Register Blocks

ACPI spec在 FADT table定義了兩組 GPE register blocks:GPE 0與 GPE 1。register block包含 enable 與 status register (ex:GPE0_EN與 GPE0_STS),這兩個 register長度各佔 register block長度的 一半,所以 FADT中 register block的長度 GPE0_BLK_LEN與 GPE1_BLK_LEN必為 2的冪次。



使用RWEverything讀取GPE Register Block


從 FADT table 中可得 GPE0的 IO port addresss為 0x1880,和其使用的長度為 0x20。


與 Intel PCH spec對照,可從 PMC Controller (D31:F2)的 Offset 40-43h讀出 ACPI Base Address,用 RW讀出其值為 0x1801,bit 1代表為 IO space,所以其 IO address為 0x1800。




與 Spec中的 PMC I/O Based Register 對照,Offset 0x80為 GPE0 block register起始位置,跟 FADT table位置為0x1880 (0x1800 + 0x80) 符合。



再用RW 讀取IO address 0x1880,就可得出GPE0 Register Block位置。若要知道GPE register 每 個bit實際上對應的 GPIO pin,則需參考chipset的相關設定。




GPIO


配置 GPIO用以產生 SCI event

要將 GPIO配置成 GPE的 source,要先將 GPIO配置成可以產生 SCI。需先將 GPI General Purpose Event Enable設起來。

還要配置 Pad Configuration中的 GPIROUTSCI bit。



\_GPE

為ACPI predefined 的namespace,用以處理GPE register block中的General events。



使用RWEverything讀取\_GPE


以我所使用的主機板為例,\_GPE中定義了_E02 的Method,表示其為 handle GPE0_STS bit2 edge event的method。




2018年7月24日 星期二

[ACPI] ASL Operator


本篇文章參考
ACPI Specification Version 6.2 (Errata A)
ACPI Specification Version 5.1 (Errata B)
參考章節為CH19 ACPI Source Language(ASL) Reference

Add

Add(Addend1, Addend2, Result) => Integer
將Addend1與Addend2相加存放到Result。

CreateWordField

CreateWordField(SourceBuffer, ByteIndex, WordFieldName)
在SourceBuffer的ByteIndex Offset建立一個Word長度且名為WordFieldName的Object。

DerefOf

DerefOf(Source) => Object
回傳Source所Reference的Object。

Device

Device(DeviceName) {TermList}
建立一個名為DeviceName的Object,用以代表processor、bus或device等硬體。並會開啟一個name scope。

EISAID

EISAID(EisaIdString) => DWordConst
將形式為"UUUNNNN"(U為大寫字母,N為十六進位數字)的文字字串轉換為4 byte長度的EISA ID數字編碼。

Field

Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList}
可用以代表RegionName中的某段區塊資料。
AccessType為預設存取寬度,可為AnyAccByteAccWordAccDWordAccQWordAcc
FileUnitList的Entry可為下列幾種形式,
FieldUnitName, BitLength - Field Unit所使用的命名與長度。Field Unit用以代表某段資料。
Offect (ByteOffset) - 下個Field Unit的Offset。

Include

Include(FilePathName)
引入其他ASL File。

Index

Index (Source, IndexNum, Destination) => ObjectReference
取得 Source 中第 IndexNum項的 Reference。
如 Source為 Buffer,Index會回傳第IndexNum的byte的Reference。
如 Source為 String,Index會回傳第IndexNum的字元的Reference。
如 Source為 Package,Index會回傳第IndexNum的Object的Reference。

Method

Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, ParameterTypes) {TermList}
建立一個名為MethodName的control method,並會開啟一個name scope。
NumArgs代表Method的參數數量。為optional如不使用則代表此Method不使用參數,而最多可使用7個參數,參數分別reference到Arg0 - Arg6
SerializeRule可填為SerializedNotSerialized,Serialized代表此Method不會被其他thread同時存取,用以防止產生相同namespace object。若沒有指定則視為NotSerialized

Name

Name(ObjectName, Object)
建立名為ObjectName的Object,並且references到Object。

OperationRegion

OperationRegion(RegionName, RegionSpace, Offset, Length)
宣告名為RegionName的Operation Region,配合Field Object用以讀取系統硬體空間。

PowerResource

PowerResource(ResourceName, SystemLevel, ResourceOrder) {ObjectList}
宣告名為ResourceName的power resource。

Scope

Scope(Location) {ObjectList}
宣告名為Location的namespace,並且ObjectList以Location為參考namespace。
或將目前namespace切換成已存在的namespace。


2018年7月17日 星期二

[ACPI] Device Configuration


本篇文章參考
ACPI Specification Version 6.2 (Errata A)
ACPI Specification Version 5.1 (Errata B)
參考章節為CH6 Device Configuration

OSPM 會根據 Configuration Object去管理操作相關的 Device,其大致分為幾個類型:

Device identification objects

_ADR (Address)

提供OSPM此裝置在所屬的Bus上的Address。
Bus   Address Encoding  
PCI   High word - Device Number, Low word - Function Number  
(ex: device 3, function 2 會是 0x00030002)  
若要參照device的所有function,Function Number則使用0xFFFF  
USB Ports   Port Number (1-n )  

Device configuration objects

_DIS (Disable)

用來 disable device。

_PRT (PCI Routing Table)

回傳包含PCI interrupt mapping package列表的package。

Device insertion and removal objects

_RMV (Status)

通知OSPM此裝置是否隨時都為可移除。

_STA (Status)

回傳裝置的狀態,其狀態可為enabled、disabled和removal。
若裝置的Object沒有_STA,則視為設起所有的return bit(present、enabled、shown in UI and functioning)。

Other Objects and Control Methods


_INI (Init)

用來對裝置進行特定的初始化操作,在OSPM加載description table時執行,會根據_STA來決定_INI是否及如何執行。


2018年7月3日 星期二

PSPP (PCIe Speed Power Policy)

本篇文章參考來源:
AGESA Interface Specification for Arch2008
BKDG for AMD Family 12h Processors

PSPP 是動態調整PCIe的Link Speed的使用策略,藉此來達到省電的效果,需有處理器的支援。
其透過 Driver及 Interrupt來使用 BIOS所提供的 ACPI method ALIB(ACPI ASL Library) 達成其在Runtime時的所需的功能。

ALIB

ALIB method是由幾組Function所構成的服務。

ALIB (Arg0, Arg1)


 Arg0
     所要使用的Function的號碼。
 Arg1
     Function的輸入及輸出參數,會根據Function而有所不同。

Function 3 - PSPP Start/Stop Management Request

 用來決定是否使用PSPP。