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
注意
OS 服務層 - 由 Linux 提供,以提供預定義的 ACPICA 介面(acpi_os_*)的 OS 相關實現。
include/acpi/acpiosxf.h drivers/acpi/osl.c include/acpi/platform include/asm/acenv.h
ACPICA 功能 - 從 ACPICA 程式碼庫釋出,以提供 ACPICA 介面(acpi_*)的 OS 獨立實現。
drivers/acpi/acpica include/acpi/ac*.h tools/power/acpi
Linux/ACPI 功能 - 向其他 Linux 核心子系統和使用者空間程式提供 Linux 特定的 ACPI 功能。
drivers/acpi include/linux/acpi.h include/linux/acpi*.h include/acpi tools/power/acpi
架構特定的 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
注意
Linuxize 實用程式 - 由 ACPICA 儲存庫提供,包括位於 source/tools/acpisrc 資料夾中的實用程式以及位於 generate/linux 資料夾中的許多指令碼。
acpica / master - 位於 <https://github.com/acpica/acpica.git> 的 git 儲存庫的“master”分支。
linux-pm / linux-next - 位於 <https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git> 的 git 儲存庫的“linux-next”分支。
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 差異的各種來源包括
遺留差異 - 在建立當前的 ACPICA 釋出過程之前,Linux 和 ACPICA 之間已經存在差異。 在過去的幾年裡,這些差異已經大大減少,但仍然存在一些差異,並且需要時間來找出其存在的根本原因。
手動修改 - 顯然,直接在 Linux 原始碼中所做的任何手動修改(例如,編碼風格修復)都會損害 ACPICA 釋出自動化。 因此,建議修復 ACPICA 上游原始碼中的此類問題,並使用 ACPICA 釋出實用程式生成 linux化的修復(請參閱下面的第 4 節瞭解詳細資訊)。
Linux 特定功能 - 有時無法使用當前的 ACPICA API 來實現 Linux 核心所需的功能,因此 Linux 開發人員偶爾必須直接更改 ACPICA 程式碼。 這些更改可能不被 ACPICA 上游接受,在這種情況下,除非 ACPICA 方面可以實施新的機制作為替代,否則它們將作為已提交的 ACPICA 差異保留。
ACPICA 釋出修復 - ACPICA 僅使用一組使用者空間模擬實用程式測試提交,因此 linux化的 ACPICA 補丁可能會破壞 Linux 核心,從而導致構建/啟動失敗。 為了避免破壞 Linux 分割,在釋出過程中將修復程式直接應用於 linux化的 ACPICA 補丁。 當將釋出修復程式反向移植到上游 ACPICA 原始碼時,它們必須遵循上游 ACPICA 規則,因此可能會出現進一步的修改。 這可能會導致出現新的差異。
快速跟蹤 ACPICA 提交 - 一些 ACPICA 提交是迴歸修復或穩定候選材料,因此它們相對於 ACPICA 釋出過程提前應用。 如果此類提交在 ACPICA 方面被還原或重新定位以提供更好的解決方案,則會生成新的 ACPICA 差異。
ACPICA 開發¶
本段指導 Linux 開發人員使用 ACPICA 上游釋出實用程式來獲取與上游 ACPICA 提交相對應的 Linux 補丁,然後才能從 ACPICA 釋出過程中獲得它們。
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”,則可以省略它。
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”的行來找到它。
檢查當前差異
如果您有 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