blob: 76afbfc6465a7a7a328c725bbcfd28a5a1fa0cdc [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"
Xiang Wang99f6f3c2023-05-22 13:12:16 -070018#include <aidl/android/hardware/power/Boost.h>
19#include <aidl/android/hardware/power/IPowerHintSession.h>
20#include <aidl/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;
Xiang Wang99f6f3c2023-05-22 13:12:16 -070027namespace Aidl = aidl::android::hardware::power;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000028
29namespace android {
30
Lais Andradeb59a9b52020-05-07 17:23:42 +010031namespace power {
32
Lais Andrade4d51f6c2020-03-25 10:58:31 +000033// -------------------------------------------------------------------------------------------------
Xiang Wang99f6f3c2023-05-22 13:12:16 -070034inline HalResult<void> toHalResult(const ndk::ScopedAStatus& result) {
Lais Andrade14e97b72020-07-14 12:27:44 +000035 if (result.isOk()) {
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080036 return HalResult<void>::ok();
Lais Andrade14e97b72020-07-14 12:27:44 +000037 }
Xiang Wang99f6f3c2023-05-22 13:12:16 -070038 ALOGE("Power HAL request failed: %s", result.getDescription().c_str());
39 return HalResult<void>::failed(result.getDescription());
Lais Andradeb59a9b52020-05-07 17:23:42 +010040}
41
42// -------------------------------------------------------------------------------------------------
43
Xiang Wang99f6f3c2023-05-22 13:12:16 -070044HalResult<void> EmptyHalWrapper::setBoost(Aidl::Boost boost, int32_t durationMs) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +000045 ALOGV("Skipped setBoost %s with duration %dms because Power HAL not available",
Lais Andradeb59a9b52020-05-07 17:23:42 +010046 toString(boost).c_str(), durationMs);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080047 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +000048}
49
Xiang Wang99f6f3c2023-05-22 13:12:16 -070050HalResult<void> EmptyHalWrapper::setMode(Aidl::Mode mode, bool enabled) {
Lais Andradeb59a9b52020-05-07 17:23:42 +010051 ALOGV("Skipped setMode %s to %s because Power HAL not available", toString(mode).c_str(),
52 enabled ? "true" : "false");
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080053 return HalResult<void>::unsupported();
54}
55
Xiang Wang99f6f3c2023-05-22 13:12:16 -070056HalResult<std::shared_ptr<Aidl::IPowerHintSession>> EmptyHalWrapper::createHintSession(
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080057 int32_t, int32_t, const std::vector<int32_t>& threadIds, int64_t) {
58 ALOGV("Skipped createHintSession(task num=%zu) because Power HAL not available",
59 threadIds.size());
Xiang Wang99f6f3c2023-05-22 13:12:16 -070060 return HalResult<std::shared_ptr<Aidl::IPowerHintSession>>::unsupported();
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080061}
62
63HalResult<int64_t> EmptyHalWrapper::getHintSessionPreferredRate() {
64 ALOGV("Skipped getHintSessionPreferredRate because Power HAL not available");
65 return HalResult<int64_t>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +000066}
67
68// -------------------------------------------------------------------------------------------------
69
Xiang Wang99f6f3c2023-05-22 13:12:16 -070070HalResult<void> HidlHalWrapperV1_0::setBoost(Aidl::Boost boost, int32_t durationMs) {
71 if (boost == Aidl::Boost::INTERACTION) {
Matt Buckleyc3894a42022-09-01 21:17:15 +000072 return sendPowerHint(V1_3::PowerHint::INTERACTION, durationMs);
Lais Andrade4d51f6c2020-03-25 10:58:31 +000073 } else {
Lais Andradeb59a9b52020-05-07 17:23:42 +010074 ALOGV("Skipped setBoost %s because Power HAL AIDL not available", toString(boost).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080075 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +000076 }
77}
78
Xiang Wang99f6f3c2023-05-22 13:12:16 -070079HalResult<void> HidlHalWrapperV1_0::setMode(Aidl::Mode mode, bool enabled) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +000080 uint32_t data = enabled ? 1 : 0;
81 switch (mode) {
Xiang Wang99f6f3c2023-05-22 13:12:16 -070082 case Aidl::Mode::LAUNCH:
Matt Buckleyc3894a42022-09-01 21:17:15 +000083 return sendPowerHint(V1_3::PowerHint::LAUNCH, data);
Xiang Wang99f6f3c2023-05-22 13:12:16 -070084 case Aidl::Mode::LOW_POWER:
Matt Buckleyc3894a42022-09-01 21:17:15 +000085 return sendPowerHint(V1_3::PowerHint::LOW_POWER, data);
Xiang Wang99f6f3c2023-05-22 13:12:16 -070086 case Aidl::Mode::SUSTAINED_PERFORMANCE:
Matt Buckleyc3894a42022-09-01 21:17:15 +000087 return sendPowerHint(V1_3::PowerHint::SUSTAINED_PERFORMANCE, data);
Xiang Wang99f6f3c2023-05-22 13:12:16 -070088 case Aidl::Mode::VR:
Matt Buckleyc3894a42022-09-01 21:17:15 +000089 return sendPowerHint(V1_3::PowerHint::VR_MODE, data);
Xiang Wang99f6f3c2023-05-22 13:12:16 -070090 case Aidl::Mode::INTERACTIVE:
Lais Andrade4d51f6c2020-03-25 10:58:31 +000091 return setInteractive(enabled);
Xiang Wang99f6f3c2023-05-22 13:12:16 -070092 case Aidl::Mode::DOUBLE_TAP_TO_WAKE:
Lais Andradeb59a9b52020-05-07 17:23:42 +010093 return setFeature(V1_0::Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE, enabled);
Lais Andrade4d51f6c2020-03-25 10:58:31 +000094 default:
95 ALOGV("Skipped setMode %s because Power HAL AIDL not available",
Lais Andradeb59a9b52020-05-07 17:23:42 +010096 toString(mode).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080097 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +000098 }
99}
100
Matt Buckleyc3894a42022-09-01 21:17:15 +0000101HalResult<void> HidlHalWrapperV1_0::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) {
102 auto ret = mHandleV1_0->powerHint(static_cast<V1_0::PowerHint>(hintId), data);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800103 return HalResult<void>::fromReturn(ret);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000104}
105
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800106HalResult<void> HidlHalWrapperV1_0::setInteractive(bool enabled) {
107 auto ret = mHandleV1_0->setInteractive(enabled);
108 return HalResult<void>::fromReturn(ret);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000109}
110
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800111HalResult<void> HidlHalWrapperV1_0::setFeature(V1_0::Feature feature, bool enabled) {
112 auto ret = mHandleV1_0->setFeature(feature, enabled);
113 return HalResult<void>::fromReturn(ret);
114}
115
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700116HalResult<std::shared_ptr<Aidl::IPowerHintSession>> HidlHalWrapperV1_0::createHintSession(
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800117 int32_t, int32_t, const std::vector<int32_t>& threadIds, int64_t) {
118 ALOGV("Skipped createHintSession(task num=%zu) because Power HAL not available",
119 threadIds.size());
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700120 return HalResult<std::shared_ptr<Aidl::IPowerHintSession>>::unsupported();
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800121}
122
123HalResult<int64_t> HidlHalWrapperV1_0::getHintSessionPreferredRate() {
124 ALOGV("Skipped getHintSessionPreferredRate because Power HAL not available");
125 return HalResult<int64_t>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000126}
127
128// -------------------------------------------------------------------------------------------------
129
Matt Buckleyc3894a42022-09-01 21:17:15 +0000130HalResult<void> HidlHalWrapperV1_1::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) {
131 auto handle = static_cast<V1_1::IPower*>(mHandleV1_0.get());
132 auto ret = handle->powerHintAsync(static_cast<V1_0::PowerHint>(hintId), data);
133 return HalResult<void>::fromReturn(ret);
134}
135
136// -------------------------------------------------------------------------------------------------
137
138HalResult<void> HidlHalWrapperV1_2::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) {
139 auto handle = static_cast<V1_2::IPower*>(mHandleV1_0.get());
140 auto ret = handle->powerHintAsync_1_2(static_cast<V1_2::PowerHint>(hintId), data);
141 return HalResult<void>::fromReturn(ret);
142}
143
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700144HalResult<void> HidlHalWrapperV1_2::setBoost(Aidl::Boost boost, int32_t durationMs) {
Matt Buckleyc3894a42022-09-01 21:17:15 +0000145 switch (boost) {
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700146 case Aidl::Boost::CAMERA_SHOT:
Matt Buckleyc3894a42022-09-01 21:17:15 +0000147 return sendPowerHint(V1_3::PowerHint::CAMERA_SHOT, durationMs);
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700148 case Aidl::Boost::CAMERA_LAUNCH:
Matt Buckleyc3894a42022-09-01 21:17:15 +0000149 return sendPowerHint(V1_3::PowerHint::CAMERA_LAUNCH, durationMs);
150 default:
151 return HidlHalWrapperV1_1::setBoost(boost, durationMs);
152 }
153}
154
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700155HalResult<void> HidlHalWrapperV1_2::setMode(Aidl::Mode mode, bool enabled) {
Matt Buckleyc3894a42022-09-01 21:17:15 +0000156 uint32_t data = enabled ? 1 : 0;
157 switch (mode) {
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700158 case Aidl::Mode::CAMERA_STREAMING_SECURE:
159 case Aidl::Mode::CAMERA_STREAMING_LOW:
160 case Aidl::Mode::CAMERA_STREAMING_MID:
161 case Aidl::Mode::CAMERA_STREAMING_HIGH:
Matt Buckleyc3894a42022-09-01 21:17:15 +0000162 return sendPowerHint(V1_3::PowerHint::CAMERA_STREAMING, data);
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700163 case Aidl::Mode::AUDIO_STREAMING_LOW_LATENCY:
Matt Buckleyc3894a42022-09-01 21:17:15 +0000164 return sendPowerHint(V1_3::PowerHint::AUDIO_LOW_LATENCY, data);
165 default:
166 return HidlHalWrapperV1_1::setMode(mode, enabled);
167 }
168}
169
170// -------------------------------------------------------------------------------------------------
171
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700172HalResult<void> HidlHalWrapperV1_3::setMode(Aidl::Mode mode, bool enabled) {
Matt Buckleyc3894a42022-09-01 21:17:15 +0000173 uint32_t data = enabled ? 1 : 0;
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700174 if (mode == Aidl::Mode::EXPENSIVE_RENDERING) {
Matt Buckleyc3894a42022-09-01 21:17:15 +0000175 return sendPowerHint(V1_3::PowerHint::EXPENSIVE_RENDERING, data);
176 }
177 return HidlHalWrapperV1_2::setMode(mode, enabled);
178}
179
180HalResult<void> HidlHalWrapperV1_3::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) {
181 auto handle = static_cast<V1_3::IPower*>(mHandleV1_0.get());
182 auto ret = handle->powerHintAsync_1_3(hintId, data);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800183 return HalResult<void>::fromReturn(ret);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000184}
185
186// -------------------------------------------------------------------------------------------------
187
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700188HalResult<void> AidlHalWrapper::setBoost(Aidl::Boost boost, int32_t durationMs) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000189 std::unique_lock<std::mutex> lock(mBoostMutex);
Lais Andrade7b632a52020-12-03 21:07:48 +0000190 size_t idx = static_cast<size_t>(boost);
191
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000192 // Quick return if boost is not supported by HAL
Lais Andrade7b632a52020-12-03 21:07:48 +0000193 if (idx >= mBoostSupportedArray.size() || mBoostSupportedArray[idx] == HalSupport::OFF) {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100194 ALOGV("Skipped setBoost %s because Power HAL doesn't support it", toString(boost).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800195 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000196 }
197
Lais Andrade7b632a52020-12-03 21:07:48 +0000198 if (mBoostSupportedArray[idx] == HalSupport::UNKNOWN) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000199 bool isSupported = false;
Lais Andradeb59a9b52020-05-07 17:23:42 +0100200 auto isSupportedRet = mHandle->isBoostSupported(boost, &isSupported);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000201 if (!isSupportedRet.isOk()) {
Lais Andrade14e97b72020-07-14 12:27:44 +0000202 ALOGE("Skipped setBoost %s because check support failed with: %s",
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700203 toString(boost).c_str(), isSupportedRet.getDescription().c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800204 // return HalResult::FAILED;
205 return HalResult<void>::fromStatus(isSupportedRet);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000206 }
207
Lais Andrade7b632a52020-12-03 21:07:48 +0000208 mBoostSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF;
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000209 if (!isSupported) {
210 ALOGV("Skipped setBoost %s because Power HAL doesn't support it",
Lais Andradeb59a9b52020-05-07 17:23:42 +0100211 toString(boost).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800212 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000213 }
214 }
215 lock.unlock();
216
Lais Andradeb59a9b52020-05-07 17:23:42 +0100217 return toHalResult(mHandle->setBoost(boost, durationMs));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000218}
219
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700220HalResult<void> AidlHalWrapper::setMode(Aidl::Mode mode, bool enabled) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000221 std::unique_lock<std::mutex> lock(mModeMutex);
Lais Andrade7b632a52020-12-03 21:07:48 +0000222 size_t idx = static_cast<size_t>(mode);
223
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000224 // Quick return if mode is not supported by HAL
Lais Andrade7b632a52020-12-03 21:07:48 +0000225 if (idx >= mModeSupportedArray.size() || mModeSupportedArray[idx] == HalSupport::OFF) {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100226 ALOGV("Skipped setMode %s because Power HAL doesn't support it", toString(mode).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800227 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000228 }
229
Lais Andrade7b632a52020-12-03 21:07:48 +0000230 if (mModeSupportedArray[idx] == HalSupport::UNKNOWN) {
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000231 bool isSupported = false;
Lais Andradeb59a9b52020-05-07 17:23:42 +0100232 auto isSupportedRet = mHandle->isModeSupported(mode, &isSupported);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000233 if (!isSupportedRet.isOk()) {
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700234 return HalResult<void>::failed(isSupportedRet.getDescription());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000235 }
236
Lais Andrade7b632a52020-12-03 21:07:48 +0000237 mModeSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF;
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000238 if (!isSupported) {
Lais Andradeb59a9b52020-05-07 17:23:42 +0100239 ALOGV("Skipped setMode %s because Power HAL doesn't support it",
240 toString(mode).c_str());
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800241 return HalResult<void>::unsupported();
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000242 }
243 }
244 lock.unlock();
245
Lais Andradeb59a9b52020-05-07 17:23:42 +0100246 return toHalResult(mHandle->setMode(mode, enabled));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000247}
248
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700249HalResult<std::shared_ptr<Aidl::IPowerHintSession>> AidlHalWrapper::createHintSession(
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800250 int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) {
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700251 std::shared_ptr<Aidl::IPowerHintSession> appSession;
252 return HalResult<std::shared_ptr<Aidl::IPowerHintSession>>::
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800253 fromStatus(mHandle->createHintSession(tgid, uid, threadIds, durationNanos, &appSession),
254 appSession);
255}
256
257HalResult<int64_t> AidlHalWrapper::getHintSessionPreferredRate() {
258 int64_t rate = -1;
259 auto result = mHandle->getHintSessionPreferredRate(&rate);
260 return HalResult<int64_t>::fromStatus(result, rate);
261}
262
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000263// -------------------------------------------------------------------------------------------------
264
Lais Andradeb59a9b52020-05-07 17:23:42 +0100265} // namespace power
266
267} // namespace android