1 /******************************************************************************* 2 * Copyright (C) 2018 Cadence Design Systems, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 * "Software"), to use this Software with Cadence processor cores only and 7 * not with any other processors and platforms, subject to 8 * the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included 11 * in all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 15 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 16 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 17 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 19 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21 ******************************************************************************/ 22 23 #ifndef __XF_H 24 #error "xf-ipc.h mustn't be included directly" 25 #endif 26 27 /******************************************************************************* 28 * Types definitions 29 ******************************************************************************/ 30 31 /* ...proxy IPC data */ 32 typedef struct xf_proxy_ipc_data 33 { 34 /* ...shared memory buffer pointer */ 35 void *shmem; 36 37 /* ...file descriptor */ 38 int fd; 39 40 /* ...pipe for asynchronous response delivery */ 41 int pipe[2]; 42 43 } xf_proxy_ipc_data_t; 44 45 /******************************************************************************* 46 * Helpers for asynchronous response delivery 47 ******************************************************************************/ 48 49 #define xf_proxy_ipc_response_put(ipc, msg) \ 50 (write((ipc)->pipe[1], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno) 51 52 #define xf_proxy_ipc_response_get(ipc, msg) \ 53 (read((ipc)->pipe[0], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno) 54 55 /******************************************************************************* 56 * Shared memory translation 57 ******************************************************************************/ 58 59 /* ...translate proxy shared address into local virtual address */ 60 static inline void * xf_ipc_a2b(xf_proxy_ipc_data_t *ipc, u32 address) 61 { 62 if (address < XF_CFG_REMOTE_IPC_POOL_SIZE) 63 return (unsigned char *) ipc->shmem + address; 64 else if (address == XF_PROXY_NULL) 65 return NULL; 66 else 67 return (void *) -1; 68 } 69 70 /* ...translate local virtual address into shared proxy address */ 71 static inline u32 xf_ipc_b2a(xf_proxy_ipc_data_t *ipc, void *b) 72 { 73 u32 a; 74 75 if (b == NULL) 76 return XF_PROXY_NULL; 77 if ((a = (u32)((u8 *)b - (u8 *)ipc->shmem)) < XF_CFG_REMOTE_IPC_POOL_SIZE) 78 return a; 79 else 80 return XF_PROXY_BADADDR; 81 } 82 83 /******************************************************************************* 84 * Component inter-process communication 85 ******************************************************************************/ 86 87 typedef struct xf_ipc_data 88 { 89 /* ...asynchronous response delivery pipe */ 90 int pipe[2]; 91 92 } xf_ipc_data_t; 93 94 /******************************************************************************* 95 * Helpers for asynchronous response delivery 96 ******************************************************************************/ 97 98 #define xf_ipc_response_put(ipc, msg) \ 99 (write((ipc)->pipe[1], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno) 100 101 #define xf_ipc_response_get(ipc, msg) \ 102 (read((ipc)->pipe[0], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno) 103 104 #define xf_ipc_data_init(ipc) \ 105 (pipe((ipc)->pipe) == 0 ? 0 : -errno) 106 107 #define xf_ipc_data_destroy(ipc) \ 108 (close((ipc)->pipe[0]), close((ipc)->pipe[1])) 109 110 /******************************************************************************* 111 * API functions 112 ******************************************************************************/ 113 114 /* ...send asynchronous command */ 115 extern int xf_ipc_send(xf_proxy_ipc_data_t *ipc, xf_proxy_msg_t *msg, void *b); 116 117 /* ...wait for response from remote proxy */ 118 extern int xf_ipc_wait(xf_proxy_ipc_data_t *ipc, u32 timeout); 119 120 /* ...receive response from IPC layer */ 121 extern int xf_ipc_recv(xf_proxy_ipc_data_t *ipc, xf_proxy_msg_t *msg, void **b); 122 123 /* ...open proxy interface on proper DSP partition */ 124 extern int xf_ipc_open(xf_proxy_ipc_data_t *proxy, u32 core, void *p_shmem); 125 126 /* ...close proxy handle */ 127 extern void xf_ipc_close(xf_proxy_ipc_data_t *proxy, u32 core); 128