Migrate suspend HAL interactions to new suspend control AIDL.
Use the new Suspend Control Service AIDL definition to communicate with the suspend HAL instead of using the HAL interface directly. Bug: 121210355 Test: manual - verify auto-suspend loop is still processing. Change-Id: I61cf05a8095f9d121fafb862def8239b325a7f43
This commit is contained in:
@@ -127,6 +127,7 @@ cc_defaults {
|
||||
"android.frameworks.schedulerservice@1.0",
|
||||
"android.frameworks.sensorservice@1.0",
|
||||
"android.system.suspend@1.0",
|
||||
"suspend_control_aidl_interface-cpp",
|
||||
],
|
||||
|
||||
static_libs: [
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
#include <android/hardware/power/1.0/IPower.h>
|
||||
#include <android/hardware/power/1.1/IPower.h>
|
||||
#include <android/hardware/power/stats/1.0/IPowerStats.h>
|
||||
#include <android/system/suspend/1.0/ISystemSuspend.h>
|
||||
#include <android/system/suspend/1.0/ISystemSuspendCallback.h>
|
||||
#include <android/system/suspend/BnSuspendCallback.h>
|
||||
#include <android/system/suspend/ISuspendControlService.h>
|
||||
#include <android_runtime/AndroidRuntime.h>
|
||||
#include <jni.h>
|
||||
|
||||
@@ -46,14 +46,14 @@
|
||||
|
||||
using android::hardware::Return;
|
||||
using android::hardware::Void;
|
||||
using android::system::suspend::BnSuspendCallback;
|
||||
using android::hardware::power::V1_0::PowerStatePlatformSleepState;
|
||||
using android::hardware::power::V1_0::PowerStateVoter;
|
||||
using android::hardware::power::V1_0::Status;
|
||||
using android::hardware::power::V1_1::PowerStateSubsystem;
|
||||
using android::hardware::power::V1_1::PowerStateSubsystemSleepState;
|
||||
using android::hardware::hidl_vec;
|
||||
using android::system::suspend::V1_0::ISystemSuspend;
|
||||
using android::system::suspend::V1_0::ISystemSuspendCallback;
|
||||
using android::system::suspend::ISuspendControlService;
|
||||
using IPowerV1_1 = android::hardware::power::V1_1::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_1> getPowerHalV1_1();
|
||||
extern bool processPowerHalReturn(const Return<void> &ret, const char* functionName);
|
||||
extern sp<ISystemSuspend> getSuspendHal();
|
||||
extern sp<ISuspendControlService> getSuspendControl();
|
||||
|
||||
// Java methods used in getLowPowerStats
|
||||
static jmethodID jgetAndUpdatePlatformState = NULL;
|
||||
@@ -103,17 +103,17 @@ struct PowerHalDeathRecipient : virtual public hardware::hidl_death_recipient {
|
||||
|
||||
sp<PowerHalDeathRecipient> gDeathRecipient = new PowerHalDeathRecipient();
|
||||
|
||||
class WakeupCallback : public ISystemSuspendCallback {
|
||||
public:
|
||||
Return<void> notifyWakeup(bool success) override {
|
||||
ALOGV("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
|
||||
class WakeupCallback : public BnSuspendCallback {
|
||||
public:
|
||||
binder::Status notifyWakeup(bool success) override {
|
||||
ALOGI("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
|
||||
int ret = sem_post(&wakeup_sem);
|
||||
if (ret < 0) {
|
||||
char buf[80];
|
||||
strerror_r(errno, buf, sizeof(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);
|
||||
return -1;
|
||||
}
|
||||
ALOGV("Registering callback...");
|
||||
sp<ISystemSuspend> suspendHal = getSuspendHal();
|
||||
suspendHal->registerCallback(new WakeupCallback());
|
||||
sp<ISuspendControlService> suspendControl = getSuspendControl();
|
||||
bool isRegistered = false;
|
||||
suspendControl->registerCallback(new WakeupCallback(), &isRegistered);
|
||||
if (!isRegistered) {
|
||||
ALOGE("Failed to register wakeup callback");
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for wakeup.
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <android/hardware/power/1.1/IPower.h>
|
||||
#include <android/system/suspend/1.0/ISystemSuspend.h>
|
||||
#include <android/system/suspend/ISuspendControlService.h>
|
||||
#include <nativehelper/JNIHelp.h>
|
||||
#include "jni.h"
|
||||
|
||||
@@ -30,13 +31,14 @@
|
||||
#include <android-base/chrono_utils.h>
|
||||
#include <android_runtime/AndroidRuntime.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/misc.h>
|
||||
#include <utils/String8.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"
|
||||
|
||||
@@ -48,6 +50,7 @@ using android::String8;
|
||||
using android::system::suspend::V1_0::ISystemSuspend;
|
||||
using android::system::suspend::V1_0::IWakeLock;
|
||||
using android::system::suspend::V1_0::WakeLockType;
|
||||
using android::system::suspend::ISuspendControlService;
|
||||
using IPowerV1_1 = android::hardware::power::V1_1::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<ISuspendControlService> gSuspendControl = nullptr;
|
||||
static sp<IWakeLock> gSuspendBlocker = nullptr;
|
||||
static std::mutex gSuspendMutex;
|
||||
|
||||
@@ -191,18 +195,33 @@ sp<ISystemSuspend> getSuspendHal() {
|
||||
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() {
|
||||
static bool enabled = false;
|
||||
|
||||
std::lock_guard<std::mutex> lock(gSuspendMutex);
|
||||
if (!enabled) {
|
||||
sp<ISystemSuspend> suspendHal = getSuspendHal();
|
||||
suspendHal->enableAutosuspend();
|
||||
enabled = true;
|
||||
sp<ISuspendControlService> suspendControl = getSuspendControl();
|
||||
suspendControl->enableAutosuspend(&enabled);
|
||||
}
|
||||
if (gSuspendBlocker) {
|
||||
gSuspendBlocker->release();
|
||||
gSuspendBlocker.clear();
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(gSuspendMutex);
|
||||
if (gSuspendBlocker) {
|
||||
gSuspendBlocker->release();
|
||||
gSuspendBlocker.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user