Linux化的 ACPICA - ACPICA 釋出自動化簡介

版權所有:

© 2013-2016, Intel Corporation

作者:

Lv Zheng <lv.zheng@intel.com>

摘要

本文件介紹了 ACPICA 專案以及 ACPICA 和 Linux 之間的關係。它還介紹瞭如何自動更新 drivers/acpi/acpica、include/acpi 和 tools/power/acpi 中的 ACPICA 程式碼以跟隨上游。

ACPICA 專案

ACPI 元件架構 (ACPICA) 專案提供了高階配置和電源介面規範 (ACPI) 的作業系統 (OS) 獨立的參考實現。 它已被各種主機作業系統採用。 透過直接整合 ACPICA,Linux 還可以從其他主機作業系統的 ACPICA 應用經驗中受益。

ACPICA 專案的主頁是:www.acpica.org,它由 Intel Corporation 維護和支援。

下圖描述了包含 ACPICA 適配的 Linux ACPI 子系統

+---------------------------------------------------------+
|                                                         |
|   +---------------------------------------------------+ |
|   | +------------------+                              | |
|   | | Table Management |                              | |
|   | +------------------+                              | |
|   | +----------------------+                          | |
|   | | Namespace Management |                          | |
|   | +----------------------+                          | |
|   | +------------------+       ACPICA Components      | |
|   | | Event Management |                              | |
|   | +------------------+                              | |
|   | +---------------------+                           | |
|   | | Resource Management |                           | |
|   | +---------------------+                           | |
|   | +---------------------+                           | |
|   | | Hardware Management |                           | |
|   | +---------------------+                           | |
| +---------------------------------------------------+ | |
| | |                            +------------------+ | | |
| | |                            | OS Service Layer | | | |
| | |                            +------------------+ | | |
| | +-------------------------------------------------|-+ |
| |   +--------------------+                          |   |
| |   | Device Enumeration |                          |   |
| |   +--------------------+                          |   |
| |   +------------------+                            |   |
| |   | Power Management |                            |   |
| |   +------------------+     Linux/ACPI Components  |   |
| |   +--------------------+                          |   |
| |   | Thermal Management |                          |   |
| |   +--------------------+                          |   |
| |   +--------------------------+                    |   |
| |   | Drivers for ACPI Devices |                    |   |
| |   +--------------------------+                    |   |
| |   +--------+                                      |   |
| |   | ...... |                                      |   |
| |   +--------+                                      |   |
| +---------------------------------------------------+   |
|                                                         |
+---------------------------------------------------------+

           Figure 1. Linux ACPI Software Components

