|  | .. SPDX-License-Identifier: GPL-2.0 | 
|  | .. include:: <isonum.txt> | 
|  |  | 
|  | ============================================================ | 
|  | Linuxized ACPICA - Introduction to ACPICA Release Automation | 
|  | ============================================================ | 
|  |  | 
|  | :Copyright: |copy| 2013-2016, Intel Corporation | 
|  |  | 
|  | :Author: Lv Zheng <lv.zheng@intel.com> | 
|  |  | 
|  |  | 
|  | Abstract | 
|  | ======== | 
|  | This document describes the ACPICA project and the relationship between | 
|  | ACPICA and Linux.  It also describes how ACPICA code in drivers/acpi/acpica, | 
|  | include/acpi and tools/power/acpi is automatically updated to follow the | 
|  | upstream. | 
|  |  | 
|  | ACPICA Project | 
|  | ============== | 
|  |  | 
|  | The ACPI Component Architecture (ACPICA) project provides an operating | 
|  | system (OS)-independent reference implementation of the Advanced | 
|  | Configuration and Power Interface Specification (ACPI).  It has been | 
|  | adapted by various host OSes.  By directly integrating ACPICA, Linux can | 
|  | also benefit from the application experiences of ACPICA from other host | 
|  | OSes. | 
|  |  | 
|  | The homepage of ACPICA project is: www.acpica.org, it is maintained and | 
|  | supported by Intel Corporation. | 
|  |  | 
|  | The following figure depicts the Linux ACPI subsystem where the ACPICA | 
|  | adaptation is included:: | 
|  |  | 
|  | +---------------------------------------------------------+ | 
|  | |                                                         | | 
|  | |   +---------------------------------------------------+ | | 
|  | |   | +------------------+                              | | | 
|  | |   | | 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 | 
|  |  | 
|  | .. note:: | 
|  | A. OS Service Layer - Provided by Linux to offer OS dependent | 
|  | implementation of the predefined ACPICA interfaces (acpi_os_*). | 
|  | :: | 
|  |  | 
|  | include/acpi/acpiosxf.h | 
|  | drivers/acpi/osl.c | 
|  | include/acpi/platform | 
|  | include/asm/acenv.h | 
|  | B. ACPICA Functionality - Released from ACPICA code base to offer | 
|  | OS independent implementation of the ACPICA interfaces (acpi_*). | 
|  | :: | 
|  |  | 
|  | drivers/acpi/acpica | 
|  | include/acpi/ac*.h | 
|  | tools/power/acpi | 
|  | C. Linux/ACPI Functionality - Providing Linux specific ACPI | 
|  | functionality to the other Linux kernel subsystems and user space | 
|  | programs. | 
|  | :: | 
|  |  | 
|  | drivers/acpi | 
|  | include/linux/acpi.h | 
|  | include/linux/acpi*.h | 
|  | include/acpi | 
|  | tools/power/acpi | 
|  | D. Architecture Specific ACPICA/ACPI Functionalities - Provided by the | 
|  | ACPI subsystem to offer architecture specific implementation of the | 
|  | ACPI interfaces.  They are Linux specific components and are out of | 
|  | the scope of this document. | 
|  | :: | 
|  |  | 
|  | include/asm/acpi.h | 
|  | include/asm/acpi*.h | 
|  | arch/*/acpi | 
|  |  | 
|  | ACPICA Release | 
|  | ============== | 
|  |  | 
|  | The ACPICA project maintains its code base at the following repository URL: | 
|  | https://github.com/acpica/acpica.git. As a rule, a release is made every | 
|  | month. | 
|  |  | 
|  | As the coding style adopted by the ACPICA project is not acceptable by | 
|  | Linux, there is a release process to convert the ACPICA git commits into | 
|  | Linux patches.  The patches generated by this process are referred to as | 
|  | "linuxized ACPICA patches".  The release process is carried out on a local | 
|  | copy the ACPICA git repository.  Each commit in the monthly release is | 
|  | converted into a linuxized ACPICA patch.  Together, they form the monthly | 
|  | ACPICA release patchset for the Linux ACPI community.  This process is | 
|  | illustrated in the following figure:: | 
|  |  | 
|  | +-----------------------------+ | 
|  | | 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 | 
|  |  | 
|  | .. note:: | 
|  | A. Linuxize Utilities - Provided by the ACPICA repository, including a | 
|  | utility located in source/tools/acpisrc folder and a number of | 
|  | scripts located in generate/linux folder. | 
|  | B. acpica / master - "master" branch of the git repository at | 
|  | <https://github.com/acpica/acpica.git>. | 
|  | C. linux-pm / linux-next - "linux-next" branch of the git repository at | 
|  | <https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git>. | 
|  | D. linux / master - "master" branch of the git repository at | 
|  | <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git>. | 
|  |  | 
|  | Before the linuxized ACPICA patches are sent to the Linux ACPI community | 
|  | for review, there is a quality assurance build test process to reduce | 
|  | porting issues.  Currently this build process only takes care of the | 
|  | following kernel configuration options: | 
|  | CONFIG_ACPI/CONFIG_ACPI_DEBUG/CONFIG_ACPI_DEBUGGER | 
|  |  | 
|  | ACPICA Divergences | 
|  | ================== | 
|  |  | 
|  | Ideally, all of the ACPICA commits should be converted into Linux patches | 
|  | automatically without manual modifications, the "linux / master" tree should | 
|  | contain the ACPICA code that exactly corresponds to the ACPICA code | 
|  | contained in "new linuxized acpica" tree and it should be possible to run | 
|  | the release process fully automatically. | 
|  |  | 
|  | As a matter of fact, however, there are source code differences between | 
|  | the ACPICA code in Linux and the upstream ACPICA code, referred to as | 
|  | "ACPICA Divergences". | 
|  |  | 
|  | The various sources of ACPICA divergences include: | 
|  | 1. Legacy divergences - Before the current ACPICA release process was | 
|  | established, there already had been divergences between Linux and | 
|  | ACPICA. Over the past several years those divergences have been greatly | 
|  | reduced, but there still are several ones and it takes time to figure | 
|  | out the underlying reasons for their existence. | 
|  | 2. Manual modifications - Any manual modification (eg. coding style fixes) | 
|  | made directly in the Linux sources obviously hurts the ACPICA release | 
|  | automation.  Thus it is recommended to fix such issues in the ACPICA | 
|  | upstream source code and generate the linuxized fix using the ACPICA | 
|  | release utilities (please refer to Section 4 below for the details). | 
|  | 3. Linux specific features - Sometimes it's impossible to use the | 
|  | current ACPICA APIs to implement features required by the Linux kernel, | 
|  | so Linux developers occasionally have to change ACPICA code directly. | 
|  | Those changes may not be acceptable by ACPICA upstream and in such cases | 
|  | they are left as committed ACPICA divergences unless the ACPICA side can | 
|  | implement new mechanisms as replacements for them. | 
|  | 4. ACPICA release fixups - ACPICA only tests commits using a set of the | 
|  | user space simulation utilities, thus the linuxized ACPICA patches may | 
|  | break the Linux kernel, leaving us build/boot failures.  In order to | 
|  | avoid breaking Linux bisection, fixes are applied directly to the | 
|  | linuxized ACPICA patches during the release process.  When the release | 
|  | fixups are backported to the upstream ACPICA sources, they must follow | 
|  | the upstream ACPICA rules and so further modifications may appear. | 
|  | That may result in the appearance of new divergences. | 
|  | 5. Fast tracking of ACPICA commits - Some ACPICA commits are regression | 
|  | fixes or stable-candidate material, so they are applied in advance with | 
|  | respect to the ACPICA release process.  If such commits are reverted or | 
|  | rebased on the ACPICA side in order to offer better solutions, new ACPICA | 
|  | divergences are generated. | 
|  |  | 
|  | ACPICA Development | 
|  | ================== | 
|  |  | 
|  | This paragraph guides Linux developers to use the ACPICA upstream release | 
|  | utilities to obtain Linux patches corresponding to upstream ACPICA commits | 
|  | before they become available from the ACPICA release process. | 
|  |  | 
|  | 1. Cherry-pick an ACPICA commit | 
|  |  | 
|  | First you need to git clone the ACPICA repository and the ACPICA change | 
|  | you want to cherry pick must be committed into the local repository. | 
|  |  | 
|  | Then the gen-patch.sh command can help to cherry-pick an ACPICA commit | 
|  | from the ACPICA local repository:: | 
|  |  | 
|  | $ git clone https://github.com/acpica/acpica | 
|  | $ cd acpica | 
|  | $ generate/linux/gen-patch.sh -u [commit ID] | 
|  |  | 
|  | Here the commit ID is the ACPICA local repository commit ID you want to | 
|  | cherry pick.  It can be omitted if the commit is "HEAD". | 
|  |  | 
|  | 2. Cherry-pick recent ACPICA commits | 
|  |  | 
|  | Sometimes you need to rebase your code on top of the most recent ACPICA | 
|  | changes that haven't been applied to Linux yet. | 
|  |  | 
|  | You can generate the ACPICA release series yourself and rebase your code on | 
|  | top of the generated ACPICA release patches:: | 
|  |  | 
|  | $ git clone https://github.com/acpica/acpica | 
|  | $ cd acpica | 
|  | $ generate/linux/make-patches.sh -u [commit ID] | 
|  |  | 
|  | The commit ID should be the last ACPICA commit accepted by Linux.  Usually, | 
|  | it is the commit modifying ACPI_CA_VERSION.  It can be found by executing | 
|  | "git blame source/include/acpixf.h" and referencing the line that contains | 
|  | "ACPI_CA_VERSION". | 
|  |  | 
|  | 3. Inspect the current divergences | 
|  |  | 
|  | If you have local copies of both Linux and upstream ACPICA, you can generate | 
|  | a diff file indicating the state of the current divergences:: | 
|  |  | 
|  | # 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 |