Loading include/powermanager/PowerHalLoader.h +6 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.2/IPower.h> #include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/IPower.h> namespace android { Loading @@ -32,12 +34,16 @@ public: static sp<hardware::power::IPower> loadAidl(); static sp<hardware::power::V1_0::IPower> loadHidlV1_0(); static sp<hardware::power::V1_1::IPower> loadHidlV1_1(); static sp<hardware::power::V1_2::IPower> loadHidlV1_2(); static sp<hardware::power::V1_3::IPower> loadHidlV1_3(); private: static std::mutex gHalMutex; static sp<hardware::power::IPower> gHalAidl GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> gHalHidlV1_0 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_1::IPower> gHalHidlV1_1 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_2::IPower> gHalHidlV1_2 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_3::IPower> gHalHidlV1_3 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> loadHidlV1_0Locked() EXCLUSIVE_LOCKS_REQUIRED(gHalMutex); Loading include/powermanager/PowerHalWrapper.h +35 −10 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.2/IPower.h> #include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/Boost.h> #include <android/hardware/power/IPower.h> #include <android/hardware/power/IPowerHintSession.h> Loading Loading @@ -142,8 +144,8 @@ public: // Wrapper for the HIDL Power HAL v1.0. class HidlHalWrapperV1_0 : public HalWrapper { public: explicit HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> Hal) : mHandleV1_0(std::move(Hal)) {} explicit HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> handleV1_0) : mHandleV1_0(std::move(handleV1_0)) {} virtual ~HidlHalWrapperV1_0() = default; virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; Loading @@ -154,10 +156,10 @@ public: virtual HalResult<int64_t> getHintSessionPreferredRate() override; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data); const sp<hardware::power::V1_0::IPower> mHandleV1_0; virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data); private: sp<hardware::power::V1_0::IPower> mHandleV1_0; HalResult<void> setInteractive(bool enabled); HalResult<void> setFeature(hardware::power::V1_0::Feature feature, bool enabled); }; Loading @@ -165,17 +167,40 @@ private: // Wrapper for the HIDL Power HAL v1.1. class HidlHalWrapperV1_1 : public HidlHalWrapperV1_0 { public: HidlHalWrapperV1_1(sp<hardware::power::V1_0::IPower> handleV1_0, sp<hardware::power::V1_1::IPower> handleV1_1) : HidlHalWrapperV1_0(std::move(handleV1_0)), mHandleV1_1(std::move(handleV1_1)) {} HidlHalWrapperV1_1(sp<hardware::power::V1_1::IPower> handleV1_1) : HidlHalWrapperV1_0(std::move(handleV1_1)) {} virtual ~HidlHalWrapperV1_1() = default; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; }; private: sp<hardware::power::V1_1::IPower> mHandleV1_1; // Wrapper for the HIDL Power HAL v1.2. class HidlHalWrapperV1_2 : public HidlHalWrapperV1_1 { public: virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; HidlHalWrapperV1_2(sp<hardware::power::V1_2::IPower> handleV1_2) : HidlHalWrapperV1_1(std::move(handleV1_2)) {} virtual ~HidlHalWrapperV1_2() = default; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; }; // Wrapper for the HIDL Power HAL v1.3. class HidlHalWrapperV1_3 : public HidlHalWrapperV1_2 { public: virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; HidlHalWrapperV1_3(sp<hardware::power::V1_3::IPower> handleV1_3) : HidlHalWrapperV1_2(std::move(handleV1_3)) {} virtual ~HidlHalWrapperV1_3() = default; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; }; // Wrapper for the AIDL Power HAL. Loading services/powermanager/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ cc_library_shared { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", "android.hardware.power@1.2", "android.hardware.power@1.3", "android.hardware.power-V3-cpp", ], Loading services/powermanager/PowerHalController.cpp +12 −8 Original line number Diff line number Diff line Loading @@ -33,16 +33,20 @@ namespace power { // ------------------------------------------------------------------------------------------------- std::unique_ptr<HalWrapper> HalConnector::connect() { sp<IPower> halAidl = PowerHalLoader::loadAidl(); if (halAidl) { if (sp<IPower> halAidl = PowerHalLoader::loadAidl()) { return std::make_unique<AidlHalWrapper>(halAidl); } sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0(); sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1(); if (halHidlV1_1) { return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_0, halHidlV1_1); // If V1_0 isn't defined, none of them are if (sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0()) { if (sp<V1_3::IPower> halHidlV1_3 = PowerHalLoader::loadHidlV1_3()) { return std::make_unique<HidlHalWrapperV1_3>(halHidlV1_3); } if (sp<V1_2::IPower> halHidlV1_2 = PowerHalLoader::loadHidlV1_2()) { return std::make_unique<HidlHalWrapperV1_2>(halHidlV1_2); } if (sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1()) { return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_1); } if (halHidlV1_0) { return std::make_unique<HidlHalWrapperV1_0>(halHidlV1_0); } return nullptr; Loading services/powermanager/PowerHalLoader.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #define LOG_TAG "PowerHalLoader" #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.2/IPower.h> #include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/IPower.h> #include <binder/IServiceManager.h> #include <hardware/power.h> Loading Loading @@ -55,12 +57,16 @@ std::mutex PowerHalLoader::gHalMutex; sp<IPower> PowerHalLoader::gHalAidl = nullptr; sp<V1_0::IPower> PowerHalLoader::gHalHidlV1_0 = nullptr; sp<V1_1::IPower> PowerHalLoader::gHalHidlV1_1 = nullptr; sp<V1_2::IPower> PowerHalLoader::gHalHidlV1_2 = nullptr; sp<V1_3::IPower> PowerHalLoader::gHalHidlV1_3 = nullptr; void PowerHalLoader::unloadAll() { std::lock_guard<std::mutex> lock(gHalMutex); gHalAidl = nullptr; gHalHidlV1_0 = nullptr; gHalHidlV1_1 = nullptr; gHalHidlV1_2 = nullptr; gHalHidlV1_3 = nullptr; } sp<IPower> PowerHalLoader::loadAidl() { Loading @@ -82,6 +88,20 @@ sp<V1_1::IPower> PowerHalLoader::loadHidlV1_1() { return loadHal<V1_1::IPower>(gHalExists, gHalHidlV1_1, loadFn, "HIDL v1.1"); } sp<V1_2::IPower> PowerHalLoader::loadHidlV1_2() { std::lock_guard<std::mutex> lock(gHalMutex); static bool gHalExists = true; static auto loadFn = []() { return V1_2::IPower::castFrom(loadHidlV1_0Locked()); }; return loadHal<V1_2::IPower>(gHalExists, gHalHidlV1_2, loadFn, "HIDL v1.2"); } sp<V1_3::IPower> PowerHalLoader::loadHidlV1_3() { std::lock_guard<std::mutex> lock(gHalMutex); static bool gHalExists = true; static auto loadFn = []() { return V1_3::IPower::castFrom(loadHidlV1_0Locked()); }; return loadHal<V1_3::IPower>(gHalExists, gHalHidlV1_3, loadFn, "HIDL v1.3"); } sp<V1_0::IPower> PowerHalLoader::loadHidlV1_0Locked() { static bool gHalExists = true; static auto loadFn = []() { return V1_0::IPower::getService(); }; Loading Loading
include/powermanager/PowerHalLoader.h +6 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.2/IPower.h> #include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/IPower.h> namespace android { Loading @@ -32,12 +34,16 @@ public: static sp<hardware::power::IPower> loadAidl(); static sp<hardware::power::V1_0::IPower> loadHidlV1_0(); static sp<hardware::power::V1_1::IPower> loadHidlV1_1(); static sp<hardware::power::V1_2::IPower> loadHidlV1_2(); static sp<hardware::power::V1_3::IPower> loadHidlV1_3(); private: static std::mutex gHalMutex; static sp<hardware::power::IPower> gHalAidl GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> gHalHidlV1_0 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_1::IPower> gHalHidlV1_1 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_2::IPower> gHalHidlV1_2 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_3::IPower> gHalHidlV1_3 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> loadHidlV1_0Locked() EXCLUSIVE_LOCKS_REQUIRED(gHalMutex); Loading
include/powermanager/PowerHalWrapper.h +35 −10 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.2/IPower.h> #include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/Boost.h> #include <android/hardware/power/IPower.h> #include <android/hardware/power/IPowerHintSession.h> Loading Loading @@ -142,8 +144,8 @@ public: // Wrapper for the HIDL Power HAL v1.0. class HidlHalWrapperV1_0 : public HalWrapper { public: explicit HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> Hal) : mHandleV1_0(std::move(Hal)) {} explicit HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> handleV1_0) : mHandleV1_0(std::move(handleV1_0)) {} virtual ~HidlHalWrapperV1_0() = default; virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; Loading @@ -154,10 +156,10 @@ public: virtual HalResult<int64_t> getHintSessionPreferredRate() override; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data); const sp<hardware::power::V1_0::IPower> mHandleV1_0; virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data); private: sp<hardware::power::V1_0::IPower> mHandleV1_0; HalResult<void> setInteractive(bool enabled); HalResult<void> setFeature(hardware::power::V1_0::Feature feature, bool enabled); }; Loading @@ -165,17 +167,40 @@ private: // Wrapper for the HIDL Power HAL v1.1. class HidlHalWrapperV1_1 : public HidlHalWrapperV1_0 { public: HidlHalWrapperV1_1(sp<hardware::power::V1_0::IPower> handleV1_0, sp<hardware::power::V1_1::IPower> handleV1_1) : HidlHalWrapperV1_0(std::move(handleV1_0)), mHandleV1_1(std::move(handleV1_1)) {} HidlHalWrapperV1_1(sp<hardware::power::V1_1::IPower> handleV1_1) : HidlHalWrapperV1_0(std::move(handleV1_1)) {} virtual ~HidlHalWrapperV1_1() = default; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; }; private: sp<hardware::power::V1_1::IPower> mHandleV1_1; // Wrapper for the HIDL Power HAL v1.2. class HidlHalWrapperV1_2 : public HidlHalWrapperV1_1 { public: virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; HidlHalWrapperV1_2(sp<hardware::power::V1_2::IPower> handleV1_2) : HidlHalWrapperV1_1(std::move(handleV1_2)) {} virtual ~HidlHalWrapperV1_2() = default; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; }; // Wrapper for the HIDL Power HAL v1.3. class HidlHalWrapperV1_3 : public HidlHalWrapperV1_2 { public: virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; HidlHalWrapperV1_3(sp<hardware::power::V1_3::IPower> handleV1_3) : HidlHalWrapperV1_2(std::move(handleV1_3)) {} virtual ~HidlHalWrapperV1_3() = default; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; }; // Wrapper for the AIDL Power HAL. Loading
services/powermanager/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ cc_library_shared { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", "android.hardware.power@1.2", "android.hardware.power@1.3", "android.hardware.power-V3-cpp", ], Loading
services/powermanager/PowerHalController.cpp +12 −8 Original line number Diff line number Diff line Loading @@ -33,16 +33,20 @@ namespace power { // ------------------------------------------------------------------------------------------------- std::unique_ptr<HalWrapper> HalConnector::connect() { sp<IPower> halAidl = PowerHalLoader::loadAidl(); if (halAidl) { if (sp<IPower> halAidl = PowerHalLoader::loadAidl()) { return std::make_unique<AidlHalWrapper>(halAidl); } sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0(); sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1(); if (halHidlV1_1) { return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_0, halHidlV1_1); // If V1_0 isn't defined, none of them are if (sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0()) { if (sp<V1_3::IPower> halHidlV1_3 = PowerHalLoader::loadHidlV1_3()) { return std::make_unique<HidlHalWrapperV1_3>(halHidlV1_3); } if (sp<V1_2::IPower> halHidlV1_2 = PowerHalLoader::loadHidlV1_2()) { return std::make_unique<HidlHalWrapperV1_2>(halHidlV1_2); } if (sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1()) { return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_1); } if (halHidlV1_0) { return std::make_unique<HidlHalWrapperV1_0>(halHidlV1_0); } return nullptr; Loading
services/powermanager/PowerHalLoader.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #define LOG_TAG "PowerHalLoader" #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.2/IPower.h> #include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/IPower.h> #include <binder/IServiceManager.h> #include <hardware/power.h> Loading Loading @@ -55,12 +57,16 @@ std::mutex PowerHalLoader::gHalMutex; sp<IPower> PowerHalLoader::gHalAidl = nullptr; sp<V1_0::IPower> PowerHalLoader::gHalHidlV1_0 = nullptr; sp<V1_1::IPower> PowerHalLoader::gHalHidlV1_1 = nullptr; sp<V1_2::IPower> PowerHalLoader::gHalHidlV1_2 = nullptr; sp<V1_3::IPower> PowerHalLoader::gHalHidlV1_3 = nullptr; void PowerHalLoader::unloadAll() { std::lock_guard<std::mutex> lock(gHalMutex); gHalAidl = nullptr; gHalHidlV1_0 = nullptr; gHalHidlV1_1 = nullptr; gHalHidlV1_2 = nullptr; gHalHidlV1_3 = nullptr; } sp<IPower> PowerHalLoader::loadAidl() { Loading @@ -82,6 +88,20 @@ sp<V1_1::IPower> PowerHalLoader::loadHidlV1_1() { return loadHal<V1_1::IPower>(gHalExists, gHalHidlV1_1, loadFn, "HIDL v1.1"); } sp<V1_2::IPower> PowerHalLoader::loadHidlV1_2() { std::lock_guard<std::mutex> lock(gHalMutex); static bool gHalExists = true; static auto loadFn = []() { return V1_2::IPower::castFrom(loadHidlV1_0Locked()); }; return loadHal<V1_2::IPower>(gHalExists, gHalHidlV1_2, loadFn, "HIDL v1.2"); } sp<V1_3::IPower> PowerHalLoader::loadHidlV1_3() { std::lock_guard<std::mutex> lock(gHalMutex); static bool gHalExists = true; static auto loadFn = []() { return V1_3::IPower::castFrom(loadHidlV1_0Locked()); }; return loadHal<V1_3::IPower>(gHalExists, gHalHidlV1_3, loadFn, "HIDL v1.3"); } sp<V1_0::IPower> PowerHalLoader::loadHidlV1_0Locked() { static bool gHalExists = true; static auto loadFn = []() { return V1_0::IPower::getService(); }; Loading