Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21fb5bef authored by Luca Stefani's avatar Luca Stefani
Browse files

powermanager: Add Lineage HAL support

Change-Id: I80ca93f63e8100bc96fc65ac74457664eee33f51
parent 3e846409
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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 {

@@ -37,6 +38,7 @@ public:
    virtual ~HalConnector() = default;

    virtual std::unique_ptr<HalWrapper> connect();
    virtual std::unique_ptr<HalWrapper> connectLineage();
    virtual void reset();
};

@@ -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;
@@ -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);
};
+3 −0
Original line number Diff line number Diff line
@@ -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 {

@@ -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);
+24 −0
Original line number Diff line number Diff line
@@ -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 {

@@ -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.
@@ -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.
@@ -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);
@@ -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.
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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: [
+30 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <utils/Log.h>

using namespace android::hardware::power;
namespace LineageAidl = vendor::lineage::power;

namespace android {

@@ -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();
}
@@ -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
@@ -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>
@@ -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