Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 1 | /* |
| 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 Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 17 | #define LOG_TAG "HalWrapper" |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 18 | #include <android/hardware/power/Boost.h> |
| 19 | #include <android/hardware/power/Mode.h> |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 20 | #include <powermanager/PowerHalWrapper.h> |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 21 | #include <utils/Log.h> |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 22 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 23 | using namespace android::hardware::power; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 24 | |
| 25 | namespace android { |
| 26 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 27 | namespace power { |
| 28 | |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 29 | // ------------------------------------------------------------------------------------------------- |
| 30 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 31 | inline HalResult toHalResult(const binder::Status& result) { |
Lais Andrade | 14e97b7 | 2020-07-14 12:27:44 +0000 | [diff] [blame^] | 32 | if (result.isOk()) { |
| 33 | return HalResult::SUCCESSFUL; |
| 34 | } |
| 35 | ALOGE("Power HAL request failed: %s", result.toString8().c_str()); |
| 36 | return HalResult::FAILED; |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 37 | } |
| 38 | |
| 39 | template <typename T> |
| 40 | inline HalResult toHalResult(const hardware::Return<T>& result) { |
Lais Andrade | 14e97b7 | 2020-07-14 12:27:44 +0000 | [diff] [blame^] | 41 | if (result.isOk()) { |
| 42 | return HalResult::SUCCESSFUL; |
| 43 | } |
| 44 | ALOGE("Power HAL request failed: %s", result.description().c_str()); |
| 45 | return HalResult::FAILED; |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | // ------------------------------------------------------------------------------------------------- |
| 49 | |
| 50 | HalResult EmptyHalWrapper::setBoost(Boost boost, int32_t durationMs) { |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 51 | ALOGV("Skipped setBoost %s with duration %dms because Power HAL not available", |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 52 | toString(boost).c_str(), durationMs); |
| 53 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 54 | } |
| 55 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 56 | HalResult EmptyHalWrapper::setMode(Mode mode, bool enabled) { |
| 57 | ALOGV("Skipped setMode %s to %s because Power HAL not available", toString(mode).c_str(), |
| 58 | enabled ? "true" : "false"); |
| 59 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 60 | } |
| 61 | |
| 62 | // ------------------------------------------------------------------------------------------------- |
| 63 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 64 | HalResult HidlHalWrapperV1_0::setBoost(Boost boost, int32_t durationMs) { |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 65 | if (boost == Boost::INTERACTION) { |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 66 | return sendPowerHint(V1_0::PowerHint::INTERACTION, durationMs); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 67 | } else { |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 68 | ALOGV("Skipped setBoost %s because Power HAL AIDL not available", toString(boost).c_str()); |
| 69 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 70 | } |
| 71 | } |
| 72 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 73 | HalResult HidlHalWrapperV1_0::setMode(Mode mode, bool enabled) { |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 74 | uint32_t data = enabled ? 1 : 0; |
| 75 | switch (mode) { |
| 76 | case Mode::LAUNCH: |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 77 | return sendPowerHint(V1_0::PowerHint::LAUNCH, data); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 78 | case Mode::LOW_POWER: |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 79 | return sendPowerHint(V1_0::PowerHint::LOW_POWER, data); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 80 | case Mode::SUSTAINED_PERFORMANCE: |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 81 | return sendPowerHint(V1_0::PowerHint::SUSTAINED_PERFORMANCE, data); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 82 | case Mode::VR: |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 83 | return sendPowerHint(V1_0::PowerHint::VR_MODE, data); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 84 | case Mode::INTERACTIVE: |
| 85 | return setInteractive(enabled); |
| 86 | case Mode::DOUBLE_TAP_TO_WAKE: |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 87 | return setFeature(V1_0::Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE, enabled); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 88 | default: |
| 89 | ALOGV("Skipped setMode %s because Power HAL AIDL not available", |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 90 | toString(mode).c_str()); |
| 91 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 92 | } |
| 93 | } |
| 94 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 95 | HalResult HidlHalWrapperV1_0::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { |
| 96 | return toHalResult(mHandleV1_0->powerHint(hintId, data)); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 97 | } |
| 98 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 99 | HalResult HidlHalWrapperV1_0::setInteractive(bool enabled) { |
| 100 | return toHalResult(mHandleV1_0->setInteractive(enabled)); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 101 | } |
| 102 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 103 | HalResult HidlHalWrapperV1_0::setFeature(V1_0::Feature feature, bool enabled) { |
| 104 | return toHalResult(mHandleV1_0->setFeature(feature, enabled)); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 105 | } |
| 106 | |
| 107 | // ------------------------------------------------------------------------------------------------- |
| 108 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 109 | HalResult HidlHalWrapperV1_1::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { |
| 110 | return toHalResult(mHandleV1_1->powerHintAsync(hintId, data)); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | // ------------------------------------------------------------------------------------------------- |
| 114 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 115 | HalResult AidlHalWrapper::setBoost(Boost boost, int32_t durationMs) { |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 116 | std::unique_lock<std::mutex> lock(mBoostMutex); |
| 117 | // Quick return if boost is not supported by HAL |
| 118 | if (boost > Boost::DISPLAY_UPDATE_IMMINENT || |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 119 | mBoostSupportedArray[static_cast<int32_t>(boost)] == HalSupport::OFF) { |
| 120 | ALOGV("Skipped setBoost %s because Power HAL doesn't support it", toString(boost).c_str()); |
| 121 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 122 | } |
| 123 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 124 | if (mBoostSupportedArray[static_cast<int32_t>(boost)] == HalSupport::UNKNOWN) { |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 125 | bool isSupported = false; |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 126 | auto isSupportedRet = mHandle->isBoostSupported(boost, &isSupported); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 127 | if (!isSupportedRet.isOk()) { |
Lais Andrade | 14e97b7 | 2020-07-14 12:27:44 +0000 | [diff] [blame^] | 128 | ALOGE("Skipped setBoost %s because check support failed with: %s", |
| 129 | toString(boost).c_str(), isSupportedRet.toString8().c_str()); |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 130 | return HalResult::FAILED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 131 | } |
| 132 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 133 | mBoostSupportedArray[static_cast<int32_t>(boost)] = |
| 134 | isSupported ? HalSupport::ON : HalSupport::OFF; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 135 | if (!isSupported) { |
| 136 | ALOGV("Skipped setBoost %s because Power HAL doesn't support it", |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 137 | toString(boost).c_str()); |
| 138 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 139 | } |
| 140 | } |
| 141 | lock.unlock(); |
| 142 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 143 | return toHalResult(mHandle->setBoost(boost, durationMs)); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 144 | } |
| 145 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 146 | HalResult AidlHalWrapper::setMode(Mode mode, bool enabled) { |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 147 | std::unique_lock<std::mutex> lock(mModeMutex); |
| 148 | // Quick return if mode is not supported by HAL |
| 149 | if (mode > Mode::DISPLAY_INACTIVE || |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 150 | mModeSupportedArray[static_cast<int32_t>(mode)] == HalSupport::OFF) { |
| 151 | ALOGV("Skipped setMode %s because Power HAL doesn't support it", toString(mode).c_str()); |
| 152 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 153 | } |
| 154 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 155 | if (mModeSupportedArray[static_cast<int32_t>(mode)] == HalSupport::UNKNOWN) { |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 156 | bool isSupported = false; |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 157 | auto isSupportedRet = mHandle->isModeSupported(mode, &isSupported); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 158 | if (!isSupportedRet.isOk()) { |
Lais Andrade | 14e97b7 | 2020-07-14 12:27:44 +0000 | [diff] [blame^] | 159 | ALOGE("Skipped setMode %s because check support failed with: %s", |
| 160 | toString(mode).c_str(), isSupportedRet.toString8().c_str()); |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 161 | return HalResult::FAILED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 162 | } |
| 163 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 164 | mModeSupportedArray[static_cast<int32_t>(mode)] = |
| 165 | isSupported ? HalSupport::ON : HalSupport::OFF; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 166 | if (!isSupported) { |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 167 | ALOGV("Skipped setMode %s because Power HAL doesn't support it", |
| 168 | toString(mode).c_str()); |
| 169 | return HalResult::UNSUPPORTED; |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 170 | } |
| 171 | } |
| 172 | lock.unlock(); |
| 173 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 174 | return toHalResult(mHandle->setMode(mode, enabled)); |
Lais Andrade | 4d51f6c | 2020-03-25 10:58:31 +0000 | [diff] [blame] | 175 | } |
| 176 | |
| 177 | // ------------------------------------------------------------------------------------------------- |
| 178 | |
Lais Andrade | b59a9b5 | 2020-05-07 17:23:42 +0100 | [diff] [blame] | 179 | } // namespace power |
| 180 | |
| 181 | } // namespace android |