summaryrefslogtreecommitdiff
path: root/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h
diff options
context:
space:
mode:
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.h173
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);