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

Commit e88b23de authored by Santos Cordon's avatar Santos Cordon Committed by android-build-merger
Browse files

Merge "Migrate suspend HAL interactions to new suspend control AIDL."

am: a65ac91c

Change-Id: I2f56dce4ed6eb940307d993689e86f6215bb45d6
parents bb79b309 a65ac91c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -120,6 +120,7 @@ cc_defaults {
        "android.frameworks.schedulerservice@1.0",
        "android.frameworks.schedulerservice@1.0",
        "android.frameworks.sensorservice@1.0",
        "android.frameworks.sensorservice@1.0",
        "android.system.suspend@1.0",
        "android.system.suspend@1.0",
        "suspend_control_aidl_interface-cpp",
    ],
    ],


    static_libs: [
    static_libs: [
+16 −13
Original line number Original line Diff line number Diff line
@@ -30,8 +30,8 @@


#include <android/hardware/power/1.0/IPower.h>
#include <android/hardware/power/1.0/IPower.h>
#include <android/hardware/power/1.1/IPower.h>
#include <android/hardware/power/1.1/IPower.h>
#include <android/system/suspend/1.0/ISystemSuspend.h>
#include <android/system/suspend/BnSuspendCallback.h>
#include <android/system/suspend/1.0/ISystemSuspendCallback.h>
#include <android/system/suspend/ISuspendControlService.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/AndroidRuntime.h>
#include <jni.h>
#include <jni.h>


@@ -44,14 +44,14 @@


using android::hardware::Return;
using android::hardware::Return;
using android::hardware::Void;
using android::hardware::Void;
using android::system::suspend::BnSuspendCallback;
using android::hardware::power::V1_0::PowerStatePlatformSleepState;
using android::hardware::power::V1_0::PowerStatePlatformSleepState;
using android::hardware::power::V1_0::PowerStateVoter;
using android::hardware::power::V1_0::PowerStateVoter;
using android::hardware::power::V1_0::Status;
using android::hardware::power::V1_0::Status;
using android::hardware::power::V1_1::PowerStateSubsystem;
using android::hardware::power::V1_1::PowerStateSubsystem;
using android::hardware::power::V1_1::PowerStateSubsystemSleepState;
using android::hardware::power::V1_1::PowerStateSubsystemSleepState;
using android::hardware::hidl_vec;
using android::hardware::hidl_vec;
using android::system::suspend::V1_0::ISystemSuspend;
using android::system::suspend::ISuspendControlService;
using android::system::suspend::V1_0::ISystemSuspendCallback;
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower;


@@ -66,7 +66,7 @@ static sem_t wakeup_sem;
extern sp<IPowerV1_0> getPowerHalV1_0();
extern sp<IPowerV1_0> getPowerHalV1_0();
extern sp<IPowerV1_1> getPowerHalV1_1();
extern sp<IPowerV1_1> getPowerHalV1_1();
extern bool processPowerHalReturn(const Return<void> &ret, const char* functionName);
extern bool processPowerHalReturn(const Return<void> &ret, const char* functionName);
extern sp<ISystemSuspend> getSuspendHal();
extern sp<ISuspendControlService> getSuspendControl();


// Java methods used in getLowPowerStats
// Java methods used in getLowPowerStats
static jmethodID jgetAndUpdatePlatformState = NULL;
static jmethodID jgetAndUpdatePlatformState = NULL;
@@ -74,17 +74,17 @@ static jmethodID jgetSubsystem = NULL;
static jmethodID jputVoter = NULL;
static jmethodID jputVoter = NULL;
static jmethodID jputState = NULL;
static jmethodID jputState = NULL;


class WakeupCallback : public ISystemSuspendCallback {
class WakeupCallback : public BnSuspendCallback {
   public:
   public:
    Return<void> notifyWakeup(bool success) override {
    binder::Status notifyWakeup(bool success) override {
        ALOGV("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
        ALOGI("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
        int ret = sem_post(&wakeup_sem);
        int ret = sem_post(&wakeup_sem);
        if (ret < 0) {
        if (ret < 0) {
            char buf[80];
            char buf[80];
            strerror_r(errno, buf, sizeof(buf));
            strerror_r(errno, buf, sizeof(buf));
            ALOGE("Error posting wakeup sem: %s\n", buf);
            ALOGE("Error posting wakeup sem: %s\n", buf);
        }
        }
        return Void();
        return binder::Status::ok();
    }
    }
};
};


@@ -107,9 +107,12 @@ static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jobject outBuf)
            jniThrowException(env, "java/lang/IllegalStateException", buf);
            jniThrowException(env, "java/lang/IllegalStateException", buf);
            return -1;
            return -1;
        }
        }
        ALOGV("Registering callback...");
        sp<ISuspendControlService> suspendControl = getSuspendControl();
        sp<ISystemSuspend> suspendHal = getSuspendHal();
        bool isRegistered = false;
        suspendHal->registerCallback(new WakeupCallback());
        suspendControl->registerCallback(new WakeupCallback(), &isRegistered);
        if (!isRegistered) {
            ALOGE("Failed to register wakeup callback");
        }
    }
    }


    // Wait for wakeup.
    // Wait for wakeup.
