1*38e8c45fSAndroid Build Coastguard Worker /* 2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project 3*38e8c45fSAndroid Build Coastguard Worker * 4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*38e8c45fSAndroid Build Coastguard Worker * 8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*38e8c45fSAndroid Build Coastguard Worker * 10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License. 15*38e8c45fSAndroid Build Coastguard Worker */ 16*38e8c45fSAndroid Build Coastguard Worker 17*38e8c45fSAndroid Build Coastguard Worker #pragma once 18*38e8c45fSAndroid Build Coastguard Worker 19*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/Boost.h> 20*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/ChannelConfig.h> 21*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/IPower.h> 22*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/IPowerHintSession.h> 23*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/Mode.h> 24*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/SessionConfig.h> 25*38e8c45fSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h> 26*38e8c45fSAndroid Build Coastguard Worker #include <android/hardware/power/1.1/IPower.h> 27*38e8c45fSAndroid Build Coastguard Worker #include <android/hardware/power/1.2/IPower.h> 28*38e8c45fSAndroid Build Coastguard Worker #include <android/hardware/power/1.3/IPower.h> 29*38e8c45fSAndroid Build Coastguard Worker #include <powermanager/HalResult.h> 30*38e8c45fSAndroid Build Coastguard Worker #include <powermanager/PowerHintSessionWrapper.h> 31*38e8c45fSAndroid Build Coastguard Worker 32*38e8c45fSAndroid Build Coastguard Worker #include <binder/Status.h> 33*38e8c45fSAndroid Build Coastguard Worker 34*38e8c45fSAndroid Build Coastguard Worker #include <utility> 35*38e8c45fSAndroid Build Coastguard Worker 36*38e8c45fSAndroid Build Coastguard Worker namespace android { 37*38e8c45fSAndroid Build Coastguard Worker 38*38e8c45fSAndroid Build Coastguard Worker namespace power { 39*38e8c45fSAndroid Build Coastguard Worker 40*38e8c45fSAndroid Build Coastguard Worker // State of Power HAL support for individual apis. 41*38e8c45fSAndroid Build Coastguard Worker enum class HalSupport { 42*38e8c45fSAndroid Build Coastguard Worker UNKNOWN = 0, 43*38e8c45fSAndroid Build Coastguard Worker ON = 1, 44*38e8c45fSAndroid Build Coastguard Worker OFF = 2, 45*38e8c45fSAndroid Build Coastguard Worker }; 46*38e8c45fSAndroid Build Coastguard Worker 47*38e8c45fSAndroid Build Coastguard Worker // Wrapper for Power HAL handlers. 48*38e8c45fSAndroid Build Coastguard Worker class HalWrapper { 49*38e8c45fSAndroid Build Coastguard Worker public: 50*38e8c45fSAndroid Build Coastguard Worker virtual ~HalWrapper() = default; 51*38e8c45fSAndroid Build Coastguard Worker 52*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<void> setBoost(aidl::android::hardware::power::Boost boost, 53*38e8c45fSAndroid Build Coastguard Worker int32_t durationMs) = 0; 54*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) = 0; 55*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSession( 56*38e8c45fSAndroid Build Coastguard Worker int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, 57*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos) = 0; 58*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSessionWithConfig( 59*38e8c45fSAndroid Build Coastguard Worker int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos, 60*38e8c45fSAndroid Build Coastguard Worker aidl::android::hardware::power::SessionTag tag, 61*38e8c45fSAndroid Build Coastguard Worker aidl::android::hardware::power::SessionConfig* config) = 0; 62*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<int64_t> getHintSessionPreferredRate() = 0; 63*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<aidl::android::hardware::power::ChannelConfig> getSessionChannel(int tgid, 64*38e8c45fSAndroid Build Coastguard Worker int uid) = 0; 65*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<void> closeSessionChannel(int tgid, int uid) = 0; 66*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<aidl::android::hardware::power::SupportInfo> getSupportInfo() = 0; 67*38e8c45fSAndroid Build Coastguard Worker }; 68*38e8c45fSAndroid Build Coastguard Worker 69*38e8c45fSAndroid Build Coastguard Worker // Empty Power HAL wrapper that ignores all api calls. 70*38e8c45fSAndroid Build Coastguard Worker class EmptyHalWrapper : public HalWrapper { 71*38e8c45fSAndroid Build Coastguard Worker public: 72*38e8c45fSAndroid Build Coastguard Worker EmptyHalWrapper() = default; 73*38e8c45fSAndroid Build Coastguard Worker ~EmptyHalWrapper() override = default; 74*38e8c45fSAndroid Build Coastguard Worker 75*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setBoost(aidl::android::hardware::power::Boost boost, 76*38e8c45fSAndroid Build Coastguard Worker int32_t durationMs) override; 77*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override; 78*38e8c45fSAndroid Build Coastguard Worker HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSession( 79*38e8c45fSAndroid Build Coastguard Worker int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, 80*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos) override; 81*38e8c45fSAndroid Build Coastguard Worker HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSessionWithConfig( 82*38e8c45fSAndroid Build Coastguard Worker int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos, 83*38e8c45fSAndroid Build Coastguard Worker aidl::android::hardware::power::SessionTag tag, 84*38e8c45fSAndroid Build Coastguard Worker aidl::android::hardware::power::SessionConfig* config) override; 85*38e8c45fSAndroid Build Coastguard Worker HalResult<int64_t> getHintSessionPreferredRate() override; 86*38e8c45fSAndroid Build Coastguard Worker HalResult<aidl::android::hardware::power::ChannelConfig> getSessionChannel(int tgid, 87*38e8c45fSAndroid Build Coastguard Worker int uid) override; 88*38e8c45fSAndroid Build Coastguard Worker HalResult<void> closeSessionChannel(int tgid, int uid) override; 89*38e8c45fSAndroid Build Coastguard Worker HalResult<aidl::android::hardware::power::SupportInfo> getSupportInfo() override; 90*38e8c45fSAndroid Build Coastguard Worker 91*38e8c45fSAndroid Build Coastguard Worker protected: 92*38e8c45fSAndroid Build Coastguard Worker virtual const char* getUnsupportedMessage(); 93*38e8c45fSAndroid Build Coastguard Worker }; 94*38e8c45fSAndroid Build Coastguard Worker 95*38e8c45fSAndroid Build Coastguard Worker // Wrapper for the HIDL Power HAL v1.0. 96*38e8c45fSAndroid Build Coastguard Worker class HidlHalWrapperV1_0 : public EmptyHalWrapper { 97*38e8c45fSAndroid Build Coastguard Worker public: HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> handleV1_0)98*38e8c45fSAndroid Build Coastguard Worker explicit HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> handleV1_0) 99*38e8c45fSAndroid Build Coastguard Worker : mHandleV1_0(std::move(handleV1_0)) {} 100*38e8c45fSAndroid Build Coastguard Worker ~HidlHalWrapperV1_0() override = default; 101*38e8c45fSAndroid Build Coastguard Worker 102*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setBoost(aidl::android::hardware::power::Boost boost, 103*38e8c45fSAndroid Build Coastguard Worker int32_t durationMs) override; 104*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override; 105*38e8c45fSAndroid Build Coastguard Worker 106*38e8c45fSAndroid Build Coastguard Worker protected: 107*38e8c45fSAndroid Build Coastguard Worker const sp<hardware::power::V1_0::IPower> mHandleV1_0; 108*38e8c45fSAndroid Build Coastguard Worker virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data); 109*38e8c45fSAndroid Build Coastguard Worker const char* getUnsupportedMessage(); 110*38e8c45fSAndroid Build Coastguard Worker 111*38e8c45fSAndroid Build Coastguard Worker private: 112*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setInteractive(bool enabled); 113*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setFeature(hardware::power::V1_0::Feature feature, bool enabled); 114*38e8c45fSAndroid Build Coastguard Worker }; 115*38e8c45fSAndroid Build Coastguard Worker 116*38e8c45fSAndroid Build Coastguard Worker // Wrapper for the HIDL Power HAL v1.1. 117*38e8c45fSAndroid Build Coastguard Worker class HidlHalWrapperV1_1 : public HidlHalWrapperV1_0 { 118*38e8c45fSAndroid Build Coastguard Worker public: HidlHalWrapperV1_1(sp<hardware::power::V1_1::IPower> handleV1_1)119*38e8c45fSAndroid Build Coastguard Worker explicit HidlHalWrapperV1_1(sp<hardware::power::V1_1::IPower> handleV1_1) 120*38e8c45fSAndroid Build Coastguard Worker : HidlHalWrapperV1_0(std::move(handleV1_1)) {} 121*38e8c45fSAndroid Build Coastguard Worker ~HidlHalWrapperV1_1() override = default; 122*38e8c45fSAndroid Build Coastguard Worker 123*38e8c45fSAndroid Build Coastguard Worker protected: 124*38e8c45fSAndroid Build Coastguard Worker HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; 125*38e8c45fSAndroid Build Coastguard Worker }; 126*38e8c45fSAndroid Build Coastguard Worker 127*38e8c45fSAndroid Build Coastguard Worker // Wrapper for the HIDL Power HAL v1.2. 128*38e8c45fSAndroid Build Coastguard Worker class HidlHalWrapperV1_2 : public HidlHalWrapperV1_1 { 129*38e8c45fSAndroid Build Coastguard Worker public: 130*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setBoost(aidl::android::hardware::power::Boost boost, 131*38e8c45fSAndroid Build Coastguard Worker int32_t durationMs) override; 132*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override; HidlHalWrapperV1_2(sp<hardware::power::V1_2::IPower> handleV1_2)133*38e8c45fSAndroid Build Coastguard Worker explicit HidlHalWrapperV1_2(sp<hardware::power::V1_2::IPower> handleV1_2) 134*38e8c45fSAndroid Build Coastguard Worker : HidlHalWrapperV1_1(std::move(handleV1_2)) {} 135*38e8c45fSAndroid Build Coastguard Worker ~HidlHalWrapperV1_2() override = default; 136*38e8c45fSAndroid Build Coastguard Worker 137*38e8c45fSAndroid Build Coastguard Worker protected: 138*38e8c45fSAndroid Build Coastguard Worker HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; 139*38e8c45fSAndroid Build Coastguard Worker }; 140*38e8c45fSAndroid Build Coastguard Worker 141*38e8c45fSAndroid Build Coastguard Worker // Wrapper for the HIDL Power HAL v1.3. 142*38e8c45fSAndroid Build Coastguard Worker class HidlHalWrapperV1_3 : public HidlHalWrapperV1_2 { 143*38e8c45fSAndroid Build Coastguard Worker public: 144*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override; HidlHalWrapperV1_3(sp<hardware::power::V1_3::IPower> handleV1_3)145*38e8c45fSAndroid Build Coastguard Worker explicit HidlHalWrapperV1_3(sp<hardware::power::V1_3::IPower> handleV1_3) 146*38e8c45fSAndroid Build Coastguard Worker : HidlHalWrapperV1_2(std::move(handleV1_3)) {} 147*38e8c45fSAndroid Build Coastguard Worker ~HidlHalWrapperV1_3() override = default; 148*38e8c45fSAndroid Build Coastguard Worker 149*38e8c45fSAndroid Build Coastguard Worker protected: 150*38e8c45fSAndroid Build Coastguard Worker HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; 151*38e8c45fSAndroid Build Coastguard Worker }; 152*38e8c45fSAndroid Build Coastguard Worker 153*38e8c45fSAndroid Build Coastguard Worker // Wrapper for the AIDL Power HAL. 154*38e8c45fSAndroid Build Coastguard Worker class AidlHalWrapper : public EmptyHalWrapper { 155*38e8c45fSAndroid Build Coastguard Worker public: AidlHalWrapper(std::shared_ptr<aidl::android::hardware::power::IPower> handle)156*38e8c45fSAndroid Build Coastguard Worker explicit AidlHalWrapper(std::shared_ptr<aidl::android::hardware::power::IPower> handle) 157*38e8c45fSAndroid Build Coastguard Worker : mHandle(std::move(handle)) {} 158*38e8c45fSAndroid Build Coastguard Worker ~AidlHalWrapper() override = default; 159*38e8c45fSAndroid Build Coastguard Worker 160*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setBoost(aidl::android::hardware::power::Boost boost, 161*38e8c45fSAndroid Build Coastguard Worker int32_t durationMs) override; 162*38e8c45fSAndroid Build Coastguard Worker HalResult<void> setMode(aidl::android::hardware::power::Mode mode, bool enabled) override; 163*38e8c45fSAndroid Build Coastguard Worker HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSession( 164*38e8c45fSAndroid Build Coastguard Worker int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, 165*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos) override; 166*38e8c45fSAndroid Build Coastguard Worker HalResult<std::shared_ptr<PowerHintSessionWrapper>> createHintSessionWithConfig( 167*38e8c45fSAndroid Build Coastguard Worker int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos, 168*38e8c45fSAndroid Build Coastguard Worker aidl::android::hardware::power::SessionTag tag, 169*38e8c45fSAndroid Build Coastguard Worker aidl::android::hardware::power::SessionConfig* config) override; 170*38e8c45fSAndroid Build Coastguard Worker 171*38e8c45fSAndroid Build Coastguard Worker HalResult<int64_t> getHintSessionPreferredRate() override; 172*38e8c45fSAndroid Build Coastguard Worker HalResult<aidl::android::hardware::power::ChannelConfig> getSessionChannel(int tgid, 173*38e8c45fSAndroid Build Coastguard Worker int uid) override; 174*38e8c45fSAndroid Build Coastguard Worker HalResult<void> closeSessionChannel(int tgid, int uid) override; 175*38e8c45fSAndroid Build Coastguard Worker HalResult<aidl::android::hardware::power::SupportInfo> getSupportInfo() override; 176*38e8c45fSAndroid Build Coastguard Worker 177*38e8c45fSAndroid Build Coastguard Worker protected: 178*38e8c45fSAndroid Build Coastguard Worker const char* getUnsupportedMessage() override; 179*38e8c45fSAndroid Build Coastguard Worker 180*38e8c45fSAndroid Build Coastguard Worker private: 181*38e8c45fSAndroid Build Coastguard Worker // Control access to the boost and mode supported arrays. 182*38e8c45fSAndroid Build Coastguard Worker std::mutex mBoostMutex; 183*38e8c45fSAndroid Build Coastguard Worker std::mutex mModeMutex; 184*38e8c45fSAndroid Build Coastguard Worker std::shared_ptr<aidl::android::hardware::power::IPower> mHandle; 185*38e8c45fSAndroid Build Coastguard Worker std::array<HalSupport, 186*38e8c45fSAndroid Build Coastguard Worker static_cast<int32_t>( 187*38e8c45fSAndroid Build Coastguard Worker *(ndk::enum_range<aidl::android::hardware::power::Boost>().end() - 1)) + 188*38e8c45fSAndroid Build Coastguard Worker 1> 189*38e8c45fSAndroid Build Coastguard Worker mBoostSupportedArray GUARDED_BY(mBoostMutex) = {HalSupport::UNKNOWN}; 190*38e8c45fSAndroid Build Coastguard Worker std::array<HalSupport, 191*38e8c45fSAndroid Build Coastguard Worker static_cast<int32_t>( 192*38e8c45fSAndroid Build Coastguard Worker *(ndk::enum_range<aidl::android::hardware::power::Mode>().end() - 1)) + 193*38e8c45fSAndroid Build Coastguard Worker 1> 194*38e8c45fSAndroid Build Coastguard Worker mModeSupportedArray GUARDED_BY(mModeMutex) = {HalSupport::UNKNOWN}; 195*38e8c45fSAndroid Build Coastguard Worker }; 196*38e8c45fSAndroid Build Coastguard Worker 197*38e8c45fSAndroid Build Coastguard Worker }; // namespace power 198*38e8c45fSAndroid Build Coastguard Worker 199*38e8c45fSAndroid Build Coastguard Worker }; // namespace android 200