Home | History | Annotate | Download | only in pal
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef CHRE_PAL_VERSION_H_
     18 #define CHRE_PAL_VERSION_H_
     19 
     20 /**
     21  * @file
     22  * Shared definitions related to CHRE PAL versioning.
     23  *
     24  * Versioning guidelines
     25  *
     26  * Like the CHRE nanoapp API, CHRE PAL APIs are versioned by a 32-bit integer
     27  * where the most significant byte represents the major version, the next most
     28  * significant byte represents the minor version, and the two least significant
     29  * bytes represent the implementation patch version in little endian order.
     30  *
     31  * Semantic versioning guidelines are followed, such that a new major version
     32  * indicates a compatibility-breaking change was introduced, a new minor version
     33  * indicates that new functionality was added in a backwards-compatible way, and
     34  * a new patch version indicates bug fixes in the implementation. The patch
     35  * version does not apply to the API itself, only a particular implementation of
     36  * the API.
     37  *
     38  * Note that although the PALs are generally closely related to the CHRE API,
     39  * they are versioned independently. For example, new features may be added to
     40  * the PAL APIs to support CHRE core system requirements that do not impact the
     41  * CHRE API directly. Also, a change may be made to the CHRE API that only
     42  * results in a minor version change due to compatibility layers between CHRE
     43  * nanoapps and the CHRE system, however this may require a major version bump
     44  * to the PAL in order to implement it. In general, this is done to keep the PAL
     45  * APIs simpler, as the components of the CHRE system are more tightly coupled
     46  * than the apps that run on top of it and are typically updated at the same
     47  * time. So we would want to ensure that a given nanoapp can run on multiple
     48  * versions of the CHRE API, but it is less important for PAL modules to work
     49  * with multiple versions of the core CHRE implementation, and vice versa.
     50  */
     51 
     52 #include <stdint.h>
     53 
     54 #ifdef __cplusplus
     55 extern "C" {
     56 #endif
     57 
     58 /**
     59  * Extracts only the API version component of a module version
     60  */
     61 #define CHRE_PAL_GET_API_VERSION(moduleVersion) \
     62     ((moduleVersion) & UINT32_C(0xFFFF0000))
     63 
     64 /**
     65  * Extracts only the module patch version of a module version
     66  */
     67 #define CHRE_PAL_GET_PATCH_VERSION(moduleVersion) \
     68     ((moduleVersion) & UINT32_C(0x0000FFFF))
     69 
     70 /**
     71  * Constructs an API version from major & minor patch versions
     72  *
     73  * @param major Major version, valid range 0-255
     74  * @param minor Minor version, valid range 0-255
     75  */
     76 #define CHRE_PAL_CREATE_API_VERSION(major, minor) \
     77     ((uint32_t) ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16)))
     78 
     79 /**
     80  * Constructs a module version from a complete API version and a module patch
     81  * version
     82  */
     83 #define CHRE_PAL_CREATE_MODULE_VERSION(apiVersion, patchVersion) \
     84     ((uint32_t) (CHRE_PAL_GET_API_VERSION(apiVersion) | \
     85                  CHRE_PAL_GET_PATCH_VERSION(patchVersion)))
     86 
     87 #ifdef __cplusplus
     88 }
     89 #endif
     90 
     91 #endif  // CHRE_VERSION_H_
     92