diff options
Diffstat (limited to 'hifi/xaf/host-apf/include')
22 files changed, 2732 insertions, 0 deletions
diff --git a/hifi/xaf/host-apf/include/audio/xa-audio-decoder-api.h b/hifi/xaf/host-apf/include/audio/xa-audio-decoder-api.h new file mode 100644 index 00000000..f82544c8 --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa-audio-decoder-api.h @@ -0,0 +1,46 @@ +/******************************************************************************* +* 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 __XA_ADEC_API_H__ +#define __XA_ADEC_API_H__ + +/* ...generic audio-decoder configuration parameters */ +enum xa_config_param_codec { + XA_CODEC_CONFIG_PARAM_CHANNELS = 0x10000 + 0, + XA_CODEC_CONFIG_PARAM_SAMPLE_RATE = 0x10000 + 1, + XA_CODEC_CONFIG_PARAM_PCM_WIDTH = 0x10000 + 2, + XA_CODEC_CONFIG_PARAM_PRODUCED = 0x10000 + 3 +}; + +/* ...ports indices */ +enum xa_codec_ports { + XA_CODEC_INPUT_PORT = 0, + XA_CODEC_OUTPUT_PORT = 1 +}; + +/* ...non-fatal execution errors */ +enum +{ + XA_CODEC_EXEC_NO_DATA = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_GENERIC, 0) +}; + +#endif diff --git a/hifi/xaf/host-apf/include/audio/xa-mixer-api.h b/hifi/xaf/host-apf/include/audio/xa-mixer-api.h new file mode 100644 index 00000000..c9695b40 --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa-mixer-api.h @@ -0,0 +1,154 @@ +/******************************************************************************* +* 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 __XA_MIXER_API_H__ +#define __XA_MIXER_API_H__ + +/******************************************************************************* + * Includes + ******************************************************************************/ + +/* ...generic commands */ +#include "xa_apicmd_standards.h" + +/* ...generic error codes */ +#include "xa_error_standards.h" + +/* ...common types */ +#include "xa_type_def.h" + +/******************************************************************************* + * Constants definitions + ******************************************************************************/ + +/* ...mixer-specific configuration parameters */ +enum xa_config_param_mixer { + XA_MIXER_CONFIG_PARAM_INPUT_TRACKS = 0, + XA_MIXER_CONFIG_PARAM_PCM_WIDTH = 1, + XA_MIXER_CONFIG_PARAM_CHANNELS = 2, + XA_MIXER_CONFIG_PARAM_SAMPLE_RATE = 4, + XA_MIXER_CONFIG_PARAM_FRAME_SIZE = 5, + XA_MIXER_CONFIG_PARAM_BUFFER_SIZE = 6, + XA_MIXER_CONFIG_PARAM_VOLUME = 7, + XA_MIXER_CONFIG_PARAM_NUM = 8 +}; + +/* ...component identifier (informative) */ +#define XA_CODEC_MIXER 1 + +/* ...global limitation - maximal mixer track number */ +#define XA_MIXER_MAX_TRACK_NUMBER 4 + +/* ...volume representation */ +#define __XA_MIXER_VOLUME(v) \ + ({ u32 __v = (u32)((v) * (1 << 12)); (__v > 0xFFFF ? __v = 0xFFFF : 0); (u16)__v; }) + +/* ...mixer volume setting command encoding */ +#define XA_MIXER_VOLUME(track, channel, volume) \ + (__XA_MIXER_VOLUME(volume) | ((track) << 16) | ((channel) << 20)) + +/******************************************************************************* + * Class 0: API Errors + ******************************************************************************/ + +#define XA_MIXER_API_NONFATAL(e) \ + XA_ERROR_CODE(xa_severity_nonfatal, xa_class_api, XA_CODEC_MIXER, (e)) + +#define XA_MIXER_API_FATAL(e) \ + XA_ERROR_CODE(xa_severity_fatal, xa_class_api, XA_CODEC_MIXER, (e)) + +enum xa_error_nonfatal_api_mixer { + XA_MIXER_API_NONFATAL_MAX = XA_MIXER_API_NONFATAL(0) +}; + +enum xa_error_fatal_api_mixer { + XA_MIXER_API_FATAL_MAX = XA_MIXER_API_FATAL(0) +}; + +/******************************************************************************* + * Class 1: Configuration Errors + ******************************************************************************/ + +#define XA_MIXER_CONFIG_NONFATAL(e) \ + XA_ERROR_CODE(xa_severity_nonfatal, xa_class_config, XA_CODEC_MIXER, (e)) + +#define XA_MIXER_CONFIG_FATAL(e) \ + XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_MIXER, (e)) + +enum xa_error_nonfatal_config_mixer { + XA_MIXER_CONFIG_NONFATAL_RANGE = XA_MIXER_CONFIG_NONFATAL(0), + XA_MIXER_CONFIG_NONFATAL_STATE = XA_MIXER_CONFIG_NONFATAL(1), + XA_MIXER_CONFIG_NONFATAL_MAX = XA_MIXER_CONFIG_NONFATAL(2) +}; + +enum xa_error_fatal_config_mixer { + XA_MIXER_CONFIG_FATAL_RANGE = XA_MIXER_CONFIG_FATAL(0), + XA_MIXER_CONFIG_FATAL_TRACK_STATE = XA_MIXER_CONFIG_FATAL(0 + XA_MIXER_CONFIG_NONFATAL_MAX), + XA_MIXER_CONFIG_FATAL_MAX = XA_MIXER_CONFIG_FATAL(1) +}; + +/******************************************************************************* + * Class 2: Execution Class Errors + ******************************************************************************/ + +#define XA_MIXER_EXEC_NONFATAL(e) \ + XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_MIXER, (e)) + +#define XA_MIXER_EXEC_FATAL(e) \ + XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_MIXER, (e)) + +enum xa_error_nonfatal_execute_mixer { + XA_MIXER_EXEC_NONFATAL_STATE = XA_MIXER_EXEC_NONFATAL(0), + XA_MIXER_EXEC_NONFATAL_NO_DATA = XA_MIXER_EXEC_NONFATAL(1), + XA_MIXER_EXEC_NONFATAL_INPUT = XA_MIXER_EXEC_NONFATAL(2), + XA_MIXER_EXEC_NONFATAL_OUTPUT = XA_MIXER_EXEC_NONFATAL(3), + XA_MIXER_EXEC_NONFATAL_MAX = XA_MIXER_EXEC_NONFATAL(4) +}; + +enum xa_error_fatal_execute_mixer { + XA_MIXER_EXEC_FATAL_STATE = XA_MIXER_EXEC_FATAL(0), + XA_MIXER_EXEC_FATAL_INPUT = XA_MIXER_EXEC_FATAL(1), + XA_MIXER_EXEC_FATAL_OUTPUT = XA_MIXER_EXEC_FATAL(2), + XA_MIXER_EXEC_FATAL_MAX = XA_MIXER_EXEC_FATAL(3) +}; + +/******************************************************************************* + * API function definition (tbd) + ******************************************************************************/ + +#if defined(USE_DLL) && defined(_WIN32) +#define DLL_SHARED __declspec(dllimport) +#elif defined (_WINDLL) +#define DLL_SHARED __declspec(dllexport) +#else +#define DLL_SHARED +#endif + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ +DLL_SHARED xa_codec_func_t xa_mixer; +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* __XA_MIXER_API_H__ */ diff --git a/hifi/xaf/host-apf/include/audio/xa-pcm-api.h b/hifi/xaf/host-apf/include/audio/xa-pcm-api.h new file mode 100644 index 00000000..94fb1362 --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa-pcm-api.h @@ -0,0 +1,138 @@ +/******************************************************************************* +* 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 __XA_PCM_API_H__ +#define __XA_PCM_API_H__ + +/******************************************************************************* + * Includes + ******************************************************************************/ + +#include "xa_type_def.h" +#include "xa_error_standards.h" +#include "xa_apicmd_standards.h" +#include "xa_memory_standards.h" + +/******************************************************************************* + * Constants definitions + ******************************************************************************/ + +/* ...codec-specific configuration parameters */ +enum xa_config_param_pcm { + XA_PCM_CONFIG_PARAM_SAMPLE_RATE = 0, + XA_PCM_CONFIG_PARAM_IN_PCM_WIDTH = 1, + XA_PCM_CONFIG_PARAM_IN_CHANNELS = 2, + XA_PCM_CONFIG_PARAM_OUT_PCM_WIDTH = 3, + XA_PCM_CONFIG_PARAM_OUT_CHANNELS = 4, + XA_PCM_CONFIG_PARAM_CHANROUTING = 5, + XA_PCM_CONFIG_PARAM_NUM = 6, +}; + +/* ...component identifier (informative) */ +#define XA_CODEC_PCM 16 + +/******************************************************************************* + * Class 0: API Errors + ******************************************************************************/ + +#define XA_PCM_API_NONFATAL(e) \ + XA_ERROR_CODE(xa_severity_nonfatal, xa_class_api, XA_CODEC_PCM, (e)) + +#define XA_PCM_API_FATAL(e) \ + XA_ERROR_CODE(xa_severity_fatal, xa_class_api, XA_CODEC_PCM, (e)) + +enum xa_error_nonfatal_api_pcm { + XA_PCM_API_NONFATAL_MAX = XA_PCM_API_NONFATAL(0) +}; + +enum xa_error_fatal_api_pcm { + XA_PCM_API_FATAL_MAX = XA_PCM_API_FATAL(0) +}; + +/******************************************************************************* + * Class 1: Configuration Errors + ******************************************************************************/ + +#define XA_PCM_CONFIG_NONFATAL(e) \ + XA_ERROR_CODE(xa_severity_nonfatal, xa_class_config, XA_CODEC_PCM, (e)) + +#define XA_PCM_CONFIG_FATAL(e) \ + XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_PCM, (e)) + +enum xa_error_nonfatal_config_pcm { + XA_PCM_CONFIG_NONFATAL_RANGE = XA_PCM_CONFIG_NONFATAL(0), + XA_PCM_CONFIG_NONFATAL_STATE = XA_PCM_CONFIG_NONFATAL(1), + XA_PCM_CONFIG_NONFATAL_MAX = XA_PCM_CONFIG_NONFATAL(2) +}; + +enum xa_error_fatal_config_pcm { + XA_PCM_CONFIG_FATAL_RANGE = XA_PCM_CONFIG_FATAL(0), + XA_PCM_CONFIG_FATAL_MAX = XA_PCM_CONFIG_FATAL(1) +}; + +/******************************************************************************* + * Class 2: Execution Class Errors + ******************************************************************************/ + +#define XA_PCM_EXEC_NONFATAL(e) \ + XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_PCM, (e)) + +#define XA_PCM_EXEC_FATAL(e) \ + XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_PCM, (e)) + +enum xa_error_nonfatal_execute_pcm { + XA_PCM_EXEC_NONFATAL_STATE = XA_PCM_EXEC_NONFATAL(0), + XA_PCM_EXEC_NONFATAL_NO_DATA = XA_PCM_EXEC_NONFATAL(1), + XA_PCM_EXEC_NONFATAL_INPUT = XA_PCM_EXEC_NONFATAL(2), + XA_PCM_EXEC_NONFATAL_OUTPUT = XA_PCM_EXEC_NONFATAL(3), + XA_PCM_EXEC_NONFATAL_MAX = XA_PCM_EXEC_NONFATAL(4) +}; + +enum xa_error_fatal_execute_pcm { + XA_PCM_EXEC_FATAL_STATE = XA_PCM_EXEC_FATAL(0), + XA_PCM_EXEC_FATAL_INPUT = XA_PCM_EXEC_FATAL(1), + XA_PCM_EXEC_FATAL_OUTPUT = XA_PCM_EXEC_FATAL(2), + XA_PCM_EXEC_FATAL_MAX = XA_PCM_EXEC_FATAL(3) +}; + +/******************************************************************************* + * API function definition + ******************************************************************************/ + +#if defined(USE_DLL) && defined(_WIN32) +#define DLL_SHARED __declspec(dllimport) +#elif defined (_WINDLL) +#define DLL_SHARED __declspec(dllexport) +#else +#define DLL_SHARED +#endif + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ +DLL_SHARED xa_codec_func_t xa_pcm_codec; +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* __XA_PCM_API_H__ */ + diff --git a/hifi/xaf/host-apf/include/audio/xa_apicmd_standards.h b/hifi/xaf/host-apf/include/audio/xa_apicmd_standards.h new file mode 100644 index 00000000..eb1b78e1 --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa_apicmd_standards.h @@ -0,0 +1,107 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ +/******************************************************************************* +* +* NOTE, ANY CHANGES TO THIS FILE MAY AFFECT UNDERLYING AUDIO / SPEECH CODEC +* LIBRARY COMPONENT FROM CADENCE DESIGN SYSTEMS, INC. +* +******************************************************************************/ + + +#ifndef __XA_API_CMD_STANDARDS_H__ +#define __XA_API_CMD_STANDARDS_H__ + +/*****************************************************************************/ +/* Standard API commands */ +/*****************************************************************************/ + +enum xa_api_cmd_generic { + XA_API_CMD_GET_LIB_ID_STRINGS = 0x0001, + + XA_API_CMD_GET_API_SIZE = 0x0002, + XA_API_CMD_INIT = 0x0003, + + XA_API_CMD_SET_CONFIG_PARAM = 0x0004, + XA_API_CMD_GET_CONFIG_PARAM = 0x0005, + + XA_API_CMD_GET_MEMTABS_SIZE = 0x0006, + XA_API_CMD_SET_MEMTABS_PTR = 0x0007, + XA_API_CMD_GET_N_MEMTABS = 0x0008, + + XA_API_CMD_EXECUTE = 0x0009, + + XA_API_CMD_PUT_INPUT_QUERY = 0x000A, + XA_API_CMD_GET_CURIDX_INPUT_BUF = 0x000B, + XA_API_CMD_SET_INPUT_BYTES = 0x000C, + XA_API_CMD_GET_OUTPUT_BYTES = 0x000D, + XA_API_CMD_INPUT_OVER = 0x000E, + + XA_API_CMD_GET_MEM_INFO_SIZE = 0x0010, + XA_API_CMD_GET_MEM_INFO_ALIGNMENT = 0x0011, + XA_API_CMD_GET_MEM_INFO_TYPE = 0x0012, + XA_API_CMD_GET_MEM_INFO_PLACEMENT = 0x0013, + XA_API_CMD_GET_MEM_INFO_PRIORITY = 0x0014, + XA_API_CMD_SET_MEM_PTR = 0x0015, + XA_API_CMD_SET_MEM_INFO_SIZE = 0x0016, + XA_API_CMD_SET_MEM_PLACEMENT = 0x0017, + + XA_API_CMD_GET_N_TABLES = 0x0018, + XA_API_CMD_GET_TABLE_INFO_SIZE = 0x0019, + XA_API_CMD_GET_TABLE_INFO_ALIGNMENT = 0x001A, + XA_API_CMD_GET_TABLE_INFO_PRIORITY = 0x001B, + XA_API_CMD_SET_TABLE_PTR = 0x001C, + XA_API_CMD_GET_TABLE_PTR = 0x001D +}; + +/*****************************************************************************/ +/* Standard API command indices */ +/*****************************************************************************/ + +enum xa_cmd_type_generic { + /* XA_API_CMD_GET_LIB_ID_STRINGS indices */ + XA_CMD_TYPE_LIB_NAME = 0x0100, + XA_CMD_TYPE_LIB_VERSION = 0x0200, + XA_CMD_TYPE_API_VERSION = 0x0300, + + /* XA_API_CMD_INIT indices */ + XA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS = 0x0100, + XA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS = 0x0200, + XA_CMD_TYPE_INIT_PROCESS = 0x0300, + XA_CMD_TYPE_INIT_DONE_QUERY = 0x0400, + + /* XA_API_CMD_EXECUTE indices */ + XA_CMD_TYPE_DO_EXECUTE = 0x0100, + XA_CMD_TYPE_DONE_QUERY = 0x0200, + XA_CMD_TYPE_DO_RUNTIME_INIT = 0x0300 +}; + + +/*****************************************************************************/ +/* Standard API configuration parameters */ +/*****************************************************************************/ + +enum xa_config_param_generic { + XA_CONFIG_PARAM_CUR_INPUT_STREAM_POS = 0x0100, + XA_CONFIG_PARAM_GEN_INPUT_STREAM_POS = 0x0200, +}; + +#endif /* __XA_API_CMD_STANDARDS_H__ */ diff --git a/hifi/xaf/host-apf/include/audio/xa_error_standards.h b/hifi/xaf/host-apf/include/audio/xa_error_standards.h new file mode 100644 index 00000000..1b67b52f --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa_error_standards.h @@ -0,0 +1,79 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ +/******************************************************************************* +* +* NOTE, ANY CHANGES TO THIS FILE MAY AFFECT UNDERLYING AUDIO / SPEECH CODEC +* LIBRARY COMPONENT FROM CADENCE DESIGN SYSTEMS, INC. +* +******************************************************************************/ + + +#ifndef __XA_ERROR_STANDARDS_H__ +#define __XA_ERROR_STANDARDS_H__ + +/*****************************************************************************/ +/* File includes */ +/* xa_type_def.h */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* Constant hash defines */ +/*****************************************************************************/ +#define XA_NO_ERROR 0 +#define XA_FATAL_ERROR 0x80000000 + +enum xa_error_severity { + xa_severity_nonfatal = 0, + xa_severity_fatal = 0xffffffff +}; + +enum xa_error_class { + xa_class_api = 0, + xa_class_config = 1, + xa_class_execute = 2, + xa_class_proxy = 3 +}; + +#define XA_CODEC_GENERIC 0 + +#define XA_ERROR_CODE(severity, class, codec, index) ((severity << 15) | (class << 11) | (codec << 6) | index) +#define XA_ERROR_SEVERITY(code) (((code) & XA_FATAL_ERROR) != 0) +#define XA_ERROR_CLASS(code) (((code) >> 11) & 0x0f) +#define XA_ERROR_CODEC(code) (((code) >> 6) & 0x1f) +#define XA_ERROR_SUBCODE(code) (((code) >> 0) & 0x3f) + +/* Our convention is that only api-class errors can be generic ones. */ + +/*****************************************************************************/ +/* Class 0: API Errors */ +/*****************************************************************************/ +/* Non Fatal Errors */ +/* (none) */ +/* Fatal Errors */ +enum xa_error_fatal_api_generic { + XA_API_FATAL_MEM_ALLOC = XA_ERROR_CODE(xa_severity_fatal, xa_class_api, XA_CODEC_GENERIC, 0), + XA_API_FATAL_MEM_ALIGN = XA_ERROR_CODE(xa_severity_fatal, xa_class_api, XA_CODEC_GENERIC, 1), + XA_API_FATAL_INVALID_CMD = XA_ERROR_CODE(xa_severity_fatal, xa_class_api, XA_CODEC_GENERIC, 2), + XA_API_FATAL_INVALID_CMD_TYPE = XA_ERROR_CODE(xa_severity_fatal, xa_class_api, XA_CODEC_GENERIC, 3) +}; + +#endif /* __XA_ERROR_STANDARDS_H__ */ diff --git a/hifi/xaf/host-apf/include/audio/xa_memory_standards.h b/hifi/xaf/host-apf/include/audio/xa_memory_standards.h new file mode 100644 index 00000000..27ec455f --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa_memory_standards.h @@ -0,0 +1,104 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ +/******************************************************************************* +* +* NOTE, ANY CHANGES TO THIS FILE MAY AFFECT UNDERLYING AUDIO / SPEECH CODEC +* LIBRARY COMPONENT FROM CADENCE DESIGN SYSTEMS, INC. +* +******************************************************************************/ + + +#ifndef __XA_MEMORY_STANDARDS_H__ +#define __XA_MEMORY_STANDARDS_H__ + +/*****************************************************************************/ +/* Constant hash defines */ +/*****************************************************************************/ +/* when you don't need alignment, pass this to memory library */ +#define XA_MEM_NO_ALIGN 0x01 + +/* standard memory types */ +/* to be used inter frames */ +#define XA_MEMTYPE_PERSIST 0x00 +/* read write, to be used intra frames */ +#define XA_MEMTYPE_SCRATCH 0x01 +/* read only memory, intra frame */ +#define XA_MEMTYPE_INPUT 0x02 +/* read-write memory, for usable output, intra frame */ +#define XA_MEMTYPE_OUTPUT 0x03 +/* readonly memory, inter frame */ +#define XA_MEMTYPE_TABLE 0x04 +/* input buffer before mem tabs allocation */ +#define XA_MEMTYPE_PRE_FRAME_INPUT 0x05 +/* input buffer before mem tabs allocation */ +#define XA_MEMTYPE_PRE_FRAME_SCRATCH 0x06 +/* for local variables */ +#define XA_MEMTYPE_AUTO_VAR 0x80 + +/* standard memory priorities */ +#define XA_MEMPRIORITY_ANYWHERE 0x00 +#define XA_MEMPRIORITY_LOWEST 0x01 +#define XA_MEMPRIORITY_LOW 0x02 +#define XA_MEMPRIORITY_NORM 0x03 +#define XA_MEMPRIORITY_ABOVE_NORM 0x04 +#define XA_MEMPRIORITY_HIGH 0x05 +#define XA_MEMPRIORITY_HIGHER 0x06 +#define XA_MEMPRIORITY_CRITICAL 0x07 + +/* standard memory placements */ +/* placement is defined by 64 bits */ + +#define XA_MEMPLACE_FAST_RAM_0 0x000001 +#define XA_MEMPLACE_FAST_RAM_1 0x000002 +#define XA_MEMPLACE_FAST_RAM_2 0x000004 +#define XA_MEMPLACE_FAST_RAM_3 0x000008 +#define XA_MEMPLACE_FAST_RAM_4 0x000010 +#define XA_MEMPLACE_FAST_RAM_5 0x000020 +#define XA_MEMPLACE_FAST_RAM_6 0x000040 +#define XA_MEMPLACE_FAST_RAM_7 0x000080 + +#define XA_MEMPLACE_INT_RAM_0 0x000100 +#define XA_MEMPLACE_INT_RAM_1 0x000200 +#define XA_MEMPLACE_INT_RAM_2 0x000400 +#define XA_MEMPLACE_INT_RAM_3 0x000800 +#define XA_MEMPLACE_INT_RAM_4 0x001000 +#define XA_MEMPLACE_INT_RAM_5 0x002000 +#define XA_MEMPLACE_INT_RAM_6 0x004000 +#define XA_MEMPLACE_INT_RAM_7 0x008000 + +#define XA_MEMPLACE_EXT_RAM_0 0x010000 +#define XA_MEMPLACE_EXT_RAM_1 0x020000 +#define XA_MEMPLACE_EXT_RAM_2 0x040000 +#define XA_MEMPLACE_EXT_RAM_3 0x080000 +#define XA_MEMPLACE_EXT_RAM_4 0x100000 +#define XA_MEMPLACE_EXT_RAM_5 0x200000 +#define XA_MEMPLACE_EXT_RAM_6 0x400000 +#define XA_MEMPLACE_EXT_RAM_7 0x800000 + +#define XA_MEMPLACE_DONTCARE_H 0xFFFFFFFF +#define XA_MEMPLACE_DONTCARE_L 0xFFFFFFFF + +/* the simple common PC RAM */ +#define XA_PC_RAM_H 0x00000000 +#define XA_PC_RAM_L XA_MEMPLACE_EXT_RAM_0 + +#endif /* __XA_MEMORY_STANDARDS_H__ */ diff --git a/hifi/xaf/host-apf/include/audio/xa_type_def.h b/hifi/xaf/host-apf/include/audio/xa_type_def.h new file mode 100644 index 00000000..e83cdd34 --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa_type_def.h @@ -0,0 +1,98 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ +/******************************************************************************* +* +* NOTE, ANY CHANGES TO THIS FILE MAY AFFECT UNDERLYING AUDIO / SPEECH CODEC +* LIBRARY COMPONENT FROM CADENCE DESIGN SYSTEMS, INC. +* +******************************************************************************/ + + +#ifndef __XA_TYPE_DEF_H__ +#define __XA_TYPE_DEF_H__ + +/****************************************************************************/ +/* types type define prefix examples bytes */ +/************************ *********** ****** **************** ***** */ +typedef signed char WORD8 ;/* b WORD8 b_name 1 */ +typedef signed char * pWORD8 ;/* pb pWORD8 pb_nmae 1 */ +typedef unsigned char UWORD8 ;/* ub UWORD8 ub_count 1 */ +typedef unsigned char * pUWORD8 ;/* pub pUWORD8 pub_count 1 */ + +typedef signed short WORD16 ;/* s WORD16 s_count 2 */ +typedef signed short * pWORD16 ;/* ps pWORD16 ps_count 2 */ +typedef unsigned short UWORD16 ;/* us UWORD16 us_count 2 */ +typedef unsigned short * pUWORD16;/* pus pUWORD16 pus_count 2 */ + +typedef signed int WORD24 ;/* k WORD24 k_count 3 */ +typedef signed int * pWORD24 ;/* pk pWORD24 pk_count 3 */ +typedef unsigned int UWORD24 ;/* uk UWORD24 uk_count 3 */ +typedef unsigned int * pUWORD24;/* puk pUWORD24 puk_count 3 */ + +typedef signed int WORD32 ;/* i WORD32 i_count 4 */ +typedef signed int * pWORD32 ;/* pi pWORD32 pi_count 4 */ +typedef unsigned int UWORD32 ;/* ui UWORD32 ui_count 4 */ +typedef unsigned int * pUWORD32;/* pui pUWORD32 pui_count 4 */ + +typedef signed long long WORD40 ;/* m WORD40 m_count 5 */ +typedef signed long long * pWORD40 ;/* pm pWORD40 pm_count 5 */ +typedef unsigned long long UWORD40 ;/* um UWORD40 um_count 5 */ +typedef unsigned long long * pUWORD40;/* pum pUWORD40 pum_count 5 */ + +typedef signed long long WORD64 ;/* h WORD64 h_count 8 */ +typedef signed long long * pWORD64 ;/* ph pWORD64 ph_count 8 */ +typedef unsigned long long UWORD64 ;/* uh UWORD64 uh_count 8 */ +typedef unsigned long long * pUWORD64;/* puh pUWORD64 puh_count 8 */ + +typedef float FLOAT32 ;/* f FLOAT32 f_count 4 */ +typedef float * pFLOAT32;/* pf pFLOAT32 pf_count 4 */ +typedef double FLOAT64 ;/* d UFLOAT64 d_count 8 */ +typedef double * pFlOAT64;/* pd pFLOAT64 pd_count 8 */ + +typedef void VOID ;/* v VOID v_flag 4 */ +typedef void * pVOID ;/* pv pVOID pv_flag 4 */ + +/* variable size types: platform optimized implementation */ +//typedef signed int BOOL ;/* bool BOOL bool_true */ +//typedef unsigned int UBOOL ;/* ubool BOOL ubool_true */ +typedef signed int FLAG ;/* flag FLAG flag_false */ +typedef unsigned int UFLAG ;/* uflag FLAG uflag_false */ +typedef signed int LOOPIDX ;/* lp LOOPIDX lp_index */ +typedef unsigned int ULOOPIDX;/* ulp SLOOPIDX ulp_index */ +typedef signed int WORD ;/* lp LOOPIDX lp_index */ +typedef unsigned int UWORD ;/* ulp SLOOPIDX ulp_index */ + +typedef LOOPIDX LOOPINDEX; /* lp LOOPIDX lp_index */ +typedef ULOOPIDX ULOOPINDEX;/* ulp SLOOPIDX ulp_index */ + +#define PLATFORM_INLINE __inline + +typedef struct xa_codec_opaque { WORD32 _; } *xa_codec_handle_t; + +typedef int XA_ERRORCODE; + +typedef XA_ERRORCODE xa_codec_func_t(xa_codec_handle_t p_xa_module_obj, + WORD32 i_cmd, + WORD32 i_idx, + pVOID pv_value); + +#endif /* __XA_TYPE_DEF_H__ */ diff --git a/hifi/xaf/host-apf/include/audio/xa_vorbis_dec_api.h b/hifi/xaf/host-apf/include/audio/xa_vorbis_dec_api.h new file mode 100644 index 00000000..f99660f8 --- /dev/null +++ b/hifi/xaf/host-apf/include/audio/xa_vorbis_dec_api.h @@ -0,0 +1,121 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ +/******************************************************************************* +* +* NOTE, ANY CHANGES TO THIS FILE MAY AFFECT UNDERLYING AUDIO / SPEECH CODEC +* LIBRARY COMPONENT FROM CADENCE DESIGN SYSTEMS, INC. +* +******************************************************************************/ + + + +#ifndef __XA_VORBIS_DEC_API_H__ +#define __XA_VORBIS_DEC_API_H__ + +#include <xa_memory_standards.h> + +/* vorbis_dec-specific configuration parameters */ +enum xa_config_param_vorbis_dec +{ + XA_VORBISDEC_CONFIG_PARAM_SAMP_FREQ = 0, + XA_VORBISDEC_CONFIG_PARAM_NUM_CHANNELS = 1, + XA_VORBISDEC_CONFIG_PARAM_PCM_WDSZ = 2, + XA_VORBISDEC_CONFIG_PARAM_COMMENT_MEM_PTR = 3, + XA_VORBISDEC_CONFIG_PARAM_COMMENT_MEM_SIZE = 4, + XA_VORBISDEC_CONFIG_PARAM_GET_CUR_BITRATE = 5, + XA_VORBISDEC_CONFIG_PARAM_RAW_VORBIS_FILE_MODE = 6, + XA_VORBISDEC_CONFIG_PARAM_RAW_VORBIS_LAST_PKT_GRANULE_POS = 7, + XA_VORBISDEC_CONFIG_PARAM_OGG_MAX_PAGE_SIZE = 8, + XA_VORBISDEC_CONFIG_PARAM_RUNTIME_MEM = 9 +}; + +/* commands */ +#include <xa_apicmd_standards.h> + +/* vorbis_dec-specific command types */ +/* (none) */ + +/* error codes */ +#include <xa_error_standards.h> +#define XA_CODEC_VORBIS_DEC 7 + +/* vorbis_dec-specific error codes */ + +/*****************************************************************************/ +/* Class 1: Configuration Errors */ +/*****************************************************************************/ +/* Nonfatal Errors */ +enum xa_error_nonfatal_config_vorbis_dec +{ + XA_VORBISDEC_CONFIG_NONFATAL_GROUPED_STREAM = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_config, XA_CODEC_VORBIS_DEC, 0), + XA_VORBISDEC_CONFIG_NONFATAL_BAD_PARAM = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_config, XA_CODEC_VORBIS_DEC, 1) +}; + +/* Fatal Errors */ +enum xa_error_fatal_config_vorbis_dec +{ + XA_VORBISDEC_CONFIG_FATAL_BADHDR = XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_VORBIS_DEC, 0), + XA_VORBISDEC_CONFIG_FATAL_NOTVORBIS = XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_VORBIS_DEC, 1), + XA_VORBISDEC_CONFIG_FATAL_BADINFO = XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_VORBIS_DEC, 2), + XA_VORBISDEC_CONFIG_FATAL_BADVERSION = XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_VORBIS_DEC, 3), + XA_VORBISDEC_CONFIG_FATAL_BADBOOKS = XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_VORBIS_DEC, 4), + XA_VORBISDEC_CONFIG_FATAL_CODEBOOK_DECODE = XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_VORBIS_DEC, 5), + XA_VORBISDEC_CONFIG_FATAL_INVALID_PARAM = XA_ERROR_CODE(xa_severity_fatal, xa_class_config, XA_CODEC_VORBIS_DEC, 6) +}; + +/*****************************************************************************/ +/* Class 2: Execution Errors */ +/*****************************************************************************/ +/* Nonfatal Errors */ +enum xa_error_nonfatal_execute_vorbis_dec +{ + XA_VORBISDEC_EXECUTE_NONFATAL_OV_HOLE = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 0), + XA_VORBISDEC_EXECUTE_NONFATAL_OV_NOTAUDIO = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 1), + XA_VORBISDEC_EXECUTE_NONFATAL_OV_BADPACKET = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 2), + XA_VORBISDEC_EXECUTE_NONFATAL_OV_RUNTIME_DECODE_FLUSH_IN_PROGRESS = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 3), + XA_VORBISDEC_EXECUTE_NONFATAL_OV_INVALID_STRM_POS = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 4), + XA_VORBISDEC_EXECUTE_NONFATAL_OV_INSUFFICIENT_DATA = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 5), + XA_VORBISDEC_EXECUTE_NONFATAL_OV_UNEXPECTED_IDENT_PKT_RECEIVED = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 6), + XA_VORBISDEC_EXECUTE_NONFATAL_OV_UNEXPECTED_HEADER_PKT_RECEIVED = XA_ERROR_CODE(xa_severity_nonfatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 7) +}; +/* Fatal Errors */ +enum xa_error_fatal_execute_vorbis_dec +{ + XA_VORBISDEC_EXECUTE_FATAL_PERSIST_ALLOC = XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 0), + XA_VORBISDEC_EXECUTE_FATAL_SCRATCH_ALLOC = XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 1), + XA_VORBISDEC_EXECUTE_FATAL_CORRUPT_STREAM = XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 2), + XA_VORBISDEC_EXECUTE_FATAL_INSUFFICIENT_INP_BUF_SIZE = XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_VORBIS_DEC, 3) +}; + +#include "xa_type_def.h" + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + + xa_codec_func_t xa_vorbis_dec; + +#ifdef __cplusplus + } +#endif /* __cplusplus */ + +#endif /* __XA_VORBIS_DEC_API_H__ */ diff --git a/hifi/xaf/host-apf/include/os/android/xf-osal.h b/hifi/xaf/host-apf/include/os/android/xf-osal.h new file mode 100644 index 00000000..7d2f5a95 --- /dev/null +++ b/hifi/xaf/host-apf/include/os/android/xf-osal.h @@ -0,0 +1,215 @@ +/******************************************************************************* +* 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-osal.h mustn't be included directly" +#endif + +/******************************************************************************* + * Includes + ******************************************************************************/ + +#include <pthread.h> +#include <fcntl.h> +#include <limits.h> +#include <sys/mman.h> +#include <sys/ioctl.h> +#include <sys/time.h> +#include <cutils/log.h> + +/******************************************************************************* + * Tracing primitive + ******************************************************************************/ + +#define __xf_puts(str) \ + ALOG(LOG_INFO, "PROXY", "%s", (str)) + +/******************************************************************************* + * Lock operation + ******************************************************************************/ + +/* ...lock definition */ +typedef pthread_mutex_t xf_lock_t; + +/* ...lock initialization */ +static inline void __xf_lock_init(xf_lock_t *lock) +{ + pthread_mutex_init(lock, NULL); +} + +/* ...lock acquisition */ +static inline void __xf_lock(xf_lock_t *lock) +{ + pthread_mutex_lock(lock); +} + +/* ...lock release */ +static inline void __xf_unlock(xf_lock_t *lock) +{ + pthread_mutex_unlock(lock); +} + +/******************************************************************************* + * Waiting object + ******************************************************************************/ + +/* ...waiting object handle */ +typedef struct __xf_wait +{ + /* ...conditional variable */ + pthread_cond_t wait; + + /* ...waiting mutex */ + pthread_mutex_t mutex; + +} xf_wait_t; + +/* ...initialize waiting object */ +static inline void __xf_wait_init(xf_wait_t *w) +{ + pthread_cond_init(&w->wait, NULL); + pthread_mutex_init(&w->mutex, NULL); +} + +/* ...prepare to waiting */ +static inline void __xf_wait_prepare(xf_wait_t *w) +{ + pthread_mutex_lock(&w->mutex); +} + +#define __xf_wait_prepare(w) \ +({ \ + TRACE(1, _x("prepare-wait")); \ + (__xf_wait_prepare)(w); \ +}) + +/* ...wait until event is signalled */ +static inline int __xf_wait(xf_wait_t *w, u32 timeout) +{ + struct timespec ts; + struct timeval tv; + int r; + + /* ...wait with or without timeout (communication mutex is taken) */ + if (!timeout) + { + r = -pthread_cond_wait(&w->wait, &w->mutex); + } + else + { + /* ...get current time */ + gettimeofday(&tv, NULL); + + /* ...set absolute timeout */ + ts.tv_sec = tv.tv_sec + timeout / 1000; + ts.tv_nsec = tv.tv_usec * 1000 + (timeout % 1000) * 1000000; + (ts.tv_nsec >= 1000000000 ? ts.tv_sec++, ts.tv_nsec -= 1000000000 : 0); + + /* ...wait conditionally with absolute timeout*/ + r = -pthread_cond_timedwait(&w->wait, &w->mutex, &ts); + } + + /* ...leave with communication mutex taken */ + return r; +} + +#define __xf_wait(w, timeout) \ +({ \ + int __r; \ + TRACE(1, _x("wait")); \ + __r = (__xf_wait)(w, timeout); \ + TRACE(1, _x("resume")); \ + __r; \ +}) + +/* ...wake up waiting handle */ +static inline void __xf_wakeup(xf_wait_t *w) +{ + /* ...take communication mutex before signaling */ + pthread_mutex_lock(&w->mutex); + + /* ...signalling will resume waiting thread */ + pthread_cond_signal(&w->wait); + + /* ...assure that waiting task will not resume until we say this - is that really needed? - tbd */ + pthread_mutex_unlock(&w->mutex); +} + +#define __xf_wakeup(w) \ +({ \ + TRACE(1, _x("wakeup")); \ + (__xf_wakeup)(w); \ +}) + +/* ...complete waiting operation */ +static inline void __xf_wait_complete(xf_wait_t *w) +{ + pthread_mutex_unlock(&w->mutex); +} + +#define __xf_wait_complete(w) \ +({ \ + TRACE(1, _x("wait-complete")); \ + (__xf_wait_complete)(w); \ +}) + +/******************************************************************************* + * Thread support + ******************************************************************************/ + +/* ...thread handle definition */ +typedef pthread_t xf_thread_t; + +/* ...thread creation */ +static inline int __xf_thread_create(xf_thread_t *thread, void * (*f)(void *), void *arg) +{ + pthread_attr_t attr; + int r; + + /* ...initialize thread attributes - joinable with minimal stack */ + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); + + /* ...create proxy asynchronous thread managing SHMEM */ + r = -pthread_create(thread, &attr, f, arg); + + /* ...destroy thread attributes */ + pthread_attr_destroy(&attr); + + return r; +} + +/* ...terminate thread operation */ +static inline int __xf_thread_destroy(xf_thread_t *thread) +{ + void *r; + + /* ...tell the thread to terminate */ + pthread_kill(*thread,SIGUSR1); + + /* ...wait until thread terminates */ + pthread_join(*thread, &r); + + /* ...return final status */ + return (int)(intptr_t)r; +} diff --git a/hifi/xaf/host-apf/include/os/xos/xf-osal.h b/hifi/xaf/host-apf/include/os/xos/xf-osal.h new file mode 100644 index 00000000..c3468000 --- /dev/null +++ b/hifi/xaf/host-apf/include/os/xos/xf-osal.h @@ -0,0 +1,206 @@ +/******************************************************************************* +* 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-osal.h mustn't be included directly" +#endif + +/******************************************************************************* + * Includes + ******************************************************************************/ +#include "xos.h" + +/******************************************************************************* + * Tracing primitive + ******************************************************************************/ + +#define __xf_puts(str) \ + puts((str)) + +/******************************************************************************* + * Lock operation + ******************************************************************************/ + +/* ...lock definition */ +typedef XosMutex xf_lock_t; + +/* ...lock initialization */ +static inline void __xf_lock_init(xf_lock_t *lock) +{ + xos_mutex_create(lock, XOS_MUTEX_WAIT_PRIORITY, 0); +} + +/* ...lock acquisition */ +static inline void __xf_lock(xf_lock_t *lock) +{ + xos_mutex_lock(lock); +} + +/* ...lock release */ +static inline void __xf_unlock(xf_lock_t *lock) +{ + xos_mutex_unlock(lock); +} + +/******************************************************************************* + * Waiting object + ******************************************************************************/ + +#if 0 +/* ...waiting object handle */ +typedef struct __xf_wait +{ + /* ...conditional variable */ + pthread_cond_t wait; + + /* ...waiting mutex */ + pthread_mutex_t mutex; + +} xf_wait_t; + +/* ...initialize waiting object */ +static inline void __xf_wait_init(xf_wait_t *w) +{ + pthread_cond_init(&w->wait, NULL); + pthread_mutex_init(&w->mutex, NULL); +} + +/* ...prepare to waiting */ +static inline void __xf_wait_prepare(xf_wait_t *w) +{ + pthread_mutex_lock(&w->mutex); +} + +#define __xf_wait_prepare(w) \ +({ \ + TRACE(1, _x("prepare-wait")); \ + (__xf_wait_prepare)(w); \ +}) + +/* ...wait until event is signalled */ +static inline int __xf_wait(xf_wait_t *w, u32 timeout) +{ + struct timespec ts; + struct timeval tv; + int r; + + /* ...wait with or without timeout (communication mutex is taken) */ + if (!timeout) + { + r = -pthread_cond_wait(&w->wait, &w->mutex); + } + else + { + /* ...get current time */ + gettimeofday(&tv, NULL); + + /* ...set absolute timeout */ + ts.tv_sec = tv.tv_sec + timeout / 1000; + ts.tv_nsec = tv.tv_usec * 1000 + (timeout % 1000) * 1000000; + (ts.tv_nsec >= 1000000000 ? ts.tv_sec++, ts.tv_nsec -= 1000000000 : 0); + + /* ...wait conditionally with absolute timeout*/ + r = -pthread_cond_timedwait(&w->wait, &w->mutex, &ts); + } + + /* ...leave with communication mutex taken */ + return r; +} + +#define __xf_wait(w, timeout) \ +({ \ + int __r; \ + TRACE(1, _x("wait")); \ + __r = (__xf_wait)(w, timeout); \ + TRACE(1, _x("resume")); \ + __r; \ +}) + +/* ...wake up waiting handle */ +static inline void __xf_wakeup(xf_wait_t *w) +{ + /* ...take communication mutex before signaling */ + pthread_mutex_lock(&w->mutex); + + /* ...signalling will resume waiting thread */ + pthread_cond_signal(&w->wait); + + /* ...assure that waiting task will not resume until we say this - is that really needed? - tbd */ + pthread_mutex_unlock(&w->mutex); +} + +#define __xf_wakeup(w) \ +({ \ + TRACE(1, _x("wakeup")); \ + (__xf_wakeup)(w); \ +}) + +/* ...complete waiting operation */ +static inline void __xf_wait_complete(xf_wait_t *w) +{ + pthread_mutex_unlock(&w->mutex); +} + +#define __xf_wait_complete(w) \ +({ \ + TRACE(1, _x("wait-complete")); \ + (__xf_wait_complete)(w); \ +}) +#endif + +/******************************************************************************* + * Thread support + ******************************************************************************/ + +/* ...thread handle definition */ +typedef XosThread xf_thread_t; +typedef XosThreadFunc xf_entry_t; + +/* ...thread creation */ +static inline int __xf_thread_create(xf_thread_t *thread, xf_entry_t *f, + void *arg, const char *name, void * stack, + unsigned int stack_size, int priority) +{ + int r; + + /* ...create proxy asynchronous thread managing SHMEM */ + r = xos_thread_create(thread, 0, f, arg, name, stack, stack_size, priority, 0, 0); + + return r; +} + +/* ...terminate thread operation */ +static inline int __xf_thread_destroy(xf_thread_t *thread) +{ + int r; + + /* ...wait until thread terminates */ + /* v-tbd - avoid infinite wait for join */ + //xos_thread_join(thread, &r); + + /* ...delete thread, free up TCB, stack */ + r = xos_thread_delete(thread); + + /* ...return final status */ + return r; +} + diff --git a/hifi/xaf/host-apf/include/sys/fio/xf-config.h b/hifi/xaf/host-apf/include/sys/fio/xf-config.h new file mode 100644 index 00000000..2e1d4c61 --- /dev/null +++ b/hifi/xaf/host-apf/include/sys/fio/xf-config.h @@ -0,0 +1,36 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ + +/* ...number of DSP cores */ +#define XF_CFG_CORES_NUM 4 + +/* ...maximal number of clients supported by proxy */ +#define XF_CFG_PROXY_MAX_CLIENTS 256 + +/* ...size of the shared memory pool (in bytes) */ +#define XF_CFG_REMOTE_IPC_POOL_SIZE (256 << 10) + +/* ...size of the component(DSP) local memory pool (in bytes) */ +#define XF_CFG_LOCAL_POOL_SIZE (1024<< 10) + +/* ...alignment for shared buffers */ +#define XF_PROXY_ALIGNMENT 64 diff --git a/hifi/xaf/host-apf/include/sys/fio/xf-hal.h b/hifi/xaf/host-apf/include/sys/fio/xf-hal.h new file mode 100644 index 00000000..15a82b03 --- /dev/null +++ b/hifi/xaf/host-apf/include/sys/fio/xf-hal.h @@ -0,0 +1,34 @@ +/******************************************************************************* +* 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-hal.h mustn't be included directly" +#endif + +/******************************************************************************* + * Includes + ******************************************************************************/ + +/* ...primitive types */ +#include "xf-types.h" + +/* ...anything else? - tbd */ diff --git a/hifi/xaf/host-apf/include/sys/fio/xf-ipc.h b/hifi/xaf/host-apf/include/sys/fio/xf-ipc.h new file mode 100644 index 00000000..2ee859a8 --- /dev/null +++ b/hifi/xaf/host-apf/include/sys/fio/xf-ipc.h @@ -0,0 +1,127 @@ +/******************************************************************************* +* 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); diff --git a/hifi/xaf/host-apf/include/sys/fio/xf-runtime.h b/hifi/xaf/host-apf/include/sys/fio/xf-runtime.h new file mode 100644 index 00000000..9cad95f4 --- /dev/null +++ b/hifi/xaf/host-apf/include/sys/fio/xf-runtime.h @@ -0,0 +1,35 @@ +/******************************************************************************* +* 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-runtime.h mustn't be included directly" +#endif + +/******************************************************************************* + * Includes + ******************************************************************************/ + +/* ...platform HAL layer */ +#include "xf-hal.h" + +/* ...OS abstraction layer */ +#include "xf-osal.h" diff --git a/hifi/xaf/host-apf/include/sys/fio/xf-types.h b/hifi/xaf/host-apf/include/sys/fio/xf-types.h new file mode 100644 index 00000000..a610c8e1 --- /dev/null +++ b/hifi/xaf/host-apf/include/sys/fio/xf-types.h @@ -0,0 +1,88 @@ +/******************************************************************************* +* 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-types.h mustn't be included directly" +#endif + +/******************************************************************************* + * Standard includes + ******************************************************************************/ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include <stdarg.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <assert.h> +#include <errno.h> + +#include <unistd.h> +#include <fcntl.h> +#include <pthread.h> +#include <signal.h> +#include <limits.h> +#include <sys/mman.h> +#include <sys/ioctl.h> +#include <sys/time.h> + +/******************************************************************************* + * Primitive types + ******************************************************************************/ + +typedef uint32_t u32; +typedef int32_t s32; +typedef uint16_t u16; +typedef int16_t s16; +typedef uint8_t u8; +typedef int8_t s8; + +/******************************************************************************* + * Macros definitions + ******************************************************************************/ + +/* ...NULL-address specification */ +#define XF_PROXY_NULL (~0U) + +/* ...invalid proxy address */ +#define XF_PROXY_BADADDR XF_CFG_REMOTE_IPC_POOL_SIZE + +/******************************************************************************* + * Auxiliary helpers + ******************************************************************************/ + +/* ...next power-of-two calculation */ +#define xf_next_power_of_two(v) __xf_power_of_two_1((v) - 1) +#define __xf_power_of_two_1(v) __xf_power_of_two_2((v) | ((v) >> 1)) +#define __xf_power_of_two_2(v) __xf_power_of_two_3((v) | ((v) >> 2)) +#define __xf_power_of_two_3(v) __xf_power_of_two_4((v) | ((v) >> 4)) +#define __xf_power_of_two_4(v) __xf_power_of_two_5((v) | ((v) >> 8)) +#define __xf_power_of_two_5(v) __xf_power_of_two_6((v) | ((v) >> 16)) +#define __xf_power_of_two_6(v) ((v) + 1) + +/* ...check if non-zero value is a power-of-two */ +#define xf_is_power_of_two(v) (((v) & ((v) - 1)) == 0) + diff --git a/hifi/xaf/host-apf/include/xaf-api.h b/hifi/xaf/host-apf/include/xaf-api.h new file mode 100644 index 00000000..5cebb430 --- /dev/null +++ b/hifi/xaf/host-apf/include/xaf-api.h @@ -0,0 +1,139 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ + + +/* ...number of max input buffers */ +#define XAF_MAX_INBUFS 2 +#define XAF_INBUF_SIZE 8192 + +typedef enum { + XAF_DECODER = 0, + XAF_ENCODER = 1, + XAF_MIXER = 2, + XAF_PRE_PROC = 3, + XAF_POST_PROC = 4, +} xaf_comp_type; + +typedef enum { + XAF_STARTING = 0, + XAF_INIT_DONE = 1, + XAF_NEED_INPUT = 2, + XAF_OUTPUT_READY = 3, + XAF_EXEC_DONE = 4, +} xaf_comp_status; + +typedef enum { + XAF_START_FLAG = 1, + XAF_EXEC_FLAG = 2, + XAF_INPUT_OVER_FLAG = 3, + XAF_INPUT_READY_FLAG = 4, + XAF_NEED_OUTPUT_FLAG = 5, +} xaf_comp_flag; + +typedef enum { + XAF_NO_ERROR = 0, + XAF_PTR_ERROR = -1, + XAF_INVALID_VALUE = -2, + XAF_ROUTING_ERROR = -3, + /*XAF_XOS_ERROR = -4,*/ + XAF_API_ERR = -5, +} XAF_ERR_CODE; + +typedef enum { + XAF_MEM_ID_DEV = 0, + XAF_MEM_ID_COMP = 1, +} XAF_MEM_ID; + +/* structure for component memory sizes */ +typedef struct xaf_mem_size_s{ + u32 persist; + u32 scratch; + u32 input; + u32 output; +}xaf_mem_size_t; + +/* structure for host-side utility handles */ +typedef struct xaf_ap_utils_s{ + int xf_cfg_remote_ipc_pool_size; + xaf_mem_size_t mem_size; +}xaf_ap_utils_t; + +typedef struct xaf_format_s { + u32 sample_rate; + u32 channels; + u32 pcm_width; + u32 input_length; + u32 output_length; +} xaf_format_t; + +#ifndef XAF_HOSTLESS +typedef struct xaf_info_s { + void * buf; + u32 length; +} xaf_info_t; +#endif + +XAF_ERR_CODE xaf_adev_open(void **pp_adev, s32 audio_frmwk_buf_size, s32 audio_comp_buf_size, xaf_mem_malloc_fxn_t mm_malloc, xaf_mem_free_fxn_t mm_free); +XAF_ERR_CODE xaf_adev_close(void *adev_ptr, xaf_comp_flag flag); + +XAF_ERR_CODE xaf_comp_create(void* p_adev, void **p_comp, xf_id_t comp_id, u32 ninbuf, u32 noutbuf, void *pp_inbuf[], xaf_comp_type comp_type); +XAF_ERR_CODE xaf_comp_delete(void* p_comp); +XAF_ERR_CODE xaf_comp_set_config(void *p_comp, s32 num_param, s32 *p_param); +XAF_ERR_CODE xaf_comp_get_config(void *p_comp, s32 num_param, s32 *p_param); +XAF_ERR_CODE xaf_comp_process(void *p_adev, void *p_comp, void *p_buf, u32 length, xaf_comp_flag flag); +XAF_ERR_CODE xaf_connect(void *p_src, void *p_dest, s32 num_buf); + +/* Not available in this version yet. +XAF_ERR_CODE xaf_disconnect(xaf_comp_t *p_comp); +*/ + +XAF_ERR_CODE xaf_comp_get_status(void *p_adev, void *p_comp, xaf_comp_status *p_status, xaf_info_t *p_info); + +/* ...check null pointer */ +#define XAF_CHK_PTR(ptr) \ +({ \ + int __ret; \ + \ + if ((__ret = (int)(ptr)) == 0) \ + { \ + TRACE(ERROR, _x("Null pointer error: %d"), __ret); \ + return XAF_PTR_ERROR; \ + } \ + __ret; \ +}) + +/* ...check range */ +#define XAF_CHK_RANGE(val, min, max) \ +({ \ + int __ret = val; \ + \ + if ((__ret < (int)min) || (__ret > (int)max)) \ + { \ + TRACE(ERROR, _x("Invalid value: %d"), __ret); \ + return XAF_INVALID_VALUE; \ + } \ + __ret; \ +}) + + + + diff --git a/hifi/xaf/host-apf/include/xaf-structs.h b/hifi/xaf/host-apf/include/xaf-structs.h new file mode 100644 index 00000000..f632600a --- /dev/null +++ b/hifi/xaf/host-apf/include/xaf-structs.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ + +/* ...size of auxiliary pool for communication with HiFi */ +#define XAF_AUX_POOL_SIZE 32 + +/* ...length of auxiliary pool messages */ +#define XAF_AUX_POOL_MSG_LENGTH 128 +#define XAF_MAX_CONFIG_PARAMS (XAF_AUX_POOL_MSG_LENGTH >> 3) + +typedef struct xaf_comp xaf_comp_t; + +struct xaf_comp { + xf_handle_t handle; + + u32 inp_routed; + u32 out_routed; + u32 inp_ports; + u32 out_ports; + u32 init_done; + u32 pending_resp; + u32 expect_out_cmd; + u32 input_over; + + xaf_comp_type comp_type; + xaf_comp_status comp_status; + u32 start_cmd_issued; + u32 exec_cmd_issued; + void *start_buf; + + xaf_format_t inp_format; + xaf_format_t out_format; + + xf_pool_t *inpool; + xf_pool_t *outpool; + u32 noutbuf; + + xaf_comp_t *next; + + u32 ninbuf; + void *p_adev; + //xaf_comp_state comp_state; + void *comp_ptr; +}; + +typedef struct xaf_adev_s { + xf_proxy_t proxy; + xaf_comp_t *comp_chain; + + u32 n_comp; + void *adev_ptr; + void *p_dspMem; + void *p_apMem; + void *p_dspLocalBuff; + void *p_apSharedMem; + + xaf_ap_utils_t *p_ap_utils; //host-side utility structure handle + void *(*pxf_mem_malloc_fxn)(s32, s32); + void (*pxf_mem_free_fxn)(void *,s32); + //xaf_adev_state adev_state; + +} xaf_adev_t; + diff --git a/hifi/xaf/host-apf/include/xf-debug.h b/hifi/xaf/host-apf/include/xf-debug.h new file mode 100644 index 00000000..83172302 --- /dev/null +++ b/hifi/xaf/host-apf/include/xf-debug.h @@ -0,0 +1,194 @@ +/******************************************************************************* +* 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-debug.h mustn't be included directly" +#endif + +/******************************************************************************* + * Auxiliary macros (put into "xf-types.h"?) + ******************************************************************************/ + +#ifndef offset_of +#define offset_of(type, member) \ + ((int)(intptr_t)&(((const type *)(0))->member)) +#endif + +#ifndef container_of +#define container_of(ptr, type, member) \ + ((type *)((void *)(ptr) - offset_of(type, member))) +#endif + +/******************************************************************************* + * Bug check for constant conditions (file scope) + ******************************************************************************/ + +#define __C_BUG(n) __C_BUG2(n) +#define __C_BUG2(n) __c_bug_##n +#define C_BUG(expr) typedef char __C_BUG(__LINE__)[(expr) ? -1 : 1] + +/******************************************************************************* + * Compilation-time types control + ******************************************************************************/ + +#if XF_DEBUG +#define __C_TYPE_CONTROL(d, type) ((void) ((d) != (type*) 0)) +#else +#define __C_TYPE_CONTROL(d, type) ((void) 0) +#endif + +/******************************************************************************* + * Unused variable + ******************************************************************************/ + +#define C_UNUSED(v) (void)(0 ? (v) = (v), 1 : 0) + +/******************************************************************************* + * Auxiliary macros + ******************************************************************************/ + +/* ...define a stub for unused declarator */ +#define __xf_stub(tag, line) __xf_stub2(tag, line) +#define __xf_stub2(tag, line) typedef int __xf_##tag##_##line + +/* ...convert anything into string */ +#define __xf_string(x) __xf_string2(x) +#define __xf_string2(x) #x + +/******************************************************************************* + * Tracing facility + ******************************************************************************/ + +#if XF_TRACE + +/* ...tracing to communication processor */ +extern int xf_trace(const char *format, ...); + +/* ...tracing facility initialization */ +extern void xf_trace_init(const char *banner); + +/* ...initialize tracing facility */ +#define TRACE_INIT(banner) (xf_trace_init(banner)) + +/* ...trace tag definition */ +#define TRACE_TAG(tag, on) enum { __xf_trace_##tag = on } + +/* ...check if the trace tag is enabled */ +#define TRACE_CFG(tag) (__xf_trace_##tag) + +/* ...tagged tracing primitive */ +#define TRACE(tag, fmt, ...) (void)(__xf_trace_##tag ? __xf_trace(tag, __xf_format##fmt, ## __VA_ARGS__), 1 : 0) + +/******************************************************************************* + * Tagged tracing formats + ******************************************************************************/ + +/* ...tracing primitive */ +#define __xf_trace(tag, fmt, ...) \ + ({ __attribute__((unused)) const char *__xf_tag = #tag; xf_trace(fmt, ## __VA_ARGS__); }) + +/* ...just a format string */ +#define __xf_format_n(fmt) fmt + +/* ...module tag and trace tag shown */ +#define __xf_format_b(fmt) "[%s.%s] " fmt, __xf_string(MODULE_TAG), __xf_tag + +/* ...module tag, trace tag, file name and line shown */ +#define __xf_format_x(fmt) "[%s.%s] - %s@%d - " fmt, __xf_string(MODULE_TAG), __xf_tag, __FILE__, __LINE__ + +/******************************************************************************* + * Globally defined tags + ******************************************************************************/ + +/* ...unconditionally OFF */ +TRACE_TAG(0, 0); + +/* ...unconditionally ON */ +TRACE_TAG(1, 1); + +/* ...error output - on by default */ +TRACE_TAG(ERROR, 1); + +#else + +#define TRACE_INIT(banner) (void)0 +#define TRACE_TAG(tag, on) __xf_stub(trace_##tag, __LINE__) +#define TRACE(tag, fmt, ...) (void)0 +#define __xf_trace(tag, fmt, ...) (void)0 + +#endif /* XF_TRACE */ + +/******************************************************************************* + * Bugchecks + ******************************************************************************/ + +#if XF_DEBUG + +/* ...run-time bugcheck */ +#define BUG(cond, fmt, ...) \ +do \ +{ \ + if (cond) \ + { \ + /* ...output message */ \ + __xf_trace(BUG, __xf_format##fmt, ## __VA_ARGS__); \ + \ + /* ...and die */ \ + abort(); \ + } \ +} \ +while (0) + +#else +#define BUG(cond, fmt, ...) (void)0 +#endif /* XF_DEBUG */ + +/******************************************************************************* + * Run-time error processing + ******************************************************************************/ + +/* ...check the API call succeeds */ +#define XF_CHK_API(cond) \ +({ \ + int __ret; \ + \ + if ((__ret = (int)(cond)) < 0) \ + { \ + TRACE(ERROR, _x("API error: %d"), __ret); \ + return __ret; \ + } \ + __ret; \ +}) + +/* ...check the condition is true */ +#define XF_CHK_ERR(cond, error) \ +({ \ + intptr_t __ret; \ + \ + if (!(__ret = (intptr_t)(cond))) \ + { \ + TRACE(ERROR, _x("check failed")); \ + return (error); \ + } \ + (int)__ret; \ +}) + diff --git a/hifi/xaf/host-apf/include/xf-opcode.h b/hifi/xaf/host-apf/include/xf-opcode.h new file mode 100644 index 00000000..f585f5c2 --- /dev/null +++ b/hifi/xaf/host-apf/include/xf-opcode.h @@ -0,0 +1,297 @@ +/******************************************************************************* +* 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-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) + +/******************************************************************************* + * 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) */ + u8 data[0]; + +} __attribute__ ((__packed__)) xf_ext_param_msg_t; + +/* ...access macros */ + +#define xf_ext_param_first(e) \ + (&(e)->desc) + +#define xf_ext_param_next(d) \ + (xf_ext_param_desc_t *)(((xf_ext_param_msg_t *)(d))->data + (((d)->length + 3) & ~3)) + +#define xf_ext_param_length(e, d) \ + ((u32)((u8 *)(d) - (u8 *)(ext))) + +#define xf_ext_param_data(d, t) \ + ((t *)&(d)[1]) + +#define xf_ext_param_setup(d, i, t, s) \ + ((d)->id = (i), (d)->length = (s), xf_ext_param_data(d, 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; diff --git a/hifi/xaf/host-apf/include/xf-proto.h b/hifi/xaf/host-apf/include/xf-proto.h new file mode 100644 index 00000000..095e353a --- /dev/null +++ b/hifi/xaf/host-apf/include/xf-proto.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* 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-proto.h mustn't be included directly" +#endif + +/******************************************************************************* + * Forward types declarations + ******************************************************************************/ + +/* ...component string identifier */ +typedef const char *xf_id_t; + +/* ...handle to proxy data */ +typedef struct xf_proxy xf_proxy_t; + +/* ...handle to component data */ +typedef struct xf_handle xf_handle_t; + +/* ...buffer pool */ +typedef struct xf_pool xf_pool_t; + +/* ...individual buffer from pool */ +typedef struct xf_buffer xf_buffer_t; + +/* ...buffer pool type */ +typedef u32 xf_pool_type_t; + +/* ...user-message */ +typedef struct xf_user_msg xf_user_msg_t; + +/* ...proxy-message */ +typedef struct xf_proxy_msg xf_proxy_msg_t; + +/* ...response callback */ +typedef void (*xf_response_cb)(xf_handle_t *h, xf_user_msg_t *msg); + +typedef void* xaf_mem_malloc_fxn_t(s32 size, s32 id); +typedef void xaf_mem_free_fxn_t(void* ptr, s32 id); + +/******************************************************************************* + * High-level API functions + ******************************************************************************/ + +/* ...component operations */ +extern int xf_open(xf_proxy_t *proxy, xf_handle_t *handle, xf_id_t id, u32 core, xf_response_cb cb); +extern void xf_close(xf_handle_t *handle); +extern int xf_command(xf_handle_t *handle, u32 dst, u32 opcode, void *buf, u32 length); +extern int xf_route(xf_handle_t *src, u32 s_port, xf_handle_t *dst, u32 d_port, u32 num, u32 size, u32 align); +extern int xf_unroute(xf_handle_t *src, u32 s_port); + +/* ...shared buffers operations */ +extern int xf_pool_alloc(xf_proxy_t *proxy, u32 number, u32 length, xf_pool_type_t type, xf_pool_t **pool, s32 id, + xaf_mem_malloc_fxn_t, xaf_mem_free_fxn_t); +extern void xf_pool_free(xf_pool_t *pool, s32 id, xaf_mem_free_fxn_t); +extern xf_buffer_t * xf_buffer_get(xf_pool_t *pool); +extern void xf_buffer_put(xf_buffer_t *buffer); + +/* ...proxy operations */ +extern int xf_proxy_init(xf_proxy_t *proxy, u32 core, void *p_shmem); +extern void xf_proxy_close(xf_proxy_t *proxy); + diff --git a/hifi/xaf/host-apf/include/xf-proxy.h b/hifi/xaf/host-apf/include/xf-proxy.h new file mode 100644 index 00000000..90d70793 --- /dev/null +++ b/hifi/xaf/host-apf/include/xf-proxy.h @@ -0,0 +1,297 @@ +/******************************************************************************* +* 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-proxy.h mustn't be included directly" +#endif + +/******************************************************************************* + * User-message description - move from here to API - tbd + ******************************************************************************/ + +/* ...need that at all? hope no */ +struct xf_user_msg +{ + /* ...source component specification */ + u32 id; + + /* ...message opcode */ + u32 opcode; + + /* ...buffer length */ + u32 length; + + /* ...buffer pointer */ + void *buffer; +}; + +/* ...proxy message - bad placing of that thing here - tbd */ +struct xf_proxy_msg +{ + /* ...session-id field */ + uint32_t id; + + /* ...message opcode */ + uint32_t opcode; + + /* ...buffer length */ + uint32_t length; + + /* ...buffer pointer */ + uint64_t address; + uint64_t v_address; + +} __attribute__((__packed__)); + +typedef struct xf_proxy_msg_driv +{ + /* ...session ID */ + uint32_t id; + + /* ...proxy API command/reponse code */ + uint32_t opcode; + + /* ...length of attached buffer */ + uint32_t length; + + /* ...physical address of message buffer */ + uint64_t address; + uint64_t v_address; + +}__attribute__((__packed__)) xf_proxy_message_driv_t; +/******************************************************************************* + * Buffer pools + ******************************************************************************/ + +/* ...buffer pool type */ +enum xf_pool_type +{ + XF_POOL_AUX = 0, + XF_POOL_INPUT = 1, + XF_POOL_OUTPUT = 2 +}; + +/* ...buffer link pointer */ +typedef union xf_buffer_link +{ + /* ...pointer to next free buffer in a pool (for free buffer) */ + xf_buffer_t *next; + + /* ...reference to a buffer pool (for allocated buffer) */ + xf_pool_t *pool; + +} xf_buffer_link_t; + +/* ...buffer descriptor */ +struct xf_buffer +{ + /* ...virtual address of contiguous buffer */ + void *address; + + /* ...link pointer */ + xf_buffer_link_t link; +}; + +/* ...buffer pool */ +struct xf_pool +{ + /* ...reference to proxy data */ + xf_proxy_t *proxy; + + /* ...length of individual buffer in a pool */ + u32 length; + + /* ...number of buffers in a pool */ + u32 number; + + /* ...pointer to pool memory */ + void *p; + + /* ...pointer to first free buffer in a pool */ + xf_buffer_t *free; + + /* ...individual buffers */ + xf_buffer_t buffer[0]; +}; + +/* ...accessor to buffer data */ +static inline void * xf_buffer_data(xf_buffer_t *buffer) +{ + return buffer->address; +} + +/* ...length of buffer data */ +static inline size_t xf_buffer_length(xf_buffer_t *buffer) +{ + return buffer->link.pool->length; +} + +/******************************************************************************* + * Proxy handle definition + ******************************************************************************/ + +/* ...free clients list */ +typedef union xf_proxy_cmap_link +{ + /* ...index of next free client in the list */ + u32 next; + + /* ...pointer to allocated component handle */ + xf_handle_t *handle; + +} xf_proxy_cmap_link_t; + +/* ...proxy data structure */ +struct xf_proxy +{ + /* ...platform-specific IPC data */ + xf_proxy_ipc_data_t ipc; + + /* ...auxiliary buffer pool for clients */ + xf_pool_t *aux; + + /* ...global proxy lock */ + xf_lock_t lock; + + /* ...proxy thread handle */ + xf_thread_t thread; + + /* ...proxy identifier (core of remote DSP hosting SHMEM interface) */ + u32 core; + + /* ...client association map */ + xf_proxy_cmap_link_t cmap[XF_CFG_PROXY_MAX_CLIENTS]; +}; + +/******************************************************************************* + * Auxiliary proxy helpers + ******************************************************************************/ + +/* ...get proxy identifier */ +static inline u32 xf_proxy_id(xf_proxy_t *proxy) +{ + return proxy->core; +} + +/* ...lock proxy data */ +static inline void xf_proxy_lock(xf_proxy_t *proxy) +{ + __xf_lock(&proxy->lock); +} + +/* ...unlock proxy data */ +static inline void xf_proxy_unlock(xf_proxy_t *proxy) +{ + __xf_unlock(&proxy->lock); +} + +/* ...translate proxy shared address into local virtual address */ +static inline void * xf_proxy_a2b(xf_proxy_t *proxy, u32 address) +{ + return xf_ipc_a2b(&proxy->ipc, address); +} + +/* ...translate local virtual address into shared proxy address */ +static inline u32 xf_proxy_b2a(xf_proxy_t *proxy, void *b) +{ + return xf_ipc_b2a(&proxy->ipc, b); +} + +/* ...submit asynchronous response message */ +static inline int xf_proxy_response_put(xf_proxy_t *proxy, xf_proxy_msg_t *msg) +{ + return xf_proxy_ipc_response_put(&proxy->ipc, msg); +} + +/* ...retrieve asynchronous response message */ +static inline int xf_proxy_response_get(xf_proxy_t *proxy, xf_proxy_msg_t *msg) +{ + return xf_proxy_ipc_response_get(&proxy->ipc, msg); +} + +/******************************************************************************* + * Component handle definition + ******************************************************************************/ + +struct xf_handle +{ + /* ...platform-specific IPC data */ + xf_ipc_data_t ipc; + + /* ...reference to proxy data */ + xf_proxy_t *proxy; + + /* ...component lock */ + xf_lock_t lock; + + /* ...auxiliary control buffer for control transactions */ + xf_buffer_t *aux; + + /* ...global client-id of the component */ + u32 id; + + /* ...local client number (think about merging into "id" field - tbd) */ + u32 client; + + /* ...response processing hook */ + xf_response_cb response; +}; + +/******************************************************************************* + * Auxiliary component helpers + ******************************************************************************/ + +/* ...component client-id (global scope) */ +static inline u32 xf_handle_id(xf_handle_t *handle) +{ + return handle->id; +} + +/* ...pointer to auxiliary buffer */ +static inline void * xf_handle_aux(xf_handle_t *handle) +{ + return xf_buffer_data(handle->aux); +} + +/* ...acquire component lock */ +static inline void xf_lock(xf_handle_t *handle) +{ + __xf_lock(&handle->lock); +} + +/* ...release component lock */ +static inline void xf_unlock(xf_handle_t *handle) +{ + __xf_unlock(&handle->lock); +} + +/* ...put asynchronous response into local IPC */ +static inline int xf_response_put(xf_handle_t *handle, xf_user_msg_t *msg) +{ + return xf_ipc_response_put(&handle->ipc, msg); +} + +/* ...get asynchronous response from local IPC */ +static inline int xf_response_get(xf_handle_t *handle, xf_user_msg_t *msg) +{ + return xf_ipc_response_get(&handle->ipc, msg); +} diff --git a/hifi/xaf/host-apf/include/xf.h b/hifi/xaf/host-apf/include/xf.h new file mode 100644 index 00000000..6af69ce6 --- /dev/null +++ b/hifi/xaf/host-apf/include/xf.h @@ -0,0 +1,53 @@ +/******************************************************************************* +* 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. + +******************************************************************************/ + +#ifdef __XF_H +#error "xf.h included more than once" +#endif + +#define __XF_H + +/******************************************************************************* + * Common runtime framework + ******************************************************************************/ + +/* ...target configuration */ +#include "xf-config.h" + +/* ...platform run-time */ +#include "xf-runtime.h" + +/* ...debugging facility */ +#include "xf-debug.h" + +/* ...API prototypes */ +#include "xf-proto.h" + +/* ...standard opcodes */ +#include "xf-opcode.h" + +/* ...platform-specific IPC layer */ +#include "xf-ipc.h" + +/* ...proxy definitions */ +#include "xf-proxy.h" + |