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 major API version component of a module version
66  */
67 #define CHRE_PAL_GET_API_MAJOR_VERSION(moduleVersion) \
68     (((moduleVersion) & UINT32_C(0xFF000000)) >> 24)
69 
70 /**
71  * Extracts only the module patch version of a module version
72  */
73 #define CHRE_PAL_GET_PATCH_VERSION(moduleVersion) \
74     ((moduleVersion) & UINT32_C(0x0000FFFF))
75 
76 /**
77  * Constructs an API version from major & minor patch versions
78  *
79  * @param major Major version, valid range 0-255
80  * @param minor Minor version, valid range 0-255
81  */
82 #define CHRE_PAL_CREATE_API_VERSION(major, minor) \
83     ((uint32_t) ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16)))
84 
85 /**
86  * Constructs a module version from a complete API version and a module patch
87  * version
88  */
89 #define CHRE_PAL_CREATE_MODULE_VERSION(apiVersion, patchVersion) \
90     ((uint32_t) (CHRE_PAL_GET_API_VERSION(apiVersion) | \
91                  CHRE_PAL_GET_PATCH_VERSION(patchVersion)))
92 
93 /**
94  * Determines if a requested CHRE API version is compatible with the supplied
95  * API version
96  */
97 #define CHRE_PAL_VERSIONS_ARE_COMPATIBLE(apiVersion, requestedApiVersion) \
98     (CHRE_PAL_GET_API_MAJOR_VERSION(apiVersion) == \
99         CHRE_PAL_GET_API_MAJOR_VERSION(requestedApiVersion))
100 
101 #ifdef __cplusplus
102 }
103 #endif
104 
105 #endif  // CHRE_VERSION_H_
106