xref: /aosp_15_r20/frameworks/native/include/powermanager/PowerHalWrapper.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
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