1*84e33947SAndroid Build Coastguard Worker /* 2*84e33947SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*84e33947SAndroid Build Coastguard Worker * 4*84e33947SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*84e33947SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*84e33947SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*84e33947SAndroid Build Coastguard Worker * 8*84e33947SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*84e33947SAndroid Build Coastguard Worker * 10*84e33947SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*84e33947SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*84e33947SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*84e33947SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*84e33947SAndroid Build Coastguard Worker * limitations under the License. 15*84e33947SAndroid Build Coastguard Worker */ 16*84e33947SAndroid Build Coastguard Worker 17*84e33947SAndroid Build Coastguard Worker #ifndef CHRE_EXYNOS_DAEMON_H_ 18*84e33947SAndroid Build Coastguard Worker #define CHRE_EXYNOS_DAEMON_H_ 19*84e33947SAndroid Build Coastguard Worker 20*84e33947SAndroid Build Coastguard Worker #include <atomic> 21*84e33947SAndroid Build Coastguard Worker #include <thread> 22*84e33947SAndroid Build Coastguard Worker 23*84e33947SAndroid Build Coastguard Worker #include "chre_host/fbs_daemon_base.h" 24*84e33947SAndroid Build Coastguard Worker #include "chre_host/st_hal_lpma_handler.h" 25*84e33947SAndroid Build Coastguard Worker 26*84e33947SAndroid Build Coastguard Worker namespace android { 27*84e33947SAndroid Build Coastguard Worker namespace chre { 28*84e33947SAndroid Build Coastguard Worker 29*84e33947SAndroid Build Coastguard Worker class ExynosDaemon : public FbsDaemonBase { 30*84e33947SAndroid Build Coastguard Worker public: 31*84e33947SAndroid Build Coastguard Worker ExynosDaemon(); ~ExynosDaemon()32*84e33947SAndroid Build Coastguard Worker ~ExynosDaemon() { 33*84e33947SAndroid Build Coastguard Worker deinit(); 34*84e33947SAndroid Build Coastguard Worker } 35*84e33947SAndroid Build Coastguard Worker 36*84e33947SAndroid Build Coastguard Worker //! EXYNOS's shared memory size for CHRE <-> AP is 4KB. 37*84e33947SAndroid Build Coastguard Worker static constexpr size_t kIpcMsgSizeMax = 4096; 38*84e33947SAndroid Build Coastguard Worker 39*84e33947SAndroid Build Coastguard Worker /** 40*84e33947SAndroid Build Coastguard Worker * Initializes the CHRE daemon. 41*84e33947SAndroid Build Coastguard Worker * 42*84e33947SAndroid Build Coastguard Worker * @return true on successful init 43*84e33947SAndroid Build Coastguard Worker */ 44*84e33947SAndroid Build Coastguard Worker bool init(); 45*84e33947SAndroid Build Coastguard Worker 46*84e33947SAndroid Build Coastguard Worker /** 47*84e33947SAndroid Build Coastguard Worker * Starts a socket server receive loop for inbound messages. 48*84e33947SAndroid Build Coastguard Worker */ 49*84e33947SAndroid Build Coastguard Worker void run(); 50*84e33947SAndroid Build Coastguard Worker 51*84e33947SAndroid Build Coastguard Worker void processIncomingMsgs(); 52*84e33947SAndroid Build Coastguard Worker 53*84e33947SAndroid Build Coastguard Worker int64_t getTimeOffset(bool *success) override; 54*84e33947SAndroid Build Coastguard Worker 55*84e33947SAndroid Build Coastguard Worker protected: 56*84e33947SAndroid Build Coastguard Worker void loadPreloadedNanoapp(const std::string &directory, 57*84e33947SAndroid Build Coastguard Worker const std::string &name, 58*84e33947SAndroid Build Coastguard Worker uint32_t transactionId) override; 59*84e33947SAndroid Build Coastguard Worker void handleDaemonMessage(const uint8_t *message) override; 60*84e33947SAndroid Build Coastguard Worker bool doSendMessage(void *data, size_t length) override; 61*84e33947SAndroid Build Coastguard Worker configureLpma(bool enabled)62*84e33947SAndroid Build Coastguard Worker void configureLpma(bool enabled) override { 63*84e33947SAndroid Build Coastguard Worker mLpmaHandler.enable(enabled); 64*84e33947SAndroid Build Coastguard Worker } 65*84e33947SAndroid Build Coastguard Worker 66*84e33947SAndroid Build Coastguard Worker private: 67*84e33947SAndroid Build Coastguard Worker static constexpr char kCommsDeviceFilename[] = "/dev/nanohub_comms"; 68*84e33947SAndroid Build Coastguard Worker static constexpr int kInvalidFd = -1; 69*84e33947SAndroid Build Coastguard Worker 70*84e33947SAndroid Build Coastguard Worker int mCommsReadFd = kInvalidFd; 71*84e33947SAndroid Build Coastguard Worker int mCommsWriteFd = kInvalidFd; 72*84e33947SAndroid Build Coastguard Worker std::thread mIncomingMsgProcessThread; 73*84e33947SAndroid Build Coastguard Worker std::thread::native_handle_type mNativeThreadHandle; 74*84e33947SAndroid Build Coastguard Worker std::atomic<bool> mProcessThreadRunning = false; 75*84e33947SAndroid Build Coastguard Worker 76*84e33947SAndroid Build Coastguard Worker StHalLpmaHandler mLpmaHandler; 77*84e33947SAndroid Build Coastguard Worker 78*84e33947SAndroid Build Coastguard Worker //! Set to the expected transaction, fragment, app ID for loading a nanoapp. 79*84e33947SAndroid Build Coastguard Worker struct Transaction { 80*84e33947SAndroid Build Coastguard Worker uint32_t transactionId; 81*84e33947SAndroid Build Coastguard Worker uint32_t fragmentId; 82*84e33947SAndroid Build Coastguard Worker uint64_t nanoappId; 83*84e33947SAndroid Build Coastguard Worker }; 84*84e33947SAndroid Build Coastguard Worker Transaction mPreloadedNanoappPendingTransaction; 85*84e33947SAndroid Build Coastguard Worker 86*84e33947SAndroid Build Coastguard Worker //! The mutex used to guard state between the nanoapp messaging thread 87*84e33947SAndroid Build Coastguard Worker //! and loading preloaded nanoapps. 88*84e33947SAndroid Build Coastguard Worker std::mutex mPreloadedNanoappsMutex; 89*84e33947SAndroid Build Coastguard Worker 90*84e33947SAndroid Build Coastguard Worker //! The condition variable used to wait for a nanoapp to finish loading. 91*84e33947SAndroid Build Coastguard Worker std::condition_variable mPreloadedNanoappsCond; 92*84e33947SAndroid Build Coastguard Worker 93*84e33947SAndroid Build Coastguard Worker //! Set to true when a preloaded nanoapp is pending load. 94*84e33947SAndroid Build Coastguard Worker bool mPreloadedNanoappPending; 95*84e33947SAndroid Build Coastguard Worker 96*84e33947SAndroid Build Coastguard Worker /** 97*84e33947SAndroid Build Coastguard Worker * Perform a graceful shutdown of the daemon 98*84e33947SAndroid Build Coastguard Worker */ 99*84e33947SAndroid Build Coastguard Worker void deinit(); 100*84e33947SAndroid Build Coastguard Worker 101*84e33947SAndroid Build Coastguard Worker /** 102*84e33947SAndroid Build Coastguard Worker * Stops the inbound message processing thread (forcibly). 103*84e33947SAndroid Build Coastguard Worker * Since the message read mechanism uses blocking system calls (poll, read), 104*84e33947SAndroid Build Coastguard Worker * and since there's no timeout on the system calls (to avoid waking the AP 105*84e33947SAndroid Build Coastguard Worker * up to handle timeouts), we forcibly terminate the thread on a daemon 106*84e33947SAndroid Build Coastguard Worker * deinit. POSIX semantics are used since the C++20 threading interface does 107*84e33947SAndroid Build Coastguard Worker * not provide an API to accomplish this. 108*84e33947SAndroid Build Coastguard Worker */ 109*84e33947SAndroid Build Coastguard Worker void stopMsgProcessingThread(); 110*84e33947SAndroid Build Coastguard Worker 111*84e33947SAndroid Build Coastguard Worker /** 112*84e33947SAndroid Build Coastguard Worker * Sends a preloaded nanoapp to CHRE. 113*84e33947SAndroid Build Coastguard Worker * 114*84e33947SAndroid Build Coastguard Worker * @param header The nanoapp header binary blob. 115*84e33947SAndroid Build Coastguard Worker * @param nanoapp The nanoapp binary blob. 116*84e33947SAndroid Build Coastguard Worker * @param transactionId The transaction ID to use when loading the app. 117*84e33947SAndroid Build Coastguard Worker * @return true if successful, false otherwise. 118*84e33947SAndroid Build Coastguard Worker */ 119*84e33947SAndroid Build Coastguard Worker bool loadNanoapp(const std::vector<uint8_t> &header, 120*84e33947SAndroid Build Coastguard Worker const std::vector<uint8_t> &nanoapp, uint32_t transactionId); 121*84e33947SAndroid Build Coastguard Worker 122*84e33947SAndroid Build Coastguard Worker /** 123*84e33947SAndroid Build Coastguard Worker * Loads a nanoapp using fragments. 124*84e33947SAndroid Build Coastguard Worker * 125*84e33947SAndroid Build Coastguard Worker * @param appId The ID of the nanoapp to load. 126*84e33947SAndroid Build Coastguard Worker * @param appVersion The version of the nanoapp to load. 127*84e33947SAndroid Build Coastguard Worker * @param appFlags The flags specified by the nanoapp to be loaded. 128*84e33947SAndroid Build Coastguard Worker * @param appTargetApiVersion The version of the CHRE API that the app 129*84e33947SAndroid Build Coastguard Worker * targets. 130*84e33947SAndroid Build Coastguard Worker * @param appBinary The application binary code. 131*84e33947SAndroid Build Coastguard Worker * @param appSize The size of the appBinary. 132*84e33947SAndroid Build Coastguard Worker * @param transactionId The transaction ID to use when loading. 133*84e33947SAndroid Build Coastguard Worker * @return true if successful, false otherwise. 134*84e33947SAndroid Build Coastguard Worker */ 135*84e33947SAndroid Build Coastguard Worker bool sendFragmentedNanoappLoad(uint64_t appId, uint32_t appVersion, 136*84e33947SAndroid Build Coastguard Worker uint32_t appFlags, 137*84e33947SAndroid Build Coastguard Worker uint32_t appTargetApiVersion, 138*84e33947SAndroid Build Coastguard Worker const uint8_t *appBinary, size_t appSize, 139*84e33947SAndroid Build Coastguard Worker uint32_t transactionId); 140*84e33947SAndroid Build Coastguard Worker 141*84e33947SAndroid Build Coastguard Worker bool sendFragmentAndWaitOnResponse(uint32_t transactionId, 142*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder, 143*84e33947SAndroid Build Coastguard Worker uint32_t fragmentId, uint64_t appId); 144*84e33947SAndroid Build Coastguard Worker 145*84e33947SAndroid Build Coastguard Worker /** 146*84e33947SAndroid Build Coastguard Worker * Empty signal handler to handle SIGINT 147*84e33947SAndroid Build Coastguard Worker */ signalHandler(int)148*84e33947SAndroid Build Coastguard Worker static void signalHandler(int /*signal*/) {} 149*84e33947SAndroid Build Coastguard Worker }; 150*84e33947SAndroid Build Coastguard Worker 151*84e33947SAndroid Build Coastguard Worker } // namespace chre 152*84e33947SAndroid Build Coastguard Worker } // namespace android 153*84e33947SAndroid Build Coastguard Worker 154*84e33947SAndroid Build Coastguard Worker #endif // CHRE_EXYNOS_DAEMON_H_ 155