xref: /aosp_15_r20/system/chre/host/msm/daemon/fastrpc_daemon.h (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2020 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 /**
18*84e33947SAndroid Build Coastguard Worker  * @file
19*84e33947SAndroid Build Coastguard Worker  * The daemon that hosts CHRE on a hexagon DSP via FastRPC. This is typically
20*84e33947SAndroid Build Coastguard Worker  * the SLPI but could be the ADSP or another DSP that supports FastRPC.
21*84e33947SAndroid Build Coastguard Worker  */
22*84e33947SAndroid Build Coastguard Worker 
23*84e33947SAndroid Build Coastguard Worker #ifndef CHRE_FASTRPC_DAEMON_H_
24*84e33947SAndroid Build Coastguard Worker #define CHRE_FASTRPC_DAEMON_H_
25*84e33947SAndroid Build Coastguard Worker 
26*84e33947SAndroid Build Coastguard Worker #include "chre/platform/slpi/fastrpc.h"
27*84e33947SAndroid Build Coastguard Worker #include "chre_host/fbs_daemon_base.h"
28*84e33947SAndroid Build Coastguard Worker #include "chre_host/st_hal_lpma_handler.h"
29*84e33947SAndroid Build Coastguard Worker 
30*84e33947SAndroid Build Coastguard Worker #include <utils/SystemClock.h>
31*84e33947SAndroid Build Coastguard Worker #include <atomic>
32*84e33947SAndroid Build Coastguard Worker #include <optional>
33*84e33947SAndroid Build Coastguard Worker #include <thread>
34*84e33947SAndroid Build Coastguard Worker 
35*84e33947SAndroid Build Coastguard Worker namespace android {
36*84e33947SAndroid Build Coastguard Worker namespace chre {
37*84e33947SAndroid Build Coastguard Worker 
38*84e33947SAndroid Build Coastguard Worker class FastRpcChreDaemon : public FbsDaemonBase {
39*84e33947SAndroid Build Coastguard Worker  public:
40*84e33947SAndroid Build Coastguard Worker   FastRpcChreDaemon();
41*84e33947SAndroid Build Coastguard Worker 
~FastRpcChreDaemon()42*84e33947SAndroid Build Coastguard Worker   ~FastRpcChreDaemon() {
43*84e33947SAndroid Build Coastguard Worker     deinit();
44*84e33947SAndroid Build Coastguard Worker   }
45*84e33947SAndroid Build Coastguard Worker 
46*84e33947SAndroid Build Coastguard Worker   /**
47*84e33947SAndroid Build Coastguard Worker    * Initializes and starts the monitoring and message handling threads,
48*84e33947SAndroid Build Coastguard Worker    * then proceeds to load any preloaded nanoapps. Also starts LPMA if
49*84e33947SAndroid Build Coastguard Worker    * it's enabled.
50*84e33947SAndroid Build Coastguard Worker    *
51*84e33947SAndroid Build Coastguard Worker    * @return true on successful init
52*84e33947SAndroid Build Coastguard Worker    */
53*84e33947SAndroid Build Coastguard Worker   bool init();
54*84e33947SAndroid Build Coastguard Worker 
55*84e33947SAndroid Build Coastguard Worker   /**
56*84e33947SAndroid Build Coastguard Worker    * Starts a socket server receive loop for inbound messages.
57*84e33947SAndroid Build Coastguard Worker    */
58*84e33947SAndroid Build Coastguard Worker   void run();
59*84e33947SAndroid Build Coastguard Worker 
60*84e33947SAndroid Build Coastguard Worker  protected:
61*84e33947SAndroid Build Coastguard Worker   bool doSendMessage(void *data, size_t length) override;
62*84e33947SAndroid Build Coastguard Worker 
configureLpma(bool enabled)63*84e33947SAndroid Build Coastguard Worker   void configureLpma(bool enabled) override {
64*84e33947SAndroid Build Coastguard Worker     mLpmaHandler.enable(enabled);
65*84e33947SAndroid Build Coastguard Worker   }
66*84e33947SAndroid Build Coastguard Worker 
67*84e33947SAndroid Build Coastguard Worker  private:
68*84e33947SAndroid Build Coastguard Worker   std::optional<std::thread> mMonitorThread;
69*84e33947SAndroid Build Coastguard Worker   std::optional<std::thread> mMsgToHostThread;
70*84e33947SAndroid Build Coastguard Worker   std::atomic_bool mCrashDetected = false;
71*84e33947SAndroid Build Coastguard Worker   StHalLpmaHandler mLpmaHandler;
72*84e33947SAndroid Build Coastguard Worker 
73*84e33947SAndroid Build Coastguard Worker   /**
74*84e33947SAndroid Build Coastguard Worker    * Shutsdown the daemon, stops all the worker threads created in init()
75*84e33947SAndroid Build Coastguard Worker    * Since this is to be invoked at exit, it's mostly best effort, and is
76*84e33947SAndroid Build Coastguard Worker    * invoked by the class destructor
77*84e33947SAndroid Build Coastguard Worker    */
78*84e33947SAndroid Build Coastguard Worker   void deinit();
79*84e33947SAndroid Build Coastguard Worker 
80*84e33947SAndroid Build Coastguard Worker   /**
81*84e33947SAndroid Build Coastguard Worker    * Platform specific getTimeOffset for the FastRPC daemon
82*84e33947SAndroid Build Coastguard Worker    *
83*84e33947SAndroid Build Coastguard Worker    * @return clock drift offset in nanoseconds
84*84e33947SAndroid Build Coastguard Worker    */
85*84e33947SAndroid Build Coastguard Worker   int64_t getTimeOffset(bool *success) override;
86*84e33947SAndroid Build Coastguard Worker 
87*84e33947SAndroid Build Coastguard Worker   /**
88*84e33947SAndroid Build Coastguard Worker    * Entry point for the thread that blocks in a FastRPC call to monitor for
89*84e33947SAndroid Build Coastguard Worker    * abnormal exit of CHRE or reboot of the DSP.
90*84e33947SAndroid Build Coastguard Worker    */
91*84e33947SAndroid Build Coastguard Worker   void monitorThreadEntry();
92*84e33947SAndroid Build Coastguard Worker 
93*84e33947SAndroid Build Coastguard Worker   /**
94*84e33947SAndroid Build Coastguard Worker    * Entry point for the thread that receives messages sent by CHRE.
95*84e33947SAndroid Build Coastguard Worker    */
96*84e33947SAndroid Build Coastguard Worker   void msgToHostThreadEntry();
97*84e33947SAndroid Build Coastguard Worker 
98*84e33947SAndroid Build Coastguard Worker   /**
99*84e33947SAndroid Build Coastguard Worker    * Handles the case where the remote end (SLPI, ADSP, etc) has crashed.
100*84e33947SAndroid Build Coastguard Worker    */
101*84e33947SAndroid Build Coastguard Worker   void onRemoteCrashDetected();
102*84e33947SAndroid Build Coastguard Worker };
103*84e33947SAndroid Build Coastguard Worker 
104*84e33947SAndroid Build Coastguard Worker }  // namespace chre
105*84e33947SAndroid Build Coastguard Worker }  // namespace android
106*84e33947SAndroid Build Coastguard Worker 
107*84e33947SAndroid Build Coastguard Worker #endif  // CHRE_FASTRPC_DAEMON_H_
108