blob: 6fa084654518fc4f2f0e0315bef604e73d56d98f [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-opcode.h
*
* Xtensa audio processing framework. Message API
*
******************************************************************************/
#ifndef __XF_H
#error "xf-opcode.h mustn't be included directly"
#endif
/*******************************************************************************
* Message routing composition - move somewhere else - tbd
******************************************************************************/
/* ...adjust IPC client of message going from user-space */
#define XF_MSG_AP_FROM_USER(id, client) \
(((id) & ~(0xF << 2)) | (client))
/* ...wipe out IPC client from message going to user-space */
#define XF_MSG_AP_TO_USER(id) \
((id) & ~(0xF << 18))
/* ...port specification (12 bits) */
#define __XF_PORT_SPEC(core, id, port) ((core) | ((id) << 2) | ((port) << 8))
#define __XF_PORT_SPEC2(id, port) ((id) | ((port) << 8))
#define XF_PORT_CORE(spec) ((spec) & 0x3)
#define XF_PORT_CLIENT(spec) (((spec) >> 2) & 0x3F)
#define XF_PORT_ID(spec) (((spec) >> 8) & 0xF)
/* ...message id contains source and destination ports specification */
#define __XF_MSG_ID(src, dst) (((src) & 0xFFFF) | (((dst) & 0xFFFF) << 16))
#define XF_MSG_SRC(id) (((id) >> 0) & 0xFFFF)
#define XF_MSG_SRC_CORE(id) (((id) >> 0) & 0x3)
#define XF_MSG_SRC_CLIENT(id) (((id) >> 2) & 0x3F)
#define XF_MSG_SRC_ID(id) (((id) >> 0) & 0xFF)
#define XF_MSG_SRC_PORT(id) (((id) >> 8) & 0xF)
#define XF_MSG_SRC_PROXY(id) (((id) >> 15) & 0x1)
#define XF_MSG_DST(id) (((id) >> 16) & 0xFFFF)
#define XF_MSG_DST_CORE(id) (((id) >> 16) & 0x3)
#define XF_MSG_DST_CLIENT(id) (((id) >> 18) & 0x3F)
#define XF_MSG_DST_ID(id) (((id) >> 16) & 0xFF)
#define XF_MSG_DST_PORT(id) (((id) >> 24) & 0xF)
#define XF_MSG_DST_PROXY(id) (((id) >> 31) & 0x1)
/* ...special treatment of AP-proxy destination field */
#define XF_AP_IPC_CLIENT(id) (((id) >> 18) & 0xF)
#define XF_AP_CLIENT(id) (((id) >> 22) & 0x1FF)
#define __XF_AP_PROXY(core) ((core) | 0x8000)
#define __XF_DSP_PROXY(core) ((core) | 0x8000)
#define __XF_AP_CLIENT(core, client) ((core) | ((client) << 6) | 0x8000)
/* ...check if DSP message is shared between cores */
#define XF_MSG_SHARED(id) \
({ u32 __id = (id); (XF_CFG_CORES_NUM > 1 ? (__id ^ (__id >> 16)) & 0x3 : 0); })
/*******************************************************************************
* Opcode composition
******************************************************************************/
/* ...opcode composition with command/response data tags */
#define __XF_OPCODE(c, r, op) (((c) << 31) | ((r) << 30) | ((op) & 0x3F))
/* ...accessors */
#define XF_OPCODE_CDATA(opcode) ((opcode) & (1 << 31))
#define XF_OPCODE_RDATA(opcode) ((opcode) & (1 << 30))
#define XF_OPCODE_TYPE(opcode) ((opcode) & (0x3F))
/*******************************************************************************
* Opcode types
******************************************************************************/
/* ...unregister client */
#define XF_UNREGISTER __XF_OPCODE(0, 0, 0)
/* ...register client at proxy */
#define XF_REGISTER __XF_OPCODE(1, 0, 1)
/* ...port routing command */
#define XF_ROUTE __XF_OPCODE(1, 0, 2)
/* ...port unrouting command */
#define XF_UNROUTE __XF_OPCODE(1, 0, 3)
/* ...shared buffer allocation */
#define XF_ALLOC __XF_OPCODE(0, 0, 4)
/* ...shared buffer freeing */
#define XF_FREE __XF_OPCODE(0, 0, 5)
/* ...set component parameters */
#define XF_SET_PARAM __XF_OPCODE(1, 0, 6)
/* ...get component parameters */
#define XF_GET_PARAM __XF_OPCODE(1, 1, 7)
/* ...input buffer reception */
#define XF_EMPTY_THIS_BUFFER __XF_OPCODE(1, 0, 8)
/* ...output buffer reception */
#define XF_FILL_THIS_BUFFER __XF_OPCODE(0, 1, 9)
/* ...flush specific port */
#define XF_FLUSH __XF_OPCODE(0, 0, 10)
/* ...start component operation */
#define XF_START __XF_OPCODE(0, 0, 11)
/* ...stop component operation */
#define XF_STOP __XF_OPCODE(0, 0, 12)
/* ...pause component operation */
#define XF_PAUSE __XF_OPCODE(0, 0, 13)
/* ...resume component operation */
#define XF_RESUME __XF_OPCODE(0, 0, 14)
/* ...extended parameter setting function */
#define XF_SET_PARAM_EXT __XF_OPCODE(1, 1, 15)
/* ...extended parameter retrieval function */
#define XF_GET_PARAM_EXT __XF_OPCODE(1, 1, 16)
/* ...total amount of supported decoder commands */
#define __XF_OP_NUM 17
/*******************************************************************************
* XF_START message definition
******************************************************************************/
typedef struct xf_start_msg
{
/* ...effective sample rate */
u32 sample_rate;
/* ...number of channels */
u32 channels;
/* ...sample width */
u32 pcm_width;
/* ...minimal size of intput buffer */
u32 input_length;
/* ...size of output buffer */
u32 output_length;
} __attribute__((__packed__)) xf_start_msg_t;
/*******************************************************************************
* XF_GET_PARAM message
******************************************************************************/
/* ...message body (command/response) */
typedef union xf_get_param_msg
{
/* ...command structure */
struct
{
/* ...array of parameters requested */
u32 id[0];
} __attribute__((__packed__)) c;
/* ...response structure */
struct
{
/* ...array of parameters values */
u32 value[0];
} __attribute__((__packed__)) r;
} xf_get_param_msg_t;
/* ...length of the XF_GET_PARAM command/response */
#define XF_GET_PARAM_CMD_LEN(params) (sizeof(u32) * (params))
#define XF_GET_PARAM_RSP_LEN(params) (sizeof(u32) * (params))
/*******************************************************************************
* XF_SET_PARAM message
******************************************************************************/
/* ...component initialization parameter */
typedef struct xf_set_param_item
{
/* ...index of parameter passed to SET_CONFIG_PARAM call */
u32 id;
/* ...value of parameter */
u32 value;
} __attribute__ ((__packed__)) xf_set_param_item_t;
/* ...message body (no response message? - tbd) */
typedef struct xf_set_param_msg
{
/* ...command message */
xf_set_param_item_t item[0];
} __attribute__ ((__packed__)) xf_set_param_msg_t;
/* ...length of the command message */
#define XF_SET_PARAM_CMD_LEN(params) (sizeof(xf_set_param_item_t) * (params))
/*******************************************************************************
* XF_SET_PARAM_EXT/XF_GET_PARAM_EXT message
******************************************************************************/
/* ...extended parameter descriptor */
typedef struct xf_ext_param_desc
{
/* ...index of parameter passed to SET/GET_CONFIG_PARAM call (16-bits only) */
u16 id;
/* ...length of embedded input/output parameter data (in bytes) */
u16 length;
} __attribute__ ((__packed__, __aligned__(4))) xf_ext_param_desc_t;
/* ...message body (no response message? - tbd) */
typedef struct xf_ext_param_msg
{
/* ...extended parameter descriptor */
xf_ext_param_desc_t desc;
/* ...parameter data (in the format expected by codec; 4 bytes aligned) */
u8 data[0];
} __attribute__ ((__packed__, __aligned__(4))) xf_ext_param_msg_t;
/*******************************************************************************
* XF_ROUTE definition
******************************************************************************/
/* ...port routing command */
typedef struct xf_route_port_msg
{
/* ...source port specification */
u32 src;
/* ...destination port specification */
u32 dst;
/* ...number of buffers to allocate */
u32 alloc_number;
/* ...length of buffer to allocate */
u32 alloc_size;
/* ...alignment restriction for a buffer */
u32 alloc_align;
} __attribute__((__packed__)) xf_route_port_msg_t;
/*******************************************************************************
* XF_UNROUTE definition
******************************************************************************/
/* ...port unrouting command */
typedef struct xf_unroute_port_msg
{
/* ...source port specification */
u32 src;
/* ...destination port specification */
u32 dst;
} __attribute__((__packed__)) xf_unroute_port_msg_t;