注意

  1. OS 服務層 - 由 Linux 提供,以提供預定義的 ACPICA 介面(acpi_os_*)的 OS 相關實現。

    include/acpi/acpiosxf.h
    drivers/acpi/osl.c
    include/acpi/platform
    include/asm/acenv.h
    
  2. ACPICA 功能 - 從 ACPICA 程式碼庫釋出,以提供 ACPICA 介面(acpi_*)的 OS 獨立實現。

    drivers/acpi/acpica
    include/acpi/ac*.h
    tools/power/acpi
    
  3. Linux/ACPI 功能 - 向其他 Linux 核心子系統和使用者空間程式提供 Linux 特定的 ACPI 功能。

    drivers/acpi
    include/linux/acpi.h
    include/linux/acpi*.h
    include/acpi
    tools/power/acpi
    
  4. 架構特定的 ACPICA/ACPI 功能 - 由 ACPI 子系統提供,以提供 ACPI 介面的架構特定實現。 它們是 Linux 特定的元件,不在本文件的範圍內。

    include/asm/acpi.h
    include/asm/acpi*.h
    arch/*/acpi
    

ACPICA 釋出

ACPICA 專案在以下儲存庫 URL 維護其程式碼庫:https://github.com/acpica/acpica.git。 通常,每個月都會發佈一個版本。

由於 ACPICA 專案採用的編碼風格 Linux 無法接受,因此有一個釋出過程將 ACPICA git 提交轉換為 Linux 補丁。 此過程生成的補丁稱為“linux化的 ACPICA 補丁”。 釋出過程在 ACPICA git 儲存庫的本地副本上進行。 每月釋出中的每個提交都會轉換為 linux化的 ACPICA 補丁。 它們共同構成了 Linux ACPI 社群的每月 ACPICA 釋出補丁集。 此過程如下圖所示

+-----------------------------+
| acpica / master (-) commits |
+-----------------------------+
   /|\         |
    |         \|/
    |  /---------------------\    +----------------------+
    | < Linuxize repo Utility >-->| old linuxized acpica |--+
    |  \---------------------/    +----------------------+  |
    |                                                       |
 /---------\                                                |
< git reset >                                                \
 \---------/                                                  \
   /|\                                                        /+-+
    |                                                        /   |
+-----------------------------+                             |    |
| acpica / master (+) commits |                             |    |
+-----------------------------+                             |    |
               |                                            |    |
              \|/                                           |    |
     /-----------------------\    +----------------------+  |    |
    < Linuxize repo Utilities >-->| new linuxized acpica |--+    |
     \-----------------------/    +----------------------+       |
                                                                \|/
+--------------------------+                  /----------------------\
| Linuxized ACPICA Patches |<----------------< Linuxize patch Utility >
+--------------------------+                  \----------------------/
               |
              \|/
 /---------------------------\
< Linux ACPI Community Review >
 \---------------------------/
               |
              \|/
+-----------------------+    /------------------\    +----------------+
| linux-pm / linux-next |-->< Linux Merge Window >-->| linux / master |
+-----------------------+    \------------------/    +----------------+

            Figure 2. ACPICA -> Linux Upstream Process

注意

  1. Linuxize 實用程式 - 由 ACPICA 儲存庫提供,包括位於 source/tools/acpisrc 資料夾中的實用程式以及位於 generate/linux 資料夾中的許多指令碼。

  2. acpica / master - 位於 <https://github.com/acpica/acpica.git> 的 git 儲存庫的“master”分支。

  3. linux-pm / linux-next - 位於 <https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git> 的 git 儲存庫的“linux-next”分支。

  4. linux / master - 位於 <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git> 的 git 儲存庫的“master”分支。

在將 linux化的 ACPICA 補丁傳送到 Linux ACPI 社群進行審查之前,有一個質量保證構建測試過程來減少移植問題。 目前,此構建過程僅處理以下核心配置選項:CONFIG_ACPI/CONFIG_ACPI_DEBUG/CONFIG_ACPI_DEBUGGER

ACPICA 差異

理想情況下,所有 ACPICA 提交都應自動轉換為 Linux 補丁,而無需手動修改,“linux / master”樹應包含與“new linuxized acpica”樹中包含的 ACPICA 程式碼完全對應的 ACPICA 程式碼,並且應該可以完全自動地執行釋出過程。

但實際上,Linux 中的 ACPICA 程式碼與上游 ACPICA 程式碼之間存在原始碼差異,稱為“ACPICA 差異”。

ACPICA 差異的各種來源包括
  1. 遺留差異 - 在建立當前的 ACPICA 釋出過程之前,Linux 和 ACPICA 之間已經存在差異。 在過去的幾年裡,這些差異已經大大減少,但仍然存在一些差異,並且需要時間來找出其存在的根本原因。

  2. 手動修改 - 顯然,直接在 Linux 原始碼中所做的任何手動修改(例如,編碼風格修復)都會損害 ACPICA 釋出自動化。 因此,建議修復 ACPICA 上游原始碼中的此類問題,並使用 ACPICA 釋出實用程式生成 linux化的修復(請參閱下面的第 4 節瞭解詳細資訊)。

  3. Linux 特定功能 - 有時無法使用當前的 ACPICA API 來實現 Linux 核心所需的功能,因此 Linux 開發人員偶爾必須直接更改 ACPICA 程式碼。 這些更改可能不被 ACPICA 上游接受,在這種情況下,除非 ACPICA 方面可以實施新的機制作為替代,否則它們將作為已提交的 ACPICA 差異保留。

  4. ACPICA 釋出修復 - ACPICA 僅使用一組使用者空間模擬實用程式測試提交,因此 linux化的 ACPICA 補丁可能會破壞 Linux 核心,從而導致構建/啟動失敗。 為了避免破壞 Linux 分割,在釋出過程中將修復程式直接應用於 linux化的 ACPICA 補丁。 當將釋出修復程式反向移植到上游 ACPICA 原始碼時,它們必須遵循上游 ACPICA 規則,因此可能會出現進一步的修改。 這可能會導致出現新的差異。

  5. 快速跟蹤 ACPICA 提交 - 一些 ACPICA 提交是迴歸修復或穩定候選材料,因此它們相對於 ACPICA 釋出過程提前應用。 如果此類提交在 ACPICA 方面被還原或重新定位以提供更好的解決方案,則會生成新的 ACPICA 差異。

ACPICA 開發

本段指導 Linux 開發人員使用 ACPICA 上游釋出實用程式來獲取與上游 ACPICA 提交相對應的 Linux 補丁,然後才能從 ACPICA 釋出過程中獲得它們。

  1. Cherry-pick 一個 ACPICA 提交

首先,您需要 git clone ACPICA 儲存庫,並且您要 cherry pick 的 ACPICA 更改必須提交到本地儲存庫中。

然後,gen-patch.sh 命令可以幫助從 ACPICA 本地儲存庫中 cherry-pick 一個 ACPICA 提交

$ git clone https://github.com/acpica/acpica
$ cd acpica
$ generate/linux/gen-patch.sh -u [commit ID]

這裡的 commit ID 是您要 cherry pick 的 ACPICA 本地儲存庫 commit ID。 如果提交是“HEAD”,則可以省略它。

  1. Cherry-pick 最近的 ACPICA 提交

有時,您需要將程式碼 rebase 到尚未應用於 Linux 的最新 ACPICA 更改之上。

您可以自己生成 ACPICA 釋出系列,並將程式碼 rebase 到生成的 ACPICA 釋出補丁之上

$ git clone https://github.com/acpica/acpica
$ cd acpica
$ generate/linux/make-patches.sh -u [commit ID]

commit ID 應該是 Linux 接受的最後一個 ACPICA 提交。 通常,它是修改 ACPI_CA_VERSION 的提交。 可以透過執行“git blame source/include/acpixf.h”並引用包含“ACPI_CA_VERSION”的行來找到它。

  1. 檢查當前差異

如果您有 Linux 和上游 ACPICA 的本地副本,則可以生成一個差異檔案,指示當前差異的狀態

# git clone https://github.com/acpica/acpica
# git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# cd acpica
# generate/linux/divergence.sh -s ../linux