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