/* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include using namespace aidl::android::hardware::power; namespace android::power { // Caches support for a given call in a static variable, checking both // the return value and interface version. #define CACHE_SUPPORT(version, method) \ ({ \ static bool support = mInterfaceVersion >= version; \ !support ? decltype(method)::unsupported() : ({ \ auto result = method; \ if (result.isUnsupported()) { \ support = false; \ } \ std::move(result); \ }); \ }) #define CHECK_SESSION(resultType) \ if (mSession == nullptr) { \ return HalResult::failed("Session not running"); \ } // FWD_CALL just forwards calls from the wrapper to the session object. // It only works if the call has no return object, as is the case with all calls // except getSessionConfig. #define FWD_CALL(version, name, args, untypedArgs) \ HalResult PowerHintSessionWrapper::name args { \ CHECK_SESSION(void) \ return CACHE_SUPPORT(version, HalResult::fromStatus(mSession->name untypedArgs)); \ } PowerHintSessionWrapper::PowerHintSessionWrapper(std::shared_ptr&& session) : mSession(session) { if (mSession != nullptr) { mSession->getInterfaceVersion(&mInterfaceVersion); } } // Support for individual hints/modes is not really handled here since there // is no way to check for it, so in the future if a way to check that is added, // this will need to be updated. FWD_CALL(2, updateTargetWorkDuration, (int64_t in_targetDurationNanos), (in_targetDurationNanos)); FWD_CALL(2, reportActualWorkDuration, (const std::vector& in_durations), (in_durations)); FWD_CALL(2, pause, (), ()); FWD_CALL(2, resume, (), ()); FWD_CALL(2, close, (), ()); FWD_CALL(4, sendHint, (SessionHint in_hint), (in_hint)); FWD_CALL(4, setThreads, (const std::vector& in_threadIds), (in_threadIds)); FWD_CALL(5, setMode, (SessionMode in_type, bool in_enabled), (in_type, in_enabled)); HalResult PowerHintSessionWrapper::getSessionConfig() { CHECK_SESSION(SessionConfig); SessionConfig config; return CACHE_SUPPORT(5, HalResult::fromStatus(mSession->getSessionConfig(&config), std::move(config))); } } // namespace android::power