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

Commit b7d92d9f authored by Matt Buckley's avatar Matt Buckley Committed by Android (Google) Code Review
Browse files

Merge "Extend PowerHalWrapper to support HIDL 1.2 and 1.3"

parents 465d99f7 c3894a4d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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 {
@@ -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);
+35 −10
Original line number Diff line number Diff line
@@ -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>
@@ -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;
@@ -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);
};
@@ -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.
+2 −0
Original line number Diff line number Diff line
@@ -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",
    ],

+12 −8
Original line number Diff line number Diff line
@@ -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;
+20 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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() {
@@ -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