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名稱空間中的物件名稱

  1. 所有名稱均為32位長。

  2. 名稱的第一個位元組必須是‘A’ - ‘Z’中的一個,或者‘_’。

  3. 名稱的其餘每個位元組必須是‘A’ - ‘Z’、‘0’ - ‘9’中的一個,或者‘_’。

  4. 以‘_’開頭的名稱由ACPI規範保留。

  5. 符號‘\’表示名稱空間的根(即,以‘\’為字首的名稱是相對於名稱空間根的)。

  6. 符號‘^’表示當前名稱空間節點的父級(即,以‘^’為字首的名稱是相對於當前名稱空間節點父級的)。

下圖顯示了一個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”,其中

  1. ‘object’是物件在sysfs中的目錄名稱。

  2. ‘path’是相應ACPI名稱空間物件的ACPI名稱空間路徑,其值由物件的‘path’sysfs屬性返回。

  3. ‘modalias’是物件的‘modalias’sysfs屬性的值(如本文件前面所述)。

注意

N/A 表示裝置物件不具有‘path’或‘modalias’屬性。