263 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| Linuxized ACPICA - Introduction to ACPICA Release Automation
 | |
| 
 | |
| Copyright (C) 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.
 | |
| 
 | |
| 
 | |
| 1. 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
 | |
| 
 | |
| 2. 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
 | |
|        <http://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git>.
 | |
|     D. linux / master - "master" branch of the git repository at
 | |
|        <http://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
 | |
| 
 | |
| 3. 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.
 | |
| 
 | |
| 4. 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 http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
 | |
|    # cd acpica
 | |
|    # generate/linux/divergences.sh -s ../linux
 | 
