1*70a7ec85SAndroid Build Coastguard Worker /* 2*70a7ec85SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*70a7ec85SAndroid Build Coastguard Worker * 4*70a7ec85SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*70a7ec85SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*70a7ec85SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*70a7ec85SAndroid Build Coastguard Worker * 8*70a7ec85SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*70a7ec85SAndroid Build Coastguard Worker * 10*70a7ec85SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*70a7ec85SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*70a7ec85SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*70a7ec85SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*70a7ec85SAndroid Build Coastguard Worker * limitations under the License. 15*70a7ec85SAndroid Build Coastguard Worker */ 16*70a7ec85SAndroid Build Coastguard Worker 17*70a7ec85SAndroid Build Coastguard Worker 18*70a7ec85SAndroid Build Coastguard Worker #ifndef ANDROID_VINTF_MANIFEST_HAL_H 19*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_MANIFEST_HAL_H 20*70a7ec85SAndroid Build Coastguard Worker 21*70a7ec85SAndroid Build Coastguard Worker #include <map> 22*70a7ec85SAndroid Build Coastguard Worker #include <optional> 23*70a7ec85SAndroid Build Coastguard Worker #include <set> 24*70a7ec85SAndroid Build Coastguard Worker #include <string> 25*70a7ec85SAndroid Build Coastguard Worker #include <vector> 26*70a7ec85SAndroid Build Coastguard Worker 27*70a7ec85SAndroid Build Coastguard Worker #include <vintf/ExclusiveTo.h> 28*70a7ec85SAndroid Build Coastguard Worker #include <vintf/FqInstance.h> 29*70a7ec85SAndroid Build Coastguard Worker #include <vintf/HalFormat.h> 30*70a7ec85SAndroid Build Coastguard Worker #include <vintf/HalInterface.h> 31*70a7ec85SAndroid Build Coastguard Worker #include <vintf/Level.h> 32*70a7ec85SAndroid Build Coastguard Worker #include <vintf/ManifestInstance.h> 33*70a7ec85SAndroid Build Coastguard Worker #include <vintf/TransportArch.h> 34*70a7ec85SAndroid Build Coastguard Worker #include <vintf/Version.h> 35*70a7ec85SAndroid Build Coastguard Worker #include <vintf/WithFileName.h> 36*70a7ec85SAndroid Build Coastguard Worker 37*70a7ec85SAndroid Build Coastguard Worker namespace android { 38*70a7ec85SAndroid Build Coastguard Worker namespace vintf { 39*70a7ec85SAndroid Build Coastguard Worker 40*70a7ec85SAndroid Build Coastguard Worker // A component of HalManifest. 41*70a7ec85SAndroid Build Coastguard Worker struct ManifestHal : public WithFileName { 42*70a7ec85SAndroid Build Coastguard Worker using InstanceType = ManifestInstance; 43*70a7ec85SAndroid Build Coastguard Worker 44*70a7ec85SAndroid Build Coastguard Worker ManifestHal() = default; 45*70a7ec85SAndroid Build Coastguard Worker 46*70a7ec85SAndroid Build Coastguard Worker bool operator==(const ManifestHal &other) const; 47*70a7ec85SAndroid Build Coastguard Worker 48*70a7ec85SAndroid Build Coastguard Worker HalFormat format = HalFormat::HIDL; 49*70a7ec85SAndroid Build Coastguard Worker std::string name; 50*70a7ec85SAndroid Build Coastguard Worker std::vector<Version> versions; 51*70a7ec85SAndroid Build Coastguard Worker TransportArch transportArch; 52*70a7ec85SAndroid Build Coastguard Worker // If this is set to something other than EMPTY, the service is only 53*70a7ec85SAndroid Build Coastguard Worker // accessible by specific means like through a Trusty VM, and not 54*70a7ec85SAndroid Build Coastguard Worker // available on the host device. 55*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo exclusiveTo = ExclusiveTo::EMPTY; 56*70a7ec85SAndroid Build Coastguard Worker transportManifestHal57*70a7ec85SAndroid Build Coastguard Worker inline Transport transport() const { 58*70a7ec85SAndroid Build Coastguard Worker return transportArch.transport; 59*70a7ec85SAndroid Build Coastguard Worker } 60*70a7ec85SAndroid Build Coastguard Worker archManifestHal61*70a7ec85SAndroid Build Coastguard Worker inline Arch arch() const { return transportArch.arch; } ipManifestHal62*70a7ec85SAndroid Build Coastguard Worker inline std::optional<std::string> ip() const { return transportArch.ip; } portManifestHal63*70a7ec85SAndroid Build Coastguard Worker inline std::optional<uint64_t> port() const { return transportArch.port; } 64*70a7ec85SAndroid Build Coastguard Worker getExclusiveToManifestHal65*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo getExclusiveTo() const { return exclusiveTo; } getNameManifestHal66*70a7ec85SAndroid Build Coastguard Worker inline const std::string& getName() const { return name; } updatableViaSystemManifestHal67*70a7ec85SAndroid Build Coastguard Worker inline bool updatableViaSystem() const { return mUpdatableViaSystem; } 68*70a7ec85SAndroid Build Coastguard Worker 69*70a7ec85SAndroid Build Coastguard Worker // Assume isValid(). 70*70a7ec85SAndroid Build Coastguard Worker bool forEachInstance(const std::function<bool(const ManifestInstance&)>& func) const; 71*70a7ec85SAndroid Build Coastguard Worker isOverrideManifestHal72*70a7ec85SAndroid Build Coastguard Worker bool isOverride() const { return mIsOverride; } updatableViaApexManifestHal73*70a7ec85SAndroid Build Coastguard Worker const std::optional<std::string>& updatableViaApex() const { return mUpdatableViaApex; } 74*70a7ec85SAndroid Build Coastguard Worker 75*70a7ec85SAndroid Build Coastguard Worker // Returns the name of the accessor interface for this HAL. 76*70a7ec85SAndroid Build Coastguard Worker // If not set, no accessor will be used. accessorManifestHal77*70a7ec85SAndroid Build Coastguard Worker const std::optional<std::string>& accessor() const { return mAccessor; } 78*70a7ec85SAndroid Build Coastguard Worker 79*70a7ec85SAndroid Build Coastguard Worker // When true, the existence of this <hal> tag means the component does NOT 80*70a7ec85SAndroid Build Coastguard Worker // exist on the device. This is useful for ODM manifests to specify that 81*70a7ec85SAndroid Build Coastguard Worker // a HAL is disabled on certain products. 82*70a7ec85SAndroid Build Coastguard Worker bool isDisabledHal() const; 83*70a7ec85SAndroid Build Coastguard Worker getMaxLevelManifestHal84*70a7ec85SAndroid Build Coastguard Worker Level getMaxLevel() const { return mMaxLevel; } getMinLevelManifestHal85*70a7ec85SAndroid Build Coastguard Worker Level getMinLevel() const { return mMinLevel; } 86*70a7ec85SAndroid Build Coastguard Worker 87*70a7ec85SAndroid Build Coastguard Worker private: 88*70a7ec85SAndroid Build Coastguard Worker friend struct LibVintfTest; 89*70a7ec85SAndroid Build Coastguard Worker friend struct ManifestHalConverter; 90*70a7ec85SAndroid Build Coastguard Worker friend struct HalManifest; 91*70a7ec85SAndroid Build Coastguard Worker friend bool parse(const std::string &s, ManifestHal *hal); 92*70a7ec85SAndroid Build Coastguard Worker 93*70a7ec85SAndroid Build Coastguard Worker // Whether this hal is a valid one. Note that an empty ManifestHal 94*70a7ec85SAndroid Build Coastguard Worker // (constructed via ManifestHal()) is valid. 95*70a7ec85SAndroid Build Coastguard Worker bool isValid(std::string* error = nullptr) const; 96*70a7ec85SAndroid Build Coastguard Worker 97*70a7ec85SAndroid Build Coastguard Worker // Return all versions mentioned by <version>s and <fqname>s. 98*70a7ec85SAndroid Build Coastguard Worker void appendAllVersions(std::set<Version>* ret) const; 99*70a7ec85SAndroid Build Coastguard Worker 100*70a7ec85SAndroid Build Coastguard Worker // insert instances to mManifestInstances. 101*70a7ec85SAndroid Build Coastguard Worker // Existing instances will be ignored. 102*70a7ec85SAndroid Build Coastguard Worker // Pre: all instances to be inserted must satisfy 103*70a7ec85SAndroid Build Coastguard Worker // !hasPackage() && hasVersion() && hasInterface() && hasInstance() 104*70a7ec85SAndroid Build Coastguard Worker bool insertInstance(const FqInstance& fqInstance, bool allowDupMajorVersion, 105*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 106*70a7ec85SAndroid Build Coastguard Worker bool insertInstances(const std::set<FqInstance>& fqInstances, bool allowDupMajorVersion, 107*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 108*70a7ec85SAndroid Build Coastguard Worker 109*70a7ec85SAndroid Build Coastguard Worker // Verify instance before inserting. 110*70a7ec85SAndroid Build Coastguard Worker bool verifyInstance(const FqInstance& fqInstance, std::string* error = nullptr) const; 111*70a7ec85SAndroid Build Coastguard Worker 112*70a7ec85SAndroid Build Coastguard Worker bool mIsOverride = false; 113*70a7ec85SAndroid Build Coastguard Worker std::optional<std::string> mAccessor; 114*70a7ec85SAndroid Build Coastguard Worker std::optional<std::string> mUpdatableViaApex; 115*70a7ec85SAndroid Build Coastguard Worker bool mUpdatableViaSystem = false; 116*70a7ec85SAndroid Build Coastguard Worker // All instances specified with <fqname> and <version> x <interface> x <instance> 117*70a7ec85SAndroid Build Coastguard Worker std::set<ManifestInstance> mManifestInstances; 118*70a7ec85SAndroid Build Coastguard Worker 119*70a7ec85SAndroid Build Coastguard Worker // Max level of this HAL (inclusive). Only valid for framework manifest HALs. 120*70a7ec85SAndroid Build Coastguard Worker // If set, HALs with max-level < target FCM version in device manifest is 121*70a7ec85SAndroid Build Coastguard Worker // disabled. 122*70a7ec85SAndroid Build Coastguard Worker Level mMaxLevel = Level::UNSPECIFIED; 123*70a7ec85SAndroid Build Coastguard Worker // Min level of this HAL (inclusive). Only valid for framework manifest HALs. 124*70a7ec85SAndroid Build Coastguard Worker // If set, HALs with max-level > target FCM version in device manifest is 125*70a7ec85SAndroid Build Coastguard Worker // disabled. 126*70a7ec85SAndroid Build Coastguard Worker Level mMinLevel = Level::UNSPECIFIED; 127*70a7ec85SAndroid Build Coastguard Worker }; 128*70a7ec85SAndroid Build Coastguard Worker 129*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf 130*70a7ec85SAndroid Build Coastguard Worker } // namespace android 131*70a7ec85SAndroid Build Coastguard Worker 132*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_MANIFEST_HAL_H 133