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

Commit 6bd9c12e authored by dianlujitao's avatar dianlujitao Committed by Michael Bestas
Browse files

perf: Support AIDL Lineage power HAL service

 * Call the new AIDL HAL where available and fall back to the HIDL HAL
   if not.
 * Map existing HIDL hint call to AIDL HAL.

TODO: Invoke the APIs directly from lineage sdk once killed HIDL.

Change-Id: Ieffa8f5c13c59b901cb030b7bb8a190793cd8cee
parent 6941cbf9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ cc_defaults {
        "service.incremental",
        "suspend_control_aidl_interface-cpp",
        "vendor.lineage.power@1.0",
        "vendor.lineage.power-cpp",
    ],

    static_libs: [
+83 −20
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <android/system/suspend/ISuspendControlService.h>
#include <nativehelper/JNIHelp.h>
#include <vendor/lineage/power/1.0/ILineagePower.h>
#include <vendor/lineage/power/IPower.h>
#include "jni.h"

#include <nativehelper/ScopedUtfChars.h>
@@ -63,7 +64,11 @@ using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
using IPowerAidl = android::hardware::power::IPower;
using ILineagePowerV1_0 = vendor::lineage::power::V1_0::ILineagePower;
using vendor::lineage::power::V1_0::LineageFeature;
using ILineagePowerAidl = vendor::lineage::power::IPower;
using LineageBoostAidl = vendor::lineage::power::Boost;
using LineageFeatureV1_0 = vendor::lineage::power::V1_0::LineageFeature;
using LineageFeatureAidl = vendor::lineage::power::Feature;
using LineagePowerHint1_0 = vendor::lineage::power::V1_0::LineagePowerHint;

namespace android {

@@ -80,7 +85,9 @@ static sp<IPowerV1_0> gPowerHalHidlV1_0_ = nullptr;
static sp<IPowerV1_1> gPowerHalHidlV1_1_ = nullptr;
static sp<IPowerAidl> gPowerHalAidl_ = nullptr;
static sp<ILineagePowerV1_0> gLineagePowerHalV1_0_ = nullptr;
static sp<ILineagePowerAidl> gLineagePowerHalAidl_ = nullptr;
static std::mutex gPowerHalMutex;
static std::mutex gLineagePowerHalMutex;

enum class HalVersion {
    NONE,
@@ -148,19 +155,39 @@ static HalVersion connectPowerHalLocked() {
    return HalVersion::NONE;
}

// Check validity of current handle to the Lineage power HAL service, and call getService() if necessary.
// The caller must be holding gPowerHalMutex.
void connectLineagePowerHalLocked() {
    static bool gLineagePowerHalExists = true;
    if (gLineagePowerHalExists && gLineagePowerHalV1_0_ == nullptr) {
// Check validity of current handle to the Lineage power HAL service, and connect to it if necessary.
// The caller must be holding gLineagePowerHalMutex.
static HalVersion connectLineagePowerHalLocked() {
    static bool gPowerHalHidlExists = true;
    static bool gPowerHalAidlExists = true;
    if (!gPowerHalHidlExists && !gPowerHalAidlExists) {
        return HalVersion::NONE;
    }
    if (gPowerHalAidlExists) {
        if (!gLineagePowerHalAidl_) {
            gLineagePowerHalAidl_ = waitForVintfService<ILineagePowerAidl>();
        }
        if (gLineagePowerHalAidl_) {
            ALOGV("Successfully connected to Lineage Power HAL AIDL service.");
            return HalVersion::AIDL;
        } else {
            gPowerHalAidlExists = false;
        }
    }
    if (gPowerHalHidlExists && gLineagePowerHalV1_0_ == nullptr) {
        gLineagePowerHalV1_0_ = ILineagePowerV1_0::getService();
        if (gLineagePowerHalV1_0_ != nullptr) {
            ALOGI("Loaded power HAL service");
        if (gLineagePowerHalV1_0_) {
            ALOGV("Successfully connected to Lineage Power HAL HIDL 1.0 service.");
        } else {
            ALOGI("Couldn't load power HAL service");
            gLineagePowerHalExists = false;
            ALOGV("Couldn't load Lineage power HAL HIDL service");
            gPowerHalHidlExists = false;
            return HalVersion::NONE;
        }
    }
    if (gLineagePowerHalV1_0_) {
        return HalVersion::HIDL_1_0;
    }
    return HalVersion::NONE;
}

// Retrieve a copy of PowerHAL HIDL V1_0
@@ -184,11 +211,14 @@ sp<IPowerV1_1> getPowerHalHidlV1_1() {
    return nullptr;
}

// Retrieve a copy of LineagePowerHAL V1_0
sp<ILineagePowerV1_0> getLineagePowerHalV1_0() {
    std::lock_guard<std::mutex> lock(gPowerHalMutex);
    connectLineagePowerHalLocked();
    return gLineagePowerHalV1_0_;
// Retrieve a copy of LineagePowerHAL AIDL
sp<ILineagePowerAidl> getLineagePowerHalAidl() {
    std::lock_guard<std::mutex> lock(gLineagePowerHalMutex);
    if (connectLineagePowerHalLocked() == HalVersion::AIDL) {
        return gLineagePowerHalAidl_;
    }

    return nullptr;
}

// Check if a call to a power HAL function failed; if so, log the failure and invalidate the
@@ -338,6 +368,17 @@ static void sendPowerHint(PowerHint hintId, uint32_t data) {
                lock.unlock();
                setPowerModeWithHandle(handle, Mode::VR, static_cast<bool>(data));
                break;
            // TODO: Fix lineage sdk once killed hidl.
            } else if (hintId == static_cast<PowerHint>(LineagePowerHint1_0::CPU_BOOST)) {
                lock.unlock();
                sp<ILineagePowerAidl> handle = getLineagePowerHalAidl();
                handle->setBoost(LineageBoostAidl::CPU_BOOST, data);
                break;
            } else if (hintId == static_cast<PowerHint>(LineagePowerHint1_0::SET_PROFILE)) {
                lock.unlock();
                sp<ILineagePowerAidl> handle = getLineagePowerHalAidl();
                handle->setBoost(LineageBoostAidl::SET_PROFILE, data);
                break;
            } else {
                ALOGE("Unsupported power hint: %s.", toString(hintId).c_str());
                return;
@@ -439,12 +480,34 @@ void disableAutoSuspend() {

static jint nativeGetFeature(JNIEnv* /* env */, jclass /* clazz */, jint featureId) {
    int value = -1;

    sp<ILineagePowerV1_0> lineagePowerHalV1_0 = getLineagePowerHalV1_0();
    if (lineagePowerHalV1_0 != nullptr) {
        value = lineagePowerHalV1_0->getFeature(static_cast<LineageFeature>(featureId));
    std::unique_lock<std::mutex> lock(gLineagePowerHalMutex);
    switch (connectLineagePowerHalLocked()) {
        case HalVersion::NONE:
            break;
        case HalVersion::HIDL_1_0: {
            sp<ILineagePowerV1_0> handle = gLineagePowerHalV1_0_;
            lock.unlock();
            value = handle->getFeature(static_cast<LineageFeatureV1_0>(featureId));
            break;
        }
        case HalVersion::AIDL: {
            sp<ILineagePowerAidl> handle = gLineagePowerHalAidl_;
            lock.unlock();
            switch (static_cast<LineageFeatureV1_0>(featureId)) {
                case LineageFeatureV1_0::SUPPORTED_PROFILES:
                    handle->getFeature(LineageFeatureAidl::SUPPORTED_PROFILES, &value);
                    break;
                default:
                    ALOGE("Unsupported power feature: %d.", featureId);
                    break;
            }
            break;
        }
        default: {
            ALOGE("Unknown Lineage power HAL state");
            break;
        }
    }

    return static_cast<jint>(value);
}