+30 −11
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@


#include <android/hardware/power/1.1/IPower.h>
#include <android/hardware/power/1.1/IPower.h>
#include <android/system/suspend/1.0/ISystemSuspend.h>
#include <android/system/suspend/1.0/ISystemSuspend.h>
#include <android/system/suspend/ISuspendControlService.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include "jni.h"


@@ -30,13 +31,14 @@
#include <android-base/chrono_utils.h>
#include <android-base/chrono_utils.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <android_runtime/Log.h>
#include <binder/IServiceManager.h>
#include <hardware/power.h>
#include <hardware_legacy/power.h>
#include <hidl/ServiceManagement.h>
#include <utils/Timers.h>
#include <utils/Timers.h>
#include <utils/misc.h>
#include <utils/misc.h>
#include <utils/String8.h>
#include <utils/String8.h>
#include <utils/Log.h>
#include <utils/Log.h>
#include <hardware/power.h>
#include <hardware_legacy/power.h>
#include <hidl/ServiceManagement.h>


#include "com_android_server_power_PowerManagerService.h"
#include "com_android_server_power_PowerManagerService.h"


@@ -48,6 +50,7 @@ using android::String8;
using android::system::suspend::V1_0::ISystemSuspend;
using android::system::suspend::V1_0::ISystemSuspend;
using android::system::suspend::V1_0::IWakeLock;
using android::system::suspend::V1_0::IWakeLock;
using android::system::suspend::V1_0::WakeLockType;
using android::system::suspend::V1_0::WakeLockType;
using android::system::suspend::ISuspendControlService;
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower;


@@ -176,6 +179,7 @@ void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t
}
}


static sp<ISystemSuspend> gSuspendHal = nullptr;
static sp<ISystemSuspend> gSuspendHal = nullptr;
static sp<ISuspendControlService> gSuspendControl = nullptr;
static sp<IWakeLock> gSuspendBlocker = nullptr;
static sp<IWakeLock> gSuspendBlocker = nullptr;
static std::mutex gSuspendMutex;
static std::mutex gSuspendMutex;


@@ -191,20 +195,35 @@ sp<ISystemSuspend> getSuspendHal() {
    return gSuspendHal;
    return gSuspendHal;
}
}


sp<ISuspendControlService> getSuspendControl() {
    static std::once_flag suspendControlFlag;
    std::call_once(suspendControlFlag, [](){
        while(gSuspendControl == nullptr) {
            sp<IBinder> control =
                    defaultServiceManager()->getService(String16("suspend_control"));
            if (control != nullptr) {
                gSuspendControl = interface_cast<ISuspendControlService>(control);
            }
        }
    });
    return gSuspendControl;
}

void enableAutoSuspend() {
void enableAutoSuspend() {
    static bool enabled = false;
    static bool enabled = false;

    std::lock_guard<std::mutex> lock(gSuspendMutex);
    if (!enabled) {
    if (!enabled) {
        sp<ISystemSuspend> suspendHal = getSuspendHal();
        sp<ISuspendControlService> suspendControl = getSuspendControl();
        suspendHal->enableAutosuspend();
        suspendControl->enableAutosuspend(&enabled);
        enabled = true;
    }
    }

    {
        std::lock_guard<std::mutex> lock(gSuspendMutex);
        if (gSuspendBlocker) {
        if (gSuspendBlocker) {
            gSuspendBlocker->release();
            gSuspendBlocker->release();
            gSuspendBlocker.clear();
            gSuspendBlocker.clear();
        }
        }
    }
    }
}


void disableAutoSuspend() {
void disableAutoSuspend() {
    std::lock_guard<std::mutex> lock(gSuspendMutex);
    std::lock_guard<std::mutex> lock(gSuspendMutex);