ACPI裝置樹 - ACPI名稱空間的表示¶
- 版權所有:
© 2013, 英特爾公司
- 作者:
鄭律 <lv.zheng@intel.com>
- 鳴謝:
感謝張銳 <rui.zhang@intel.com> 和 Rafael J.Wysocki <rafael.j.wysocki@intel.com> 的幫助。
摘要¶
Linux ACPI子系統將ACPI名稱空間物件轉換為位於 /sys/devices/LNXSYSTM:00 下的Linux裝置樹,並在收到ACPI熱插拔通知事件時對其進行更新。此層次結構中的每個裝置物件在 /sys/bus/acpi/devices 中都有一個相應的符號連結。
本文件闡述了ACPI裝置樹的結構。
ACPI定義塊¶
ACPI韌體在系統記憶體地址空間中設定RSDP(根系統描述指標),指向XSDT(擴充套件系統描述表)。XSDT始終使用其第一個條目指向FADT(固定ACPI描述表),FADT中的資料包含描述硬體固定ACPI功能的各種固定長度條目。FADT包含指向DSDT(差分系統描述表)的指標。XSDT還包含指向可能多個SSDT(輔助系統描述表)的條目。
DSDT和SSDT資料以稱為定義塊的資料結構組織,這些定義塊包含各種物件的定義,包括以AML(ACPI機器語言)編碼的ACPI控制方法。DSDT的資料塊以及SSDT的內容共同構成了一個稱為ACPI名稱空間的分層資料結構,其拓撲結構反映了底層硬體平臺的結構。
上述ACPI系統定義表之間的關係在以下圖表中進行了說明
+---------+ +-------+ +--------+ +------------------------+
| RSDP | +->| XSDT | +->| FADT | | +-------------------+ |
+---------+ | +-------+ | +--------+ +-|->| DSDT | |
| Pointer | | | Entry |-+ | ...... | | | +-------------------+ |
+---------+ | +-------+ | X_DSDT |--+ | | Definition Blocks | |
| Pointer |-+ | ..... | | ...... | | +-------------------+ |
+---------+ +-------+ +--------+ | +-------------------+ |
| Entry |------------------|->| SSDT | |
+- - - -+ | +-------------------| |
| Entry | - - - - - - - -+ | | Definition Blocks | |
+- - - -+ | | +-------------------+ |
| | +- - - - - - - - - -+ |
+-|->| SSDT | |
| +-------------------+ |
| | Definition Blocks | |
| +- - - - - - - - - -+ |
+------------------------+
|
OSPM Loading |
\|/
+----------------+
| ACPI Namespace |
+----------------+
Figure 1. ACPI Definition Blocks
注意
RSDP還可以包含指向RSDT(根系統描述表)的指標。平臺提供RSDT是為了實現與ACPI 1.0作業系統的相容性。如果XSDT存在,作業系統應使用XSDT。
ACPI名稱空間示例¶
所有定義塊都載入到一個單一的名稱空間中。該名稱空間是一個由名稱和路徑標識的物件層次結構。以下命名約定適用於ACPI名稱空間中的物件名稱
所有名稱均為32位長。
名稱的第一個位元組必須是‘A’ - ‘Z’中的一個,或者‘_’。
名稱的其餘每個位元組必須是‘A’ - ‘Z’、‘0’ - ‘9’中的一個,或者‘_’。
以‘_’開頭的名稱由ACPI規範保留。
符號‘\’表示名稱空間的根(即,以‘\’為字首的名稱是相對於名稱空間根的)。
符號‘^’表示當前名稱空間節點的父級(即,以‘^’為字首的名稱是相對於當前名稱空間節點父級的)。
下圖顯示了一個ACPI名稱空間示例
+------+
| \ | Root
+------+
|
| +------+
+-| _PR | Scope(_PR): the processor namespace
| +------+
| |
| | +------+
| +-| CPU0 | Processor(CPU0): the first processor
| +------+
|
| +------+
+-| _SB | Scope(_SB): the system bus namespace
| +------+
| |
| | +------+
| +-| LID0 | Device(LID0); the lid device
| | +------+
| | |
| | | +------+
| | +-| _HID | Name(_HID, "PNP0C0D"): the hardware ID
| | | +------+
| | |
| | | +------+
| | +-| _STA | Method(_STA): the status control method
| | +------+
| |
| | +------+
| +-| PCI0 | Device(PCI0); the PCI root bridge
| +------+
| |
| | +------+
| +-| _HID | Name(_HID, "PNP0A08"): the hardware ID
| | +------+
| |
| | +------+
| +-| _CID | Name(_CID, "PNP0A03"): the compatible ID
| | +------+
| |
| | +------+
| +-| RP03 | Scope(RP03): the PCI0 power scope
| | +------+
| | |
| | | +------+
| | +-| PXP3 | PowerResource(PXP3): the PCI0 power resource
| | +------+
| |
| | +------+
| +-| GFX0 | Device(GFX0): the graphics adapter
| +------+
| |
| | +------+
| +-| _ADR | Name(_ADR, 0x00020000): the PCI bus address
| | +------+
| |
| | +------+
| +-| DD01 | Device(DD01): the LCD output device
| +------+
| |
| | +------+
| +-| _BCL | Method(_BCL): the backlight control method
| +------+
|
| +------+
+-| _TZ | Scope(_TZ): the thermal zone namespace
| +------+
| |
| | +------+
| +-| FN00 | PowerResource(FN00): the FAN0 power resource
| | +------+
| |
| | +------+
| +-| FAN0 | Device(FAN0): the FAN0 cooling device
| | +------+
| | |
| | | +------+
| | +-| _HID | Name(_HID, "PNP0A0B"): the hardware ID
| | +------+
| |
| | +------+
| +-| TZ00 | ThermalZone(TZ00); the FAN thermal zone
| +------+
|
| +------+
+-| _GPE | Scope(_GPE): the GPE namespace
+------+
Figure 2. Example ACPI Namespace
Linux ACPI裝置物件¶
Linux核心的核心ACPI子系統為表示裝置、電源資源處理器、熱區的ACPI名稱空間物件建立 struct acpi_device 物件。這些物件透過sysfs以目錄形式匯出到使用者空間,位於 /sys/devices/LNXSYSTM:00 子樹下。它們的名稱格式為 <bus_id:instance>,其中‘bus_id’指代給定物件的ACPI名稱空間表示,而‘instance’用於區分相同‘bus_id’的不同物件(它是無符號整數的兩位十進位制表示)。
‘bus_id’的值取決於其所屬物件的型別,如下表所示
+---+-----------------+-------+----------+
| | Object/Feature | Table | bus_id |
+---+-----------------+-------+----------+
| N | Root | xSDT | LNXSYSTM |
+---+-----------------+-------+----------+
| N | Device | xSDT | _HID |
+---+-----------------+-------+----------+
| N | Processor | xSDT | LNXCPU |
+---+-----------------+-------+----------+
| N | ThermalZone | xSDT | LNXTHERM |
+---+-----------------+-------+----------+
| N | PowerResource | xSDT | LNXPOWER |
+---+-----------------+-------+----------+
| N | Other Devices | xSDT | device |
+---+-----------------+-------+----------+
| F | PWR_BUTTON | FADT | LNXPWRBN |
+---+-----------------+-------+----------+
| F | SLP_BUTTON | FADT | LNXSLPBN |
+---+-----------------+-------+----------+
| M | Video Extension | xSDT | LNXVIDEO |
+---+-----------------+-------+----------+
| M | ATA Controller | xSDT | LNXIOBAY |
+---+-----------------+-------+----------+
| M | Docking Station | xSDT | LNXDOCK |
+---+-----------------+-------+----------+
Table 1. ACPI Namespace Objects Mapping
根據ACPI系統描述表的內容建立 struct acpi_device 物件時,適用以下規則(如上表第一列的字母和第二列的符號所示)
- N
物件的來源是ACPI名稱空間節點(如第二列中命名物件的型別所示)。在這種情況下,物件在sysfs中的目錄將包含‘path’屬性,其值為從名稱空間根到該節點的完整路徑。
- F
struct acpi_device 物件是為固定硬體功能建立的(如第二列中固定功能標誌的名稱所示),因此其sysfs目錄將不包含‘path’屬性。
- M
struct acpi_device 物件是為具有特定控制方法的ACPI名稱空間節點建立的(如第二列中ACPI定義裝置的型別所示)。包含其名稱空間路徑的‘path’屬性將存在於其sysfs目錄中。例如,如果ACPI名稱空間節點存在 _BCL 方法,將為其建立一個‘bus_id’為LNXVIDEO的 struct acpi_device 物件。
上表的第三列指出了哪些ACPI系統描述表包含了用於建立由給定行表示的 struct acpi_device 物件的資訊(xSDT表示DSDT或SSDT)。
上表的第四列指出了 struct acpi_device 物件的‘bus_id’生成規則
- _HID
表格最後一列中的 _HID 表示物件的 bus_id 來源於對應ACPI名稱空間節點下存在的 _HID/_CID 標識物件。然後,物件的sysfs目錄將包含‘hid’和‘modalias’屬性,可用於檢索該物件的 _HID 和 _CIDs。
- LNXxxxxx
對於 bus_id 為“LNXxxxxx”形式(偽裝置)的 struct acpi_device 物件,也存在‘modalias’屬性,在這種情況下它包含 bus_id 字串本身。
- device
表格最後一列中的‘device’表示物件的 bus_id 無法從對應ACPI名稱空間節點的 _HID/_CID 中確定,儘管該物件代表一個裝置(例如,它可能是一個定義了 _ADR 但沒有 _HID 或 _CID 的PCI裝置)。在這種情況下,字串‘device’將用作物件的 bus_id。
Linux ACPI物理裝置粘合層¶
ACPI裝置(即 struct acpi_device)物件可以連結到Linux裝置層次結構中表示“物理”裝置(例如,PCI總線上的裝置)的其他物件。如果發生這種情況,意味著ACPI裝置物件是某個以其他方式表示的裝置的“伴侶”,並用於 (1) 提供無法透過其他方式獲取的該裝置的配置資訊,以及 (2) 藉助其ACPI控制方法對裝置執行特定操作。一個ACPI裝置物件可以以這種方式連結到多個“物理”裝置。
如果ACPI裝置物件連結到“物理”裝置,其sysfs目錄將包含指向目標裝置物件sysfs目錄的“physical_node”符號連結。反過來,目標裝置的sysfs目錄將包含指向伴侶ACPI裝置物件sysfs目錄的“firmware_node”符號連結。連結機制依賴於ACPI名稱空間提供的裝置標識。例如,如果有一個表示PCI裝置的ACPI名稱空間物件(即,在表示PCI橋的ACPI名稱空間物件下的一個裝置物件),其 _ADR 返回 0x00020000 且父PCI橋的匯流排號為0,則為該ACPI名稱空間物件建立的 struct acpi_device 物件所代表的sysfs目錄將包含指向相應PCI裝置的 /sys/devices/pci0000:00/0000:00:02:0/ sysfs 目錄的‘physical_node’符號連結。
連結機制通常是匯流排特定的。其實現的核心位於 drivers/acpi/glue.c 檔案中,但根據涉及的匯流排型別,在其他地方也有補充部分。例如,其PCI特定部分位於 drivers/pci/pci-acpi.c。
Linux ACPI裝置樹示例¶
對應於圖2所示ACPI名稱空間示例(並增加了固定的PWR_BUTTON/SLP_BUTTON裝置)的 struct acpi_device 物件sysfs層次結構如下所示
+--------------+---+-----------------+
| LNXSYSTM:00 | \ | acpi:LNXSYSTM: |
+--------------+---+-----------------+
|
| +-------------+-----+----------------+
+-| LNXPWRBN:00 | N/A | acpi:LNXPWRBN: |
| +-------------+-----+----------------+
|
| +-------------+-----+----------------+
+-| LNXSLPBN:00 | N/A | acpi:LNXSLPBN: |
| +-------------+-----+----------------+
|
| +-----------+------------+--------------+
+-| LNXCPU:00 | \_PR_.CPU0 | acpi:LNXCPU: |
| +-----------+------------+--------------+
|
| +-------------+-------+----------------+
+-| LNXSYBUS:00 | \_SB_ | acpi:LNXSYBUS: |
| +-------------+-------+----------------+
| |
| | +- - - - - - - +- - - - - - +- - - - - - - -+
| +-| PNP0C0D:00 | \_SB_.LID0 | acpi:PNP0C0D: |
| | +- - - - - - - +- - - - - - +- - - - - - - -+
| |
| | +------------+------------+-----------------------+
| +-| PNP0A08:00 | \_SB_.PCI0 | acpi:PNP0A08:PNP0A03: |
| +------------+------------+-----------------------+
| |
| | +-----------+-----------------+-----+
| +-| device:00 | \_SB_.PCI0.RP03 | N/A |
| | +-----------+-----------------+-----+
| | |
| | | +-------------+----------------------+----------------+
| | +-| LNXPOWER:00 | \_SB_.PCI0.RP03.PXP3 | acpi:LNXPOWER: |
| | +-------------+----------------------+----------------+
| |
| | +-------------+-----------------+----------------+
| +-| LNXVIDEO:00 | \_SB_.PCI0.GFX0 | acpi:LNXVIDEO: |
| +-------------+-----------------+----------------+
| |
| | +-----------+-----------------+-----+
| +-| device:01 | \_SB_.PCI0.DD01 | N/A |
| +-----------+-----------------+-----+
|
| +-------------+-------+----------------+
+-| LNXSYBUS:01 | \_TZ_ | acpi:LNXSYBUS: |
+-------------+-------+----------------+
|
| +-------------+------------+----------------+
+-| LNXPOWER:0a | \_TZ_.FN00 | acpi:LNXPOWER: |
| +-------------+------------+----------------+
|
| +------------+------------+---------------+
+-| PNP0C0B:00 | \_TZ_.FAN0 | acpi:PNP0C0B: |
| +------------+------------+---------------+
|
| +-------------+------------+----------------+
+-| LNXTHERM:00 | \_TZ_.TZ00 | acpi:LNXTHERM: |
+-------------+------------+----------------+
Figure 3. Example Linux ACPI Device Tree
注意
每個節點表示為“object/path/modalias”,其中
‘object’是物件在sysfs中的目錄名稱。
‘path’是相應ACPI名稱空間物件的ACPI名稱空間路徑,其值由物件的‘path’sysfs屬性返回。
‘modalias’是物件的‘modalias’sysfs屬性的值(如本文件前面所述)。
注意
N/A 表示裝置物件不具有‘path’或‘modalias’屬性。