adsprpc_socket.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #include <linux/uaccess.h>
  6. #include <linux/qrtr.h>
  7. #include <linux/mutex.h>
  8. #include <net/sock.h>
  9. #include "fastrpc_trace.h"
  10. #include "adsprpc_shared.h"
  11. // Registered QRTR service ID
  12. #define FASTRPC_REMOTE_SERVER_SERVICE_ID 5012
  13. // Number of remote domains
  14. #define REMOTE_DOMAINS (2)
  15. /*
  16. * Fastrpc remote server instance ID bit-map:
  17. *
  18. * bits 0-1 : channel ID
  19. * bits 2-7 : reserved
  20. * bits 8-9 : remote domains (SECURE_PD, GUEST_OS)
  21. * bits 10-31 : reserved
  22. */
  23. #define REMOTE_DOMAIN_INSTANCE_INDEX (8)
  24. #define GET_SERVER_INSTANCE(remote_domain, cid) \
  25. ((remote_domain << REMOTE_DOMAIN_INSTANCE_INDEX) | cid)
  26. #define GET_CID_FROM_SERVER_INSTANCE(remote_server_instance) \
  27. (remote_server_instance & 0x3)
  28. // Maximun received fastprc packet size
  29. #define FASTRPC_SOCKET_RECV_SIZE sizeof(union rsp)
  30. union rsp {
  31. struct smq_invoke_rsp rsp;
  32. struct smq_invoke_rspv2 rsp2;
  33. struct smq_notif_rspv3 rsp3;
  34. };
  35. enum fastrpc_remote_domains_id {
  36. SECURE_PD = 0,
  37. GUEST_OS = 1,
  38. };
  39. struct fastrpc_socket {
  40. struct socket *sock; // Socket used to communicate with remote domain
  41. struct sockaddr_qrtr local_sock_addr; // Local socket address on kernel side
  42. struct sockaddr_qrtr remote_sock_addr; // Remote socket address on remote domain side
  43. struct mutex socket_mutex; // Mutex for socket synchronization
  44. void *recv_buf; // Received packet buffer
  45. };
  46. struct frpc_transport_session_control {
  47. struct fastrpc_socket frpc_socket; // Fastrpc socket data structure
  48. uint32_t remote_server_instance; // Unique remote server instance ID
  49. bool remote_domain_available; // Flag to indicate if remote domain is enabled
  50. bool remote_server_online; // Flag to indicate remote server status
  51. };
  52. /**
  53. * glist_session_ctrl
  54. * Static list containing socket session information for all remote domains.
  55. * Update session flag remote_domain_available whenever a remote domain will be using
  56. * kernel sockets.
  57. */
  58. static struct frpc_transport_session_control glist_session_ctrl[NUM_CHANNELS][REMOTE_DOMAINS] = {
  59. [CDSP_DOMAIN_ID][SECURE_PD].remote_domain_available = true
  60. };
  61. /**
  62. * verify_transport_device()
  63. * @cid: Channel ID.
  64. * @trusted_vm: Flag to indicate whether session is for secure PD or guest OS.
  65. *
  66. * Obtain remote session information given channel ID and trusted_vm
  67. * and verify that socket has been created and remote server is up.
  68. *
  69. * Return: 0 on success or negative errno value on failure.
  70. */
  71. inline int verify_transport_device(int cid, bool trusted_vm)
  72. {
  73. int remote_domain, err = 0;
  74. struct frpc_transport_session_control *session_control = NULL;
  75. remote_domain = (trusted_vm) ? SECURE_PD : GUEST_OS;
  76. VERIFY(err, remote_domain < REMOTE_DOMAINS);
  77. if (err) {
  78. err = -ECHRNG;
  79. goto bail;
  80. }
  81. session_control = &glist_session_ctrl[cid][remote_domain];
  82. VERIFY(err, session_control->remote_domain_available);
  83. if (err) {
  84. err = -ECHRNG;
  85. goto bail;
  86. }
  87. mutex_lock(&session_control->frpc_socket.socket_mutex);
  88. VERIFY(err, session_control->frpc_socket.sock);
  89. VERIFY(err, session_control->remote_server_online);
  90. if (err) {
  91. err = -EPIPE;
  92. mutex_unlock(&session_control->frpc_socket.socket_mutex);
  93. goto bail;
  94. }
  95. mutex_unlock(&session_control->frpc_socket.socket_mutex);
  96. bail:
  97. return err;
  98. }
  99. static void fastrpc_recv_new_server(struct frpc_transport_session_control *session_control,
  100. unsigned int service, unsigned int instance,
  101. unsigned int node, unsigned int port)
  102. {
  103. uint32_t remote_server_instance = session_control->remote_server_instance;
  104. /* Ignore EOF marker */
  105. if (!node && !port)
  106. return;
  107. if (service != FASTRPC_REMOTE_SERVER_SERVICE_ID ||
  108. instance != remote_server_instance)
  109. return;
  110. mutex_lock(&session_control->frpc_socket.socket_mutex);
  111. session_control->frpc_socket.remote_sock_addr.sq_family = AF_QIPCRTR;
  112. session_control->frpc_socket.remote_sock_addr.sq_node = node;
  113. session_control->frpc_socket.remote_sock_addr.sq_port = port;
  114. session_control->remote_server_online = true;
  115. mutex_unlock(&session_control->frpc_socket.socket_mutex);
  116. ADSPRPC_INFO("Remote server is up: remote ID (0x%x)", remote_server_instance);
  117. }
  118. static void fastrpc_recv_del_server(struct frpc_transport_session_control *session_control,
  119. unsigned int node, unsigned int port)
  120. {
  121. uint32_t remote_server_instance = session_control->remote_server_instance;
  122. /* Ignore EOF marker */
  123. if (!node && !port)
  124. return;
  125. if (node != session_control->frpc_socket.remote_sock_addr.sq_node ||
  126. port != session_control->frpc_socket.remote_sock_addr.sq_port)
  127. return;
  128. mutex_lock(&session_control->frpc_socket.socket_mutex);
  129. session_control->frpc_socket.remote_sock_addr.sq_node = 0;
  130. session_control->frpc_socket.remote_sock_addr.sq_port = 0;
  131. session_control->remote_server_online = false;
  132. mutex_unlock(&session_control->frpc_socket.socket_mutex);
  133. ADSPRPC_WARN("Remote server is down: remote ID (0x%x)", remote_server_instance);
  134. }
  135. /**
  136. * fastrpc_recv_ctrl_pkt()
  137. * @session_control: Data structure that contains information related to socket and
  138. * remote server availability.
  139. * @buf: Control packet.
  140. * @len: Control packet length.
  141. *
  142. * Handle control packet status notifications from remote domain.
  143. */
  144. static void fastrpc_recv_ctrl_pkt(struct frpc_transport_session_control *session_control,
  145. const void *buf, size_t len)
  146. {
  147. const struct qrtr_ctrl_pkt *pkt = buf;
  148. if (len < sizeof(struct qrtr_ctrl_pkt)) {
  149. ADSPRPC_WARN("Ignoring short control packet (%d bytes)", len);
  150. return;
  151. }
  152. switch (le32_to_cpu(pkt->cmd)) {
  153. case QRTR_TYPE_NEW_SERVER:
  154. fastrpc_recv_new_server(session_control,
  155. le32_to_cpu(pkt->server.service),
  156. le32_to_cpu(pkt->server.instance),
  157. le32_to_cpu(pkt->server.node),
  158. le32_to_cpu(pkt->server.port));
  159. break;
  160. case QRTR_TYPE_DEL_SERVER:
  161. fastrpc_recv_del_server(session_control,
  162. le32_to_cpu(pkt->server.node),
  163. le32_to_cpu(pkt->server.port));
  164. break;
  165. }
  166. }
  167. /**
  168. * fastrpc_socket_callback()
  169. * @sk: Sock data structure with information related to the callback response.
  170. *
  171. * Callback function to receive responses from socket layer.
  172. * We expect to receive control packets with remote domain status notifications or
  173. * RPC data packets from remote domain.
  174. */
  175. static void fastrpc_socket_callback(struct sock *sk)
  176. {
  177. int err = 0, cid = 0;
  178. struct kvec msg = {0};
  179. struct sockaddr_qrtr remote_sock_addr = {0};
  180. struct msghdr remote_server = {0};
  181. struct frpc_transport_session_control *session_control = NULL;
  182. remote_server.msg_name = &remote_sock_addr;
  183. remote_server.msg_namelen = sizeof(remote_sock_addr);
  184. trace_fastrpc_msg("socket_callback: begin");
  185. VERIFY(err, sk);
  186. if (err) {
  187. err = -EFAULT;
  188. goto bail;
  189. }
  190. rcu_read_lock();
  191. session_control = rcu_dereference_sk_user_data(sk);
  192. rcu_read_unlock();
  193. VERIFY(err, session_control);
  194. if (err) {
  195. err = -EFAULT;
  196. goto bail;
  197. }
  198. msg.iov_base = session_control->frpc_socket.recv_buf;
  199. msg.iov_len = FASTRPC_SOCKET_RECV_SIZE;
  200. err = kernel_recvmsg(session_control->frpc_socket.sock, &remote_server, &msg, 1,
  201. msg.iov_len, MSG_DONTWAIT);
  202. if (err < 0)
  203. goto bail;
  204. if (remote_sock_addr.sq_node == session_control->frpc_socket.local_sock_addr.sq_node &&
  205. remote_sock_addr.sq_port == QRTR_PORT_CTRL) {
  206. fastrpc_recv_ctrl_pkt(session_control, session_control->frpc_socket.recv_buf,
  207. FASTRPC_SOCKET_RECV_SIZE);
  208. } else {
  209. cid = GET_CID_FROM_SERVER_INSTANCE(session_control->remote_server_instance);
  210. VERIFY(err, VALID_FASTRPC_CID(cid));
  211. if (err) {
  212. err = -ECHRNG;
  213. goto bail;
  214. }
  215. fastrpc_handle_rpc_response(msg.iov_base, msg.iov_len, cid);
  216. }
  217. bail:
  218. if (err < 0) {
  219. ADSPRPC_ERR(
  220. "invalid response data %pK, len %d from remote ID (0x%x) err %d\n",
  221. msg.iov_base, msg.iov_len, session_control->remote_server_instance, err);
  222. }
  223. trace_fastrpc_msg("socket_callback: end");
  224. }
  225. /**
  226. * fastrpc_transport_send()
  227. * @cid: Channel ID.
  228. * @rpc_msg: RPC message to send to remote domain.
  229. * @rpc_msg_size: RPC message size.
  230. * @trusted_vm: Flag to indicate whether to send message to secure PD or guest OS.
  231. *
  232. * Send RPC message to remote domain. Depending on trusted_vm flag message will be
  233. * sent to secure PD or guest OS on remote subsystem.
  234. * Depending on the channel ID and remote domain, a corresponding socket is retrieved
  235. * from glist_session_ctrl and is use to send RPC message.
  236. *
  237. * Return: 0 on success or negative errno value on failure.
  238. */
  239. int fastrpc_transport_send(int cid, void *rpc_msg, uint32_t rpc_msg_size, bool trusted_vm)
  240. {
  241. int err = 0, remote_domain;
  242. struct fastrpc_socket *frpc_socket = NULL;
  243. struct frpc_transport_session_control *session_control = NULL;
  244. struct msghdr remote_server = {0};
  245. struct kvec msg = {0};
  246. remote_domain = (trusted_vm) ? SECURE_PD : GUEST_OS;
  247. VERIFY(err, remote_domain < REMOTE_DOMAINS);
  248. if (err) {
  249. err = -ECHRNG;
  250. goto bail;
  251. }
  252. session_control = &glist_session_ctrl[cid][remote_domain];
  253. VERIFY(err, session_control->remote_domain_available);
  254. if (err) {
  255. err = -ECHRNG;
  256. goto bail;
  257. }
  258. frpc_socket = &session_control->frpc_socket;
  259. remote_server.msg_name = &frpc_socket->remote_sock_addr;
  260. remote_server.msg_namelen = sizeof(frpc_socket->remote_sock_addr);
  261. msg.iov_base = rpc_msg;
  262. msg.iov_len = rpc_msg_size;
  263. mutex_lock(&frpc_socket->socket_mutex);
  264. VERIFY(err, frpc_socket->sock);
  265. VERIFY(err, session_control->remote_server_online);
  266. if (err) {
  267. err = -EPIPE;
  268. mutex_unlock(&frpc_socket->socket_mutex);
  269. goto bail;
  270. }
  271. err = kernel_sendmsg(frpc_socket->sock, &remote_server, &msg, 1, msg.iov_len);
  272. mutex_unlock(&frpc_socket->socket_mutex);
  273. bail:
  274. return err;
  275. }
  276. /**
  277. * create_socket()
  278. * @session_control: Data structure that contains information related to socket and
  279. * remote server availability.
  280. *
  281. * Initializes and creates a kernel socket.
  282. *
  283. * Return: pointer to a socket on success or negative errno value on failure.
  284. */
  285. static struct socket *create_socket(struct frpc_transport_session_control *session_control)
  286. {
  287. int err = 0;
  288. struct socket *sock = NULL;
  289. struct fastrpc_socket *frpc_socket = NULL;
  290. err = sock_create_kern(&init_net, AF_QIPCRTR, SOCK_DGRAM,
  291. PF_QIPCRTR, &sock);
  292. if (err < 0) {
  293. ADSPRPC_ERR("sock_create_kern failed with err %d\n", err);
  294. goto bail;
  295. }
  296. frpc_socket = &session_control->frpc_socket;
  297. err = kernel_getsockname(sock, (struct sockaddr *)&frpc_socket->local_sock_addr);
  298. if (err < 0) {
  299. sock_release(sock);
  300. ADSPRPC_ERR("kernel_getsockname failed with err %d\n", err);
  301. goto bail;
  302. }
  303. rcu_assign_sk_user_data(sock->sk, session_control);
  304. sock->sk->sk_data_ready = fastrpc_socket_callback;
  305. sock->sk->sk_error_report = fastrpc_socket_callback;
  306. bail:
  307. if (err < 0)
  308. return ERR_PTR(err);
  309. else
  310. return sock;
  311. }
  312. /**
  313. * register_remote_server_notifications()
  314. * @frpc_socket: Socket to send message to register for remote service notifications.
  315. * @remote_server_instance: ID to uniquely identify remote server
  316. *
  317. * Register socket to receive status notifications from remote service
  318. * using remote service ID FASTRPC_REMOTE_SERVER_SERVICE_ID and instance ID.
  319. *
  320. * Return: 0 on success or negative errno value on failure.
  321. */
  322. static int register_remote_server_notifications(struct fastrpc_socket *frpc_socket,
  323. uint32_t remote_server_instance)
  324. {
  325. struct qrtr_ctrl_pkt pkt = {0};
  326. struct sockaddr_qrtr sq = {0};
  327. struct msghdr remote_server = {0};
  328. struct kvec msg = { &pkt, sizeof(pkt) };
  329. int err = 0;
  330. memset(&pkt, 0, sizeof(pkt));
  331. pkt.cmd = cpu_to_le32(QRTR_TYPE_NEW_LOOKUP);
  332. pkt.server.service = cpu_to_le32(FASTRPC_REMOTE_SERVER_SERVICE_ID);
  333. pkt.server.instance = cpu_to_le32(remote_server_instance);
  334. sq.sq_family = frpc_socket->local_sock_addr.sq_family;
  335. sq.sq_node = frpc_socket->local_sock_addr.sq_node;
  336. sq.sq_port = QRTR_PORT_CTRL;
  337. remote_server.msg_name = &sq;
  338. remote_server.msg_namelen = sizeof(sq);
  339. err = kernel_sendmsg(frpc_socket->sock, &remote_server, &msg, 1, sizeof(pkt));
  340. if (err < 0)
  341. goto bail;
  342. bail:
  343. if (err < 0)
  344. ADSPRPC_ERR("failed to send lookup registration: %d\n", err);
  345. return err;
  346. }
  347. inline void fastrpc_transport_session_init(int cid, char *subsys)
  348. {
  349. }
  350. inline void fastrpc_transport_session_deinit(int cid)
  351. {
  352. }
  353. int fastrpc_wait_for_transport_interrupt(int cid, unsigned int flags)
  354. {
  355. return 0;
  356. }
  357. void fastrpc_rproc_trace_events(const char *name, const char *event,
  358. const char *subevent)
  359. {
  360. }
  361. /**
  362. * fastrpc_transport_init() - Initialize sockets for fastrpc driver.
  363. *
  364. * Initialize and create all sockets that are enabled from all channels
  365. * and remote domains.
  366. * Traverse array glist_session_ctrl and initialize session if remote
  367. * domain is enabled.
  368. *
  369. * Return: 0 on success or negative errno value on failure.
  370. */
  371. int fastrpc_transport_init(void)
  372. {
  373. int err = 0, cid = 0, ii = 0;
  374. struct socket *sock = NULL;
  375. struct fastrpc_socket *frpc_socket = NULL;
  376. struct frpc_transport_session_control *session_control = NULL;
  377. for (cid = 0; cid < NUM_CHANNELS; cid++) {
  378. for (ii = 0; ii < REMOTE_DOMAINS; ii++) {
  379. session_control = &glist_session_ctrl[cid][ii];
  380. if (!session_control->remote_domain_available)
  381. continue;
  382. session_control->remote_server_online = false;
  383. frpc_socket = &session_control->frpc_socket;
  384. mutex_init(&frpc_socket->socket_mutex);
  385. sock = create_socket(session_control);
  386. if (IS_ERR_OR_NULL(sock)) {
  387. err = PTR_ERR(sock);
  388. goto bail;
  389. }
  390. frpc_socket->sock = sock;
  391. frpc_socket->recv_buf = kzalloc(FASTRPC_SOCKET_RECV_SIZE, GFP_KERNEL);
  392. if (!frpc_socket->recv_buf) {
  393. err = -ENOMEM;
  394. goto bail;
  395. }
  396. session_control->remote_server_instance = GET_SERVER_INSTANCE(ii, cid);
  397. err = register_remote_server_notifications(frpc_socket,
  398. session_control->remote_server_instance);
  399. if (err < 0)
  400. goto bail;
  401. }
  402. }
  403. err = 0;
  404. bail:
  405. if (err)
  406. ADSPRPC_ERR("fastrpc_socket_init failed with err %d\n", err);
  407. return err;
  408. }
  409. /**
  410. * fastrpc_transport_deinit() - Deinitialize sockets for fastrpc driver.
  411. *
  412. * Deinitialize and release all sockets that are enabled from all channels
  413. * and remote domains.
  414. * Traverse array glist_session_ctrl and deinitialize session if remote
  415. * domain is enabled.
  416. */
  417. void fastrpc_transport_deinit(void)
  418. {
  419. int ii = 0;
  420. struct fastrpc_socket *frpc_socket = NULL;
  421. struct frpc_transport_session_control *session_control = NULL;
  422. int cid = -1;
  423. for (cid = 0; cid < NUM_CHANNELS; cid++) {
  424. for (ii = 0; ii < REMOTE_DOMAINS; ii++) {
  425. session_control = &glist_session_ctrl[cid][ii];
  426. frpc_socket = &session_control->frpc_socket;
  427. if (!session_control->remote_domain_available)
  428. continue;
  429. if (frpc_socket->sock)
  430. sock_release(frpc_socket->sock);
  431. kfree(frpc_socket->recv_buf);
  432. frpc_socket->recv_buf = NULL;
  433. frpc_socket->sock = NULL;
  434. mutex_destroy(&frpc_socket->socket_mutex);
  435. }
  436. }
  437. }