blob: d74bd23a8d7d09177e9c45c56d88bc8b58deb581 [file] [log] [blame]
Lais Andrade4d51f6c2020-03-25 10:58:31 +00001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Lais Andradeb59a9b52020-05-07 17:23:42 +010017#define LOG_TAG "HalWrapper"
Lais Andrade4d51f6c2020-03-25 10:58:31 +000018#include <android/hardware/power/Boost.h>
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080019#include <android/hardware/power/IPowerHintSession.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000020#include <android/hardware/power/Mode.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000021#include <powermanager/PowerHalWrapper.h>
Lais Andradeb59a9b52020-05-07 17:23:42 +010022#include <utils/Log.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000023
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080024#include <cinttypes>
25
Lais Andradeb59a9b52020-05-07 17:23:42 +010026using namespace android::hardware::power;
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080027namespace V1_0 = android::hardware::power::V1_0;
28namespace V1_1 = android::hardware::power::V1_1;
29namespace Aidl = android::hardware::power;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000030
31namespace android {
32
Lais Andradeb59a9b52020-05-07 17:23:42 +010033namespace power {
34
Lais Andrade4d51f6c2020-03-25 10:58:31 +000035// -------------------------------------------------------------------------------------------------
36
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080037inline HalResult<void> toHalResult(const binder::Status& result) {
Lais Andrade14e97b72020-07-14 12:27:44 +000038 if (result.isOk()) {
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080039 return HalResult<void>::ok();
Lais Andrade14e97b72020-07-14 12:27:44 +000040 }
41 ALOGE("Power HAL request failed: %s", result.toString8().c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080042 return HalResult<void>::fromStatus(result);
Lais Andradeb59a9b52020-05-07 17:23:42 +010043}
44
45template <typename T>
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080046template <typename R>
47HalResult<T> HalResult<T>::fromReturn(hardware::Return<R>& ret, T data) {
48 return ret.isOk() ? HalResult<T>::ok(data) : HalResult<T>::failed(ret.description());
49}
50
51template <typename T>
52template <typename R>
53HalResult<T> HalResult<T>::fromReturn(hardware::Return<R>& ret, V1_0::Status status, T data) {
54 return ret.isOk() ? HalResult<T>::fromStatus(status, data)
55 : HalResult<T>::failed(ret.description());
Lais Andradeb59a9b52020-05-07 17:23:42 +010056}
57
58// -------------------------------------------------------------------------------------------------
59
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080060HalResult<void> HalResult<void>::fromStatus(status_t status) {
61 if (status == android::OK) {
62 return HalResult<void>::ok();
63 }
64 return HalResult<void>::failed(statusToString(status));
65}
66
67HalResult<void> HalResult<void>::fromStatus(binder::Status status) {
68 if (status.exceptionCode() == binder::Status::EX_UNSUPPORTED_OPERATION) {
69 return HalResult<void>::unsupported();
70 }
71 if (status.isOk()) {
72 return HalResult<void>::ok();
73 }
74 return HalResult<void>::failed(std::string(status.toString8().c_str()));
75}
76
77template <typename R>
78HalResult<void> HalResult<void>::fromReturn(hardware::Return<R>& ret) {
79 return ret.isOk() ? HalResult<void>::ok() : HalResult<void>::failed(ret.description());
80}
81// -------------------------------------------------------------------------------------------------
82
83HalResult<void> EmptyHalWrapper::setBoost(Boost boost, int32_t durationMs) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +000084 ALOGV("Skipped setBoost %s with duration %dms because Power HAL not available",
Lais Andradeb59a9b52020-05-07 17:23:42 +010085 toString(boost).c_str(), durationMs);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080086 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +000087}
88
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080089HalResult<void> EmptyHalWrapper::setMode(Mode mode, bool enabled) {
Lais Andradeb59a9b52020-05-07 17:23:42 +010090 ALOGV("Skipped setMode %s to %s because Power HAL not available", toString(mode).c_str(),
91 enabled ? "true" : "false");
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080092 return HalResult<void>::unsupported();
93}
94
95HalResult<sp<Aidl::IPowerHintSession>> EmptyHalWrapper::createHintSession(
96 int32_t, int32_t, const std::vector<int32_t>& threadIds, int64_t) {
97 ALOGV("Skipped createHintSession(task num=%zu) because Power HAL not available",
98 threadIds.size());
99 return HalResult<sp<Aidl::IPowerHintSession>>::unsupported();
100}
101
102HalResult<int64_t> EmptyHalWrapper::getHintSessionPreferredRate() {
103 ALOGV("Skipped getHintSessionPreferredRate because Power HAL not available");
104 return HalResult<int64_t>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000105}
106
107// -------------------------------------------------------------------------------------------------
108
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800109HalResult<void> HidlHalWrapperV1_0::setBoost(Boost boost, int32_t durationMs) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000110 if (boost == Boost::INTERACTION) {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100111 return sendPowerHint(V1_0::PowerHint::INTERACTION, durationMs);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000112 } else {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100113 ALOGV("Skipped setBoost %s because Power HAL AIDL not available", toString(boost).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800114 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000115 }
116}
117
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800118HalResult<void> HidlHalWrapperV1_0::setMode(Mode mode, bool enabled) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000119 uint32_t data = enabled ? 1 : 0;
120 switch (mode) {
121 case Mode::LAUNCH:
Lais Andradeb59a9b52020-05-07 17:23:42 +0100122 return sendPowerHint(V1_0::PowerHint::LAUNCH, data);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000123 case Mode::LOW_POWER:
Lais Andradeb59a9b52020-05-07 17:23:42 +0100124 return sendPowerHint(V1_0::PowerHint::LOW_POWER, data);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000125 case Mode::SUSTAINED_PERFORMANCE:
Lais Andradeb59a9b52020-05-07 17:23:42 +0100126 return sendPowerHint(V1_0::PowerHint::SUSTAINED_PERFORMANCE, data);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000127 case Mode::VR:
Lais Andradeb59a9b52020-05-07 17:23:42 +0100128 return sendPowerHint(V1_0::PowerHint::VR_MODE, data);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000129 case Mode::INTERACTIVE:
130 return setInteractive(enabled);
131 case Mode::DOUBLE_TAP_TO_WAKE:
Lais Andradeb59a9b52020-05-07 17:23:42 +0100132 return setFeature(V1_0::Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE, enabled);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000133 default:
134 ALOGV("Skipped setMode %s because Power HAL AIDL not available",
Lais Andradeb59a9b52020-05-07 17:23:42 +0100135 toString(mode).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800136 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000137 }
138}
139
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800140HalResult<void> HidlHalWrapperV1_0::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) {
141 auto ret = mHandleV1_0->powerHint(hintId, data);
142 return HalResult<void>::fromReturn(ret);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000143}
144
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800145HalResult<void> HidlHalWrapperV1_0::setInteractive(bool enabled) {
146 auto ret = mHandleV1_0->setInteractive(enabled);
147 return HalResult<void>::fromReturn(ret);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000148}
149
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800150HalResult<void> HidlHalWrapperV1_0::setFeature(V1_0::Feature feature, bool enabled) {
151 auto ret = mHandleV1_0->setFeature(feature, enabled);
152 return HalResult<void>::fromReturn(ret);
153}
154
155HalResult<sp<Aidl::IPowerHintSession>> HidlHalWrapperV1_0::createHintSession(
156 int32_t, int32_t, const std::vector<int32_t>& threadIds, int64_t) {
157 ALOGV("Skipped createHintSession(task num=%zu) because Power HAL not available",
158 threadIds.size());
159 return HalResult<sp<Aidl::IPowerHintSession>>::unsupported();
160}
161
162HalResult<int64_t> HidlHalWrapperV1_0::getHintSessionPreferredRate() {
163 ALOGV("Skipped getHintSessionPreferredRate because Power HAL not available");
164 return HalResult<int64_t>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000165}
166
167// -------------------------------------------------------------------------------------------------
168
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800169HalResult<void> HidlHalWrapperV1_1::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) {
170 auto ret = mHandleV1_1->powerHintAsync(hintId, data);
171 return HalResult<void>::fromReturn(ret);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000172}
173
174// -------------------------------------------------------------------------------------------------
175
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800176HalResult<void> AidlHalWrapper::setBoost(Boost boost, int32_t durationMs) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000177 std::unique_lock<std::mutex> lock(mBoostMutex);
Lais Andrade7b632a52020-12-03 21:07:48 +0000178 size_t idx = static_cast<size_t>(boost);
179
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000180 // Quick return if boost is not supported by HAL
Lais Andrade7b632a52020-12-03 21:07:48 +0000181 if (idx >= mBoostSupportedArray.size() || mBoostSupportedArray[idx] == HalSupport::OFF) {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100182 ALOGV("Skipped setBoost %s because Power HAL doesn't support it", toString(boost).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800183 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000184 }
185
Lais Andrade7b632a52020-12-03 21:07:48 +0000186 if (mBoostSupportedArray[idx] == HalSupport::UNKNOWN) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000187 bool isSupported = false;
Lais Andradeb59a9b52020-05-07 17:23:42 +0100188 auto isSupportedRet = mHandle->isBoostSupported(boost, &isSupported);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000189 if (!isSupportedRet.isOk()) {
Lais Andrade14e97b72020-07-14 12:27:44 +0000190 ALOGE("Skipped setBoost %s because check support failed with: %s",
191 toString(boost).c_str(), isSupportedRet.toString8().c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800192 // return HalResult::FAILED;
193 return HalResult<void>::fromStatus(isSupportedRet);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000194 }
195
Lais Andrade7b632a52020-12-03 21:07:48 +0000196 mBoostSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF;
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000197 if (!isSupported) {
198 ALOGV("Skipped setBoost %s because Power HAL doesn't support it",
Lais Andradeb59a9b52020-05-07 17:23:42 +0100199 toString(boost).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800200 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000201 }
202 }
203 lock.unlock();
204
Lais Andradeb59a9b52020-05-07 17:23:42 +0100205 return toHalResult(mHandle->setBoost(boost, durationMs));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000206}
207
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800208HalResult<void> AidlHalWrapper::setMode(Mode mode, bool enabled) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000209 std::unique_lock<std::mutex> lock(mModeMutex);
Lais Andrade7b632a52020-12-03 21:07:48 +0000210 size_t idx = static_cast<size_t>(mode);
211
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000212 // Quick return if mode is not supported by HAL
Lais Andrade7b632a52020-12-03 21:07:48 +0000213 if (idx >= mModeSupportedArray.size() || mModeSupportedArray[idx] == HalSupport::OFF) {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100214 ALOGV("Skipped setMode %s because Power HAL doesn't support it", toString(mode).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800215 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000216 }
217
Lais Andrade7b632a52020-12-03 21:07:48 +0000218 if (mModeSupportedArray[idx] == HalSupport::UNKNOWN) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000219 bool isSupported = false;
Lais Andradeb59a9b52020-05-07 17:23:42 +0100220 auto isSupportedRet = mHandle->isModeSupported(mode, &isSupported);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000221 if (!isSupportedRet.isOk()) {
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800222 return HalResult<void>::failed(isSupportedRet.toString8().c_str());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000223 }
224
Lais Andrade7b632a52020-12-03 21:07:48 +0000225 mModeSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF;
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000226 if (!isSupported) {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100227 ALOGV("Skipped setMode %s because Power HAL doesn't support it",
228 toString(mode).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800229 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000230 }
231 }
232 lock.unlock();
233
Lais Andradeb59a9b52020-05-07 17:23:42 +0100234 return toHalResult(mHandle->setMode(mode, enabled));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000235}
236
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800237HalResult<sp<Aidl::IPowerHintSession>> AidlHalWrapper::createHintSession(
238 int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) {
239 sp<IPowerHintSession> appSession;
240 return HalResult<sp<Aidl::IPowerHintSession>>::
241 fromStatus(mHandle->createHintSession(tgid, uid, threadIds, durationNanos, &appSession),
242 appSession);
243}
244
245HalResult<int64_t> AidlHalWrapper::getHintSessionPreferredRate() {
246 int64_t rate = -1;
247 auto result = mHandle->getHintSessionPreferredRate(&rate);
248 return HalResult<int64_t>::fromStatus(result, rate);
249}
250
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000251// -------------------------------------------------------------------------------------------------
252
Lais Andradeb59a9b52020-05-07 17:23:42 +0100253} // namespace power
254
255} // namespace android