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