Linux化 ACPICA - ACPICA 发布自动化简介

版权:

© 2013-2016, 英特尔公司

作者:

吕征 <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,它由英特尔公司维护和支持。

下图描述了包含 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. 操作系统服务层 - 由 Linux 提供,以提供预定义 ACPICA 接口 (acpi_os_*) 的操作系统依赖实现。

    include/acpi/acpiosxf.h
    drivers/acpi/osl.c
    include/acpi/platform
    include/asm/acenv.h
    
  2. ACPICA 功能 - 从 ACPICA 代码库发布,以提供 ACPICA 接口 (acpi_*) 的操作系统独立实现。

    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. Linux化实用程序 - 由 ACPICA 存储库提供,包括位于 source/tools/acpisrc 文件夹中的实用程序以及位于 generate/linux 文件夹中的多个脚本。

  2. acpica / master - git 存储库的“master”分支,位于 <https://github.com/acpica/acpica.git>。

  3. linux-pm / linux-next - git 存储库的“linux-next”分支,位于 <https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git>。

  4. linux / master - git 存储库的“master”分支,位于 <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git>。

在 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. 挑选一个 ACPICA 提交

首先,你需要 git clone ACPICA 存储库,并且你要挑选的 ACPICA 更改必须提交到本地存储库中。

然后,gen-patch.sh 命令可以帮助从 ACPICA 本地存储库中挑选 ACPICA 提交

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

这里的提交 ID 是你要挑选的 ACPICA 本地存储库提交 ID。如果提交是“HEAD”,则可以省略。

  1. 精选最近的 ACPICA 提交

有时您需要将您的代码基于尚未应用于 Linux 的最新 ACPICA 更改进行 rebase。

您可以自己生成 ACPICA 发布系列,并将您的代码基于生成的 ACPICA 发布补丁进行 rebase

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

提交 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