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

Commit a22cfeea authored by Santos Cordon's avatar Santos Cordon Committed by Android (Google) Code Review
Browse files

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

parents 0a64976a c7b16ca0
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -127,6 +127,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
@@ -32,8 +32,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/hardware/power/stats/1.0/IPowerStats.h>
#include <android/hardware/power/stats/1.0/IPowerStats.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>


@@ -46,14 +46,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;


@@ -68,7 +68,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;
@@ -103,17 +103,17 @@ struct PowerHalDeathRecipient : virtual public hardware::hidl_death_recipient {


sp<PowerHalDeathRecipient> gDeathRecipient = new PowerHalDeathRecipient();
sp<PowerHalDeathRecipient> gDeathRecipient = new PowerHalDeathRecipient();


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


@@ -136,9 +136,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);