diff options
Diffstat (limited to 'hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h')
-rw-r--r-- | hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h new file mode 100644 index 00000000..813bfb48 --- /dev/null +++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h @@ -0,0 +1,173 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ + +/******************************************************************************* + * xf-shmem.h + * + * Definitions for Xtensa SHMEM configuration + * + *******************************************************************************/ + +#ifndef __XF_H +#error "xf-shmem.h mustn't be included directly" +#endif + +/******************************************************************************* + * Memory structures + ******************************************************************************/ + +/* ...data managed by host CPU (remote) - in case of shunt it is a IPC layer */ +struct xf_proxy_host_data +{ + /* ...command queue */ + xf_proxy_message_t command[XF_PROXY_MESSAGE_QUEUE_LENGTH]; + + /* ...writing index into command queue */ + u32 cmd_write_idx; + + /* ...reading index for response queue */ + u32 rsp_read_idx; +#ifdef XAF_ENABLE_NON_HIKEY +} __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT))); +#else +}/* __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT)))*/; +#endif + +/* ...data managed by DSP (local) */ +struct xf_proxy_dsp_data +{ + /* ...response queue */ + xf_proxy_message_t response[XF_PROXY_MESSAGE_QUEUE_LENGTH]; + + /* ...writing index into response queue */ + u32 rsp_write_idx; + + /* ...reading index for command queue */ + u32 cmd_read_idx; +#ifdef XAF_ENABLE_NON_HIKEY +} __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT))); +#else +}/* __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT)))*/; +#endif +/* ...shared memory data */ +typedef struct xf_shmem_data +{ + /* ...outgoing data (maintained by host CPU (remote side)) */ +#ifdef XAF_ENABLE_NON_HIKEY + struct xf_proxy_host_data remote __xf_shmem__; + + /* ...ingoing data (maintained by DSP (local side)) */ + struct xf_proxy_dsp_data local __xf_shmem__; + + /* ...shared memory pool (page-aligned; why? we map memory to user-space) */ + u8 buffer[XF_CFG_REMOTE_IPC_POOL_SIZE] __attribute__((__aligned__(4096))); +#else + /* ...outgoing data (maintained by host CPU (remote side)) */ + struct xf_proxy_host_data remote/* __xf_shmem__*/; + + /* ...ingoing data (maintained by DSP (local side)) */ + struct xf_proxy_dsp_data local/* __xf_shmem__*/; + + /* ...shared memory pool (page-aligned; why? we map memory to user-space) */ + uint8_t* buffer; +#endif + +} xf_shmem_data_t; + +/******************************************************************************* + * Shared memory accessors + ******************************************************************************/ + +/* ...shared memory pointer for a core */ +#define XF_SHMEM_DATA(core) \ + ((xf_shmem_data_t *)XF_CORE_DATA(core)->shmem) + +/* ...atomic reading */ +#define XF_PROXY_READ_ATOMIC(var) \ + ({ XF_PROXY_INVALIDATE(&(var), sizeof(var)); (var); }) + +/* ...atomic writing */ +#define XF_PROXY_WRITE_ATOMIC(var, value) \ + ({(var) = (value); XF_PROXY_FLUSH(&(var), sizeof(var)); (value); }) + +/* ...accessors */ +#define XF_PROXY_READ(core, field) \ + __XF_PROXY_READ_##field(XF_SHMEM_DATA(core)) + +#define XF_PROXY_WRITE(core, field, v) \ + __XF_PROXY_WRITE_##field(XF_SHMEM_DATA(core), (v)) + +/* ...individual fields accessors */ +#define __XF_PROXY_READ_cmd_write_idx(proxy) \ + XF_PROXY_READ_ATOMIC(proxy->remote.cmd_write_idx) + +#define __XF_PROXY_READ_cmd_read_idx(proxy) \ + proxy->local.cmd_read_idx + +#define __XF_PROXY_READ_rsp_write_idx(proxy) \ + proxy->local.rsp_write_idx + +#define __XF_PROXY_READ_rsp_read_idx(proxy) \ + XF_PROXY_READ_ATOMIC(proxy->remote.rsp_read_idx) + +/* ...individual fields accessors */ +#define __XF_PROXY_WRITE_cmd_write_idx(proxy, v) \ + XF_PROXY_WRITE_ATOMIC(proxy->remote.cmd_write_idx, v) + +#define __XF_PROXY_WRITE_cmd_read_idx(proxy, v) \ + XF_PROXY_WRITE_ATOMIC(proxy->local.cmd_read_idx, v) + +#define __XF_PROXY_WRITE_rsp_read_idx(proxy, v) \ + XF_PROXY_WRITE_ATOMIC(proxy->remote.rsp_read_idx, v) + +#define __XF_PROXY_WRITE_rsp_write_idx(proxy, v) \ + XF_PROXY_WRITE_ATOMIC(proxy->local.rsp_write_idx, v) + +/* ...command buffer accessor */ +#define XF_PROXY_COMMAND(core, idx) \ + (&XF_SHMEM_DATA((core))->remote.command[(idx)]) + +/* ...response buffer accessor */ +#define XF_PROXY_RESPONSE(core, idx) \ + (&XF_SHMEM_DATA((core))->local.response[(idx)]) + +/******************************************************************************* + * Platform-specific SHMEM enable status + ******************************************************************************/ + +static inline int xf_shmem_enabled(u32 core) +{ + return (core == 0); +} + +/******************************************************************************* + * API functions + ******************************************************************************/ + +/* ...process shared memory interface on given DSP core */ +extern void xf_shmem_process_queues(u32 core); + +/* ...completion callback for message originating from remote proxy */ +extern void xf_msg_proxy_complete(xf_message_t *m); + +/* ...initialize shared memory interface (DSP side) */ +extern int xf_shmem_init(u32 core); |