blob: 2ee859a89923373c85f3a5ab44da96cb279fc19a [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2018 Cadence Design Systems, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to use this Software with Cadence processor cores only and
* not with any other processors and platforms, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************/
#ifndef __XF_H
#error "xf-ipc.h mustn't be included directly"
#endif
/*******************************************************************************
* Types definitions
******************************************************************************/
/* ...proxy IPC data */
typedef struct xf_proxy_ipc_data
{
/* ...shared memory buffer pointer */
void *shmem;
/* ...file descriptor */
int fd;
/* ...pipe for asynchronous response delivery */
int pipe[2];
} xf_proxy_ipc_data_t;
/*******************************************************************************
* Helpers for asynchronous response delivery
******************************************************************************/
#define xf_proxy_ipc_response_put(ipc, msg) \
(write((ipc)->pipe[1], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno)
#define xf_proxy_ipc_response_get(ipc, msg) \
(read((ipc)->pipe[0], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno)
/*******************************************************************************
* Shared memory translation
******************************************************************************/
/* ...translate proxy shared address into local virtual address */
static inline void * xf_ipc_a2b(xf_proxy_ipc_data_t *ipc, u32 address)
{
if (address < XF_CFG_REMOTE_IPC_POOL_SIZE)
return (unsigned char *) ipc->shmem + address;
else if (address == XF_PROXY_NULL)
return NULL;
else
return (void *) -1;
}
/* ...translate local virtual address into shared proxy address */
static inline u32 xf_ipc_b2a(xf_proxy_ipc_data_t *ipc, void *b)
{
u32 a;
if (b == NULL)
return XF_PROXY_NULL;
if ((a = (u32)((u8 *)b - (u8 *)ipc->shmem)) < XF_CFG_REMOTE_IPC_POOL_SIZE)
return a;
else
return XF_PROXY_BADADDR;
}
/*******************************************************************************
* Component inter-process communication
******************************************************************************/
typedef struct xf_ipc_data
{
/* ...asynchronous response delivery pipe */
int pipe[2];
} xf_ipc_data_t;
/*******************************************************************************
* Helpers for asynchronous response delivery
******************************************************************************/
#define xf_ipc_response_put(ipc, msg) \
(write((ipc)->pipe[1], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno)
#define xf_ipc_response_get(ipc, msg) \
(read((ipc)->pipe[0], (msg), sizeof(*(msg))) == sizeof(*(msg)) ? 0 : -errno)
#define xf_ipc_data_init(ipc) \
(pipe((ipc)->pipe) == 0 ? 0 : -errno)
#define xf_ipc_data_destroy(ipc) \
(close((ipc)->pipe[0]), close((ipc)->pipe[1]))
/*******************************************************************************
* API functions
******************************************************************************/
/* ...send asynchronous command */
extern int xf_ipc_send(xf_proxy_ipc_data_t *ipc, xf_proxy_msg_t *msg, void *b);
/* ...wait for response from remote proxy */
extern int xf_ipc_wait(xf_proxy_ipc_data_t *ipc, u32 timeout);
/* ...receive response from IPC layer */
extern int xf_ipc_recv(xf_proxy_ipc_data_t *ipc, xf_proxy_msg_t *msg, void **b);
/* ...open proxy interface on proper DSP partition */
extern int xf_ipc_open(xf_proxy_ipc_data_t *proxy, u32 core, void *p_shmem);
/* ...close proxy handle */
extern void xf_ipc_close(xf_proxy_ipc_data_t *proxy, u32 core);