Loading include/powermanager/PowerHalController.h +5 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <powermanager/PowerHalWrapper.h> #include <vendor/lineage/power/IPower.h> namespace android { Loading @@ -37,6 +38,7 @@ public: virtual ~HalConnector() = default; virtual std::unique_ptr<HalWrapper> connect(); virtual std::unique_ptr<HalWrapper> connectLineage(); virtual void reset(); }; Loading @@ -61,6 +63,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature) override; private: std::mutex mConnectedHalMutex; Loading @@ -69,9 +72,11 @@ private: // Shared pointers to keep global pointer and allow local copies to be used in // different threads std::shared_ptr<HalWrapper> mConnectedHal GUARDED_BY(mConnectedHalMutex) = nullptr; std::shared_ptr<HalWrapper> mConnectedLineageHal GUARDED_BY(mConnectedHalMutex) = nullptr; const std::shared_ptr<HalWrapper> mDefaultHal = std::make_shared<EmptyHalWrapper>(); std::shared_ptr<HalWrapper> initHal(); std::shared_ptr<HalWrapper> initLineageHal(); template <typename T> HalResult<T> processHalResult(HalResult<T> result, const char* functionName); }; Loading include/powermanager/PowerHalLoader.h +3 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/IPower.h> #include <vendor/lineage/power/IPower.h> namespace android { Loading @@ -32,12 +33,14 @@ 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<vendor::lineage::power::IPower> loadLineageAidl(); 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<vendor::lineage::power::IPower> gHalLineageAidl GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> loadHidlV1_0Locked() EXCLUSIVE_LOCKS_REQUIRED(gHalMutex); Loading include/powermanager/PowerHalWrapper.h +24 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <android/hardware/power/IPower.h> #include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <vendor/lineage/power/IPower.h> namespace android { Loading Loading @@ -123,6 +124,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) = 0; virtual HalResult<int64_t> getHintSessionPreferredRate() = 0; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) = 0; }; // Empty Power HAL wrapper that ignores all api calls. Loading @@ -137,6 +139,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; }; // Wrapper for the HIDL Power HAL v1.0. Loading @@ -152,6 +155,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data); Loading Loading @@ -190,6 +194,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; private: // Control access to the boost and mode supported arrays. Loading @@ -208,6 +213,25 @@ private: mModeSupportedArray GUARDED_BY(mModeMutex) = {HalSupport::UNKNOWN}; }; // Wrapper for the Lineage AIDL Power HAL. class LineageAidlHalWrapper : public HalWrapper { public: explicit LineageAidlHalWrapper(sp<vendor::lineage::power::IPower> handle) : mHandle(std::move(handle)) {} ~LineageAidlHalWrapper() = default; virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession( int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; private: sp<vendor::lineage::power::IPower> mHandle; }; }; // namespace power }; // namespace android Loading services/powermanager/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ cc_library_shared { "android.hardware.power@1.0", "android.hardware.power@1.1", "android.hardware.power-V2-cpp", "vendor.lineage.power-V1-cpp", ], cflags: [ Loading services/powermanager/PowerHalController.cpp +30 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <utils/Log.h> using namespace android::hardware::power; namespace LineageAidl = vendor::lineage::power; namespace android { Loading @@ -48,6 +49,14 @@ std::unique_ptr<HalWrapper> HalConnector::connect() { return nullptr; } std::unique_ptr<HalWrapper> HalConnector::connectLineage() { sp<LineageAidl::IPower> halLineageAidl = PowerHalLoader::loadLineageAidl(); if (halLineageAidl) { return std::make_unique<LineageAidlHalWrapper>(halLineageAidl); } return nullptr; } void HalConnector::reset() { PowerHalLoader::unloadAll(); } Loading @@ -56,6 +65,7 @@ void HalConnector::reset() { void PowerHalController::init() { initHal(); initLineageHal(); } // Check validity of current handle to the power HAL service, and create a new Loading @@ -72,6 +82,20 @@ std::shared_ptr<HalWrapper> PowerHalController::initHal() { return mConnectedHal; } // Check validity of current handle to the Lineage power HAL service, and create a new // one if necessary. std::shared_ptr<HalWrapper> PowerHalController::initLineageHal() { std::lock_guard<std::mutex> lock(mConnectedHalMutex); if (mConnectedLineageHal == nullptr) { mConnectedLineageHal = mHalConnector->connectLineage(); if (mConnectedLineageHal == nullptr) { // Unable to connect to Lineage Power HAL service. Fallback to default. return mDefaultHal; } } return mConnectedLineageHal; } // Check if a call to Power HAL function failed; if so, log the failure and // invalidate the current Power HAL handle. template <typename T> Loading Loading @@ -111,6 +135,12 @@ HalResult<int64_t> PowerHalController::getHintSessionPreferredRate() { return processHalResult(result, "getHintSessionPreferredRate"); } HalResult<int> PowerHalController::getFeature(LineageAidl::Feature feature) { std::shared_ptr<HalWrapper> handle = initLineageHal(); auto result = handle->getFeature(feature); return processHalResult(result, "getFeature"); } } // namespace power } // namespace android Loading
include/powermanager/PowerHalController.h +5 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <powermanager/PowerHalWrapper.h> #include <vendor/lineage/power/IPower.h> namespace android { Loading @@ -37,6 +38,7 @@ public: virtual ~HalConnector() = default; virtual std::unique_ptr<HalWrapper> connect(); virtual std::unique_ptr<HalWrapper> connectLineage(); virtual void reset(); }; Loading @@ -61,6 +63,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature) override; private: std::mutex mConnectedHalMutex; Loading @@ -69,9 +72,11 @@ private: // Shared pointers to keep global pointer and allow local copies to be used in // different threads std::shared_ptr<HalWrapper> mConnectedHal GUARDED_BY(mConnectedHalMutex) = nullptr; std::shared_ptr<HalWrapper> mConnectedLineageHal GUARDED_BY(mConnectedHalMutex) = nullptr; const std::shared_ptr<HalWrapper> mDefaultHal = std::make_shared<EmptyHalWrapper>(); std::shared_ptr<HalWrapper> initHal(); std::shared_ptr<HalWrapper> initLineageHal(); template <typename T> HalResult<T> processHalResult(HalResult<T> result, const char* functionName); }; Loading
include/powermanager/PowerHalLoader.h +3 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/IPower.h> #include <vendor/lineage/power/IPower.h> namespace android { Loading @@ -32,12 +33,14 @@ 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<vendor::lineage::power::IPower> loadLineageAidl(); 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<vendor::lineage::power::IPower> gHalLineageAidl GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> loadHidlV1_0Locked() EXCLUSIVE_LOCKS_REQUIRED(gHalMutex); Loading
include/powermanager/PowerHalWrapper.h +24 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <android/hardware/power/IPower.h> #include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <vendor/lineage/power/IPower.h> namespace android { Loading Loading @@ -123,6 +124,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) = 0; virtual HalResult<int64_t> getHintSessionPreferredRate() = 0; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) = 0; }; // Empty Power HAL wrapper that ignores all api calls. Loading @@ -137,6 +139,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; }; // Wrapper for the HIDL Power HAL v1.0. Loading @@ -152,6 +155,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; protected: virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data); Loading Loading @@ -190,6 +194,7 @@ public: int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; private: // Control access to the boost and mode supported arrays. Loading @@ -208,6 +213,25 @@ private: mModeSupportedArray GUARDED_BY(mModeMutex) = {HalSupport::UNKNOWN}; }; // Wrapper for the Lineage AIDL Power HAL. class LineageAidlHalWrapper : public HalWrapper { public: explicit LineageAidlHalWrapper(sp<vendor::lineage::power::IPower> handle) : mHandle(std::move(handle)) {} ~LineageAidlHalWrapper() = default; virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession( int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) override; virtual HalResult<int64_t> getHintSessionPreferredRate() override; virtual HalResult<int> getFeature(vendor::lineage::power::Feature feature) override; private: sp<vendor::lineage::power::IPower> mHandle; }; }; // namespace power }; // namespace android Loading
services/powermanager/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ cc_library_shared { "android.hardware.power@1.0", "android.hardware.power@1.1", "android.hardware.power-V2-cpp", "vendor.lineage.power-V1-cpp", ], cflags: [ Loading
services/powermanager/PowerHalController.cpp +30 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <utils/Log.h> using namespace android::hardware::power; namespace LineageAidl = vendor::lineage::power; namespace android { Loading @@ -48,6 +49,14 @@ std::unique_ptr<HalWrapper> HalConnector::connect() { return nullptr; } std::unique_ptr<HalWrapper> HalConnector::connectLineage() { sp<LineageAidl::IPower> halLineageAidl = PowerHalLoader::loadLineageAidl(); if (halLineageAidl) { return std::make_unique<LineageAidlHalWrapper>(halLineageAidl); } return nullptr; } void HalConnector::reset() { PowerHalLoader::unloadAll(); } Loading @@ -56,6 +65,7 @@ void HalConnector::reset() { void PowerHalController::init() { initHal(); initLineageHal(); } // Check validity of current handle to the power HAL service, and create a new Loading @@ -72,6 +82,20 @@ std::shared_ptr<HalWrapper> PowerHalController::initHal() { return mConnectedHal; } // Check validity of current handle to the Lineage power HAL service, and create a new // one if necessary. std::shared_ptr<HalWrapper> PowerHalController::initLineageHal() { std::lock_guard<std::mutex> lock(mConnectedHalMutex); if (mConnectedLineageHal == nullptr) { mConnectedLineageHal = mHalConnector->connectLineage(); if (mConnectedLineageHal == nullptr) { // Unable to connect to Lineage Power HAL service. Fallback to default. return mDefaultHal; } } return mConnectedLineageHal; } // Check if a call to Power HAL function failed; if so, log the failure and // invalidate the current Power HAL handle. template <typename T> Loading Loading @@ -111,6 +135,12 @@ HalResult<int64_t> PowerHalController::getHintSessionPreferredRate() { return processHalResult(result, "getHintSessionPreferredRate"); } HalResult<int> PowerHalController::getFeature(LineageAidl::Feature feature) { std::shared_ptr<HalWrapper> handle = initLineageHal(); auto result = handle->getFeature(feature); return processHalResult(result, "getFeature"); } } // namespace power } // namespace android