xref: /aosp_15_r20/system/chre/host/exynos/exynos_daemon.h (revision 84e339476a462649f82315436d70fd732297a399)
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