Home | History | Annotate | Download | only in fio
      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