blob: 813bfb48d36c5b736a31270faa01fbfdd7a477f2 [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.
******************************************************************************/
/*******************************************************************************
* 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);