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

Commit c3894a4d authored by Matt Buckley's avatar Matt Buckley
Browse files

Extend PowerHalWrapper to support HIDL 1.2 and 1.3

 * Added support for 1.2 and 1.3 HIDL calls to the PowerHalWrapper
 * Expanded the wrapper and loader tests to cover these new versions
 * Lightly tweaked the existing tests to make them more comprehensive

Bug: b/244631171
Test: atest libpowermanager_test

Change-Id: I5890106817b7cf243cdd21b3acf22ff7fcd8174e
parent cf1fb689
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