summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiranjan Yadla <nyadla@cadence.com>2018-04-19 12:19:27 -0700
committerDmitry Shmidt <dimitrysh@google.com>2018-04-27 16:36:23 -0700
commit19336afbcf7d20b343bb00d72e296c35b705c1e7 (patch)
tree3b3069077f4c49674970f840d5e26d16cbed0397
parentcee816e32fc82873448deb962a79944ef066d011 (diff)
downloadhikey-19336afbcf7d20b343bb00d72e296c35b705c1e7.tar.gz
hikey960: HiFi3 DSP firmware and documentationandroid-wear-p-preview-2android-o-mr1-iot-release-1.0.0
HiFi3 DSP firmware source code, documentation to build and understand DSP Change-Id: I752416536cc2165868c56d2a2ba2d60b71c2b9a4 Signed-off-by: Niranjan Yadla <nyadla@cadence.com>
-rwxr-xr-xhifi/xaf/README39
-rwxr-xr-xhifi/xaf/config/hifi3_hikey960_linux.tgzbin0 -> 23977955 bytes
-rwxr-xr-xhifi/xaf/config/hifi3_hikey960_win32.tgzbin0 -> 21077520 bytes
-rwxr-xr-xhifi/xaf/docs/HiFi-AF-Hosted-ProgrammersGuide.pdfbin0 -> 1447614 bytes
-rwxr-xr-xhifi/xaf/docs/HiFi-Audio-Codec-API-Definition.pdfbin0 -> 765944 bytes
-rwxr-xr-xhifi/xaf/docs/HiFi-Speech-Codec-API-Definition.pdfbin0 -> 620160 bytes
-rwxr-xr-xhifi/xaf/docs/HiKey960-HiFi3-Android-SDK-Guide.pdfbin0 -> 369215 bytes
-rwxr-xr-xhifi/xaf/docs/Hosted_XAF_Arch_v0.7.pdfbin0 -> 339183 bytes
-rw-r--r--hifi/xaf/hifi-dpf/app/xa-factory.c163
-rw-r--r--hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c785
-rw-r--r--hifi/xaf/hifi-dpf/audio/xa-class-base.c537
-rw-r--r--hifi/xaf/hifi-dpf/audio/xa-class-base.h263
-rw-r--r--hifi/xaf/hifi-dpf/audio/xa-class-mixer.c870
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/Makefile135
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/common.mk156
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.x827
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xbn827
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xn827
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xr42
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xu42
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/memmap.xmm49
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/min-rt.parm15
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/specs22
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/tag3
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/user.parm0
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/map_hikey.txt2167
-rwxr-xr-xhifi/xaf/hifi-dpf/build_hikey/tools/elftobin.sh94
-rw-r--r--hifi/xaf/hifi-dpf/build_hikey/xa_hikey.imgbin0 -> 110396 bytes
-rw-r--r--hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub-entry.S198
-rw-r--r--hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub.c756
-rw-r--r--hifi/xaf/hifi-dpf/core/util/gdbstub/xtensa-defs.h37
-rw-r--r--hifi/xaf/hifi-dpf/core/util/mutex.c156
-rw-r--r--hifi/xaf/hifi-dpf/core/util/rbtree.c842
-rw-r--r--hifi/xaf/hifi-dpf/core/util/tinyvprintf.c198
-rw-r--r--hifi/xaf/hifi-dpf/core/xf-core.c709
-rw-r--r--hifi/xaf/hifi-dpf/core/xf-io.c644
-rw-r--r--hifi/xaf/hifi-dpf/core/xf-isr.c68
-rw-r--r--hifi/xaf/hifi-dpf/core/xf-mem.c361
-rw-r--r--hifi/xaf/hifi-dpf/core/xf-msg.c107
-rw-r--r--hifi/xaf/hifi-dpf/core/xf-sched.c153
-rw-r--r--hifi/xaf/hifi-dpf/core/xf-shmem.c350
-rw-r--r--hifi/xaf/hifi-dpf/include/audio/xa-audio-decoder-api.h66
-rw-r--r--hifi/xaf/hifi-dpf/include/audio/xa-mixer-api.h157
-rw-r--r--hifi/xaf/hifi-dpf/include/audio/xa_apicmd_standards.h107
-rw-r--r--hifi/xaf/hifi-dpf/include/audio/xa_error_standards.h79
-rw-r--r--hifi/xaf/hifi-dpf/include/audio/xa_memory_standards.h104
-rw-r--r--hifi/xaf/hifi-dpf/include/audio/xa_type_def.h98
-rw-r--r--hifi/xaf/hifi-dpf/include/lib/mutex.h59
-rw-r--r--hifi/xaf/hifi-dpf/include/lib/rbtree.h157
-rw-r--r--hifi/xaf/hifi-dpf/include/lib/tinyput.h31
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/arch_hifi330.h134
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/cpu_c.h109
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_comm.h45
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_debug.h71
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_ipc.h61
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_mailbox.h170
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_memory_config.h96
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_pcm_gain.h37
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/reset.h62
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/xf-board.h180
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-config.h63
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-hal.h151
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-ipc.h345
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-mem.h180
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-runtime.h81
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h173
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-sys.h75
-rw-r--r--hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-types.h55
-rw-r--r--hifi/xaf/hifi-dpf/include/xa_profiler.h156
-rw-r--r--hifi/xaf/hifi-dpf/include/xa_timer.h111
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-component.h91
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-core.h150
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-debug.h216
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-io.h298
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-mm.h142
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-msg.h252
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-opcode.h290
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-plugin.h48
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-proxy.h101
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-sched.h98
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-timebase.h132
-rw-r--r--hifi/xaf/hifi-dpf/include/xf-trace.h82
-rw-r--r--hifi/xaf/hifi-dpf/include/xf.h112
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/arch_hifi330.S468
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/cpu_c.c152
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_comm.c75
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_debug.c468
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/int_vector.S830
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S460
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c189
-rw-r--r--hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c669
-rw-r--r--hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm-api.h145
-rw-r--r--hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c841
-rw-r--r--hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.abin0 -> 124410 bytes
-rw-r--r--hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/xa-vorbis-decoder.c84
-rw-r--r--hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/xa_vorbis_dec_api.h121
-rwxr-xr-xhifi/xaf/release.txt24
97 files changed, 22193 insertions, 0 deletions
diff --git a/hifi/xaf/README b/hifi/xaf/README
new file mode 100755
index 00000000..9c835768
--- /dev/null
+++ b/hifi/xaf/README
@@ -0,0 +1,39 @@
+
+.
+|--- README
+|   - This file
+|  
+|--- release.txt
+|   - Release notes
+|  
+|--- config
+| |  
+|   |--- hifi3_hikey960_linux.tgz
+| |   - HiKey960 HiFi3 LX6 config with SW upgraded to RG.5 tools for Linux
+| |  
+|   |-- hifi3_hikey960_win32.tgz
+|   - HiKey960 HiFi3 LX6 config with SW upgraded to RG.5 tools for Windows
+|  
+|--- docs
+| |  
+|   |--- HiFi-AF-Hosted-ProgrammersGuide.pdf
+| |   - Xtensa Audio Framework (Hosted) Programmers Guide, v0.6
+| |  
+|   |--- HiFi-Audio-Codec-API-Definition.pdf
+| |   - HiFi Audio Codec API Definition, v1.0
+| |  
+|   |--- HiFi-Speech-Codec-API-Definition.pdf
+| |   - HiFi Speech Codec API Definition, v1.0
+| |  
+|   |-- HiKey960-HiFi3-Android-SDK-Guide.pdf
+|   - HiKey960-HiFi3-Android-SDK Guide, v0.7
+|  
+|--- xaf-dsp-v0.7_Alpha.tgz
+|   - XAF DSP Firmware Source Code(hifi-dpf)
+|  
+|-- xaf-host-v0.7_Alpha.tgz
+| - XAF Host application Source Code(host-apf)
+|
+|-- Get xtensa tools and guide to install xtensa tools,HiKey960 HiFi3 LX6 config
+| -https://www.tensilicatools.com/platform/huawei-kirin-960/
+|
diff --git a/hifi/xaf/config/hifi3_hikey960_linux.tgz b/hifi/xaf/config/hifi3_hikey960_linux.tgz
new file mode 100755
index 00000000..81152190
--- /dev/null
+++ b/hifi/xaf/config/hifi3_hikey960_linux.tgz
Binary files differ
diff --git a/hifi/xaf/config/hifi3_hikey960_win32.tgz b/hifi/xaf/config/hifi3_hikey960_win32.tgz
new file mode 100755
index 00000000..32871752
--- /dev/null
+++ b/hifi/xaf/config/hifi3_hikey960_win32.tgz
Binary files differ
diff --git a/hifi/xaf/docs/HiFi-AF-Hosted-ProgrammersGuide.pdf b/hifi/xaf/docs/HiFi-AF-Hosted-ProgrammersGuide.pdf
new file mode 100755
index 00000000..3499a875
--- /dev/null
+++ b/hifi/xaf/docs/HiFi-AF-Hosted-ProgrammersGuide.pdf
Binary files differ
diff --git a/hifi/xaf/docs/HiFi-Audio-Codec-API-Definition.pdf b/hifi/xaf/docs/HiFi-Audio-Codec-API-Definition.pdf
new file mode 100755
index 00000000..179d13b3
--- /dev/null
+++ b/hifi/xaf/docs/HiFi-Audio-Codec-API-Definition.pdf
Binary files differ
diff --git a/hifi/xaf/docs/HiFi-Speech-Codec-API-Definition.pdf b/hifi/xaf/docs/HiFi-Speech-Codec-API-Definition.pdf
new file mode 100755
index 00000000..2b6a68ac
--- /dev/null
+++ b/hifi/xaf/docs/HiFi-Speech-Codec-API-Definition.pdf
Binary files differ
diff --git a/hifi/xaf/docs/HiKey960-HiFi3-Android-SDK-Guide.pdf b/hifi/xaf/docs/HiKey960-HiFi3-Android-SDK-Guide.pdf
new file mode 100755
index 00000000..ea3c07a4
--- /dev/null
+++ b/hifi/xaf/docs/HiKey960-HiFi3-Android-SDK-Guide.pdf
Binary files differ
diff --git a/hifi/xaf/docs/Hosted_XAF_Arch_v0.7.pdf b/hifi/xaf/docs/Hosted_XAF_Arch_v0.7.pdf
new file mode 100755
index 00000000..f5b372f4
--- /dev/null
+++ b/hifi/xaf/docs/Hosted_XAF_Arch_v0.7.pdf
Binary files differ
diff --git a/hifi/xaf/hifi-dpf/app/xa-factory.c b/hifi/xaf/hifi-dpf/app/xa-factory.c
new file mode 100644
index 00000000..b9e7d193
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/app/xa-factory.c
@@ -0,0 +1,163 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-factory.c
+ *
+ * DSP processing framework core - component factory
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG FACTORY
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+#include "audio/xa_type_def.h"
+
+/*******************************************************************************
+ * Tracing tags
+ ******************************************************************************/
+
+/* ...general initialization sequence */
+TRACE_TAG(INIT, 1);
+
+/*******************************************************************************
+ * Local types definitions
+ ******************************************************************************/
+
+/* ...component descriptor */
+typedef struct xf_component_id
+{
+ /* ...class id (string identifier) */
+ const char *id;
+
+ /* ...class constructor */
+ xf_component_t * (*factory)(u32 core, xa_codec_func_t process);
+
+ /* ...component API function */
+ xa_codec_func_t *process;
+
+} xf_component_id_t;
+
+/*******************************************************************************
+ * External functions
+ ******************************************************************************/
+
+/* ...components API functions */
+extern XA_ERRORCODE xa_pcm_codec(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_mp3_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_aac_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_aac_encoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_vorbis_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_ac3_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_ddplus71_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_mixer(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_renderer(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_capturer(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_src_pp_fx(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_dts_hd_decoder(xa_codec_handle_t, WORD32, WORD32, pVOID);
+extern XA_ERRORCODE xa_dap_fx(xa_codec_handle_t, WORD32, WORD32, pVOID);
+
+/* ...component class factories */
+extern xf_component_t * xa_audio_codec_factory(u32 core, xa_codec_func_t process);
+extern xf_component_t * xa_audio_fx_factory(u32 core, xa_codec_func_t process);
+extern xf_component_t * xa_mixer_factory(u32 core, xa_codec_func_t process);
+extern xf_component_t * xa_renderer_factory(u32 core,xa_codec_func_t process);
+
+/*******************************************************************************
+ * Local constants definitions
+ ******************************************************************************/
+
+/* ...component class id */
+static const xf_component_id_t xf_component_id[] =
+{
+#if XA_PCM
+ { "audio-decoder/pcm", xa_audio_codec_factory, xa_pcm_codec },
+#endif
+#if XA_MP3_DECODER
+ { "audio-decoder/mp3", xa_audio_codec_factory, xa_mp3_decoder },
+#endif
+#if XA_AAC_DECODER
+ { "audio-decoder/aac", xa_audio_codec_factory, xa_aac_decoder },
+#endif
+#if XA_AC3_DECODER
+ { "audio-decoder/ac3", xa_audio_codec_factory, xa_ac3_decoder },
+#endif
+#if XA_DDP71_DECODER
+ { "audio-decoder/ddplus71", xa_audio_codec_factory, xa_ddplus71_decoder },
+#endif
+#if XA_DTS_HD_DECODER
+ { "audio-decoder/dts-hd", xa_audio_codec_factory, xa_dts_hd_decoder },
+#endif
+#if XA_VORBIS_DECODER
+ { "audio-decoder/vorbis", xa_audio_codec_factory, xa_vorbis_decoder },
+#endif
+#if XA_AAC_ENCODER
+ { "audio-encoder/aac", xa_audio_codec_factory, xa_aac_encoder },
+#endif
+#if XA_SRC_PP_FX
+ { "audio-fx/src-pp", xa_audio_codec_factory, xa_src_pp_fx },
+#endif
+#if XA_DAP_FX
+ { "audio-fx/dap", xa_audio_codec_factory, xa_dap_fx },
+#endif
+#if XA_MIXER
+ { "mixer", xa_mixer_factory, xa_mixer },
+#endif
+#if XA_RENDERER
+ { "renderer", xa_renderer_factory, xa_renderer },
+#endif
+#if XA_CAPTURER
+ { "capturer", xa_capturer_factory, xa_capturer },
+#endif
+};
+
+/* ...number of items in the map */
+#define XF_COMPONENT_ID_MAX (sizeof(xf_component_id) / sizeof(xf_component_id[0]))
+
+/*******************************************************************************
+ * Enry points
+ ******************************************************************************/
+
+xf_component_t * xf_component_factory(u32 core, xf_id_t id, u32 length)
+{
+ u32 i;
+
+ /* ...find component-id in static map */
+ for (i = 0; i < XF_COMPONENT_ID_MAX; i++)
+ {
+ /* ...symbolic search - not too good; would prefer GUIDs in some form */
+ if (!strncmp(id, xf_component_id[i].id, length))
+ {
+ /* ...pass control to specific class factory */
+ return xf_component_id[i].factory(core, xf_component_id[i].process);
+ }
+ }
+
+ /* ...component string id is not recognized */
+ TRACE(ERROR, _b("Unknown component type: %s"), id);
+
+ return NULL;
+}
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c b/hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c
new file mode 100644
index 00000000..3806548f
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/audio/xa-class-audio-codec.c
@@ -0,0 +1,785 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-class-audio-codec.c
+ *
+ * Generic audio codec task implementation
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG CODEC
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+#include "xa-class-base.h"
+#include "audio/xa-audio-decoder-api.h"
+
+/*******************************************************************************
+ * Tracing configuration
+ ******************************************************************************/
+
+TRACE_TAG(INIT, 1);
+TRACE_TAG(WARNING, 1);
+TRACE_TAG(INFO, 1);
+TRACE_TAG(INPUT, 1);
+TRACE_TAG(OUTPUT, 1);
+TRACE_TAG(DECODE, 1);
+
+/*******************************************************************************
+ * Internal functions definitions
+ ******************************************************************************/
+
+typedef struct XAAudioCodec
+{
+ /***************************************************************************
+ * Control data
+ **************************************************************************/
+
+ /* ...generic audio codec data */
+ XACodecBase base;
+
+ /* ...input port data */
+ xf_input_port_t input;
+
+ /* ...output port data */
+ xf_output_port_t output;
+
+ /* ...input port index */
+ WORD32 in_idx;
+
+ /* ...output port index */
+ WORD32 out_idx;
+
+ /***************************************************************************
+ * Run-time configuration parameters
+ **************************************************************************/
+
+ /* ...sample size in bytes */
+ u32 sample_size;
+
+ /* ...audio sample duration */
+ u32 factor;
+
+ /* ...total number of produced audio frames since last reset */
+ u32 produced;
+
+} XAAudioCodec;
+
+/*******************************************************************************
+ * Auxiliary codec execution flags
+ ******************************************************************************/
+
+/* ...input port setup condition */
+#define XA_CODEC_FLAG_INPUT_SETUP __XA_BASE_FLAG(1 << 0)
+
+/* ...output port setup condition */
+#define XA_CODEC_FLAG_OUTPUT_SETUP __XA_BASE_FLAG(1 << 1)
+
+/*******************************************************************************
+ * Data processing scheduling
+ ******************************************************************************/
+
+/* ...prepare codec for steady operation (tbd - don't absolutely like it) */
+static inline XA_ERRORCODE xa_codec_prepare_runtime(XAAudioCodec *codec)
+{
+ XACodecBase *base = (XACodecBase *)codec;
+ xf_message_t *m = xf_msg_queue_head(&codec->output.queue);
+ xf_start_msg_t *msg = m->buffer;
+ u32 frame_size;
+ u32 factor;
+
+ /* ...fill-in buffer parameters */
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_CODEC_CONFIG_PARAM_SAMPLE_RATE, &msg->sample_rate);
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_CODEC_CONFIG_PARAM_CHANNELS, &msg->channels);
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_CODEC_CONFIG_PARAM_PCM_WIDTH, &msg->pcm_width);
+ XA_API(base, XA_API_CMD_GET_MEM_INFO_SIZE, codec->in_idx, &msg->input_length);
+ XA_API(base, XA_API_CMD_GET_MEM_INFO_SIZE, codec->out_idx, &msg->output_length);
+
+ TRACE(INIT, _b("codec[%p]::runtime init: f=%u, c=%u, w=%u, i=%u, o=%u"), codec, msg->sample_rate, msg->channels, msg->pcm_width, msg->input_length, msg->output_length);
+
+ /* ...reallocate input port buffer as needed - tbd */
+ BUG(msg->input_length > codec->input.length, _x("Input buffer reallocation required: %u to %u"), codec->input.length, msg->input_length);
+
+ /* ...save sample size in bytes */
+ codec->sample_size = msg->channels * (msg->pcm_width == 16 ? 2 : 4);
+
+ /* ...calculate frame duration; get number of samples in the frame (don't like division here - tbd) */
+ frame_size = msg->output_length / codec->sample_size;
+
+ /* ...it must be a multiple */
+ XF_CHK_ERR(frame_size * codec->sample_size == msg->output_length, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...retrieve upsampling factor for given sample rate */
+ XF_CHK_ERR(factor = xf_timebase_factor(msg->sample_rate), XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...set frame duration factor (converts number of bytes into timebase units) */
+ codec->factor = factor / codec->sample_size;
+
+ TRACE(INIT, _b("ts-factor: %u (%u)"), codec->factor, factor);
+
+ BUG(codec->factor * codec->sample_size != factor, _x("Freq mismatch: %u vs %u"), codec->factor * codec->sample_size, factor);
+
+ /* ...pass response to caller (push out of output port) */
+ xf_output_port_produce(&codec->output, sizeof(*msg));
+
+ /* ...codec runtime initialization is completed */
+ TRACE(INIT, _b("codec[%p] runtime initialized: i=%u, o=%u"), codec, msg->input_length, msg->output_length);
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Commands processing
+ ******************************************************************************/
+
+/* ...EMPTY-THIS-BUFFER command processing */
+static XA_ERRORCODE xa_codec_empty_this_buffer(XACodecBase *base, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+
+ /* ...make sure the port is sane */
+ XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == 0, XA_API_FATAL_INVALID_CMD);
+
+ /* ...command is allowed only in post-init state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...put message into input queue */
+ if (xf_input_port_put(&codec->input, m))
+ {
+ /* ...restart stream if it is in completed state */
+ if (base->state & XA_BASE_FLAG_COMPLETED)
+ {
+ /* ...reset execution stage */
+ base->state = XA_BASE_FLAG_POSTINIT | XA_BASE_FLAG_EXECUTION;
+
+ /* ...reset execution runtime */
+ XA_API(base, XA_API_CMD_EXECUTE, XA_CMD_TYPE_DO_RUNTIME_INIT, NULL);
+
+ /* ...reset produced samples counter */
+ codec->produced = 0;
+ }
+
+ /* ...codec must be in one of these states */
+ XF_CHK_ERR(base->state & (XA_BASE_FLAG_RUNTIME_INIT | XA_BASE_FLAG_EXECUTION), XA_API_FATAL_INVALID_CMD);
+
+ /* ...schedule data processing if output is ready */
+ if (xf_output_port_ready(&codec->output))
+ {
+ xa_base_schedule(base, 0);
+ }
+ }
+
+ TRACE(INPUT, _b("Received buffer [%p]:%u"), m->buffer, m->length);
+
+ return XA_NO_ERROR;
+}
+
+/* ...FILL-THIS-BUFFER command processing */
+static XA_ERRORCODE xa_codec_fill_this_buffer(XACodecBase *base, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+
+ /* ...make sure the port is sane */
+ XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == 1, XA_API_FATAL_INVALID_CMD);
+
+ /* ...command is allowed only in postinit state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...special handling of zero-length buffer */
+ if (base->state & XA_BASE_FLAG_RUNTIME_INIT)
+ {
+ /* ...message must be zero-length */
+ BUG(m->length != 0, _x("Invalid message length: %u"), m->length);
+ }
+ else if (m == xf_output_port_control_msg(&codec->output))
+ {
+ /* ...end-of-stream processing indication received; check the state */
+ BUG((base->state & XA_BASE_FLAG_COMPLETED) == 0, _x("invalid state: %x"), base->state);
+
+ /* ... mark flushing sequence is done */
+ xf_output_port_flush_done(&codec->output);
+
+ /* ...complete pending zero-length input buffer */
+ xf_input_port_purge(&codec->input);
+
+ TRACE(INFO, _b("codec[%p] playback completed"), codec);
+
+ /* ...playback is over */
+ return XA_NO_ERROR;
+ }
+ else if ((base->state & XA_BASE_FLAG_COMPLETED) && !xf_output_port_routed(&codec->output))
+ {
+ /* ...return message arrived from application immediately */
+ xf_response_ok(m);
+
+ return XA_NO_ERROR;
+ }
+ else
+ {
+ TRACE(OUTPUT, _b("Received output buffer [%p]:%u"), m->buffer, m->length);
+
+ /* ...adjust message length (may be shorter than original) */
+ m->length = codec->output.length;
+ }
+
+ /* ...place message into output port */
+ if (xf_output_port_put(&codec->output, m) && xf_input_port_ready(&codec->input))
+ {
+ /* ...schedule data processing instantly */
+ if (base->state & (XA_BASE_FLAG_RUNTIME_INIT | XA_BASE_FLAG_EXECUTION))
+ {
+ xa_base_schedule(base, 0);
+ }
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...output port routing */
+static XA_ERRORCODE xa_codec_port_route(XACodecBase *base, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+ xf_route_port_msg_t *cmd = m->buffer;
+ xf_output_port_t *port = &codec->output;
+ u32 src = XF_MSG_DST(m->id);
+ u32 dst = cmd->dst;
+
+ /* ...command is allowed only in "postinit" state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...make sure output port is addressed */
+ XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == 1, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...make sure port is not routed yet */
+ XF_CHK_ERR(!xf_output_port_routed(port), XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...route output port - allocate queue */
+ XF_CHK_ERR(xf_output_port_route(port, __XF_MSG_ID(dst, src), cmd->alloc_number, cmd->alloc_size, cmd->alloc_align) == 0, XA_API_FATAL_MEM_ALLOC);
+
+ /* ...schedule processing instantly */
+ xa_base_schedule(base, 0);
+
+ /* ...pass success result to caller */
+ xf_response_ok(m);
+
+ return XA_NO_ERROR;
+}
+
+/* ...port unroute command */
+static XA_ERRORCODE xa_codec_port_unroute(XACodecBase *base, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+
+ /* ...command is allowed only in "postinit" state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...make sure output port is addressed */
+ XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == 1, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...cancel any pending processing */
+ xa_base_cancel(base);
+
+ /* ...clear output-port-setup condition */
+ base->state &= ~XA_CODEC_FLAG_OUTPUT_SETUP;
+
+ /* ...pass flush command down the graph */
+ if (xf_output_port_flush(&codec->output, XF_FLUSH))
+ {
+ TRACE(INFO, _b("port is idle; instantly unroute"));
+
+ /* ...flushing sequence is not needed; command may be satisfied instantly */
+ xf_output_port_unroute(&codec->output);
+
+ /* ...pass response to the proxy */
+ xf_response_ok(m);
+ }
+ else
+ {
+ TRACE(INFO, _b("port is busy; propagate unroute command"));
+
+ /* ...flushing sequence is started; save flow-control message */
+ xf_output_port_unroute_start(&codec->output, m);
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...FLUSH command processing */
+static XA_ERRORCODE xa_codec_flush(XACodecBase *base, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+
+ /* ...command is allowed only in "postinit" state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...ensure input parameter length is zero */
+ XF_CHK_ERR(m->length == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ TRACE(1, _b("flush command received"));
+
+ /* ...flush command must be addressed to input port */
+ if (XF_MSG_DST_PORT(m->id) == 0)
+ {
+ /* ...cancel data processing message if needed */
+ xa_base_cancel(base);
+
+ /* ...input port flushing; purge content of input buffer */
+ xf_input_port_purge(&codec->input);
+
+ /* ...clear input-ready condition */
+ base->state &= ~XA_CODEC_FLAG_INPUT_SETUP;
+
+ /* ...reset execution runtime */
+ XA_API(base, XA_API_CMD_EXECUTE, XA_CMD_TYPE_DO_RUNTIME_INIT, NULL);
+
+ /* ...reset produced samples counter */
+ codec->produced = 0;
+
+ /* ...propagate flushing command to output port */
+ if (xf_output_port_flush(&codec->output, XF_FLUSH))
+ {
+ /* ...flushing sequence is not needed; satisfy command instantly */
+ xf_response(m);
+ }
+ else
+ {
+ /* ...flushing sequence is started; save flow-control message at input port */
+ xf_input_port_control_save(&codec->input, m);
+ }
+ }
+ else if (xf_output_port_unrouting(&codec->output))
+ {
+ /* ...flushing during port unrouting; complete unroute sequence */
+ xf_output_port_unroute_done(&codec->output);
+
+ TRACE(INFO, _b("port is unrouted"));
+ }
+ else
+ {
+ /* ...output port flush command/response; check if the port is routed */
+ if (!xf_output_port_routed(&codec->output))
+ {
+ /* ...complete all queued messages */
+ xf_output_port_flush(&codec->output, XF_FLUSH);
+
+ /* ...and pass response to flushing command */
+ xf_response(m);
+ }
+ else
+ {
+ /* ...response to flushing command received */
+ BUG(m != xf_output_port_control_msg(&codec->output), _x("invalid message: %p"), m);
+
+ /* ...mark flushing sequence is completed */
+ xf_output_port_flush_done(&codec->output);
+
+ /* ...complete original flow-control command */
+ xf_input_port_purge_done(&codec->input);
+ }
+
+ /* ...clear output-setup condition */
+ base->state &= ~XA_CODEC_FLAG_OUTPUT_SETUP;
+ }
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Generic codec API
+ ******************************************************************************/
+
+/* ...memory buffer handling */
+static XA_ERRORCODE xa_codec_memtab(XACodecBase *base, WORD32 idx, WORD32 type, WORD32 size, WORD32 align, u32 core)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+
+ if (type == XA_MEMTYPE_INPUT)
+ {
+ /* ...input port specification; allocate internal buffer */
+ XF_CHK_ERR(xf_input_port_init(&codec->input, size, align, core) == 0, XA_API_FATAL_MEM_ALLOC);
+
+ /* ...save input port index */
+ codec->in_idx = idx;
+
+ /* ...set input buffer pointer as needed */
+ (size ? XA_API(base, XA_API_CMD_SET_MEM_PTR, idx, codec->input.buffer) : 0);
+
+ (size ? TRACE(1, _x("set input ptr: %p"), codec->input.buffer) : 0);
+ }
+ else
+ {
+ /* ...output buffer specification */
+ XF_CHK_ERR(type == XA_MEMTYPE_OUTPUT, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...initialize output port queue (no allocation here yet) */
+ XF_CHK_ERR(xf_output_port_init(&codec->output, size) == 0, XA_API_FATAL_MEM_ALLOC);
+
+ /* ...save output port index */
+ codec->out_idx = idx;
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...prepare input/output buffers */
+static XA_ERRORCODE xa_codec_preprocess(XACodecBase *base)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+
+ /* ...prepare output buffer if needed */
+ if (!(base->state & XA_CODEC_FLAG_OUTPUT_SETUP))
+ {
+ void *output;
+
+ /* ...get output buffer from port, if possible */
+ if (base->state & XA_BASE_FLAG_RUNTIME_INIT)
+ {
+ /* ...run-time is not initialized yet; use scratch buffer */
+ output = base->scratch;
+ }
+ else if ((output = xf_output_port_data(&codec->output)) == NULL)
+ {
+ /* ...no output buffer available */
+ return XA_CODEC_EXEC_NO_DATA;
+ }
+
+ /* ...set the output buffer pointer */
+ XA_API(base, XA_API_CMD_SET_MEM_PTR, codec->out_idx, output);
+
+ TRACE(1, _x("set output ptr: %p"), output);
+
+ /* ...mark output port is setup */
+ base->state ^= XA_CODEC_FLAG_OUTPUT_SETUP;
+ }
+
+ /* ...prepare input data if needed */
+ if (!(base->state & XA_CODEC_FLAG_INPUT_SETUP))
+ {
+ void *input;
+ u32 filled;
+
+ /* ...fill input buffer */
+ if (xf_input_port_bypass(&codec->input))
+ {
+ /* ...use input buffer directly; check if there is data available */
+ if ((input = xf_input_port_data(&codec->input)) != NULL)
+ {
+ /* ...set input data buffer pointer */
+ XA_API(base, XA_API_CMD_SET_MEM_PTR, codec->in_idx, input);
+
+ /* ...retrieve number of input bytes */
+ filled = xf_input_port_length(&codec->input);
+ }
+ else if (!xf_input_port_done(&codec->input))
+ {
+ /* ...return non-fatal indication to prevent further processing */
+ return XA_CODEC_EXEC_NO_DATA;
+ }
+ else
+ {
+ /* ...mark we have no data in current buffer */
+ filled = 0;
+ }
+ }
+ else
+ {
+ /* ...port is in non-bypass mode; try to fill internal buffer */
+ if (xf_input_port_done(&codec->input) || xf_input_port_fill(&codec->input))
+ {
+ /* ...retrieve number of bytes in input buffer (not really - tbd) */
+ filled = xf_input_port_level(&codec->input);
+ }
+ else
+ {
+ /* ...return non-fatal indication to prevent further processing */
+ return XA_CODEC_EXEC_NO_DATA;
+ }
+ }
+
+ /* ...check if input stream is over */
+ if (xf_input_port_done(&codec->input))
+ {
+ /* ...pass input-over command to the codec to indicate the final buffer */
+ XA_API(base, XA_API_CMD_INPUT_OVER, codec->in_idx, NULL);
+
+ TRACE(INFO, _b("codec[%p]: signal input-over (filled: %u)"), codec, filled);
+ }
+
+ TRACE(INPUT, _b("input-buffer fill-level: %u bytes"), filled);
+
+ /* ...specify number of bytes available in the input buffer */
+ XA_API(base, XA_API_CMD_SET_INPUT_BYTES, codec->in_idx, &filled);
+
+ /* ...mark input port is setup */
+ base->state ^= XA_CODEC_FLAG_INPUT_SETUP;
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...post-processing operation; input/output ports maintenance */
+static XA_ERRORCODE xa_codec_postprocess(XACodecBase *base, int done)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+ WORD32 consumed = 0;
+ WORD32 produced = 0;
+
+ /* ...get number of consumed / produced bytes */
+ XA_API(base, XA_API_CMD_GET_CURIDX_INPUT_BUF, codec->in_idx, &consumed);
+
+ /* ...get number of produced bytes only if runtime is initialized (sample size is known) */
+ (codec->sample_size ? XA_API(base, XA_API_CMD_GET_OUTPUT_BYTES, codec->out_idx, &produced) : 0);
+
+ TRACE(DECODE, _b("codec[%p]::postprocess(c=%u, p=%u, d=%u)"), codec, consumed, produced, done);
+
+ /* ...input buffer maintenance; check if we consumed anything */
+ if (consumed)
+ {
+ /* ...consume specified number of bytes from input port */
+ xf_input_port_consume(&codec->input, consumed);
+
+ /* ...clear input-setup flag */
+ base->state ^= XA_CODEC_FLAG_INPUT_SETUP;
+ }
+
+ /* ...output buffer maintenance; check if we have produced anything */
+ if (produced)
+ {
+ /* ...increment total number of produced samples (really don't like division here - tbd) */
+ codec->produced += produced / codec->sample_size;
+
+ /* ...immediately complete output buffer (don't wait until it gets filled) */
+ xf_output_port_produce(&codec->output, produced);
+
+ /* ...clear output port setup flag */
+ base->state ^= XA_CODEC_FLAG_OUTPUT_SETUP;
+ }
+
+ /* ...process execution stage transition */
+ if (done)
+ {
+ if (base->state & XA_BASE_FLAG_RUNTIME_INIT)
+ {
+ /* ...stream is completed while codec is in runtime initialization stage */
+ BUG(1, _x("breakpoint"));
+ }
+ else if (base->state & XA_BASE_FLAG_EXECUTION)
+ {
+ /* ...runtime initialization done */
+ XA_CHK(xa_codec_prepare_runtime(codec));
+
+ /* ...clear output port setup flag as we were using scratch buffer;
+ * technically, no need to repeat setup of input buffer, but some codecs require
+ * it as well
+ */
+ base->state &= ~(XA_CODEC_FLAG_INPUT_SETUP | XA_CODEC_FLAG_OUTPUT_SETUP);
+ }
+ else
+ {
+ /* ...output stream is over; propagate condition to sink port */
+ if (xf_output_port_flush(&codec->output, XF_FILL_THIS_BUFFER))
+ {
+ /* ...flushing sequence is not needed; complete pending zero-length input */
+ xf_input_port_purge(&codec->input);
+
+ /* ...no propagation to output port */
+ TRACE(INFO, _b("codec[%p] playback completed"), codec);
+ }
+ else
+ {
+ /* ...flushing sequence is started; wait until flow-control message returns */
+ TRACE(INFO, _b("propagate end-of-stream condition"));
+ }
+ }
+
+ /* ...return early to prevent task rescheduling */
+ return XA_NO_ERROR;
+ }
+
+ /* ...reschedule processing if needed */
+ if (xf_input_port_ready(&codec->input) && xf_output_port_ready(&codec->output))
+ {
+ /* ...schedule data processing with respect to its urgency */
+ xa_base_schedule(base, produced * codec->factor);
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...configuration parameter retrieval */
+static XA_ERRORCODE xa_codec_getparam(XACodecBase *base, WORD32 id, pVOID value)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) base;
+
+ if (id == XA_CODEC_CONFIG_PARAM_PRODUCED)
+ {
+ /* ...retrieve number of produced samples since last reset */
+ *(u32 *)value = codec->produced;
+
+ return XA_NO_ERROR;
+ }
+ else
+ {
+ /* ...pass command to underlying codec plugin */
+ return XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, id, value);
+ }
+}
+
+/*******************************************************************************
+ * Component entry point
+ ******************************************************************************/
+
+/* ...command hooks */
+static XA_ERRORCODE (* const xa_codec_cmd[])(XACodecBase *, xf_message_t *) =
+{
+ [XF_OPCODE_TYPE(XF_SET_PARAM)] = xa_base_set_param,
+ [XF_OPCODE_TYPE(XF_GET_PARAM)] = xa_base_get_param,
+ [XF_OPCODE_TYPE(XF_ROUTE)] = xa_codec_port_route,
+ [XF_OPCODE_TYPE(XF_UNROUTE)] = xa_codec_port_unroute,
+ [XF_OPCODE_TYPE(XF_EMPTY_THIS_BUFFER)] = xa_codec_empty_this_buffer,
+ [XF_OPCODE_TYPE(XF_FILL_THIS_BUFFER)] = xa_codec_fill_this_buffer,
+ [XF_OPCODE_TYPE(XF_FLUSH)] = xa_codec_flush,
+ [XF_OPCODE_TYPE(XF_SET_PARAM_EXT)] = xa_base_set_param_ext,
+ [XF_OPCODE_TYPE(XF_GET_PARAM_EXT)] = xa_base_get_param_ext,
+};
+
+/* ...total number of commands supported */
+#define XA_CODEC_CMD_NUM (sizeof(xa_codec_cmd) / sizeof(xa_codec_cmd[0]))
+
+/* ...command processor for termination state (only for routed port case) */
+static int xa_audio_codec_terminate(xf_component_t *component, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) component;
+ u32 opcode = m->opcode;
+
+ /* ...check if we received output port control message */
+ if (m == xf_output_port_control_msg(&codec->output))
+ {
+ /* ...output port flushing complete; mark port is idle and terminate */
+ xf_output_port_flush_done(&codec->output);
+ return -1;
+ }
+ else if (opcode == XF_FILL_THIS_BUFFER)
+ {
+ /* ...output buffer returned by the sink component; ignore and keep waiting */
+ TRACE(OUTPUT, _b("collect output buffer"));
+ return 0;
+ }
+ else if (opcode == XF_UNREGISTER)
+ {
+ /* ...ignore subsequent unregister command/response - tbd */
+ return 0;
+ }
+ else
+ {
+ /* ...everything else is responded with generic failure */
+ xf_response_err(m);
+ return 0;
+ }
+}
+
+/* ...audio codec destructor */
+static int xa_audio_codec_destroy(xf_component_t *component, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) component;
+ u32 core = xf_component_core(component);
+
+ /* ...destroy input port */
+ xf_input_port_destroy(&codec->input, core);
+
+ /* ...destroy output port */
+ xf_output_port_destroy(&codec->output, core);
+
+ /* ...deallocate all resources */
+ xa_base_destroy(&codec->base, XF_MM(sizeof(*codec)), core);
+
+ TRACE(INIT, _b("audio-codec[%p@%u] destroyed"), codec, core);
+
+ /* ...indicate the client has been destroyed */
+ return 0;
+}
+
+/* ...audio codec destructor - first stage (ports unrouting) */
+static int xa_audio_codec_cleanup(xf_component_t *component, xf_message_t *m)
+{
+ XAAudioCodec *codec = (XAAudioCodec *) component;
+
+ /* ...complete message with error response */
+ xf_response_err(m);
+
+ /* ...cancel internal scheduling message if needed */
+ xa_base_cancel(&codec->base);
+
+ /* ...purge input port (returns OK? pretty strange at this point - tbd) */
+ xf_input_port_purge(&codec->input);
+
+ /* ...propagate unregister command to connected component */
+ if (xf_output_port_flush(&codec->output, XF_FLUSH))
+ {
+ /* ...flushing sequence is not needed; destroy audio codec */
+ return xa_audio_codec_destroy(component, NULL);
+ }
+ else
+ {
+ /* ...wait until output port is cleaned; adjust component hooks */
+ component->entry = xa_audio_codec_terminate;
+ component->exit = xa_audio_codec_destroy;
+
+ TRACE(INIT, _b("codec[%p] cleanup sequence started"), codec);
+
+ /* ...indicate that second stage is required */
+ return 1;
+ }
+}
+
+/*******************************************************************************
+ * Audio codec component factory
+ ******************************************************************************/
+
+xf_component_t * xa_audio_codec_factory(u32 core, xa_codec_func_t process)
+{
+ XAAudioCodec *codec;
+
+ /* ...allocate local memory for codec structure */
+ XF_CHK_ERR(codec = (XAAudioCodec *) xa_base_factory(core, XF_MM(sizeof(*codec)), process), NULL);
+
+ /* ...set base codec API methods */
+ codec->base.memtab = xa_codec_memtab;
+ codec->base.preprocess = xa_codec_preprocess;
+ codec->base.postprocess = xa_codec_postprocess;
+ codec->base.getparam = xa_codec_getparam;
+
+ /* ...set message commands processing table */
+ codec->base.command = xa_codec_cmd;
+ codec->base.command_num = XA_CODEC_CMD_NUM;
+
+ /* ...set component destructor hook */
+ codec->base.component.exit = xa_audio_codec_cleanup;
+
+ TRACE(INIT, _b("Codec[%p] initialized"), codec);
+
+ return (xf_component_t *) codec;
+}
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-base.c b/hifi/xaf/hifi-dpf/audio/xa-class-base.c
new file mode 100644
index 00000000..0b672553
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/audio/xa-class-base.c
@@ -0,0 +1,537 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-class-base.c
+ *
+ * Generic audio codec task implementation
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG BASE
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+#include "xa-class-base.h"
+
+/*******************************************************************************
+ * Tracing configuration
+ ******************************************************************************/
+
+TRACE_TAG(INIT, 1);
+TRACE_TAG(WARNING, 1);
+TRACE_TAG(SETUP, 1);
+TRACE_TAG(EXEC, 1);
+
+/*******************************************************************************
+ * Internal functions definitions
+ ******************************************************************************/
+
+/* ...codec pre-initialization */
+static XA_ERRORCODE xa_base_preinit(XACodecBase *base, u32 core)
+{
+ WORD32 n;
+
+ /* ...codec must be empty */
+ XF_CHK_ERR(base->state == 0, XA_API_FATAL_INVALID_CMD);
+
+ /* ...get API structure size */
+ XA_API(base, XA_API_CMD_GET_API_SIZE, 0, &n);
+
+ /* ...allocate memory for codec API structure (4-bytes aligned) */
+ XMALLOC(&base->api, n, 4, core);
+
+ /* ...set default config parameters */
+ XA_API(base, XA_API_CMD_INIT, XA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS, NULL);
+
+ /* ...get memory info tables size */
+ if (XA_API(base, XA_API_CMD_GET_MEMTABS_SIZE, 0, &n), n != 0)
+ {
+ /* ...allocate memory for tables (4-bytes aligned) */
+ XMALLOC(&base->mem_tabs, n, 4, core);
+
+ /* ...set pointer for process memory tables */
+ XA_API(base, XA_API_CMD_SET_MEMTABS_PTR, 0, base->mem_tabs.addr);
+ }
+
+ TRACE(INIT, _b("Codec[%p] pre-initialization completed"), base);
+
+ return XA_NO_ERROR;
+}
+
+/* ...post-initialization setup */
+static XA_ERRORCODE xa_base_postinit(XACodecBase *base, u32 core)
+{
+ WORD32 n, i;
+
+ /* ...issue post-config command and determine the buffer requirements */
+ XA_API(base, XA_API_CMD_INIT, XA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS, NULL);
+
+ /* ...get number of memory tables required */
+ XA_API(base, XA_API_CMD_GET_N_MEMTABS, 0, &n);
+
+ /* ...set scratch buffer in advance (as codec not necessarily exposes it) */
+ base->scratch = XF_CORE_DATA(core)->scratch;
+
+ /* ...allocate memory buffers */
+ for (i = 0; i < n; i++)
+ {
+ WORD32 size, align, type;
+
+ TRACE(1, _b("i = %u (of %u)"), (u32)i, (u32)n);
+
+ /* ...get memory type */
+ XA_API(base, XA_API_CMD_GET_MEM_INFO_TYPE, i, &type);
+
+ /* ...get memory size of i-th buffer */
+ XA_API(base, XA_API_CMD_GET_MEM_INFO_SIZE, i, &size);
+
+ /* ...get alignment */
+ XA_API(base, XA_API_CMD_GET_MEM_INFO_ALIGNMENT, i, &align);
+
+ /* ...process individual buffer */
+ switch (type)
+ {
+ case XA_MEMTYPE_SCRATCH:
+ /* ...scratch memory is shared among all codecs; check its validity */
+ XF_CHK_ERR(size <= XF_CFG_CODEC_SCRATCHMEM_SIZE, XA_API_FATAL_MEM_ALLOC);
+
+ /* ...make sure alignment is sane */
+ XF_CHK_ERR((XF_CFG_CODEC_SCRATCHMEM_ALIGN & (align - 1)) == 0, XA_API_FATAL_MEM_ALIGN);
+
+ /* ...set the scratch memory pointer */
+ XA_API(base, XA_API_CMD_SET_MEM_PTR, i, base->scratch);
+
+ TRACE(INIT, _b("Mem tab %d: sz=%d al=%d ty=%d Scratch memory (%p)"), i, size, align, type, base->scratch);
+
+ break;
+
+ case XA_MEMTYPE_PERSIST:
+ /* ...allocate persistent memory */
+ XMALLOC(&base->persist, size, align, core);
+
+ /* ...and set the pointer instantly */
+ XA_API(base, XA_API_CMD_SET_MEM_PTR, i, base->persist.addr);
+
+ TRACE(INIT, _b("Mem tab %d: sz=%d al=%d ty=%d Persistent memory (%p)"), i, size, align, type, base->persist.addr);
+
+ break;
+
+ case XA_MEMTYPE_INPUT:
+ case XA_MEMTYPE_OUTPUT:
+ /* ...input/output buffer specification; pass to codec function */
+ CODEC_API(base, memtab, i, type, size, align, core);
+
+ break;
+
+ default:
+ /* ...unrecognized memory type */
+ TRACE(ERROR, _x("Invalid memory type: [%d]=(%u, %u, %u)"), i, type, size, align);
+ return XA_API_FATAL_INVALID_CMD_TYPE;
+ }
+ }
+
+ TRACE(INIT, _b("Codec[%p] post-initialization completed (api:%p[%u])"), base, base->api.addr, base->api.size);
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Commands processing
+ ******************************************************************************/
+
+/* ...SET-PARAM processing (enabled in all states) */
+XA_ERRORCODE xa_base_set_param(XACodecBase *base, xf_message_t *m)
+{
+ xf_set_param_msg_t *cmd = m->buffer;
+ xf_set_param_item_t *param = &cmd->item[0];
+ WORD32 n, i;
+
+ /* ...calculate total amount of parameters */
+ n = m->length / sizeof(*param);
+
+ /* ...check the message length is sane */
+ XF_CHK_ERR(m->length == XF_SET_PARAM_CMD_LEN(n), XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...apply all parameters; pass to codec-specific function */
+ for (i = 0; i < n; i++)
+ {
+ TRACE(SETUP, _b("set-param[%p]: [%u]=%u"), base, param[i].id, param[i].value);
+
+ if (base->setparam)
+ {
+ CODEC_API(base, setparam, param[i].id, &param[i].value);
+ }
+ else
+ {
+ XA_API(base, XA_API_CMD_SET_CONFIG_PARAM, param[i].id, &param[i].value);
+ }
+ }
+
+ /* ...check if we need to do post-initialization */
+ if ((base->state & XA_BASE_FLAG_POSTINIT) == 0)
+ {
+ /* ...do post-initialization step */
+ XA_CHK(xa_base_postinit(base, XF_MSG_DST_CORE(m->id)));
+
+ /* ...mark the codec static configuration is set */
+ base->state ^= XA_BASE_FLAG_POSTINIT | XA_BASE_FLAG_RUNTIME_INIT;
+ }
+
+ /* ...complete message processing; output buffer is empty */
+ xf_response_ok(m);
+
+ return XA_NO_ERROR;
+}
+
+/* ...GET-PARAM message processing (enabled in all states) */
+XA_ERRORCODE xa_base_get_param(XACodecBase *base, xf_message_t *m)
+{
+ xf_get_param_msg_t *cmd = m->buffer;
+ u32 *id = &cmd->c.id[0];
+ u32 *value = &cmd->r.value[0];
+ u32 n, i;
+
+ /* ...calculate amount of parameters */
+ n = m->length / sizeof(*id);
+
+ /* ...check input parameter length */
+ XF_CHK_ERR(XF_GET_PARAM_CMD_LEN(n) == m->length, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...retrieve the collection of codec parameters */
+ for (i = 0; i < n; i++)
+ {
+ /* ...place the result into same location */
+ if (base->getparam)
+ {
+ CODEC_API(base, getparam, id[i], &value[i]);
+ }
+ else
+ {
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, id[i], &value[i]);
+ }
+ }
+
+ /* ...complete message specifying output buffer size */
+ xf_response_data(m, XF_GET_PARAM_RSP_LEN(n));
+
+ return XA_NO_ERROR;
+}
+
+/* ...SET-PARAM-EXT processing (enabled in all states) */
+XA_ERRORCODE xa_base_set_param_ext(XACodecBase *base, xf_message_t *m)
+{
+ xf_ext_param_msg_t *cmd = m->buffer;
+ u16 length = m->length;
+ u16 remaining = (length + 3) & ~3;
+ u16 i;
+
+ for (i = 0; TRACE_CFG(SETUP) && i < remaining; i += 16)
+ {
+ TRACE(SETUP, _b("[%03x]: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X"),
+ i,
+ ((u8 *)m->buffer)[i + 0], ((u8 *)m->buffer)[i + 1],
+ ((u8 *)m->buffer)[i + 2], ((u8 *)m->buffer)[i + 3],
+ ((u8 *)m->buffer)[i + 4], ((u8 *)m->buffer)[i + 5],
+ ((u8 *)m->buffer)[i + 6], ((u8 *)m->buffer)[i + 7],
+ ((u8 *)m->buffer)[i + 8], ((u8 *)m->buffer)[i + 9],
+ ((u8 *)m->buffer)[i + 10], ((u8 *)m->buffer)[i + 11],
+ ((u8 *)m->buffer)[i + 12], ((u8 *)m->buffer)[i + 13],
+ ((u8 *)m->buffer)[i + 14], ((u8 *)m->buffer)[i + 15]);
+ }
+
+ /* ...process all parameters encapsulated in buffer */
+ while (remaining >= sizeof(*cmd))
+ {
+ u16 id = cmd->desc.id;
+ u16 dlen = cmd->desc.length;
+ u16 dsize = (dlen + 3) & ~3;
+ u16 pad = dlen & 3;
+
+ /* ...cut-off descriptor header */
+ remaining -= sizeof(*cmd);
+
+ TRACE(SETUP, _b("remaining:%u, desc_size:%u"), (u32)remaining, (u32)dsize);
+
+ /* ...make sure length is sufficient */
+ XF_CHK_ERR(remaining >= dsize, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...pad remaining bytes with zeroes */
+ (pad ? memset(cmd->data + dlen, 0, 4 - pad) : 0);
+
+ TRACE(SETUP, _b("set-ext-param[%p]: [%u]:%u - [%02X:%02X:%02X:%02X:...]"), base, id, dsize, cmd->data[0], cmd->data[1], cmd->data[2], cmd->data[3]);
+
+ /* ...apply parameter */
+ XA_API(base, XA_API_CMD_SET_CONFIG_PARAM, id, cmd->data);
+
+ /* ...move to next item (keep 4-bytes alignment for descriptor) */
+ cmd = (xf_ext_param_msg_t *)(&cmd->data[0] + dsize), remaining -= dsize;
+ }
+
+ /* ...check the message is fully processed */
+ XF_CHK_ERR(remaining == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...complete message processing; output buffer is empty */
+ //xf_response_ok(m);
+
+ /* ...unfortunately, it looks like a bug of the library that updates the memory
+ * and leaves it in a dirty state causing subsequent cache inconsistency - tbd
+ */
+ xf_response_data(m, length);
+
+ return XA_NO_ERROR;
+}
+
+/* ...GET-PARAM-EXT message processing (enabled in all states) */
+XA_ERRORCODE xa_base_get_param_ext(XACodecBase *base, xf_message_t *m)
+{
+ xf_ext_param_msg_t *cmd = m->buffer;
+ u32 length = m->length;
+ u32 remaining = (length + 3) & ~3;
+ int i;
+
+ for (i = 0; TRACE_CFG(SETUP) && i < remaining; i += 16)
+ {
+ TRACE(SETUP, _b("[%03x]: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X"),
+ i,
+ ((u8 *)m->buffer)[i + 0], ((u8 *)m->buffer)[i + 1],
+ ((u8 *)m->buffer)[i + 2], ((u8 *)m->buffer)[i + 3],
+ ((u8 *)m->buffer)[i + 4], ((u8 *)m->buffer)[i + 5],
+ ((u8 *)m->buffer)[i + 6], ((u8 *)m->buffer)[i + 7],
+ ((u8 *)m->buffer)[i + 8], ((u8 *)m->buffer)[i + 9],
+ ((u8 *)m->buffer)[i + 10], ((u8 *)m->buffer)[i + 11],
+ ((u8 *)m->buffer)[i + 12], ((u8 *)m->buffer)[i + 13],
+ ((u8 *)m->buffer)[i + 14], ((u8 *)m->buffer)[i + 15]);
+ }
+
+ /* ...process all parameters encapsulated in buffer */
+ while (remaining >= sizeof(*cmd))
+ {
+ u16 id = cmd->desc.id;
+ u16 len = cmd->desc.length;
+ u16 size = (len + 3) & ~3;
+ u8 pad = len & 3;
+
+ /* ...cut-off command header */
+ remaining -= sizeof(*cmd);
+
+ /* ...make sure data buffer has sufficient length */
+ XF_CHK_ERR(remaining >= size, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...retrieve parameter from buffer (care about alignment? - tbd) */
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, id, cmd->data);
+
+ /* ...pad remaininig bytes with zeroes */
+ (pad ? memset(cmd->data + len, 0, 4 - pad) : 0);
+
+ TRACE(SETUP, _b("get-ext-param[%p]: [%u]:%u - [%02X:%02X:%02X:%02X:...]"), base, id, size, cmd->data[0], cmd->data[1], cmd->data[2], cmd->data[3]);
+
+ /* ...move to next item (alignment issues? - tbd) */
+ cmd = (xf_ext_param_msg_t *)(&cmd->data[0] + size), remaining -= size;
+ }
+
+ /* ...check the message is fully processed */
+ XF_CHK_ERR(remaining == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...complete message processing; output buffer has the same length */
+ xf_response_data(m, length);
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Command/data processing functions
+ ******************************************************************************/
+
+/* ...generic codec data processing */
+static XA_ERRORCODE xa_base_process(XACodecBase *base)
+{
+ XA_ERRORCODE error;
+ WORD32 done;
+
+ /* ...clear internal scheduling flag */
+ base->state &= ~XA_BASE_FLAG_SCHEDULE;
+
+ /* ...codec-specific preprocessing (buffer maintenance) */
+ if ((error = CODEC_API(base, preprocess)) != XA_NO_ERROR)
+ {
+ /* ...return non-fatal codec error */
+ return error;
+ }
+
+ /* ...execution step */
+ if (base->state & XA_BASE_FLAG_RUNTIME_INIT)
+ {
+ /* ...kick initialization process */
+ XA_API(base, XA_API_CMD_INIT, XA_CMD_TYPE_INIT_PROCESS, NULL);
+
+ /* ...check if initialization is completed */
+ XA_API(base, XA_API_CMD_INIT, XA_CMD_TYPE_INIT_DONE_QUERY, &done);
+
+ TRACE(EXEC, _b("Initialization result: %d"), done);
+
+ /* ...switch to execution state if required */
+ (done ? base->state ^= XA_BASE_FLAG_RUNTIME_INIT | XA_BASE_FLAG_EXECUTION : 0);
+ }
+ else if (base->state & XA_BASE_FLAG_EXECUTION)
+ {
+ TRACE(1, _b("do exec"));
+
+ /* ...execute decoding process */
+ XA_API(base, XA_API_CMD_EXECUTE, XA_CMD_TYPE_DO_EXECUTE, NULL);
+
+ /* ...check for end-of-stream condition */
+ XA_API(base, XA_API_CMD_EXECUTE, XA_CMD_TYPE_DONE_QUERY, &done);
+
+ TRACE(EXEC, _b("Execution result: %d"), done);
+
+ /* ...mark the output path is done to release all queued buffers */
+ (done ? base->state ^= XA_BASE_FLAG_EXECUTION | XA_BASE_FLAG_COMPLETED : 0);
+ }
+
+ /* ...codec-specific buffer post-processing */
+ return CODEC_API(base, postprocess, done);
+}
+
+/* ...message-processing function (component entry point) */
+static int xa_base_command(xf_component_t *component, xf_message_t *m)
+{
+ XACodecBase *base = (XACodecBase *) component;
+ u32 cmd;
+
+ /* ...invoke data-processing function if message is null */
+ if (m == NULL)
+ {
+ XF_CHK_ERR(!XA_ERROR_SEVERITY(xa_base_process(base)), -EPIPE);
+ return 0;
+ }
+
+ /* ...process the command */
+ TRACE(EXEC, _b("[%p]:state[%X]:(%X, %d, %p)"), base, base->state, m->opcode, m->length, m->buffer);
+
+ /* ...bail out if this is forced termination command (I do have a map; maybe I'd better have a hook? - tbd) */
+ if ((cmd = XF_OPCODE_TYPE(m->opcode)) == XF_OPCODE_TYPE(XF_UNREGISTER))
+ {
+ TRACE(INIT, _b("force component[%p] termination"), base);
+ return -1;
+ }
+
+ /* ...check opcode is valid */
+ XF_CHK_ERR(cmd < base->command_num, -EINVAL);
+
+ /* ...and has a hook */
+ XF_CHK_ERR(base->command[cmd] != NULL, -EINVAL);
+
+ /* ...pass control to specific command */
+ XF_CHK_ERR(!XA_ERROR_SEVERITY(base->command[cmd](base, m)), -EPIPE);
+
+ /* ...execution completed successfully */
+ return 0;
+}
+
+/*******************************************************************************
+ * Base codec API
+ ******************************************************************************/
+
+/* ...data processing scheduling */
+void xa_base_schedule(XACodecBase *base, u32 dts)
+{
+ if ((base->state & XA_BASE_FLAG_SCHEDULE) == 0)
+ {
+ /* ...schedule component task execution */
+ xf_component_schedule(&base->component, dts);
+
+ /* ...and put scheduling flag */
+ base->state ^= XA_BASE_FLAG_SCHEDULE;
+ }
+ else
+ {
+ TRACE(EXEC, _b("codec[%p] processing pending"), base);
+ }
+}
+
+/* ...cancel data processing */
+void xa_base_cancel(XACodecBase *base)
+{
+ if (base->state & XA_BASE_FLAG_SCHEDULE)
+ {
+ /* ...cancel scheduled codec task */
+ xf_component_cancel(&base->component);
+
+ /* ...and clear scheduling flag */
+ base->state ^= XA_BASE_FLAG_SCHEDULE;
+
+ TRACE(EXEC, _b("codec[%p] processing cancelled"), base);
+ }
+}
+
+/* ...base codec destructor */
+void xa_base_destroy(XACodecBase *base, u32 size, u32 core)
+{
+ /* ...deallocate all resources */
+ xf_mm_free_buffer(&base->persist, core);
+ xf_mm_free_buffer(&base->mem_tabs, core);
+ xf_mm_free_buffer(&base->api, core);
+
+ /* ...destroy codec structure (and task) itself */
+ xf_mem_free(base, size, core, 0);
+
+ TRACE(INIT, _b("codec[%p]:%u destroyed"), base, core);
+}
+
+/* ...generic codec initialization routine */
+XACodecBase * xa_base_factory(u32 core, u32 size, xa_codec_func_t process)
+{
+ XACodecBase *base;
+
+ /* ...make sure the size is sane */
+ XF_CHK_ERR(size >= sizeof(XACodecBase), NULL);
+
+ /* ...allocate local memory for codec structure */
+ XF_CHK_ERR(base = xf_mem_alloc(size, 0, core, 0), NULL);
+
+ /* ...reset codec memory */
+ memset(base, 0, size);
+
+ /* ...set low-level codec API function */
+ base->process = process;
+
+ /* ...set message processing function */
+ base->component.entry = xa_base_command;
+
+ /* ...do basic initialization */
+ if (xa_base_preinit(base, core) != XA_NO_ERROR)
+ {
+ /* ...initialization failed for some reason; do cleanup */
+ xa_base_destroy(base, size, core);
+
+ return NULL;
+ }
+
+ /* ...initialization completed successfully */
+ TRACE(INIT, _b("Codec[%p]:%u initialized"), base, core);
+
+ return base;
+}
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-base.h b/hifi/xaf/hifi-dpf/audio/xa-class-base.h
new file mode 100644
index 00000000..252044d4
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/audio/xa-class-base.h
@@ -0,0 +1,263 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-class-base.h
+ *
+ * Generic Xtensa Audio codecs interfaces
+ *
+ ******************************************************************************/
+
+#ifndef __XA_CLASS_BASE_H
+#define __XA_CLASS_BASE_H
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+/* ...audio-specific API */
+#include "audio/xa_type_def.h"
+#include "audio/xa_error_standards.h"
+#include "audio/xa_apicmd_standards.h"
+#include "audio/xa_memory_standards.h"
+
+/*******************************************************************************
+ * Generic codec structure
+ ******************************************************************************/
+
+typedef struct XACodecBase XACodecBase;
+
+/* ...memory buffer initialization */
+typedef XA_ERRORCODE (*xa_codec_memtab_f)(XACodecBase *codec, WORD32 i, WORD32 type, WORD32 size, WORD32 align, u32 core);
+
+/* ...preprocessing operation */
+typedef XA_ERRORCODE (*xa_codec_preprocess_f)(XACodecBase *);
+
+/* ...postprocessing operation */
+typedef XA_ERRORCODE (*xa_codec_postprocess_f)(XACodecBase *, int);
+
+/* ...parameter setting function */
+typedef XA_ERRORCODE (*xa_codec_setparam_f)(XACodecBase *, WORD32, pVOID p);
+
+/* ...parameter retrival function */
+typedef XA_ERRORCODE (*xa_codec_getparam_f)(XACodecBase *, WORD32, pVOID p);
+
+/*******************************************************************************
+ * Codec instance structure
+ ******************************************************************************/
+
+struct XACodecBase
+{
+ /***************************************************************************
+ * Control data
+ **************************************************************************/
+
+ /* ...generic component handle */
+ xf_component_t component;
+
+ /* ...codec API entry point (function) */
+ xa_codec_func_t *process;
+
+ /* ...codec API handle, passed to *process */
+ xf_mm_buffer_t api;
+
+ /* ...memory table buffer */
+ xf_mm_buffer_t mem_tabs;
+
+ /* ...persistent memory buffer */
+ xf_mm_buffer_t persist;
+
+ /* ...scratch memory pointer */
+ void *scratch;
+
+ /* ...codec control state */
+ u32 state;
+
+ /***************************************************************************
+ * Codec-specific methods
+ **************************************************************************/
+
+ /* ...memory buffer initialization */
+ xa_codec_memtab_f memtab;
+
+ /* ...preprocessing function */
+ xa_codec_preprocess_f preprocess;
+
+ /* ...postprocessing function */
+ xa_codec_postprocess_f postprocess;
+
+ /* ...configuration parameter setting function */
+ xa_codec_setparam_f setparam;
+
+ /* ...configuration parameter retrieval function */
+ xa_codec_getparam_f getparam;
+
+ /* ...command-processing table */
+ XA_ERRORCODE (* const * command)(XACodecBase *, xf_message_t *);
+
+ /* ...command-processing table size */
+ u32 command_num;
+};
+
+/*******************************************************************************
+ * Base codec execution flags
+ ******************************************************************************/
+
+/* ...codec static initialization completed */
+#define XA_BASE_FLAG_POSTINIT (1 << 0)
+
+/* ...codec runtime initialization sequence */
+#define XA_BASE_FLAG_RUNTIME_INIT (1 << 1)
+
+/* ...codec steady execution state */
+#define XA_BASE_FLAG_EXECUTION (1 << 2)
+
+/* ...execution stage completed */
+#define XA_BASE_FLAG_COMPLETED (1 << 3)
+
+/* ...data processing scheduling flag */
+#define XA_BASE_FLAG_SCHEDULE (1 << 4)
+
+/* ...base codec flags accessor */
+#define __XA_BASE_FLAGS(flags) ((flags) & ((1 << 5) - 1))
+
+/* ...custom execution flag */
+#define __XA_BASE_FLAG(f) ((f) << 5)
+
+/*******************************************************************************
+ * Local macros definitions
+ ******************************************************************************/
+
+/* ...audio-framework API function execution */
+#define XA_CHK(cond) \
+({ \
+ XA_ERRORCODE __e = (cond); \
+ if (__e != XA_NO_ERROR) \
+ { \
+ if (XA_ERROR_SEVERITY(__e)) \
+ { \
+ TRACE(ERROR, _x("error: %X"), __e); \
+ return __e; \
+ } \
+ TRACE(WARNING, _x("warning: %X"), __e); \
+ } \
+ __e; \
+})
+
+/* ...low-level codec API function execution */
+#define XA_API(codec, cmd, idx, pv) \
+({ \
+ XA_ERRORCODE __e; \
+ __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv)); \
+ if (__e != XA_NO_ERROR) \
+ { \
+ if (XA_ERROR_SEVERITY(__e)) \
+ { \
+ TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e); \
+ return __e; \
+ } \
+ TRACE(WARNING, _x("%X"), __e); \
+ } \
+ __e; \
+})
+
+#define XA_API_NORET(codec, cmd, idx, pv) \
+({ \
+ XA_ERRORCODE __e; \
+ __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv)); \
+ if (__e != XA_NO_ERROR) \
+ { \
+ if (XA_ERROR_SEVERITY(__e)) \
+ { \
+ TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e); \
+ } \
+ TRACE(WARNING, _x("%X"), __e); \
+ } \
+ __e; \
+})
+
+/* ...codec hook invocation */
+#define CODEC_API(codec, func, ...) \
+({ \
+ XA_ERRORCODE __e = (codec)->func((codec), ##__VA_ARGS__); \
+ \
+ if (__e != XA_NO_ERROR) \
+ { \
+ if (XA_ERROR_SEVERITY(__e)) \
+ { \
+ /* ...actual error is reported by the codec */ \
+ TRACE(ERROR, _x("[%p]: " #func ": %X"), (codec), __e); \
+ return __e; \
+ } \
+ \
+ TRACE(WARNING, _x("warning: %X"), __e); \
+ } \
+ __e; \
+})
+
+/* ...allocate local memory on specific core */
+#define XMALLOC(p, size, align, core) \
+do \
+{ \
+ if (xf_mm_alloc_buffer((size), (align), (core), (p)) != 0) \
+ { \
+ TRACE(ERROR, _x("Failed to allocate %d bytes of memory"), (size)); \
+ return XA_API_FATAL_MEM_ALLOC; \
+ } \
+ \
+ if (((u32)((p)->addr) & ((align) - 1)) != 0) \
+ { \
+ TRACE(ERROR, _x("Invalid %d-algnment: %p"), (align), (p)->addr); \
+ return XA_API_FATAL_MEM_ALIGN; \
+ } \
+} \
+while (0)
+
+/*******************************************************************************
+ * Public API
+ ******************************************************************************/
+
+/* ...SET-PARAM processing */
+extern XA_ERRORCODE xa_base_set_param(XACodecBase *base, xf_message_t *m);
+
+/* ...GET-PARAM-EXT message processing */
+extern XA_ERRORCODE xa_base_set_param_ext(XACodecBase *base, xf_message_t *m);
+
+/* ...GET-PARAM message processing */
+extern XA_ERRORCODE xa_base_get_param(XACodecBase *base, xf_message_t *m);
+
+/* ...GET-PARAM-EXT message processing */
+extern XA_ERRORCODE xa_base_get_param_ext(XACodecBase *base, xf_message_t *m);
+
+/* ...data processing scheduling */
+extern void xa_base_schedule(XACodecBase *base, u32 dts);
+
+/* ...cancel internal scheduling message */
+extern void xa_base_cancel(XACodecBase *base);
+
+/* ...base codec factory */
+extern XACodecBase * xa_base_factory(u32 core, u32 size, xa_codec_func_t process);
+
+/* ...base codec destructor */
+extern void xa_base_destroy(XACodecBase *base, u32 size, u32 core);
+
+#endif /* __XA_CLASS_BASE_H */
diff --git a/hifi/xaf/hifi-dpf/audio/xa-class-mixer.c b/hifi/xaf/hifi-dpf/audio/xa-class-mixer.c
new file mode 100644
index 00000000..ac2ff9ad
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/audio/xa-class-mixer.c
@@ -0,0 +1,870 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-class-mixer.c
+ *
+ * Generic mixer component class
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG MIXER
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+#include "xa-class-base.h"
+#include "audio/xa-mixer-api.h"
+
+/*******************************************************************************
+ * Tracing tags
+ ******************************************************************************/
+
+TRACE_TAG(INIT, 1);
+TRACE_TAG(WARNING, 1);
+TRACE_TAG(INFO, 1);
+TRACE_TAG(INPUT, 1);
+TRACE_TAG(OUTPUT, 1);
+
+/*******************************************************************************
+ * Data structures
+ ******************************************************************************/
+
+/* ...mixed source - input data */
+typedef struct XATrack
+{
+ /* ...input port data */
+ xf_input_port_t input;
+
+ /* ...current presentation timestamp (in samples; local to a mixer state) */
+ u32 pts;
+
+ /* ...total amount of decoded frames since last synchronization point */
+ u32 decoded;
+
+ /* ...total amount of rendered frames (consumed) since last synchronization point */
+ u32 rendered;
+
+} XATrack;
+
+/*******************************************************************************
+ * Helpers
+ ******************************************************************************/
+
+static inline u32 xa_track_test_flags(XATrack *track, u32 flags)
+{
+ return (track->input.flags & flags);
+}
+
+static inline u32 xa_track_set_flags(XATrack *track, u32 flags)
+{
+ return (track->input.flags |= flags);
+}
+
+static inline u32 xa_track_clear_flags(XATrack *track, u32 flags)
+{
+ return (track->input.flags &= ~flags);
+}
+
+static inline u32 xa_track_toggle_flags(XATrack *track, u32 flags)
+{
+ return (track->input.flags ^= flags);
+}
+
+/*******************************************************************************
+ * Mixer data definitions
+ ******************************************************************************/
+
+/* ...mixer data */
+typedef struct XAMixer
+{
+ /***************************************************************************
+ * Control data
+ **************************************************************************/
+
+ /* ...generic audio codec data */
+ XACodecBase base;
+
+ /* ...input tracks */
+ XATrack track[XA_MIXER_MAX_TRACK_NUMBER];
+
+ /* ...output port */
+ xf_output_port_t output;
+
+ /***************************************************************************
+ * Run-time configuration parameters
+ **************************************************************************/
+
+ /* ...audio frame size in samples */
+ u32 frame_size;
+
+ /* ...audio frame duration */
+ u32 frame_duration;
+
+ /* ...presentation timestamp (in samples; local mixer scope) */
+ u32 pts;
+
+} XAMixer;
+
+/*******************************************************************************
+ * Mixer flags
+ ******************************************************************************/
+
+/* ...output port setup completed */
+#define XA_MIXER_FLAG_OUTPUT_SETUP __XA_BASE_FLAG(1 << 0)
+
+/*******************************************************************************
+ * Track state flags
+ ******************************************************************************/
+
+/* ...track is idle (will autostart as soon as input data received) */
+#define XA_TRACK_FLAG_IDLE __XF_INPUT_FLAG(1 << 0)
+
+/* ...track is rendered */
+#define XA_TRACK_FLAG_ACTIVE __XF_INPUT_FLAG(1 << 1)
+
+/* ...track is paused */
+#define XA_TRACK_FLAG_PAUSED __XF_INPUT_FLAG(1 << 2)
+
+/* ...track input port is setup */
+#define XA_TRACK_FLAG_INPUT_SETUP __XF_INPUT_FLAG(1 << 3)
+
+/* ...track has received data */
+#define XA_TRACK_FLAG_RECVD_DATA __XF_INPUT_FLAG(1 << 4)
+
+/*******************************************************************************
+ * Helper functions
+ ******************************************************************************/
+/* ...Count the tracks that have received data or are active*/
+static inline UWORD32 xa_mixer_check_active(XAMixer *mixer)
+{
+ XATrack *track;
+ UWORD32 i;
+ UWORD32 cnt = 0;
+
+ for (track = &mixer->track[i = 0]; i < XA_MIXER_MAX_TRACK_NUMBER; i++, track++)
+ {
+ if (xa_track_test_flags(track, XA_TRACK_FLAG_RECVD_DATA | XA_TRACK_FLAG_ACTIVE))
+ cnt++;
+ }
+ return cnt;
+}
+
+/* ...prepare mixer for steady operation */
+static inline XA_ERRORCODE xa_mixer_prepare_runtime(XAMixer *mixer)
+{
+ XACodecBase *base = (XACodecBase *) mixer;
+ xf_message_t *m = xf_msg_dequeue(&mixer->output.queue);
+ xf_start_msg_t *msg = m->buffer;
+ u32 frame_size;
+ u32 factor;
+
+ /* ...query mixer parameters */
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_MIXER_CONFIG_PARAM_SAMPLE_RATE, &msg->sample_rate);
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_MIXER_CONFIG_PARAM_CHANNELS, &msg->channels);
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_MIXER_CONFIG_PARAM_PCM_WIDTH, &msg->pcm_width);
+ XA_API(base, XA_API_CMD_GET_MEM_INFO_SIZE, 0, &msg->input_length);
+ XA_API(base, XA_API_CMD_GET_MEM_INFO_SIZE, XA_MIXER_MAX_TRACK_NUMBER, &msg->output_length);
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_MIXER_CONFIG_PARAM_FRAME_SIZE, &frame_size);
+
+ /* ...calculate mixer frame duration; get upsample factor */
+ XF_CHK_ERR(factor = xf_timebase_factor(msg->sample_rate), XA_MIXER_CONFIG_FATAL_RANGE);
+
+ /* ...set mixer frame duration */
+ mixer->frame_duration = frame_size * factor;
+
+ /* ...pass response to caller */
+ xf_response_data(m, sizeof(*msg));
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Commands handlers
+ ******************************************************************************/
+
+/* ...EMPTY-THIS-BUFFER command processing */
+static XA_ERRORCODE xa_mixer_empty_this_buffer(XACodecBase *base, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ u32 i = XF_MSG_DST_PORT(m->id);
+ XATrack *track = &mixer->track[i];
+
+ /* ...make sure the port is valid */
+ XF_CHK_ERR(i < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...command is allowed only in "postinit" state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ TRACE(INPUT, _b("track-%u: received buffer [%p]:%u"), i, m->buffer, m->length);
+
+ /* ...update received data for the track */
+ if (m->length)
+ xa_track_set_flags(track, XA_TRACK_FLAG_RECVD_DATA);
+ else
+ xa_track_clear_flags(track, XA_TRACK_FLAG_RECVD_DATA);
+
+ /* ...place received message into track input port */
+ if (xf_input_port_put(&track->input, m))
+ {
+ /* ...process track autostart if needed */
+ if (xa_track_test_flags(track, XA_TRACK_FLAG_IDLE))
+ {
+ /* ...put track into active state */
+ xa_track_toggle_flags(track, XA_TRACK_FLAG_IDLE | XA_TRACK_FLAG_ACTIVE);
+
+ /* ...save track presentation timestamp */
+ track->pts = mixer->pts;
+
+ TRACE(INFO, _b("track-%u started (pts=%x)"), i, track->pts);
+ }
+
+ /* ...schedule data processing if there is output port available */
+ if (xf_output_port_ready(&mixer->output))
+ {
+ /* ...force data processing */
+ xa_base_schedule(base, 0);
+ }
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...FILL-THIS-BUFFER command processing */
+static XA_ERRORCODE xa_mixer_fill_this_buffer(XACodecBase *base, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ u32 i = XF_MSG_DST_PORT(m->id);
+
+ /* ...make sure the port is valid */
+ XF_CHK_ERR(i == XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...command is allowed only in "postinit" state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...process runtime initialization explicitly */
+ if (base->state & XA_BASE_FLAG_RUNTIME_INIT)
+ {
+ /* ...message must be zero-length */
+ XF_CHK_ERR(m->length == 0, XA_MIXER_EXEC_FATAL_STATE);
+ }
+ else if (m->length != 0) /* ...EOS response */
+ {
+ /* ...message must have exactly expected size (there is no ordered abortion) */
+ XF_CHK_ERR(m->length == mixer->output.length, XA_MIXER_EXEC_FATAL_STATE);
+ }
+
+ TRACE(OUTPUT, _b("received output buffer [%p]:%u"), m->buffer, m->length);
+
+ /* ...put message into output port */
+ if (xf_output_port_put(&mixer->output, m))
+ {
+ /* ...force data processing */
+ xa_base_schedule(base, 0);
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...output port routing */
+static XA_ERRORCODE xa_mixer_port_route(XACodecBase *base, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ xf_route_port_msg_t *cmd = m->buffer;
+ xf_output_port_t *port = &mixer->output;
+ u32 src = XF_MSG_DST(m->id);
+ u32 dst = cmd->dst;
+
+ /* ...command is allowed only in "postinit" state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...make sure output port is addressed */
+ XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...make sure port is not routed yet */
+ XF_CHK_ERR(!xf_output_port_routed(port), XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...route output port - allocate queue */
+ XF_CHK_ERR(xf_output_port_route(port, __XF_MSG_ID(dst, src), cmd->alloc_number, cmd->alloc_size, cmd->alloc_align) == 0, XA_API_FATAL_MEM_ALLOC);
+
+ /* ...schedule processing instantly - tbd - check if we have anything pending on input */
+ xa_base_schedule(base, 0);
+
+ /* ...pass success result to caller */
+ xf_response_ok(m);
+
+ return XA_NO_ERROR;
+}
+
+/* ...port unroute command */
+static XA_ERRORCODE xa_mixer_port_unroute(XACodecBase *base, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ xf_output_port_t *port = &mixer->output;
+
+ /* ...command is allowed only in "postinit" state */
+ XF_CHK_ERR(base->state & XA_BASE_FLAG_POSTINIT, XA_API_FATAL_INVALID_CMD);
+
+ /* ...make sure output port is addressed */
+ XF_CHK_ERR(XF_MSG_DST_PORT(m->id) == XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...cancel any pending processing */
+ xa_base_cancel(base);
+
+ /* ...clear output-port-setup condition */
+ base->state &= ~XA_MIXER_FLAG_OUTPUT_SETUP;
+
+ /* ...pass flush command down the graph */
+ if (xf_output_port_flush(port, XF_FLUSH))
+ {
+ TRACE(INFO, _b("port is idle; instantly unroute"));
+
+ /* ...flushing sequence is not needed; command may be satisfied instantly */
+ xf_output_port_unroute(port);
+
+ /* ...pass response to the proxy */
+ xf_response_ok(m);
+ }
+ else
+ {
+ TRACE(INFO, _b("port is busy; propagate unroute command"));
+
+ /* ...flushing sequence is started; save flow-control message */
+ xf_output_port_unroute_start(port, m);
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...PAUSE message processing */
+static XA_ERRORCODE xa_mixer_pause(XACodecBase *base, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ u32 i = XF_MSG_DST_PORT(m->id);
+ XATrack *track = &mixer->track[i];
+
+ /* ...make sure the buffer is empty */
+ XF_CHK_ERR(m->length == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check destination port is valid */
+ XF_CHK_ERR(i < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check for actual track flags */
+ if (xa_track_test_flags(track, XA_TRACK_FLAG_ACTIVE))
+ {
+ /* ...switch to paused state */
+ xa_track_toggle_flags(track, XA_TRACK_FLAG_ACTIVE | XA_TRACK_FLAG_PAUSED);
+
+ /* ...other tracks may be waiting for this one, so force data processing */
+ if (xf_output_port_ready(&mixer->output))
+ {
+ xa_base_schedule(base, 0);
+ }
+
+ TRACE(INFO, _b("mixer[%p]::track[%u] paused"), mixer, i);
+ }
+ else
+ {
+ /* ...track is in idle state and pausing here means suspending */
+ TRACE(INFO, _b("mixer[%p]::track[%u] is not active"), mixer, i);
+ }
+
+ /* ...complete message immediately */
+ xf_response(m);
+
+ return XA_NO_ERROR;
+}
+
+/* ...RESUME command processing */
+static XA_ERRORCODE xa_mixer_resume(XACodecBase *base, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ u32 i = XF_MSG_DST_PORT(m->id);
+ XATrack *track = &mixer->track[i];
+
+ /* ...make sure the buffer is empty */
+ XF_CHK_ERR(m->length == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check destination port is valid */
+ XF_CHK_ERR(i < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check for actual track state */
+ if (xa_track_test_flags(track, XA_TRACK_FLAG_PAUSED))
+ {
+ /* ...switch track to active state */
+ xa_track_toggle_flags(track, XA_TRACK_FLAG_ACTIVE | XA_TRACK_FLAG_PAUSED);
+
+ /* ...reset track presentation timestamp - tbd */
+ track->pts = mixer->pts;
+
+ /* ...force data processing if there is an output buffer */
+ if (xf_output_port_ready(&mixer->output))
+ {
+ xa_base_schedule(base, 0);
+ }
+
+ TRACE(INFO, _b("mixer[%p]::track[%u] resumed"), mixer, i);
+ }
+ else
+ {
+ /* ...track is in idle state; do nothing */
+ TRACE(INFO, _b("mixer[%p]::track[%u] is not paused"), mixer, i);
+ }
+
+ /* ...complete message */
+ xf_response(m);
+
+ return XA_NO_ERROR;
+}
+
+/* ...FLUSH command processing */
+static XA_ERRORCODE xa_mixer_flush(XACodecBase *base, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ u32 i = XF_MSG_DST_PORT(m->id);
+ XATrack *track = &mixer->track[i];
+
+ /* ...make sure the buffer is empty */
+ XF_CHK_ERR(m->length == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check destination port index */
+ if (i == XA_MIXER_MAX_TRACK_NUMBER)
+ {
+ /* ...flushing response received; that is a port unrouting sequence */
+ XF_CHK_ERR(xf_output_port_unrouting(&mixer->output), XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...complete unroute sequence */
+ xf_output_port_unroute_done(&mixer->output);
+
+ TRACE(INFO, _b("port is unrouted"));
+
+ return XA_NO_ERROR;
+ }
+
+ /* ...check destination port index is valid */
+ XF_CHK_ERR(i < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...input port flushing; check the track state is valid */
+ if (xa_track_test_flags(track, XA_TRACK_FLAG_ACTIVE | XA_TRACK_FLAG_PAUSED))
+ {
+ /* ...purge input port */
+ xf_input_port_purge(&track->input);
+
+ /* ...force clearing of ACTIVE and INPUT_SETUP condition */
+ xa_track_clear_flags(track, XA_TRACK_FLAG_ACTIVE | XA_TRACK_FLAG_PAUSED | XA_TRACK_FLAG_INPUT_SETUP);
+
+ /* ...and enter into idle state */
+ xa_track_set_flags(track, XA_TRACK_FLAG_IDLE);
+
+ /* ...other tracks may be waiting for this track, so force data processing */
+ if (xf_output_port_ready(&mixer->output))
+ {
+ xa_base_schedule(base, 0);
+ }
+
+ TRACE(INFO, _b("mixer[%p]::track[%u] flushed"), mixer, i);
+ }
+
+ /* ...complete message instantly (no propagation to output port) */
+ xf_response(m);
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Codec API implementation
+ ******************************************************************************/
+
+/* ...buffers handling */
+static XA_ERRORCODE xa_mixer_memtab(XACodecBase *base, WORD32 idx, WORD32 type, WORD32 size, WORD32 align, u32 core)
+{
+ XAMixer *mixer = (XAMixer *)base;
+
+ if (type == XA_MEMTYPE_INPUT)
+ {
+ XATrack *track = &mixer->track[idx];
+
+ /* ...input buffer allocation; check track number is sane */
+ XF_CHK_ERR(idx < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...create input port for a track */
+ XF_CHK_ERR(xf_input_port_init(&track->input, size, align, core) == 0, XA_API_FATAL_MEM_ALLOC);
+
+ /* ...set input port buffer */
+ XA_API(base, XA_API_CMD_SET_MEM_PTR, idx, track->input.buffer);
+
+ /* ...put track into idle state (will start as soon as we receive data) */
+ xa_track_set_flags(track, XA_TRACK_FLAG_IDLE);
+
+ TRACE(INIT, _b("mixer[%p]::track[%u] input port created - size=%u"), mixer, idx, size);
+ }
+ else
+ {
+ /* ...output buffer allocation */
+ XF_CHK_ERR(type == XA_MEMTYPE_OUTPUT, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check port number is what we expect */
+ XF_CHK_ERR(idx == XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...set mixer frame-size (in samples - for timestamp tracking) */
+ XA_API(base, XA_API_CMD_GET_CONFIG_PARAM, XA_MIXER_CONFIG_PARAM_FRAME_SIZE, &mixer->frame_size);
+
+ /* ...create output port for a track */
+ XF_CHK_ERR(xf_output_port_init(&mixer->output, size) == 0, XA_API_FATAL_MEM_ALLOC);
+
+ TRACE(INIT, _b("mixer[%p] output port created; size=%u"), mixer, size);
+ }
+
+ return XA_NO_ERROR;
+}
+
+/* ...preprocessing function */
+static XA_ERRORCODE xa_mixer_preprocess(XACodecBase *base)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ XATrack *track;
+ u8 i;
+ XA_ERRORCODE e = XA_MIXER_EXEC_NONFATAL_NO_DATA;
+
+ /* ...prepare output buffer */
+ if (!(base->state & XA_MIXER_FLAG_OUTPUT_SETUP))
+ {
+ void *output;
+
+ /* ...set output buffer pointer */
+ if (base->state & XA_BASE_FLAG_RUNTIME_INIT)
+ {
+ /* ...no actual data processing during initialization */
+ return XA_NO_ERROR;
+ }
+ else if ((output = xf_output_port_data(&mixer->output)) == NULL)
+ {
+ /* ...no output buffer available */
+ return e;
+ }
+
+ /* ...set output buffer pointer */
+ XA_API(base, XA_API_CMD_SET_MEM_PTR, XA_MIXER_MAX_TRACK_NUMBER, output);
+
+ /* ...mark output port is setup */
+ base->state ^= XA_MIXER_FLAG_OUTPUT_SETUP;
+ }
+
+ /* ...check EOS */
+ if (!xa_mixer_check_active(mixer))
+ {
+ /* ...push EOS to output port */
+ xf_output_port_produce(&mixer->output, 0);
+ TRACE(INFO, _b("mixer[%p]::EOS generated"), mixer);
+ }
+
+ /* ...setup input buffer pointers and length */
+ for (track = &mixer->track[i = 0]; i < XA_MIXER_MAX_TRACK_NUMBER; i++, track++)
+ {
+ /* ...skip tracks that are not played */
+ if (!xa_track_test_flags(track, XA_TRACK_FLAG_ACTIVE)) continue;
+
+ /* ...set temporary mixing request */
+ e = XA_NO_ERROR;
+
+ /* ...skip the tracks that has been setup already */
+ if (xa_track_test_flags(track, XA_TRACK_FLAG_INPUT_SETUP)) continue;
+
+ /* ...found active track that hasn't been setup yet */
+ TRACE(INPUT, _b("track-%u: ts=%x vs mts=%x"), i, track->pts, mixer->pts);
+
+ /* ...if track presentation timestamp is in the future, do nothing yet really */
+ if (!xf_time_after(track->pts, mixer->pts))
+ {
+ u32 filled;
+
+ /* ...take actual data from input port (mixer is always using internal buffer) */
+ if (!xf_input_port_fill(&track->input))
+ {
+ /* ...failed to prefill input buffer - no sufficient data yet */
+ return XA_MIXER_EXEC_NONFATAL_NO_DATA;
+ }
+ else
+ {
+ /* ...retrieve number of bytes available */
+ filled = xf_input_port_level(&track->input);
+ }
+
+ /* ...set total number of bytes we have in buffer */
+ XA_API(base, XA_API_CMD_SET_INPUT_BYTES, i, &filled);
+
+ /* ...actual data is to be played */
+ TRACE(INPUT, _b("track-%u: filled %u bytes"), i, filled);
+ }
+
+ /* ...mark the track input is setup (emit silence or actual data) */
+ xa_track_set_flags(track, XA_TRACK_FLAG_INPUT_SETUP);
+ }
+
+ /* ...do mixing operation only when all active tracks are setup */
+ return e;
+}
+
+/* ...postprocessing function */
+static XA_ERRORCODE xa_mixer_postprocess(XACodecBase *base, int done)
+{
+ XAMixer *mixer = (XAMixer *) base;
+ XATrack *track;
+ u32 produced;
+ u32 consumed;
+ u8 i;
+
+ /* ...process execution stage transitions */
+ if (done)
+ {
+ if (base->state & XA_BASE_FLAG_RUNTIME_INIT)
+ {
+ /* ...failed to initialize runtime (can't be? - tbd)*/
+ BUG(1, _x("breakpoint"));
+ }
+ else if (base->state & XA_BASE_FLAG_EXECUTION)
+ {
+ /* ...enter into execution state; initialize runtime */
+ return XA_CHK(xa_mixer_prepare_runtime(mixer));
+ }
+ else
+ {
+ /* ...mixer operation is over (can't be? - tbd) */
+ BUG(1, _x("breakpoint"));
+ }
+ }
+
+ /* ...input ports maintenance; process all tracks */
+ for (track = &mixer->track[i = 0]; i < XA_MIXER_MAX_TRACK_NUMBER; i++, track++)
+ {
+ /* ...skip the tracks that are not runing */
+ if (!xa_track_test_flags(track, XA_TRACK_FLAG_ACTIVE)) continue;
+
+ /* ...clear input setup flag */
+ xa_track_clear_flags(track, XA_TRACK_FLAG_INPUT_SETUP);
+
+ /* ...advance track presentation timestamp */
+ track->pts += mixer->frame_size;
+
+ /* ...get total amount of consumed bytes */
+ XA_API(base, XA_API_CMD_GET_CURIDX_INPUT_BUF, i, &consumed);
+
+ TRACE(INPUT, _b("track-%u::postprocess(c=%u, ts=%x)"), i, consumed, track->pts);
+
+ /* ...consume that amount from input port (may be zero) */
+ xf_input_port_consume(&track->input, consumed);
+
+ /* ...check if input port is done */
+ if (xf_input_port_done(&track->input))
+ {
+ /* ...input stream is over; return zero-length input back to caller */
+ xf_input_port_purge(&track->input);
+
+ /* ...switch to idle state */
+ xa_track_toggle_flags(track, XA_TRACK_FLAG_ACTIVE | XA_TRACK_FLAG_IDLE);
+
+ TRACE(INFO, _b("mixer[%p]::track[%u] completed"), mixer, i);
+ }
+ }
+
+ /* ...check if we have produced anything */
+ XA_API(base, XA_API_CMD_GET_OUTPUT_BYTES, XA_MIXER_MAX_TRACK_NUMBER, &produced);
+
+ TRACE(OUTPUT, _b("mixer[%p]::postprocess(p=%u, ts=%x, done=%u)"), mixer, produced, mixer->pts, done);
+
+ /* ...output port maintenance */
+ if (produced)
+ {
+ /* ...make sure we have produced exactly single frame */
+ BUG(produced != mixer->output.length, _x("Invalid length: %u != %u"), produced, mixer->output.length);
+
+ /* ...steady mixing process; advance mixer presentation timestamp */
+ mixer->pts += mixer->frame_size;
+
+ /* ...push data from output port */
+ xf_output_port_produce(&mixer->output, produced);
+
+ /* ...clear output-setup condition */
+ base->state &= ~XA_MIXER_FLAG_OUTPUT_SETUP;
+ }
+
+ /* ...reschedule data processing if there is a pending output message */
+ if (xf_output_port_ready(&mixer->output))
+ {
+ /* ...schedule execution with respect to urgency */
+ xa_base_schedule(base, (produced ? mixer->frame_duration : 0));
+ }
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Command-processing function
+ ******************************************************************************/
+
+/* ...command hooks */
+static XA_ERRORCODE (* const xa_mixer_cmd[])(XACodecBase *, xf_message_t *) =
+{
+ /* ...set-parameter - actually, same as in generic case */
+ [XF_OPCODE_TYPE(XF_SET_PARAM)] = xa_base_set_param,
+ [XF_OPCODE_TYPE(XF_GET_PARAM)] = xa_base_get_param,
+
+ /* ...output port routing/unrouting */
+ [XF_OPCODE_TYPE(XF_ROUTE)] = xa_mixer_port_route,
+ [XF_OPCODE_TYPE(XF_UNROUTE)] = xa_mixer_port_unroute,
+
+ /* ...input/output buffers processing */
+ [XF_OPCODE_TYPE(XF_EMPTY_THIS_BUFFER)] = xa_mixer_empty_this_buffer,
+ [XF_OPCODE_TYPE(XF_FILL_THIS_BUFFER)] = xa_mixer_fill_this_buffer,
+ [XF_OPCODE_TYPE(XF_FLUSH)] = xa_mixer_flush,
+
+ /* ...track control */
+ [XF_OPCODE_TYPE(XF_PAUSE)] = xa_mixer_pause,
+ [XF_OPCODE_TYPE(XF_RESUME)] = xa_mixer_resume,
+};
+
+/* ...total number of commands supported */
+#define XA_MIXER_CMD_NUM (sizeof(xa_mixer_cmd) / sizeof(xa_mixer_cmd[0]))
+
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+/* ...mixer termination-state command processor */
+static int xa_mixer_terminate(xf_component_t *component, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) component;
+ u32 opcode = m->opcode;
+
+ if (m == xf_output_port_control_msg(&mixer->output))
+ {
+ /* ...output port flushing complete; mark port is idle and terminate */
+ xf_output_port_flush_done(&mixer->output);
+ return -1;
+ }
+ else if (opcode == XF_FILL_THIS_BUFFER && xf_output_port_routed(&mixer->output))
+ {
+ /* ...output buffer returned by the sink component; ignore and keep waiting */
+ TRACE(OUTPUT, _b("collect output buffer"));
+ return 0;
+ }
+ else if (opcode == XF_UNREGISTER)
+ {
+ /* ...ignore subsequent unregister command/response */
+ return 0;
+ }
+ else
+ {
+ /* ...everything else is responded with generic failure */
+ xf_response_err(m);
+ return 0;
+ }
+}
+
+/* ...mixer class destructor */
+static int xa_mixer_destroy(xf_component_t *component, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) component;
+ u32 core = xf_component_core(component);
+ u32 i;
+
+ /* ...destroy all inputs */
+ for (i = 0; i < XA_MIXER_MAX_TRACK_NUMBER; i++)
+ {
+ xf_input_port_destroy(&mixer->track[i].input, core);
+ }
+
+ /* ...destroy output port */
+ xf_output_port_destroy(&mixer->output, core);
+
+ /* ...destroy base object */
+ xa_base_destroy(&mixer->base, XF_MM(sizeof(*mixer)), core);
+
+ TRACE(INIT, _b("mixer[%p] destroyed"), mixer);
+
+ return 0;
+}
+
+/* ...mixer class first-stage destructor */
+static int xa_mixer_cleanup(xf_component_t *component, xf_message_t *m)
+{
+ XAMixer *mixer = (XAMixer *) component;
+ u32 i;
+
+ /* ...complete message with error result code */
+ xf_response_err(m);
+
+ /* ...cancel internal scheduling message if needed */
+ xa_base_cancel(&mixer->base);
+
+ /* ...purge all input ports (specify "unregister"? - don't know yet - tbd) */
+ for (i = 0; i < XA_MIXER_MAX_TRACK_NUMBER; i++)
+ {
+ xf_input_port_purge(&mixer->track[i].input);
+ }
+
+ /* ...flush output port */
+ if (xf_output_port_flush(&mixer->output, XF_FLUSH))
+ {
+ /* ...flushing sequence is not needed; destroy mixer */
+ return xa_mixer_destroy(component, NULL);
+ }
+ else
+ {
+ /* ...wait until output port is cleaned; adjust component hooks */
+ component->entry = xa_mixer_terminate;
+ component->exit = xa_mixer_destroy;
+
+ TRACE(INIT, _b("mixer[%p] cleanup sequence started"), mixer);
+
+ /* ...indicate that second stage is required */
+ return 1;
+ }
+}
+
+/* ...mixer class factory */
+xf_component_t * xa_mixer_factory(u32 core, xa_codec_func_t process)
+{
+ XAMixer *mixer;
+
+ /* ...construct generic audio component */
+ XF_CHK_ERR(mixer = (XAMixer *)xa_base_factory(core, XF_MM(sizeof(*mixer)), process), NULL);
+
+ /* ...set generic codec API */
+ mixer->base.memtab = xa_mixer_memtab;
+ mixer->base.preprocess = xa_mixer_preprocess;
+ mixer->base.postprocess = xa_mixer_postprocess;
+
+ /* ...set message-processing table */
+ mixer->base.command = xa_mixer_cmd;
+ mixer->base.command_num = XA_MIXER_CMD_NUM;
+
+ /* ...set component destructor hook */
+ mixer->base.component.exit = xa_mixer_cleanup;
+
+ TRACE(INIT, _b("Mixer[%p] created"), mixer);
+
+ /* ...return handle to component */
+ return (xf_component_t *) mixer;
+}
diff --git a/hifi/xaf/hifi-dpf/build_hikey/Makefile b/hifi/xaf/hifi-dpf/build_hikey/Makefile
new file mode 100644
index 00000000..e1980a0d
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/Makefile
@@ -0,0 +1,135 @@
+#
+# 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.
+#
+
+
+.PHONY: all install clean HIKEY960
+
+NOSTRIP = 1
+XF_TRACE = 1
+
+ROOTDIR = ..
+CODEC_NAME = hikey
+
+PLUGINO2OBJS =
+PLUGINLIBS =
+PLUGININCLUDES =
+
+XA_MP3_DECODER ?= 0
+XA_VORBIS_DECODER ?= 1
+XA_MIXER ?= 1
+XA_PCM ?= 1
+
+
+vpath %.c $(ROOTDIR)/ipc/xt-shmem/hikey
+vpath %.c $(ROOTDIR)/ipc/xt-shmem
+vpath %.c $(ROOTDIR)/core/util
+vpath %.c $(ROOTDIR)/core/util/gdbstub
+vpath %.c $(ROOTDIR)/core
+vpath %.c $(ROOTDIR)/app
+vpath %.c $(ROOTDIR)/audio
+
+vpath %.S $(ROOTDIR)/ipc/xt-shmem/hikey
+vpath %.S $(ROOTDIR)/core/util/gdbstub
+
+vpath %.c $(ROOTDIR)/plugins/cadence/mixer
+
+LIBXAFASMOBJS = \
+ reset.o \
+ int_vector.o \
+ arch_hifi330.o \
+ gdbstub-entry.o
+
+LIBXAFO2OBJS = \
+ cpu_c.o \
+ dsp_debug.o \
+ dsp_comm.o \
+ mutex.o \
+ rbtree.o \
+ xf-core.o \
+ xf-io.o \
+ xf-mem.o \
+ xf-msg.o \
+ xf-sched.o \
+ xa-factory.o \
+ xf-shmem.o \
+ tinyvprintf.o \
+ xf-isr.o \
+ gdbstub.o \
+ xa-class-base.o \
+ xa-class-audio-codec.o \
+ xa-class-mixer.o \
+ xf-main.o
+
+ifeq ($(XF_TRACE),1)
+ CFLAGS += -DXF_TRACE=1
+ CFLAGS += -DXAF_PROFILE_DSP=1
+endif
+
+ifeq ($(XA_MP3_DECODER),1)
+ vpath %.c $(ROOTDIR)/plugins/cadence/mp3_dec
+ CFLAGS += -DXA_MP3_DECODER=1
+ PLUGINO2OBJS += xa-mp3-decoder.o
+ PLUGINLIBS += $(ROOTDIR)/plugins/cadence/mp3_dec/lib/hifi2/xa_mp3_dec.a
+ PLUGININCLUDES += -I$(ROOTDIR)/plugins/cadence/mp3_dec
+endif
+
+ifeq ($(XA_PCM),1)
+ vpath %.c $(ROOTDIR)/plugins/cadence/pcm_proc
+ CFLAGS += -DXA_PCM=1
+ PLUGINO2OBJS += xa-pcm.o
+ PLUGINLIBS +=
+ PLUGININCLUDES += -I$(ROOTDIR)/plugins/cadence/pcm_proc
+endif
+
+ifeq ($(XA_VORBIS_DECODER),1)
+ vpath %.c $(ROOTDIR)/plugins/cadence/vorbis_dec
+ CFLAGS += -DXA_VORBIS_DECODER=1
+ PLUGINO2OBJS += xa-vorbis-decoder.o
+ PLUGINLIBS += $(ROOTDIR)/plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a
+ PLUGININCLUDES += -I$(ROOTDIR)/plugins/cadence/vorbis_dec
+endif
+
+ifeq ($(XA_MIXER),1)
+ vpath %.c $(ROOTDIR)/plugins/cadence/mixer
+ CFLAGS += -DXA_MIXER=1
+ PLUGINO2OBJS += xa-mixer.o
+ PLUGINLIBS +=
+ PLUGININCLUDES += -I$(ROOTDIR)/plugins/cadence/mixer
+endif
+
+LIBO2OBJS = $(LIBXAFO2OBJS) $(LIBMP3DECO2OBJS) $(LIBMIXERO2OBJS) $(PLUGINO2OBJS)
+LIBASMOBJS = $(LIBXAFASMOBJS)
+
+INCLUDES += \
+ -I$(ROOTDIR)/include \
+ -I$(ROOTDIR)/include/audio \
+ -I$(ROOTDIR)/include/sys/xt-shmem \
+ -I$(ROOTDIR)/include/sys/xt-shmem/board-hikey \
+ -I$(ROOTDIR)/plugins/cadence/mp3_dec
+
+INCLUDES += $(PLUGININCLUDES)
+
+LDFLAGS += -nostdlib -lhal -lhandlers-board -lc -lgcc
+LDFLAGS += -mlsp="./hifi_hikey_lsp"
+
+HIKEY960: $(CODEC_NAME)
+
+include $(ROOTDIR)/build_hikey/common.mk
diff --git a/hifi/xaf/hifi-dpf/build_hikey/common.mk b/hifi/xaf/hifi-dpf/build_hikey/common.mk
new file mode 100644
index 00000000..ef4429ea
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/common.mk
@@ -0,0 +1,156 @@
+#
+# 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.
+#
+
+QUIET =
+MAPFILE = map_$(CODEC_NAME).txt
+LDSCRIPT = ldscript_$(CODEC_NAME).txt
+SYMFILE = symbols_$(CODEC_NAME).txt
+ELFTOBIN = $(ROOTDIR)/build_hikey/tools/elftobin.sh
+
+ifeq ($(CPU), gcc)
+ S = /
+ AR = ar
+ OBJCOPY = objcopy
+ CC = gcc
+ CXX = g++
+ CFLAGS += -fno-exceptions -DCSTUB=1
+ CFLAGS += -ffloat-store
+ CFLAGS += -DHIFI3_CSTUB
+ RM = rm -f
+ RM_R = rm -rf
+ MKPATH = mkdir -p
+ CP = cp -f
+ INCLUDES += \
+ -I$(ROOTDIR)/test/include
+else
+ AR = xt-ar $(XTCORE)
+ OBJCOPY = xt-objcopy $(XTCORE)
+ CC = xt-xcc $(XTCORE)
+ CXX = xt-xc++ $(XTCORE)
+ ISS = xt-run $(XTCORE)
+ CONFIGDIR := $(shell $(ISS) --show-config=config)
+ include $(CONFIGDIR)/misc/hostenv.mk
+ #CFLAGS += -Wall
+ #CFLAGS += -Werror
+ #CFLAGS += -mno-mul16 -mno-mul32 -mno-div32 -fsigned-char -fno-exceptions -mlongcalls -INLINE:requested -mcoproc -fno-zero-initialized-in-bss
+ CFLAGS += -mlongcalls -mtext-section-literals
+ ASMFLAGS += -mlongcalls
+endif
+
+OBJDIR = objs$(S)$(CODEC_NAME)
+LIBDIR = $(ROOTDIR)$(S)lib
+
+OBJ_LIBO2OBJS = $(addprefix $(OBJDIR)/,$(LIBO2OBJS))
+OBJ_LIBOSOBJS = $(addprefix $(OBJDIR)/,$(LIBOSOBJS))
+OBJ_LIBO2CPPOBJS = $(addprefix $(OBJDIR)/,$(LIBO2CPPOBJS))
+OBJ_LIBOSCPPOBJS = $(addprefix $(OBJDIR)/,$(LIBOSCPPOBJS))
+OBJ_LIBASMOBJS = $(addprefix $(OBJDIR)/,$(LIBASMOBJS))
+
+TEMPOBJ = temp.o
+
+ifeq ($(CPU), gcc)
+ LIBOBJ = $(OBJDIR)/xgcc_$(CODEC_NAME).o
+ LIB = xgcc_$(CODEC_NAME).img
+else
+ LIBOBJ = $(OBJDIR)/xa_$(CODEC_NAME).o
+ LIB = xa_$(CODEC_NAME).img
+endif
+
+CFLAGS += \
+ $(EXTRA_CFLAGS) $(EXTRA_CFLAGS2)
+
+
+ifeq ($(DEBUG),1)
+ NOSTRIP = 1
+ OPT_O2 = -O0 -g
+ OPT_OS = -O0 -g
+ CFLAGS += -DDEBUG
+else
+ifeq ($(CPU), gcc)
+ OPT_O2 = -O2 -g
+ OPT_OS = -O2 -g
+else
+ #OPT_O2 = -O3 -LNO:simd
+ OPT_O2 = -g -O2
+ OPT_OS = -Os
+endif
+endif
+
+OPT_ASM = -g -Wa,--gdwarf-2
+
+
+all: $(OBJDIR) $(LIB)
+$(CODEC_NAME): $(OBJDIR) $(LIB)
+
+install: $(LIB)
+ @echo "Installing $(LIB)"
+ $(QUIET) -$(MKPATH) "$(LIBDIR)"
+ $(QUIET) $(CP) $(LIB) "$(LIBDIR)"
+
+$(OBJDIR):
+ $(QUIET) -$(MKPATH) $@
+
+ifeq ($(NOSTRIP), 1)
+$(LIBOBJ): $(OBJ_LIBO2OBJS) $(OBJ_LIBOSOBJS) $(OBJ_LIBO2CPPOBJS) $(OBJ_LIBOSCPPOBJS) $(OBJ_LIBASMOBJS) $(PLUGINLIBS)
+ @echo "Linking Objects"
+ $(QUIET) $(CXX) -c $(OPT_O2) $(CFLAGS) -o $@ $^ \
+ -Wl,-Map,$(MAPFILE) --no-standard-libraries \
+ $(LDFLAGS) $(EXTRA_LDFLAGS)
+else
+$(LIBOBJ): $(OBJ_LIBO2OBJS) $(OBJ_LIBOSOBJS) $(OBJ_LIBO2CPPOBJS) $(OBJ_LIBOSCPPOBJS) $(OBJ_LIBASMOBJS) $(PLUGINLIBS)
+ @echo "Linking Objects"
+ $(QUIET) $(CXX) -c $(OPT_O2) $(CFLAGS) -o $@ $^ \
+ -Wl,-Map,$(MAPFILE) --no-standard-libraries \
+ -Wl,--retain-symbols-file,$(SYMFILE) \
+ $(IPA_FLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS)
+ $(QUIET) $(OBJCOPY) --keep-global-symbols=$(SYMFILE) $@ $(TEMPOBJ)
+ $(QUIET) $(OBJCOPY) --strip-unneeded $(TEMPOBJ) $@
+ $(QUIET) -$(RM) $(TEMPOBJ)
+endif
+
+
+$(OBJ_LIBO2OBJS): $(OBJDIR)/%.o: %.c
+ @echo "Compiling $<"
+ $(QUIET) $(CC) -o $@ $(OPT_O2) $(CFLAGS) $(INCLUDES) -c $<
+
+$(OBJ_LIBOSOBJS): $(OBJDIR)/%.o: %.c
+ @echo "Compiling $<"
+ $(QUIET) $(CC) -o $@ $(OPT_OS) $(CFLAGS) $(INCLUDES) -c $<
+
+$(OBJ_LIBO2CPPOBJS): $(OBJDIR)/%.o: %.cpp
+ @echo "Compiling $<"
+ $(QUIET) $(CXX) -o $@ $(OPT_O2) $(CFLAGS) $(INCLUDES) -c $<
+
+$(OBJ_LIBOSCPPOBJS): $(OBJDIR)/%.o: %.cpp
+ @echo "Compiling $<"
+ $(QUIET) $(CXX) -o $@ $(OPT_OS) $(CFLAGS) $(INCLUDES) -c $<
+
+$(OBJ_LIBASMOBJS): $(OBJDIR)/%.o: %.S
+ @echo "Compiling $<"
+ $(QUIET) $(CC) -o $@ $(OPT_ASM) $(ASMFLAGS) $(INCLUDES) -c $<
+
+$(LIB): %.img: $(OBJDIR)/%.o
+ @echo "Creating Library $@"
+ $(ELFTOBIN) $< $@
+
+clean:
+ -$(RM) $(LIB) $(MAPFILE)
+ -$(RM_R) $(OBJDIR) $(LIBDIR)
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.x b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.x
new file mode 100644
index 00000000..67507ed3
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.x
@@ -0,0 +1,827 @@
+/* This linker script generated from xt-genldscripts.tpp for LSP hifi_hikey_lsp */
+/* Linker Script for default link */
+MEMORY
+{
+ sram0_seg : org = 0xC0000000, len = 0x408000
+ old_vlpd_seg : org = 0xC0408000, len = 0x10000
+ efr_fr_hr_vlpd_seg : org = 0xC0418000, len = 0x10000
+ amr_vlpd_seg : org = 0xC0428000, len = 0x10000
+ amrwb_vlpd_seg : org = 0xC0438000, len = 0x10000
+ evrc_evrcb_vlpt_seg : org = 0xC0448000, len = 0x48000
+ efr_fr_hr_vlpt_seg : org = 0xC0490000, len = 0x30000
+ amr_vlpt_seg : org = 0xC04C0000, len = 0x20000
+ amrwb_vlpt_seg : org = 0xC04E0000, len = 0x30000
+ vlpt_seg : org = 0xC0510000, len = 0x48000
+ vlpd_seg : org = 0xC0558000, len = 0x20000
+ ulpp_seg : org = 0xC0578000, len = 0x40000
+ dtsv3_seg : org = 0xC05B8000, len = 0x20000
+ dtsv4_seg : org = 0xC05D8000, len = 0x28000
+ dram0_0_seg : org = 0xE8058000, len = 0x28000
+ iram0_0_seg : org = 0xE8080000, len = 0x300
+ iram0_1_seg : org = 0xE8080300, len = 0x100
+ iram0_2_seg : org = 0xE8080400, len = 0x178
+ iram0_3_seg : org = 0xE8080578, len = 0x8
+ iram0_4_seg : org = 0xE8080580, len = 0x38
+ iram0_5_seg : org = 0xE80805B8, len = 0x8
+ iram0_6_seg : org = 0xE80805C0, len = 0x38
+ iram0_7_seg : org = 0xE80805F8, len = 0x8
+ iram0_8_seg : org = 0xE8080600, len = 0x38
+ iram0_9_seg : org = 0xE8080638, len = 0x8
+ iram0_10_seg : org = 0xE8080640, len = 0x38
+ iram0_11_seg : org = 0xE8080678, len = 0x48
+ iram0_12_seg : org = 0xE80806C0, len = 0x38
+ iram0_13_seg : org = 0xE80806F8, len = 0x8
+ iram0_14_seg : org = 0xE8080700, len = 0x38
+ iram0_15_seg : org = 0xE8080738, len = 0x8
+ iram0_16_seg : org = 0xE8080740, len = 0x38
+ iram0_17_seg : org = 0xE8080778, len = 0x48
+ iram0_18_seg : org = 0xE80807C0, len = 0x40
+ iram0_19_seg : org = 0xE8080800, len = 0xB800
+}
+
+PHDRS
+{
+ sram0_phdr PT_LOAD;
+ sram0_bss_phdr PT_LOAD;
+ old_vlpd_phdr PT_LOAD;
+ old_vlpd_bss_phdr PT_LOAD;
+ efr_fr_hr_vlpd_phdr PT_LOAD;
+ efr_fr_hr_vlpd_bss_phdr PT_LOAD;
+ amr_vlpd_phdr PT_LOAD;
+ amr_vlpd_bss_phdr PT_LOAD;
+ amrwb_vlpd_phdr PT_LOAD;
+ amrwb_vlpd_bss_phdr PT_LOAD;
+ evrc_evrcb_vlpt_phdr PT_LOAD;
+ efr_fr_hr_vlpt_phdr PT_LOAD;
+ amr_vlpt_phdr PT_LOAD;
+ amrwb_vlpt_phdr PT_LOAD;
+ vlpt_phdr PT_LOAD;
+ vlpd_phdr PT_LOAD;
+ ulpp_phdr PT_LOAD;
+ ulpp_bss_phdr PT_LOAD;
+ dtsv3_phdr PT_LOAD;
+ dtsv3_bss_phdr PT_LOAD;
+ dtsv4_phdr PT_LOAD;
+ dtsv4_bss_phdr PT_LOAD;
+ dram0_0_phdr PT_LOAD;
+ dram0_0_bss_phdr PT_LOAD;
+ iram0_0_phdr PT_LOAD;
+ iram0_1_phdr PT_LOAD;
+ iram0_2_phdr PT_LOAD;
+ iram0_3_phdr PT_LOAD;
+ iram0_4_phdr PT_LOAD;
+ iram0_5_phdr PT_LOAD;
+ iram0_6_phdr PT_LOAD;
+ iram0_7_phdr PT_LOAD;
+ iram0_8_phdr PT_LOAD;
+ iram0_9_phdr PT_LOAD;
+ iram0_10_phdr PT_LOAD;
+ iram0_11_phdr PT_LOAD;
+ iram0_12_phdr PT_LOAD;
+ iram0_13_phdr PT_LOAD;
+ iram0_14_phdr PT_LOAD;
+ iram0_15_phdr PT_LOAD;
+ iram0_16_phdr PT_LOAD;
+ iram0_17_phdr PT_LOAD;
+ iram0_18_phdr PT_LOAD;
+ iram0_19_phdr PT_LOAD;
+}
+
+
+/* Default entry point: */
+ENTRY(_ResetVector)
+
+/* Memory boundary addresses: */
+_memmap_mem_iram0_start = 0xe8080000;
+_memmap_mem_iram0_end = 0xe808c000;
+_memmap_mem_dram0_start = 0xe8058000;
+_memmap_mem_dram0_end = 0xe8080000;
+_memmap_mem_sram_start = 0xc0000000;
+_memmap_mem_sram_end = 0xc0600000;
+
+/* Memory segment boundary addresses: */
+_memmap_seg_sram0_start = 0xc0000000;
+_memmap_seg_sram0_max = 0xc0408000;
+_memmap_seg_old_vlpd_start = 0xc0408000;
+_memmap_seg_old_vlpd_max = 0xc0418000;
+_memmap_seg_efr_fr_hr_vlpd_start = 0xc0418000;
+_memmap_seg_efr_fr_hr_vlpd_max = 0xc0428000;
+_memmap_seg_amr_vlpd_start = 0xc0428000;
+_memmap_seg_amr_vlpd_max = 0xc0438000;
+_memmap_seg_amrwb_vlpd_start = 0xc0438000;
+_memmap_seg_amrwb_vlpd_max = 0xc0448000;
+_memmap_seg_evrc_evrcb_vlpt_start = 0xc0448000;
+_memmap_seg_evrc_evrcb_vlpt_max = 0xc0490000;
+_memmap_seg_efr_fr_hr_vlpt_start = 0xc0490000;
+_memmap_seg_efr_fr_hr_vlpt_max = 0xc04c0000;
+_memmap_seg_amr_vlpt_start = 0xc04c0000;
+_memmap_seg_amr_vlpt_max = 0xc04e0000;
+_memmap_seg_amrwb_vlpt_start = 0xc04e0000;
+_memmap_seg_amrwb_vlpt_max = 0xc0510000;
+_memmap_seg_vlpt_start = 0xc0510000;
+_memmap_seg_vlpt_max = 0xc0558000;
+_memmap_seg_vlpd_start = 0xc0558000;
+_memmap_seg_vlpd_max = 0xc0578000;
+_memmap_seg_ulpp_start = 0xc0578000;
+_memmap_seg_ulpp_max = 0xc05b8000;
+_memmap_seg_dtsv3_start = 0xc05b8000;
+_memmap_seg_dtsv3_max = 0xc05d8000;
+_memmap_seg_dtsv4_start = 0xc05d8000;
+_memmap_seg_dtsv4_max = 0xc0600000;
+_memmap_seg_dram0_0_start = 0xe8058000;
+_memmap_seg_dram0_0_max = 0xe8080000;
+_memmap_seg_iram0_0_start = 0xe8080000;
+_memmap_seg_iram0_0_max = 0xe8080300;
+_memmap_seg_iram0_1_start = 0xe8080300;
+_memmap_seg_iram0_1_max = 0xe8080400;
+_memmap_seg_iram0_2_start = 0xe8080400;
+_memmap_seg_iram0_2_max = 0xe8080578;
+_memmap_seg_iram0_3_start = 0xe8080578;
+_memmap_seg_iram0_3_max = 0xe8080580;
+_memmap_seg_iram0_4_start = 0xe8080580;
+_memmap_seg_iram0_4_max = 0xe80805b8;
+_memmap_seg_iram0_5_start = 0xe80805b8;
+_memmap_seg_iram0_5_max = 0xe80805c0;
+_memmap_seg_iram0_6_start = 0xe80805c0;
+_memmap_seg_iram0_6_max = 0xe80805f8;
+_memmap_seg_iram0_7_start = 0xe80805f8;
+_memmap_seg_iram0_7_max = 0xe8080600;
+_memmap_seg_iram0_8_start = 0xe8080600;
+_memmap_seg_iram0_8_max = 0xe8080638;
+_memmap_seg_iram0_9_start = 0xe8080638;
+_memmap_seg_iram0_9_max = 0xe8080640;
+_memmap_seg_iram0_10_start = 0xe8080640;
+_memmap_seg_iram0_10_max = 0xe8080678;
+_memmap_seg_iram0_11_start = 0xe8080678;
+_memmap_seg_iram0_11_max = 0xe80806c0;
+_memmap_seg_iram0_12_start = 0xe80806c0;
+_memmap_seg_iram0_12_max = 0xe80806f8;
+_memmap_seg_iram0_13_start = 0xe80806f8;
+_memmap_seg_iram0_13_max = 0xe8080700;
+_memmap_seg_iram0_14_start = 0xe8080700;
+_memmap_seg_iram0_14_max = 0xe8080738;
+_memmap_seg_iram0_15_start = 0xe8080738;
+_memmap_seg_iram0_15_max = 0xe8080740;
+_memmap_seg_iram0_16_start = 0xe8080740;
+_memmap_seg_iram0_16_max = 0xe8080778;
+_memmap_seg_iram0_17_start = 0xe8080778;
+_memmap_seg_iram0_17_max = 0xe80807c0;
+_memmap_seg_iram0_18_start = 0xe80807c0;
+_memmap_seg_iram0_18_max = 0xe8080800;
+_memmap_seg_iram0_19_start = 0xe8080800;
+_memmap_seg_iram0_19_max = 0xe808c000;
+
+_rom_store_table = 0;
+PROVIDE(_memmap_vecbase_reset = 0xe8080400);
+PROVIDE(_memmap_reset_vector = 0xe8080000);
+/* Various memory-map dependent cache attribute settings: */
+_memmap_cacheattr_wb_base = 0x44000000;
+_memmap_cacheattr_wt_base = 0x11000000;
+_memmap_cacheattr_bp_base = 0x22000000;
+_memmap_cacheattr_unused_mask = 0x00FFFFFF;
+_memmap_cacheattr_wb_trapnull = 0x4422222F;
+_memmap_cacheattr_wba_trapnull = 0x4422222F;
+_memmap_cacheattr_wbna_trapnull = 0x5522222F;
+_memmap_cacheattr_wt_trapnull = 0x1122222F;
+_memmap_cacheattr_bp_trapnull = 0x2222222F;
+_memmap_cacheattr_wb_strict = 0x44FFFFFF;
+_memmap_cacheattr_wt_strict = 0x11FFFFFF;
+_memmap_cacheattr_bp_strict = 0x22FFFFFF;
+_memmap_cacheattr_wb_allvalid = 0x44222222;
+_memmap_cacheattr_wt_allvalid = 0x11222222;
+_memmap_cacheattr_bp_allvalid = 0x22222222;
+PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
+
+SECTIONS
+{
+
+ .vlpd.rodata : ALIGN(4)
+ {
+ _vlpd_rodata_start = ABSOLUTE(.);
+ *(.vlpd.rodata)
+ _vlpd_rodata_end = ABSOLUTE(.);
+ } >old_vlpd_seg :old_vlpd_phdr
+
+ .vlpd.data : ALIGN(4)
+ {
+ _vlpd_data_start = ABSOLUTE(.);
+ *(.vlpd.data)
+ _vlpd_data_end = ABSOLUTE(.);
+ } >old_vlpd_seg :old_vlpd_phdr
+
+ .vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _vlpd_bss_start = ABSOLUTE(.);
+ *(.vlpd.bss)
+ . = ALIGN (8);
+ _vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_old_vlpd_end = ALIGN(0x8);
+ } >old_vlpd_seg :old_vlpd_bss_phdr
+
+ .efr_fr_hr_vlpd.rodata : ALIGN(4)
+ {
+ _efr_fr_hr_vlpd_rodata_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.rodata)
+ _efr_fr_hr_vlpd_rodata_end = ABSOLUTE(.);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_phdr
+
+ .efr_fr_hr_vlpd.data : ALIGN(4)
+ {
+ _efr_fr_hr_vlpd_data_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.data)
+ _efr_fr_hr_vlpd_data_end = ABSOLUTE(.);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_phdr
+
+ .efr_fr_hr_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _efr_fr_hr_vlpd_bss_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.bss)
+ . = ALIGN (8);
+ _efr_fr_hr_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_efr_fr_hr_vlpd_end = ALIGN(0x8);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_bss_phdr
+
+ .amr_vlpd.rodata : ALIGN(4)
+ {
+ _amr_vlpd_rodata_start = ABSOLUTE(.);
+ *(.amr_vlpd.rodata)
+ _amr_vlpd_rodata_end = ABSOLUTE(.);
+ } >amr_vlpd_seg :amr_vlpd_phdr
+
+ .amr_vlpd.data : ALIGN(4)
+ {
+ _amr_vlpd_data_start = ABSOLUTE(.);
+ *(.amr_vlpd.data)
+ _amr_vlpd_data_end = ABSOLUTE(.);
+ } >amr_vlpd_seg :amr_vlpd_phdr
+
+ .amr_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _amr_vlpd_bss_start = ABSOLUTE(.);
+ *(.amr_vlpd.bss)
+ . = ALIGN (8);
+ _amr_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_amr_vlpd_end = ALIGN(0x8);
+ } >amr_vlpd_seg :amr_vlpd_bss_phdr
+
+ .amrwb_vlpd.rodata : ALIGN(4)
+ {
+ _amrwb_vlpd_rodata_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.rodata)
+ _amrwb_vlpd_rodata_end = ABSOLUTE(.);
+ } >amrwb_vlpd_seg :amrwb_vlpd_phdr
+
+ .amrwb_vlpd.data : ALIGN(4)
+ {
+ _amrwb_vlpd_data_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.data)
+ _amrwb_vlpd_data_end = ABSOLUTE(.);
+ } >amrwb_vlpd_seg :amrwb_vlpd_phdr
+
+ .amrwb_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _amrwb_vlpd_bss_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.bss)
+ . = ALIGN (8);
+ _amrwb_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_amrwb_vlpd_end = ALIGN(0x8);
+ } >amrwb_vlpd_seg :amrwb_vlpd_bss_phdr
+
+ .evrc_evrcb_vlpt.text : ALIGN(4)
+ {
+ _evrc_evrcb_vlpt_text_start = ABSOLUTE(.);
+ *(.evrc_evrcb_vlpt.literal .evrc_evrcb_vlpt.text)
+ _evrc_evrcb_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_evrc_evrcb_vlpt_end = ALIGN(0x8);
+ } >evrc_evrcb_vlpt_seg :evrc_evrcb_vlpt_phdr
+
+ .efr_fr_hr_vlpt.text : ALIGN(4)
+ {
+ _efr_fr_hr_vlpt_text_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpt.literal .efr_fr_hr_vlpt.text)
+ _efr_fr_hr_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_efr_fr_hr_vlpt_end = ALIGN(0x8);
+ } >efr_fr_hr_vlpt_seg :efr_fr_hr_vlpt_phdr
+
+ .amr_vlpt.text : ALIGN(4)
+ {
+ _amr_vlpt_text_start = ABSOLUTE(.);
+ *(.amr_vlpt.literal .amr_vlpt.text)
+ _amr_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_amr_vlpt_end = ALIGN(0x8);
+ } >amr_vlpt_seg :amr_vlpt_phdr
+
+ .amrwb_vlpt.text : ALIGN(4)
+ {
+ _amrwb_vlpt_text_start = ABSOLUTE(.);
+ *(.amrwb_vlpt.literal .amrwb_vlpt.text)
+ _amrwb_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_amrwb_vlpt_end = ALIGN(0x8);
+ } >amrwb_vlpt_seg :amrwb_vlpt_phdr
+
+ .vlpt.text : ALIGN(4)
+ {
+ _vlpt_text_start = ABSOLUTE(.);
+ *(.vlpt.literal .vlpt.text)
+ _vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_vlpt_end = ALIGN(0x8);
+ } >vlpt_seg :vlpt_phdr
+
+ .low_power_dyn_alloc : ALIGN(4)
+ {
+ _low_power_dyn_alloc_start = ABSOLUTE(.);
+ *(.low_power_dyn_alloc)
+ _low_power_dyn_alloc_end = ABSOLUTE(.);
+ _memmap_seg_vlpd_end = ALIGN(0x8);
+ } >vlpd_seg :vlpd_phdr
+
+ .ulpp.rodata : ALIGN(4)
+ {
+ _ulpp_rodata_start = ABSOLUTE(.);
+ *(.ulpp.rodata)
+ _ulpp_rodata_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.data : ALIGN(4)
+ {
+ _ulpp_data_start = ABSOLUTE(.);
+ *(.ulpp.data)
+ _ulpp_data_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.text : ALIGN(4)
+ {
+ _ulpp_text_start = ABSOLUTE(.);
+ *(.ulpp.literal .ulpp.text)
+ _ulpp_text_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _ulpp_bss_start = ABSOLUTE(.);
+ *(.ulpp.bss)
+ . = ALIGN (8);
+ _ulpp_bss_end = ABSOLUTE(.);
+ _memmap_seg_ulpp_end = ALIGN(0x8);
+ } >ulpp_seg :ulpp_bss_phdr
+
+ .dtsv3.rodata : ALIGN(4)
+ {
+ _dtsv3_rodata_start = ABSOLUTE(.);
+ *(.dtsv3.rodata)
+ _dtsv3_rodata_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.data : ALIGN(4)
+ {
+ _dtsv3_data_start = ABSOLUTE(.);
+ *(.dtsv3.data)
+ _dtsv3_data_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.text : ALIGN(4)
+ {
+ _dtsv3_text_start = ABSOLUTE(.);
+ *(.dtsv3.literal .dtsv3.text)
+ _dtsv3_text_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dtsv3_bss_start = ABSOLUTE(.);
+ *(.dtsv3.bss)
+ . = ALIGN (8);
+ _dtsv3_bss_end = ABSOLUTE(.);
+ _memmap_seg_dtsv3_end = ALIGN(0x8);
+ } >dtsv3_seg :dtsv3_bss_phdr
+
+ .dtsv4.rodata : ALIGN(4)
+ {
+ _dtsv4_rodata_start = ABSOLUTE(.);
+ *(.dtsv4.rodata)
+ _dtsv4_rodata_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.data : ALIGN(4)
+ {
+ _dtsv4_data_start = ABSOLUTE(.);
+ *(.dtsv4.data)
+ _dtsv4_data_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.text : ALIGN(4)
+ {
+ _dtsv4_text_start = ABSOLUTE(.);
+ *(.dtsv4.literal .dtsv4.text)
+ _dtsv4_text_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dtsv4_bss_start = ABSOLUTE(.);
+ *(.dtsv4.bss)
+ . = ALIGN (8);
+ _dtsv4_bss_end = ABSOLUTE(.);
+ _memmap_seg_dtsv4_end = ALIGN(0x8);
+ } >dtsv4_seg :dtsv4_bss_phdr
+
+ .dram0.rodata : ALIGN(4)
+ {
+ _dram0_rodata_start = ABSOLUTE(.);
+ *(.dram0.rodata)
+ *(.dram.rodata)
+ _dram0_rodata_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.literal : ALIGN(4)
+ {
+ _dram0_literal_start = ABSOLUTE(.);
+ *(.dram0.literal)
+ *(.dram.literal)
+ _dram0_literal_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.data : ALIGN(4)
+ {
+ _dram0_data_start = ABSOLUTE(.);
+ *(.dram0.data)
+ *(.dram.data)
+ _dram0_data_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dram0_bss_start = ABSOLUTE(.);
+ *(.dram0.bss)
+ *(.om.debug.bss)
+ *(.os.stack.bss)
+ . = ALIGN (8);
+ _dram0_bss_end = ABSOLUTE(.);
+ _end = ALIGN(0x8);
+ PROVIDE(end = ALIGN(0x8));
+ _stack_sentry = ALIGN(0x8);
+ _memmap_seg_dram0_0_end = ALIGN(0x8);
+ } >dram0_0_seg :dram0_0_bss_phdr
+ __stack = 0xe8080000;
+ _heap_sentry = 0xe8080000;
+
+ .ResetVector.text : ALIGN(4)
+ {
+ _ResetVector_text_start = ABSOLUTE(.);
+ KEEP (*(.ResetVector.text))
+ _ResetVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_0_end = ALIGN(0x8);
+ } >iram0_0_seg :iram0_0_phdr
+
+ .Reset.literal : ALIGN(4)
+ {
+ _Reset_literal_start = ABSOLUTE(.);
+ *(.Reset.literal)
+ _Reset_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_1_end = ALIGN(0x8);
+ } >iram0_1_seg :iram0_1_phdr
+
+ .WindowVectors.text : ALIGN(4)
+ {
+ _WindowVectors_text_start = ABSOLUTE(.);
+ KEEP (*(.WindowVectors.text))
+ _WindowVectors_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_2_end = ALIGN(0x8);
+ } >iram0_2_seg :iram0_2_phdr
+
+ .Level2InterruptVector.literal : ALIGN(4)
+ {
+ _Level2InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level2InterruptVector.literal)
+ _Level2InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_3_end = ALIGN(0x8);
+ } >iram0_3_seg :iram0_3_phdr
+
+ .Level2InterruptVector.text : ALIGN(4)
+ {
+ _Level2InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level2InterruptVector.text))
+ _Level2InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_4_end = ALIGN(0x8);
+ } >iram0_4_seg :iram0_4_phdr
+
+ .Level3InterruptVector.literal : ALIGN(4)
+ {
+ _Level3InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level3InterruptVector.literal)
+ _Level3InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_5_end = ALIGN(0x8);
+ } >iram0_5_seg :iram0_5_phdr
+
+ .Level3InterruptVector.text : ALIGN(4)
+ {
+ _Level3InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level3InterruptVector.text))
+ _Level3InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_6_end = ALIGN(0x8);
+ } >iram0_6_seg :iram0_6_phdr
+
+ .Level4InterruptVector.literal : ALIGN(4)
+ {
+ _Level4InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level4InterruptVector.literal)
+ _Level4InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_7_end = ALIGN(0x8);
+ } >iram0_7_seg :iram0_7_phdr
+
+ .Level4InterruptVector.text : ALIGN(4)
+ {
+ _Level4InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level4InterruptVector.text))
+ _Level4InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_8_end = ALIGN(0x8);
+ } >iram0_8_seg :iram0_8_phdr
+
+ .DebugExceptionVector.literal : ALIGN(4)
+ {
+ _DebugExceptionVector_literal_start = ABSOLUTE(.);
+ *(.DebugExceptionVector.literal)
+ _DebugExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_9_end = ALIGN(0x8);
+ } >iram0_9_seg :iram0_9_phdr
+
+ .DebugExceptionVector.text : ALIGN(4)
+ {
+ _DebugExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.DebugExceptionVector.text))
+ _DebugExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_10_end = ALIGN(0x8);
+ } >iram0_10_seg :iram0_10_phdr
+
+ .NMIExceptionVector.literal : ALIGN(4)
+ {
+ _NMIExceptionVector_literal_start = ABSOLUTE(.);
+ *(.NMIExceptionVector.literal)
+ _NMIExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_11_end = ALIGN(0x8);
+ } >iram0_11_seg :iram0_11_phdr
+
+ .NMIExceptionVector.text : ALIGN(4)
+ {
+ _NMIExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.NMIExceptionVector.text))
+ _NMIExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_12_end = ALIGN(0x8);
+ } >iram0_12_seg :iram0_12_phdr
+
+ .KernelExceptionVector.literal : ALIGN(4)
+ {
+ _KernelExceptionVector_literal_start = ABSOLUTE(.);
+ *(.KernelExceptionVector.literal)
+ _KernelExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_13_end = ALIGN(0x8);
+ } >iram0_13_seg :iram0_13_phdr
+
+ .KernelExceptionVector.text : ALIGN(4)
+ {
+ _KernelExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.KernelExceptionVector.text))
+ _KernelExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_14_end = ALIGN(0x8);
+ } >iram0_14_seg :iram0_14_phdr
+
+ .UserExceptionVector.literal : ALIGN(4)
+ {
+ _UserExceptionVector_literal_start = ABSOLUTE(.);
+ *(.UserExceptionVector.literal)
+ _UserExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_15_end = ALIGN(0x8);
+ } >iram0_15_seg :iram0_15_phdr
+
+ .UserExceptionVector.text : ALIGN(4)
+ {
+ _UserExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.UserExceptionVector.text))
+ _UserExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_16_end = ALIGN(0x8);
+ } >iram0_16_seg :iram0_16_phdr
+
+ .DoubleExceptionVector.literal : ALIGN(4)
+ {
+ _DoubleExceptionVector_literal_start = ABSOLUTE(.);
+ *(.DoubleExceptionVector.literal)
+ _DoubleExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_17_end = ALIGN(0x8);
+ } >iram0_17_seg :iram0_17_phdr
+
+ .DoubleExceptionVector.text : ALIGN(4)
+ {
+ _DoubleExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.DoubleExceptionVector.text))
+ _DoubleExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_18_end = ALIGN(0x8);
+ } >iram0_18_seg :iram0_18_phdr
+
+ .Reset.text : ALIGN(4)
+ {
+ _Reset_text_start = ABSOLUTE(.);
+ *(.Reset.text)
+ _Reset_text_end = ABSOLUTE(.);
+ } >iram0_19_seg :iram0_19_phdr
+
+ .iram0.text : ALIGN(4)
+ {
+ _iram0_text_start = ABSOLUTE(.);
+ *(.iram0.literal .iram.literal .iram.text.literal .iram0.text .iram.text)
+ _iram0_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_19_end = ALIGN(0x8);
+ } >iram0_19_seg :iram0_19_phdr
+
+ .sram.shareaddr : ALIGN(4)
+ {
+ _sram_shareaddr_start = ABSOLUTE(.);
+ *(.sram.shareaddr)
+ _sram_shareaddr_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.rodata : ALIGN(4)
+ {
+ _sram_rodata_start = ABSOLUTE(.);
+ *(.sram.rodata)
+ _sram_rodata_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .rodata : ALIGN(4)
+ {
+ _rodata_start = ABSOLUTE(.);
+ *(.rodata)
+ *(.rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.rodata1)
+ __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
+ KEEP (*(.xt_except_table))
+ KEEP (*(.gcc_except_table))
+ *(.gnu.linkonce.e.*)
+ *(.gnu.version_r)
+ KEEP (*(.eh_frame))
+ /* C++ constructor and destructor tables, properly ordered: */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ /* C++ exception handlers table: */
+ __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
+ *(.xt_except_desc)
+ *(.gnu.linkonce.h.*)
+ __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+ *(.xt_except_desc_end)
+ *(.dynamic)
+ *(.gnu.version_d)
+ . = ALIGN(4); /* this table MUST be 4-byte aligned */
+ _bss_table_start = ABSOLUTE(.);
+ LONG(_vlpd_bss_start)
+ LONG(_vlpd_bss_end)
+ LONG(_efr_fr_hr_vlpd_bss_start)
+ LONG(_efr_fr_hr_vlpd_bss_end)
+ LONG(_amr_vlpd_bss_start)
+ LONG(_amr_vlpd_bss_end)
+ LONG(_amrwb_vlpd_bss_start)
+ LONG(_amrwb_vlpd_bss_end)
+ LONG(_ulpp_bss_start)
+ LONG(_ulpp_bss_end)
+ LONG(_dtsv3_bss_start)
+ LONG(_dtsv3_bss_end)
+ LONG(_dtsv4_bss_start)
+ LONG(_dtsv4_bss_end)
+ LONG(_dram0_bss_start)
+ LONG(_dram0_bss_end)
+ LONG(_bss_start)
+ LONG(_bss_end)
+ _bss_table_end = ABSOLUTE(.);
+ _rodata_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.text : ALIGN(4)
+ {
+ _sram_text_start = ABSOLUTE(.);
+ *(.sram.literal .sram.text)
+ _sram_text_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .text : ALIGN(4)
+ {
+ _stext = .;
+ _text_start = ABSOLUTE(.);
+ *(.entry.text)
+ *(.init.literal)
+ KEEP(*(.init))
+ *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.fini.literal)
+ KEEP(*(.fini))
+ *(.gnu.version)
+ _text_end = ABSOLUTE(.);
+ _etext = .;
+ } >sram0_seg :sram0_phdr
+
+ .sram.data : ALIGN(4)
+ {
+ _sram_data_start = ABSOLUTE(.);
+ *(.sram.data)
+ _sram_data_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .data : ALIGN(4)
+ {
+ _data_start = ABSOLUTE(.);
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ KEEP(*(.gnu.linkonce.d.*personality*))
+ *(.data1)
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ KEEP(*(.jcr))
+ _data_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.uninit : ALIGN(4)
+ {
+ _sram_uninit_start = ABSOLUTE(.);
+ *(.sram.uninit)
+ _sram_uninit_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _bss_start = ABSOLUTE(.);
+ *(.dynsbss)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ *(.dynbss)
+ *(.bss)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ *(.sram.pool.bss)
+ *(.sram.bss)
+ . = ALIGN (8);
+ _bss_end = ABSOLUTE(.);
+ _memmap_seg_sram0_end = ALIGN(0x8);
+ } >sram0_seg :sram0_bss_phdr
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ .xt.insn 0 :
+ {
+ KEEP (*(.xt.insn))
+ KEEP (*(.gnu.linkonce.x.*))
+ }
+ .xt.prop 0 :
+ {
+ KEEP (*(.xt.prop))
+ KEEP (*(.xt.prop.*))
+ KEEP (*(.gnu.linkonce.prop.*))
+ }
+ .xt.lit 0 :
+ {
+ KEEP (*(.xt.lit))
+ KEEP (*(.xt.lit.*))
+ KEEP (*(.gnu.linkonce.p.*))
+ }
+ .debug.xt.callgraph 0 :
+ {
+ KEEP (*(.debug.xt.callgraph .debug.xt.callgraph.* .gnu.linkonce.xt.callgraph.*))
+ }
+}
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xbn b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xbn
new file mode 100644
index 00000000..e226d641
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xbn
@@ -0,0 +1,827 @@
+/* This linker script generated from xt-genldscripts.tpp for LSP hifi_hikey_lsp */
+/* Linker Script for ld -N */
+MEMORY
+{
+ sram0_seg : org = 0xC0000000, len = 0x408000
+ old_vlpd_seg : org = 0xC0408000, len = 0x10000
+ efr_fr_hr_vlpd_seg : org = 0xC0418000, len = 0x10000
+ amr_vlpd_seg : org = 0xC0428000, len = 0x10000
+ amrwb_vlpd_seg : org = 0xC0438000, len = 0x10000
+ evrc_evrcb_vlpt_seg : org = 0xC0448000, len = 0x48000
+ efr_fr_hr_vlpt_seg : org = 0xC0490000, len = 0x30000
+ amr_vlpt_seg : org = 0xC04C0000, len = 0x20000
+ amrwb_vlpt_seg : org = 0xC04E0000, len = 0x30000
+ vlpt_seg : org = 0xC0510000, len = 0x48000
+ vlpd_seg : org = 0xC0558000, len = 0x20000
+ ulpp_seg : org = 0xC0578000, len = 0x40000
+ dtsv3_seg : org = 0xC05B8000, len = 0x20000
+ dtsv4_seg : org = 0xC05D8000, len = 0x28000
+ dram0_0_seg : org = 0xE8058000, len = 0x28000
+ iram0_0_seg : org = 0xE8080000, len = 0x300
+ iram0_1_seg : org = 0xE8080300, len = 0x100
+ iram0_2_seg : org = 0xE8080400, len = 0x178
+ iram0_3_seg : org = 0xE8080578, len = 0x8
+ iram0_4_seg : org = 0xE8080580, len = 0x38
+ iram0_5_seg : org = 0xE80805B8, len = 0x8
+ iram0_6_seg : org = 0xE80805C0, len = 0x38
+ iram0_7_seg : org = 0xE80805F8, len = 0x8
+ iram0_8_seg : org = 0xE8080600, len = 0x38
+ iram0_9_seg : org = 0xE8080638, len = 0x8
+ iram0_10_seg : org = 0xE8080640, len = 0x38
+ iram0_11_seg : org = 0xE8080678, len = 0x48
+ iram0_12_seg : org = 0xE80806C0, len = 0x38
+ iram0_13_seg : org = 0xE80806F8, len = 0x8
+ iram0_14_seg : org = 0xE8080700, len = 0x38
+ iram0_15_seg : org = 0xE8080738, len = 0x8
+ iram0_16_seg : org = 0xE8080740, len = 0x38
+ iram0_17_seg : org = 0xE8080778, len = 0x48
+ iram0_18_seg : org = 0xE80807C0, len = 0x40
+ iram0_19_seg : org = 0xE8080800, len = 0xB800
+}
+
+PHDRS
+{
+ sram0_phdr PT_LOAD;
+ sram0_bss_phdr PT_LOAD;
+ old_vlpd_phdr PT_LOAD;
+ old_vlpd_bss_phdr PT_LOAD;
+ efr_fr_hr_vlpd_phdr PT_LOAD;
+ efr_fr_hr_vlpd_bss_phdr PT_LOAD;
+ amr_vlpd_phdr PT_LOAD;
+ amr_vlpd_bss_phdr PT_LOAD;
+ amrwb_vlpd_phdr PT_LOAD;
+ amrwb_vlpd_bss_phdr PT_LOAD;
+ evrc_evrcb_vlpt_phdr PT_LOAD;
+ efr_fr_hr_vlpt_phdr PT_LOAD;
+ amr_vlpt_phdr PT_LOAD;
+ amrwb_vlpt_phdr PT_LOAD;
+ vlpt_phdr PT_LOAD;
+ vlpd_phdr PT_LOAD;
+ ulpp_phdr PT_LOAD;
+ ulpp_bss_phdr PT_LOAD;
+ dtsv3_phdr PT_LOAD;
+ dtsv3_bss_phdr PT_LOAD;
+ dtsv4_phdr PT_LOAD;
+ dtsv4_bss_phdr PT_LOAD;
+ dram0_0_phdr PT_LOAD;
+ dram0_0_bss_phdr PT_LOAD;
+ iram0_0_phdr PT_LOAD;
+ iram0_1_phdr PT_LOAD;
+ iram0_2_phdr PT_LOAD;
+ iram0_3_phdr PT_LOAD;
+ iram0_4_phdr PT_LOAD;
+ iram0_5_phdr PT_LOAD;
+ iram0_6_phdr PT_LOAD;
+ iram0_7_phdr PT_LOAD;
+ iram0_8_phdr PT_LOAD;
+ iram0_9_phdr PT_LOAD;
+ iram0_10_phdr PT_LOAD;
+ iram0_11_phdr PT_LOAD;
+ iram0_12_phdr PT_LOAD;
+ iram0_13_phdr PT_LOAD;
+ iram0_14_phdr PT_LOAD;
+ iram0_15_phdr PT_LOAD;
+ iram0_16_phdr PT_LOAD;
+ iram0_17_phdr PT_LOAD;
+ iram0_18_phdr PT_LOAD;
+ iram0_19_phdr PT_LOAD;
+}
+
+
+/* Default entry point: */
+ENTRY(_ResetVector)
+
+/* Memory boundary addresses: */
+_memmap_mem_iram0_start = 0xe8080000;
+_memmap_mem_iram0_end = 0xe808c000;
+_memmap_mem_dram0_start = 0xe8058000;
+_memmap_mem_dram0_end = 0xe8080000;
+_memmap_mem_sram_start = 0xc0000000;
+_memmap_mem_sram_end = 0xc0600000;
+
+/* Memory segment boundary addresses: */
+_memmap_seg_sram0_start = 0xc0000000;
+_memmap_seg_sram0_max = 0xc0408000;
+_memmap_seg_old_vlpd_start = 0xc0408000;
+_memmap_seg_old_vlpd_max = 0xc0418000;
+_memmap_seg_efr_fr_hr_vlpd_start = 0xc0418000;
+_memmap_seg_efr_fr_hr_vlpd_max = 0xc0428000;
+_memmap_seg_amr_vlpd_start = 0xc0428000;
+_memmap_seg_amr_vlpd_max = 0xc0438000;
+_memmap_seg_amrwb_vlpd_start = 0xc0438000;
+_memmap_seg_amrwb_vlpd_max = 0xc0448000;
+_memmap_seg_evrc_evrcb_vlpt_start = 0xc0448000;
+_memmap_seg_evrc_evrcb_vlpt_max = 0xc0490000;
+_memmap_seg_efr_fr_hr_vlpt_start = 0xc0490000;
+_memmap_seg_efr_fr_hr_vlpt_max = 0xc04c0000;
+_memmap_seg_amr_vlpt_start = 0xc04c0000;
+_memmap_seg_amr_vlpt_max = 0xc04e0000;
+_memmap_seg_amrwb_vlpt_start = 0xc04e0000;
+_memmap_seg_amrwb_vlpt_max = 0xc0510000;
+_memmap_seg_vlpt_start = 0xc0510000;
+_memmap_seg_vlpt_max = 0xc0558000;
+_memmap_seg_vlpd_start = 0xc0558000;
+_memmap_seg_vlpd_max = 0xc0578000;
+_memmap_seg_ulpp_start = 0xc0578000;
+_memmap_seg_ulpp_max = 0xc05b8000;
+_memmap_seg_dtsv3_start = 0xc05b8000;
+_memmap_seg_dtsv3_max = 0xc05d8000;
+_memmap_seg_dtsv4_start = 0xc05d8000;
+_memmap_seg_dtsv4_max = 0xc0600000;
+_memmap_seg_dram0_0_start = 0xe8058000;
+_memmap_seg_dram0_0_max = 0xe8080000;
+_memmap_seg_iram0_0_start = 0xe8080000;
+_memmap_seg_iram0_0_max = 0xe8080300;
+_memmap_seg_iram0_1_start = 0xe8080300;
+_memmap_seg_iram0_1_max = 0xe8080400;
+_memmap_seg_iram0_2_start = 0xe8080400;
+_memmap_seg_iram0_2_max = 0xe8080578;
+_memmap_seg_iram0_3_start = 0xe8080578;
+_memmap_seg_iram0_3_max = 0xe8080580;
+_memmap_seg_iram0_4_start = 0xe8080580;
+_memmap_seg_iram0_4_max = 0xe80805b8;
+_memmap_seg_iram0_5_start = 0xe80805b8;
+_memmap_seg_iram0_5_max = 0xe80805c0;
+_memmap_seg_iram0_6_start = 0xe80805c0;
+_memmap_seg_iram0_6_max = 0xe80805f8;
+_memmap_seg_iram0_7_start = 0xe80805f8;
+_memmap_seg_iram0_7_max = 0xe8080600;
+_memmap_seg_iram0_8_start = 0xe8080600;
+_memmap_seg_iram0_8_max = 0xe8080638;
+_memmap_seg_iram0_9_start = 0xe8080638;
+_memmap_seg_iram0_9_max = 0xe8080640;
+_memmap_seg_iram0_10_start = 0xe8080640;
+_memmap_seg_iram0_10_max = 0xe8080678;
+_memmap_seg_iram0_11_start = 0xe8080678;
+_memmap_seg_iram0_11_max = 0xe80806c0;
+_memmap_seg_iram0_12_start = 0xe80806c0;
+_memmap_seg_iram0_12_max = 0xe80806f8;
+_memmap_seg_iram0_13_start = 0xe80806f8;
+_memmap_seg_iram0_13_max = 0xe8080700;
+_memmap_seg_iram0_14_start = 0xe8080700;
+_memmap_seg_iram0_14_max = 0xe8080738;
+_memmap_seg_iram0_15_start = 0xe8080738;
+_memmap_seg_iram0_15_max = 0xe8080740;
+_memmap_seg_iram0_16_start = 0xe8080740;
+_memmap_seg_iram0_16_max = 0xe8080778;
+_memmap_seg_iram0_17_start = 0xe8080778;
+_memmap_seg_iram0_17_max = 0xe80807c0;
+_memmap_seg_iram0_18_start = 0xe80807c0;
+_memmap_seg_iram0_18_max = 0xe8080800;
+_memmap_seg_iram0_19_start = 0xe8080800;
+_memmap_seg_iram0_19_max = 0xe808c000;
+
+_rom_store_table = 0;
+PROVIDE(_memmap_vecbase_reset = 0xe8080400);
+PROVIDE(_memmap_reset_vector = 0xe8080000);
+/* Various memory-map dependent cache attribute settings: */
+_memmap_cacheattr_wb_base = 0x44000000;
+_memmap_cacheattr_wt_base = 0x11000000;
+_memmap_cacheattr_bp_base = 0x22000000;
+_memmap_cacheattr_unused_mask = 0x00FFFFFF;
+_memmap_cacheattr_wb_trapnull = 0x4422222F;
+_memmap_cacheattr_wba_trapnull = 0x4422222F;
+_memmap_cacheattr_wbna_trapnull = 0x5522222F;
+_memmap_cacheattr_wt_trapnull = 0x1122222F;
+_memmap_cacheattr_bp_trapnull = 0x2222222F;
+_memmap_cacheattr_wb_strict = 0x44FFFFFF;
+_memmap_cacheattr_wt_strict = 0x11FFFFFF;
+_memmap_cacheattr_bp_strict = 0x22FFFFFF;
+_memmap_cacheattr_wb_allvalid = 0x44222222;
+_memmap_cacheattr_wt_allvalid = 0x11222222;
+_memmap_cacheattr_bp_allvalid = 0x22222222;
+PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
+
+SECTIONS
+{
+
+ .vlpd.rodata : ALIGN(4)
+ {
+ _vlpd_rodata_start = ABSOLUTE(.);
+ *(.vlpd.rodata)
+ _vlpd_rodata_end = ABSOLUTE(.);
+ } >old_vlpd_seg :old_vlpd_phdr
+
+ .vlpd.data : ALIGN(4)
+ {
+ _vlpd_data_start = ABSOLUTE(.);
+ *(.vlpd.data)
+ _vlpd_data_end = ABSOLUTE(.);
+ } >old_vlpd_seg :old_vlpd_phdr
+
+ .vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _vlpd_bss_start = ABSOLUTE(.);
+ *(.vlpd.bss)
+ . = ALIGN (8);
+ _vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_old_vlpd_end = ALIGN(0x8);
+ } >old_vlpd_seg :old_vlpd_bss_phdr
+
+ .efr_fr_hr_vlpd.rodata : ALIGN(4)
+ {
+ _efr_fr_hr_vlpd_rodata_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.rodata)
+ _efr_fr_hr_vlpd_rodata_end = ABSOLUTE(.);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_phdr
+
+ .efr_fr_hr_vlpd.data : ALIGN(4)
+ {
+ _efr_fr_hr_vlpd_data_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.data)
+ _efr_fr_hr_vlpd_data_end = ABSOLUTE(.);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_phdr
+
+ .efr_fr_hr_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _efr_fr_hr_vlpd_bss_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.bss)
+ . = ALIGN (8);
+ _efr_fr_hr_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_efr_fr_hr_vlpd_end = ALIGN(0x8);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_bss_phdr
+
+ .amr_vlpd.rodata : ALIGN(4)
+ {
+ _amr_vlpd_rodata_start = ABSOLUTE(.);
+ *(.amr_vlpd.rodata)
+ _amr_vlpd_rodata_end = ABSOLUTE(.);
+ } >amr_vlpd_seg :amr_vlpd_phdr
+
+ .amr_vlpd.data : ALIGN(4)
+ {
+ _amr_vlpd_data_start = ABSOLUTE(.);
+ *(.amr_vlpd.data)
+ _amr_vlpd_data_end = ABSOLUTE(.);
+ } >amr_vlpd_seg :amr_vlpd_phdr
+
+ .amr_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _amr_vlpd_bss_start = ABSOLUTE(.);
+ *(.amr_vlpd.bss)
+ . = ALIGN (8);
+ _amr_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_amr_vlpd_end = ALIGN(0x8);
+ } >amr_vlpd_seg :amr_vlpd_bss_phdr
+
+ .amrwb_vlpd.rodata : ALIGN(4)
+ {
+ _amrwb_vlpd_rodata_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.rodata)
+ _amrwb_vlpd_rodata_end = ABSOLUTE(.);
+ } >amrwb_vlpd_seg :amrwb_vlpd_phdr
+
+ .amrwb_vlpd.data : ALIGN(4)
+ {
+ _amrwb_vlpd_data_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.data)
+ _amrwb_vlpd_data_end = ABSOLUTE(.);
+ } >amrwb_vlpd_seg :amrwb_vlpd_phdr
+
+ .amrwb_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _amrwb_vlpd_bss_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.bss)
+ . = ALIGN (8);
+ _amrwb_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_amrwb_vlpd_end = ALIGN(0x8);
+ } >amrwb_vlpd_seg :amrwb_vlpd_bss_phdr
+
+ .evrc_evrcb_vlpt.text : ALIGN(4)
+ {
+ _evrc_evrcb_vlpt_text_start = ABSOLUTE(.);
+ *(.evrc_evrcb_vlpt.literal .evrc_evrcb_vlpt.text)
+ _evrc_evrcb_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_evrc_evrcb_vlpt_end = ALIGN(0x8);
+ } >evrc_evrcb_vlpt_seg :evrc_evrcb_vlpt_phdr
+
+ .efr_fr_hr_vlpt.text : ALIGN(4)
+ {
+ _efr_fr_hr_vlpt_text_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpt.literal .efr_fr_hr_vlpt.text)
+ _efr_fr_hr_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_efr_fr_hr_vlpt_end = ALIGN(0x8);
+ } >efr_fr_hr_vlpt_seg :efr_fr_hr_vlpt_phdr
+
+ .amr_vlpt.text : ALIGN(4)
+ {
+ _amr_vlpt_text_start = ABSOLUTE(.);
+ *(.amr_vlpt.literal .amr_vlpt.text)
+ _amr_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_amr_vlpt_end = ALIGN(0x8);
+ } >amr_vlpt_seg :amr_vlpt_phdr
+
+ .amrwb_vlpt.text : ALIGN(4)
+ {
+ _amrwb_vlpt_text_start = ABSOLUTE(.);
+ *(.amrwb_vlpt.literal .amrwb_vlpt.text)
+ _amrwb_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_amrwb_vlpt_end = ALIGN(0x8);
+ } >amrwb_vlpt_seg :amrwb_vlpt_phdr
+
+ .vlpt.text : ALIGN(4)
+ {
+ _vlpt_text_start = ABSOLUTE(.);
+ *(.vlpt.literal .vlpt.text)
+ _vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_vlpt_end = ALIGN(0x8);
+ } >vlpt_seg :vlpt_phdr
+
+ .low_power_dyn_alloc : ALIGN(4)
+ {
+ _low_power_dyn_alloc_start = ABSOLUTE(.);
+ *(.low_power_dyn_alloc)
+ _low_power_dyn_alloc_end = ABSOLUTE(.);
+ _memmap_seg_vlpd_end = ALIGN(0x8);
+ } >vlpd_seg :vlpd_phdr
+
+ .ulpp.rodata : ALIGN(4)
+ {
+ _ulpp_rodata_start = ABSOLUTE(.);
+ *(.ulpp.rodata)
+ _ulpp_rodata_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.data : ALIGN(4)
+ {
+ _ulpp_data_start = ABSOLUTE(.);
+ *(.ulpp.data)
+ _ulpp_data_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.text : ALIGN(4)
+ {
+ _ulpp_text_start = ABSOLUTE(.);
+ *(.ulpp.literal .ulpp.text)
+ _ulpp_text_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _ulpp_bss_start = ABSOLUTE(.);
+ *(.ulpp.bss)
+ . = ALIGN (8);
+ _ulpp_bss_end = ABSOLUTE(.);
+ _memmap_seg_ulpp_end = ALIGN(0x8);
+ } >ulpp_seg :ulpp_bss_phdr
+
+ .dtsv3.rodata : ALIGN(4)
+ {
+ _dtsv3_rodata_start = ABSOLUTE(.);
+ *(.dtsv3.rodata)
+ _dtsv3_rodata_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.data : ALIGN(4)
+ {
+ _dtsv3_data_start = ABSOLUTE(.);
+ *(.dtsv3.data)
+ _dtsv3_data_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.text : ALIGN(4)
+ {
+ _dtsv3_text_start = ABSOLUTE(.);
+ *(.dtsv3.literal .dtsv3.text)
+ _dtsv3_text_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dtsv3_bss_start = ABSOLUTE(.);
+ *(.dtsv3.bss)
+ . = ALIGN (8);
+ _dtsv3_bss_end = ABSOLUTE(.);
+ _memmap_seg_dtsv3_end = ALIGN(0x8);
+ } >dtsv3_seg :dtsv3_bss_phdr
+
+ .dtsv4.rodata : ALIGN(4)
+ {
+ _dtsv4_rodata_start = ABSOLUTE(.);
+ *(.dtsv4.rodata)
+ _dtsv4_rodata_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.data : ALIGN(4)
+ {
+ _dtsv4_data_start = ABSOLUTE(.);
+ *(.dtsv4.data)
+ _dtsv4_data_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.text : ALIGN(4)
+ {
+ _dtsv4_text_start = ABSOLUTE(.);
+ *(.dtsv4.literal .dtsv4.text)
+ _dtsv4_text_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dtsv4_bss_start = ABSOLUTE(.);
+ *(.dtsv4.bss)
+ . = ALIGN (8);
+ _dtsv4_bss_end = ABSOLUTE(.);
+ _memmap_seg_dtsv4_end = ALIGN(0x8);
+ } >dtsv4_seg :dtsv4_bss_phdr
+
+ .dram0.rodata : ALIGN(4)
+ {
+ _dram0_rodata_start = ABSOLUTE(.);
+ *(.dram0.rodata)
+ *(.dram.rodata)
+ _dram0_rodata_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.literal : ALIGN(4)
+ {
+ _dram0_literal_start = ABSOLUTE(.);
+ *(.dram0.literal)
+ *(.dram.literal)
+ _dram0_literal_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.data : ALIGN(4)
+ {
+ _dram0_data_start = ABSOLUTE(.);
+ *(.dram0.data)
+ *(.dram.data)
+ _dram0_data_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dram0_bss_start = ABSOLUTE(.);
+ *(.dram0.bss)
+ *(.om.debug.bss)
+ *(.os.stack.bss)
+ . = ALIGN (8);
+ _dram0_bss_end = ABSOLUTE(.);
+ _end = ALIGN(0x8);
+ PROVIDE(end = ALIGN(0x8));
+ _stack_sentry = ALIGN(0x8);
+ _memmap_seg_dram0_0_end = ALIGN(0x8);
+ } >dram0_0_seg :dram0_0_bss_phdr
+ __stack = 0xe8080000;
+ _heap_sentry = 0xe8080000;
+
+ .ResetVector.text : ALIGN(4)
+ {
+ _ResetVector_text_start = ABSOLUTE(.);
+ KEEP (*(.ResetVector.text))
+ _ResetVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_0_end = ALIGN(0x8);
+ } >iram0_0_seg :iram0_0_phdr
+
+ .Reset.literal : ALIGN(4)
+ {
+ _Reset_literal_start = ABSOLUTE(.);
+ *(.Reset.literal)
+ _Reset_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_1_end = ALIGN(0x8);
+ } >iram0_1_seg :iram0_1_phdr
+
+ .WindowVectors.text : ALIGN(4)
+ {
+ _WindowVectors_text_start = ABSOLUTE(.);
+ KEEP (*(.WindowVectors.text))
+ _WindowVectors_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_2_end = ALIGN(0x8);
+ } >iram0_2_seg :iram0_2_phdr
+
+ .Level2InterruptVector.literal : ALIGN(4)
+ {
+ _Level2InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level2InterruptVector.literal)
+ _Level2InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_3_end = ALIGN(0x8);
+ } >iram0_3_seg :iram0_3_phdr
+
+ .Level2InterruptVector.text : ALIGN(4)
+ {
+ _Level2InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level2InterruptVector.text))
+ _Level2InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_4_end = ALIGN(0x8);
+ } >iram0_4_seg :iram0_4_phdr
+
+ .Level3InterruptVector.literal : ALIGN(4)
+ {
+ _Level3InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level3InterruptVector.literal)
+ _Level3InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_5_end = ALIGN(0x8);
+ } >iram0_5_seg :iram0_5_phdr
+
+ .Level3InterruptVector.text : ALIGN(4)
+ {
+ _Level3InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level3InterruptVector.text))
+ _Level3InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_6_end = ALIGN(0x8);
+ } >iram0_6_seg :iram0_6_phdr
+
+ .Level4InterruptVector.literal : ALIGN(4)
+ {
+ _Level4InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level4InterruptVector.literal)
+ _Level4InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_7_end = ALIGN(0x8);
+ } >iram0_7_seg :iram0_7_phdr
+
+ .Level4InterruptVector.text : ALIGN(4)
+ {
+ _Level4InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level4InterruptVector.text))
+ _Level4InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_8_end = ALIGN(0x8);
+ } >iram0_8_seg :iram0_8_phdr
+
+ .DebugExceptionVector.literal : ALIGN(4)
+ {
+ _DebugExceptionVector_literal_start = ABSOLUTE(.);
+ *(.DebugExceptionVector.literal)
+ _DebugExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_9_end = ALIGN(0x8);
+ } >iram0_9_seg :iram0_9_phdr
+
+ .DebugExceptionVector.text : ALIGN(4)
+ {
+ _DebugExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.DebugExceptionVector.text))
+ _DebugExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_10_end = ALIGN(0x8);
+ } >iram0_10_seg :iram0_10_phdr
+
+ .NMIExceptionVector.literal : ALIGN(4)
+ {
+ _NMIExceptionVector_literal_start = ABSOLUTE(.);
+ *(.NMIExceptionVector.literal)
+ _NMIExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_11_end = ALIGN(0x8);
+ } >iram0_11_seg :iram0_11_phdr
+
+ .NMIExceptionVector.text : ALIGN(4)
+ {
+ _NMIExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.NMIExceptionVector.text))
+ _NMIExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_12_end = ALIGN(0x8);
+ } >iram0_12_seg :iram0_12_phdr
+
+ .KernelExceptionVector.literal : ALIGN(4)
+ {
+ _KernelExceptionVector_literal_start = ABSOLUTE(.);
+ *(.KernelExceptionVector.literal)
+ _KernelExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_13_end = ALIGN(0x8);
+ } >iram0_13_seg :iram0_13_phdr
+
+ .KernelExceptionVector.text : ALIGN(4)
+ {
+ _KernelExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.KernelExceptionVector.text))
+ _KernelExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_14_end = ALIGN(0x8);
+ } >iram0_14_seg :iram0_14_phdr
+
+ .UserExceptionVector.literal : ALIGN(4)
+ {
+ _UserExceptionVector_literal_start = ABSOLUTE(.);
+ *(.UserExceptionVector.literal)
+ _UserExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_15_end = ALIGN(0x8);
+ } >iram0_15_seg :iram0_15_phdr
+
+ .UserExceptionVector.text : ALIGN(4)
+ {
+ _UserExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.UserExceptionVector.text))
+ _UserExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_16_end = ALIGN(0x8);
+ } >iram0_16_seg :iram0_16_phdr
+
+ .DoubleExceptionVector.literal : ALIGN(4)
+ {
+ _DoubleExceptionVector_literal_start = ABSOLUTE(.);
+ *(.DoubleExceptionVector.literal)
+ _DoubleExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_17_end = ALIGN(0x8);
+ } >iram0_17_seg :iram0_17_phdr
+
+ .DoubleExceptionVector.text : ALIGN(4)
+ {
+ _DoubleExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.DoubleExceptionVector.text))
+ _DoubleExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_18_end = ALIGN(0x8);
+ } >iram0_18_seg :iram0_18_phdr
+
+ .Reset.text : ALIGN(4)
+ {
+ _Reset_text_start = ABSOLUTE(.);
+ *(.Reset.text)
+ _Reset_text_end = ABSOLUTE(.);
+ } >iram0_19_seg :iram0_19_phdr
+
+ .iram0.text : ALIGN(4)
+ {
+ _iram0_text_start = ABSOLUTE(.);
+ *(.iram0.literal .iram.literal .iram.text.literal .iram0.text .iram.text)
+ _iram0_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_19_end = ALIGN(0x8);
+ } >iram0_19_seg :iram0_19_phdr
+
+ .sram.shareaddr : ALIGN(4)
+ {
+ _sram_shareaddr_start = ABSOLUTE(.);
+ *(.sram.shareaddr)
+ _sram_shareaddr_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.rodata : ALIGN(4)
+ {
+ _sram_rodata_start = ABSOLUTE(.);
+ *(.sram.rodata)
+ _sram_rodata_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .rodata : ALIGN(4)
+ {
+ _rodata_start = ABSOLUTE(.);
+ *(.rodata)
+ *(.rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.rodata1)
+ __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
+ KEEP (*(.xt_except_table))
+ KEEP (*(.gcc_except_table))
+ *(.gnu.linkonce.e.*)
+ *(.gnu.version_r)
+ KEEP (*(.eh_frame))
+ /* C++ constructor and destructor tables, properly ordered: */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ /* C++ exception handlers table: */
+ __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
+ *(.xt_except_desc)
+ *(.gnu.linkonce.h.*)
+ __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+ *(.xt_except_desc_end)
+ *(.dynamic)
+ *(.gnu.version_d)
+ . = ALIGN(4); /* this table MUST be 4-byte aligned */
+ _bss_table_start = ABSOLUTE(.);
+ LONG(_vlpd_bss_start)
+ LONG(_vlpd_bss_end)
+ LONG(_efr_fr_hr_vlpd_bss_start)
+ LONG(_efr_fr_hr_vlpd_bss_end)
+ LONG(_amr_vlpd_bss_start)
+ LONG(_amr_vlpd_bss_end)
+ LONG(_amrwb_vlpd_bss_start)
+ LONG(_amrwb_vlpd_bss_end)
+ LONG(_ulpp_bss_start)
+ LONG(_ulpp_bss_end)
+ LONG(_dtsv3_bss_start)
+ LONG(_dtsv3_bss_end)
+ LONG(_dtsv4_bss_start)
+ LONG(_dtsv4_bss_end)
+ LONG(_dram0_bss_start)
+ LONG(_dram0_bss_end)
+ LONG(_bss_start)
+ LONG(_bss_end)
+ _bss_table_end = ABSOLUTE(.);
+ _rodata_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.text : ALIGN(4)
+ {
+ _sram_text_start = ABSOLUTE(.);
+ *(.sram.literal .sram.text)
+ _sram_text_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .text : ALIGN(4)
+ {
+ _stext = .;
+ _text_start = ABSOLUTE(.);
+ *(.entry.text)
+ *(.init.literal)
+ KEEP(*(.init))
+ *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.fini.literal)
+ KEEP(*(.fini))
+ *(.gnu.version)
+ _text_end = ABSOLUTE(.);
+ _etext = .;
+ } >sram0_seg :sram0_phdr
+
+ .sram.data : ALIGN(4)
+ {
+ _sram_data_start = ABSOLUTE(.);
+ *(.sram.data)
+ _sram_data_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .data : ALIGN(4)
+ {
+ _data_start = ABSOLUTE(.);
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ KEEP(*(.gnu.linkonce.d.*personality*))
+ *(.data1)
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ KEEP(*(.jcr))
+ _data_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.uninit : ALIGN(4)
+ {
+ _sram_uninit_start = ABSOLUTE(.);
+ *(.sram.uninit)
+ _sram_uninit_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _bss_start = ABSOLUTE(.);
+ *(.dynsbss)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ *(.dynbss)
+ *(.bss)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ *(.sram.pool.bss)
+ *(.sram.bss)
+ . = ALIGN (8);
+ _bss_end = ABSOLUTE(.);
+ _memmap_seg_sram0_end = ALIGN(0x8);
+ } >sram0_seg :sram0_bss_phdr
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ .xt.insn 0 :
+ {
+ KEEP (*(.xt.insn))
+ KEEP (*(.gnu.linkonce.x.*))
+ }
+ .xt.prop 0 :
+ {
+ KEEP (*(.xt.prop))
+ KEEP (*(.xt.prop.*))
+ KEEP (*(.gnu.linkonce.prop.*))
+ }
+ .xt.lit 0 :
+ {
+ KEEP (*(.xt.lit))
+ KEEP (*(.xt.lit.*))
+ KEEP (*(.gnu.linkonce.p.*))
+ }
+ .debug.xt.callgraph 0 :
+ {
+ KEEP (*(.debug.xt.callgraph .debug.xt.callgraph.* .gnu.linkonce.xt.callgraph.*))
+ }
+}
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xn b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xn
new file mode 100644
index 00000000..17c05e16
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xn
@@ -0,0 +1,827 @@
+/* This linker script generated from xt-genldscripts.tpp for LSP hifi_hikey_lsp */
+/* Linker Script for ld -n */
+MEMORY
+{
+ sram0_seg : org = 0xC0000000, len = 0x408000
+ old_vlpd_seg : org = 0xC0408000, len = 0x10000
+ efr_fr_hr_vlpd_seg : org = 0xC0418000, len = 0x10000
+ amr_vlpd_seg : org = 0xC0428000, len = 0x10000
+ amrwb_vlpd_seg : org = 0xC0438000, len = 0x10000
+ evrc_evrcb_vlpt_seg : org = 0xC0448000, len = 0x48000
+ efr_fr_hr_vlpt_seg : org = 0xC0490000, len = 0x30000
+ amr_vlpt_seg : org = 0xC04C0000, len = 0x20000
+ amrwb_vlpt_seg : org = 0xC04E0000, len = 0x30000
+ vlpt_seg : org = 0xC0510000, len = 0x48000
+ vlpd_seg : org = 0xC0558000, len = 0x20000
+ ulpp_seg : org = 0xC0578000, len = 0x40000
+ dtsv3_seg : org = 0xC05B8000, len = 0x20000
+ dtsv4_seg : org = 0xC05D8000, len = 0x28000
+ dram0_0_seg : org = 0xE8058000, len = 0x28000
+ iram0_0_seg : org = 0xE8080000, len = 0x300
+ iram0_1_seg : org = 0xE8080300, len = 0x100
+ iram0_2_seg : org = 0xE8080400, len = 0x178
+ iram0_3_seg : org = 0xE8080578, len = 0x8
+ iram0_4_seg : org = 0xE8080580, len = 0x38
+ iram0_5_seg : org = 0xE80805B8, len = 0x8
+ iram0_6_seg : org = 0xE80805C0, len = 0x38
+ iram0_7_seg : org = 0xE80805F8, len = 0x8
+ iram0_8_seg : org = 0xE8080600, len = 0x38
+ iram0_9_seg : org = 0xE8080638, len = 0x8
+ iram0_10_seg : org = 0xE8080640, len = 0x38
+ iram0_11_seg : org = 0xE8080678, len = 0x48
+ iram0_12_seg : org = 0xE80806C0, len = 0x38
+ iram0_13_seg : org = 0xE80806F8, len = 0x8
+ iram0_14_seg : org = 0xE8080700, len = 0x38
+ iram0_15_seg : org = 0xE8080738, len = 0x8
+ iram0_16_seg : org = 0xE8080740, len = 0x38
+ iram0_17_seg : org = 0xE8080778, len = 0x48
+ iram0_18_seg : org = 0xE80807C0, len = 0x40
+ iram0_19_seg : org = 0xE8080800, len = 0xB800
+}
+
+PHDRS
+{
+ sram0_phdr PT_LOAD;
+ sram0_bss_phdr PT_LOAD;
+ old_vlpd_phdr PT_LOAD;
+ old_vlpd_bss_phdr PT_LOAD;
+ efr_fr_hr_vlpd_phdr PT_LOAD;
+ efr_fr_hr_vlpd_bss_phdr PT_LOAD;
+ amr_vlpd_phdr PT_LOAD;
+ amr_vlpd_bss_phdr PT_LOAD;
+ amrwb_vlpd_phdr PT_LOAD;
+ amrwb_vlpd_bss_phdr PT_LOAD;
+ evrc_evrcb_vlpt_phdr PT_LOAD;
+ efr_fr_hr_vlpt_phdr PT_LOAD;
+ amr_vlpt_phdr PT_LOAD;
+ amrwb_vlpt_phdr PT_LOAD;
+ vlpt_phdr PT_LOAD;
+ vlpd_phdr PT_LOAD;
+ ulpp_phdr PT_LOAD;
+ ulpp_bss_phdr PT_LOAD;
+ dtsv3_phdr PT_LOAD;
+ dtsv3_bss_phdr PT_LOAD;
+ dtsv4_phdr PT_LOAD;
+ dtsv4_bss_phdr PT_LOAD;
+ dram0_0_phdr PT_LOAD;
+ dram0_0_bss_phdr PT_LOAD;
+ iram0_0_phdr PT_LOAD;
+ iram0_1_phdr PT_LOAD;
+ iram0_2_phdr PT_LOAD;
+ iram0_3_phdr PT_LOAD;
+ iram0_4_phdr PT_LOAD;
+ iram0_5_phdr PT_LOAD;
+ iram0_6_phdr PT_LOAD;
+ iram0_7_phdr PT_LOAD;
+ iram0_8_phdr PT_LOAD;
+ iram0_9_phdr PT_LOAD;
+ iram0_10_phdr PT_LOAD;
+ iram0_11_phdr PT_LOAD;
+ iram0_12_phdr PT_LOAD;
+ iram0_13_phdr PT_LOAD;
+ iram0_14_phdr PT_LOAD;
+ iram0_15_phdr PT_LOAD;
+ iram0_16_phdr PT_LOAD;
+ iram0_17_phdr PT_LOAD;
+ iram0_18_phdr PT_LOAD;
+ iram0_19_phdr PT_LOAD;
+}
+
+
+/* Default entry point: */
+ENTRY(_ResetVector)
+
+/* Memory boundary addresses: */
+_memmap_mem_iram0_start = 0xe8080000;
+_memmap_mem_iram0_end = 0xe808c000;
+_memmap_mem_dram0_start = 0xe8058000;
+_memmap_mem_dram0_end = 0xe8080000;
+_memmap_mem_sram_start = 0xc0000000;
+_memmap_mem_sram_end = 0xc0600000;
+
+/* Memory segment boundary addresses: */
+_memmap_seg_sram0_start = 0xc0000000;
+_memmap_seg_sram0_max = 0xc0408000;
+_memmap_seg_old_vlpd_start = 0xc0408000;
+_memmap_seg_old_vlpd_max = 0xc0418000;
+_memmap_seg_efr_fr_hr_vlpd_start = 0xc0418000;
+_memmap_seg_efr_fr_hr_vlpd_max = 0xc0428000;
+_memmap_seg_amr_vlpd_start = 0xc0428000;
+_memmap_seg_amr_vlpd_max = 0xc0438000;
+_memmap_seg_amrwb_vlpd_start = 0xc0438000;
+_memmap_seg_amrwb_vlpd_max = 0xc0448000;
+_memmap_seg_evrc_evrcb_vlpt_start = 0xc0448000;
+_memmap_seg_evrc_evrcb_vlpt_max = 0xc0490000;
+_memmap_seg_efr_fr_hr_vlpt_start = 0xc0490000;
+_memmap_seg_efr_fr_hr_vlpt_max = 0xc04c0000;
+_memmap_seg_amr_vlpt_start = 0xc04c0000;
+_memmap_seg_amr_vlpt_max = 0xc04e0000;
+_memmap_seg_amrwb_vlpt_start = 0xc04e0000;
+_memmap_seg_amrwb_vlpt_max = 0xc0510000;
+_memmap_seg_vlpt_start = 0xc0510000;
+_memmap_seg_vlpt_max = 0xc0558000;
+_memmap_seg_vlpd_start = 0xc0558000;
+_memmap_seg_vlpd_max = 0xc0578000;
+_memmap_seg_ulpp_start = 0xc0578000;
+_memmap_seg_ulpp_max = 0xc05b8000;
+_memmap_seg_dtsv3_start = 0xc05b8000;
+_memmap_seg_dtsv3_max = 0xc05d8000;
+_memmap_seg_dtsv4_start = 0xc05d8000;
+_memmap_seg_dtsv4_max = 0xc0600000;
+_memmap_seg_dram0_0_start = 0xe8058000;
+_memmap_seg_dram0_0_max = 0xe8080000;
+_memmap_seg_iram0_0_start = 0xe8080000;
+_memmap_seg_iram0_0_max = 0xe8080300;
+_memmap_seg_iram0_1_start = 0xe8080300;
+_memmap_seg_iram0_1_max = 0xe8080400;
+_memmap_seg_iram0_2_start = 0xe8080400;
+_memmap_seg_iram0_2_max = 0xe8080578;
+_memmap_seg_iram0_3_start = 0xe8080578;
+_memmap_seg_iram0_3_max = 0xe8080580;
+_memmap_seg_iram0_4_start = 0xe8080580;
+_memmap_seg_iram0_4_max = 0xe80805b8;
+_memmap_seg_iram0_5_start = 0xe80805b8;
+_memmap_seg_iram0_5_max = 0xe80805c0;
+_memmap_seg_iram0_6_start = 0xe80805c0;
+_memmap_seg_iram0_6_max = 0xe80805f8;
+_memmap_seg_iram0_7_start = 0xe80805f8;
+_memmap_seg_iram0_7_max = 0xe8080600;
+_memmap_seg_iram0_8_start = 0xe8080600;
+_memmap_seg_iram0_8_max = 0xe8080638;
+_memmap_seg_iram0_9_start = 0xe8080638;
+_memmap_seg_iram0_9_max = 0xe8080640;
+_memmap_seg_iram0_10_start = 0xe8080640;
+_memmap_seg_iram0_10_max = 0xe8080678;
+_memmap_seg_iram0_11_start = 0xe8080678;
+_memmap_seg_iram0_11_max = 0xe80806c0;
+_memmap_seg_iram0_12_start = 0xe80806c0;
+_memmap_seg_iram0_12_max = 0xe80806f8;
+_memmap_seg_iram0_13_start = 0xe80806f8;
+_memmap_seg_iram0_13_max = 0xe8080700;
+_memmap_seg_iram0_14_start = 0xe8080700;
+_memmap_seg_iram0_14_max = 0xe8080738;
+_memmap_seg_iram0_15_start = 0xe8080738;
+_memmap_seg_iram0_15_max = 0xe8080740;
+_memmap_seg_iram0_16_start = 0xe8080740;
+_memmap_seg_iram0_16_max = 0xe8080778;
+_memmap_seg_iram0_17_start = 0xe8080778;
+_memmap_seg_iram0_17_max = 0xe80807c0;
+_memmap_seg_iram0_18_start = 0xe80807c0;
+_memmap_seg_iram0_18_max = 0xe8080800;
+_memmap_seg_iram0_19_start = 0xe8080800;
+_memmap_seg_iram0_19_max = 0xe808c000;
+
+_rom_store_table = 0;
+PROVIDE(_memmap_vecbase_reset = 0xe8080400);
+PROVIDE(_memmap_reset_vector = 0xe8080000);
+/* Various memory-map dependent cache attribute settings: */
+_memmap_cacheattr_wb_base = 0x44000000;
+_memmap_cacheattr_wt_base = 0x11000000;
+_memmap_cacheattr_bp_base = 0x22000000;
+_memmap_cacheattr_unused_mask = 0x00FFFFFF;
+_memmap_cacheattr_wb_trapnull = 0x4422222F;
+_memmap_cacheattr_wba_trapnull = 0x4422222F;
+_memmap_cacheattr_wbna_trapnull = 0x5522222F;
+_memmap_cacheattr_wt_trapnull = 0x1122222F;
+_memmap_cacheattr_bp_trapnull = 0x2222222F;
+_memmap_cacheattr_wb_strict = 0x44FFFFFF;
+_memmap_cacheattr_wt_strict = 0x11FFFFFF;
+_memmap_cacheattr_bp_strict = 0x22FFFFFF;
+_memmap_cacheattr_wb_allvalid = 0x44222222;
+_memmap_cacheattr_wt_allvalid = 0x11222222;
+_memmap_cacheattr_bp_allvalid = 0x22222222;
+PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
+
+SECTIONS
+{
+
+ .vlpd.rodata : ALIGN(4)
+ {
+ _vlpd_rodata_start = ABSOLUTE(.);
+ *(.vlpd.rodata)
+ _vlpd_rodata_end = ABSOLUTE(.);
+ } >old_vlpd_seg :old_vlpd_phdr
+
+ .vlpd.data : ALIGN(4)
+ {
+ _vlpd_data_start = ABSOLUTE(.);
+ *(.vlpd.data)
+ _vlpd_data_end = ABSOLUTE(.);
+ } >old_vlpd_seg :old_vlpd_phdr
+
+ .vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _vlpd_bss_start = ABSOLUTE(.);
+ *(.vlpd.bss)
+ . = ALIGN (8);
+ _vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_old_vlpd_end = ALIGN(0x8);
+ } >old_vlpd_seg :old_vlpd_bss_phdr
+
+ .efr_fr_hr_vlpd.rodata : ALIGN(4)
+ {
+ _efr_fr_hr_vlpd_rodata_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.rodata)
+ _efr_fr_hr_vlpd_rodata_end = ABSOLUTE(.);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_phdr
+
+ .efr_fr_hr_vlpd.data : ALIGN(4)
+ {
+ _efr_fr_hr_vlpd_data_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.data)
+ _efr_fr_hr_vlpd_data_end = ABSOLUTE(.);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_phdr
+
+ .efr_fr_hr_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _efr_fr_hr_vlpd_bss_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpd.bss)
+ . = ALIGN (8);
+ _efr_fr_hr_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_efr_fr_hr_vlpd_end = ALIGN(0x8);
+ } >efr_fr_hr_vlpd_seg :efr_fr_hr_vlpd_bss_phdr
+
+ .amr_vlpd.rodata : ALIGN(4)
+ {
+ _amr_vlpd_rodata_start = ABSOLUTE(.);
+ *(.amr_vlpd.rodata)
+ _amr_vlpd_rodata_end = ABSOLUTE(.);
+ } >amr_vlpd_seg :amr_vlpd_phdr
+
+ .amr_vlpd.data : ALIGN(4)
+ {
+ _amr_vlpd_data_start = ABSOLUTE(.);
+ *(.amr_vlpd.data)
+ _amr_vlpd_data_end = ABSOLUTE(.);
+ } >amr_vlpd_seg :amr_vlpd_phdr
+
+ .amr_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _amr_vlpd_bss_start = ABSOLUTE(.);
+ *(.amr_vlpd.bss)
+ . = ALIGN (8);
+ _amr_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_amr_vlpd_end = ALIGN(0x8);
+ } >amr_vlpd_seg :amr_vlpd_bss_phdr
+
+ .amrwb_vlpd.rodata : ALIGN(4)
+ {
+ _amrwb_vlpd_rodata_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.rodata)
+ _amrwb_vlpd_rodata_end = ABSOLUTE(.);
+ } >amrwb_vlpd_seg :amrwb_vlpd_phdr
+
+ .amrwb_vlpd.data : ALIGN(4)
+ {
+ _amrwb_vlpd_data_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.data)
+ _amrwb_vlpd_data_end = ABSOLUTE(.);
+ } >amrwb_vlpd_seg :amrwb_vlpd_phdr
+
+ .amrwb_vlpd.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _amrwb_vlpd_bss_start = ABSOLUTE(.);
+ *(.amrwb_vlpd.bss)
+ . = ALIGN (8);
+ _amrwb_vlpd_bss_end = ABSOLUTE(.);
+ _memmap_seg_amrwb_vlpd_end = ALIGN(0x8);
+ } >amrwb_vlpd_seg :amrwb_vlpd_bss_phdr
+
+ .evrc_evrcb_vlpt.text : ALIGN(4)
+ {
+ _evrc_evrcb_vlpt_text_start = ABSOLUTE(.);
+ *(.evrc_evrcb_vlpt.literal .evrc_evrcb_vlpt.text)
+ _evrc_evrcb_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_evrc_evrcb_vlpt_end = ALIGN(0x8);
+ } >evrc_evrcb_vlpt_seg :evrc_evrcb_vlpt_phdr
+
+ .efr_fr_hr_vlpt.text : ALIGN(4)
+ {
+ _efr_fr_hr_vlpt_text_start = ABSOLUTE(.);
+ *(.efr_fr_hr_vlpt.literal .efr_fr_hr_vlpt.text)
+ _efr_fr_hr_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_efr_fr_hr_vlpt_end = ALIGN(0x8);
+ } >efr_fr_hr_vlpt_seg :efr_fr_hr_vlpt_phdr
+
+ .amr_vlpt.text : ALIGN(4)
+ {
+ _amr_vlpt_text_start = ABSOLUTE(.);
+ *(.amr_vlpt.literal .amr_vlpt.text)
+ _amr_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_amr_vlpt_end = ALIGN(0x8);
+ } >amr_vlpt_seg :amr_vlpt_phdr
+
+ .amrwb_vlpt.text : ALIGN(4)
+ {
+ _amrwb_vlpt_text_start = ABSOLUTE(.);
+ *(.amrwb_vlpt.literal .amrwb_vlpt.text)
+ _amrwb_vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_amrwb_vlpt_end = ALIGN(0x8);
+ } >amrwb_vlpt_seg :amrwb_vlpt_phdr
+
+ .vlpt.text : ALIGN(4)
+ {
+ _vlpt_text_start = ABSOLUTE(.);
+ *(.vlpt.literal .vlpt.text)
+ _vlpt_text_end = ABSOLUTE(.);
+ _memmap_seg_vlpt_end = ALIGN(0x8);
+ } >vlpt_seg :vlpt_phdr
+
+ .low_power_dyn_alloc : ALIGN(4)
+ {
+ _low_power_dyn_alloc_start = ABSOLUTE(.);
+ *(.low_power_dyn_alloc)
+ _low_power_dyn_alloc_end = ABSOLUTE(.);
+ _memmap_seg_vlpd_end = ALIGN(0x8);
+ } >vlpd_seg :vlpd_phdr
+
+ .ulpp.rodata : ALIGN(4)
+ {
+ _ulpp_rodata_start = ABSOLUTE(.);
+ *(.ulpp.rodata)
+ _ulpp_rodata_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.data : ALIGN(4)
+ {
+ _ulpp_data_start = ABSOLUTE(.);
+ *(.ulpp.data)
+ _ulpp_data_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.text : ALIGN(4)
+ {
+ _ulpp_text_start = ABSOLUTE(.);
+ *(.ulpp.literal .ulpp.text)
+ _ulpp_text_end = ABSOLUTE(.);
+ } >ulpp_seg :ulpp_phdr
+
+ .ulpp.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _ulpp_bss_start = ABSOLUTE(.);
+ *(.ulpp.bss)
+ . = ALIGN (8);
+ _ulpp_bss_end = ABSOLUTE(.);
+ _memmap_seg_ulpp_end = ALIGN(0x8);
+ } >ulpp_seg :ulpp_bss_phdr
+
+ .dtsv3.rodata : ALIGN(4)
+ {
+ _dtsv3_rodata_start = ABSOLUTE(.);
+ *(.dtsv3.rodata)
+ _dtsv3_rodata_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.data : ALIGN(4)
+ {
+ _dtsv3_data_start = ABSOLUTE(.);
+ *(.dtsv3.data)
+ _dtsv3_data_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.text : ALIGN(4)
+ {
+ _dtsv3_text_start = ABSOLUTE(.);
+ *(.dtsv3.literal .dtsv3.text)
+ _dtsv3_text_end = ABSOLUTE(.);
+ } >dtsv3_seg :dtsv3_phdr
+
+ .dtsv3.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dtsv3_bss_start = ABSOLUTE(.);
+ *(.dtsv3.bss)
+ . = ALIGN (8);
+ _dtsv3_bss_end = ABSOLUTE(.);
+ _memmap_seg_dtsv3_end = ALIGN(0x8);
+ } >dtsv3_seg :dtsv3_bss_phdr
+
+ .dtsv4.rodata : ALIGN(4)
+ {
+ _dtsv4_rodata_start = ABSOLUTE(.);
+ *(.dtsv4.rodata)
+ _dtsv4_rodata_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.data : ALIGN(4)
+ {
+ _dtsv4_data_start = ABSOLUTE(.);
+ *(.dtsv4.data)
+ _dtsv4_data_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.text : ALIGN(4)
+ {
+ _dtsv4_text_start = ABSOLUTE(.);
+ *(.dtsv4.literal .dtsv4.text)
+ _dtsv4_text_end = ABSOLUTE(.);
+ } >dtsv4_seg :dtsv4_phdr
+
+ .dtsv4.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dtsv4_bss_start = ABSOLUTE(.);
+ *(.dtsv4.bss)
+ . = ALIGN (8);
+ _dtsv4_bss_end = ABSOLUTE(.);
+ _memmap_seg_dtsv4_end = ALIGN(0x8);
+ } >dtsv4_seg :dtsv4_bss_phdr
+
+ .dram0.rodata : ALIGN(4)
+ {
+ _dram0_rodata_start = ABSOLUTE(.);
+ *(.dram0.rodata)
+ *(.dram.rodata)
+ _dram0_rodata_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.literal : ALIGN(4)
+ {
+ _dram0_literal_start = ABSOLUTE(.);
+ *(.dram0.literal)
+ *(.dram.literal)
+ _dram0_literal_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.data : ALIGN(4)
+ {
+ _dram0_data_start = ABSOLUTE(.);
+ *(.dram0.data)
+ *(.dram.data)
+ _dram0_data_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_phdr
+
+ .dram0.bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _dram0_bss_start = ABSOLUTE(.);
+ *(.dram0.bss)
+ *(.om.debug.bss)
+ *(.os.stack.bss)
+ . = ALIGN (8);
+ _dram0_bss_end = ABSOLUTE(.);
+ _end = ALIGN(0x8);
+ PROVIDE(end = ALIGN(0x8));
+ _stack_sentry = ALIGN(0x8);
+ _memmap_seg_dram0_0_end = ALIGN(0x8);
+ } >dram0_0_seg :dram0_0_bss_phdr
+ __stack = 0xe8080000;
+ _heap_sentry = 0xe8080000;
+
+ .ResetVector.text : ALIGN(4)
+ {
+ _ResetVector_text_start = ABSOLUTE(.);
+ KEEP (*(.ResetVector.text))
+ _ResetVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_0_end = ALIGN(0x8);
+ } >iram0_0_seg :iram0_0_phdr
+
+ .Reset.literal : ALIGN(4)
+ {
+ _Reset_literal_start = ABSOLUTE(.);
+ *(.Reset.literal)
+ _Reset_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_1_end = ALIGN(0x8);
+ } >iram0_1_seg :iram0_1_phdr
+
+ .WindowVectors.text : ALIGN(4)
+ {
+ _WindowVectors_text_start = ABSOLUTE(.);
+ KEEP (*(.WindowVectors.text))
+ _WindowVectors_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_2_end = ALIGN(0x8);
+ } >iram0_2_seg :iram0_2_phdr
+
+ .Level2InterruptVector.literal : ALIGN(4)
+ {
+ _Level2InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level2InterruptVector.literal)
+ _Level2InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_3_end = ALIGN(0x8);
+ } >iram0_3_seg :iram0_3_phdr
+
+ .Level2InterruptVector.text : ALIGN(4)
+ {
+ _Level2InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level2InterruptVector.text))
+ _Level2InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_4_end = ALIGN(0x8);
+ } >iram0_4_seg :iram0_4_phdr
+
+ .Level3InterruptVector.literal : ALIGN(4)
+ {
+ _Level3InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level3InterruptVector.literal)
+ _Level3InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_5_end = ALIGN(0x8);
+ } >iram0_5_seg :iram0_5_phdr
+
+ .Level3InterruptVector.text : ALIGN(4)
+ {
+ _Level3InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level3InterruptVector.text))
+ _Level3InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_6_end = ALIGN(0x8);
+ } >iram0_6_seg :iram0_6_phdr
+
+ .Level4InterruptVector.literal : ALIGN(4)
+ {
+ _Level4InterruptVector_literal_start = ABSOLUTE(.);
+ *(.Level4InterruptVector.literal)
+ _Level4InterruptVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_7_end = ALIGN(0x8);
+ } >iram0_7_seg :iram0_7_phdr
+
+ .Level4InterruptVector.text : ALIGN(4)
+ {
+ _Level4InterruptVector_text_start = ABSOLUTE(.);
+ KEEP (*(.Level4InterruptVector.text))
+ _Level4InterruptVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_8_end = ALIGN(0x8);
+ } >iram0_8_seg :iram0_8_phdr
+
+ .DebugExceptionVector.literal : ALIGN(4)
+ {
+ _DebugExceptionVector_literal_start = ABSOLUTE(.);
+ *(.DebugExceptionVector.literal)
+ _DebugExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_9_end = ALIGN(0x8);
+ } >iram0_9_seg :iram0_9_phdr
+
+ .DebugExceptionVector.text : ALIGN(4)
+ {
+ _DebugExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.DebugExceptionVector.text))
+ _DebugExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_10_end = ALIGN(0x8);
+ } >iram0_10_seg :iram0_10_phdr
+
+ .NMIExceptionVector.literal : ALIGN(4)
+ {
+ _NMIExceptionVector_literal_start = ABSOLUTE(.);
+ *(.NMIExceptionVector.literal)
+ _NMIExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_11_end = ALIGN(0x8);
+ } >iram0_11_seg :iram0_11_phdr
+
+ .NMIExceptionVector.text : ALIGN(4)
+ {
+ _NMIExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.NMIExceptionVector.text))
+ _NMIExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_12_end = ALIGN(0x8);
+ } >iram0_12_seg :iram0_12_phdr
+
+ .KernelExceptionVector.literal : ALIGN(4)
+ {
+ _KernelExceptionVector_literal_start = ABSOLUTE(.);
+ *(.KernelExceptionVector.literal)
+ _KernelExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_13_end = ALIGN(0x8);
+ } >iram0_13_seg :iram0_13_phdr
+
+ .KernelExceptionVector.text : ALIGN(4)
+ {
+ _KernelExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.KernelExceptionVector.text))
+ _KernelExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_14_end = ALIGN(0x8);
+ } >iram0_14_seg :iram0_14_phdr
+
+ .UserExceptionVector.literal : ALIGN(4)
+ {
+ _UserExceptionVector_literal_start = ABSOLUTE(.);
+ *(.UserExceptionVector.literal)
+ _UserExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_15_end = ALIGN(0x8);
+ } >iram0_15_seg :iram0_15_phdr
+
+ .UserExceptionVector.text : ALIGN(4)
+ {
+ _UserExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.UserExceptionVector.text))
+ _UserExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_16_end = ALIGN(0x8);
+ } >iram0_16_seg :iram0_16_phdr
+
+ .DoubleExceptionVector.literal : ALIGN(4)
+ {
+ _DoubleExceptionVector_literal_start = ABSOLUTE(.);
+ *(.DoubleExceptionVector.literal)
+ _DoubleExceptionVector_literal_end = ABSOLUTE(.);
+ _memmap_seg_iram0_17_end = ALIGN(0x8);
+ } >iram0_17_seg :iram0_17_phdr
+
+ .DoubleExceptionVector.text : ALIGN(4)
+ {
+ _DoubleExceptionVector_text_start = ABSOLUTE(.);
+ KEEP (*(.DoubleExceptionVector.text))
+ _DoubleExceptionVector_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_18_end = ALIGN(0x8);
+ } >iram0_18_seg :iram0_18_phdr
+
+ .Reset.text : ALIGN(4)
+ {
+ _Reset_text_start = ABSOLUTE(.);
+ *(.Reset.text)
+ _Reset_text_end = ABSOLUTE(.);
+ } >iram0_19_seg :iram0_19_phdr
+
+ .iram0.text : ALIGN(4)
+ {
+ _iram0_text_start = ABSOLUTE(.);
+ *(.iram0.literal .iram.literal .iram.text.literal .iram0.text .iram.text)
+ _iram0_text_end = ABSOLUTE(.);
+ _memmap_seg_iram0_19_end = ALIGN(0x8);
+ } >iram0_19_seg :iram0_19_phdr
+
+ .sram.shareaddr : ALIGN(4)
+ {
+ _sram_shareaddr_start = ABSOLUTE(.);
+ *(.sram.shareaddr)
+ _sram_shareaddr_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.rodata : ALIGN(4)
+ {
+ _sram_rodata_start = ABSOLUTE(.);
+ *(.sram.rodata)
+ _sram_rodata_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .rodata : ALIGN(4)
+ {
+ _rodata_start = ABSOLUTE(.);
+ *(.rodata)
+ *(.rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.rodata1)
+ __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
+ KEEP (*(.xt_except_table))
+ KEEP (*(.gcc_except_table))
+ *(.gnu.linkonce.e.*)
+ *(.gnu.version_r)
+ KEEP (*(.eh_frame))
+ /* C++ constructor and destructor tables, properly ordered: */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ /* C++ exception handlers table: */
+ __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
+ *(.xt_except_desc)
+ *(.gnu.linkonce.h.*)
+ __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+ *(.xt_except_desc_end)
+ *(.dynamic)
+ *(.gnu.version_d)
+ . = ALIGN(4); /* this table MUST be 4-byte aligned */
+ _bss_table_start = ABSOLUTE(.);
+ LONG(_vlpd_bss_start)
+ LONG(_vlpd_bss_end)
+ LONG(_efr_fr_hr_vlpd_bss_start)
+ LONG(_efr_fr_hr_vlpd_bss_end)
+ LONG(_amr_vlpd_bss_start)
+ LONG(_amr_vlpd_bss_end)
+ LONG(_amrwb_vlpd_bss_start)
+ LONG(_amrwb_vlpd_bss_end)
+ LONG(_ulpp_bss_start)
+ LONG(_ulpp_bss_end)
+ LONG(_dtsv3_bss_start)
+ LONG(_dtsv3_bss_end)
+ LONG(_dtsv4_bss_start)
+ LONG(_dtsv4_bss_end)
+ LONG(_dram0_bss_start)
+ LONG(_dram0_bss_end)
+ LONG(_bss_start)
+ LONG(_bss_end)
+ _bss_table_end = ABSOLUTE(.);
+ _rodata_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.text : ALIGN(4)
+ {
+ _sram_text_start = ABSOLUTE(.);
+ *(.sram.literal .sram.text)
+ _sram_text_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .text : ALIGN(4)
+ {
+ _stext = .;
+ _text_start = ABSOLUTE(.);
+ *(.entry.text)
+ *(.init.literal)
+ KEEP(*(.init))
+ *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.fini.literal)
+ KEEP(*(.fini))
+ *(.gnu.version)
+ _text_end = ABSOLUTE(.);
+ _etext = .;
+ } >sram0_seg :sram0_phdr
+
+ .sram.data : ALIGN(4)
+ {
+ _sram_data_start = ABSOLUTE(.);
+ *(.sram.data)
+ _sram_data_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .data : ALIGN(4)
+ {
+ _data_start = ABSOLUTE(.);
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ KEEP(*(.gnu.linkonce.d.*personality*))
+ *(.data1)
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ KEEP(*(.jcr))
+ _data_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .sram.uninit : ALIGN(4)
+ {
+ _sram_uninit_start = ABSOLUTE(.);
+ *(.sram.uninit)
+ _sram_uninit_end = ABSOLUTE(.);
+ } >sram0_seg :sram0_phdr
+
+ .bss (NOLOAD) : ALIGN(8)
+ {
+ . = ALIGN (8);
+ _bss_start = ABSOLUTE(.);
+ *(.dynsbss)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ *(.dynbss)
+ *(.bss)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ *(.sram.pool.bss)
+ *(.sram.bss)
+ . = ALIGN (8);
+ _bss_end = ABSOLUTE(.);
+ _memmap_seg_sram0_end = ALIGN(0x8);
+ } >sram0_seg :sram0_bss_phdr
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ .xt.insn 0 :
+ {
+ KEEP (*(.xt.insn))
+ KEEP (*(.gnu.linkonce.x.*))
+ }
+ .xt.prop 0 :
+ {
+ KEEP (*(.xt.prop))
+ KEEP (*(.xt.prop.*))
+ KEEP (*(.gnu.linkonce.prop.*))
+ }
+ .xt.lit 0 :
+ {
+ KEEP (*(.xt.lit))
+ KEEP (*(.xt.lit.*))
+ KEEP (*(.gnu.linkonce.p.*))
+ }
+ .debug.xt.callgraph 0 :
+ {
+ KEEP (*(.debug.xt.callgraph .debug.xt.callgraph.* .gnu.linkonce.xt.callgraph.*))
+ }
+}
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xr b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xr
new file mode 100644
index 00000000..3e9f189a
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xr
@@ -0,0 +1,42 @@
+/* This linker script generated from xt-genldscripts.tpp for LSP hifi_hikey_lsp */
+/* Linker Script for ld -r or ld -i */
+
+/* Default entry point: */
+ENTRY(_ResetVector)
+
+SECTIONS
+{
+
+ .text 0 :
+ {
+ *(.literal .text)
+ }
+
+ .bss 0 :
+ {
+ *(.dynsbss)
+ *(.sbss)
+ *(.scommon)
+ *(.dynbss)
+ *(.bss)
+ *(COMMON)
+ }
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+}
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xu b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xu
new file mode 100644
index 00000000..d8e1986d
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/ldscripts/elf32xtensa.xu
@@ -0,0 +1,42 @@
+/* This linker script generated from xt-genldscripts.tpp for LSP hifi_hikey_lsp */
+/* Linker Script for ld -Ur */
+
+/* Default entry point: */
+ENTRY(_ResetVector)
+
+SECTIONS
+{
+
+ .text 0 :
+ {
+ *(.literal .text)
+ }
+
+ .bss 0 :
+ {
+ *(.dynsbss)
+ *(.sbss)
+ *(.scommon)
+ *(.dynbss)
+ *(.bss)
+ *(COMMON)
+ }
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+}
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/memmap.xmm b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/memmap.xmm
new file mode 100644
index 00000000..c7a94bc8
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/memmap.xmm
@@ -0,0 +1,49 @@
+
+
+BEGIN iram0
+0xe8080000: instRam : iram0 : 0xc000 : executable, writable ;
+ iram0_0 : F : 0xe8080000 - 0xe80802ff : .ResetVector.text;
+ iram0_1 : C : 0xe8080300 - 0xe80803ff : .Reset.literal;
+ iram0_2 : F : 0xe8080400 - 0xe8080577 : .WindowVectors.text;
+ iram0_3 : C : 0xe8080578 - 0xe808057f : .Level2InterruptVector.literal;
+ iram0_4 : F : 0xe8080580 - 0xe80805b7 : .Level2InterruptVector.text;
+ iram0_5 : C : 0xe80805b8 - 0xe80805bf : .Level3InterruptVector.literal;
+ iram0_6 : F : 0xe80805c0 - 0xe80805f7 : .Level3InterruptVector.text;
+ iram0_7 : C : 0xe80805f8 - 0xe80805ff : .Level4InterruptVector.literal;
+ iram0_8 : F : 0xe8080600 - 0xe8080637 : .Level4InterruptVector.text;
+ iram0_9 : C : 0xe8080638 - 0xe808063f : .DebugExceptionVector.literal;
+ iram0_10 : F : 0xe8080640 - 0xe8080677 : .DebugExceptionVector.text;
+ iram0_11 : C : 0xe8080678 - 0xe80806bf : .NMIExceptionVector.literal;
+ iram0_12 : F : 0xe80806c0 - 0xe80806f7 : .NMIExceptionVector.text;
+ iram0_13 : C : 0xe80806f8 - 0xe80806ff : .KernelExceptionVector.literal;
+ iram0_14 : F : 0xe8080700 - 0xe8080737 : .KernelExceptionVector.text;
+ iram0_15 : C : 0xe8080738 - 0xe808073f : .UserExceptionVector.literal;
+ iram0_16 : F : 0xe8080740 - 0xe8080777 : .UserExceptionVector.text;
+ iram0_17 : C : 0xe8080778 - 0xe80807bf : .DoubleExceptionVector.literal;
+ iram0_18 : F : 0xe80807c0 - 0xe80807ff : .DoubleExceptionVector.text;
+ iram0_19 : C : 0xe8080800 - 0xe808bfff : .iram0.literal .Reset.text .iram0.text;
+END iram0
+
+BEGIN dram0
+0xe8058000: dataRam : dram0 : 0x28000 : writable ;
+ dram0_0 : C : 0xe8058000 - 0xe807ffff : STACK : HEAP : .dram0.rodata .dram0.literal .dram0.data .dram0.bss .om.debug.bss .os.stack.bss;
+END dram0
+
+BEGIN sram
+0xc0000000: sysram : sram : 0x600000 : executable, writable ;
+ sram0 : C : 0xc0000000 - 0xC0407FFF : .sram.shareaddr .sram.rodata .rodata .sram.literal .literal .sram.text .text .sram.data .data .sram.uninit .sram.pool.bss .sram.bss .bss;
+ old_vlpd : C : 0xC0408000 - 0xC0417FFF : .vlpd.rodata .vlpd.data .vlpd.bss;
+ efr_fr_hr_vlpd : C : 0xC0418000 - 0xC0427FFF : .efr_fr_hr_vlpd.rodata .efr_fr_hr_vlpd.data .efr_fr_hr_vlpd.bss;
+ amr_vlpd : C : 0xC0428000 - 0xC0437FFF : .amr_vlpd.rodata .amr_vlpd.data .amr_vlpd.bss;
+ amrwb_vlpd : C : 0xC0438000 - 0xC0447FFF : .amrwb_vlpd.rodata .amrwb_vlpd.data .amrwb_vlpd.bss;
+ evrc_evrcb_vlpt : C : 0xC0448000 - 0xC048FFFF : .evrc_evrcb_vlpt.literal .evrc_evrcb_vlpt.text;
+ efr_fr_hr_vlpt : C : 0xC0490000 - 0xC04BFFFF : .efr_fr_hr_vlpt.literal .efr_fr_hr_vlpt.text;
+ amr_vlpt : C : 0xC04C0000 - 0xC04DFFFF : .amr_vlpt.literal .amr_vlpt.text;
+ amrwb_vlpt : C : 0xC04E0000 -0xC050FFFF : .amrwb_vlpt.literal .amrwb_vlpt.text;
+ vlpt : C : 0xC0510000 - 0xC0557FFF : .vlpt.literal .vlpt.text;
+ vlpd : C : 0xC0558000 - 0xC0577FFF : .low_power_dyn_alloc;
+ ulpp : C : 0xc0578000 - 0xc05b7fff : .ulpp.rodata .ulpp.data .ulpp.literal .ulpp.text .ulpp.bss;
+ dtsv3 : C : 0xc05b8000 - 0xc05d7fff : .dtsv3.rodata .dtsv3.data .dtsv3.literal .dtsv3.text .dtsv3.bss;
+ dtsv4 : C : 0xc05d8000 - 0xc05fffff : .dtsv4.rodata .dtsv4.data .dtsv4.literal .dtsv4.text .dtsv4.bss;
+END sram
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/min-rt.parm b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/min-rt.parm
new file mode 100644
index 00000000..25083eeb
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/min-rt.parm
@@ -0,0 +1,15 @@
+// Memory map file to generate linker scripts for programs without board I/O.
+
+// $Id: //depot/rel/Cottonwood/Xtensa/SWConfig/ldscripts/min-rt.parm#1 $
+
+// Customer ID=9470; Build=0x42f97; Copyright (c) 2004-2007 by Tensilica Inc. ALL RIGHTS RESERVED.
+// These coded instructions, statements, and computer programs are the
+// copyrighted works and confidential proprietary information of Tensilica Inc.
+// They may not be modified, copied, reproduced, distributed, or disclosed to
+// third parties in any manner, medium, or form, in whole or in part, without
+// the prior written consent of Tensilica Inc.
+
+// Show more details if configuration targets the XT2000 board:
+INCLUDE_XT2000_MEMORIES = try
+RESERVE_SEGMENT_AREA = ".i_ocram.text 0x7800 + 0 start : .d_ocram.data 0x5000 + 0 start"
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/specs b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/specs
new file mode 100644
index 00000000..2988e02a
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/specs
@@ -0,0 +1,22 @@
+# Customer ID=9470; Build=0x42f97; Copyright (c) 2001-2010 by Tensilica Inc. ALL RIGHTS RESERVED.
+# These coded instructions, statements, and computer programs are the
+# copyrighted works and confidential proprietary information of Tensilica Inc.
+# They may not be modified, copied, reproduced, distributed, or disclosed to
+# third parties in any manner, medium, or form, in whole or in part, without
+# the prior written consent of Tensilica Inc.
+
+
+# The %O suffix on the start and end files indicates that the system's
+# standard suffix for object files (e.g., ".o") should be appended.
+# The %s suffix tells the compiler driver to search for the file in the
+# list of known locations for startfiles.
+
+*startfile:
+crt1-boards%O%s crti%O%s crtbegin%O%s _sharedvectors%O%s _vectors%O%s
+
+*endfile:
+crtend%O%s crtn%O%s
+
+*lib:
+-lc -lgloss -lminrt -lc -lhandler-reset -lhandlers-board -lminrt -lhal -lc
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/tag b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/tag
new file mode 100644
index 00000000..7be80f2a
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/tag
@@ -0,0 +1,3 @@
+#This file is generated by Xplorer, do not edit.
+#Mon Aug 26 15:41:31 CST 2013
+standardlsp=min-rt
diff --git a/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/user.parm b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/user.parm
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/hifi_hikey_lsp/user.parm
diff --git a/hifi/xaf/hifi-dpf/build_hikey/map_hikey.txt b/hifi/xaf/hifi-dpf/build_hikey/map_hikey.txt
new file mode 100644
index 00000000..58a3efce
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/map_hikey.txt
@@ -0,0 +1,2167 @@
+Archive member included because of file (symbol)
+
+../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ objs/hikey/xa-vorbis-decoder.o (xa_vorbis_dec)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ objs/hikey/arch_hifi330.o (xthal_window_spill_nw)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ objs/hikey/xf-shmem.o (xthal_dcache_region_invalidate)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ objs/hikey/xf-shmem.o (xthal_dcache_region_writeback)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid0.o)
+ /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o) (xthals_hw_configid0)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid1.o)
+ /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o) (xthals_hw_configid1)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_major.o)
+ /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o) (xthals_release_major)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_minor.o)
+ /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o) (xthals_release_minor)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ objs/hikey/cpu_c.o (xthal_get_intenable)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ objs/hikey/cpu_c.o (xthal_set_intenable)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ objs/hikey/arch_hifi330.o (xthal_restore_extra_nw)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ objs/hikey/arch_hifi330.o (xthal_save_extra_nw)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ objs/hikey/xf-main.o (_xtos_ints_on)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ objs/hikey/mutex.o (_xtos_ints_off)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o) (_xtos_intstruct)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (memchr)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (memcmp)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ objs/hikey/xf-io.o (memcpy)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ objs/hikey/xf-io.o (memset)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (qsort)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ objs/hikey/xa-factory.o (strncmp)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (__divsi3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (__modsi3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ objs/hikey/xf-core.o (__adddf3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ objs/hikey/dsp_debug.o (__muldf3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ objs/hikey/dsp_debug.o (__ltdf2)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ objs/hikey/xf-core.o (__fixunsdfsi)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ objs/hikey/dsp_debug.o (__fixunsdfdi)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ objs/hikey/xf-core.o (__floatunsidf)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ objs/hikey/dsp_debug.o (__floatundidf)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (__divdi3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ objs/hikey/dsp_debug.o (__udivdi3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ objs/hikey/dsp_debug.o (__umoddi3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (__vec_memcpy)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o) (__vec_memset)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ objs/hikey/xf-core.o (__divdf3)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o) (__propagateFloat64NaN)
+/scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o) (__estimateDiv64To32)
+
+Memory Configuration
+
+Name Origin Length Attributes
+sram0_seg 0xc0000000 0x00408000
+old_vlpd_seg 0xc0408000 0x00010000
+efr_fr_hr_vlpd_seg 0xc0418000 0x00010000
+amr_vlpd_seg 0xc0428000 0x00010000
+amrwb_vlpd_seg 0xc0438000 0x00010000
+evrc_evrcb_vlpt_seg 0xc0448000 0x00048000
+efr_fr_hr_vlpt_seg 0xc0490000 0x00030000
+amr_vlpt_seg 0xc04c0000 0x00020000
+amrwb_vlpt_seg 0xc04e0000 0x00030000
+vlpt_seg 0xc0510000 0x00048000
+vlpd_seg 0xc0558000 0x00020000
+ulpp_seg 0xc0578000 0x00040000
+dtsv3_seg 0xc05b8000 0x00020000
+dtsv4_seg 0xc05d8000 0x00028000
+dram0_0_seg 0xe8058000 0x00028000
+iram0_0_seg 0xe8080000 0x00000300
+iram0_1_seg 0xe8080300 0x00000100
+iram0_2_seg 0xe8080400 0x00000178
+iram0_3_seg 0xe8080578 0x00000008
+iram0_4_seg 0xe8080580 0x00000038
+iram0_5_seg 0xe80805b8 0x00000008
+iram0_6_seg 0xe80805c0 0x00000038
+iram0_7_seg 0xe80805f8 0x00000008
+iram0_8_seg 0xe8080600 0x00000038
+iram0_9_seg 0xe8080638 0x00000008
+iram0_10_seg 0xe8080640 0x00000038
+iram0_11_seg 0xe8080678 0x00000048
+iram0_12_seg 0xe80806c0 0x00000038
+iram0_13_seg 0xe80806f8 0x00000008
+iram0_14_seg 0xe8080700 0x00000038
+iram0_15_seg 0xe8080738 0x00000008
+iram0_16_seg 0xe8080740 0x00000038
+iram0_17_seg 0xe8080778 0x00000048
+iram0_18_seg 0xe80807c0 0x00000040
+iram0_19_seg 0xe8080800 0x0000b800
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+LOAD objs/hikey/cpu_c.o
+LOAD objs/hikey/dsp_debug.o
+LOAD objs/hikey/dsp_comm.o
+LOAD objs/hikey/mutex.o
+LOAD objs/hikey/rbtree.o
+LOAD objs/hikey/xf-core.o
+LOAD objs/hikey/xf-io.o
+LOAD objs/hikey/xf-mem.o
+LOAD objs/hikey/xf-msg.o
+LOAD objs/hikey/xf-sched.o
+LOAD objs/hikey/xa-factory.o
+LOAD objs/hikey/xf-shmem.o
+LOAD objs/hikey/tinyvprintf.o
+LOAD objs/hikey/xf-isr.o
+LOAD objs/hikey/gdbstub.o
+LOAD objs/hikey/xa-class-base.o
+LOAD objs/hikey/xa-class-audio-codec.o
+LOAD objs/hikey/xa-class-mixer.o
+LOAD objs/hikey/xf-main.o
+LOAD objs/hikey/xa-pcm.o
+LOAD objs/hikey/xa-vorbis-decoder.o
+LOAD objs/hikey/xa-mixer.o
+LOAD objs/hikey/reset.o
+LOAD objs/hikey/int_vector.o
+LOAD objs/hikey/arch_hifi330.o
+LOAD objs/hikey/gdbstub-entry.o
+LOAD ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a
+LOAD /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a
+LOAD /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a
+LOAD /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a
+LOAD /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a
+ 0xe8080000 _memmap_mem_iram0_start = 0xe8080000
+ 0xe808c000 _memmap_mem_iram0_end = 0xe808c000
+ 0xe8058000 _memmap_mem_dram0_start = 0xe8058000
+ 0xe8080000 _memmap_mem_dram0_end = 0xe8080000
+ 0xc0000000 _memmap_mem_sram_start = 0xc0000000
+ 0xc0600000 _memmap_mem_sram_end = 0xc0600000
+ 0xc0000000 _memmap_seg_sram0_start = 0xc0000000
+ 0xc0408000 _memmap_seg_sram0_max = 0xc0408000
+ 0xc0408000 _memmap_seg_old_vlpd_start = 0xc0408000
+ 0xc0418000 _memmap_seg_old_vlpd_max = 0xc0418000
+ 0xc0418000 _memmap_seg_efr_fr_hr_vlpd_start = 0xc0418000
+ 0xc0428000 _memmap_seg_efr_fr_hr_vlpd_max = 0xc0428000
+ 0xc0428000 _memmap_seg_amr_vlpd_start = 0xc0428000
+ 0xc0438000 _memmap_seg_amr_vlpd_max = 0xc0438000
+ 0xc0438000 _memmap_seg_amrwb_vlpd_start = 0xc0438000
+ 0xc0448000 _memmap_seg_amrwb_vlpd_max = 0xc0448000
+ 0xc0448000 _memmap_seg_evrc_evrcb_vlpt_start = 0xc0448000
+ 0xc0490000 _memmap_seg_evrc_evrcb_vlpt_max = 0xc0490000
+ 0xc0490000 _memmap_seg_efr_fr_hr_vlpt_start = 0xc0490000
+ 0xc04c0000 _memmap_seg_efr_fr_hr_vlpt_max = 0xc04c0000
+ 0xc04c0000 _memmap_seg_amr_vlpt_start = 0xc04c0000
+ 0xc04e0000 _memmap_seg_amr_vlpt_max = 0xc04e0000
+ 0xc04e0000 _memmap_seg_amrwb_vlpt_start = 0xc04e0000
+ 0xc0510000 _memmap_seg_amrwb_vlpt_max = 0xc0510000
+ 0xc0510000 _memmap_seg_vlpt_start = 0xc0510000
+ 0xc0558000 _memmap_seg_vlpt_max = 0xc0558000
+ 0xc0558000 _memmap_seg_vlpd_start = 0xc0558000
+ 0xc0578000 _memmap_seg_vlpd_max = 0xc0578000
+ 0xc0578000 _memmap_seg_ulpp_start = 0xc0578000
+ 0xc05b8000 _memmap_seg_ulpp_max = 0xc05b8000
+ 0xc05b8000 _memmap_seg_dtsv3_start = 0xc05b8000
+ 0xc05d8000 _memmap_seg_dtsv3_max = 0xc05d8000
+ 0xc05d8000 _memmap_seg_dtsv4_start = 0xc05d8000
+ 0xc0600000 _memmap_seg_dtsv4_max = 0xc0600000
+ 0xe8058000 _memmap_seg_dram0_0_start = 0xe8058000
+ 0xe8080000 _memmap_seg_dram0_0_max = 0xe8080000
+ 0xe8080000 _memmap_seg_iram0_0_start = 0xe8080000
+ 0xe8080300 _memmap_seg_iram0_0_max = 0xe8080300
+ 0xe8080300 _memmap_seg_iram0_1_start = 0xe8080300
+ 0xe8080400 _memmap_seg_iram0_1_max = 0xe8080400
+ 0xe8080400 _memmap_seg_iram0_2_start = 0xe8080400
+ 0xe8080578 _memmap_seg_iram0_2_max = 0xe8080578
+ 0xe8080578 _memmap_seg_iram0_3_start = 0xe8080578
+ 0xe8080580 _memmap_seg_iram0_3_max = 0xe8080580
+ 0xe8080580 _memmap_seg_iram0_4_start = 0xe8080580
+ 0xe80805b8 _memmap_seg_iram0_4_max = 0xe80805b8
+ 0xe80805b8 _memmap_seg_iram0_5_start = 0xe80805b8
+ 0xe80805c0 _memmap_seg_iram0_5_max = 0xe80805c0
+ 0xe80805c0 _memmap_seg_iram0_6_start = 0xe80805c0
+ 0xe80805f8 _memmap_seg_iram0_6_max = 0xe80805f8
+ 0xe80805f8 _memmap_seg_iram0_7_start = 0xe80805f8
+ 0xe8080600 _memmap_seg_iram0_7_max = 0xe8080600
+ 0xe8080600 _memmap_seg_iram0_8_start = 0xe8080600
+ 0xe8080638 _memmap_seg_iram0_8_max = 0xe8080638
+ 0xe8080638 _memmap_seg_iram0_9_start = 0xe8080638
+ 0xe8080640 _memmap_seg_iram0_9_max = 0xe8080640
+ 0xe8080640 _memmap_seg_iram0_10_start = 0xe8080640
+ 0xe8080678 _memmap_seg_iram0_10_max = 0xe8080678
+ 0xe8080678 _memmap_seg_iram0_11_start = 0xe8080678
+ 0xe80806c0 _memmap_seg_iram0_11_max = 0xe80806c0
+ 0xe80806c0 _memmap_seg_iram0_12_start = 0xe80806c0
+ 0xe80806f8 _memmap_seg_iram0_12_max = 0xe80806f8
+ 0xe80806f8 _memmap_seg_iram0_13_start = 0xe80806f8
+ 0xe8080700 _memmap_seg_iram0_13_max = 0xe8080700
+ 0xe8080700 _memmap_seg_iram0_14_start = 0xe8080700
+ 0xe8080738 _memmap_seg_iram0_14_max = 0xe8080738
+ 0xe8080738 _memmap_seg_iram0_15_start = 0xe8080738
+ 0xe8080740 _memmap_seg_iram0_15_max = 0xe8080740
+ 0xe8080740 _memmap_seg_iram0_16_start = 0xe8080740
+ 0xe8080778 _memmap_seg_iram0_16_max = 0xe8080778
+ 0xe8080778 _memmap_seg_iram0_17_start = 0xe8080778
+ 0xe80807c0 _memmap_seg_iram0_17_max = 0xe80807c0
+ 0xe80807c0 _memmap_seg_iram0_18_start = 0xe80807c0
+ 0xe8080800 _memmap_seg_iram0_18_max = 0xe8080800
+ 0xe8080800 _memmap_seg_iram0_19_start = 0xe8080800
+ 0xe808c000 _memmap_seg_iram0_19_max = 0xe808c000
+ 0x00000000 _rom_store_table = 0x0
+ 0xe8080400 PROVIDE (_memmap_vecbase_reset, 0xe8080400)
+ 0xe8080000 PROVIDE (_memmap_reset_vector, 0xe8080000)
+ 0x44000000 _memmap_cacheattr_wb_base = 0x44000000
+ 0x11000000 _memmap_cacheattr_wt_base = 0x11000000
+ 0x22000000 _memmap_cacheattr_bp_base = 0x22000000
+ 0x00ffffff _memmap_cacheattr_unused_mask = 0xffffff
+ 0x4422222f _memmap_cacheattr_wb_trapnull = 0x4422222f
+ 0x4422222f _memmap_cacheattr_wba_trapnull = 0x4422222f
+ 0x5522222f _memmap_cacheattr_wbna_trapnull = 0x5522222f
+ 0x1122222f _memmap_cacheattr_wt_trapnull = 0x1122222f
+ 0x2222222f _memmap_cacheattr_bp_trapnull = 0x2222222f
+ 0x44ffffff _memmap_cacheattr_wb_strict = 0x44ffffff
+ 0x11ffffff _memmap_cacheattr_wt_strict = 0x11ffffff
+ 0x22ffffff _memmap_cacheattr_bp_strict = 0x22ffffff
+ 0x44222222 _memmap_cacheattr_wb_allvalid = 0x44222222
+ 0x11222222 _memmap_cacheattr_wt_allvalid = 0x11222222
+ 0x22222222 _memmap_cacheattr_bp_allvalid = 0x22222222
+ 0x4422222f PROVIDE (_memmap_cacheattr_reset, _memmap_cacheattr_wb_trapnull)
+
+.vlpd.rodata 0xc0408000 0x0
+ 0xc0408000 _vlpd_rodata_start = ABSOLUTE (.)
+ *(.vlpd.rodata)
+ 0xc0408000 _vlpd_rodata_end = ABSOLUTE (.)
+
+.vlpd.data 0xc0408000 0x0
+ 0xc0408000 _vlpd_data_start = ABSOLUTE (.)
+ *(.vlpd.data)
+ 0xc0408000 _vlpd_data_end = ABSOLUTE (.)
+
+.vlpd.bss 0xc0408000 0x0
+ 0xc0408000 . = ALIGN (0x8)
+ 0xc0408000 _vlpd_bss_start = ABSOLUTE (.)
+ *(.vlpd.bss)
+ 0xc0408000 . = ALIGN (0x8)
+ 0xc0408000 _vlpd_bss_end = ABSOLUTE (.)
+ 0xc0408000 _memmap_seg_old_vlpd_end = ALIGN (0x8)
+
+.efr_fr_hr_vlpd.rodata
+ 0xc0418000 0x0
+ 0xc0418000 _efr_fr_hr_vlpd_rodata_start = ABSOLUTE (.)
+ *(.efr_fr_hr_vlpd.rodata)
+ 0xc0418000 _efr_fr_hr_vlpd_rodata_end = ABSOLUTE (.)
+
+.efr_fr_hr_vlpd.data
+ 0xc0418000 0x0
+ 0xc0418000 _efr_fr_hr_vlpd_data_start = ABSOLUTE (.)
+ *(.efr_fr_hr_vlpd.data)
+ 0xc0418000 _efr_fr_hr_vlpd_data_end = ABSOLUTE (.)
+
+.efr_fr_hr_vlpd.bss
+ 0xc0418000 0x0
+ 0xc0418000 . = ALIGN (0x8)
+ 0xc0418000 _efr_fr_hr_vlpd_bss_start = ABSOLUTE (.)
+ *(.efr_fr_hr_vlpd.bss)
+ 0xc0418000 . = ALIGN (0x8)
+ 0xc0418000 _efr_fr_hr_vlpd_bss_end = ABSOLUTE (.)
+ 0xc0418000 _memmap_seg_efr_fr_hr_vlpd_end = ALIGN (0x8)
+
+.amr_vlpd.rodata
+ 0xc0428000 0x0
+ 0xc0428000 _amr_vlpd_rodata_start = ABSOLUTE (.)
+ *(.amr_vlpd.rodata)
+ 0xc0428000 _amr_vlpd_rodata_end = ABSOLUTE (.)
+
+.amr_vlpd.data 0xc0428000 0x0
+ 0xc0428000 _amr_vlpd_data_start = ABSOLUTE (.)
+ *(.amr_vlpd.data)
+ 0xc0428000 _amr_vlpd_data_end = ABSOLUTE (.)
+
+.amr_vlpd.bss 0xc0428000 0x0
+ 0xc0428000 . = ALIGN (0x8)
+ 0xc0428000 _amr_vlpd_bss_start = ABSOLUTE (.)
+ *(.amr_vlpd.bss)
+ 0xc0428000 . = ALIGN (0x8)
+ 0xc0428000 _amr_vlpd_bss_end = ABSOLUTE (.)
+ 0xc0428000 _memmap_seg_amr_vlpd_end = ALIGN (0x8)
+
+.amrwb_vlpd.rodata
+ 0xc0438000 0x0
+ 0xc0438000 _amrwb_vlpd_rodata_start = ABSOLUTE (.)
+ *(.amrwb_vlpd.rodata)
+ 0xc0438000 _amrwb_vlpd_rodata_end = ABSOLUTE (.)
+
+.amrwb_vlpd.data
+ 0xc0438000 0x0
+ 0xc0438000 _amrwb_vlpd_data_start = ABSOLUTE (.)
+ *(.amrwb_vlpd.data)
+ 0xc0438000 _amrwb_vlpd_data_end = ABSOLUTE (.)
+
+.amrwb_vlpd.bss
+ 0xc0438000 0x0
+ 0xc0438000 . = ALIGN (0x8)
+ 0xc0438000 _amrwb_vlpd_bss_start = ABSOLUTE (.)
+ *(.amrwb_vlpd.bss)
+ 0xc0438000 . = ALIGN (0x8)
+ 0xc0438000 _amrwb_vlpd_bss_end = ABSOLUTE (.)
+ 0xc0438000 _memmap_seg_amrwb_vlpd_end = ALIGN (0x8)
+
+.evrc_evrcb_vlpt.text
+ 0xc0448000 0x0
+ 0xc0448000 _evrc_evrcb_vlpt_text_start = ABSOLUTE (.)
+ *(.evrc_evrcb_vlpt.literal .evrc_evrcb_vlpt.text)
+ 0xc0448000 _evrc_evrcb_vlpt_text_end = ABSOLUTE (.)
+ 0xc0448000 _memmap_seg_evrc_evrcb_vlpt_end = ALIGN (0x8)
+
+.efr_fr_hr_vlpt.text
+ 0xc0490000 0x0
+ 0xc0490000 _efr_fr_hr_vlpt_text_start = ABSOLUTE (.)
+ *(.efr_fr_hr_vlpt.literal .efr_fr_hr_vlpt.text)
+ 0xc0490000 _efr_fr_hr_vlpt_text_end = ABSOLUTE (.)
+ 0xc0490000 _memmap_seg_efr_fr_hr_vlpt_end = ALIGN (0x8)
+
+.amr_vlpt.text 0xc04c0000 0x0
+ 0xc04c0000 _amr_vlpt_text_start = ABSOLUTE (.)
+ *(.amr_vlpt.literal .amr_vlpt.text)
+ 0xc04c0000 _amr_vlpt_text_end = ABSOLUTE (.)
+ 0xc04c0000 _memmap_seg_amr_vlpt_end = ALIGN (0x8)
+
+.amrwb_vlpt.text
+ 0xc04e0000 0x0
+ 0xc04e0000 _amrwb_vlpt_text_start = ABSOLUTE (.)
+ *(.amrwb_vlpt.literal .amrwb_vlpt.text)
+ 0xc04e0000 _amrwb_vlpt_text_end = ABSOLUTE (.)
+ 0xc04e0000 _memmap_seg_amrwb_vlpt_end = ALIGN (0x8)
+
+.vlpt.text 0xc0510000 0x0
+ 0xc0510000 _vlpt_text_start = ABSOLUTE (.)
+ *(.vlpt.literal .vlpt.text)
+ 0xc0510000 _vlpt_text_end = ABSOLUTE (.)
+ 0xc0510000 _memmap_seg_vlpt_end = ALIGN (0x8)
+
+.low_power_dyn_alloc
+ 0xc0558000 0x0
+ 0xc0558000 _low_power_dyn_alloc_start = ABSOLUTE (.)
+ *(.low_power_dyn_alloc)
+ 0xc0558000 _low_power_dyn_alloc_end = ABSOLUTE (.)
+ 0xc0558000 _memmap_seg_vlpd_end = ALIGN (0x8)
+
+.ulpp.rodata 0xc0578000 0x0
+ 0xc0578000 _ulpp_rodata_start = ABSOLUTE (.)
+ *(.ulpp.rodata)
+ 0xc0578000 _ulpp_rodata_end = ABSOLUTE (.)
+
+.ulpp.data 0xc0578000 0x0
+ 0xc0578000 _ulpp_data_start = ABSOLUTE (.)
+ *(.ulpp.data)
+ 0xc0578000 _ulpp_data_end = ABSOLUTE (.)
+
+.ulpp.text 0xc0578000 0x0
+ 0xc0578000 _ulpp_text_start = ABSOLUTE (.)
+ *(.ulpp.literal .ulpp.text)
+ 0xc0578000 _ulpp_text_end = ABSOLUTE (.)
+
+.ulpp.bss 0xc0578000 0x0
+ 0xc0578000 . = ALIGN (0x8)
+ 0xc0578000 _ulpp_bss_start = ABSOLUTE (.)
+ *(.ulpp.bss)
+ 0xc0578000 . = ALIGN (0x8)
+ 0xc0578000 _ulpp_bss_end = ABSOLUTE (.)
+ 0xc0578000 _memmap_seg_ulpp_end = ALIGN (0x8)
+
+.dtsv3.rodata 0xc05b8000 0x0
+ 0xc05b8000 _dtsv3_rodata_start = ABSOLUTE (.)
+ *(.dtsv3.rodata)
+ 0xc05b8000 _dtsv3_rodata_end = ABSOLUTE (.)
+
+.dtsv3.data 0xc05b8000 0x0
+ 0xc05b8000 _dtsv3_data_start = ABSOLUTE (.)
+ *(.dtsv3.data)
+ 0xc05b8000 _dtsv3_data_end = ABSOLUTE (.)
+
+.dtsv3.text 0xc05b8000 0x0
+ 0xc05b8000 _dtsv3_text_start = ABSOLUTE (.)
+ *(.dtsv3.literal .dtsv3.text)
+ 0xc05b8000 _dtsv3_text_end = ABSOLUTE (.)
+
+.dtsv3.bss 0xc05b8000 0x0
+ 0xc05b8000 . = ALIGN (0x8)
+ 0xc05b8000 _dtsv3_bss_start = ABSOLUTE (.)
+ *(.dtsv3.bss)
+ 0xc05b8000 . = ALIGN (0x8)
+ 0xc05b8000 _dtsv3_bss_end = ABSOLUTE (.)
+ 0xc05b8000 _memmap_seg_dtsv3_end = ALIGN (0x8)
+
+.dtsv4.rodata 0xc05d8000 0x0
+ 0xc05d8000 _dtsv4_rodata_start = ABSOLUTE (.)
+ *(.dtsv4.rodata)
+ 0xc05d8000 _dtsv4_rodata_end = ABSOLUTE (.)
+
+.dtsv4.data 0xc05d8000 0x0
+ 0xc05d8000 _dtsv4_data_start = ABSOLUTE (.)
+ *(.dtsv4.data)
+ 0xc05d8000 _dtsv4_data_end = ABSOLUTE (.)
+
+.dtsv4.text 0xc05d8000 0x0
+ 0xc05d8000 _dtsv4_text_start = ABSOLUTE (.)
+ *(.dtsv4.literal .dtsv4.text)
+ 0xc05d8000 _dtsv4_text_end = ABSOLUTE (.)
+
+.dtsv4.bss 0xc05d8000 0x0
+ 0xc05d8000 . = ALIGN (0x8)
+ 0xc05d8000 _dtsv4_bss_start = ABSOLUTE (.)
+ *(.dtsv4.bss)
+ 0xc05d8000 . = ALIGN (0x8)
+ 0xc05d8000 _dtsv4_bss_end = ABSOLUTE (.)
+ 0xc05d8000 _memmap_seg_dtsv4_end = ALIGN (0x8)
+
+.dram0.rodata 0xe8058000 0x0
+ 0xe8058000 _dram0_rodata_start = ABSOLUTE (.)
+ *(.dram0.rodata)
+ *(.dram.rodata)
+ 0xe8058000 _dram0_rodata_end = ABSOLUTE (.)
+
+.dram0.literal 0xe8058000 0x0
+ 0xe8058000 _dram0_literal_start = ABSOLUTE (.)
+ *(.dram0.literal)
+ *(.dram.literal)
+ 0xe8058000 _dram0_literal_end = ABSOLUTE (.)
+
+.dram0.data 0xe8058000 0x51
+ 0xe8058000 _dram0_data_start = ABSOLUTE (.)
+ *(.dram0.data)
+ .dram0.data 0xe8058000 0x50 objs/hikey/int_vector.o
+ 0xe8058030 g_awVosCoprocOwnerSa
+ 0xe8058038 g_strVosPanicMessage
+ .dram0.data 0xe8058050 0x1 objs/hikey/arch_hifi330.o
+ *(.dram.data)
+ 0xe8058051 _dram0_data_end = ABSOLUTE (.)
+
+.dram0.bss 0xe8058058 0x0
+ 0xe8058058 . = ALIGN (0x8)
+ 0xe8058058 _dram0_bss_start = ABSOLUTE (.)
+ *(.dram0.bss)
+ *(.om.debug.bss)
+ *(.os.stack.bss)
+ 0xe8058058 . = ALIGN (0x8)
+ 0xe8058058 _dram0_bss_end = ABSOLUTE (.)
+ 0xe8058058 _end = ALIGN (0x8)
+ 0xe8058058 PROVIDE (end, ALIGN (0x8))
+ 0xe8058058 _stack_sentry = ALIGN (0x8)
+ 0xe8058058 _memmap_seg_dram0_0_end = ALIGN (0x8)
+ 0xe8080000 __stack = 0xe8080000
+ 0xe8080000 _heap_sentry = 0xe8080000
+
+.ResetVector.text
+ 0xe8080000 0x3
+ 0xe8080000 _ResetVector_text_start = ABSOLUTE (.)
+ *(.ResetVector.text)
+ .ResetVector.text
+ 0xe8080000 0x3 objs/hikey/reset.o
+ 0xe8080000 _ResetVector
+ 0xe8080003 _ResetVector_text_end = ABSOLUTE (.)
+ 0xe8080008 _memmap_seg_iram0_0_end = ALIGN (0x8)
+
+.Reset.literal 0xe8080300 0x40
+ 0xe8080300 _Reset_literal_start = ABSOLUTE (.)
+ *(.Reset.literal)
+ .Reset.literal
+ 0xe8080300 0x40 objs/hikey/reset.o
+ 0xe8080340 _Reset_literal_end = ABSOLUTE (.)
+ 0xe8080340 _memmap_seg_iram0_1_end = ALIGN (0x8)
+
+.WindowVectors.text
+ 0xe8080400 0x16a
+ 0xe8080400 _WindowVectors_text_start = ABSOLUTE (.)
+ *(.WindowVectors.text)
+ .WindowVectors.text
+ 0xe8080400 0x16a objs/hikey/int_vector.o
+ 0xe8080400 _WindowOverflow4
+ 0xe8080440 _WindowUnderflow4
+ 0xe8080450 OS_AllocaException
+ 0xe8080480 _WindowOverflow8
+ 0xe80804c0 _WindowUnderflow8
+ 0xe8080500 _WindowOverflow12
+ 0xe8080540 _WindowUnderflow12
+ 0xe808056a _WindowVectors_text_end = ABSOLUTE (.)
+ 0xe8080570 _memmap_seg_iram0_2_end = ALIGN (0x8)
+
+.Level2InterruptVector.literal
+ 0xe8080578 0x0
+ 0xe8080578 _Level2InterruptVector_literal_start = ABSOLUTE (.)
+ *(.Level2InterruptVector.literal)
+ .Level2InterruptVector.literal
+ 0xe8080578 0x0 objs/hikey/int_vector.o
+ 0x4 (size before relaxing)
+ 0xe8080578 _Level2InterruptVector_literal_end = ABSOLUTE (.)
+ 0xe8080578 _memmap_seg_iram0_3_end = ALIGN (0x8)
+
+.Level2InterruptVector.text
+ 0xe8080580 0x6
+ 0xe8080580 _Level2InterruptVector_text_start = ABSOLUTE (.)
+ *(.Level2InterruptVector.text)
+ .Level2InterruptVector.text
+ 0xe8080580 0x6 objs/hikey/int_vector.o
+ 0x9 (size before relaxing)
+ 0xe8080580 OS_Level2Vector
+ 0xe8080586 _Level2InterruptVector_text_end = ABSOLUTE (.)
+ 0xe8080588 _memmap_seg_iram0_4_end = ALIGN (0x8)
+
+.Level3InterruptVector.literal
+ 0xe80805b8 0x0
+ 0xe80805b8 _Level3InterruptVector_literal_start = ABSOLUTE (.)
+ *(.Level3InterruptVector.literal)
+ .Level3InterruptVector.literal
+ 0xe80805b8 0x0 objs/hikey/int_vector.o
+ 0x4 (size before relaxing)
+ 0xe80805b8 _Level3InterruptVector_literal_end = ABSOLUTE (.)
+ 0xe80805b8 _memmap_seg_iram0_5_end = ALIGN (0x8)
+
+.Level3InterruptVector.text
+ 0xe80805c0 0x6
+ 0xe80805c0 _Level3InterruptVector_text_start = ABSOLUTE (.)
+ *(.Level3InterruptVector.text)
+ .Level3InterruptVector.text
+ 0xe80805c0 0x6 objs/hikey/int_vector.o
+ 0x9 (size before relaxing)
+ 0xe80805c0 OS_Level3Vector
+ 0xe80805c6 _Level3InterruptVector_text_end = ABSOLUTE (.)
+ 0xe80805c8 _memmap_seg_iram0_6_end = ALIGN (0x8)
+
+.Level4InterruptVector.literal
+ 0xe80805f8 0x0
+ 0xe80805f8 _Level4InterruptVector_literal_start = ABSOLUTE (.)
+ *(.Level4InterruptVector.literal)
+ 0xe80805f8 _Level4InterruptVector_literal_end = ABSOLUTE (.)
+ 0xe80805f8 _memmap_seg_iram0_7_end = ALIGN (0x8)
+
+.Level4InterruptVector.text
+ 0xe8080600 0x0
+ 0xe8080600 _Level4InterruptVector_text_start = ABSOLUTE (.)
+ *(.Level4InterruptVector.text)
+ 0xe8080600 _Level4InterruptVector_text_end = ABSOLUTE (.)
+ 0xe8080600 _memmap_seg_iram0_8_end = ALIGN (0x8)
+
+.DebugExceptionVector.literal
+ 0xe8080638 0x0
+ 0xe8080638 _DebugExceptionVector_literal_start = ABSOLUTE (.)
+ *(.DebugExceptionVector.literal)
+ .DebugExceptionVector.literal
+ 0xe8080638 0x0 objs/hikey/int_vector.o
+ 0x4 (size before relaxing)
+ 0xe8080638 _DebugExceptionVector_literal_end = ABSOLUTE (.)
+ 0xe8080638 _memmap_seg_iram0_9_end = ALIGN (0x8)
+
+.DebugExceptionVector.text
+ 0xe8080640 0x16
+ 0xe8080640 _DebugExceptionVector_text_start = ABSOLUTE (.)
+ *(.DebugExceptionVector.text)
+ .DebugExceptionVector.text
+ 0xe8080640 0x9 objs/hikey/int_vector.o
+ 0xc (size before relaxing)
+ 0xe8080640 OS_DebugExceptionVector
+ *fill* 0xe8080649 0x3
+ .DebugExceptionVector.text
+ 0xe808064c 0xa objs/hikey/gdbstub-entry.o
+ 0xe808064c DebugExceptionVector
+ 0xe8080656 _DebugExceptionVector_text_end = ABSOLUTE (.)
+ 0xe8080658 _memmap_seg_iram0_10_end = ALIGN (0x8)
+
+.NMIExceptionVector.literal
+ 0xe8080678 0x8
+ 0xe8080678 _NMIExceptionVector_literal_start = ABSOLUTE (.)
+ *(.NMIExceptionVector.literal)
+ .NMIExceptionVector.literal
+ 0xe8080678 0x8 objs/hikey/int_vector.o
+ 0xe8080680 _NMIExceptionVector_literal_end = ABSOLUTE (.)
+ 0xe8080680 _memmap_seg_iram0_11_end = ALIGN (0x8)
+
+.NMIExceptionVector.text
+ 0xe80806c0 0x1b
+ 0xe80806c0 _NMIExceptionVector_text_start = ABSOLUTE (.)
+ *(.NMIExceptionVector.text)
+ .NMIExceptionVector.text
+ 0xe80806c0 0x1b objs/hikey/int_vector.o
+ 0xe80806c0 OS_NMIExceptionVector
+ 0xe80806db _NMIExceptionVector_text_end = ABSOLUTE (.)
+ 0xe80806e0 _memmap_seg_iram0_12_end = ALIGN (0x8)
+
+.KernelExceptionVector.literal
+ 0xe80806f8 0x0
+ 0xe80806f8 _KernelExceptionVector_literal_start = ABSOLUTE (.)
+ *(.KernelExceptionVector.literal)
+ .KernelExceptionVector.literal
+ 0xe80806f8 0x0 objs/hikey/int_vector.o
+ 0x4 (size before relaxing)
+ 0xe80806f8 _KernelExceptionVector_literal_end = ABSOLUTE (.)
+ 0xe80806f8 _memmap_seg_iram0_13_end = ALIGN (0x8)
+
+.KernelExceptionVector.text
+ 0xe8080700 0x6
+ 0xe8080700 _KernelExceptionVector_text_start = ABSOLUTE (.)
+ *(.KernelExceptionVector.text)
+ .KernelExceptionVector.text
+ 0xe8080700 0x6 objs/hikey/int_vector.o
+ 0x9 (size before relaxing)
+ 0xe8080700 OS_KernelExceptionVector
+ 0xe8080706 _KernelExceptionVector_text_end = ABSOLUTE (.)
+ 0xe8080708 _memmap_seg_iram0_14_end = ALIGN (0x8)
+
+.UserExceptionVector.literal
+ 0xe8080738 0x0
+ 0xe8080738 _UserExceptionVector_literal_start = ABSOLUTE (.)
+ *(.UserExceptionVector.literal)
+ .UserExceptionVector.literal
+ 0xe8080738 0x0 objs/hikey/int_vector.o
+ 0x4 (size before relaxing)
+ 0xe8080738 _UserExceptionVector_literal_end = ABSOLUTE (.)
+ 0xe8080738 _memmap_seg_iram0_15_end = ALIGN (0x8)
+
+.UserExceptionVector.text
+ 0xe8080740 0x6
+ 0xe8080740 _UserExceptionVector_text_start = ABSOLUTE (.)
+ *(.UserExceptionVector.text)
+ .UserExceptionVector.text
+ 0xe8080740 0x6 objs/hikey/int_vector.o
+ 0x9 (size before relaxing)
+ 0xe8080740 OS_UserExceptionVector
+ 0xe8080746 _UserExceptionVector_text_end = ABSOLUTE (.)
+ 0xe8080748 _memmap_seg_iram0_16_end = ALIGN (0x8)
+
+.DoubleExceptionVector.literal
+ 0xe8080778 0x0
+ 0xe8080778 _DoubleExceptionVector_literal_start = ABSOLUTE (.)
+ *(.DoubleExceptionVector.literal)
+ .DoubleExceptionVector.literal
+ 0xe8080778 0x0 objs/hikey/int_vector.o
+ 0x4 (size before relaxing)
+ 0xe8080778 _DoubleExceptionVector_literal_end = ABSOLUTE (.)
+ 0xe8080778 _memmap_seg_iram0_17_end = ALIGN (0x8)
+
+.DoubleExceptionVector.text
+ 0xe80807c0 0x6
+ 0xe80807c0 _DoubleExceptionVector_text_start = ABSOLUTE (.)
+ *(.DoubleExceptionVector.text)
+ .DoubleExceptionVector.text
+ 0xe80807c0 0x6 objs/hikey/int_vector.o
+ 0x9 (size before relaxing)
+ 0xe80807c0 OS_DoubleExceptionVector
+ 0xe80807c6 _DoubleExceptionVector_text_end = ABSOLUTE (.)
+ 0xe80807c8 _memmap_seg_iram0_18_end = ALIGN (0x8)
+
+.Reset.text 0xe8080800 0x23d
+ 0xe8080800 _Reset_text_start = ABSOLUTE (.)
+ *(.Reset.text)
+ .Reset.text 0xe8080800 0x23d objs/hikey/reset.o
+ 0xe8080800 _Reset
+ 0xe8080a3d _Reset_text_end = ABSOLUTE (.)
+
+.iram0.text 0xe8080a40 0x600
+ 0xe8080a40 _iram0_text_start = ABSOLUTE (.)
+ *(.iram0.literal .iram.literal .iram.text.literal .iram0.text .iram.text)
+ .iram0.literal
+ 0xe8080a40 0x44 objs/hikey/int_vector.o
+ 0x88 (size before relaxing)
+ .iram0.literal
+ 0xe8080a84 0x2c objs/hikey/arch_hifi330.o
+ 0x58 (size before relaxing)
+ .iram0.text 0xe8080ab0 0x3b4 objs/hikey/int_vector.o
+ 0x3c0 (size before relaxing)
+ 0xe8080ab0 OS_Panic
+ 0xe8080ad0 OS_UserExc
+ 0xe8080b68 OS_UserExit
+ 0xe8080dc4 OS_Medint2Exit
+ 0xe8080e50 OS_Medint3Exit
+ .iram0.text 0xe8080e64 0x1dc objs/hikey/arch_hifi330.o
+ 0xe8080e64 VOSStartHighRdy
+ 0xe8080e7c VOSCtxSw
+ 0xe8080eac VOSIntCtxSw
+ 0xe8080ecc OSCPUSaveSR
+ 0xe8080ed8 OSCPURestoreSR
+ 0xe8080ee4 OS_TaskSwitch
+ 0xe8080f24 OS_ContextSave
+ 0xe8080f90 OS_ContextRestore
+ 0xe8080fd8 OS_IntEnter
+ 0xe8081008 OS_IntExit
+ 0xe8081020 OS_GetTaskCoprocState
+ 0xe8081040 _iram0_text_end = ABSOLUTE (.)
+ 0xe8081040 _memmap_seg_iram0_19_end = ALIGN (0x8)
+
+.sram.shareaddr
+ 0xc0000000 0x0
+ 0xc0000000 _sram_shareaddr_start = ABSOLUTE (.)
+ *(.sram.shareaddr)
+ 0xc0000000 _sram_shareaddr_end = ABSOLUTE (.)
+
+.sram.rodata 0xc0000000 0x0
+ 0xc0000000 _sram_rodata_start = ABSOLUTE (.)
+ *(.sram.rodata)
+ 0xc0000000 _sram_rodata_end = ABSOLUTE (.)
+
+.rodata 0xc0000000 0x75a0
+ 0xc0000000 _rodata_start = ABSOLUTE (.)
+ *(.rodata)
+ .rodata 0xc0000000 0x84 objs/hikey/dsp_debug.o
+ *fill* 0xc0000084 0xc
+ .rodata 0xc0000090 0x10f objs/hikey/xf-core.o
+ *fill* 0xc000019f 0x1
+ .rodata 0xc00001a0 0x197 objs/hikey/xf-io.o
+ *fill* 0xc0000337 0x9
+ .rodata 0xc0000340 0x1b objs/hikey/xf-mem.o
+ *fill* 0xc000035b 0x5
+ .rodata 0xc0000360 0x30 objs/hikey/xf-msg.o
+ .rodata 0xc0000390 0x1d objs/hikey/xf-sched.o
+ *fill* 0xc00003ad 0x3
+ .rodata 0xc00003b0 0x45 objs/hikey/xa-factory.o
+ *fill* 0xc00003f5 0xb
+ .rodata 0xc0000400 0x4e objs/hikey/xf-shmem.o
+ *fill* 0xc000044e 0x2
+ .rodata 0xc0000450 0x1ec objs/hikey/tinyvprintf.o
+ *fill* 0xc000063c 0x4
+ .rodata 0xc0000640 0x120 objs/hikey/gdbstub.o
+ 0xc0000640 rx
+ 0xc0000644 tx
+ .rodata 0xc0000760 0x140 objs/hikey/xa-class-base.o
+ .rodata 0xc00008a0 0x1e7 objs/hikey/xa-class-audio-codec.o
+ *fill* 0xc0000a87 0x9
+ .rodata 0xc0000a90 0x1d1 objs/hikey/xa-class-mixer.o
+ *fill* 0xc0000c61 0xf
+ .rodata 0xc0000c70 0x15 objs/hikey/xf-main.o
+ *fill* 0xc0000c85 0xb
+ .rodata 0xc0000c90 0x2ed objs/hikey/xa-pcm.o
+ *fill* 0xc0000f7d 0x3
+ .rodata 0xc0000f80 0xc objs/hikey/xa-vorbis-decoder.o
+ *fill* 0xc0000f8c 0x4
+ .rodata 0xc0000f90 0x269 objs/hikey/xa-mixer.o
+ *fill* 0xc00011f9 0x7
+ .rodata 0xc0001200 0x4a54 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ *(.rodata.*)
+ .rodata.str1.4
+ 0xc0005c54 0x7 objs/hikey/dsp_debug.o
+ *fill* 0xc0005c5b 0x1
+ .rodata.str1.4
+ 0xc0005c5c 0x2e1 objs/hikey/xf-core.o
+ *fill* 0xc0005f3d 0x3
+ .rodata.str1.4
+ 0xc0005f40 0x2fb objs/hikey/xf-io.o
+ 0x363 (size before relaxing)
+ *fill* 0xc000623b 0x1
+ .rodata.str1.4
+ 0xc000623c 0x50 objs/hikey/xf-mem.o
+ 0x8c (size before relaxing)
+ .rodata.str1.4
+ 0xc000628c 0x15 objs/hikey/xf-msg.o
+ 0x49 (size before relaxing)
+ *fill* 0xc00062a1 0x3
+ .rodata.str1.4
+ 0xc00062a4 0x56 objs/hikey/xf-sched.o
+ *fill* 0xc00062fa 0x2
+ .rodata.str1.4
+ 0xc00062fc 0x68 objs/hikey/xa-factory.o
+ 0x70 (size before relaxing)
+ .rodata.str1.4
+ 0xc0006364 0xa8 objs/hikey/xf-shmem.o
+ 0xe4 (size before relaxing)
+ .rodata.str1.4
+ 0xc000640c 0x11 objs/hikey/tinyvprintf.o
+ *fill* 0xc000641d 0x3
+ .rodata.str1.4
+ 0xc0006420 0x3f objs/hikey/gdbstub.o
+ *fill* 0xc000645f 0x1
+ .rodata.str1.4
+ 0xc0006460 0x6b6 objs/hikey/xa-class-base.o
+ 0x6f2 (size before relaxing)
+ *fill* 0xc0006b16 0x2
+ .rodata.str1.4
+ 0xc0006b18 0x41b objs/hikey/xa-class-audio-codec.o
+ 0x517 (size before relaxing)
+ *fill* 0xc0006f33 0x1
+ .rodata.str1.4
+ 0xc0006f34 0x3cf objs/hikey/xa-class-mixer.o
+ 0x58b (size before relaxing)
+ *fill* 0xc0007303 0x1
+ .rodata.str1.4
+ 0xc0007304 0x4c objs/hikey/xf-main.o
+ 0x8c (size before relaxing)
+ .rodata.str1.4
+ 0xc0007350 0x86 objs/hikey/xa-pcm.o
+ 0xc2 (size before relaxing)
+ *fill* 0xc00073d6 0x2
+ .rodata.str1.4
+ 0xc00073d8 0x129 objs/hikey/xa-mixer.o
+ 0x169 (size before relaxing)
+ *fill* 0xc0007501 0x3
+ .rodata.str1.4
+ 0xc0007504 0x8 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ 0x7 (size before relaxing)
+ *(.gnu.linkonce.r.*)
+ *(.rodata1)
+ 0xc000750c __XT_EXCEPTION_TABLE__ = ABSOLUTE (.)
+ *(.xt_except_table)
+ *(.gcc_except_table)
+ *(.gnu.linkonce.e.*)
+ *(.gnu.version_r)
+ *(.eh_frame)
+ .eh_frame 0xc000750c 0x24 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .eh_frame 0xc0007530 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ 0x24 (size before relaxing)
+ .eh_frame 0xc0007544 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ 0x24 (size before relaxing)
+ *crtbegin.o(.ctors)
+ *(EXCLUDE_FILE(*crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+ *crtbegin.o(.dtors)
+ *(EXCLUDE_FILE(*crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+ 0xc0007558 __XT_EXCEPTION_DESCS__ = ABSOLUTE (.)
+ *(.xt_except_desc)
+ *(.gnu.linkonce.h.*)
+ 0xc0007558 __XT_EXCEPTION_DESCS_END__ = ABSOLUTE (.)
+ *(.xt_except_desc_end)
+ *(.dynamic)
+ *(.gnu.version_d)
+ 0xc0007558 . = ALIGN (0x4)
+ 0xc0007558 _bss_table_start = ABSOLUTE (.)
+ 0xc0007558 0x4 LONG 0xc0408000 _vlpd_bss_start
+ 0xc000755c 0x4 LONG 0xc0408000 _vlpd_bss_end
+ 0xc0007560 0x4 LONG 0xc0418000 _efr_fr_hr_vlpd_bss_start
+ 0xc0007564 0x4 LONG 0xc0418000 _efr_fr_hr_vlpd_bss_end
+ 0xc0007568 0x4 LONG 0xc0428000 _amr_vlpd_bss_start
+ 0xc000756c 0x4 LONG 0xc0428000 _amr_vlpd_bss_end
+ 0xc0007570 0x4 LONG 0xc0438000 _amrwb_vlpd_bss_start
+ 0xc0007574 0x4 LONG 0xc0438000 _amrwb_vlpd_bss_end
+ 0xc0007578 0x4 LONG 0xc0578000 _ulpp_bss_start
+ 0xc000757c 0x4 LONG 0xc0578000 _ulpp_bss_end
+ 0xc0007580 0x4 LONG 0xc05b8000 _dtsv3_bss_start
+ 0xc0007584 0x4 LONG 0xc05b8000 _dtsv3_bss_end
+ 0xc0007588 0x4 LONG 0xc05d8000 _dtsv4_bss_start
+ 0xc000758c 0x4 LONG 0xc05d8000 _dtsv4_bss_end
+ 0xc0007590 0x4 LONG 0xe8058058 _dram0_bss_start
+ 0xc0007594 0x4 LONG 0xe8058058 _dram0_bss_end
+ 0xc0007598 0x4 LONG 0xc001a300 _bss_start
+ 0xc000759c 0x4 LONG 0xc011b628 _bss_end
+ 0xc00075a0 _bss_table_end = ABSOLUTE (.)
+ 0xc00075a0 _rodata_end = ABSOLUTE (.)
+
+.sram.text 0xc00075a0 0x0
+ 0xc00075a0 _sram_text_start = ABSOLUTE (.)
+ *(.sram.literal .sram.text)
+ 0xc00075a0 _sram_text_end = ABSOLUTE (.)
+
+.text 0xc00075a0 0x12b4c
+ 0xc00075a0 _stext = .
+ 0xc00075a0 _text_start = ABSOLUTE (.)
+ *(.entry.text)
+ *(.init.literal)
+ *(.init)
+ *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ .text 0xc00075a0 0xc3 objs/hikey/cpu_c.o
+ 0xd9 (size before relaxing)
+ 0xc00075a4 OS_EnterIntHook
+ 0xc00075bc OS_ExitIntHook
+ 0xc00075d8 OS_UserexecHandler
+ 0xc00075f8 OS_InterruptHandler
+ 0xc0007610 OS_NmiHook
+ 0xc000762c VOS_ConnectInterrupt
+ 0xc000763c VOS_EnableInterrupt
+ 0xc0007658 VOS_DisableInterrupt
+ *fill* 0xc0007663 0x5
+ .text 0xc0007668 0x59a objs/hikey/dsp_debug.o
+ 0x5da (size before relaxing)
+ 0xc0007690 __xprintf
+ 0xc0007b60 dsp_debug_init
+ 0xc0007bd8 print_log
+ *fill* 0xc0007c02 0x6
+ .text 0xc0007c08 0x40 objs/hikey/mutex.o
+ .text 0xc0007c48 0x535 objs/hikey/rbtree.o
+ 0x53d (size before relaxing)
+ 0xc0007c80 rb_first
+ 0xc0007ca0 rb_last
+ 0xc0007cc0 rb_next
+ 0xc0007d00 rb_prev
+ 0xc0007d40 rb_init
+ 0xc0007d54 rb_insert
+ 0xc0007e84 rb_delete
+ 0xc0008138 rb_replace
+ *fill* 0xc000817d 0x3
+ .text 0xc0008180 0x899 objs/hikey/xf-core.o
+ 0xaa4 (size before relaxing)
+ 0xc0008538 xf_msg_submit
+ 0xc00085b4 xf_msg_complete
+ 0xc0008614 xf_core_init
+ 0xc000874c xf_core_service
+ 0xc0008a00 xf_global_init
+ *fill* 0xc0008a19 0x7
+ .text 0xc0008a20 0x79b objs/hikey/xf-io.o
+ 0x88b (size before relaxing)
+ 0xc0008a78 xf_input_port_init
+ 0xc0008b0c xf_input_port_put
+ 0xc0008bf4 xf_input_port_fill
+ 0xc0008c9c xf_input_port_pad
+ 0xc0008cc8 xf_input_port_consume
+ 0xc0008d38 xf_input_port_purge
+ 0xc0008da0 xf_input_port_control_save
+ 0xc0008de8 xf_input_port_purge_done
+ 0xc0008e34 xf_input_port_destroy
+ 0xc0008e84 xf_output_port_init
+ 0xc0008ec4 xf_output_port_route
+ 0xc0008fe0 xf_output_port_unroute_start
+ 0xc0008ff4 xf_output_port_unroute_done
+ 0xc0009020 xf_output_port_unroute
+ 0xc0009088 xf_output_port_put
+ 0xc00090ac xf_output_port_data
+ 0xc00090c0 xf_output_port_produce
+ 0xc00090f0 xf_output_port_flush
+ 0xc0009158 xf_output_port_flush_done
+ 0xc000918c xf_output_port_destroy
+ *fill* 0xc00091bb 0x5
+ .text 0xc00091c0 0x2e0 objs/hikey/xf-mem.o
+ 0x338 (size before relaxing)
+ 0xc000924c xf_mm_alloc
+ 0xc00092ec xf_mm_free
+ 0xc000940c xf_mm_init
+ .text 0xc00094a0 0x153 objs/hikey/xf-msg.o
+ 0x173 (size before relaxing)
+ 0xc00094f0 xf_msg_pool_init
+ 0xc000957c xf_msg_pool_destroy
+ 0xc00095b0 xf_msg_pool_get
+ 0xc00095e8 xf_msg_pool_put
+ *fill* 0xc00095f3 0x5
+ .text 0xc00095f8 0x127 objs/hikey/xf-sched.o
+ 0x14a (size before relaxing)
+ 0xc0009640 xf_sched_put
+ 0xc00096b0 xf_sched_get
+ 0xc00096f8 xf_sched_cancel
+ 0xc0009714 xf_sched_init
+ *fill* 0xc000971f 0x1
+ .text 0xc0009720 0x91 objs/hikey/xa-factory.o
+ 0xa1 (size before relaxing)
+ 0xc000976c xf_component_factory
+ *fill* 0xc00097b1 0x7
+ .text 0xc00097b8 0x532 objs/hikey/xf-shmem.o
+ 0x61a (size before relaxing)
+ 0xc0009a68 xf_shmem_process_queues
+ 0xc0009bd4 xf_msg_proxy_complete
+ 0xc0009c4c xf_shmem_init
+ *fill* 0xc0009cea 0x6
+ .text 0xc0009cf0 0x380 objs/hikey/tinyvprintf.o
+ 0xc0009d0c tiny_vsprintf
+ 0xc000a04c tiny_sprintf
+ .text 0xc000a070 0x108 objs/hikey/xf-isr.o
+ 0x120 (size before relaxing)
+ 0xc000a0b4 xf_msg_schedule_isr
+ 0xc000a11c xf_msg_complete_isr
+ .text 0xc000a178 0xe34 objs/hikey/gdbstub.o
+ 0x100c (size before relaxing)
+ 0xc000a18c init_debug_comm
+ 0xc000a1d4 poll_debug_ring
+ 0xc000a36c getpacket
+ 0xc000aa64 handle_exception
+ 0xc000af5c init_gdbstub
+ *fill* 0xc000afac 0x4
+ .text 0xc000afb0 0x1622 objs/hikey/xa-class-base.o
+ 0x1cea (size before relaxing)
+ 0xc000b0c4 xa_base_set_param
+ 0xc000b82c xa_base_get_param
+ 0xc000b968 xa_base_set_param_ext
+ 0xc000bb80 xa_base_get_param_ext
+ 0xc000c17c xa_base_schedule
+ 0xc000c1d4 xa_base_cancel
+ 0xc000c22c xa_base_destroy
+ 0xc000c2a8 xa_base_factory
+ *fill* 0xc000c5d2 0x6
+ .text 0xc000c5d8 0x14e3 objs/hikey/xa-class-audio-codec.o
+ 0x1afb (size before relaxing)
+ 0xc000da44 xa_audio_codec_factory
+ *fill* 0xc000dabb 0x5
+ .text 0xc000dac0 0x144a objs/hikey/xa-class-mixer.o
+ 0x1aaa (size before relaxing)
+ 0xc000ee98 xa_mixer_factory
+ *fill* 0xc000ef0a 0x6
+ .text 0xc000ef10 0x185 objs/hikey/xf-main.o
+ 0x205 (size before relaxing)
+ 0xc000ef6c xf_ipc_init
+ 0xc000efe8 main
+ *fill* 0xc000f095 0x3
+ .text 0xc000f098 0xf0f objs/hikey/xa-pcm.o
+ 0x13e7 (size before relaxing)
+ 0xc000ff3c xa_pcm_codec
+ *fill* 0xc000ffa7 0x1
+ .text 0xc000ffa8 0x46 objs/hikey/xa-vorbis-decoder.o
+ 0x4e (size before relaxing)
+ 0xc000ffb0 xa_vorbis_decoder
+ *fill* 0xc000ffee 0x2
+ .text 0xc000fff0 0xc77 objs/hikey/xa-mixer.o
+ 0x10cf (size before relaxing)
+ 0xc0010bfc xa_mixer
+ *fill* 0xc0010c67 0x1
+ .literal 0xc0010c68 0x10 objs/hikey/gdbstub-entry.o
+ 0x2c (size before relaxing)
+ .literal 0xc0010c78 0x4 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .literal 0xc0010c7c 0x4 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .literal 0xc0010c80 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ 0x4 (size before relaxing)
+ .literal 0xc0010c80 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .literal 0xc0010c88 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ 0x8 (size before relaxing)
+ .literal 0xc0010c88 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ 0xc (size before relaxing)
+ .literal 0xc0010c90 0x4 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ 0x10 (size before relaxing)
+ .literal 0xc0010c94 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ 0x18 (size before relaxing)
+ .literal 0xc0010c94 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ 0x4 (size before relaxing)
+ .literal 0xc0010c94 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ 0x4 (size before relaxing)
+ .literal 0xc0010c94 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ 0x8 (size before relaxing)
+ .literal 0xc0010c94 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ 0x4 (size before relaxing)
+ .literal 0xc0010c94 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ 0x2c (size before relaxing)
+ .literal 0xc0010c9c 0xc /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ 0x1c (size before relaxing)
+ .literal 0xc0010ca8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ 0xc (size before relaxing)
+ .text 0xc0010ca8 0x138 objs/hikey/gdbstub-entry.o
+ 0xc0010ca8 DebugExceptionEntry
+ 0xc0010dc8 init_debug_entry
+ 0xc0010dd8 breakpoint
+ *fill* 0xc0010de0 0x0
+ .text 0xc0010de0 0x7321 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ 0x7339 (size before relaxing)
+ 0xc0013ef8 xa_vorbis_dec
+ *fill* 0xc0018101 0x3
+ .text 0xc0018104 0x137 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ 0xc0018104 xthal_window_spill_nw
+ 0xc0018104 xthal_spill_registers_into_stack_nw
+ 0xc0018218 xthal_window_spill
+ *fill* 0xc001823b 0x1
+ .text 0xc001823c 0x22 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ 0xc001823c _xtos_ints_on
+ *fill* 0xc001825e 0x2
+ .text 0xc0018260 0x25 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ 0xc0018260 _xtos_ints_off
+ *fill* 0xc0018285 0x3
+ .text 0xc0018288 0x7c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ 0xc0018288 memchr
+ *fill* 0xc0018304 0x4
+ .text 0xc0018308 0x84 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ 0xc0018308 strncmp
+ .text 0xc001838c 0x2fa /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ 0xc00183ac __adddf3
+ 0xc0018500 __subdf3
+ *fill* 0xc0018686 0x2
+ .text 0xc0018688 0x1ff /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ 0xc0018768 __muldf3
+ *fill* 0xc0018887 0x1
+ .text 0xc0018888 0x176 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ 0xc0018888 __eqdf2
+ 0xc0018888 __nedf2
+ 0xc00188bc __gtdf2
+ 0xc00188e4 __ledf2
+ 0xc0018948 __gedf2
+ 0xc0018970 __ltdf2
+ 0xc00189d4 __unorddf2
+ *fill* 0xc00189fe 0x2
+ .text 0xc0018a00 0x5d /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ 0xc0018a00 __fixunsdfsi
+ *fill* 0xc0018a5d 0x3
+ .text 0xc0018a60 0x75 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ 0xc0018a60 __fixunsdfdi
+ *fill* 0xc0018ad5 0x3
+ .text 0xc0018ad8 0xa3 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ 0xc0018ad8 __vec_memcpy
+ *fill* 0xc0018b7b 0x5
+ .text 0xc0018b80 0x71 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ 0xc0018b80 __vec_memset
+ *fill* 0xc0018bf1 0x7
+ .text 0xc0018bf8 0x318 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ 0xc0018bf8 __divdf3
+ .text 0xc0018f10 0x29a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ 0xc0018f10 __propagateFloat64NaN
+ 0xc00190c0 __roundAndPackFloat64
+ *fill* 0xc00191aa 0x6
+ .text 0xc00191b0 0x6d /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ 0xc00191b0 __estimateDiv64To32
+ *fill* 0xc001921d 0x3
+ .literal 0xc0019220 0x0 objs/hikey/cpu_c.o
+ *fill* 0xc0019220 0x0
+ .literal 0xc0019220 0x0 objs/hikey/dsp_debug.o
+ *fill* 0xc0019220 0x0
+ *fill* 0xc0019220 0x0
+ .literal 0xc0019220 0x0 objs/hikey/dsp_comm.o
+ *fill* 0xc0019220 0x0
+ .text 0xc0019220 0xda objs/hikey/dsp_comm.o
+ 0xc0019220 dsp_memcpy
+ 0xc00192a0 dsp_memset
+ 0xc00192d4 division
+ *fill* 0xc00192fa 0x2
+ .literal 0xc00192fc 0x0 objs/hikey/mutex.o
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/rbtree.o
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xf-core.o
+ .literal 0xc00192fc 0x0 objs/hikey/xf-io.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xf-mem.o
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xf-msg.o
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xf-sched.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xa-factory.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xf-shmem.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/tinyvprintf.o
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xf-isr.o
+ .literal 0xc00192fc 0x0 objs/hikey/gdbstub.o
+ .literal 0xc00192fc 0x0 objs/hikey/xa-class-base.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xa-class-audio-codec.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xa-class-mixer.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xf-main.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xa-pcm.o
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xa-vorbis-decoder.o
+ *fill* 0xc00192fc 0x0
+ .literal 0xc00192fc 0x0 objs/hikey/xa-mixer.o
+ .text 0xc00192fc 0x0 objs/hikey/reset.o
+ .text 0xc00192fc 0x0 objs/hikey/int_vector.o
+ .text 0xc00192fc 0x0 objs/hikey/arch_hifi330.o
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x0
+ *fill* 0xc00192fc 0x4
+ .text 0xc0019300 0x1c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ 0xc0019300 xthal_dcache_region_invalidate
+ *fill* 0xc001931c 0x4
+ .text 0xc0019320 0x1c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ 0xc0019320 xthal_dcache_region_writeback
+ .text 0xc001933c 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid0.o)
+ .text 0xc001933c 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid1.o)
+ .text 0xc001933c 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_major.o)
+ .text 0xc001933c 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_minor.o)
+ .text 0xc001933c 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ 0xc001933c xthal_get_intenable
+ .text 0xc0019344 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ 0xc0019344 xthal_set_intenable
+ .text 0xc001934c 0x2a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ 0xc001934c xthal_restore_extra_nw
+ *fill* 0xc0019376 0x2
+ .text 0xc0019378 0x2a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ 0xc0019378 xthal_save_extra_nw
+ *fill* 0xc00193a2 0x0
+ *fill* 0xc00193a2 0x0
+ *fill* 0xc00193a2 0x2
+ .text 0xc00193a4 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ 0xc00193a4 _xtos_unhandled_interrupt
+ *fill* 0xc00193ac 0x4
+ .text 0xc00193b0 0x45 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ 0xc00193b0 memcmp
+ *fill* 0xc00193f5 0x3
+ .text 0xc00193f8 0x138 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ 0xc001943c memcpy
+ .text 0xc0019530 0x78 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ 0xc001955c memset
+ .literal 0xc00195a8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .text 0xc00195a8 0x338 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ 0xc001962c qsort
+ .text 0xc00198e0 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ 0xc00198e0 __divsi3
+ .text 0xc00198e8 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ 0xc00198e8 __modsi3
+ *fill* 0xc00198f0 0x0
+ *fill* 0xc00198f0 0x0
+ *fill* 0xc00198f0 0x0
+ *fill* 0xc00198f0 0x0
+ *fill* 0xc00198f0 0x0
+ .text 0xc00198f0 0x3e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ 0xc00198f0 __floatunsidf
+ 0xc00198fc __floatsidf
+ *fill* 0xc001992e 0x2
+ .text 0xc0019930 0x84 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ 0xc0019930 __floatundidf
+ 0xc0019940 __floatdidf
+ *fill* 0xc00199b4 0x4
+ .text 0xc00199b8 0x271 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ 0xc00199b8 __divdi3
+ *fill* 0xc0019c29 0x7
+ .text 0xc0019c30 0x24c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ 0xc0019c30 __udivdi3
+ *fill* 0xc0019e7c 0x4
+ .text 0xc0019e80 0x26c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ 0xc0019e80 __umoddi3
+ *fill* 0xc001a0ec 0x0
+ *fill* 0xc001a0ec 0x0
+ *fill* 0xc001a0ec 0x0
+ *fill* 0xc001a0ec 0x0
+ *fill* 0xc001a0ec 0x0
+ *(.fini.literal)
+ *(.fini)
+ *(.gnu.version)
+ 0xc001a0ec _text_end = ABSOLUTE (.)
+ 0xc001a0ec _etext = .
+
+.sram.data 0xc001a0ec 0x0
+ 0xc001a0ec _sram_data_start = ABSOLUTE (.)
+ *(.sram.data)
+ 0xc001a0ec _sram_data_end = ABSOLUTE (.)
+
+.data 0xc001a0f0 0x208
+ 0xc001a0f0 _data_start = ABSOLUTE (.)
+ *(.data)
+ .data 0xc001a0f0 0x0 objs/hikey/cpu_c.o
+ .data 0xc001a0f0 0x0 objs/hikey/dsp_debug.o
+ .data 0xc001a0f0 0x0 objs/hikey/dsp_comm.o
+ .data 0xc001a0f0 0x0 objs/hikey/mutex.o
+ .data 0xc001a0f0 0x0 objs/hikey/rbtree.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-core.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-io.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-mem.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-msg.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-sched.o
+ .data 0xc001a0f0 0x0 objs/hikey/xa-factory.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-shmem.o
+ .data 0xc001a0f0 0x0 objs/hikey/tinyvprintf.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-isr.o
+ .data 0xc001a0f0 0x0 objs/hikey/gdbstub.o
+ .data 0xc001a0f0 0x0 objs/hikey/xa-class-base.o
+ .data 0xc001a0f0 0x0 objs/hikey/xa-class-audio-codec.o
+ .data 0xc001a0f0 0x0 objs/hikey/xa-class-mixer.o
+ .data 0xc001a0f0 0x0 objs/hikey/xf-main.o
+ .data 0xc001a0f0 0x0 objs/hikey/xa-pcm.o
+ .data 0xc001a0f0 0x0 objs/hikey/xa-vorbis-decoder.o
+ .data 0xc001a0f0 0x0 objs/hikey/xa-mixer.o
+ .data 0xc001a0f0 0x0 objs/hikey/reset.o
+ .data 0xc001a0f0 0x0 objs/hikey/int_vector.o
+ .data 0xc001a0f0 0x0 objs/hikey/arch_hifi330.o
+ .data 0xc001a0f0 0x0 objs/hikey/gdbstub-entry.o
+ .data 0xc001a0f0 0x0 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid0.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid1.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_major.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_minor.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .data 0xc001a0f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ .data 0xc001a0f0 0x208 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ 0xc001a0f0 _xtos_enabled
+ 0xc001a0f0 _xtos_intstruct
+ 0xc001a0f4 _xtos_vpri_enabled
+ 0xc001a0f8 _xtos_interrupt_table
+ 0xc001a1f8 _xtos_interrupt_mask_table
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .data 0xc001a2f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ *(.gnu.linkonce.d.*personality*)
+ *(.data1)
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ *(.jcr)
+ 0xc001a2f8 _data_end = ABSOLUTE (.)
+
+.sram.uninit 0xc001a2f8 0x0
+ 0xc001a2f8 _sram_uninit_start = ABSOLUTE (.)
+ *(.sram.uninit)
+ 0xc001a2f8 _sram_uninit_end = ABSOLUTE (.)
+
+.bss 0xc001a300 0x101328
+ 0xc001a300 . = ALIGN (0x8)
+ 0xc001a300 _bss_start = ABSOLUTE (.)
+ *(.dynsbss)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ *(.dynbss)
+ *(.bss)
+ .bss 0xc001a300 0xb0 objs/hikey/cpu_c.o
+ 0xc001a300 g_ucVosIntNesting
+ 0xc001a301 g_ucVosPrioCur
+ 0xc001a302 g_ucVosPrioHighRdy
+ 0xc001a304 g_bVosRunning
+ 0xc001a308 g_pstVosTCBHighRdy
+ 0xc001a30c g_pstVosTCBCur
+ 0xc001a310 g_pfVosHookFuncTable
+ 0xc001a330 g_pfVosIntrFuncTable
+ .bss 0xc001a3b0 0x4 objs/hikey/dsp_debug.o
+ .bss 0xc001a3b4 0x0 objs/hikey/dsp_comm.o
+ .bss 0xc001a3b4 0x0 objs/hikey/mutex.o
+ .bss 0xc001a3b4 0x0 objs/hikey/rbtree.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xf-core.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xf-io.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xf-mem.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xf-msg.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xf-sched.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xa-factory.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xf-shmem.o
+ .bss 0xc001a3b4 0x0 objs/hikey/tinyvprintf.o
+ .bss 0xc001a3b4 0x0 objs/hikey/xf-isr.o
+ *fill* 0xc001a3b4 0xc
+ .bss 0xc001a3c0 0xb70 objs/hikey/gdbstub.o
+ 0xc001a3c0 mem_err
+ 0xc001a530 sregs
+ 0xc001aa30 aregs
+ 0xc001ab30 stack
+ .bss 0xc001af30 0x0 objs/hikey/xa-class-base.o
+ .bss 0xc001af30 0x0 objs/hikey/xa-class-audio-codec.o
+ .bss 0xc001af30 0x0 objs/hikey/xa-class-mixer.o
+ *fill* 0xc001af30 0x50
+ .bss 0xc001af80 0x1006a8 objs/hikey/xf-main.o
+ 0xc001af80 xf_dsp_local_buffer
+ 0xc011b2c0 waitstate
+ 0xc011b2c8 prof
+ 0xc011b318 xf_ap_shmem_pool
+ 0xc011b340 xf_core_data
+ 0xc011b500 xf_core_rw_data
+ 0xc011b580 xf_core_ro_data
+ 0xc011b600 xf_dsp_local_pool
+ .bss 0xc011b628 0x0 objs/hikey/xa-pcm.o
+ .bss 0xc011b628 0x0 objs/hikey/xa-vorbis-decoder.o
+ .bss 0xc011b628 0x0 objs/hikey/xa-mixer.o
+ .bss 0xc011b628 0x0 objs/hikey/reset.o
+ .bss 0xc011b628 0x0 objs/hikey/int_vector.o
+ .bss 0xc011b628 0x0 objs/hikey/arch_hifi330.o
+ .bss 0xc011b628 0x0 objs/hikey/gdbstub-entry.o
+ .bss 0xc011b628 0x0 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid0.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid1.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_major.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_minor.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .bss 0xc011b628 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ *(.sram.pool.bss)
+ *(.sram.bss)
+ 0xc011b628 . = ALIGN (0x8)
+ 0xc011b628 _bss_end = ABSOLUTE (.)
+ 0xc011b628 _memmap_seg_sram0_end = ALIGN (0x8)
+
+.debug
+ *(.debug)
+
+.line
+ *(.line)
+
+.debug_srcinfo
+ *(.debug_srcinfo)
+
+.debug_sfnames
+ *(.debug_sfnames)
+
+.debug_aranges 0x00000000 0x7b0
+ *(.debug_aranges)
+ .debug_aranges
+ 0x00000000 0x20 objs/hikey/cpu_c.o
+ .debug_aranges
+ 0x00000020 0x20 objs/hikey/dsp_debug.o
+ .debug_aranges
+ 0x00000040 0x20 objs/hikey/dsp_comm.o
+ .debug_aranges
+ 0x00000060 0x20 objs/hikey/mutex.o
+ .debug_aranges
+ 0x00000080 0x20 objs/hikey/rbtree.o
+ .debug_aranges
+ 0x000000a0 0x20 objs/hikey/xf-core.o
+ .debug_aranges
+ 0x000000c0 0x20 objs/hikey/xf-io.o
+ .debug_aranges
+ 0x000000e0 0x20 objs/hikey/xf-mem.o
+ .debug_aranges
+ 0x00000100 0x20 objs/hikey/xf-msg.o
+ .debug_aranges
+ 0x00000120 0x20 objs/hikey/xf-sched.o
+ .debug_aranges
+ 0x00000140 0x20 objs/hikey/xa-factory.o
+ .debug_aranges
+ 0x00000160 0x20 objs/hikey/xf-shmem.o
+ .debug_aranges
+ 0x00000180 0x20 objs/hikey/tinyvprintf.o
+ .debug_aranges
+ 0x000001a0 0x20 objs/hikey/xf-isr.o
+ .debug_aranges
+ 0x000001c0 0x20 objs/hikey/gdbstub.o
+ .debug_aranges
+ 0x000001e0 0x20 objs/hikey/xa-class-base.o
+ .debug_aranges
+ 0x00000200 0x20 objs/hikey/xa-class-audio-codec.o
+ .debug_aranges
+ 0x00000220 0x20 objs/hikey/xa-class-mixer.o
+ .debug_aranges
+ 0x00000240 0x20 objs/hikey/xf-main.o
+ .debug_aranges
+ 0x00000260 0x20 objs/hikey/xa-pcm.o
+ .debug_aranges
+ 0x00000280 0x20 objs/hikey/xa-vorbis-decoder.o
+ .debug_aranges
+ 0x000002a0 0x20 objs/hikey/xa-mixer.o
+ .debug_aranges
+ 0x000002c0 0x28 objs/hikey/reset.o
+ .debug_aranges
+ 0x000002e8 0x60 objs/hikey/int_vector.o
+ .debug_aranges
+ 0x00000348 0x20 objs/hikey/arch_hifi330.o
+ .debug_aranges
+ 0x00000368 0x28 objs/hikey/gdbstub-entry.o
+ .debug_aranges
+ 0x00000390 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .debug_aranges
+ 0x000003b0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .debug_aranges
+ 0x000003d0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .debug_aranges
+ 0x000003f0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .debug_aranges
+ 0x00000410 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .debug_aranges
+ 0x00000430 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .debug_aranges
+ 0x00000450 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .debug_aranges
+ 0x00000470 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .debug_aranges
+ 0x00000490 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ .debug_aranges
+ 0x000004b0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ .debug_aranges
+ 0x000004d0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .debug_aranges
+ 0x000004f0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .debug_aranges
+ 0x00000510 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .debug_aranges
+ 0x00000530 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .debug_aranges
+ 0x00000550 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .debug_aranges
+ 0x00000570 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .debug_aranges
+ 0x00000590 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .debug_aranges
+ 0x000005b0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .debug_aranges
+ 0x000005d0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .debug_aranges
+ 0x000005f0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .debug_aranges
+ 0x00000610 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ .debug_aranges
+ 0x00000630 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ .debug_aranges
+ 0x00000650 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ .debug_aranges
+ 0x00000670 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .debug_aranges
+ 0x00000690 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .debug_aranges
+ 0x000006b0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .debug_aranges
+ 0x000006d0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .debug_aranges
+ 0x000006f0 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .debug_aranges
+ 0x00000710 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .debug_aranges
+ 0x00000730 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .debug_aranges
+ 0x00000750 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .debug_aranges
+ 0x00000770 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .debug_aranges
+ 0x00000790 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+
+.debug_pubnames
+ 0x00000000 0xb7d
+ *(.debug_pubnames)
+ .debug_pubnames
+ 0x00000000 0x16f objs/hikey/cpu_c.o
+ .debug_pubnames
+ 0x0000016f 0x41 objs/hikey/dsp_debug.o
+ .debug_pubnames
+ 0x000001b0 0x3d objs/hikey/dsp_comm.o
+ .debug_pubnames
+ 0x000001ed 0x7a objs/hikey/rbtree.o
+ .debug_pubnames
+ 0x00000267 0x70 objs/hikey/xf-core.o
+ .debug_pubnames
+ 0x000002d7 0x21d objs/hikey/xf-io.o
+ .debug_pubnames
+ 0x000004f4 0x40 objs/hikey/xf-mem.o
+ .debug_pubnames
+ 0x00000534 0x67 objs/hikey/xf-msg.o
+ .debug_pubnames
+ 0x0000059b 0x5a objs/hikey/xf-sched.o
+ .debug_pubnames
+ 0x000005f5 0x2b objs/hikey/xa-factory.o
+ .debug_pubnames
+ 0x00000620 0x5a objs/hikey/xf-shmem.o
+ .debug_pubnames
+ 0x0000067a 0x35 objs/hikey/tinyvprintf.o
+ .debug_pubnames
+ 0x000006af 0x42 objs/hikey/xf-isr.o
+ .debug_pubnames
+ 0x000006f1 0xa6 objs/hikey/gdbstub.o
+ .debug_pubnames
+ 0x00000797 0xc2 objs/hikey/xa-class-base.o
+ .debug_pubnames
+ 0x00000859 0x2d objs/hikey/xa-class-audio-codec.o
+ .debug_pubnames
+ 0x00000886 0x27 objs/hikey/xa-class-mixer.o
+ .debug_pubnames
+ 0x000008ad 0xbe objs/hikey/xf-main.o
+ .debug_pubnames
+ 0x0000096b 0x23 objs/hikey/xa-pcm.o
+ .debug_pubnames
+ 0x0000098e 0x28 objs/hikey/xa-vorbis-decoder.o
+ .debug_pubnames
+ 0x000009b6 0x1f objs/hikey/xa-mixer.o
+ .debug_pubnames
+ 0x000009d5 0x1d /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .debug_pubnames
+ 0x000009f2 0x1d /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .debug_pubnames
+ 0x00000a0f 0x1c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .debug_pubnames
+ 0x00000a2b 0x1e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .debug_pubnames
+ 0x00000a49 0x1f /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .debug_pubnames
+ 0x00000a68 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .debug_pubnames
+ 0x00000a88 0x20 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .debug_pubnames
+ 0x00000aa8 0x23 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .debug_pubnames
+ 0x00000acb 0x23 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .debug_pubnames
+ 0x00000aee 0x1f /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .debug_pubnames
+ 0x00000b0d 0x46 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .debug_pubnames
+ 0x00000b53 0x2a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+
+.debug_info 0x00000000 0x18e3c
+ *(.debug_info)
+ .debug_info 0x00000000 0x516 objs/hikey/cpu_c.o
+ .debug_info 0x00000516 0x3c2 objs/hikey/dsp_debug.o
+ .debug_info 0x000008d8 0x208 objs/hikey/dsp_comm.o
+ .debug_info 0x00000ae0 0xbd5 objs/hikey/mutex.o
+ .debug_info 0x000016b5 0xf10 objs/hikey/rbtree.o
+ .debug_info 0x000025c5 0x16ac objs/hikey/xf-core.o
+ .debug_info 0x00003c71 0x1826 objs/hikey/xf-io.o
+ .debug_info 0x00005497 0xef6 objs/hikey/xf-mem.o
+ .debug_info 0x0000638d 0xdc1 objs/hikey/xf-msg.o
+ .debug_info 0x0000714e 0xdf5 objs/hikey/xf-sched.o
+ .debug_info 0x00007f43 0xdfd objs/hikey/xa-factory.o
+ .debug_info 0x00008d40 0x1353 objs/hikey/xf-shmem.o
+ .debug_info 0x0000a093 0x2d0 objs/hikey/tinyvprintf.o
+ .debug_info 0x0000a363 0xc73 objs/hikey/xf-isr.o
+ .debug_info 0x0000afd6 0xa47 objs/hikey/gdbstub.o
+ .debug_info 0x0000ba1d 0x1c9b objs/hikey/xa-class-base.o
+ .debug_info 0x0000d6b8 0x1fe2 objs/hikey/xa-class-audio-codec.o
+ .debug_info 0x0000f69a 0x21c9 objs/hikey/xa-class-mixer.o
+ .debug_info 0x00011863 0x1203 objs/hikey/xf-main.o
+ .debug_info 0x00012a66 0x1841 objs/hikey/xa-pcm.o
+ .debug_info 0x000142a7 0x1f6 objs/hikey/xa-vorbis-decoder.o
+ .debug_info 0x0001449d 0x12e9 objs/hikey/xa-mixer.o
+ .debug_info 0x00015786 0x95 objs/hikey/reset.o
+ .debug_info 0x0001581b 0x9a objs/hikey/int_vector.o
+ .debug_info 0x000158b5 0xa0 objs/hikey/arch_hifi330.o
+ .debug_info 0x00015955 0x9c objs/hikey/gdbstub-entry.o
+ .debug_info 0x000159f1 0xdf /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .debug_info 0x00015ad0 0xd9 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .debug_info 0x00015ba9 0xd9 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .debug_info 0x00015c82 0xd7 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .debug_info 0x00015d59 0xd7 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .debug_info 0x00015e30 0xd9 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .debug_info 0x00015f09 0xd9 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .debug_info 0x00015fe2 0xd9 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .debug_info 0x000160bb 0xda /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ .debug_info 0x00016195 0xe1 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ .debug_info 0x00016276 0x22e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .debug_info 0x000164a4 0x20a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .debug_info 0x000166ae 0x11c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .debug_info 0x000167ca 0x11c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .debug_info 0x000168e6 0x399 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .debug_info 0x00016c7f 0x204 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .debug_info 0x00016e83 0xf7 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .debug_info 0x00016f7a 0xf7 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .debug_info 0x00017071 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .debug_info 0x00017167 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .debug_info 0x0001725d 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ .debug_info 0x00017353 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ .debug_info 0x00017449 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ .debug_info 0x0001753f 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .debug_info 0x00017635 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .debug_info 0x0001772b 0x2b1 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .debug_info 0x000179dc 0x26e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .debug_info 0x00017c4a 0x278 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .debug_info 0x00017ec2 0x2c3 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .debug_info 0x00018185 0x28b /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .debug_info 0x00018410 0x3a7 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .debug_info 0x000187b7 0x3ae /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .debug_info 0x00018b65 0x2d7 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+
+.debug_abbrev 0x00000000 0x2ee0
+ *(.debug_abbrev)
+ .debug_abbrev 0x00000000 0xcd objs/hikey/cpu_c.o
+ .debug_abbrev 0x000000cd 0x156 objs/hikey/dsp_debug.o
+ .debug_abbrev 0x00000223 0xa2 objs/hikey/dsp_comm.o
+ .debug_abbrev 0x000002c5 0x140 objs/hikey/mutex.o
+ .debug_abbrev 0x00000405 0x201 objs/hikey/rbtree.o
+ .debug_abbrev 0x00000606 0x28c objs/hikey/xf-core.o
+ .debug_abbrev 0x00000892 0x255 objs/hikey/xf-io.o
+ .debug_abbrev 0x00000ae7 0x1ff objs/hikey/xf-mem.o
+ .debug_abbrev 0x00000ce6 0x1d3 objs/hikey/xf-msg.o
+ .debug_abbrev 0x00000eb9 0x1b2 objs/hikey/xf-sched.o
+ .debug_abbrev 0x0000106b 0x17d objs/hikey/xa-factory.o
+ .debug_abbrev 0x000011e8 0x1f8 objs/hikey/xf-shmem.o
+ .debug_abbrev 0x000013e0 0xf6 objs/hikey/tinyvprintf.o
+ .debug_abbrev 0x000014d6 0x184 objs/hikey/xf-isr.o
+ .debug_abbrev 0x0000165a 0x282 objs/hikey/gdbstub.o
+ .debug_abbrev 0x000018dc 0x269 objs/hikey/xa-class-base.o
+ .debug_abbrev 0x00001b45 0x20b objs/hikey/xa-class-audio-codec.o
+ .debug_abbrev 0x00001d50 0x20b objs/hikey/xa-class-mixer.o
+ .debug_abbrev 0x00001f5b 0x1b3 objs/hikey/xf-main.o
+ .debug_abbrev 0x0000210e 0x1aa objs/hikey/xa-pcm.o
+ .debug_abbrev 0x000022b8 0xa4 objs/hikey/xa-vorbis-decoder.o
+ .debug_abbrev 0x0000235c 0x1cc objs/hikey/xa-mixer.o
+ .debug_abbrev 0x00002528 0x12 objs/hikey/reset.o
+ .debug_abbrev 0x0000253a 0x12 objs/hikey/int_vector.o
+ .debug_abbrev 0x0000254c 0x14 objs/hikey/arch_hifi330.o
+ .debug_abbrev 0x00002560 0x12 objs/hikey/gdbstub-entry.o
+ .debug_abbrev 0x00002572 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .debug_abbrev 0x00002586 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .debug_abbrev 0x0000259a 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .debug_abbrev 0x000025ae 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .debug_abbrev 0x000025c2 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .debug_abbrev 0x000025d6 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .debug_abbrev 0x000025ea 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .debug_abbrev 0x000025fe 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .debug_abbrev 0x00002612 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ .debug_abbrev 0x00002626 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ .debug_abbrev 0x0000263a 0x8e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .debug_abbrev 0x000026c8 0x85 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .debug_abbrev 0x0000274d 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .debug_abbrev 0x00002761 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .debug_abbrev 0x00002775 0xcf /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .debug_abbrev 0x00002844 0x80 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .debug_abbrev 0x000028c4 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .debug_abbrev 0x000028d8 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .debug_abbrev 0x000028ec 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .debug_abbrev 0x00002900 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .debug_abbrev 0x00002914 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ .debug_abbrev 0x00002928 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ .debug_abbrev 0x0000293c 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ .debug_abbrev 0x00002950 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .debug_abbrev 0x00002964 0x14 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .debug_abbrev 0x00002978 0xbd /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .debug_abbrev 0x00002a35 0xa1 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .debug_abbrev 0x00002ad6 0xae /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .debug_abbrev 0x00002b84 0xa3 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .debug_abbrev 0x00002c27 0x82 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .debug_abbrev 0x00002ca9 0xbb /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .debug_abbrev 0x00002d64 0xd0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .debug_abbrev 0x00002e34 0xac /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+
+.debug_line 0x00000000 0xd0d8
+ *(.debug_line)
+ .debug_line 0x00000000 0x14b objs/hikey/cpu_c.o
+ .debug_line 0x0000014b 0x433 objs/hikey/dsp_debug.o
+ .debug_line 0x0000057e 0x105 objs/hikey/dsp_comm.o
+ .debug_line 0x00000683 0x1fc objs/hikey/mutex.o
+ .debug_line 0x0000087f 0x8f3 objs/hikey/rbtree.o
+ .debug_line 0x00001172 0x8a9 objs/hikey/xf-core.o
+ .debug_line 0x00001a1b 0xb08 objs/hikey/xf-io.o
+ .debug_line 0x00002523 0x4c3 objs/hikey/xf-mem.o
+ .debug_line 0x000029e6 0x2cf objs/hikey/xf-msg.o
+ .debug_line 0x00002cb5 0x32f objs/hikey/xf-sched.o
+ .debug_line 0x00002fe4 0x233 objs/hikey/xa-factory.o
+ .debug_line 0x00003217 0x70b objs/hikey/xf-shmem.o
+ .debug_line 0x00003922 0x268 objs/hikey/tinyvprintf.o
+ .debug_line 0x00003b8a 0x33e objs/hikey/xf-isr.o
+ .debug_line 0x00003ec8 0x9d7 objs/hikey/gdbstub.o
+ .debug_line 0x0000489f 0x92f objs/hikey/xa-class-base.o
+ .debug_line 0x000051ce 0xb85 objs/hikey/xa-class-audio-codec.o
+ .debug_line 0x00005d53 0xcd5 objs/hikey/xa-class-mixer.o
+ .debug_line 0x00006a28 0x2e7 objs/hikey/xf-main.o
+ .debug_line 0x00006d0f 0xbd0 objs/hikey/xa-pcm.o
+ .debug_line 0x000078df 0x145 objs/hikey/xa-vorbis-decoder.o
+ .debug_line 0x00007a24 0x94f objs/hikey/xa-mixer.o
+ .debug_line 0x00008373 0x36b objs/hikey/reset.o
+ .debug_line 0x000086de 0x7f7 objs/hikey/int_vector.o
+ .debug_line 0x00008ed5 0x463 objs/hikey/arch_hifi330.o
+ .debug_line 0x00009338 0x293 objs/hikey/gdbstub-entry.o
+ .debug_line 0x000095cb 0x337 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .debug_line 0x00009902 0x91 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .debug_line 0x00009993 0x91 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .debug_line 0x00009a24 0x8e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .debug_line 0x00009ab2 0x8f /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .debug_line 0x00009b41 0x8a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .debug_line 0x00009bcb 0x8a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .debug_line 0x00009c55 0xc5 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .debug_line 0x00009d1a 0xcc /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ .debug_line 0x00009de6 0x98 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ .debug_line 0x00009e7e 0x10f /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .debug_line 0x00009f8d 0xf6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .debug_line 0x0000a083 0x363 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .debug_line 0x0000a3e6 0x19a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .debug_line 0x0000a580 0x25a /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .debug_line 0x0000a7da 0x110 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .debug_line 0x0000a8ea 0xa9 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .debug_line 0x0000a993 0xa8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .debug_line 0x0000aa3b 0x6d1 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .debug_line 0x0000b10c 0x4c4 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .debug_line 0x0000b5d0 0x3bf /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ .debug_line 0x0000b98f 0x167 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ .debug_line 0x0000baf6 0x191 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ .debug_line 0x0000bc87 0x119 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .debug_line 0x0000bda0 0x1af /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .debug_line 0x0000bf4f 0x1e3 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .debug_line 0x0000c132 0x1c4 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .debug_line 0x0000c2f6 0x220 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .debug_line 0x0000c516 0x13d /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .debug_line 0x0000c653 0x137 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .debug_line 0x0000c78a 0x46e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .debug_line 0x0000cbf8 0x36e /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .debug_line 0x0000cf66 0x172 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+
+.debug_frame
+ *(.debug_frame)
+
+.debug_str
+ *(.debug_str)
+
+.debug_loc
+ *(.debug_loc)
+
+.debug_macinfo
+ *(.debug_macinfo)
+
+.debug_weaknames
+ *(.debug_weaknames)
+
+.debug_funcnames
+ *(.debug_funcnames)
+
+.debug_typenames
+ *(.debug_typenames)
+
+.debug_varnames
+ *(.debug_varnames)
+
+.xt.insn
+ *(.xt.insn)
+ *(.gnu.linkonce.x.*)
+
+.xt.prop 0x00000000 0xe8ec
+ *(.xt.prop)
+ .xt.prop 0x00000000 0x15c objs/hikey/cpu_c.o
+ 0x1ec (size before relaxing)
+ .xt.prop 0x0000015c 0x570 objs/hikey/dsp_debug.o
+ 0x594 (size before relaxing)
+ .xt.prop 0x000006cc 0x84 objs/hikey/dsp_comm.o
+ .xt.prop 0x00000750 0x3c objs/hikey/mutex.o
+ 0x48 (size before relaxing)
+ .xt.prop 0x0000078c 0x6e4 objs/hikey/rbtree.o
+ 0x6f0 (size before relaxing)
+ .xt.prop 0x00000e70 0x624 objs/hikey/xf-core.o
+ 0x6e4 (size before relaxing)
+ .xt.prop 0x00001494 0x7b0 objs/hikey/xf-io.o
+ 0x894 (size before relaxing)
+ .xt.prop 0x00001c44 0x354 objs/hikey/xf-mem.o
+ 0x390 (size before relaxing)
+ .xt.prop 0x00001f98 0x12c objs/hikey/xf-msg.o
+ 0x15c (size before relaxing)
+ .xt.prop 0x000020c4 0x150 objs/hikey/xf-sched.o
+ 0x18c (size before relaxing)
+ .xt.prop 0x00002214 0x9c objs/hikey/xa-factory.o
+ 0xb4 (size before relaxing)
+ .xt.prop 0x000022b0 0x36c objs/hikey/xf-shmem.o
+ 0x3a8 (size before relaxing)
+ .xt.prop 0x0000261c 0x498 objs/hikey/tinyvprintf.o
+ 0x4a4 (size before relaxing)
+ .xt.prop 0x00002ab4 0xe4 objs/hikey/xf-isr.o
+ 0x108 (size before relaxing)
+ .xt.prop 0x00002b98 0x9c0 objs/hikey/gdbstub.o
+ 0xa8c (size before relaxing)
+ .xt.prop 0x00003558 0xa80 objs/hikey/xa-class-base.o
+ 0xb28 (size before relaxing)
+ .xt.prop 0x00003fd8 0xbb8 objs/hikey/xa-class-audio-codec.o
+ 0xc84 (size before relaxing)
+ .xt.prop 0x00004b90 0xcf0 objs/hikey/xa-class-mixer.o
+ 0xdd4 (size before relaxing)
+ .xt.prop 0x00005880 0xe4 objs/hikey/xf-main.o
+ 0x18c (size before relaxing)
+ .xt.prop 0x00005964 0xdec objs/hikey/xa-pcm.o
+ 0xef4 (size before relaxing)
+ .xt.prop 0x00006750 0x48 objs/hikey/xa-vorbis-decoder.o
+ 0x60 (size before relaxing)
+ .xt.prop 0x00006798 0xaa4 objs/hikey/xa-mixer.o
+ 0xb7c (size before relaxing)
+ .xt.prop 0x0000723c 0x6c objs/hikey/reset.o
+ .xt.prop 0x000072a8 0x300 objs/hikey/int_vector.o
+ 0x390 (size before relaxing)
+ .xt.prop 0x000075a8 0x150 objs/hikey/arch_hifi330.o
+ 0x15c (size before relaxing)
+ .xt.prop 0x000076f8 0xf0 objs/hikey/gdbstub-entry.o
+ .xt.prop 0x000077e8 0x5154 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ 0x51d8 (size before relaxing)
+ .xt.prop 0x0000c93c 0xf0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .xt.prop 0x0000ca2c 0x24 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .xt.prop 0x0000ca50 0x24 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .xt.prop 0x0000ca74 0x18 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .xt.prop 0x0000ca8c 0x18 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .xt.prop 0x0000caa4 0x18 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .xt.prop 0x0000cabc 0x18 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .xt.prop 0x0000cad4 0x24 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .xt.prop 0x0000caf8 0x18 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ 0x24 (size before relaxing)
+ .xt.prop 0x0000cb10 0x24 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ .xt.prop 0x0000cb34 0x90 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .xt.prop 0x0000cbc4 0x3c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .xt.prop 0x0000cc00 0x144 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .xt.prop 0x0000cd44 0xc0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .xt.prop 0x0000ce04 0x3e4 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ 0x3f0 (size before relaxing)
+ .xt.prop 0x0000d1e8 0x9c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ 0xa8 (size before relaxing)
+ .xt.prop 0x0000d284 0x18 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .xt.prop 0x0000d29c 0x18 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .xt.prop 0x0000d2b4 0x444 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .xt.prop 0x0000d6f8 0x264 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .xt.prop 0x0000d95c 0x27c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ 0x288 (size before relaxing)
+ .xt.prop 0x0000dbd8 0x90 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ 0x9c (size before relaxing)
+ .xt.prop 0x0000dc68 0xc0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ 0xcc (size before relaxing)
+ .xt.prop 0x0000dd28 0x54 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .xt.prop 0x0000dd7c 0x9c /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .xt.prop 0x0000de18 0x150 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .xt.prop 0x0000df68 0x120 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .xt.prop 0x0000e088 0x120 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .xt.prop 0x0000e1a8 0xa8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ 0xb4 (size before relaxing)
+ .xt.prop 0x0000e250 0x78 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ 0x84 (size before relaxing)
+ .xt.prop 0x0000e2c8 0x1ec /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .xt.prop 0x0000e4b4 0x3a8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .xt.prop 0x0000e85c 0x90 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ 0x9c (size before relaxing)
+ *(.xt.prop.*)
+ *(.gnu.linkonce.prop.*)
+
+.xt.lit 0x00000000 0x518
+ *(.xt.lit)
+ .xt.lit 0x00000000 0x18 objs/hikey/cpu_c.o
+ 0x40 (size before relaxing)
+ .xt.lit 0x00000018 0x20 objs/hikey/dsp_debug.o
+ .xt.lit 0x00000038 0x8 objs/hikey/mutex.o
+ .xt.lit 0x00000040 0x8 objs/hikey/rbtree.o
+ .xt.lit 0x00000048 0x60 objs/hikey/xf-core.o
+ 0x68 (size before relaxing)
+ .xt.lit 0x000000a8 0x70 objs/hikey/xf-io.o
+ 0x98 (size before relaxing)
+ .xt.lit 0x00000118 0x18 objs/hikey/xf-mem.o
+ 0x28 (size before relaxing)
+ .xt.lit 0x00000130 0x20 objs/hikey/xf-msg.o
+ .xt.lit 0x00000150 0x18 objs/hikey/xf-sched.o
+ 0x28 (size before relaxing)
+ .xt.lit 0x00000168 0x10 objs/hikey/xa-factory.o
+ .xt.lit 0x00000178 0x20 objs/hikey/xf-shmem.o
+ 0x30 (size before relaxing)
+ .xt.lit 0x00000198 0x8 objs/hikey/tinyvprintf.o
+ .xt.lit 0x000001a0 0x18 objs/hikey/xf-isr.o
+ .xt.lit 0x000001b8 0x60 objs/hikey/gdbstub.o
+ 0x70 (size before relaxing)
+ .xt.lit 0x00000218 0x58 objs/hikey/xa-class-base.o
+ .xt.lit 0x00000270 0x70 objs/hikey/xa-class-audio-codec.o
+ 0x78 (size before relaxing)
+ .xt.lit 0x000002e0 0x78 objs/hikey/xa-class-mixer.o
+ 0x80 (size before relaxing)
+ .xt.lit 0x00000358 0x18 objs/hikey/xf-main.o
+ .xt.lit 0x00000370 0xa8 objs/hikey/xa-pcm.o
+ .xt.lit 0x00000418 0x8 objs/hikey/xa-vorbis-decoder.o
+ .xt.lit 0x00000420 0x80 objs/hikey/xa-mixer.o
+ .xt.lit 0x000004a0 0x8 objs/hikey/reset.o
+ .xt.lit 0x000004a8 0x10 objs/hikey/int_vector.o
+ 0x40 (size before relaxing)
+ .xt.lit 0x000004b8 0x8 objs/hikey/arch_hifi330.o
+ .xt.lit 0x000004c0 0x8 objs/hikey/gdbstub-entry.o
+ .xt.lit 0x000004c8 0x18 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ 0x78 (size before relaxing)
+ .xt.lit 0x000004e0 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .xt.lit 0x000004e8 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .xt.lit 0x000004f0 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ 0x8 (size before relaxing)
+ .xt.lit 0x000004f0 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .xt.lit 0x000004f8 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ 0x8 (size before relaxing)
+ .xt.lit 0x000004f8 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .xt.lit 0x00000500 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .xt.lit 0x00000508 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ 0x8 (size before relaxing)
+ .xt.lit 0x00000508 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ 0x8 (size before relaxing)
+ .xt.lit 0x00000508 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ 0x8 (size before relaxing)
+ .xt.lit 0x00000508 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ 0x8 (size before relaxing)
+ .xt.lit 0x00000508 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ 0x8 (size before relaxing)
+ .xt.lit 0x00000508 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .xt.lit 0x00000510 0x8 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .xt.lit 0x00000518 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ 0x8 (size before relaxing)
+ *(.xt.lit.*)
+ *(.gnu.linkonce.p.*)
+
+.comment 0x00000000 0x1351
+ .comment 0x00000000 0x59 objs/hikey/cpu_c.o
+ 0x5a (size before relaxing)
+ .comment 0x00000059 0x5d objs/hikey/dsp_debug.o
+ 0x5e (size before relaxing)
+ .comment 0x000000b6 0x5c objs/hikey/dsp_comm.o
+ 0x5d (size before relaxing)
+ .comment 0x00000112 0x50 objs/hikey/mutex.o
+ 0x51 (size before relaxing)
+ .comment 0x00000162 0x51 objs/hikey/rbtree.o
+ 0x52 (size before relaxing)
+ .comment 0x000001b3 0x4d objs/hikey/xf-core.o
+ 0x4e (size before relaxing)
+ .comment 0x00000200 0x4b objs/hikey/xf-io.o
+ 0x4c (size before relaxing)
+ .comment 0x0000024b 0x4c objs/hikey/xf-mem.o
+ 0x4d (size before relaxing)
+ .comment 0x00000297 0x4c objs/hikey/xf-msg.o
+ 0x4d (size before relaxing)
+ .comment 0x000002e3 0x4e objs/hikey/xf-sched.o
+ 0x4f (size before relaxing)
+ .comment 0x00000331 0x4f objs/hikey/xa-factory.o
+ 0x50 (size before relaxing)
+ .comment 0x00000380 0x4e objs/hikey/xf-shmem.o
+ 0x4f (size before relaxing)
+ .comment 0x000003ce 0x56 objs/hikey/tinyvprintf.o
+ 0x57 (size before relaxing)
+ .comment 0x00000424 0x4c objs/hikey/xf-isr.o
+ 0x4d (size before relaxing)
+ .comment 0x00000470 0x5a objs/hikey/gdbstub.o
+ 0x5b (size before relaxing)
+ .comment 0x000004ca 0x54 objs/hikey/xa-class-base.o
+ 0x55 (size before relaxing)
+ .comment 0x0000051e 0x5b objs/hikey/xa-class-audio-codec.o
+ 0x5c (size before relaxing)
+ .comment 0x00000579 0x55 objs/hikey/xa-class-mixer.o
+ 0x56 (size before relaxing)
+ .comment 0x000005ce 0x55 objs/hikey/xf-main.o
+ 0x56 (size before relaxing)
+ .comment 0x00000623 0x60 objs/hikey/xa-pcm.o
+ 0x61 (size before relaxing)
+ .comment 0x00000683 0x6d objs/hikey/xa-vorbis-decoder.o
+ 0x6e (size before relaxing)
+ .comment 0x000006f0 0x5f objs/hikey/xa-mixer.o
+ 0x60 (size before relaxing)
+ .comment 0x0000074f 0x573 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ 0x584 (size before relaxing)
+ .comment 0x00000cc2 0xa1 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ 0xa2 (size before relaxing)
+ .comment 0x00000d63 0xa1 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ 0xa2 (size before relaxing)
+ .comment 0x00000e04 0xa0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ 0xa1 (size before relaxing)
+ .comment 0x00000ea4 0xa2 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ 0xa3 (size before relaxing)
+ .comment 0x00000f46 0xa1 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ 0xa2 (size before relaxing)
+ .comment 0x00000000 0xa2 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .comment 0x00000000 0xa2 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .comment 0x00000fe7 0xa5 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ 0xa6 (size before relaxing)
+ .comment 0x0000108c 0xa5 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ 0xa6 (size before relaxing)
+ .comment 0x00001131 0xb5 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ 0xb6 (size before relaxing)
+ .comment 0x000011e6 0xb5 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ 0xb6 (size before relaxing)
+ .comment 0x0000129b 0xb6 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+ 0xb7 (size before relaxing)
+
+.xtensa.info 0x00000000 0x1d8
+ .xtensa.info 0x00000000 0x1d8 objs/hikey/cpu_c.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/dsp_debug.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/dsp_comm.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/mutex.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/rbtree.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-core.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-io.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-mem.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-msg.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-sched.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xa-factory.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-shmem.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/tinyvprintf.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-isr.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/gdbstub.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xa-class-base.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xa-class-audio-codec.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xa-class-mixer.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xf-main.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xa-pcm.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xa-vorbis-decoder.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/xa-mixer.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/reset.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/int_vector.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/arch_hifi330.o
+ .xtensa.info 0x00000000 0x0 objs/hikey/gdbstub-entry.o
+ .xtensa.info 0x00000000 0x0 ../plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a(xa_vorbis_dec.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(windowspill_asm.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_invalidate.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--dcache_region_writeback.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid0.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--hw_configid1.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_major.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(cache_asm--release_minor.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--get_intenable.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(int_asm--set_intenable.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--restore_extra_nw.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhal.a(state_asm--save_extra_nw.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-on.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(ints-off.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/arch/lib//libhandlers-board.a(interrupt-table.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memchr.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcmp.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memcpy.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-memset.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-qsort.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib//libc.a(lib_a-strncmp.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divsi3.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_modsi3.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_addsubdf3.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_muldf3.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_cmpdf2.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfsi.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_fixunsdfdi.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatsidf.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_floatdidf.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_divdi3.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_udivdi3.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(_umoddi3.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memcpy.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(vec_memset.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_div_df.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_df.o)
+ .xtensa.info 0x00000000 0x0 /scratch/speacial_projects/sof-sdk/xtensa_tools/tools/XtDevTools/install/builds/RG-2017.5-linux/hifi3_hikey960/xtensa-elf/lib/xcc//libgcc.a(softfloat_cmn_div.o)
+
+.debug.xt.callgraph
+ *(.debug.xt.callgraph .debug.xt.callgraph.* .gnu.linkonce.xt.callgraph.*)
+OUTPUT(objs/hikey/xa_hikey.o elf32-xtensa-le)
+
+.debug_ranges 0x00000000 0x98
+ .debug_ranges 0x00000000 0x20 objs/hikey/reset.o
+ .debug_ranges 0x00000020 0x58 objs/hikey/int_vector.o
+ .debug_ranges 0x00000078 0x20 objs/hikey/gdbstub-entry.o
diff --git a/hifi/xaf/hifi-dpf/build_hikey/tools/elftobin.sh b/hifi/xaf/hifi-dpf/build_hikey/tools/elftobin.sh
new file mode 100755
index 00000000..cebe6bf4
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/tools/elftobin.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+if [ $# != 2 ]
+then
+echo "elftobin.sh <input_elf_file> <output_img_file>"
+exit
+fi
+
+if [ $XTENSA_CORE == "" ]
+then
+echo "XTENSA_CORE is not set"
+exit
+fi
+
+if [ $XTENSA_SYSTEM == "" ]
+then
+echo "XTENSA_SYSTEM is not set"
+exit
+fi
+
+export INPUT_ELF_FILE=$1
+export OUTPUT_BIN_FILE=__hikey_temp.bin
+export OUTPUT_IMG_FILE=$2
+export OP_DIR=./
+
+xt-objdump -h $INPUT_ELF_FILE > __elfdump
+less __elfdump | sed -n '/ALLOC/{g;1!p;};h' > __header
+less __header | awk '{print $2 " " $3 " " $4}' > __proc
+
+sections=`less __proc | cut -f1 -d' ' | tr '\n' ',' | sed 's/\,$//g'`
+SECTION_NUM=`awk 'END {print NR}' __proc`
+echo "Total number of sections are $SECTION_NUM"
+#sections=(".dram0.data" ".ResetVector.text" ".Reset.literal" ".WindowVectors.text" ".Level2InterruptVector.literal" ".Level2InterruptVector.text" ".Level3InterruptVector.literal" ".Level3InterruptVector.text" ".DebugExceptionVector.literal" ".DebugExceptionVector.text" ".NMIExceptionVector.literal" ".NMIExceptionVector.text" ".KernelExceptionVector.literal" ".KernelExceptionVector.text" ".UserExceptionVector.literal" ".UserExceptionVector.text" ".DoubleExceptionVector.literal" ".DoubleExceptionVector.text" ".Reset.text" ".iram0.text" ".rodata" ".text" ".data" ".bss")
+#dst_addr=("0xe8058000" "0xe8080000" "0xe8080300" "0xe8080400" "0xe8080578" "0xe8080580" "0xe80805b8" "0xe80805c0" "0xe8080638" "0xe8080640" "0xe8080678" "0xe80806c0" "0xe80806f8" "0xe8080700" "0xe8080738" "0xe8080740" "0xe8080778" "0xe80807c0" "0xe8080800" "0xe8080a44" "0xc0000000" "0xc0000cc8" "0xc00025c0" "0xc0002a20")
+
+ID_Sec=("0x01010000" "0x01000001" "0x01000002" "0x01000003" "0x01000004" "0x01000005" "0x01000006" "0x01000007" "0x01000008" "0x01000009" "0x0100000A" "0x0100000B" "0x0100000C" "0x0100000D" "0x0100000E" "0x0100000F" "0x01000010" "0x01000011" "0x01000012" "0x01000013" "0x00000014" "0x00000015" "0x00010016" "0x00020017")
+
+head -c "4" /dev/zero > __zero.bin
+
+i=0
+for j in `seq 1 $SECTION_NUM`
+do
+ VAR=`less __proc | awk 'FNR == "'"$j"'" {print $1}'`
+ VARBIN=`echo "$VAR" | sed 's/^./__/' | sed "s/\..*//" | sed 's/$/.bin/' `
+ #echo "section: $VAR $VARBIN"
+ xt-objcopy $INPUT_ELF_FILE -O binary --only-section $VAR $VARBIN
+
+ size_sec[${i}]=$(cat $VARBIN | wc -c)
+ #echo "size : ${size_sec[${i}]}"
+ mod0=`expr ${size_sec[${i}]} % 4`
+ nbytes=`expr 4 - $mod0`
+ if [ "$nbytes" -ne "4" ] ; then
+ tail -c $nbytes __zero.bin >> $VARBIN
+ size_sec[$i]=`expr ${size_sec[${i}]} + $nbytes`
+ fi
+ cat $VARBIN >> $OUTPUT_BIN_FILE
+ i=`expr $i + 1`;
+done
+cd $OP_DIR
+
+tmp1=$(cat $OUTPUT_BIN_FILE | wc -c)
+total_sections=$SECTION_NUM
+main_header_size=32
+section_header_size=16
+size_total_img=`expr $main_header_size + $tmp1 + $total_sections \* $section_header_size`
+current_date_time=`date "+%Y/%m/%d %H:%M:%S"`
+echo "HIF:$current_date_time" > $OUTPUT_IMG_FILE
+
+printf "0: %.8x" $size_total_img | sed -e 's/0\: \(..\)\(..\)\(..\)\(..\)/0\: \4\3\2\1/' | xxd -r -g0 >> $OUTPUT_IMG_FILE
+printf "0: %.8x" $total_sections | sed -e 's/0\: \(..\)\(..\)\(..\)\(..\)/0\: \4\3\2\1/' | xxd -r -g0 >> $OUTPUT_IMG_FILE
+
+cnt1=`expr $main_header_size + $total_sections \* $section_header_size`
+i=0
+for j in `seq 1 $SECTION_NUM`
+do
+ DST_ADDR=`less __proc | awk 'FNR == "'"$j"'" {print $3}'`
+ printf "0: %.8x" ${ID_Sec[${i}]} | sed -e 's/0\: \(..\)\(..\)\(..\)\(..\)/0\: \4\3\2\1/' | xxd -r -g0 >> $OUTPUT_IMG_FILE
+ printf "0: %.8x" $cnt1 | sed -e 's/0\: \(..\)\(..\)\(..\)\(..\)/0\: \4\3\2\1/' | xxd -r -g0 >> $OUTPUT_IMG_FILE
+ printf "0: %.8x" 0x$DST_ADDR | sed -e 's/0\: \(..\)\(..\)\(..\)\(..\)/0\: \4\3\2\1/' | xxd -r -g0 >> $OUTPUT_IMG_FILE
+ printf "0: %.8x" ${size_sec[${i}]} | sed -e 's/0\: \(..\)\(..\)\(..\)\(..\)/0\: \4\3\2\1/' | xxd -r -g0 >> $OUTPUT_IMG_FILE
+ cnt_prev=$cnt1
+ cnt1=`expr ${size_sec[${i}]} + $cnt_prev`
+ i=`expr $i + 1`
+done
+
+cat $OUTPUT_BIN_FILE >> $OUTPUT_IMG_FILE
+rm $OUTPUT_BIN_FILE
+rm __*.bin
+rm __proc
+rm __elfdump
+rm __header
+
+echo "elftobin successful!"
+
diff --git a/hifi/xaf/hifi-dpf/build_hikey/xa_hikey.img b/hifi/xaf/hifi-dpf/build_hikey/xa_hikey.img
new file mode 100644
index 00000000..4c166528
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/build_hikey/xa_hikey.img
Binary files differ
diff --git a/hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub-entry.S b/hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub-entry.S
new file mode 100644
index 00000000..50a33a93
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub-entry.S
@@ -0,0 +1,198 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+#include "xtensa-defs.h"
+
+.macro SAVE_ reg, loc
+ rsr a1, \reg
+ s32i a1, a3, \loc * 4
+.endm
+.macro SAVE reg
+ SAVE_ \reg, \reg
+.endm
+
+.macro LOAD_ reg, loc
+ l32i a1, a3, \loc * 4
+ wsr a1, \reg
+.endm
+.macro LOAD reg
+ LOAD_ \reg, \reg
+.endm
+
+ .section ".DebugExceptionVector.text", "ax"
+ .global DebugExceptionVector
+
+DebugExceptionVector:
+ j 1f
+ .align 4
+ .literal_position
+1:
+ xsr a2, DEBUG_EXCSAVE
+ jx a2
+
+ .text
+ .global DebugExceptionEntry
+ .align 4
+
+DebugExceptionEntry:
+ j 1f
+ .align 4
+ .literal_position
+1:
+ movi a2, aregs
+ s32i a0, a2, 0
+ s32i a1, a2, 4
+ rsr a1, DEBUG_EXCSAVE
+ s32i a1, a2, 8
+ s32i a3, a2, 12
+
+ movi a3, sregs
+ SAVE LBEG
+ SAVE LEND
+ SAVE LCOUNT
+ SAVE SAR
+ SAVE WINDOWBASE
+ SAVE WINDOWSTART
+
+ rsr a1, DEBUG_PC
+ movi a2, initial_breakpoint
+ bne a1, a2, 1f
+ addi a1, a1, 3
+1:
+ s32i a1, a3, DEBUG_PC * 4
+
+ SAVE EXCSAVE_1
+ SAVE_ DEBUG_PS, PS
+ SAVE EXCCAUSE
+ SAVE DEBUGCAUSE
+ SAVE EXCVADDR
+
+ movi a1, XCHAL_NUM_AREGS / 4 - 1
+ movi a2, aregs
+1:
+ s32i a4, a2, 16
+ s32i a5, a2, 20
+ s32i a6, a2, 24
+ s32i a7, a2, 28
+
+ addi a6, a2, 16
+ addi a5, a1, -1
+ rotw 1
+ bnez a1, 1b
+
+ movi a1, 1
+ wsr a1, windowstart
+ movi a0, 0
+ wsr a0, windowbase
+ rsync
+
+ movi a0, 0
+ movi a1, stack + STACK_SIZE - 20
+ rsr a2, ps
+ addi a2, a2, -PS_EXCM_MASK
+ wsr a2, ps
+ rsync
+
+ movi a4, handle_exception
+ callx4 a4
+
+DebugExceptionExit:
+ movi a2, DebugExceptionEntry
+ wsr a2, DEBUG_EXCSAVE
+
+ rsr a2, ps
+ addi a2, a2, PS_EXCM_MASK
+ wsr a2, ps
+ rsync
+
+ movi a3, sregs
+ LOAD LBEG
+ LOAD LEND
+ LOAD LCOUNT
+ /* TODO: handle unlikely return-to-lend case */
+ LOAD SAR
+ LOAD WINDOWBASE
+ rsync
+ movi a3, sregs
+ LOAD WINDOWSTART
+ LOAD DEBUG_PC
+ LOAD EXCSAVE_1
+ LOAD_ DEBUG_PS, PS
+ LOAD EXCCAUSE
+ LOAD EXCVADDR
+
+ movi a6, aregs
+ movi a5, XCHAL_NUM_AREGS / 4 - 2
+1:
+ l32i a0, a6, 0
+ l32i a1, a6, 4
+ l32i a2, a6, 8
+ l32i a3, a6, 12
+
+ beqz a5, 2f
+ addi a10, a6, 16
+ addi a9, a5, -1
+ rotw 1
+ j 1b
+2:
+ l32i a4, a6, 16
+ l32i a5, a6, 20
+ l32i a7, a6, 28
+ l32i a6, a6, 24
+ rotw 2
+
+ rfi XCHAL_DEBUGLEVEL
+
+
+#ifdef LIBC_LEVEL1_HANDLER
+ .global fault_handler
+ .align 4
+fault_handler:
+ rsr a2, epc1
+ addi a2, a2, 3
+ wsr a2, epc1
+ rsync
+ movi a2, mem_err
+ s32i a2, a2, 0
+
+ l32i a2, a1, 16
+ l32i a3, a1, 20
+ addi a1, a1, 256
+ rfe
+#endif
+
+
+ .global init_debug_entry
+ .align 4
+init_debug_entry:
+ entry a1, 16
+ movi a2, DebugExceptionEntry
+ wsr a2, DEBUG_EXCSAVE
+ isync
+ retw
+
+ .global breakpoint
+ .align 4
+breakpoint:
+ entry a1, 16
+initial_breakpoint:
+ _break 0, 0
+ retw
diff --git a/hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub.c b/hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub.c
new file mode 100644
index 00000000..e125b94c
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/util/gdbstub/gdbstub.c
@@ -0,0 +1,756 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/****************************************************************************
+
+ THIS SOFTWARE IS NOT COPYRIGHTED
+
+ HP offers the following for use in the public domain. HP makes no
+ warranty with regard to the software or it's performance and the
+ user accepts the software "AS IS" with all faults.
+
+ HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
+ TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+****************************************************************************/
+
+/****************************************************************************
+ * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
+ *
+ * Module name: remcom.c $
+ * Revision: 1.34 $
+ * Date: 91/03/09 12:29:49 $
+ * Contributor: Lake Stevens Instrument Division$
+ *
+ * Description: low level support for gdb debugger. $
+ *
+ * Considerations: only works on target hardware $
+ *
+ * Written by: Glenn Engel $
+ * ModuleState: Experimental $
+ *
+ * NOTES: See Below $
+ *
+ * Modified for SPARC by Stu Grossman, Cygnus Support.
+ *
+ * This code has been extensively tested on the Fujitsu SPARClite demo board.
+ *
+ * To enable debugger support, two things need to happen. One, a
+ * call to set_debug_traps() is necessary in order to allow any breakpoints
+ * or error conditions to be properly intercepted and reported to gdb.
+ * Two, a breakpoint needs to be generated to begin communication. This
+ * is most easily accomplished by a call to breakpoint(). Breakpoint()
+ * simulates a breakpoint by executing a trap #1.
+ *
+ *************
+ *
+ * The following gdb commands are supported:
+ *
+ * command function Return value
+ *
+ * g return the value of the CPU registers hex data or ENN
+ * G set the value of the CPU registers OK or ENN
+ *
+ * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
+ * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
+ *
+ * c Resume at current address SNN ( signal NN)
+ * cAA..AA Continue at address AA..AA SNN
+ *
+ * s Step one instruction SNN
+ * sAA..AA Step one instruction from AA..AA SNN
+ *
+ * k kill
+ *
+ * ? What was the last sigval ? SNN (signal NN)
+ *
+ * All commands and responses are sent with a packet which includes a
+ * checksum. A packet consists of
+ *
+ * $<packet info>#<checksum>.
+ *
+ * where
+ * <packet info> :: <characters representing the command or response>
+ * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
+ *
+ * When a packet is received, it is first acknowledged with either '+' or '-'.
+ * '+' indicates a successful transfer. '-' indicates a failed transfer.
+ *
+ * Example:
+ *
+ * Host: Reply:
+ * $m0,10#2a +$00010203040506070809101112131415#42
+ *
+ ****************************************************************************/
+#ifdef XAF_ENABLE_NON_HIKEY
+#include "xf.h"
+#else
+#include <string.h>
+#include <signal.h>
+#include <stdint.h>
+#include <xtensa/xtruntime.h>
+#endif
+#include "xtensa-defs.h"
+
+/*******************************************************************************
+ * Ring-buffer definition
+ ******************************************************************************/
+
+#define RING_SIZE 256
+
+struct ring {
+ unsigned char head;
+ unsigned char fill1[63];
+ unsigned char tail;
+ unsigned char fill2[63];
+ unsigned char data[RING_SIZE];
+};
+
+#define GDB_INVALIDATE(p) \
+ xthal_dcache_region_invalidate((void *)(p), sizeof(*p))
+
+#define GDB_FLUSH(p) \
+ xthal_dcache_region_writeback((void *)(p), sizeof(*p))
+
+static inline unsigned int ring_next_head(const volatile struct ring *ring)
+{
+ return (ring->head + 1) & (RING_SIZE - 1);
+}
+
+static inline unsigned int ring_next_tail(const volatile struct ring *ring)
+{
+ return (ring->tail + 1) & (RING_SIZE - 1);
+}
+
+static inline int ring_have_space(const volatile struct ring *ring)
+{
+ /* ...invalidate tail pointer of tx-ring (updated by host) */
+ GDB_INVALIDATE(&ring->tail);
+
+ return ring_next_head(ring) != ring->tail;
+}
+
+static inline int ring_have_data(const volatile struct ring *ring)
+{
+ /* ...invalidate head pointer of rx-ring (updated by host) */
+ GDB_INVALIDATE(&ring->head);
+
+ return ring->head != ring->tail;
+}
+#ifdef XAF_ENABLE_NON_HIKEY
+#define DEBUG_RX_BASE XF_CFG_GDB_RING_RX
+#define DEBUG_TX_BASE XF_CFG_GDB_RING_TX
+#else
+//#define DEBUG_RX_BASE (0x72000000)
+//#define DEBUG_TX_BASE (0x72000800)
+#define DEBUG_RX_BASE (0x6FFFF000)
+#define DEBUG_TX_BASE (0x6FFFF800)
+#endif
+
+volatile struct ring * const rx = (void *)DEBUG_RX_BASE;
+volatile struct ring * const tx = (void *)DEBUG_TX_BASE;
+
+void init_debug_comm(void)
+{
+ rx->head = rx->tail = 0;
+ tx->head = tx->tail = 0;
+ GDB_FLUSH(&rx->head);
+ GDB_FLUSH(&rx->tail);
+ GDB_FLUSH(&tx->head);
+ GDB_FLUSH(&tx->tail);
+}
+
+/* ...functions defined in asm code */
+extern void breakpoint(void);
+extern void init_debug_entry(void);
+
+void poll_debug_ring(void)
+{
+ if (ring_have_data(rx)) {
+ breakpoint();
+ }
+}
+
+static void putDebugChar(char c)
+{
+ while (!ring_have_space(tx))
+ ;
+
+ tx->data[tx->head] = c;
+
+ /* ...flush data buffer to main memory */
+ GDB_FLUSH(&tx->data[tx->head]);
+
+ tx->head = ring_next_head(tx);
+
+ /* ...flush head pointer to main memory */
+ GDB_FLUSH(&tx->head);
+}
+
+static int getDebugChar(void)
+{
+ int v;
+ while (!ring_have_data(rx))
+ ;
+
+ /* ...inavlidate data buffer */
+ GDB_INVALIDATE(&rx->data[rx->tail]);
+
+ v = rx->data[rx->tail];
+ rx->tail = ring_next_tail(rx);
+
+ /* ...update tail index */
+ GDB_FLUSH(&rx->tail);
+
+ return v;
+}
+
+/************************************************************************/
+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
+/* at least NUMREGBYTES*2 are needed for register packets */
+#define BUFMAX 256
+
+#ifdef USE_GDBSTUB
+#define bulk_data __attribute__((section (".ddr0.data")))
+#else
+#define bulk_data
+#endif
+uint32_t stack[STACK_SIZE / sizeof(uint32_t)] bulk_data;
+static uint8_t sregs_read[32] bulk_data;
+static uint8_t sregs_mod[32] bulk_data;
+static uint8_t sregs_late[32] bulk_data;
+uint32_t sregs[256] bulk_data;
+uint32_t aregs[XCHAL_NUM_AREGS] bulk_data;
+static uint8_t remcomInBuffer[BUFMAX] bulk_data;
+static uint8_t remcomOutBuffer[BUFMAX] bulk_data;
+
+static const char hexchars[]="0123456789abcdef";
+
+/* Convert ch from a hex digit to an int */
+
+static int hex(unsigned char ch)
+{
+ if (ch >= 'a' && ch <= 'f')
+ return ch-'a'+10;
+ if (ch >= '0' && ch <= '9')
+ return ch-'0';
+ if (ch >= 'A' && ch <= 'F')
+ return ch-'A'+10;
+ return -1;
+}
+
+/* scan for the sequence $<data>#<checksum> */
+
+unsigned char *getpacket(void)
+{
+ unsigned char *buffer = &remcomInBuffer[0];
+ unsigned char checksum;
+ unsigned char xmitcsum;
+ int count;
+ char ch;
+
+ while (1) {
+ /* wait around for the start character, ignore all other characters */
+ while ((ch = getDebugChar ()) != '$')
+ ;
+
+retry:
+ checksum = 0;
+ xmitcsum = -1;
+ count = 0;
+
+ /* now, read until a # or end of buffer is found */
+ while (count < BUFMAX - 1) {
+ ch = getDebugChar ();
+ if (ch == '$')
+ goto retry;
+ if (ch == '#')
+ break;
+ checksum = checksum + ch;
+ buffer[count] = ch;
+ count = count + 1;
+ }
+ buffer[count] = 0;
+
+ if (ch == '#') {
+ ch = getDebugChar ();
+ xmitcsum = hex (ch) << 4;
+ ch = getDebugChar ();
+ xmitcsum += hex (ch);
+
+ if (checksum != xmitcsum) {
+ putDebugChar ('-'); /* failed checksum */
+ } else {
+ putDebugChar ('+'); /* successful transfer */
+
+ /* if a sequence char is present, reply the sequence ID */
+ if (buffer[2] == ':') {
+ putDebugChar (buffer[0]);
+ putDebugChar (buffer[1]);
+
+ return &buffer[3];
+ }
+
+ return &buffer[0];
+ }
+ }
+ }
+}
+
+/* send the packet in buffer. */
+
+static void putpacket(uint8_t *buffer)
+{
+ unsigned char checksum;
+ int count;
+ unsigned char ch;
+
+ /* $<packet info>#<checksum>. */
+ do {
+ putDebugChar('$');
+ checksum = 0;
+ count = 0;
+
+ while ((ch = buffer[count]) != 0) {
+ putDebugChar(ch);
+ checksum += ch;
+ count += 1;
+ }
+
+ putDebugChar('#');
+ putDebugChar(hexchars[checksum >> 4]);
+ putDebugChar(hexchars[checksum & 0xf]);
+
+ } while (getDebugChar() != '+');
+}
+
+/* Indicate to caller of mem2hex or hex2mem that there has been an
+ error. */
+volatile int mem_err = 0;
+
+/* Convert the memory pointed to by mem into hex, placing result in buf.
+ * Return a pointer to the last char put in buf (null), in case of mem fault,
+ * return 0.
+ */
+
+static uint8_t * mem2hex(const void *mem_, uint8_t *buf, int count)
+{
+ const unsigned char *mem = mem_;
+ unsigned char ch;
+
+ mem_err = 0;
+ while (count-- > 0) {
+#ifdef __XTENSA__
+ unsigned long v;
+ unsigned long addr = (unsigned long)mem;
+ asm volatile ("_l32i %0, %1, 0\n"
+ : "=r"(v)
+ : "r"(addr & ~3)
+ : "memory");
+ ch = v >> (addr & 3) * 8;
+#endif
+ mem++;
+ if (mem_err)
+ return NULL;
+ *buf++ = hexchars[ch >> 4];
+ *buf++ = hexchars[ch & 0xf];
+ }
+
+ *buf = 0;
+
+ return buf;
+}
+
+/* convert the hex array pointed to by buf into binary to be placed in mem
+ * return a pointer to the character AFTER the last byte written */
+
+static uint8_t * hex2mem(const uint8_t *buf, void *mem_, int count)
+{
+ uint8_t *mem = mem_;
+ int i;
+ uint8_t ch;
+
+ if ((unsigned long)mem >= 0xece80000)
+ return NULL;
+
+ mem_err = 0;
+ for (i=0; i<count; i++) {
+ ch = hex(*buf++) << 4;
+ ch |= hex(*buf++);
+#ifdef __XTENSA__
+ unsigned long tmp;
+ unsigned long addr = (unsigned long)mem;
+ asm volatile ("_l32i %0, %1, 0\n"
+ "and %0, %0, %2\n"
+ "or %0, %0, %3\n"
+ "_s32i %0, %1, 0\n"
+ "dhwb %1, 0\n"
+ "ihi %1, 0\n"
+ : "=r"(tmp)
+ : "r"(addr & ~3), "r"(0xffffffff ^ (0xff << (addr & 3) * 8)), "r"(ch << (addr & 3) * 8)
+ : "memory");
+#endif
+ mem++;
+ if (mem_err)
+ return NULL;
+ }
+
+ return mem;
+}
+
+/*
+ * While we find nice hex chars, build an int.
+ * Return number of chars processed.
+ */
+
+static int hexToInt(uint8_t **ptr, int *intValue)
+{
+ int numChars = 0;
+ int hexValue;
+
+ *intValue = 0;
+
+ while (**ptr) {
+ hexValue = hex(**ptr);
+ if (hexValue < 0)
+ break;
+
+ *intValue = (*intValue << 4) | hexValue;
+ numChars ++;
+
+ (*ptr)++;
+ }
+
+ return (numChars);
+}
+
+static inline int test_bit(const uint8_t *p, int bit)
+{
+ return (p[bit / 8] >> (bit & 0x7)) & 1;
+}
+static inline int set_bit(uint8_t *p, int bit)
+{
+ return (p[bit / 8] |= 1u << (bit & 0x7));
+}
+
+static inline void mark_read(int sr)
+{
+ set_bit(sregs_read, sr);
+}
+static inline int is_read(int sr)
+{
+ return test_bit(sregs_read, sr);
+}
+static inline void mark_mod(int sr)
+{
+ set_bit(sregs_mod, sr);
+}
+static inline int is_mod(int sr)
+{
+ return test_bit(sregs_mod, sr);
+}
+static inline void mark_late(int sr)
+{
+ set_bit(sregs_late, sr);
+}
+static inline int is_late(int sr)
+{
+ return test_bit(sregs_late, sr);
+}
+
+static void read_sr(int sr)
+{
+ if (!is_read(sr)) {
+#ifdef __XTENSA__
+ uint32_t val;
+ asm volatile ("movi a3, 1f + 1\n"
+ "s8i %1, a3, 0\n"
+ "dhwb a3, 0\n"
+ "ihi a3, 0\n"
+ "isync\n"
+ "1:\n"
+ "rsr %0, lbeg\n"
+ : "=r"(val)
+ : "r"(sr)
+ : "a3", "memory");
+ sregs[sr] = val;
+#endif
+ mark_read(sr);
+ }
+}
+
+static void write_sr(int sr)
+{
+#ifdef __XTENSA__
+ asm volatile ("movi a3, 1f + 1\n"
+ "s8i %1, a3, 0\n"
+ "dhwb a3, 0\n"
+ "ihi a3, 0\n"
+ "isync\n"
+ "1:\n"
+ "wsr %0, lbeg\n"
+ :
+ : "r"(sregs[sr]), "r"(sr)
+ : "a3", "memory");
+#endif
+}
+
+static void restore_sr(void)
+{
+ int i;
+ for (i = 0; i < 256; ++i)
+ if (is_mod(i) && !is_late(i))
+ write_sr(i);
+}
+
+extern void *_xtos_exc_handler_table[];
+void fault_handler(void);
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
+
+void handle_exception(void)
+{
+ int sigval = 0;
+ int addr;
+ int length;
+ uint8_t *ptr;
+ unsigned i;
+ const unsigned windowbase = 4 * sregs[WINDOWBASE];
+ uint8_t stop_status[4] = "Sxx";
+#ifdef LIBC_LEVEL1_HANDLER
+ static const int cause[] = {
+ EXCCAUSE_LOAD_STORE_ERROR,
+ EXCCAUSE_LOAD_STORE_DATA_ERROR,
+ EXCCAUSE_LOAD_STORE_ADDR_ERROR,
+ EXCCAUSE_DTLB_MISS,
+ EXCCAUSE_DTLB_MULTIHIT,
+ EXCCAUSE_LOAD_PROHIBITED,
+ EXCCAUSE_STORE_PROHIBITED,
+ };
+ _xtos_handler handler[sizeof(cause) / sizeof(cause[0])];
+
+ for (i = 0; i < ARRAY_SIZE(cause); ++i) {
+ handler[i] = _xtos_exc_handler_table[cause[i]];
+ _xtos_exc_handler_table[cause[i]] = fault_handler;
+ }
+#endif
+ memcpy(sregs_read, sregs_late, sizeof(sregs_read));
+ memset(sregs_mod, 0, sizeof(sregs_mod));
+
+ sigval = 5;
+ stop_status[1] = hexchars[sigval >> 4];
+ stop_status[2] = hexchars[sigval & 0xf];
+
+ if (sregs[DEBUGCAUSE] & DEBUGCAUSE_ICOUNT_MASK) {
+ sregs[ICOUNTLEVEL] = 0;
+ mark_mod(ICOUNTLEVEL);
+ }
+ putpacket(stop_status);
+
+ while (1) {
+ remcomOutBuffer[0] = 0;
+
+ ptr = getpacket();
+ switch (*ptr++) {
+ case '?':
+ memcpy(remcomOutBuffer, stop_status, sizeof(stop_status));
+ break;
+
+ case 'c': /* cAA..AA Continue at address AA..AA(optional) */
+ /* try to read optional parameter, pc unchanged if no parm */
+
+ if (hexToInt(&ptr, &addr))
+ sregs[DEBUG_PC] = addr;
+ goto out;
+
+ case 'm': /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
+ /* Try to read %x,%x. */
+
+ if (hexToInt(&ptr, &addr) && *ptr++ == ',' &&
+ hexToInt(&ptr, &length)) {
+ if (mem2hex((void *)addr, remcomOutBuffer, length))
+ break;
+
+ strcpy((char *)remcomOutBuffer, "E03");
+ } else {
+ strcpy((char *)remcomOutBuffer, "E01");
+ }
+ break;
+
+ case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
+ /* Try to read '%x,%x:'. */
+
+ if (hexToInt(&ptr, &addr) && *ptr++ == ',' &&
+ hexToInt(&ptr, &length) && *ptr++ == ':') {
+ if (hex2mem(ptr, (void *)addr, length))
+ strcpy((char *)remcomOutBuffer, "OK");
+ else
+ strcpy((char *)remcomOutBuffer, "E03");
+ } else {
+ strcpy((char *)remcomOutBuffer, "E02");
+ }
+ break;
+
+ case 'p': /* pAA..AA read register number AA..AA */
+ if (hexToInt(&ptr, &addr)) {
+ if (addr < 0x10) { /* read address register in the current window */
+ mem2hex(aregs + addr, remcomOutBuffer, 4);
+ } else if (addr == 0x20) { /* read PC */
+ mem2hex(sregs + DEBUG_PC, remcomOutBuffer, 4);
+ } else if (addr >= 0x100 && addr < 0x100 + XCHAL_NUM_AREGS) { /* read address register by absolute index */
+ mem2hex(aregs + ((addr - windowbase) & 0xff), remcomOutBuffer, 4);
+ } else if (addr >= 0x200 && addr < 0x300) { /* read special register */
+ addr &= 0xff;
+ read_sr(addr);
+ mem2hex(sregs + addr, remcomOutBuffer, 4);
+ } else if (addr >= 0x300 && addr < 0x400) { /* TODO read user register */
+ strcpy((char *)remcomOutBuffer, "deadbabe");
+ } else { /* unexpected register number */
+ strcpy((char *)remcomOutBuffer, "E00");
+ }
+ }
+ break;
+
+ case 'P': /* PAA..AA=VV..VV Set register number AA..AA to a value VV..VV */
+ if (hexToInt(&ptr, &addr) && *(ptr++) == '=') {
+ int ok = 1;
+
+ if (addr < 0x10) {
+ hex2mem(ptr, aregs + addr, 4);
+ } else if (addr == 0x20) {
+ hex2mem(ptr, sregs + DEBUG_PC, 4);
+ } else if (addr >= 0x100 && addr < 0x100 + XCHAL_NUM_AREGS) {
+ hex2mem(ptr, aregs + ((addr - windowbase) & 0xff), 4);
+ } else if (addr >= 0x200 && addr < 0x300) {
+ addr &= 0xff;
+ hex2mem(ptr, sregs + addr, 4);
+ mark_read(addr);
+ mark_mod(addr);
+ } else {
+ ok = 0;
+ strcpy((char *)remcomOutBuffer, "E00");
+ }
+ if (ok)
+ strcpy((char *)remcomOutBuffer, "OK");
+ }
+ break;
+
+ case 'q': /* generic query */
+ if (strncmp((char *)ptr, "Supported", 9) == 0)
+ strcpy((char *)remcomOutBuffer, "PacketSize=100"); /* must match BUFMAX */
+ break;
+
+ case 's': /* s[AA..AA] Single step */
+ if (hexToInt(&ptr, &addr))
+ sregs[DEBUG_PC] = addr;
+ sregs[ICOUNT] = 0xfffffffe;
+ mark_mod(ICOUNT);
+ sregs[ICOUNTLEVEL] = XCHAL_DEBUGLEVEL;
+ mark_mod(ICOUNTLEVEL);
+ goto out;
+
+ case 'Z': /* insert HW breakpoint*/
+ switch (*ptr++) {
+ case '1':
+ read_sr(IBREAKENABLE);
+ if (*ptr++ == ',' && hexToInt(&ptr, &addr) &&
+ *ptr++ == ',' && hexToInt(&ptr, &length) &&
+ *ptr == 0) {
+ for (i = 0; i < XCHAL_NUM_IBREAK; ++i) {
+ if (!(sregs[IBREAKENABLE] & (1 << i)) ||
+ sregs[IBREAKA + i] == addr) {
+ sregs[IBREAKA + i] = addr;
+ mark_mod(IBREAKA + i);
+ sregs[IBREAKENABLE] |= (1 << i);
+ mark_mod(IBREAKENABLE);
+ break;
+ }
+ }
+ if (i == XCHAL_NUM_IBREAK)
+ strcpy((char *)remcomOutBuffer, "E02");
+ else
+ strcpy((char *)remcomOutBuffer, "OK");
+ } else {
+ strcpy((char *)remcomOutBuffer, "E01");
+ }
+ break;
+ }
+ break;
+
+ case 'z': /* remove HW breakpoint */
+ switch (*ptr++) {
+ case '1':
+ read_sr(IBREAKENABLE);
+ if (*ptr++ == ',' && hexToInt(&ptr, &addr) &&
+ *ptr++ == ',' && hexToInt(&ptr, &length)) {
+ for (i = 0; i < XCHAL_NUM_IBREAK; ++i) {
+ read_sr(IBREAKA + i);
+ if (sregs[IBREAKENABLE] & (1 << i) &&
+ sregs[IBREAKA + i] == addr) {
+ sregs[IBREAKENABLE] &= ~(1 << i);
+ mark_mod(IBREAKENABLE);
+ break;
+ }
+ }
+ if (i == XCHAL_NUM_IBREAK)
+ strcpy((char *)remcomOutBuffer, "E02");
+ else
+ strcpy((char *)remcomOutBuffer, "OK");
+ } else {
+ strcpy((char *)remcomOutBuffer, "E01");
+ }
+ break;
+ }
+ break;
+ }
+
+ /* reply to the request */
+ putpacket(remcomOutBuffer);
+ }
+out:
+#ifdef LIBC_LEVEL1_HANDLER
+ for (i = 0; i < ARRAY_SIZE(cause); ++i) {
+ _xtos_exc_handler_table[cause[i]] = handler[i];
+ }
+#endif
+ restore_sr();
+}
+
+void init_gdbstub(void)
+{
+ mark_late(LBEG);
+ mark_late(LEND);
+ mark_late(LCOUNT);
+ mark_late(SAR);
+ mark_late(WINDOWBASE);
+ mark_late(WINDOWSTART);
+ mark_late(DEBUG_PC);
+ mark_late(EXCSAVE_1);
+ mark_late(PS);
+ mark_late(EXCCAUSE);
+ mark_late(DEBUGCAUSE);
+ mark_late(EXCVADDR);
+#ifdef __XTENSA__
+ init_debug_comm();
+ init_debug_entry();
+#endif
+}
diff --git a/hifi/xaf/hifi-dpf/core/util/gdbstub/xtensa-defs.h b/hifi/xaf/hifi-dpf/core/util/gdbstub/xtensa-defs.h
new file mode 100644
index 00000000..6ba485ff
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/util/gdbstub/xtensa-defs.h
@@ -0,0 +1,37 @@
+/*******************************************************************************
+* 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 XTENSA_DEFS_H
+#define XTENSA_DEFS_H
+
+#include <xtensa/specreg.h>
+#include <xtensa/config/core-isa.h>
+#include <xtensa/corebits.h>
+
+#define _AREG0 256
+
+#define STACK_SIZE 1024
+#define DEBUG_PC (EPC + XCHAL_DEBUGLEVEL)
+#define DEBUG_EXCSAVE (EXCSAVE + XCHAL_DEBUGLEVEL)
+#define DEBUG_PS (EPS + XCHAL_DEBUGLEVEL)
+
+#endif /* XTENSA_DEFS_H */
diff --git a/hifi/xaf/hifi-dpf/core/util/mutex.c b/hifi/xaf/hifi-dpf/core/util/mutex.c
new file mode 100644
index 00000000..d62a6a17
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/util/mutex.c
@@ -0,0 +1,156 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * mutex.c
+ *
+ * Implementation of non-robust Szymanski linear-waiting algorithm. Types of
+ * failures tolerated by Szymanski's "robust" algorithm are not specific for
+ * Xtensa DSP cluster and therefore more lightweight version of the algorithm
+ * is used. FIFO servicing property is of low importance, and faster/smaller
+ * version with linear-wait property is preferable.
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Local constants definitions
+ ******************************************************************************/
+
+/* ...communication variables */
+#define __M_A (1 << 0)
+#define __M_W (1 << 1)
+#define __M_S (1 << 2)
+
+/* ...process states (updated atomically) */
+#define M_PASSIVE (0)
+#define M_ENTRY (__M_A)
+#define M_INSIDE (__M_W)
+#define M_TRANSIENT (__M_S | __M_W)
+#define M_EXIT (__M_S)
+
+/* ...total number of cores */
+#define M_N XF_CFG_CORES_NUM
+
+/* ...do not compile the code if there is just a single core */
+#if M_N > 1
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+void mutex_lock(u32 i)
+{
+ u32 j;
+
+ /* ...p1: i-th core goes into "entry" state (aws = true,false,false) */
+ MUTEX_SHARED_WRITE(i, M_ENTRY);
+
+ /* ...p2: wait all processes have sj=false (waiting room door is open) */
+ for (j = 0; j < M_N; j++)
+ {
+ /* ...wait until sj = false */
+ while (MUTEX_SHARED_READ(j) & __M_S) (void) 0;
+ }
+
+ /* ...p3: i-th core enters "inside" state (aws = false,true,false) */
+ MUTEX_SHARED_WRITE(i, M_INSIDE);
+
+p4:
+ /* ...p4: wait in "inside" state */
+ for (j = 0; j < M_N; j++)
+ {
+ /* ...p5: check if any of the cores appears is in "entry" state (aj=true) */
+ if (MUTEX_SHARED_READ(j) & __M_A)
+ {
+ /* ...p5: found core in "entry" state (j < n); wait until it enters waiting room */
+ goto p7;
+ }
+ }
+
+ /* ...p6: j == n; enter into "transient" state (ai=false, wi=true, si=true) */
+ MUTEX_SHARED_WRITE(i, M_TRANSIENT);
+
+ /* ...p6.1: check for any core appearing in "entry" room */
+ for (j = 0; j < M_N; j++)
+ {
+ if (MUTEX_SHARED_READ(j) & __M_A)
+ {
+ /* ...p6.2: found core in "entry" state (j < n) */
+ MUTEX_SHARED_WRITE(i, M_INSIDE);
+
+ /* ...back of to the "inside" state */
+ goto p7;
+ }
+ }
+
+ /* ...p6.3: no cores in "entry" room (j == n); go to "exit" state (ai=false, wi=false, si=true) */
+ MUTEX_SHARED_WRITE(i, M_EXIT);
+
+ /* ...p6.4: allow all cores to leave "transient" state (i.e. switch to "exit") */
+ for (j = 0; j < M_N; j++)
+ {
+ while (MUTEX_SHARED_READ(j) & __M_W) (void) 0;
+ }
+
+ goto p9;
+
+p7:
+ /* ...j < n condition is met; find any cores in "inside" state (wj = true, sj = false) */
+ for (j = 0; j < M_N; j++)
+ {
+ /* ...check if the core is in "exit" state */
+ if (MUTEX_SHARED_READ(j) == M_EXIT)
+ {
+ /* ...p8.1: different core is a leader; go to "exit" state (ai=false, wi=false, si=true) */
+ MUTEX_SHARED_WRITE(i, M_EXIT);
+
+ goto p9;
+ }
+ }
+
+ /* ...wait in "inside" state while all transients settle */
+ goto p4;
+
+p9:
+ /* ...p9: i-th core is in "exit" state; enter critical section in accordance with numbering */
+ for (j = 0; j < i; j++)
+ {
+ /* ...wait until core with lower number in "inside"/"transient"/"exit" states leaves */
+ while (MUTEX_SHARED_READ(j) & (__M_W | __M_S)) (void) 0;
+ }
+
+ /* ...critical section entered */
+}
+
+/*******************************************************************************
+ * mutex_unlock
+ *
+ * Release multi-core mutex
+ ******************************************************************************/
+
+void mutex_unlock(u32 i)
+{
+ /* ...enter into "passive" state (ai=false, wi=false, si=false) */
+ MUTEX_SHARED_WRITE(i, M_PASSIVE);
+}
+
+#endif /* M_N > 1 */
diff --git a/hifi/xaf/hifi-dpf/core/util/rbtree.c b/hifi/xaf/hifi-dpf/core/util/rbtree.c
new file mode 100644
index 00000000..740e0255
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/util/rbtree.c
@@ -0,0 +1,842 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * rbtree.c
+ *
+ * Red-black tree library
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Macros definitions
+ ******************************************************************************/
+
+/* ...node color */
+#define RB_RED (1)
+#define RB_BLK (0)
+
+/* ...pointer to parent node */
+#define RB_PARENT(tree, node) ((node)->parent)
+
+/* ...pointer to left child node */
+#define RB_LEFT(tree, node) ((node)->left)
+
+/* ...pointer to right child node */
+#define RB_RIGHT(tree, node) ((node)->right)
+
+/* ...pointer to right child node */
+#define RB_COLOR(tree, node) ((node)->color & 1)
+
+/* ...check if node is black */
+#define RB_IS_BLACK(tree, node) (!((node)->color & RB_RED))
+
+/* ...root node index of the tree - can be simplified? */
+#define RB_ROOT(tree) RB_LEFT((tree), &(tree)->root)
+
+/* ...empty node */
+#define RB_NULL(tree) (&(tree)->root)
+
+/*******************************************************************************
+ * Helpers
+ ******************************************************************************/
+
+#define RB_SET_P(t, n, p) \
+ ({ (n)->parent = (p); })
+
+#define RB_SET_L(t, n, l) \
+ ({ (n)->left = (l); })
+
+#define RB_SET_R(t, n, r) \
+ ({ (n)->right = (r); })
+
+#define RB_SET_C(t, n, c) \
+ RB_SET_C_##c((t), (n))
+
+#define RB_SET_C_RB_BLK(t, n) \
+ ({ (n)->color &= ~1; })
+
+#define RB_SET_C_RB_RED(t, n) \
+ ({ (n)->color |= 1; })
+
+#define RB_SET_P_C(t, n, p, c) \
+ ({ (n)->parent = (p); RB_SET_C_##c(t, n); })
+
+#define RB_SET_P_L(t, n, p, l) \
+ ({ (n)->parent = (p); (n)->left = (l); })
+
+#define RB_SET_P_L_C(t, n, p, l, c) \
+ ({ (n)->parent = (p); (n)->left = (l); RB_SET_C_##c(t, n); })
+
+#define RB_SET_P_R(t, n, p, r) \
+ ({ (n)->parent = (p); (n)->right = (r); })
+
+#define RB_SET_P_R_C(t, n, p, r, c) \
+ ({ (n)->parent = (p); (n)->right = (r); RB_SET_C_##c(t, n); })
+
+#define RB_SET_P_L_R(t, n, p, l, r) \
+ ({ (n)->parent = (p); (n)->left = (l); (n)->right = (r); })
+
+#define RB_SET_P_L_R_C(t, n, p, l, r, c)\
+ ({ (n)->parent = (p); (n)->left = (l); (n)->right = (r); RB_SET_C_##c(t, n); })
+
+#define RB_SET_ROOT(t, n) \
+ RB_SET_L((t), &(t)->root, (n))
+
+/*******************************************************************************
+ * RB-tree functions
+ ******************************************************************************/
+
+/*******************************************************************************
+ * rb_first, rb_last
+ *
+ * Return pointer to first/last item in the tree
+ ******************************************************************************/
+
+rb_idx_t rb_first(rb_tree_t *tree)
+{
+ rb_idx_t p_idx, t_idx;
+
+ if ((p_idx = RB_ROOT(tree)) != RB_NULL(tree))
+ {
+ /* ...find left-most item in non-empty tree */
+ while ((t_idx = RB_LEFT(tree, p_idx)) != RB_NULL(tree))
+ p_idx = t_idx;
+ }
+
+ return p_idx;
+}
+
+rb_idx_t rb_last(rb_tree_t *tree)
+{
+ rb_idx_t p_idx, t_idx;
+
+ if ((p_idx = RB_ROOT(tree)) != RB_NULL(tree))
+ {
+ /* ...find right-most item in non-empty tree */
+ while ((t_idx = RB_RIGHT(tree, p_idx)) != RB_NULL(tree))
+ p_idx = t_idx;
+ }
+
+ return p_idx;
+}
+
+/*******************************************************************************
+ * rb_next, rb_prev
+ *
+ * Return next / previous in-order item in the tree
+ ******************************************************************************/
+
+rb_idx_t rb_next(rb_tree_t *tree, rb_idx_t n_idx)
+{
+ rb_idx_t p_idx, c_idx, t_idx;
+
+ /* ...if we have any right children, process them */
+ if ((c_idx = RB_RIGHT(tree, n_idx)) != RB_NULL(tree))
+ {
+ /* ...descent to the left-most node starting from right child */
+ while ((t_idx = RB_LEFT(tree, c_idx)) != RB_NULL(tree))
+ c_idx = t_idx;
+ return c_idx;
+ }
+
+ /* ...no right children; ascend to our parent while we are right child */
+ while ((p_idx = RB_PARENT(tree, n_idx)) != RB_NULL(tree))
+ {
+ /* ...as soon as "n" is a left child, return "p" */
+ if (n_idx == RB_RIGHT(tree, p_idx))
+ n_idx = p_idx;
+ else
+ return p_idx;
+ }
+
+ /* ...we were right-most child */
+ return p_idx;
+}
+
+rb_idx_t rb_prev(rb_tree_t *tree, rb_idx_t n_idx)
+{
+ rb_idx_t p_idx, c_idx, t_idx;
+
+ /* ...if we have any left children, process them */
+ if ((c_idx = RB_LEFT(tree, n_idx)) != RB_NULL(tree))
+ {
+ /* ...descent to the right-most node starting from left child */
+ while ((t_idx = RB_RIGHT(tree, c_idx)) != RB_NULL(tree))
+ c_idx = t_idx;
+ return c_idx;
+ }
+
+ /* ...no left children; ascend to our parent while we are left child */
+ while ((p_idx = RB_PARENT(tree, n_idx)) != RB_NULL(tree))
+ {
+ /* ...as soon as "n" is a right child, return "p" */
+ if (n_idx == RB_LEFT(tree, p_idx))
+ n_idx = p_idx;
+ else
+ return p_idx;
+ }
+
+ /* ...we were left-most child */
+ return p_idx;
+}
+
+/*******************************************************************************
+ * rb_init
+ *
+ * Initialize rb-tree structure
+ ******************************************************************************/
+
+void rb_init(rb_tree_t *tree)
+{
+ /* ...initialize sentinel node of the empty tree */
+ RB_SET_P_L_R_C(tree, &tree->root, RB_NULL(tree), RB_NULL(tree), RB_NULL(tree), RB_BLK);
+}
+
+/*******************************************************************************
+ * rb_insert
+ *
+ * Insert new item into RB-tree. Returns non-zero node index on success
+ ******************************************************************************/
+
+/* ...internal tree balancing function */
+static void __rb_insert_balance(rb_tree_t *tree, rb_idx_t n_idx, rb_idx_t p_idx)
+{
+ rb_idx_t u_idx, g_idx, t_idx, cl_idx, cr_idx;
+
+rebalance:
+
+ /***************************************************************************
+ * Trivial case #1 - N (red) is a root
+ **************************************************************************/
+
+ if (p_idx == RB_NULL(tree))
+ {
+ RB_SET_C(tree, n_idx, RB_BLK);
+ goto root;
+ }
+
+ /***************************************************************************
+ * Trivial case #2 - P is black
+ **************************************************************************/
+
+ if (RB_IS_BLACK(tree, p_idx))
+ goto done;
+
+ /***************************************************************************
+ * Complex cases - P is red, N is red
+ **************************************************************************/
+
+ /* ...grandparent must exist and be black */
+ g_idx = RB_PARENT(tree, p_idx);
+ if (p_idx == RB_LEFT(tree, g_idx))
+ {
+ /* ...we are left grandchild; get uncle (if it exists) */
+ u_idx = RB_RIGHT(tree, g_idx);
+
+ /* ...if U is read, we have conditions of case #3 */
+ if (!RB_IS_BLACK(tree, u_idx))
+ goto case3;
+
+ /* ...we will need grand-grand-parent later */
+ t_idx = RB_PARENT(tree, g_idx);
+
+ /* ...U is black/null; if we are LL grandchild, we have case #5 */
+ if (n_idx == RB_LEFT(tree, p_idx))
+ goto case5_ll;
+
+ /* ...N is RL grandchild of G; case #4 */
+ goto case4_rl;
+ }
+ else
+ {
+ /* ...we are right grandchild; get uncle (if it exists) */
+ u_idx = RB_LEFT(tree, g_idx);
+
+ /* ...if U is read, we have conditions of case #3 */
+ if (!RB_IS_BLACK(tree, u_idx))
+ goto case3;
+
+ /* ...we will need grand-grand-parent later */
+ t_idx = RB_PARENT(tree, g_idx);
+
+ /* ...U is black/null; if we are RR grandchild, we have case #5 */
+ if (n_idx == RB_RIGHT(tree, p_idx))
+ goto case5_rr;
+
+ /* ...N is LR grandchild of G; case #4 */
+ goto case4_lr;
+ }
+
+case4_rl:
+
+ /***************************************************************************
+ * Case #4 - P is red, U is black, N is red RL grandchild of G. We will do
+ * two tree rotations - first the one described in case #4, second is the
+ * one described in case #5 (as have conditions for case #5(LL) with P and
+ * N changing roles
+ **************************************************************************/
+
+ cl_idx = RB_LEFT(tree, n_idx), cr_idx = RB_RIGHT(tree, n_idx);
+ RB_SET_P_L_R_C(tree, n_idx, t_idx, p_idx, g_idx, RB_BLK);
+ RB_SET_P_R(tree, p_idx, n_idx, cl_idx);
+ RB_SET_P(tree, cl_idx, p_idx);
+ RB_SET_P_L_C(tree, g_idx, n_idx, cr_idx, RB_RED);
+ RB_SET_P(tree, cr_idx, g_idx);
+
+ /* ...new root of subtree is N; adjust T pointer */
+ goto case5_xx;
+
+case4_lr:
+
+ /***************************************************************************
+ * Case #4 - P is red, U is black, N is red LR grandchild of G. We will do
+ * two tree rotations - first the one described in case #4, second is the
+ * one described in case #5 (as have conditions for case #5(RR) with P and
+ * N changing roles
+ **************************************************************************/
+
+ cl_idx = RB_LEFT(tree, n_idx), cr_idx = RB_RIGHT(tree, n_idx);
+ RB_SET_P_L_R_C(tree, n_idx, t_idx, g_idx, p_idx, RB_BLK);
+ RB_SET_P_L(tree, p_idx, n_idx, cr_idx);
+ RB_SET_P(tree, cr_idx, p_idx);
+ RB_SET_P_R_C(tree, g_idx, n_idx, cl_idx, RB_RED);
+ RB_SET_P(tree, cl_idx, g_idx);
+
+ /* ...new root of the subtree is N; adjust T pointer */
+ goto case5_xx;
+
+case5_ll:
+
+ /***************************************************************************
+ * Case #5: N is LL grandchild of P; N and P red, G and U black
+ **************************************************************************/
+
+ cr_idx = RB_RIGHT(tree, p_idx);
+ RB_SET_P_L_C(tree, g_idx, p_idx, cr_idx, RB_RED);
+ RB_SET_P(tree, cr_idx, g_idx);
+ RB_SET_P_R_C(tree, p_idx, t_idx, g_idx, RB_BLK);
+
+ /* ...new root of the subtree is P; relabel and adjust T pointer */
+ n_idx = p_idx;
+ goto case5_xx;
+
+case5_rr:
+
+ /***************************************************************************
+ * Case #5: N is RR grandchild of P; N and P red, G and U black
+ **************************************************************************/
+
+ cl_idx = RB_LEFT(tree, p_idx);
+ RB_SET_P_R_C(tree, g_idx, p_idx, cl_idx, RB_RED);
+ RB_SET_P(tree, cl_idx, g_idx);
+ RB_SET_P_L_C(tree, p_idx, t_idx, g_idx, RB_BLK);
+
+ /* ...new root of the subtree is P; relabel and adjust T pointer */
+ n_idx = p_idx;
+ goto case5_xx;
+
+case5_xx:
+
+ /* ...N is a (black) root of subtree; check if it is a root of tree as well */
+ if (t_idx == RB_NULL(tree))
+ goto root;
+ else if (g_idx == RB_LEFT(tree, t_idx))
+ RB_SET_L(tree, t_idx, n_idx);
+ else
+ RB_SET_R(tree, t_idx, n_idx);
+
+ goto done;
+
+case3:
+
+ /***************************************************************************
+ * Case #3 - P and U are red, G is black
+ **************************************************************************/
+
+ RB_SET_C(tree, p_idx, RB_BLK);
+ RB_SET_C(tree, u_idx, RB_BLK);
+ RB_SET_C(tree, g_idx, RB_RED);
+
+ /* ...rebalance the tree for a G */
+ n_idx = g_idx, p_idx = RB_PARENT(tree, g_idx);
+ goto rebalance;
+
+root:
+ /* ...adjust root pointer of the tree */
+ RB_SET_ROOT(tree, n_idx);
+
+done:
+ /* ...tree is balanced */
+ return;
+}
+
+/* ...high-level API function */
+void rb_insert(rb_tree_t *tree, rb_idx_t n_idx, rb_idx_t p_idx)
+{
+ if (p_idx == RB_NULL(tree))
+ {
+ /* ...set black root node */
+ RB_SET_P_L_R_C(tree, n_idx, p_idx, p_idx, p_idx, RB_BLK);
+
+ /* ...tree consists of the only root node; is balanced */
+ RB_SET_ROOT(tree, n_idx);
+ }
+ else
+ {
+ /* ...create new node - set parent pointer and paint red */
+ RB_SET_P_L_R_C(tree, n_idx, p_idx, RB_NULL(tree), RB_NULL(tree), RB_RED);
+
+ /* ...and rebalance the tree */
+ __rb_insert_balance(tree, n_idx, p_idx);
+ }
+}
+
+/*******************************************************************************
+ * rb_delete
+ *
+ * Remove item from RB-key (by key). Returns zero on success
+ ******************************************************************************/
+
+/* ...internal tree balancing function */
+static void __rb_delete_rebalance(rb_tree_t *tree, rb_idx_t p_idx)
+{
+ rb_idx_t n_idx, s_idx, sl_idx, sr_idx, g_idx, c_idx, cl_idx, cr_idx;
+
+ /* ...initialize rebalancing procedure with null-child of P */
+ n_idx = RB_NULL(tree);
+
+rebalance:
+
+ /* ...save grand-parent pointer (may be null) */
+ g_idx = RB_PARENT(tree, p_idx);
+
+ /***************************************************************************
+ * Check for complex cases
+ **************************************************************************/
+
+ if (n_idx == RB_LEFT(tree, p_idx))
+ {
+ /* ...N is left child; get sibling (must exist) and its children */
+ s_idx = RB_RIGHT(tree, p_idx);
+ sl_idx = RB_LEFT(tree, s_idx);
+ sr_idx = RB_RIGHT(tree, s_idx);
+
+ /* ...if S is black, test for conditions 3,4,5,6; otherwise - case 2 */
+ if (RB_IS_BLACK(tree, s_idx))
+ goto test3_l;
+ else
+ goto case2_l;
+ }
+ else
+ {
+ /* ...N is right child; get sibling (must exist) and its children */
+ s_idx = RB_LEFT(tree, p_idx);
+ sl_idx = RB_LEFT(tree, s_idx);
+ sr_idx = RB_RIGHT(tree, s_idx);
+
+ /* ...if S is black, test for conditions 3,4,5,6; otherwise - case 2 */
+ if (RB_IS_BLACK(tree, s_idx))
+ goto test3_r;
+ else
+ goto case2_r;
+ }
+
+case2_l:
+
+ /***************************************************************************
+ * Case #2: N is a left child of P; S is red
+ **************************************************************************/
+
+ c_idx = sl_idx;
+ RB_SET_P_L_C(tree, s_idx, g_idx, p_idx, RB_BLK);
+ RB_SET_P_R_C(tree, p_idx, s_idx, c_idx, RB_RED);
+ RB_SET_P(tree, c_idx, p_idx);
+
+ /* ...S is new root of subtree, Sl(C) is new sibling of N; update G */
+ goto case2_x;
+
+case2_r:
+
+ /***************************************************************************
+ * Case #2: N is a right child of P; S is red
+ **************************************************************************/
+
+ c_idx = sr_idx;
+ RB_SET_P_R_C(tree, s_idx, g_idx, p_idx, RB_BLK);
+ RB_SET_P_L_C(tree, p_idx, s_idx, c_idx, RB_RED);
+ RB_SET_P(tree, c_idx, p_idx);
+
+ /* ...S is new root of subtree, Sr(C) is new sibling of N; update G */
+ goto case2_x;
+
+case2_x:
+
+ /* ...check if S is becoming new (black) root of the tree */
+ if (g_idx == RB_NULL(tree))
+ RB_SET_ROOT(tree, s_idx);
+ else if (p_idx == RB_LEFT(tree, g_idx))
+ RB_SET_L(tree, g_idx, s_idx);
+ else
+ RB_SET_R(tree, g_idx, s_idx);
+
+ /* ...relabel new N's grandparent (now S) as G and new sibling (now C) as S */
+ g_idx = s_idx, s_idx = c_idx;
+ sl_idx = RB_LEFT(tree, s_idx);
+ sr_idx = RB_RIGHT(tree, s_idx);
+
+ /* ...N is still one of P's children; select proper side */
+ if (n_idx == RB_LEFT(tree, p_idx))
+ goto test3_l;
+ else
+ goto test3_r;
+
+test3_l:
+
+ /***************************************************************************
+ * Test for cases 3,4,5,6; P is any, S is black. N is left child of P
+ **************************************************************************/
+
+ if (!RB_IS_BLACK(tree, sr_idx))
+ /* ...Sr is red, Sl of any color; conditions for case #6 are met */
+ goto case6_l;
+ else if (!RB_IS_BLACK(tree, sl_idx))
+ /* ...Sr is black and Sl is red; conditions for case #5 are met */
+ goto case5_l;
+ else if (RB_IS_BLACK(tree, p_idx))
+ /* ...Sl and Sr are of the same (black) color and P is black */
+ goto case3;
+ else
+ /* ...Sl and Sr are of the same (black) color and P is red */
+ goto case4;
+
+test3_r:
+
+ /***************************************************************************
+ * Test for cases 3,4,5,6; P is any, S is black. N is right child of P
+ **************************************************************************/
+
+ if (!RB_IS_BLACK(tree, sl_idx))
+ /* ...Sl is red, Sr of any color; conditions for case #6 are met */
+ goto case6_r;
+ else if (!RB_IS_BLACK(tree, sr_idx))
+ /* ...Sl is black and Sr is red; conditions for case #5 are met */
+ goto case5_r;
+ else if (RB_IS_BLACK(tree, p_idx))
+ /* ...Sl and Sr are of the same (black) color and P is black */
+ goto case3;
+ else
+ /* ...Sl and Sr are of the same (black) color and P is red */
+ goto case4;
+
+case3:
+
+ /***************************************************************************
+ * Case #3: N, P, S, Sl and Sr are black
+ **************************************************************************/
+
+ RB_SET_C(tree, s_idx, RB_RED);
+
+ /* ...and rebalance the tree for parent */
+ n_idx = p_idx, p_idx = RB_PARENT(tree, p_idx);
+
+ if (p_idx == RB_NULL(tree))
+ goto done;
+ else
+ goto rebalance;
+
+case4:
+
+ /***************************************************************************
+ * Case #4: N and S are black, P is red, Sl and Sr are all black
+ **************************************************************************/
+
+ RB_SET_C(tree, s_idx, RB_RED);
+ RB_SET_C(tree, p_idx, RB_BLK);
+
+ goto done;
+
+case5_l:
+ /***************************************************************************
+ * Case #5: S is black, Sl is red, Sr is black; N is left child of P. We
+ * have two subsequent transformations (case #5 and case #6) combined
+ **************************************************************************/
+
+ cl_idx = RB_LEFT(tree, sl_idx);
+ cr_idx = RB_RIGHT(tree, sl_idx);
+
+ if (RB_IS_BLACK(tree, p_idx))
+ RB_SET_P_L_R_C(tree, sl_idx, g_idx, p_idx, s_idx, RB_BLK);
+ else
+ RB_SET_P_L_R_C(tree, sl_idx, g_idx, p_idx, s_idx, RB_RED);
+
+ RB_SET_P_R_C(tree, p_idx, sl_idx, cl_idx, RB_BLK);
+ RB_SET_P(tree, cl_idx, p_idx);
+ RB_SET_P_L(tree, s_idx, sl_idx, cr_idx);
+ RB_SET_P(tree, cr_idx, s_idx);
+
+ /* ...relabel new root as S (for common processing in case #6) */
+ s_idx = sl_idx;
+ goto case6_x;
+
+case5_r:
+ /***************************************************************************
+ * Case #5: S is black, Sr is red, Sl is black; N is right child of P. We
+ * have two subsequent transformations (case #5 and case #6) combined
+ **************************************************************************/
+
+ cl_idx = RB_LEFT(tree, sr_idx);
+ cr_idx = RB_RIGHT(tree, sr_idx);
+
+ if (RB_IS_BLACK(tree, p_idx))
+ RB_SET_P_L_R_C(tree, sr_idx, g_idx, s_idx, p_idx, RB_BLK);
+ else
+ RB_SET_P_L_R_C(tree, sr_idx, g_idx, s_idx, p_idx, RB_RED);
+
+ RB_SET_P_L_C(tree, p_idx, sr_idx, cr_idx, RB_BLK);
+ RB_SET_P(tree, cr_idx, p_idx);
+ RB_SET_P_R(tree, s_idx, sr_idx, cl_idx);
+ RB_SET_P(tree, cl_idx, s_idx);
+
+ /* ...relabel new root as S (for common processing in case #6) */
+ s_idx = sr_idx;
+ goto case6_x;
+
+case6_l:
+
+ /***************************************************************************
+ * Case #6: S is black, N is the left child of P, Sr is red
+ **************************************************************************/
+
+ if (RB_IS_BLACK(tree, p_idx))
+ RB_SET_P_L(tree, s_idx, g_idx, p_idx);
+ else
+ RB_SET_P_L_C(tree, s_idx, g_idx, p_idx, RB_RED);
+
+ RB_SET_P_R_C(tree, p_idx, s_idx, sl_idx, RB_BLK);
+ RB_SET_P(tree, sl_idx, p_idx);
+ RB_SET_C(tree, sr_idx, RB_BLK);
+
+ /* ...S is a new root of subtree; update G */
+ goto case6_x;
+
+case6_r:
+
+ /***************************************************************************
+ * Case #6: S is black, N is the right child of P, Sl is red
+ **************************************************************************/
+
+ if (RB_IS_BLACK(tree, p_idx))
+ RB_SET_P_R(tree, s_idx, g_idx, p_idx);
+ else
+ RB_SET_P_R_C(tree, s_idx, g_idx, p_idx, RB_RED);
+
+ RB_SET_P_L_C(tree, p_idx, s_idx, sr_idx, RB_BLK);
+ RB_SET_P(tree, sr_idx, p_idx);
+ RB_SET_C(tree, sl_idx, RB_BLK);
+
+ /* ...S is a new root of subtree; update G */
+ goto case6_x;
+
+case6_x:
+
+ /* ...S is a new root of subtree; update G's pointer */
+ if (g_idx == RB_NULL(tree))
+ RB_SET_ROOT(tree, s_idx);
+ else if (p_idx == RB_LEFT(tree, g_idx))
+ RB_SET_L(tree, g_idx, s_idx);
+ else
+ RB_SET_R(tree, g_idx, s_idx);
+
+ /* ...tree is balanced; pass through */
+
+done:
+
+ return;
+}
+
+/* ...high-level API function */
+rb_idx_t rb_delete(rb_tree_t *tree, rb_idx_t n_idx)
+{
+ rb_idx_t p_idx, t_idx, m_idx, c_idx, l_idx, r_idx, k_idx;
+ u32 color;
+
+ /* ...save parent of element N that we are going to remove */
+ p_idx = RB_PARENT(tree, n_idx);
+
+ /* ...get in-order predecessor/successor of n_idx, if possible */
+ if ((m_idx = RB_LEFT(tree, n_idx)) != RB_NULL(tree))
+ {
+ while ((t_idx = RB_RIGHT(tree, m_idx)) != RB_NULL(tree))
+ m_idx = t_idx;
+
+ /* ...set the child of in-order predecessor (may be null) */
+ c_idx = RB_LEFT(tree, m_idx);
+ }
+ else if ((m_idx = RB_RIGHT(tree, n_idx)) != RB_NULL(tree))
+ {
+ while ((t_idx = RB_LEFT(tree, m_idx)) != RB_NULL(tree))
+ m_idx = t_idx;
+
+ /* ...set the child of in-order successor (may be null) */
+ c_idx = RB_RIGHT(tree, m_idx);
+ }
+ else if (p_idx == RB_NULL(tree))
+ {
+ /* ...tree consists of the only root node N that we are removing */
+ RB_SET_ROOT(tree, m_idx);
+
+ /* ..return tree null pointer */
+ return m_idx;
+ }
+ else
+ {
+ /* ...N is a (non-root) leaf node; M and C are null */
+ c_idx = m_idx;
+
+ /* ...save the color of the node we are going to delete */
+ color = RB_COLOR(tree, n_idx);
+
+ /* ...set new parent of C */
+ t_idx = p_idx;
+
+ /* ...pointer that we return as in-order predecessor/successor */
+ k_idx = p_idx;
+
+ /* ...adjust only parent of the N */
+ goto adjust_parent;
+ }
+
+ /* ...node that replaces our component is M */
+ k_idx = m_idx;
+
+ /***************************************************************************
+ * Replace node N with M
+ **************************************************************************/
+
+ /* ...save original color of M (the node that we are deleting) */
+ color = RB_COLOR(tree, m_idx);
+
+ /* ...put M in place of N; get N's children */
+ l_idx = RB_LEFT(tree, n_idx);
+ r_idx = RB_RIGHT(tree, n_idx);
+
+ /* ...see if M is a child of N */
+ if ((t_idx = RB_PARENT(tree, m_idx)) != n_idx)
+ {
+ /* ...C becomes left or right child of M's original parent T */
+ if (c_idx == RB_LEFT(tree, m_idx))
+ RB_SET_R(tree, t_idx, c_idx);
+ else
+ RB_SET_L(tree, t_idx, c_idx);
+
+ /* ...adjust C parent pointer (okay if it's null) */
+ RB_SET_P(tree, c_idx, t_idx);
+
+ /* ...set all pointers of node M (it replaces N) */
+ RB_SET_P_L_R(tree, m_idx, p_idx, l_idx, r_idx);
+ RB_SET_P(tree, l_idx, m_idx);
+ RB_SET_P(tree, r_idx, m_idx);
+ }
+ else
+ {
+ /* ...M is a left or right child of N; it gets to N's place, and C remains intact */
+ if (m_idx == l_idx)
+ {
+ RB_SET_P_R(tree, m_idx, p_idx, r_idx);
+ RB_SET_P(tree, r_idx, m_idx);
+ }
+ else
+ {
+ RB_SET_P_L(tree, m_idx, p_idx, l_idx);
+ RB_SET_P(tree, l_idx, m_idx);
+ }
+
+ /* ...parent of C is still M (we label it as T) */
+ t_idx = m_idx;
+ }
+
+ /* ...paint M in the same color as N which it replaced */
+ if (RB_IS_BLACK(tree, n_idx))
+ RB_SET_C(tree, m_idx, RB_BLK);
+ else
+ RB_SET_C(tree, m_idx, RB_RED);
+
+adjust_parent:
+
+ /* ...adjust N's parent node to point to M */
+ if (p_idx == RB_NULL(tree))
+ RB_SET_ROOT(tree, m_idx);
+ else if (n_idx == RB_LEFT(tree, p_idx))
+ RB_SET_L(tree, p_idx, m_idx);
+ else
+ RB_SET_R(tree, p_idx, m_idx);
+
+ /* ...check for a color of deleted item (M or N in case it is a leaf) */
+ if (color == RB_BLK)
+ {
+ if (c_idx == RB_NULL(tree))
+ /* ...rebalance the tree for a T node (it is never a null)*/
+ __rb_delete_rebalance(tree, t_idx);
+ else
+ /* ...C node exists and is necessarily red; repaint it black */
+ RB_SET_C(tree, c_idx, RB_BLK);
+ }
+
+ /* ....return the node K which replaced deleted node N */
+ return k_idx;
+}
+
+/*******************************************************************************
+ * rb_replace
+ *
+ * Replace the node with the same-key node - adjust tree pointers
+ ******************************************************************************/
+
+void rb_replace(rb_tree_t *tree, rb_idx_t n_idx, rb_idx_t t_idx)
+{
+ rb_idx_t p_idx, l_idx, r_idx;
+
+ /* ...get node pointers */
+ p_idx = RB_PARENT(tree, n_idx), l_idx = RB_LEFT(tree, n_idx), r_idx = RB_RIGHT(tree, n_idx);
+
+ /* ...set new node pointers */
+ RB_SET_P_L_R(tree, t_idx, p_idx, l_idx, r_idx);
+
+ /* ...set node color */
+ if (RB_IS_BLACK(tree, n_idx))
+ RB_SET_C(tree, t_idx, RB_BLK);
+ else
+ RB_SET_C(tree, t_idx, RB_RED);
+
+ /* ...update parent node */
+ if (p_idx == RB_NULL(tree))
+ RB_SET_ROOT(tree, t_idx);
+ else if (n_idx == RB_LEFT(tree, p_idx))
+ RB_SET_L(tree, p_idx, t_idx);
+ else
+ RB_SET_R(tree, p_idx, t_idx);
+
+ /* ...update children's parent node (okay if null) */
+ RB_SET_P(tree, l_idx, t_idx), RB_SET_P(tree, r_idx, t_idx);
+}
diff --git a/hifi/xaf/hifi-dpf/core/util/tinyvprintf.c b/hifi/xaf/hifi-dpf/core/util/tinyvprintf.c
new file mode 100644
index 00000000..25d7e03e
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/util/tinyvprintf.c
@@ -0,0 +1,198 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+
+#include <string.h>
+#include "lib/tinyput.h"
+
+
+/*
+ * Simple formatted output routine.
+ * Designed primarily for small size (and secondarily for efficiency).
+ * Only a common subset of printf formats and options are handled:
+ *
+ * %[-+ ][0][width]i decimal signed integer
+ * %[-+ ][0][width]d decimal signed integer
+ * %[-][0][width]u decimal unsigned integer
+ * %[-][0][width]x hex unsigned integer
+ * %[-][0][width]p hex unsigned integer with 0x prefix ("pointer")
+ * %[-][width]c single character
+ * %[-][width]s string
+ *
+ * These modifiers are ignored (legally on 32-bit Xtensa):
+ * # (alternate format)
+ * h (short) expands to int on 32-bit Xtensa
+ * l (long) same as int on 32-bit Xtensa
+ * j (intmax_t or uintmax_t) same as int on 32-bit Xtensa
+ * z (size_t or ssize_t) same as int on 32-bit Xtensa
+ * t (ptrdiff_t) same as int on 32-bit Xtensa
+ *
+ * Does NOT support:
+ * width.prec (precision modifier)
+ * %X (capitalized hex; handles this as lowercase hex)
+ * %o (octal)
+ * %[L][feEgG] (floating point formats)
+ * %a %A (hex floating point formats, C99)
+ * %C (multibyte character)
+ * %S (multibyte character string)
+ * %n (returning count of character written)
+ * ll (long long)
+ * q j z t (other size modifiers, eg. see glibc)
+ */
+int tiny_vsprintf(char *out, const char *fmt, va_list ap)
+{
+ int total = 0;
+ char c, space = ' ', buf[11]; /* largest 32-bit integer output (octal) */
+
+ while ((c = *(char*)fmt++) != 0) {
+ if (c != '%') {
+ *out++ = c;
+ total++;
+ } else {
+ int width = 0, len = 1, rightjust = 1;
+ unsigned n;
+ char *s = buf, *t, pad = ' ', sign = 0;
+ while (1) {
+ c = *(char*)fmt++;
+ switch (c) {
+ case 'c': buf[0] = va_arg(ap, int); goto donefmt;
+ case 's': s = va_arg(ap, char*);
+ if (s == 0)
+ len = 0;
+ else {
+ for (t = s; *t; t++) ;
+ len = t - s;
+ }
+ goto donefmt;
+
+ case '#': /* ignore (not supported) */
+ case 'h': /* ignore (short; passed as int) */
+ case 'l': /* ignore (long; same as int) */
+ case 'j': /* ignore (intmax_t or uintmax_t; same as int) */
+ case 'z': /* ignore (size_t or ssize_t; same as int) */
+ case 't': /* ignore (ptrdiff_t; same as int) */
+ break;
+
+ case ' ': sign = ' '; break;
+ case '+': sign = '+'; break;
+ case '-': rightjust = 0; break;
+
+ case 'i': /*FALLTHROUGH*/
+ case 'd': n = va_arg(ap, int);
+ if ((int)n < 0) {
+ sign = '-';
+ n = -(int)n;
+ }
+ if (sign) {
+ if (rightjust && pad == ' ')
+ *s++ = sign;
+ else {
+ *out++ = sign;
+ width--;
+ total++;
+ }
+ }
+ goto do_decimal;
+ case 'u': n = va_arg(ap, int);
+ do_decimal:
+ {
+ /* (avoids division or multiplication) */
+ int digit, i, seen = 0;
+ for (digit = 0; n >= 1000000000; digit++)
+ n -= 1000000000;
+ for (i = 9;;) {
+ if (!seen && digit != 0)
+ seen = i;
+ if (seen)
+ *s++ = '0' + digit;
+ for (digit = 0; n >= 100000000; digit++)
+ n -= 100000000;
+ if (--i == 0) {
+ *s++ = '0' + digit;
+ len = s - buf;
+ s = buf;
+ goto donefmt;
+ }
+ n = ((n << 1) + (n << 3));
+ }
+ }
+ /*NOTREACHED*/
+
+#if 0
+ case 'o': n = va_arg(ap, unsigned);
+ s = buf + 11;
+ do {
+ *--s = '0' + (n & 7);
+ n = (unsigned)n >> 3;
+ } while (n);
+ len = buf + 11 - s;
+ goto donefmt;
+#endif
+
+ case 'p': *out++ = '0', *out++ = 'x';
+ total += 2;
+ /*FALLTHROUGH*/
+ case 'X': /*FALLTHROUGH*/
+ case 'x': n = va_arg(ap, unsigned);
+ s = buf + 8;
+ do {
+ *--s = "0123456789abcdef"[n & 0xF];
+ n = (unsigned)n >> 4;
+ } while (n);
+ len = buf + 8 - s;
+ goto donefmt;
+
+ case 0: goto done;
+ case '0': if (width == 0) pad = '0'; /*FALLTHROUGH*/
+ default: if (c >= '0' && c <= '9')
+ width = ((width<<1) + (width<<3)) + (c - '0');
+ else {
+ buf[0] = c; /* handles case of '%' */
+ goto donefmt;
+ }
+ }
+ }
+ /*NOTREACHED*/
+ donefmt:
+ if (len < width) {
+ total += width;
+ if (rightjust)
+ do { *out++ = pad; } while (len < --width);
+ } else
+ total += len;
+ for(n = len; n > 0; n--) *out++ = *s++;
+ for (; len < width; len++) *out++ = space;
+ }
+ }
+done:
+ return total;
+}
+
+int tiny_sprintf(char *out, const char *fmt, ...)
+{
+ int n = 0;
+ va_list ap;
+ va_start(ap, fmt);
+ n = tiny_vsprintf(out, fmt, ap);
+ va_end(ap);
+ return n;
+}
diff --git a/hifi/xaf/hifi-dpf/core/xf-core.c b/hifi/xaf/hifi-dpf/core/xf-core.c
new file mode 100644
index 00000000..95bca129
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/xf-core.c
@@ -0,0 +1,709 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-core.c
+ *
+ * DSP processing framework core
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG CORE
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Tracing tags
+ ******************************************************************************/
+
+/* ...general initialization sequence */
+TRACE_TAG(INIT, 1);
+
+/* ...message dispatching */
+TRACE_TAG(DISP, 1);
+
+/* ...client registration procedures */
+TRACE_TAG(REG, 1);
+
+/* ...ports routing/unrouting */
+TRACE_TAG(ROUTE, 1);
+
+#ifdef XAF_PROFILE_DSP
+/* ... MCPS/profile info */
+#include "xa_profiler.h"
+#endif
+/*******************************************************************************
+ * Internal helpers
+ ******************************************************************************/
+
+/* ...translate client-id into component handle */
+static inline xf_component_t * xf_client_lookup(xf_core_data_t *cd, u32 client)
+{
+ xf_cmap_link_t *link = &cd->cmap[client];
+
+ /* ...if link pointer is less than XF_CFG_MAX_CLIENTS, it is a free descriptor */
+ return (link->next > XF_CFG_MAX_CLIENTS ? link->c : NULL);
+}
+
+/* ...allocate client-id */
+static inline u32 xf_client_alloc(xf_core_data_t *cd)
+{
+ u32 client = cd->free;
+
+ /* ...advance list head to next free id */
+ (client < XF_CFG_MAX_CLIENTS ? cd->free = cd->cmap[client].next : 0);
+
+ return client;
+}
+
+/* ...recycle client-id */
+static inline void xf_client_free(xf_core_data_t *cd, u32 client)
+{
+ /* ...put client into the head of the free id list */
+ cd->cmap[client].next = cd->free, cd->free = client;
+}
+
+/*******************************************************************************
+ * Process commands to a proxy
+ ******************************************************************************/
+
+/* ...register new client */
+static int xf_proxy_register(u32 core, xf_message_t *m)
+{
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+ u32 src = XF_MSG_SRC(m->id);
+ u32 client;
+ xf_component_t *component;
+
+ /* ...allocate new client-id */
+ XF_CHK_ERR((client = xf_client_alloc(cd)) != XF_CFG_MAX_CLIENTS, -EBUSY);
+
+ /* ...create component via class factory */
+ if ((component = xf_component_factory(core, m->buffer, m->length)) == NULL)
+ {
+ TRACE(ERROR, _x("Component creation failed"));
+
+ /* ...recycle client-id */
+ xf_client_free(cd, client);
+
+ /* ...return generic out-of-memory code always (tbd) */
+ return -ENOMEM;
+ }
+
+ /* ...register component in a map */
+ cd->cmap[client].c = component;
+
+ /* ...set component "default" port specification ("destination") */
+ component->id = __XF_PORT_SPEC(core, client, 0);
+
+ /* ...adjust session-id to include newly created component-id */
+ m->id = __XF_MSG_ID(src, component->id);
+
+ /* ...do system-specific registration of component within IPC layer */
+ xf_ipc_component_addref(m->id);
+
+ TRACE(REG, _b("registered client: %u:%u (%s)"), core, client, (xf_id_t)m->buffer);
+
+ /* ...and return success to remote proxy (zero-length output) */
+ xf_response_ok(m);
+
+ return 0;
+}
+
+/* ...shared buffer allocation request */
+static int xf_proxy_alloc(u32 core, xf_message_t *m)
+{
+ /* ...command is valid only if shared memory interface for core is specified */
+ XF_CHK_ERR(xf_shmem_enabled(core), -EPERM);
+
+ /* ...allocate shared memory buffer (system-specific function; may fail) */
+ xf_shmem_alloc(core, m);
+
+ /* ...pass result to remote proxy (on success buffer is non-null) */
+ xf_response(m);
+
+ return 0;
+}
+
+/* ...shared buffer freeing request */
+static int xf_proxy_free(u32 core, xf_message_t *m)
+{
+ /* ...command is valid only if shared memory interface for core is specified */
+ XF_CHK_ERR(xf_shmem_enabled(core), -EPERM);
+
+ /* ...pass buffer freeing request to system-specific function */
+ xf_shmem_free(core, m);
+
+ /* ...return success to remote proxy (function never fails) */
+ xf_response(m);
+
+ return 0;
+}
+
+#if 0
+/* ...port routing command processing */
+static int xf_proxy_route(u32 core, xf_message_t *m)
+{
+ xf_route_port_msg_t *cmd = m->buffer;
+ u32 src = cmd->src;
+ u32 dst = cmd->dst;
+ xf_component_t *component;
+ xf_output_port_t *port;
+
+ /* ...source component must reside on the local core */
+ XF_CHK_ERR(XF_MSG_SRC_CORE(src) == core, -EINVAL);
+
+ /* ...make sure the "src" component is valid ("dst" may reside on other core) */
+ if ((component = xf_client_lookup(XF_CORE_DATA(core), XF_PORT_CLIENT(src))) == NULL)
+ {
+ TRACE(ERROR, _x("Source port lookup failed: %x"), src);
+ return -ENOENT;
+ }
+ else if (!component->port || !(port = component->port(component, XF_PORT_ID(src))))
+ {
+ TRACE(ERROR, _b("Source port doesn't exist: %x"), src);
+ return -ENOENT;
+ }
+ else if (xf_output_port_routed(port))
+ {
+ TRACE(ERROR, _b("Source port is already routed: %x"), src);
+ return -EBUSY;
+ }
+
+ /* ...route output port with source port set as destination */
+ XF_CHK_API(xf_output_port_route(port, __XF_MSG_ID(dst, src), cmd->alloc_number, cmd->alloc_size, cmd->alloc_align));
+
+ TRACE(ROUTE, _b("Ports routed: %03x -> %03x"), src, dst);
+
+ /* ...invoke component data-processing function directly (ignore errors? - tbd) */
+ component->entry(component, NULL);
+
+ /* ...return success result code (no output attached) */
+ xf_response_ok(m);
+
+ return 0;
+}
+
+/* ...disconnect ports */
+static int xf_proxy_unroute(u32 core, xf_message_t *m)
+{
+ xf_unroute_port_msg_t *cmd = m->buffer;
+ u32 src = cmd->src;
+ xf_component_t *component;
+ xf_output_port_t *port;
+
+ /* ...source component must reside on the local core */
+ XF_CHK_ERR(XF_MSG_SRC_CORE(src) == core, -EINVAL);
+
+ /* ...lookup source (output) port */
+ if ((component = xf_client_lookup(XF_CORE_DATA(core), XF_PORT_CLIENT(src))) == NULL)
+ {
+ TRACE(ERROR, _b("Source port lookup failed: %x"), src);
+ return -ENOENT;
+ }
+ else if (!component->port || !(port = component->port(component, XF_PORT_ID(src))))
+ {
+ TRACE(ERROR, _b("Source port doesn't exist: %x"), src);
+ return -ENOENT;
+ }
+ else if (!xf_output_port_routed(port))
+ {
+ /* ...port is not routed; satisfy immediately */
+ goto done;
+ }
+ else if (!xf_output_port_idle(port))
+ {
+ TRACE(ERROR, _b("Source port is not idle: %x"), src);
+ return -EBUSY;
+ }
+
+ /* ...unroute port (call must succeed) */
+ xf_output_port_unroute(port);
+
+ /* ...we cannot satisfy the command now, and need to propagate it to a sink - tbd */
+ //return 0;
+
+done:
+ /* ...pass success result code to caller */
+ xf_response_ok(m);
+
+ return 0;
+}
+#endif
+
+/* ...fill-this-buffer command processing */
+static int xf_proxy_output(u32 core, xf_message_t *m)
+{
+ /* ...determine destination "client" */
+ switch (XF_MSG_SRC_CLIENT(m->id))
+ {
+#if XF_TRACE_REMOTE
+ case 0:
+ /* ...destination is a tracer facility; submit buffer to tracer */
+ xf_trace_submit(core, m);
+ return 0;
+#endif
+
+ default:
+ /* ...unrecognized destination; return general failure response */
+ return XF_CHK_ERR(0, -EINVAL);
+ }
+}
+
+/* ...flush command processing */
+static int xf_proxy_flush(u32 core, xf_message_t *m)
+{
+ /* ...determine destination "client" */
+ switch (XF_MSG_SRC_CLIENT(m->id))
+ {
+#if XF_TRACE_REMOTE
+ case 0:
+ /* ...destination is a tracer facility; flush current buffer */
+ xf_trace_flush(core, m);
+ return 0;
+#endif
+
+ default:
+ /* ...unrecognized destination; return general failure response */
+ return XF_CHK_ERR(0, -EINVAL);
+ }
+}
+
+/* ...proxy command processing table */
+static int (* const xf_proxy_cmd[])(u32, xf_message_t *) =
+{
+ [XF_OPCODE_TYPE(XF_REGISTER)] = xf_proxy_register,
+ [XF_OPCODE_TYPE(XF_ALLOC)] = xf_proxy_alloc,
+ [XF_OPCODE_TYPE(XF_FREE)] = xf_proxy_free,
+#if 0
+ [XF_OPCODE_TYPE(XF_ROUTE)] = xf_proxy_route,
+ [XF_OPCODE_TYPE(XF_UNROUTE)] = xf_proxy_unroute,
+#endif
+ [XF_OPCODE_TYPE(XF_FILL_THIS_BUFFER)] = xf_proxy_output,
+ [XF_OPCODE_TYPE(XF_FLUSH)] = xf_proxy_flush,
+};
+
+/* ...total number of commands supported */
+#define XF_PROXY_CMD_NUM (sizeof(xf_proxy_cmd) / sizeof(xf_proxy_cmd[0]))
+
+/* ...process commands to a proxy */
+static void xf_proxy_command(u32 core, xf_message_t *m)
+{
+ u32 opcode = m->opcode;
+ int res;
+
+ /* ...dispatch command to proper hook */
+ if (XF_OPCODE_TYPE(opcode) < XF_PROXY_CMD_NUM)
+ {
+ if ((res = xf_proxy_cmd[XF_OPCODE_TYPE(opcode)](core, m)) >= 0)
+ {
+ /* ...command processed successfully; do nothing */
+ return;
+ }
+ }
+ else
+ {
+ TRACE(ERROR, _x("invalid opcode: %x"), opcode);
+ }
+
+ /* ...command processing failed; return generic failure response */
+ xf_response_err(m);
+}
+
+/*******************************************************************************
+ * Message completion helper
+ ******************************************************************************/
+
+/* ...put message into local IPC command queue on remote core (src != dst) */
+static inline void xf_msg_local_ipc_put(u32 src, u32 dst, xf_message_t *m)
+{
+ xf_core_rw_data_t *rw = XF_CORE_RW_DATA(dst);
+ int first;
+
+ /* ...flush message payload if needed */
+ if (XF_LOCAL_IPC_NON_COHERENT)
+ {
+ /* ...it may be a command with output payload only - tbd */
+ XF_PROXY_FLUSH(m->buffer, m->length);
+ }
+
+ /* ...acquire mutex to target rw-data (running on source core) */
+ xf_mutex_lock(src);
+
+ /* ...assure memory coherency as needed */
+ if (XF_LOCAL_IPC_NON_COHERENT)
+ {
+ /* ...invalidate local queue data */
+ XF_PROXY_INVALIDATE(&rw->local, sizeof(rw->local));
+
+ /* ...place message into queue */
+ first = xf_msg_enqueue(&rw->local, m);
+
+ /* ...flush both queue and message data */
+ XF_PROXY_FLUSH(&rw->local, sizeof(rw->local)), XF_PROXY_FLUSH(m, sizeof(*m));
+ }
+ else
+ {
+ /* ...just enqueue the message */
+ first = xf_msg_enqueue(&rw->local, m);
+ }
+
+ /* ...release global rw-memory access lock */
+ xf_mutex_unlock(src);
+
+ /* ...signal IPI interrupt on destination core as needed */
+ (first ? xf_ipi_assert(dst), 1 : 0);
+}
+
+/* ...dequeue message from core-specific dispatch queue */
+static inline xf_message_t * xf_msg_local_ipc_get(u32 core)
+{
+ xf_core_rw_data_t *rw = XF_CORE_RW_DATA(core);
+ xf_message_t *m;
+
+ /* ...retrieve message from queue in atomic fashion */
+ xf_mutex_lock(core);
+
+ /* ...process memory coherency as required */
+ if (XF_LOCAL_IPC_NON_COHERENT)
+ {
+ /* ...inavlidate local rw-data */
+ XF_PROXY_INVALIDATE(&rw->local, sizeof(rw->local));
+
+ /* ...get message from the queue */
+ if ((m = xf_msg_dequeue(&rw->local)) != NULL)
+ {
+ /* ...flush rw-queue data */
+ XF_PROXY_FLUSH(&rw->local, sizeof(rw->local));
+ }
+ }
+ else
+ {
+ /* ...just dequeue message from the queue */
+ m = xf_msg_dequeue(&rw->local);
+ }
+
+ /* ...release rw-memory access lock */
+ xf_mutex_unlock(core);
+
+ /* ...invalidate message header and data as needed */
+ if (XF_LOCAL_IPC_NON_COHERENT && m != NULL)
+ {
+ /* ...invalidate message header */
+ XF_PROXY_INVALIDATE(m, sizeof(*m));
+
+ /* ...and data if needed (it may not be always needed - tbd) */
+ (m->length ? XF_PROXY_INVALIDATE(m->buffer, m->length) : 0);
+ }
+
+ /* ...return message */
+ return m;
+}
+
+/* ...retrieve message from local queue (protected from ISR) */
+static inline int xf_msg_local_put(u32 core, xf_message_t *m)
+{
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+ int first;
+ u32 status;
+
+ /* ...use interrupt masking protocol to protect message queue */
+ status = xf_isr_disable(core);
+ first = xf_msg_enqueue(&cd->queue, m);
+ xf_isr_restore(core, status);
+
+ return first;
+}
+
+/* ...retrieve message from local queue (protected from ISR) */
+static inline xf_message_t * xf_msg_local_get(u32 core)
+{
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+ xf_message_t *m;
+ u32 status;
+
+ /* ...use interrupt masking protocol to protect message queue */
+ status = xf_isr_disable(core);
+ m = xf_msg_dequeue(&cd->queue);
+ xf_isr_restore(core, status);
+
+ return m;
+}
+
+/* ...retrieve message from local queue (protected from ISR) */
+static inline xf_message_t * xf_msg_local_response_get(u32 core)
+{
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+ xf_message_t *m;
+ u32 status;
+
+ /* ...use interrupt masking protocol to protect message queue */
+ status = xf_isr_disable(core);
+ m = xf_msg_dequeue(&cd->response);
+ xf_isr_restore(core, status);
+
+ return m;
+}
+
+/* ...call component data processing function */
+static inline void xf_core_process(xf_component_t *component)
+{
+ u32 id = component->id;
+
+ /* ...client look-up successfull */
+ TRACE(DISP, _b("core[%u]::client[%u]::process"), XF_PORT_CORE(id), XF_PORT_CLIENT(id));
+
+ /* ...call data-processing interface */
+ if (component->entry(component, NULL) < 0)
+ {
+ TRACE(ERROR, _b("execution error (ignored)"));
+ }
+}
+
+/* ...dispatch message queue execution */
+static inline void xf_core_dispatch(xf_core_data_t *cd, u32 core, xf_message_t *m)
+{
+ u32 client;
+ xf_component_t *component;
+
+ /* ...do client-id/component lookup */
+ if (XF_MSG_DST_PROXY(m->id))
+ {
+ TRACE(DISP, _b("core[%u]::proxy-cmd(id=%x, opcode=%x)"), core, m->id, m->opcode);
+
+ /* ...process message addressed to proxy */
+ xf_proxy_command(core, m);
+
+ /* ...do not like this return statement... - tbd */
+ return;
+ }
+
+ /* ...message goes to local component */
+ client = XF_MSG_DST_CLIENT(m->id);
+
+ /* ...check if client is alive */
+ if ((component = xf_client_lookup(cd, client)) != NULL)
+ {
+ /* ...client look-up successfull */
+ TRACE(DISP, _b("core[%u]::client[%u]::cmd(id=%x, opcode=%x)"), core, client, m->id, m->opcode);
+
+ /* ...pass message to component entry point */
+ if (component->entry(component, m) < 0)
+ {
+ /* ...call component destructor */
+ if (component->exit(component, m) == 0)
+ {
+ /* ...component cleanup completed; recycle component-id */
+ xf_client_free(cd, client);
+
+ /* ...do system-specific deregistration of component within IPC layer */
+ xf_ipc_component_rmref(__XF_PORT_SPEC(core, client, 0));
+ }
+ }
+ }
+ else
+ {
+ TRACE(DISP, _b("Discard message id=%x - client %u:%u not registered"), m->id, core, client);
+
+ /* ...complete message with general failure response */
+ xf_response_err(m);
+ }
+}
+
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+/* ...submit message for instant execution on some core */
+void xf_msg_submit(xf_message_t *m)
+{
+ u32 src = XF_MSG_SRC_CORE(m->id);
+ u32 dst = XF_MSG_DST_CORE(m->id);
+
+ /* ...check if message shall go through local IPC layer */
+ if (src ^ dst)
+ {
+ /* ...put message into local IPC queue */
+ xf_msg_local_ipc_put(src, dst, m);
+ }
+ else
+ {
+ /* ...message is addressed to same core */
+ xf_msg_local_put(src, m);
+ }
+}
+
+/* ...complete message and pass response to a caller */
+void xf_msg_complete(xf_message_t *m)
+{
+ u32 src = XF_MSG_SRC(m->id);
+ u32 dst = XF_MSG_DST(m->id);
+
+ /* ...swap src/dst specifiers */
+ m->id = __XF_MSG_ID(dst, src);
+
+ /* ...check if message goes to remote IPC layer */
+ if (XF_MSG_DST_PROXY(m->id))
+ {
+ /* ...return message to proxy */
+ xf_msg_proxy_complete(m);
+ }
+ else
+ {
+ /* ...destination is within DSP cluster; check if that is a data buffer */
+ switch (m->opcode)
+ {
+ case XF_EMPTY_THIS_BUFFER:
+ /* ...emptied buffer goes back to the output port */
+ m->opcode = XF_FILL_THIS_BUFFER;
+ break;
+
+ case XF_FILL_THIS_BUFFER:
+ /* ...filled buffer is passed to the input port */
+ m->opcode = XF_EMPTY_THIS_BUFFER;
+ break;
+ }
+
+ /* ...submit message for execution */
+ xf_msg_submit(m);
+ }
+}
+
+/* ...initialize per-core framework data */
+int xf_core_init(u32 core)
+{
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+ xf_cmap_link_t *link;
+ u32 i;
+
+ /* ...create list of free client descriptors */
+ for (link = &cd->cmap[i = 0]; i < XF_CFG_MAX_CLIENTS; i++, link++)
+ {
+ link->next = i + 1;
+ }
+
+ /* ...set head of free clients list */
+ cd->free = 0;
+
+ /* ...initialize local queue scheduler */
+ xf_sched_init(&cd->sched);
+
+ /* ...initialize IPI subsystem */
+ XF_CHK_API(xf_ipi_init(core));
+
+ /* ...initialize shared read-write memory */
+ XF_CHK_API(xf_shmem_enabled(core) ? xf_shmem_init(core) : 0);
+
+ /* ...initialize scratch memory */
+ XF_CHK_ERR(cd->scratch = xf_scratch_mem_init(core), -ENOMEM);
+
+ /* ...okay... it's all good */
+ TRACE(INIT, _b("core-%u initialized"), core);
+
+ return 0;
+}
+
+/* ...core executive loop function */
+void xf_core_service(u32 core)
+{
+ xf_core_data_t *cd = &xf_core_data[core];
+ u32 status;
+ xf_message_t *m;
+ xf_task_t *t;
+
+#ifdef XAF_PROFILE_DSP
+ START_TIME_XA_PROFILER(prof);
+#endif
+ do
+ {
+ /* ...clear local status change */
+ status = 0;
+
+ /* ...if core is servicing shared memory with AP, do it first - actually, they all need to support it */
+ if (xf_shmem_enabled(core))
+ {
+ /* ...process all commands */
+ xf_shmem_process_queues(core);
+ }
+
+ /* ...check if we have a backlog message placed into interim queue */
+ while ((m = xf_msg_local_ipc_get(core)) || (m = xf_msg_local_get(core)))
+ {
+ /* ...dispatch message execution */
+ xf_core_dispatch(cd, core, m);
+
+ /* ...set local status change */
+ status = 1;
+ }
+
+ /* ...check if we have pending responses (submitted from ISR) we need to process */
+ while ((m = xf_msg_local_response_get(core)) != NULL)
+ {
+ /* ...call completion handler on current stack */
+ xf_msg_complete(m);
+
+ /* ...set local status change */
+ status = 1;
+
+ }
+
+ /* ...if scheduler queue is empty, break the loop and pause the core */
+ if ((t = xf_sched_get(&cd->sched)) != NULL)
+ {
+ /* ...data-processing execution (ignore internal errors) */
+ xf_core_process((xf_component_t *)t);
+
+ /* ...set local status change */
+ status = 1;
+ }
+ }
+ while (status);
+
+#ifdef XAF_PROFILE_DSP
+ STOP_TIME_XA_PROFILER(prof);
+
+ if(prof.g_output_bytes)
+ {
+ unsigned long output_samples = prof.g_output_bytes;
+ output_samples >>= (prof.channels == 2 ? 1 : 0);
+ output_samples >>= (prof.pcm_width == 24 ? 2 : 1);
+
+ COMPUTE_MHZ_XA_PROFILER(prof, output_samples, prof.sample_rate, 0);
+
+ prof.g_output_bytes = prof.cycles = 0; /* reset counters */
+ }
+#endif
+
+}
+
+/* ...global data initialization function */
+int xf_global_init(void)
+{
+ /* ...what global data we have to initialize? - tbd */
+ TRACE(INIT, _b("Global data initialized"));
+
+ return 0;
+}
diff --git a/hifi/xaf/hifi-dpf/core/xf-io.c b/hifi/xaf/hifi-dpf/core/xf-io.c
new file mode 100644
index 00000000..4ec415c2
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/xf-io.c
@@ -0,0 +1,644 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-io.c
+ *
+ * Generic input/output ports handling
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG IO
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Tracing configuration
+ ******************************************************************************/
+
+TRACE_TAG(INIT, 1);
+TRACE_TAG(INPUT, 1);
+TRACE_TAG(OUTPUT, 1);
+TRACE_TAG(ROUTE, 1);
+
+/*******************************************************************************
+ * Input port API
+ ******************************************************************************/
+
+/* ...initialize input port structure */
+int xf_input_port_init(xf_input_port_t *port, u32 size, u32 align, u32 core)
+{
+ /* ...allocate local internal buffer of particular size and alignment */
+ if (size)
+ {
+ /* ...internal buffer is used */
+ XF_CHK_ERR(port->buffer = xf_mem_alloc(size, align, core, 0), -ENOMEM);
+ }
+ else
+ {
+ /* ...no internal buffering is used */
+ port->buffer = NULL;
+ }
+
+ /* ...initialize message queue */
+ xf_msg_queue_init(&port->queue);
+
+ /* ...set buffer size */
+ port->length = size;
+
+ /* ...enable input by default */
+ port->flags = XF_INPUT_FLAG_ENABLED | XF_INPUT_FLAG_CREATED;
+
+ /* ...mark buffer is empty */
+ port->filled = 0, port->access = NULL;
+
+ TRACE(INIT, _b("input-port[%p] created - %p@%u[%u]"), port, port->buffer, align, size);
+
+ return 0;
+}
+
+/* ...put message into input port queue; return non-zero if queue was empty */
+int xf_input_port_put(xf_input_port_t *port, xf_message_t *m)
+{
+ /* ...check if input is enabled */
+ if ((port->flags & XF_INPUT_FLAG_ENABLED) == 0)
+ {
+ /* ...input disabled; this is an error condition, likely */
+ TRACE(INPUT, _b("input-port[%p] disabled"), port);
+
+ /* ...release the message instantly */
+ xf_response_ok(m);
+
+ /* ...buffer has not been accepted - no actions to take */
+ return 0;
+ }
+ else if (m->length == 0)
+ {
+ /* ...it is forbidden to pass more than one zero-length message */
+ BUG(port->flags & XF_INPUT_FLAG_EOS, _x("invalid state: %x"), port->flags);
+
+ /* ...received a message with zero-length; mark end-of-stream condition */
+ port->flags ^= XF_INPUT_FLAG_ENABLED | XF_INPUT_FLAG_EOS;
+
+ /* ...still enqueue that zero-length message; it will be processed afterwards */
+ TRACE(INPUT, _b("input-port[%p]: zero-length buffer received"), port);
+ }
+ else
+ {
+ TRACE(INPUT, _b("input-port[%p]: buffer received - %u bytes"), port, m->length);
+ }
+
+ /* ...enqueue message and set access pointer as needed */
+ if (xf_msg_enqueue(&port->queue, m))
+ {
+ /* ...first message put - set access pointer and length */
+ port->access = m->buffer, port->remaining = m->length;
+
+ /* ...if first message is empty, mark port is done */
+ (!port->access ? port->flags ^= XF_INPUT_FLAG_EOS | XF_INPUT_FLAG_DONE : 0);
+
+ /* ...return non-zero to indicate the first buffer is placed into port */
+ return 1;
+ }
+ else
+ {
+ /* ...subsequent message placed into buffer */
+ return 0;
+ }
+}
+
+/* ...internal helper - input message completion */
+static inline int xf_input_port_complete(xf_input_port_t *port)
+{
+ /* ...dequeue message from queue */
+ xf_message_t *m = xf_msg_dequeue(&port->queue);
+
+ /* ...message cannot be NULL */
+ BUG(m == NULL, _x("invalid port state"));
+
+ /* ...complete current message (EMPTY-THIS-BUFFER always; no length adjustment) */
+ xf_response(m);
+
+ /* ...set up next head */
+ if ((m = xf_msg_queue_head(&port->queue)) != NULL)
+ {
+ /* ...set new access pointers */
+ port->access = m->buffer, port->remaining = m->length;
+
+ /* ...return indication that there is an input message */
+ return 1;
+ }
+ else
+ {
+ /* ...no more messages; reset access pointer */
+ port->access = NULL;
+
+ /* ...return indication that input port has no data available */
+ return 0;
+ }
+}
+
+/* ...fill-in required amount of data into input port buffer */
+int xf_input_port_fill(xf_input_port_t *port)
+{
+ u32 filled = port->filled;
+ u32 remaining = port->remaining;
+ u32 copied = 0;
+ s32 n;
+
+ /* ...function shall not be called if no internal buffering is used */
+ BUG(xf_input_port_bypass(port), _x("Invalid transaction"));
+
+ /* ...if there is no message pending, bail out */
+ if (!xf_msg_queue_head(&port->queue))
+ {
+ TRACE(INPUT, _b("No message ready"));
+ return 0;
+ }
+
+ /* ...calculate total amount of bytes we need to copy */
+ n = (s32)(port->length - filled);
+
+ /* ...get at most "n" bytes from input message(s) buffer(s) */
+ while (n > 0)
+ {
+ u32 k;
+
+ /* ...determine the size of the chunk to copy */
+ ((k = remaining) > n ? k = n : 0);
+
+ /* ...process zero-length input message separately */
+ if (k == 0)
+ {
+ /* ...end-of-stream condition must be set */
+ BUG((port->flags & XF_INPUT_FLAG_EOS) == 0, _x("port[%p]: invalid state: %x"), port, port->flags);
+
+ /* ...mark stream is completed */
+ port->flags ^= XF_INPUT_FLAG_EOS | XF_INPUT_FLAG_DONE;
+
+ /* ...reset total amount of bytes to fill */
+ n = 0;
+
+ /* ...do not release message yet */
+ TRACE(INPUT, _b("input-port[%p] done"), port);
+
+ /* ...and break the loop */
+ break;
+ }
+
+ /* ...buffer must be set */
+ BUG(!port->access, _x("invalid port state"));
+
+ /* ...get required amount from input buffer */
+ memcpy(port->buffer + filled, port->access, k), port->access += k;
+
+ /* ...advance buffer positions */
+ filled += k, copied += k, n -= k;
+
+ /* ...check if input buffer is processed completely */
+ if ((remaining -= k) == 0)
+ {
+ if (!xf_input_port_complete(port))
+ {
+ /* ...no more input messages; break the loop */
+ break;
+ }
+ else
+ {
+ /* ...update remaining counter */
+ remaining = port->remaining;
+ }
+ }
+ }
+
+ /* ...update buffer positions */
+ port->filled = filled, port->remaining = remaining;
+
+ /* ...return indicator whether input buffer is prefilled */
+ return (n == 0);
+}
+
+/* ...pad input buffer with given pattern */
+void xf_input_port_pad(xf_input_port_t *port, u8 pad)
+{
+ u32 filled = port->filled;
+ s32 k;
+
+ /* ...do padding if port buffer is not filled */
+ if ((k = port->length - filled) > 0)
+ {
+ memset(port->buffer + filled, pad, k);
+
+ /* ...indicate port is filled */
+ port->filled = port->length;
+ }
+}
+
+/* ...consume input buffer data */
+void xf_input_port_consume(xf_input_port_t *port, u32 n)
+{
+ /* ...check whether input port is in bypass mode */
+ if (xf_input_port_bypass(port))
+ {
+ /* ...port is in bypass mode; advance access pointer */
+ if ((port->remaining -= n) == 0)
+ {
+ /* ...complete message and try to rearm input port */
+ xf_input_port_complete(port);
+
+ /* ...check if end-of-stream flag is set */
+ if (xf_msg_queue_head(&port->queue) && !port->access)
+ {
+ BUG((port->flags & XF_INPUT_FLAG_EOS) == 0, _x("port[%p]: invalid state: %x"), port, port->flags);
+
+ /* ...mark stream is completed */
+ port->flags ^= XF_INPUT_FLAG_EOS | XF_INPUT_FLAG_DONE;
+
+ TRACE(INPUT, _b("input-port[%p] done"), port);
+ }
+ }
+ else
+ {
+ /* ...advance message buffer pointer */
+ port->access += n;
+ }
+ }
+ else if (port->filled > n)
+ {
+ u32 k = port->filled - n;
+
+ /* ...move tail of buffer to the head (safe to use memcpy) */
+ memcpy(port->buffer, port->buffer + n, k);
+
+ /* ...adjust filled position */
+ port->filled = k;
+ }
+ else
+ {
+ /* ...entire buffer is consumed; reset fill level */
+ port->filled = 0;
+ }
+}
+
+/* ...purge input port queue */
+void xf_input_port_purge(xf_input_port_t *port)
+{
+ xf_message_t *m;
+
+ /* ...bail out early if port is not created */
+ if (!xf_input_port_created(port)) return;
+
+ /* ...free all queued messages with generic "ok" response */
+ while ((m = xf_msg_dequeue(&port->queue)) != NULL)
+ {
+ xf_response_ok(m);
+ }
+
+ /* ...reset internal buffer position */
+ port->filled = 0, port->access = NULL;
+
+ /* ...reset port flags */
+ port->flags = (port->flags & ~__XF_INPUT_FLAGS(~0)) | XF_INPUT_FLAG_ENABLED | XF_INPUT_FLAG_CREATED;
+
+ TRACE(INPUT, _b("input-port[%p] purged"), port);
+}
+
+/* ...save flow-control message for propagated input port purging sequence */
+void xf_input_port_control_save(xf_input_port_t *port, xf_message_t *m)
+{
+ /* ...make sure purging sequence is not active */
+ BUG(port->flags & XF_INPUT_FLAG_PURGING, _x("invalid state: %x"), port->flags);
+
+ /* ...place message into internal queue */
+ xf_msg_enqueue(&port->queue, m);
+
+ /* ...set port purging flag */
+ port->flags ^= XF_INPUT_FLAG_PURGING;
+
+ TRACE(INPUT, _b("port[%p] start purge sequence"), port);
+}
+
+/* ...mark flushing sequence is completed */
+void xf_input_port_purge_done(xf_input_port_t *port)
+{
+ /* ...make sure flushing sequence is ongoing */
+ BUG((port->flags & XF_INPUT_FLAG_PURGING) == 0, _x("invalid state: %x"), port->flags);
+
+ /* ...complete saved flow-control message */
+ xf_response_ok(xf_msg_dequeue(&port->queue));
+
+ /* ...clear port purging flag */
+ port->flags ^= XF_INPUT_FLAG_PURGING;
+
+ TRACE(INPUT, _b("port[%p] purge sequence completed"), port);
+}
+
+/* ...destroy input port data */
+void xf_input_port_destroy(xf_input_port_t *port, u32 core)
+{
+ /* ...bail out earlier if port is not created */
+ if (!xf_input_port_created(port)) return;
+
+ /* ...deallocate input buffer if needed */
+ (port->buffer ? xf_mem_free(port->buffer, port->length, core, 0), port->buffer = NULL : 0);
+
+ /* ...reset input port flags */
+ port->flags = 0;
+
+ TRACE(INIT, _b("input-port[%p] destroyed"), port);
+}
+
+/*******************************************************************************
+ * Output port API
+ ******************************************************************************/
+
+/* ...initialize output port (structure must be zero-initialized) */
+int xf_output_port_init(xf_output_port_t *port, u32 size)
+{
+ /* ...initialize message queue */
+ xf_msg_queue_init(&port->queue);
+
+ /* ...set output buffer length */
+ port->length = size;
+
+ /* ...mark port is created */
+ port->flags = XF_OUTPUT_FLAG_CREATED;
+
+ TRACE(INIT, _b("output-port[%p] initialized"), port);
+
+ return 0;
+}
+
+/* ...route output port */
+int xf_output_port_route(xf_output_port_t *port, u32 id, u32 n, u32 length, u32 align)
+{
+ u32 core = XF_MSG_DST_CORE(id);
+ u32 shared = XF_MSG_SHARED(id);
+ xf_message_t *m;
+ u32 i;
+
+ /* ...allocate message pool for a port; extra message for control */
+ XF_CHK_API(xf_msg_pool_init(&port->pool, n + 1, core));
+
+ /* ...allocate required amount of buffers */
+ for (i = 1; i <= n; i++)
+ {
+ /* ...get message from pool (directly; bypass that "get" interface) */
+ m = xf_msg_pool_item(&port->pool, i);
+
+ /* ...wipe out message link pointer (debugging) */
+ m->next = NULL;
+
+ /* ...set message parameters */
+ m->id = id;
+ m->opcode = XF_FILL_THIS_BUFFER;
+ m->length = length;
+ m->buffer = xf_mem_alloc(length, align, core, shared);
+
+ /* ...if allocation failed, do a cleanup */
+ if (!m->buffer) goto error;
+
+ /* ...place message into output port */
+ xf_msg_enqueue(&port->queue, m);
+ }
+
+ /* ...setup flow-control message */
+ m = xf_output_port_control_msg(port);
+ m->id = id;
+ m->length = 0;
+ m->buffer = NULL;
+
+ /* ...wipe out message link pointer (debugging) */
+ m->next = NULL;
+
+ /* ...save port length */
+ port->length = length;
+
+ /* ...mark port is routed */
+ port->flags |= XF_OUTPUT_FLAG_ROUTED | XF_OUTPUT_FLAG_IDLE;
+
+ TRACE(ROUTE, _b("output-port[%p] routed: %x -> %x"), port, XF_MSG_DST(id), XF_MSG_SRC(id));
+
+ return 0;
+
+error:
+ /* ...allocation failed; do a cleanup */
+ while (--i)
+ {
+ m = xf_msg_pool_item(&port->pool, i);
+
+ /* ...free item */
+ xf_mem_free(m->buffer, length, core, shared);
+ }
+
+ /* ...destroy pool data */
+ xf_msg_pool_destroy(&port->pool, core);
+
+ return -ENOMEM;
+}
+
+/* ...start output port unrouting sequence */
+void xf_output_port_unroute_start(xf_output_port_t *port, xf_message_t *m)
+{
+ /* ...port must be routed */
+ BUG(!xf_output_port_routed(port), _x("invalid state: %x"), port->flags);
+
+ /* ...save message in the queue */
+ port->unroute = m;
+
+ /* ...put port unrouting flag */
+ port->flags |= XF_OUTPUT_FLAG_UNROUTING;
+}
+
+/* ...complete port unrouting sequence */
+void xf_output_port_unroute_done(xf_output_port_t *port)
+{
+ xf_message_t *m;
+
+ /* ...make sure we have an outstanding port unrouting sequence */
+ BUG(!xf_output_port_unrouting(port), _x("invalid state: %x"), port->flags);
+
+ /* ...retrieve enqueued control-flow message */
+ m = port->unroute, port->unroute = NULL;
+
+ /* ...destroy port buffers */
+ xf_output_port_unroute(port);
+
+ /* ...and pass response to the caller */
+ xf_response_ok(m);
+}
+
+/* ...unroute output port and destroy all memory buffers allocated */
+void xf_output_port_unroute(xf_output_port_t *port)
+{
+ xf_message_t *m = xf_output_port_control_msg(port);
+ u32 core = XF_MSG_DST_CORE(m->id);
+ u32 shared = XF_MSG_SHARED(m->id);
+ u32 n = port->pool.n - 1;
+ u32 i;
+
+ /* ...free all messages (we are running on "dst" core) */
+ for (i = 1; i <= n; i++)
+ {
+ /* ...directly obtain message item */
+ m = xf_msg_pool_item(&port->pool, i);
+
+ /* ...free message buffer (must exist) */
+ xf_mem_free(m->buffer, port->length, core, shared);
+ }
+
+ /* ...destroy pool data */
+ xf_msg_pool_destroy(&port->pool, core);
+
+ /* ...reset all flags */
+ port->flags = XF_OUTPUT_FLAG_CREATED;
+
+ /* ...reset message queue (it is empty again) */
+ xf_msg_queue_init(&port->queue);
+
+ TRACE(ROUTE, _b("output-port[%p] unrouted"), port);
+}
+
+/* ...put next message to the port */
+int xf_output_port_put(xf_output_port_t *port, xf_message_t *m)
+{
+ /* ...in case of port unrouting sequence the flag returned will always be 0 */
+ return xf_msg_enqueue(&port->queue, m);
+}
+
+/* ...retrieve next message from the port */
+void * xf_output_port_data(xf_output_port_t *port)
+{
+ xf_message_t *m = xf_msg_queue_head(&port->queue);
+
+ /* ...bail out if there is nothing enqueued */
+ if (m == NULL) return NULL;
+
+ /* ...it is not permitted to access port data when port is being unrouted */
+ BUG(xf_output_port_unrouting(port), _x("invalid transaction"));
+
+ /* ...make sure message length is sane */
+ BUG(m->length < port->length, _x("Insufficient buffer length: %u < %u"), m->length, port->length);
+
+ /* ...return access buffer pointer */
+ return m->buffer;
+}
+
+/* ...produce output message marking amount of bytes produced */
+int xf_output_port_produce(xf_output_port_t *port, u32 n)
+{
+ xf_message_t *m = xf_msg_dequeue(&port->queue);
+
+ /* ...message cannot be NULL */
+ BUG(m == NULL, _x("Invalid transaction"));
+
+ /* ...it is not permitted to invoke this when port is being unrouted (or flushed - tbd) */
+ BUG(xf_output_port_unrouting(port), _x("invalid transaction"));
+
+ /* ...complete message with specified amount of bytes produced */
+ xf_response_data(m, n);
+
+ /* ...clear port idle flag (technically, not needed for unrouted port) */
+ port->flags &= ~XF_OUTPUT_FLAG_IDLE;
+
+ /* ...return indication of pending message availability */
+ return (xf_msg_queue_head(&port->queue) != NULL);
+}
+
+/* ...flush output port */
+int xf_output_port_flush(xf_output_port_t *port, u32 opcode)
+{
+ xf_message_t *m;
+
+ /* ...if port is routed, we shall pass flush command to sink port */
+ if (xf_output_port_routed(port))
+ {
+ /* ...if port is idle, satisfy immediately */
+ if (port->flags & XF_OUTPUT_FLAG_IDLE) return 1;
+
+ /* ...start flushing sequence if not already started */
+ if ((port->flags & XF_OUTPUT_FLAG_FLUSHING) == 0)
+ {
+ /* ...put flushing flag */
+ port->flags ^= XF_OUTPUT_FLAG_FLUSHING;
+
+ /* ...get control message from associated pool */
+ m = xf_output_port_control_msg(port);
+
+ /* ...set flow-control operation */
+ m->opcode = opcode;
+
+ /* ...message is a command, but source and destination are swapped */
+ xf_response(m);
+ }
+
+ /* ...zero-result indicates the flushing is in progress */
+ return 0;
+ }
+ else
+ {
+ /* ...for non-routed port just complete all queued messages */
+ while ((m = xf_msg_dequeue(&port->queue)) != NULL)
+ {
+ /* ...pass generic zero-length "okay" response - tbd */
+ xf_response_ok(m);
+ }
+
+ /* ...non-zero result indicates the flushing is done */
+ return 1;
+ }
+}
+
+/* ...mark flushing sequence is completed */
+void xf_output_port_flush_done(xf_output_port_t *port)
+{
+ /* ...make sure flushing sequence is ongoing */
+ BUG((port->flags & XF_OUTPUT_FLAG_FLUSHING) == 0, _x("invalid state: %x"), port->flags);
+
+ /* ...clear flushing flag and set idle flag */
+ port->flags ^= XF_OUTPUT_FLAG_IDLE | XF_OUTPUT_FLAG_FLUSHING;
+
+ TRACE(OUTPUT, _b("port[%p] flush sequence completed"), port);
+}
+
+/* ...destroy output port */
+void xf_output_port_destroy(xf_output_port_t *port, u32 core)
+{
+ /* ...check if port is routed */
+ if (xf_output_port_routed(port))
+ {
+ /* ...port must be in idle state */
+ BUG(!xf_output_port_idle(port), _x("destroying non-idle port[%p]"), port);
+
+ /* ...unroute port */
+ xf_output_port_unroute(port);
+ }
+
+ /* ...reset port flags */
+ port->flags = 0;
+
+ TRACE(INIT, _b("output-port[%p] destroyed"), port);
+}
diff --git a/hifi/xaf/hifi-dpf/core/xf-isr.c b/hifi/xaf/hifi-dpf/core/xf-isr.c
new file mode 100644
index 00000000..4e2add1e
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/xf-isr.c
@@ -0,0 +1,68 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-isr.c
+ *
+ * DSP processing framework - code running from interrupt context
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG ISR
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * API functions definitions
+ ******************************************************************************/
+
+/* ...submit command message from interrupt context on local core */
+void xf_msg_schedule_isr(xf_message_t *m)
+{
+ u32 core = XF_MSG_DST_CORE(m->id);
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+
+ /* ...interrupt masking protocol is used for protecting local message queue */
+ if (xf_msg_enqueue(&cd->queue, m))
+ {
+ /* ...resume local scheduler if that is the first message */
+ xf_ipi_resume(core);
+ }
+}
+
+/* ...complete message from interrupt handler */
+void xf_msg_complete_isr(xf_message_t *m)
+{
+ u32 core = XF_MSG_DST_CORE(m->id);
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+
+ /* ...place message into response queue */
+ if (xf_msg_enqueue(&cd->response, m))
+ {
+ /* ...notify local scheduler if that is the first message */
+ xf_ipi_resume(core);
+ }
+}
diff --git a/hifi/xaf/hifi-dpf/core/xf-mem.c b/hifi/xaf/hifi-dpf/core/xf-mem.c
new file mode 100644
index 00000000..ce5d8a6a
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/xf-mem.c
@@ -0,0 +1,361 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-mem.c
+ *
+ * Dynamic memory allocator implementation (based on rb-tree index)
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG MM
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Tracing configuration
+ ******************************************************************************/
+
+TRACE_TAG(INIT, 1);
+
+/*******************************************************************************
+ * Internal helpers
+ ******************************************************************************/
+
+/* ...initialize block */
+static inline xf_mm_block_t * xf_mm_block_init(void *addr, u32 size)
+{
+ xf_mm_block_t *b = (xf_mm_block_t *)addr;
+
+ /* ...use 31 available bits of node color to keep aligned size */
+ return b->l_node.color = size, b;
+}
+
+/* ...check if the length of the block is less than given */
+static inline int xf_mm_block_length_less(xf_mm_block_t *b, u32 size)
+{
+ /* ...we don't really care about LSB of color */
+ return (b->l_node.color < size);
+}
+
+/* ...return exact block length */
+static inline u32 xf_mm_block_length(xf_mm_block_t *b)
+{
+ /* ...wipe out least-significant bit from node color */
+ return (b->l_node.color & ~1);
+}
+
+/* ...increase block length */
+static inline u32 xf_mm_block_length_add(xf_mm_block_t *b, u32 size)
+{
+ /* ...return exact block length after increase */
+ return ((b->l_node.color += size) & ~1);
+}
+
+/* ...decrease block length */
+static inline u32 xf_mm_block_length_sub(xf_mm_block_t *b, u32 size)
+{
+ /* ...return exact block length after decrease */
+ return ((b->l_node.color -= size) & ~1);
+}
+
+/*******************************************************************************
+ * Internal functions
+ ******************************************************************************/
+
+/* ...find best-match node given requested size */
+static inline xf_mm_block_t * xf_mm_find_by_size(xf_mm_pool_t *pool, u32 size)
+{
+ rb_tree_t *tree = &pool->l_map;
+ rb_idx_t p_idx, t_idx;
+
+ /* ...find first block having length greater than requested */
+ for (p_idx = rb_root(tree); p_idx != rb_null(tree); p_idx = rb_right(tree, p_idx))
+ {
+ xf_mm_block_t *b = container_of(p_idx, xf_mm_block_t, l_node);
+
+ /* ...break upon finding first matching candidate */
+ if (!xf_mm_block_length_less(b, size))
+ break;
+ }
+
+ /* ...bail out if haven't found a block with sufficient size */
+ if (p_idx == rb_null(tree))
+ return NULL;
+
+ /* ...try to find better match in left subtree */
+ for (t_idx = rb_left(tree, p_idx); t_idx != rb_null(tree); )
+ {
+ xf_mm_block_t *b = container_of(t_idx, xf_mm_block_t, l_node);
+
+ /* ...check the size of the block */
+ if (!xf_mm_block_length_less(b, size))
+ {
+ /* ...update best match */
+ p_idx = t_idx;
+
+ /* ...and check if we have anything better in left sbtree */
+ t_idx = rb_left(tree, t_idx);
+ }
+ else
+ {
+ /* ...move towards higher block sizes in that subtree */
+ t_idx = rb_right(tree, t_idx);
+ }
+ }
+
+ /* ...p_idx is our best choice */
+ return container_of(p_idx, xf_mm_block_t, l_node);
+}
+
+/* ...find the neighbours of the block basing on its address */
+static void xf_mm_find_by_addr(xf_mm_pool_t *pool, void *addr, xf_mm_block_t **n)
+{
+ rb_tree_t *tree = &pool->a_map;
+ rb_idx_t p_idx, l_idx, r_idx;
+
+ /* ...it is not possible to have exact match in this map */
+ for (p_idx = rb_root(tree), l_idx = r_idx = NULL; p_idx != rb_null(tree); )
+ {
+ /* ...only "is less than" comparison is valid (as "a_node" pointer is biased) */
+ if ((u32)p_idx < (u32)addr)
+ {
+ /* ...update lower neighbour */
+ l_idx = p_idx;
+
+ /* ...and move towards higher addresses */
+ p_idx = rb_right(tree, p_idx);
+ }
+ else
+ {
+ /* ...update higher neighbour */
+ r_idx = p_idx;
+
+ /* ...and move towards lower addresses */
+ p_idx = rb_left(tree, p_idx);
+ }
+ }
+
+ /* ...translate nodes into blocks */
+ n[0] = (l_idx ? container_of(l_idx, xf_mm_block_t, a_node) : NULL);
+ n[1] = (r_idx ? container_of(r_idx, xf_mm_block_t, a_node) : NULL);
+}
+
+/* ...insert the block into L-map */
+static void xf_mm_insert_size(xf_mm_pool_t *pool, xf_mm_block_t *b, u32 size)
+{
+ rb_tree_t *tree = &pool->l_map;
+ rb_idx_t p_idx, t_idx;
+
+ /* ...find the parent node for the next block */
+ for (p_idx = rb_root(tree); p_idx != rb_null(tree); p_idx = t_idx)
+ {
+ /* ...check for the size */
+ if (xf_mm_block_length_less(container_of(p_idx, xf_mm_block_t, l_node), size))
+ {
+ /* ...move towards higher addresses */
+ if ((t_idx = rb_right(tree, p_idx)) == rb_null(tree))
+ {
+ /* ...node becomes a right child of parent p */
+ rb_set_right(tree, p_idx, &b->l_node);
+ break;
+ }
+ }
+ else
+ {
+ /* ...move towards lower addresses (ok if exact size match is found) */
+ if ((t_idx = rb_left(tree, p_idx)) == rb_null(tree))
+ {
+ /* ...node becomes a left child of parent p */
+ rb_set_left(tree, p_idx, &b->l_node);
+ break;
+ }
+ }
+ }
+
+ /* ...insert node into tree */
+ rb_insert(tree, &b->l_node, p_idx);
+}
+
+/* ...insert the block into A-map */
+static void xf_mm_insert_addr(xf_mm_pool_t *pool, xf_mm_block_t *b)
+{
+ rb_tree_t *tree = &pool->a_map;
+ rb_idx_t p_idx, t_idx;
+
+ /* ...find the parent node for the next block */
+ for (p_idx = rb_root(tree); p_idx != rb_null(tree); p_idx = t_idx)
+ {
+ /* ...check for the address (only "is less than" comparison is valid) */
+ if ((u32)p_idx < (u32)b)
+ {
+ /* ...move towards higher addresses */
+ if ((t_idx = rb_right(tree, p_idx)) == rb_null(tree))
+ {
+ /* ...node becomes a right child of parent p */
+ rb_set_right(tree, p_idx, &b->a_node);
+ break;
+ }
+ }
+ else
+ {
+ /* ...move towards lower addresses (by design there cannot be exact match) */
+ if ((t_idx = rb_left(tree, p_idx)) == rb_null(tree))
+ {
+ /* ...node becomes a left child of parent p */
+ rb_set_left(tree, p_idx, &b->a_node);
+ break;
+ }
+ }
+ }
+
+ /* ...insert node into tree */
+ rb_insert(tree, &b->a_node, p_idx);
+}
+
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+/* ...block allocation */
+void * xf_mm_alloc(xf_mm_pool_t *pool, u32 size)
+{
+ xf_mm_block_t *b;
+
+ /* ...find best-fit free block */
+ XF_CHK_ERR(b = xf_mm_find_by_size(pool, size), NULL);
+
+ /* ...remove the block from the L-map */
+ rb_delete(&pool->l_map, &b->l_node);
+
+ /* ...check if the size is exactly the same as requested */
+ if ((size = xf_mm_block_length_sub(b, size)) == 0)
+ {
+ /* ...the block needs to be removed from the A-map as well */
+ rb_delete(&pool->a_map, &b->a_node);
+
+ /* ...entire block goes to user */
+ return (void *) b;
+ }
+ else
+ {
+ /* ...insert the block into L-map */
+ xf_mm_insert_size(pool, b, size);
+
+ /* ...A-map remains intact; tail of the block goes to user */
+ return (void *) b + size;
+ }
+}
+
+/* ...block deallocation */
+void xf_mm_free(xf_mm_pool_t *pool, void *addr, u32 size)
+{
+ xf_mm_block_t *b = xf_mm_block_init(addr, size);
+ xf_mm_block_t *n[2];
+
+ /* ...find block neighbours in A-map */
+ xf_mm_find_by_addr(pool, addr, n);
+
+ /* ...check if we can merge block to left neighbour */
+ if (n[0])
+ {
+ if ((void *)n[0] + xf_mm_block_length(n[0]) == addr)
+ {
+ /* ...merge free block with left neighbour; delete it from L-map */
+ rb_delete(&pool->l_map, &n[0]->l_node);
+
+ /* ...adjust block length (block remains in A-map) */
+ addr = (void *)(b = n[0]), size = xf_mm_block_length_add(b, size);
+ }
+ else
+ {
+ /* ...mark there is no left-merge */
+ n[0] = NULL;
+ }
+ }
+
+ /* ...check if we can merge block to right neighbour */
+ if (n[1])
+ {
+ if ((void *)n[1] == addr + size)
+ {
+ /* ...merge free block with right neighbour; delete it from L-map */
+ rb_delete(&pool->l_map, &n[1]->l_node);
+
+ /* ...adjust block length */
+ size = xf_mm_block_length_add(b, xf_mm_block_length(n[1]));
+
+ /* ...check if left merge took place as well */
+ if (n[0])
+ {
+ /* ...left neighbour covers now all three blocks; drop record from A-map */
+ rb_delete(&pool->a_map, &n[1]->a_node);
+ }
+ else
+ {
+ /* ...fixup tree pointers (equivalent to remove/reinsert the same key) */
+ rb_replace(&pool->a_map, &n[1]->a_node, &b->a_node);
+ }
+ }
+ else
+ {
+ n[1] = NULL;
+ }
+ }
+
+ /* ...if any merge has occured, A-map is updated */
+ if (n[0] == NULL && n[1] == NULL)
+ {
+ /* ...add new block into A-map */
+ xf_mm_insert_addr(pool, b);
+ }
+
+ /* ...add (new or adjusted) block into L-map */
+ xf_mm_insert_size(pool, b, size);
+}
+
+/* ...initialize memory allocator */
+int xf_mm_init(xf_mm_pool_t *pool, void *addr, u32 size)
+{
+ /* ...check pool alignment validity */
+ XF_CHK_ERR(((u32)addr & (sizeof(xf_mm_block_t) - 1)) == 0, -EINVAL);
+
+ /* ...check pool size validity */
+ XF_CHK_ERR(((size) & (sizeof(xf_mm_block_t) - 1)) == 0, -EINVAL);
+
+ /* ...set pool parameters (need that stuff at all? - tbd) */
+ pool->addr = addr, pool->size = size;
+
+ /* ...initialize rb-trees */
+ rb_init(&pool->l_map), rb_init(&pool->a_map);
+
+ /* ..."free" the entire block */
+ xf_mm_free(pool, addr, size);
+
+ TRACE(INIT, _b("memory allocator initialized: [%p..%p)"), addr, addr + size);
+
+ return 0;
+}
diff --git a/hifi/xaf/hifi-dpf/core/xf-msg.c b/hifi/xaf/hifi-dpf/core/xf-msg.c
new file mode 100644
index 00000000..4253e1e3
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/xf-msg.c
@@ -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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-msg.c
+ *
+ * Message/message pool handling
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG MSG
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+/* ...allocate message pool */
+int xf_msg_pool_init(xf_msg_pool_t *pool, u32 n, u32 core)
+{
+ u32 i;
+
+ /* ...allocate shared memory from global pool */
+ XF_CHK_ERR(pool->p = xf_mem_alloc(XF_MM(sizeof(*pool->p) * n), XF_PROXY_ALIGNMENT, core, 1), -ENOMEM);
+
+ /* ...place all messages into single-liked list */
+ for (pool->head = &pool->p[i = 0]; i < n - 1; i++)
+ {
+ /* ...set message pointer to next message in the pool */
+ xf_msg_pool_item(pool, i)->next = xf_msg_pool_item(pool, i + 1);
+ }
+
+ /* ...set tail of the list */
+ xf_msg_pool_item(pool, i)->next = NULL;
+
+ /* ...save pool size */
+ pool->n = n;
+
+ return 0;
+}
+
+/* ...destroy memory pool */
+void xf_msg_pool_destroy(xf_msg_pool_t *pool, u32 core)
+{
+ /* ...release pool memory (from shared local-IPC memory) */
+ xf_mem_free(pool->p, XF_MM(sizeof(*pool->p) * pool->n), core, 1);
+}
+
+/* ...allocate message from a pool (no concurrent access from other cores) */
+xf_message_t * xf_msg_pool_get(xf_msg_pool_t *pool)
+{
+ __xf_message_t *_m;
+
+ /* ...pop message from the head of the pool */
+ XF_CHK_ERR(_m = pool->head, NULL);
+
+ /* ...advance list head */
+ pool->head = (__xf_message_t *)(((xf_message_t *) _m)->next);
+
+ /* ...debug - wipe out message "next" pointer */
+ ((xf_message_t *) _m)->next = NULL;
+
+ /* ...return properly aligned message pointer */
+ return (xf_message_t *) _m;
+}
+
+/* ...return message back to the pool (no concurrent access from other cores) */
+void xf_msg_pool_put(xf_msg_pool_t *pool, xf_message_t *m)
+{
+ __xf_message_t *_m = (__xf_message_t *) m;
+
+ /* ...make sure the message is properly aligned object */
+ BUG(!XF_IS_ALIGNED(_m), _x("Corrupted message pointer: %p"), _m);
+
+ /* ...make sure it is returned to the same pool (need a length for that - tbd) */
+ BUG(!xf_msg_from_pool(pool, m) < 0, _x("Bad pool/message: %p/%p"), pool->p, _m);
+
+ /* ...place message into the head */
+ m->next = (xf_message_t *) pool->head;
+
+ /* ...advance pool head */
+ pool->head = _m;
+}
diff --git a/hifi/xaf/hifi-dpf/core/xf-sched.c b/hifi/xaf/hifi-dpf/core/xf-sched.c
new file mode 100644
index 00000000..cc1b4e8d
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/xf-sched.c
@@ -0,0 +1,153 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-sched.c
+ *
+ * Non-preemptive earliest-deadline-first scheduler
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG SCHED
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Tracing configuration
+ ******************************************************************************/
+
+TRACE_TAG(DEBUG, 1);
+
+/*******************************************************************************
+ * Global functions definitions
+ ******************************************************************************/
+
+/* ...place task into scheduler queue */
+void xf_sched_put(xf_sched_t *sched, xf_task_t *t, u32 ts)
+{
+ rb_tree_t *tree = (rb_tree_t *)sched;
+ rb_node_t *node = (rb_node_t *)t;
+ rb_idx_t p_idx, t_idx;
+ u32 _ts;
+
+ /* ...set scheduling timestamp */
+ xf_task_timestamp_set(t, ts);
+
+ /* ...find a place in the tree where the message should be inserted */
+ for (p_idx = rb_root(tree); p_idx != rb_null(tree); p_idx = t_idx)
+ {
+ /* ...get timestamp of the p_idx */
+ _ts = xf_task_timestamp((xf_task_t *)p_idx);
+
+ /* ...ordering respects FIFO order of messages with same timestamp */
+ if (xf_timestamp_before(ts, _ts))
+ {
+ if ((t_idx = rb_left(tree, p_idx)) == rb_null(tree))
+ {
+ /* ...p_idx is a direct successor of the message */
+ rb_set_left(tree, p_idx, node);
+
+ /* ...adjust head of the tree if needed */
+ if (p_idx == rb_cache(tree)) goto insert_head;
+ else goto insert;
+ }
+ }
+ else
+ {
+ if ((t_idx = rb_right(tree, p_idx)) == rb_null(tree))
+ {
+ /* ...p_idx is a direct predeccessor of the message */
+ rb_set_right(tree, p_idx, node);
+
+ goto insert;
+ }
+ }
+ }
+
+insert_head:
+ /* ...adjust scheduler head element */
+ rb_set_cache(tree, node);
+
+insert:
+ /* ...insert item and rebalance the tree */
+ rb_insert(tree, node, p_idx);
+
+ /* ...head cannot be NULL */
+ BUG(rb_cache(tree) == rb_null(tree), _x("Invalid scheduler state"));
+
+ TRACE(DEBUG, _b("in: %x:[%p] (ts:%x)"), ts, node, xf_sched_timestamp(sched));
+}
+
+/* ...get first item from the scheduler */
+xf_task_t * xf_sched_get(xf_sched_t *sched)
+{
+ rb_tree_t *tree = (rb_tree_t *)sched;
+ rb_idx_t n_idx, t_idx;
+ u32 ts;
+
+ /* ...head of the tree is cached; replace it with its parent (direct successor) */
+ if ((n_idx = rb_cache(tree)) == rb_null(tree))
+ {
+ /* ...tree is empty; bail out */
+ return NULL;
+ }
+ else
+ {
+ /* ...delete current node and rebalance the tree */
+ t_idx = rb_delete(tree, n_idx), rb_set_cache(tree, t_idx);
+
+ /* ...get task timestamp */
+ ts = xf_task_timestamp((xf_task_t *)n_idx);
+
+ /* ...advance scheduler timestamp */
+ xf_sched_timestamp_set(sched, ts);
+
+ TRACE(DEBUG, _b("out: %x:[%p]"), ts, n_idx);
+
+ /* ...return task */
+ return (xf_task_t *)n_idx;
+ }
+}
+
+/* ...cancel specified task execution (must be scheduled!) */
+void xf_sched_cancel(xf_sched_t *sched, xf_task_t *t)
+{
+ rb_tree_t *tree = (rb_tree_t *)sched;
+ rb_idx_t n_idx = t;
+ rb_idx_t t_idx;
+
+ /* ...delete message from tree */
+ t_idx = rb_delete(tree, n_idx);
+
+ /* ...adjust head if that was the first message */
+ (n_idx == rb_cache(tree) ? rb_set_cache(tree, t_idx), 1 : 0);
+}
+
+/* ...initialize scheduler data */
+void xf_sched_init(xf_sched_t *sched)
+{
+ rb_init((rb_tree_t *)sched);
+}
diff --git a/hifi/xaf/hifi-dpf/core/xf-shmem.c b/hifi/xaf/hifi-dpf/core/xf-shmem.c
new file mode 100644
index 00000000..15d3b1d9
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/core/xf-shmem.c
@@ -0,0 +1,350 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-shmem.c
+ *
+ * DSP shared memory interface implementation
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG SHMEM
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+
+/*******************************************************************************
+ * Tracing tags
+ ******************************************************************************/
+
+/* ...general initialization sequence */
+TRACE_TAG(INIT, 1);
+
+/* ...interface status change */
+TRACE_TAG(EXEC, 0);
+
+/* ...command reception */
+TRACE_TAG(CMD, 1);
+
+/* ...response generation */
+TRACE_TAG(RSP, 1);
+
+#ifdef XAF_PROFILE_DSP
+#include "xa_profiler.h"
+#endif
+/*******************************************************************************
+ * Local constants definitions
+ ******************************************************************************/
+
+/* ...local interface status change flag */
+#define XF_PROXY_STATUS_LOCAL (1 << 0)
+
+/* ...remote status change notification flag */
+#define XF_PROXY_STATUS_REMOTE (1 << 1)
+
+/*******************************************************************************
+ * Internal helpers
+ ******************************************************************************/
+
+/* ...put message into proxy queue */
+static inline void xf_msg_proxy_put(xf_message_t *m)
+{
+ u32 dst = XF_MSG_DST_CORE(m->id);
+ u32 src = XF_MSG_SRC_CORE(m->id);
+ xf_core_rw_data_t *rw = XF_CORE_RW_DATA(dst);
+ int first;
+
+ /* ...get an access to shared rw-memory (we are running on "source" core) */
+ xf_mutex_lock(src);
+
+ /* ...assure memory coherency if needed */
+ if (XF_REMOTE_IPC_NON_COHERENT)
+ {
+ /* ...invalidate rw-shared memory region */
+ XF_PROXY_INVALIDATE(rw, sizeof(*rw));
+
+ /* ...put message into shared queue */
+ first = xf_msg_enqueue(&rw->remote, m);
+
+ /* ...flush both message and shared queue data */
+ XF_PROXY_FLUSH(rw, sizeof(*rw)), XF_PROXY_FLUSH(m, sizeof(*m));
+ }
+ else
+ {
+ /* ...no memory coherency concerns; just place a message in the queue */
+ first = xf_msg_enqueue(&rw->remote, m);
+ }
+
+ /* ...release rw-memory region lock */
+ xf_mutex_unlock(src);
+
+ /* ...assert IPI interrupt on target ("destination") core if needed */
+ if (first && (dst ^ src))
+ {
+ xf_ipi_assert(dst);
+ }
+}
+
+/* ...retrieve message from proxy queue */
+static inline xf_message_t * xf_msg_proxy_get(u32 core)
+{
+ xf_core_rw_data_t *rw = XF_CORE_RW_DATA(core);
+ xf_message_t *m;
+
+ /* ...retrieve message from queue in atomic fashion */
+ xf_mutex_lock(core);
+
+ /* ...assure memory coherency if needed */
+ if (XF_REMOTE_IPC_NON_COHERENT)
+ {
+ /* ...invalidate rw-memory */
+ XF_PROXY_INVALIDATE(rw, sizeof(*rw));
+
+ /* ...dequeue message from response queue */
+ m = xf_msg_dequeue(&rw->remote);
+
+ /* ...flush rw memory */
+ XF_PROXY_FLUSH(rw, sizeof(*rw));
+
+ /* ...invalidate message data if found */
+ (m ? XF_PROXY_INVALIDATE(m, sizeof(*m)) : 0);
+ }
+ else
+ {
+ /* ...just dequeue message from response queue */
+ m = xf_msg_dequeue(&rw->remote);
+ }
+
+ /* ...release the rw-lock */
+ xf_mutex_unlock(core);
+
+ return m;
+}
+
+/*******************************************************************************
+ * Internal functions definitions
+ ******************************************************************************/
+
+/* ...retrieve all incoming commands from shared memory ring-buffer */
+static u32 xf_shmem_process_input(u32 core)
+{
+ xf_message_t *m;
+ u32 read_idx;
+ u32 write_idx;
+ u32 status = 0;
+
+ /* ...get current value of write pointer */
+ read_idx = XF_PROXY_READ(core, cmd_read_idx);
+ write_idx = XF_PROXY_READ(core, cmd_write_idx);
+
+ TRACE(EXEC, _b("Command queue: write = %x / read = %x"), write_idx, read_idx);
+
+ /* ...process all committed commands */
+ while (!XF_QUEUE_EMPTY(read_idx, write_idx))
+ {
+ xf_proxy_message_t *command;
+
+ /* ...allocate message; the call should not fail */
+ if ((m = xf_msg_pool_get(&XF_CORE_RO_DATA(core)->pool)) == NULL)
+ break;
+
+ /* ...if queue was full, set global proxy update flag */
+ if (XF_QUEUE_FULL(read_idx, write_idx))
+ status |= XF_PROXY_STATUS_REMOTE | XF_PROXY_STATUS_LOCAL;
+ else
+ status |= XF_PROXY_STATUS_LOCAL;
+
+ /* ...get oldest not processed command */
+ command = XF_PROXY_COMMAND(core, XF_QUEUE_IDX(read_idx));
+
+ /* ...synchronize memory contents */
+ XF_PROXY_INVALIDATE(command, sizeof(*command));
+
+ /* ...fill message parameters */
+ m->id = command->session_id;
+ m->opcode = command->opcode;
+ m->length = command->length;
+ m->buffer = xf_ipc_a2b(core, command->address);
+ TRACE(CMD, _b("C[%x]:(%x,%u,%p)"), m->id, m->opcode, m->length, m->buffer);
+
+ /* ...invalidate message buffer contents as required - not here - tbd */
+ (XF_OPCODE_CDATA(m->opcode) ? XF_PROXY_INVALIDATE(m->buffer, m->length) : 0);
+
+ /* ...advance local reading index copy */
+ read_idx = XF_QUEUE_ADVANCE_IDX(read_idx);
+
+ /* ...update shadow copy of reading index */
+ XF_PROXY_WRITE(core, cmd_read_idx, read_idx);
+
+ /* ...and schedule message execution on proper core */
+ xf_msg_submit(m);
+ }
+
+ return status;
+}
+
+/* ...send out all pending outgoing responses to the shared memory ring-buffer */
+static u32 xf_shmem_process_output(u32 core)
+{
+ xf_message_t *m;
+ u32 read_idx;
+ u32 write_idx;
+ u32 status = 0;
+
+ /* ...get current value of peer read pointer */
+ write_idx = XF_PROXY_READ(core, rsp_write_idx);
+ read_idx = XF_PROXY_READ(core, rsp_read_idx);
+
+ TRACE(EXEC, _b("Response queue: write = %08X / read = %08X"), write_idx, read_idx);
+
+ /* ...while we have response messages and there's space to write out one */
+ while (!XF_QUEUE_FULL(read_idx, write_idx))
+ {
+ xf_proxy_message_t *response;
+
+ /* ...remove message from internal queue */
+ if ((m = xf_msg_proxy_get(core)) == NULL)
+ break;
+
+ /* ...notify remote interface each time we send it a message (only if it was empty?) */
+ status = XF_PROXY_STATUS_REMOTE | XF_PROXY_STATUS_LOCAL;
+
+#if 0
+ /* ...need to decide on best strategy - tbd */
+ if (XF_QUEUE_EMPTY(read_idx, write_idx))
+ status |= XF_PROXY_STATUS_REMOTE | XF_PROXY_STATUS_LOCAL;
+ else
+ status |= XF_PROXY_STATUS_LOCAL;
+#endif
+
+ /* ...flush message buffer contents to main memory as required - too late - different core - tbd */
+ (XF_OPCODE_RDATA(m->opcode) ? XF_PROXY_FLUSH(m->buffer, m->length) : 0);
+
+ /* ...find place in a queue for next response */
+ response = XF_PROXY_RESPONSE(core, XF_QUEUE_IDX(write_idx));
+
+ /* ...put the response message fields */
+ response->session_id = m->id;
+ response->opcode = m->opcode;
+ response->length = m->length;
+ response->address = xf_ipc_b2a(core, m->buffer);
+ /* ...flush the content of the caches to main memory */
+ XF_PROXY_FLUSH(response, sizeof(*response));
+
+#ifdef XAF_PROFILE_DSP
+ if((m->opcode == XF_FILL_THIS_BUFFER))
+ {
+ if((m->length != 0) && (m->length != 20))
+ {
+ prof.g_output_bytes += (unsigned long)m->length;
+ }
+ else if (m->length == 20)
+ {
+ /* Profiler re-initialization */
+ INIT_XA_PROFILER(prof,"DSP core");
+
+ /* update stream params on re-init */
+ xf_start_msg_t *sm = (xf_start_msg_t *)m->buffer;
+ prof.sample_rate = sm->sample_rate;
+ prof.channels = sm->channels;
+ prof.pcm_width = sm->pcm_width;
+ }
+ }
+#endif
+ TRACE(RSP, _b("R[%x]:(%x,%u,%p)"), m->id, m->opcode, m->length, m->buffer);
+
+ /* ...return message back to the pool */
+ xf_msg_pool_put(&XF_CORE_RO_DATA(core)->pool, m);
+
+ /* ...advance local writing index copy */
+ write_idx = XF_QUEUE_ADVANCE_IDX(write_idx);
+
+ /* ...update shared copy of queue write pointer */
+ XF_PROXY_WRITE(core, rsp_write_idx, write_idx);
+ }
+
+ /* ...return interface status change flags */
+ return status;
+}
+
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+/* ...process local/remote shared memory interface status change */
+void xf_shmem_process_queues(u32 core)
+{
+ u32 status;
+
+ do
+ {
+ /* ...acknowledge/clear any pending incoming interrupt */
+ XF_PROXY_SYNC_PEER(core);
+
+ /* ...send out pending response messages (frees message buffers, so do it first) */
+ status = xf_shmem_process_output(core);
+
+ /* ...receive and forward incoming command messages (allocates message buffers) */
+ status |= xf_shmem_process_input(core);
+
+ /* ...assert remote mailbox interrupt if global update bit is set */
+ if (status & XF_PROXY_STATUS_REMOTE)
+ {
+ XF_PROXY_NOTIFY_PEER(core);
+ }
+ }
+ while (status);
+}
+
+/* ...completion callback for message originating from remote proxy */
+void xf_msg_proxy_complete(xf_message_t *m)
+{
+ /* ...place message into proxy response queue */
+ xf_msg_proxy_put(m);
+}
+
+/* ...initialize shared memory interface (DSP side) */
+int xf_shmem_init(u32 core)
+{
+ xf_core_rw_data_t *rw = XF_CORE_RW_DATA(core);
+ xf_core_ro_data_t *ro = XF_CORE_RO_DATA(core);
+
+ /* ...initialize local/remote message queues */
+ xf_msg_queue_init(&rw->local);
+ xf_msg_queue_init(&rw->remote);
+
+ /* ...initialize global message list */
+ XF_CHK_API(xf_msg_pool_init(&ro->pool, XF_CFG_MESSAGE_POOL_SIZE, core));
+
+ /* ...flush memory content as needed */
+ (XF_REMOTE_IPC_NON_COHERENT ? XF_PROXY_FLUSH(rw, sizeof(*rw)) : 0);
+
+ /* ...system-specific initialization of IPC layer */
+ XF_CHK_API(xf_ipc_init(core));
+
+ TRACE(INIT, _b("SHMEM-%u subsystem initialized"), core);
+
+ return 0;
+}
diff --git a/hifi/xaf/hifi-dpf/include/audio/xa-audio-decoder-api.h b/hifi/xaf/hifi-dpf/include/audio/xa-audio-decoder-api.h
new file mode 100644
index 00000000..797bf231
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/audio/xa-audio-decoder-api.h
@@ -0,0 +1,66 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-audio-decoder-api.h
+ *
+ * Generic audio decoder API
+ *
+ ******************************************************************************/
+
+#ifndef __XA_ADEC_API_H__
+#define __XA_ADEC_API_H__
+
+/* ...includes */
+#include "xa_type_def.h"
+#include "xa_error_standards.h"
+#include "xa_apicmd_standards.h"
+#include "xa_memory_standards.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)
+};
+
+/* ...fatal execution errors */
+enum
+{
+ XA_CODEC_EXEC_SEQUENCE = XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_GENERIC, 0),
+ XA_CODEC_EXEC_MISBEHAVING = XA_ERROR_CODE(xa_severity_fatal, xa_class_execute, XA_CODEC_GENERIC, 1),
+};
+
+#endif
diff --git a/hifi/xaf/hifi-dpf/include/audio/xa-mixer-api.h b/hifi/xaf/hifi-dpf/include/audio/xa-mixer-api.h
new file mode 100644
index 00000000..0de1745d
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/audio/xa-mixer-api.h
@@ -0,0 +1,157 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-mixer-api.h
+ *
+ * Mixer component API
+ *
+ ******************************************************************************/
+
+#ifndef __XA_MIXER_API_H__
+#define __XA_MIXER_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
+ ******************************************************************************/
+
+/* ...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/hifi-dpf/include/audio/xa_apicmd_standards.h b/hifi/xaf/hifi-dpf/include/audio/xa_apicmd_standards.h
new file mode 100644
index 00000000..eb1b78e1
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/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/hifi-dpf/include/audio/xa_error_standards.h b/hifi/xaf/hifi-dpf/include/audio/xa_error_standards.h
new file mode 100644
index 00000000..1b67b52f
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/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/hifi-dpf/include/audio/xa_memory_standards.h b/hifi/xaf/hifi-dpf/include/audio/xa_memory_standards.h
new file mode 100644
index 00000000..27ec455f
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/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/hifi-dpf/include/audio/xa_type_def.h b/hifi/xaf/hifi-dpf/include/audio/xa_type_def.h
new file mode 100644
index 00000000..e83cdd34
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/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/hifi-dpf/include/lib/mutex.h b/hifi/xaf/hifi-dpf/include/lib/mutex.h
new file mode 100644
index 00000000..2aef0f6e
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/lib/mutex.h
@@ -0,0 +1,59 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * mutex.h
+ *
+ *
+ * Implementation of "non-robust" Szymanski linear-waiting algorithm. Types of
+ * failures tolerated by Szymanski's "robust" algorithm are not specific for
+ * Xtensa DSP cluster and therefore more lightweight version of the algorithm
+ * is used. FIFO servicing property is of low importance, and faster/smaller
+ * version with linear-wait property is preferable.
+ *
+ * We assume there is just a single mutex in the system, and all communication
+ * variables are defined somewhere in board-specific headers and imported here
+ * by means of macros MUTEX_SHARED_READ/WRITE.
+ ******************************************************************************/
+
+#ifndef __MUTEX_H
+#define __MUTEX_H
+
+/*******************************************************************************
+ * Imported macros
+ ******************************************************************************/
+
+#if !defined(MUTEX_SHARED_READ) || !defined(MUTEX_SHARED_WRITE)
+#error "Macros MUTEX_SHARED_READ and/or MUTEX_SHARED_WRITE not defined"
+#endif
+
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+/* ...acquire global mutex from i-th core */
+extern void mutex_lock(u32 i);
+
+/* ...release global mutex from i-th core */
+extern void mutex_unlock(u32 i);
+
+#endif /* __MUTEX_H */
diff --git a/hifi/xaf/hifi-dpf/include/lib/rbtree.h b/hifi/xaf/hifi-dpf/include/lib/rbtree.h
new file mode 100644
index 00000000..7f02cdf3
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/lib/rbtree.h
@@ -0,0 +1,157 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * rbtree.h
+ *
+ * Generic implmentation of red-black trees
+ *
+ *******************************************************************************/
+
+#ifndef __RBTREE_H
+#define __RBTREE_H
+
+/*******************************************************************************
+ * Red-black tree node definition
+ ******************************************************************************/
+
+/* ...reference to rb-tree node */
+typedef struct rb_node *rb_idx_t;
+
+/* ...rb-tree node */
+typedef struct rb_node
+{
+ /* ...pointers to parent and two children */
+ rb_idx_t parent, left, right;
+
+ /* ...node color (least-significant-bit only) */
+ u32 color;
+
+} rb_node_t;
+
+/* ...rb-tree data */
+typedef struct rb_tree_t
+{
+ /* ...tree sentinel node */
+ rb_node_t root;
+
+} rb_tree_t;
+
+/*******************************************************************************
+ * Helpers
+ ******************************************************************************/
+
+/* ...left child accessor */
+static inline rb_idx_t rb_left(rb_tree_t *tree, rb_idx_t n_idx)
+{
+ return n_idx->left;
+}
+
+/* ...right child accessor */
+static inline rb_idx_t rb_right(rb_tree_t *tree, rb_idx_t n_idx)
+{
+ return n_idx->right;
+}
+
+/* ...parent node accessor */
+static inline rb_idx_t rb_parent(rb_tree_t *tree, rb_idx_t n_idx)
+{
+ return n_idx->parent;
+}
+
+/* ...tree root node accessor */
+static inline rb_idx_t rb_root(rb_tree_t *tree)
+{
+ return rb_left(tree, &tree->root);
+}
+
+/* ...tree data pointer accessor */
+static inline rb_idx_t rb_cache(rb_tree_t *tree)
+{
+ return rb_right(tree, &tree->root);
+}
+
+/* ...tree null node */
+static inline rb_idx_t rb_null(rb_tree_t *tree)
+{
+ return &tree->root;
+}
+
+/* ...get user-bits stored in node color */
+static inline u32 rb_node_data(rb_tree_t *tree, rb_idx_t n_idx)
+{
+ return (n_idx->color >> 1);
+}
+
+/* ...left child assignment */
+static inline void rb_set_left(rb_tree_t *tree, rb_idx_t n_idx, rb_node_t *child)
+{
+ n_idx->left = child;
+}
+
+/* ...right child assignment */
+static inline void rb_set_right(rb_tree_t *tree, rb_idx_t n_idx, rb_node_t *child)
+{
+ n_idx->right = child;
+}
+
+/* ...cache tree client index */
+static inline void rb_set_cache(rb_tree_t *tree, rb_idx_t c_idx)
+{
+ tree->root.right = c_idx;
+}
+
+/* ...get user-bits stored in node color */
+static inline void rb_set_node_data(rb_tree_t *tree, rb_idx_t n_idx, u32 data)
+{
+ n_idx->color = (n_idx->color & 0x1) | (data << 1);
+}
+
+/*******************************************************************************
+ * API functions
+ ******************************************************************************/
+
+/* ...initialize rb-tree */
+extern void rb_init(rb_tree_t *tree);
+
+/* ...insert node into tree as a child of p */
+extern void rb_insert(rb_tree_t *tree, rb_idx_t n_idx, rb_idx_t p_idx);
+
+/* ...replace the node with same-key value and fixup tree pointers */
+extern void rb_replace(rb_tree_t *tree, rb_idx_t n_idx, rb_idx_t t_idx);
+
+/* ...delete node from the tree and return its in-order predecessor/successor */
+extern rb_idx_t rb_delete(rb_tree_t *tree, rb_idx_t n_idx);
+
+/* ...first in-order item in the tree */
+extern rb_idx_t rb_first(rb_tree_t *tree);
+
+/* ...last in-order item in the tree */
+extern rb_idx_t rb_last(rb_tree_t *tree);
+
+/* ...forward tree iterator */
+extern rb_idx_t rb_next(rb_tree_t *tree, rb_idx_t n_idx);
+
+/* ...backward tree iterator */
+extern rb_idx_t rb_prev(rb_tree_t *tree, rb_idx_t n_idx);
+
+#endif /* __RBTREE_H */
diff --git a/hifi/xaf/hifi-dpf/include/lib/tinyput.h b/hifi/xaf/hifi-dpf/include/lib/tinyput.h
new file mode 100644
index 00000000..dadd0885
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/lib/tinyput.h
@@ -0,0 +1,31 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/* $Id: //depot/dev/Cottonwood/Xtensa/OS/mpg2/tinyput.h#2 $ */
+
+#include <stdarg.h>
+
+extern void tiny_putc(char c);
+extern int tiny_puts(const char *s);
+extern int tiny_atoi(const char *s);
+extern int tiny_vsprintf(char *out, const char *fmt, va_list ap);
+extern int tiny_sprintf(char *out, const char *fmt, ...);
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/arch_hifi330.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/arch_hifi330.h
new file mode 100644
index 00000000..74b12220
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/arch_hifi330.h
@@ -0,0 +1,134 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+#include <xtensa/simcall.h>
+#include <xtensa/corebits.h>
+#include <xtensa/config/system.h>
+#include <xtensa/config/core.h>
+
+#ifndef __ARCH_HIFI330_H__
+#define __ARCH_HIFI330_H__
+
+#ifdef __ASSEMBLER__
+#include <xtensa/coreasm.h>
+#endif
+
+#include <xtensa/corebits.h>
+#include <xtensa/config/system.h>
+
+/*
+Align a value up to nearest n-byte boundary, where n is a power of 2.
+*/
+#define ALIGNUP(n, val) (((val) + (n)-1) & -(n))
+
+
+/*******************************************************************************
+INTERRUPT STACK FRAME FOR A THREAD OR NESTED INTERRUPT
+*******************************************************************************/
+#define XT_STK_EXIT 0x00 /* (offset 0) exit point for dispatch */
+#define XT_STK_PC 0x04 /* return address */
+#define XT_STK_PS 0x08 /* at level 1 PS.EXCM is set here */
+#define XT_STK_A0 0x0C
+#define XT_STK_A1 0x10 /* stack ptr before interrupt */
+#define XT_STK_A2 0x14
+#define XT_STK_A3 0x18
+#define XT_STK_A4 0x1C
+#define XT_STK_A5 0x20
+#define XT_STK_A6 0x24
+#define XT_STK_A7 0x28
+#define XT_STK_A8 0x2C
+#define XT_STK_A9 0x30
+#define XT_STK_A10 0x34
+#define XT_STK_A11 0x38
+#define XT_STK_A12 0x3C /* Call0 callee-save */
+#define XT_STK_A13 0x40 /* Call0 callee-save */
+#define XT_STK_A14 0x44 /* Call0 callee-save */
+#define XT_STK_A15 0x48 /* Call0 callee-save */
+#define XT_STK_SAR 0x4C
+
+#define XT_STK_LBEG 0x50
+#define XT_STK_LEND 0x54
+#define XT_STK_LCOUNT 0x58
+#define XT_STK_NEXT1 0x5C /* next unused offset */
+
+#define XT_STK_EXTRA ALIGNUP(XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1)
+
+#define XT_STK_NEXT2 (XT_STK_EXTRA + XCHAL_EXTRA_SA_SIZE)
+
+#define XT_STK_N_TMP 3 /* # of 4-byte temp. slots */
+#define XT_STK_TMP XT_STK_NEXT2
+#define XT_STK_NEXT3 XT_STK_TMP + (4 * XT_STK_N_TMP)
+#define XT_STK_FRMSZ (ALIGNUP(0x10, XT_STK_NEXT3) + 0x20)
+
+
+/*******************************************************************************
+SIMPLE STACK FRAME FOR A THREAD
+*******************************************************************************/
+#define XT_SOL_EXIT XT_STK_EXIT /* code indicates solicited frame */
+#define XT_SOL_PC 0x04 /* return address (b30-31=callinc) */
+#define XT_SOL_PS 0x08
+#define XT_SOL_NEXT 0x0c /* next unused offset */
+ /* there may be some unused space here */
+#define XT_SOL_A0 ALIGNUP(0x10, XT_SOL_NEXT)
+#define XT_SOL_A1 XT_SOL_A0 + 4
+#define XT_SOL_A2 XT_SOL_A1 + 4
+#define XT_SOL_A3 XT_SOL_A2 + 4
+#define XT_SOL_FRMSZ ALIGNUP(0x10, XT_SOL_A3)
+
+
+/*******************************************************************************
+CO-PROCESSOR STATE SAVE AREA FOR A THREAD
+*******************************************************************************/
+#define XT_CPENABLE 0
+#define XT_CPSTORED (XT_CPENABLE + 1)
+#define XT_CP0_SA ALIGNUP(XCHAL_CP0_SA_ALIGN, XT_CPSTORED + 1)
+#define XT_CP1_SA ALIGNUP(XCHAL_CP1_SA_ALIGN, XT_CP0_SA + XCHAL_CP0_SA_SIZE)
+#define XT_CP2_SA ALIGNUP(XCHAL_CP2_SA_ALIGN, XT_CP1_SA + XCHAL_CP1_SA_SIZE)
+#define XT_CP3_SA ALIGNUP(XCHAL_CP3_SA_ALIGN, XT_CP2_SA + XCHAL_CP2_SA_SIZE)
+#define XT_CP4_SA ALIGNUP(XCHAL_CP4_SA_ALIGN, XT_CP3_SA + XCHAL_CP3_SA_SIZE)
+#define XT_CP5_SA ALIGNUP(XCHAL_CP5_SA_ALIGN, XT_CP4_SA + XCHAL_CP4_SA_SIZE)
+#define XT_CP6_SA ALIGNUP(XCHAL_CP6_SA_ALIGN, XT_CP5_SA + XCHAL_CP5_SA_SIZE)
+#define XT_CP7_SA ALIGNUP(XCHAL_CP7_SA_ALIGN, XT_CP6_SA + XCHAL_CP6_SA_SIZE)
+#define XT_CP_SIZE ALIGNUP(4 , XT_CP7_SA + XCHAL_CP7_SA_SIZE)
+
+#ifdef __ASSEMBLER__
+/* Windowed */
+#define ENTRY(sz) entry sp, sz
+#define ENTRY0 entry sp, 0x10
+#define RET(sz) retw
+#define RET0 retw
+#endif
+
+#define XT_TICK_PER_SEC 100
+#define XT_RTOS_INT_ENTER OS_IntEnter
+#define XT_RTOS_INT_EXIT OS_IntExit
+#define XT_RTOS_CP_STATE OS_GetTaskCoprocState
+
+#ifdef __ASSEMBLER__
+// typedef struct vos_tcb {
+#define OSTCBStkPtr 0x00 // OSTCBStkPtr
+#define OSTCBStkBottom 0x10 // StackAddress
+//...
+// } VOS_TCB;
+#endif /* __ASSEMBLER__ */
+
+#endif /* end of arch_balongV7r1.h */
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/cpu_c.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/cpu_c.h
new file mode 100644
index 00000000..0cc0da93
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/cpu_c.h
@@ -0,0 +1,109 @@
+/*******************************************************************************
+* 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 __CPU_C_H__
+#define __CPU_C_H__
+
+enum OS_HOOK_TYPE_ENUM
+{
+ OS_HOOK_TYPE_ENTER_INTR=0,
+ OS_HOOK_TYPE_EXIT_INTR,
+ OS_HOOK_TYPE_TASK_SWITCH,
+ OS_HOOK_TYPE_MSG_GET,
+ OS_HOOK_TYPE_NMI,
+ OS_HOOK_TYPE_EXCEPTION,
+ OS_HOOK_TYPE_APPINIT,
+ OS_HOOK_TYPE_IDLE,
+ OS_HOOK_TYPE_BUTT
+};
+
+enum OS_INTR_CONNECT_TYPE_ENUM
+{
+ OS_INTR_CONNECT_00=0, /*Int 0 type / priority level NMI / 6 */
+ OS_INTR_CONNECT_01, /*Int 1 type / priority level Software / 3 */
+ OS_INTR_CONNECT_02, /*Int 2 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_03, /*Int 3 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_04, /*Int 4 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_05, /*Int 5 type / priority level Timer / 3 */
+ OS_INTR_CONNECT_06, /*Int 6 type / priority level Timer / 4 */
+ OS_INTR_CONNECT_07, /*Int 7 type / priority level ExtLevel / 3 */
+ OS_INTR_CONNECT_08, /*Int 8 type / priority level ExtLevel / 3 */
+ OS_INTR_CONNECT_09, /*Int 9 type / priority level ExtLevel / 3 */
+ OS_INTR_CONNECT_10, /*Int 10 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_11, /*Int 11 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_12, /*Int 12 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_13, /*Int 13 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_14, /*Int 14 type / priority level ExtLevel / 2 */
+ OS_INTR_CONNECT_15, /*Int 15 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_16, /*Int 16 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_17, /*Int 17 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_18, /*Int 18 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_19, /*Int 19 type / priority level Timer / 2 */
+ OS_INTR_CONNECT_20, /*Int 20 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_21, /*Int 21 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_22, /*Int 22 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_23, /*Int 23 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_24, /*Int 24 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_25, /*Int 25 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_26, /*Int 26 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_27, /*Int 27 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_28, /*Int 28 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_29, /*Int 29 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_30, /*Int 30 type / priority level ExtLevel / 1 */
+ OS_INTR_CONNECT_31, /*Int 31 type / priority level ExtEdge / 1 */
+ OS_INTR_CONNECT_BUTT
+};
+
+#define UCOM_SET_WFI_NMI(var1) asm ("waiti 5": :)
+
+#define UCOM_FlushCache(pAddr, uwSize) \
+ xthal_dcache_region_writeback(pAddr, uwSize)
+
+#define UCOM_FlushCacheAll() \
+ xthal_dcache_all_writeback()
+
+#define UCOM_InvalidateCache(pAddr, uwSize) \
+ xthal_dcache_region_invalidate(pAddr, uwSize)
+
+#define UCOM_InvalidateCacheAll() \
+ xthal_dcache_all_invalidate()
+
+#define ADD_TAG asm("movi a1, 0xdeadbaaf \n movi a2, 0xe8075e80 \n s32i a1, a2, 0": :)
+
+//typedef void (*HOOK_FUN_TYPE)(void);
+typedef void (*HOOK_FUN_TYPE)(unsigned int);
+
+typedef void (*INTR_HOOK_FUN_TYPE )(unsigned int uwIntNo);
+
+typedef void (*VOS_EXCEPTION_HOOK_FUNC)( unsigned int uwExceptionNo);
+
+extern void *g_pfVosHookFuncTable[OS_HOOK_TYPE_BUTT];
+
+extern void VOS_ConnectInterrupt(unsigned int uwIntrNo, HOOK_FUN_TYPE pfnInterruptHook);
+
+extern void VOS_EnableInterrupt(unsigned int uwIntNo);
+extern void VOS_DisableInterrupt(unsigned int uwIntNo);
+
+extern void OS_UserExit(void);
+
+
+#endif /* end of cpu_c.h */
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_comm.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_comm.h
new file mode 100644
index 00000000..37646777
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_comm.h
@@ -0,0 +1,45 @@
+/*******************************************************************************
+* 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 __DSP_COMM_H__
+#define __DSP_COMM_H__
+
+#include <xtensa/config/core.h>
+#include <xtensa/simcall.h>
+
+#define DSP_FLUSH_PIECE_CACHE(addr, size) xthal_dcache_region_writeback(addr, size)
+#define DSP_FLUSH_ALL_CACHE() xthal_dcache_all_writeback()
+#define DSP_INVALIDATE_PIECE_CACHE(addr, size) xthal_dcache_region_invalidate(addr, size)
+#define DSP_INVALIDATE_ALL_CACHE() xthal_dcache_all_invalidate()
+
+#define memset(d,uCData,size) dsp_memset(d,uCData,size)
+#define memcpy(d,s,size) dsp_memcpy(d,s,size)
+#define divsi3(a,b) division(a,b)
+#define _divsi3(a,b) division(a,b)
+
+void dsp_memcpy(void *d, void *s, unsigned int size);
+void dsp_memset(void *d, unsigned char ucData, unsigned int size);
+int division(int a, int b);
+
+#endif /* end of dsp_comm.h */
+
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_debug.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_debug.h
new file mode 100644
index 00000000..0ca2d373
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_debug.h
@@ -0,0 +1,71 @@
+/*******************************************************************************
+* 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 __DSP_DEBUG_H__
+#define __DSP_DEBUG_H__
+
+
+#define DEBUG_LEVEL 0
+#define INFO_LEVEL 1
+#define WARNING_LEVEL 1
+#define ERROR_LEVEL 1
+#define TRACE_DUMP 1
+
+#define LOG_TAG " DSP_LOG"
+
+#if TRACE_DUMP
+#define DSP_TRACE(fmt, ...) print_log(fmt" @%s:%d \n", ##__VA_ARGS__, __FUNCTION__, __LINE__)
+#else
+#define DSP_TRACE(fmt, ...)
+#endif
+
+#if DEBUG_LEVEL
+#define DSP_LOGD(fmt, ...) print_log(LOG_TAG"[D]%s:%d: "fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
+#else
+#define DSP_LOGD(fmt, ...)
+#endif
+
+#if INFO_LEVEL
+#define DSP_LOGI(fmt, ...) print_log(LOG_TAG"[I]%s:%d: "fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
+#else
+#define DSP_LOGI(fmt, ...)
+#endif
+
+#if WARNING_LEVEL
+#define DSP_LOGW(fmt, ...) print_log(LOG_TAG"[W]%s:%d: "fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
+#else
+#define DSP_LOGW(fmt, ...)
+#endif
+
+#if ERROR_LEVEL
+#define DSP_LOGE(fmt, ...) print_log(LOG_TAG"[E]%s:%d: "fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
+#else
++#define DSP_LOGE(fmt, ...)
+#endif
+
+
+void print_log(const char *fmt, ...);
+void dsp_debug_init();
+#ifdef HIKEY_XAF_IPC_COMMENT_OUT
+void dsp_om_func_proc(char *om_str, unsigned int str_len);
+#endif
+#endif
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_ipc.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_ipc.h
new file mode 100644
index 00000000..2228f32a
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_ipc.h
@@ -0,0 +1,61 @@
+/*******************************************************************************
+* 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 __DSP_DRIVER_IPC_H__
+#define __DSP_DRIVER_IPC_H__
+
+#if 0
+#define DSP_IPC_FROM_AP_INT_NO (3)
+#define DSP_SYS_IPC_BASE_ADDR_NS (0xe896b000)
+#define DSP_AP_TO_DSP_MAILBOX_NO (18)
+#define DSP_DSP_TO_AP_MAILBOX_NO (2)
+#define IPC_BUSY_RETRY_COUNT (1000)
+#define IPC_ACPU_INT_SRC_HIFI_MSG (1)
+#define BIT_MASK(n) (1 << (n))
+
+#define WORD_REF(address) (* ((unsigned int volatile *) (address)))
+
+#define SYS_IPC_LOCK(base) WORD_REF(base + 0xA00)
+#define SYS_IPC_ICLR(base, box) WORD_REF(base + ((box) << 6) + 0x18)
+#define SYS_IPC_DATA(base, box, num) WORD_REF(base + ((box) << 6) + 0x20 + ((num) << 2))
+#define SYS_IPC_CPUIRST(base, core) WORD_REF(base + 0x804 + ((core) << 3))
+#define SYS_IPC_MODE(base, box) WORD_REF(base + ((box) << 6) + 0x10)
+#define SYS_IPC_SOURCE(base, box) WORD_REF(base + ((box) << 6))
+#define SYS_IPC_DEST(base, box) WORD_REF(base + ((box) * 64) + 0x04)
+#define SYS_IPC_SEND(base, box) WORD_REF(base + ((box) << 6) + 0x1c)
+#define SYS_IPC_IMASK(base, box) WORD_REF(base + ((box) << 6) + 0x14)
+#define SYS_IPC_DCLR(base, box) WORD_REF(base + ((box) * 64) + 0x08)
+#define SYS_IPC_CPUIMST(base, core) WORD_REF(base + 0x800 + ((core) * 8))
+#define SYS_IPC_MODE_ACK (7)
+#define SYS_IPC_MODE_IDLE (4)
+#define SYS_IPC_MODE_AUTOACK (0)
+
+#define SYS_IPC_CORE_HIFI (4)
+#define SYS_IPC_CORE_A15 (0)
+#define SYS_IPC_CORE_LPM3 (3)
+#endif
+#if 0
+extern void dsp_ipc_init(void);
+extern void dsp_ipc_wait(void);
+#endif
+#endif
+
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_mailbox.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_mailbox.h
new file mode 100644
index 00000000..8730df2c
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_driver_mailbox.h
@@ -0,0 +1,170 @@
+/*******************************************************************************
+* 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 __DSP_DRIVER_MAILBOX_H__
+#define __DSP_DRIVER_MAILBOX_H__
+
+#include <stdint.h>
+
+#define HIKEY_MSG_HEAD_PROTECT_WORD 0xffff1234
+#define HIKEY_MSG_BODY_PROTECT_WORD 0xffff4321
+
+#define HIKEY_MSG_ID_AP_DSP_OM_CMD 0xDDCB
+#define HIKEY_AUDIO_DSP_AP_OM_CMD 0xDDC9
+
+typedef enum HIFI_MSG_ID_ {
+
+ /*DTS command id from ap*/
+ ID_AP_AUDIO_SET_DTS_ENABLE_CMD = 0xDD36,
+ ID_AP_AUDIO_SET_DTS_DEV_CMD = 0xDD38,
+ ID_AP_AUDIO_SET_DTS_GEQ_CMD = 0xDD39,
+ ID_AP_AUDIO_SET_DTS_GEQ_ENABLE_CMD = 0xDD3B,
+
+ /* APºÍHIFIµÄ¿ØÖÆÍâÖöú»úHIFI codecœ»»¥ÏûÏ¢ */
+ ID_AP_AUDIO_SET_EXCODEC_ENABLE_CMD = 0xDD3D,
+
+ /* Voice Record */
+ ID_AP_HIFI_VOICE_RECORD_START_CMD = 0xDD40,
+ ID_AP_HIFI_VOICE_RECORD_STOP_CMD = 0xDD41,
+
+ /* voicePP MSG_ID */
+ ID_AP_VOICEPP_START_REQ = 0xDD42, /* Æô¶¯VOICEPPÍš»° */
+ ID_VOICEPP_MSG_START = ID_AP_VOICEPP_START_REQ,
+ ID_VOICEPP_AP_START_CNF = 0xDD43,
+ ID_AP_VOICEPP_STOP_REQ = 0xDD44, /* ÖÕÖ¹VOICEPPÍš»° */
+ ID_VOICEPP_AP_STOP_CNF = 0xDD45,
+ ID_VOICEPP_MSG_END = 0xDD4A,
+
+ ID_AP_AUDIO_PLAY_START_REQ = 0xDD51,/* APÆô¶¯Hifi audio player requestÃüÁî */
+ ID_AUDIO_AP_PLAY_START_CNF = 0xDD52,/* HifiÆô¶¯audio playerºó»ØžŽAP confirmÃüÁî */
+ ID_AP_AUDIO_PLAY_PAUSE_REQ = 0xDD53,/* APÍ£Ö¹Hifi audio player requestÃüÁî */
+ ID_AUDIO_AP_PLAY_PAUSE_CNF = 0xDD54,/* HifiÍ£Ö¹audio playerºó»ØžŽAP confirmÃüÁî */
+ ID_AUDIO_AP_PLAY_DONE_IND = 0xDD56,/* HifiÍšÖªAP audio playerÒ»¿éÊýŸÝ²¥·ÅÍê±Ï»òÕß²¥·ÅÖжÏindication */
+ ID_AP_AUDIO_PLAY_UPDATE_BUF_CMD = 0xDD57,/* APÍšÖªHifiÐÂÊýŸÝ¿éžüÐÂcommand */
+ ID_AP_AUDIO_PLAY_QUERY_TIME_REQ = 0xDD59,/* AP²éѯHifi audio player²¥·Åœø¶ÈrequestÃüÁî */
+ ID_AP_AUDIO_PLAY_WAKEUPTHREAD_REQ = 0xDD5A,
+ ID_AUDIO_AP_PLAY_QUERY_TIME_CNF = 0xDD60,/* Hifi»ØžŽAP audio player²¥·Åœø¶ÈconfirmÃüÁî */
+ ID_AP_AUDIO_PLAY_QUERY_STATUS_REQ = 0xDD61,/* AP²éѯHifi audio player²¥·Å׎̬requestÃüÁî */
+ ID_AUDIO_AP_PLAY_QUERY_STATUS_CNF = 0xDD62,/* Hifi»ØžŽAP audio player²¥·Å׎̬confirmÃüÁî */
+ ID_AP_AUDIO_PLAY_SEEK_REQ = 0xDD63,/* AP seek Hifi audio playerµœÄ³Ò»Î»ÖÃrequestÃüÁî */
+ ID_AUDIO_AP_PLAY_SEEK_CNF = 0xDD64,/* Hifi»ØžŽAP seekœá¹ûconfirmÃüÁî */
+ ID_AP_AUDIO_PLAY_SET_VOL_CMD = 0xDD70,/* APÉèÖÃÒôÁ¿ÃüÁî */
+ ID_AP_AUDIO_RECORD_PCM_HOOK_CMD = 0xDD7A,/* AP ÍšÖªHIFI¿ªÊŒ×¥È¡PCMÊýŸÝ */
+ ID_AUDIO_AP_UPDATE_PCM_BUFF_CMD = 0xDD7C,
+ ID_AP_AUDIO_DYN_EFFECT_GET_PARAM = 0xDD7D,
+ ID_AP_AUDIO_DYN_EFFECT_GET_PARAM_CNF = 0xDD7E,
+ ID_AP_AUDIO_DYN_EFFECT_TRIGGER = 0xDD7F,
+ /* enhance msgid between ap and hifi */
+ ID_AP_HIFI_ENHANCE_START_REQ = 0xDD81,
+ ID_HIFI_AP_ENHANCE_START_CNF = 0xDD82,
+ ID_AP_HIFI_ENHANCE_STOP_REQ = 0xDD83,
+ ID_HIFI_AP_ENHANCE_STOP_CNF = 0xDD84,
+ ID_AP_HIFI_ENHANCE_SET_DEVICE_REQ = 0xDD85,
+ ID_HIFI_AP_ENHANCE_SET_DEVICE_CNF = 0xDD86,
+
+ /* audio enhance msgid between ap and hifi */
+ ID_AP_AUDIO_ENHANCE_SET_DEVICE_IND = 0xDD91,
+ ID_AP_AUDIO_MLIB_SET_PARA_IND = 0xDD92,
+ ID_AP_AUDIO_CMD_SET_SOURCE_CMD = 0xDD95,
+ ID_AP_AUDIO_CMD_SET_DEVICE_CMD = 0xDD96,
+ ID_AP_AUDIO_CMD_SET_MODE_CMD = 0xDD97,
+ ID_AP_AUDIO_CMD_SET_ANGLE_CMD = 0xDD99,
+
+ /* for 3mic */
+ ID_AP_AUDIO_ROUTING_COMPLETE_REQ = 0xDDC0,/*AP ÍšÖªHIFI 3Mic/4Mic ͚·ÒÑœšÁ¢*/
+ ID_AUDIO_AP_DP_CLK_EN_IND = 0xDDC1,/* HIFI ÍšÖªAºËŽò¿ª»ò¹Ø±ÕCodec DPʱÖÓ */
+ ID_AP_AUDIO_DP_CLK_STATE_IND = 0xDDC2,/* AºËÍšÖªHIFI £¬Codec DPʱÖÓ׎̬( Žò¿ª»ò¹Ø±Õ) */
+ ID_AUDIO_AP_OM_DUMP_CMD = 0xDDC3,/* HIFI ÍšÖªAºËdumpÈÕÖŸ */
+ ID_AUDIO_AP_FADE_OUT_REQ = 0xDDC4,/* HIFIÍšÖªAP×öµ­³öŽŠÀí */
+ ID_AP_AUDIO_FADE_OUT_IND = 0xDDC5,/* APÍšÖªHIFIµ­³öÍê±Ï */
+
+ ID_AUDIO_AP_OM_CMD = 0xDDC9,
+ ID_AP_AUDIO_STR_CMD = 0xDDCB,/* APžøHIFI·¢ËÍÒ»žö×Ö·ûŽ®£¬ŸßÌ庬ÒåhifiÖÐœâÎö */
+ ID_AUDIO_AP_VOICE_BSD_PARAM_CMD = 0xDDCC,/* VOICE BSD ²ÎÊýÉϱš */
+
+ ID_AP_ENABLE_MODEM_LOOP_REQ = 0xDDCD,/* the audio hal notify HIFI to start/stop MODEM LOOP*/
+ ID_AP_HIFI_REQUEST_VOICE_PARA_REQ = 0xDF00, /*AP REQUEST VOICE MSG*/
+ ID_HIFI_AP_REQUEST_VOICE_PARA_CNF = 0xDF01, /*HIFI REPLAY VOICE MSG*/
+
+ /* XAF message IDs */
+ ID_XAF_AP_TO_DSP = 0xDF10,
+ ID_XAF_DSP_TO_AP = 0xDF11,
+} HIFI_MSG_ID;
+
+#define HIKEY_AP2DSP_MSG_QUEUE_ADDR HIFI_HIKEY_SHARE_MEM_ADDR
+
+#define HIKEY_AP2DSP_MSG_QUEUE_SIZE 0x1800
+#define HIKEY_DSP2AP_MSG_QUEUE_ADDR (HIKEY_AP2DSP_MSG_QUEUE_ADDR + HIKEY_AP2DSP_MSG_QUEUE_SIZE)
+#define HIKEY_DSP2AP_MSG_QUEUE_SIZE 0x1800
+
+#define HIKEY_AP_DSP_MSG_MAX_LEN 100
+/////////////////////////////////////////////////////////////////////
+// XAF STRUCTURES //
+/////////////////////////////////////////////////////////////////////
+#ifdef GJB_CHANGE
+/* ...command/response message */
+typedef struct xf_proxy_msg {
+ /* ...session ID */
+ uint32_t id;
+
+ /* ...proxy API command/reponse code */
+ uint32_t opcode;
+
+ /* ...length of attached buffer */
+ uint32_t length;
+
+ /* ...shared logical address of message buffer */
+ uint64_t address;
+
+} __attribute__((__packed__)) xf_proxy_msg_t;
+
+struct hikey_ap_dsp_msg_head {
+ unsigned int head_protect_word;
+ unsigned int msg_num;
+ unsigned int read_pos;
+ unsigned int write_pos;
+};
+
+/*struct hikey_ap_dsp_msg_body {
+ unsigned short msg_id;
+ unsigned short msg_len;
+ char msg_content[0];
+};*/
+
+struct hikey_ap_dsp_msg_body {
+ unsigned short msg_id;
+ unsigned short msg_len;
+ union {
+ char msg_content[0];
+ struct xf_proxy_msg xf_dsp_msg;
+ };
+};
+struct hikey_msg_with_content {
+ struct hikey_ap_dsp_msg_body msg_info;
+ char msg_content[HIKEY_AP_DSP_MSG_MAX_LEN];
+};
+void dsp_init_share_mem(char *share_mem_addr, unsigned int share_mem_size);
+int dsp_mailbox_read(struct hikey_msg_with_content *hikey_msg);
+void dsp_msg_process(struct hikey_msg_with_content *hikey_msg);
+#else
+#endif
+#endif
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_memory_config.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_memory_config.h
new file mode 100644
index 00000000..fd5a93d3
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_memory_config.h
@@ -0,0 +1,96 @@
+/*******************************************************************************
+* 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 __DSP_MEMORY_CONFIG_H__
+#define __DSP_MEMORY_CONFIG_H__
+
+/** for chicago only **/
+/**Non Secure 3.5M **/
+/* |0x8B300000|0x8B432000|0x8B532000|0x8B5B1000|0x8B5B2000|0x8B5C5000|0x8B5C6000|0x8B5C7000|0x8B5F9800|~~0x8B609800~~|~~0x8B618800~~|~0x8B618880~|0x8B627880|~0x8B629880~|0x8B62C880~~~| */
+/* |Music data|~~PCM data|~hifi uart|panicstack|icc debug~|flag data~|DDRsechead|~~AP NV ~~|AP&HIFIMB~|codec dma buff|codecdmaconfig|soundtrigger|pcm upload|~hikey share|unsec reserve| */
+/* |~~~~1.2M~~|~~~~1M~~~~|~~508k~~~~|~~~~~4k~~~|~~76k~~~~~|~~~4k~~~~~|~~~4k~~~~~|~~202k~~~~|~~~64k~~~~|~~~~60k~~~~~~~|~~~~128b~~~~~~|~~~~60k~~~~~|~~~8k~~~~~|~~~~~12k~~~~|~~334k-128b~~| */
+/* |0x8B431fff|0x8B531fff|0x8B5B0fff|0x8B5B1fff|0x8B5C4fff|0x8B5C5fff|0x8B5C6fff|0x8B5F97ff|0x8B6097ff|~~0x8B6187FF~~|~~0x8B61887F~~|~0x8B62787F~|0x8B62987F|0x8B62C87F~~|~~0x8B67FFFF~| */
+
+/** Secure9.5M **/
+/* |~~~0x89200000~~~|~~~0x89800000~~~|~~~0x89830000~~|~~~0x89864000~~~| */
+/* |~~HIFI RUNNING~~|~OCRAM img bak~~|~~TCM img bak~~|~~~~IMG bak~~~~~| */
+/* |~~~~~~~6M~~~~~~~|~~~~~~192K~~~~~~|~~~~~208k~~~~~~|~~~~~~3.1M ~~~~~| */
+/* |~~~0x897fffff~~~|~~~0x8982ffff~~~|~~~0x89863fff~~|~~~0x89B80000~~~| */
+
+
+#define HIFI_UNSEC_REGION_SIZE (0x380000)
+#define HIFI_MUSIC_DATA_SIZE (0x132000)
+#define PCM_PLAY_BUFF_SIZE (0x100000)
+#define DRV_DSP_UART_TO_MEM_SIZE (0x7f000)
+#define DRV_DSP_UART_TO_MEM_RESERVE_SIZE (0x100)
+#define DRV_DSP_STACK_TO_MEM_SIZE (0x1000)
+#define HIFI_ICC_DEBUG_SIZE (0x13000)
+#define HIFI_FLAG_DATA_SIZE (0x1000)
+#define HIFI_SEC_HEAD_SIZE (0x1000)
+#define HIFI_AP_NV_DATA_SIZE (0x32800)
+#define HIFI_AP_MAILBOX_TOTAL_SIZE (0x10000)
+#define CODEC_DSP_OM_DMA_BUFFER_SIZE (0xF000)
+#define CODEC_DSP_OM_DMA_CONFIG_SIZE (0x80)
+#define CODEC_DSP_SOUNDTRIGGER_TOTAL_SIZE (0xF000)
+#define HIFI_PCM_UPLOAD_BUFFER_SIZE (0x2000)
+#define HIFI_HIKEY_SHARE_SIZE (0x1800 * 2)
+#define HIFI_UNSEC_RESERVE_SIZE (0x53780)
+
+#define HIFI_UNSEC_BASE_ADDR (0x8B300000)
+#define HIFI_MUSIC_DATA_LOCATION (HIFI_UNSEC_BASE_ADDR)
+#define PCM_PLAY_BUFF_LOCATION (HIFI_MUSIC_DATA_LOCATION + HIFI_MUSIC_DATA_SIZE)
+#define DRV_DSP_UART_TO_MEM (PCM_PLAY_BUFF_LOCATION + PCM_PLAY_BUFF_SIZE)
+#define DRV_DSP_STACK_TO_MEM (DRV_DSP_UART_TO_MEM + DRV_DSP_UART_TO_MEM_SIZE)
+#define HIFI_ICC_DEBUG_LOCATION (DRV_DSP_STACK_TO_MEM + DRV_DSP_STACK_TO_MEM_SIZE)
+#define HIFI_FLAG_DATA_ADDR (HIFI_ICC_DEBUG_LOCATION + HIFI_ICC_DEBUG_SIZE)
+#define HIFI_SEC_HEAD_BACKUP (HIFI_FLAG_DATA_ADDR + HIFI_FLAG_DATA_SIZE)
+#define HIFI_AP_NV_DATA_ADDR (HIFI_SEC_HEAD_BACKUP + HIFI_SEC_HEAD_SIZE)
+#define HIFI_AP_MAILBOX_BASE_ADDR (HIFI_AP_NV_DATA_ADDR + HIFI_AP_NV_DATA_SIZE)
+#define CODEC_DSP_OM_DMA_BUFFER_ADDR (HIFI_AP_MAILBOX_BASE_ADDR + HIFI_AP_MAILBOX_TOTAL_SIZE)
+#define CODEC_DSP_OM_DMA_CONFIG_ADDR (CODEC_DSP_OM_DMA_BUFFER_ADDR + CODEC_DSP_OM_DMA_BUFFER_SIZE)
+#define CODEC_DSP_SOUNDTRIGGER_BASE_ADDR (CODEC_DSP_OM_DMA_CONFIG_ADDR + CODEC_DSP_OM_DMA_CONFIG_SIZE)
+#define HIFI_PCM_UPLOAD_BUFFER_ADDR (CODEC_DSP_SOUNDTRIGGER_BASE_ADDR + CODEC_DSP_SOUNDTRIGGER_TOTAL_SIZE)
+#define HIFI_HIKEY_SHARE_MEM_ADDR (HIFI_PCM_UPLOAD_BUFFER_ADDR+HIFI_AP_MAILBOX_TOTAL_SIZE)
+#define HIFI_UNSEC_RESERVE_ADDR (HIFI_HIKEY_SHARE_MEM_ADDR + HIFI_HIKEY_SHARE_SIZE)
+
+#define DRV_DSP_PANIC_MARK (HIFI_FLAG_DATA_ADDR)
+#define DRV_DSP_UART_LOG_LEVEL (DRV_DSP_PANIC_MARK + 4)
+#define DRV_DSP_UART_TO_MEM_CUR_ADDR (DRV_DSP_UART_LOG_LEVEL + 4)
+
+#define HIFI_SEC_REGION_SIZE (0x980000)
+#define HIFI_IMAGE_OCRAMBAK_SIZE (0x30000)
+#define HIFI_RUN_SIZE (0x600000)
+#define HIFI_IMAGE_TCMBAK_SIZE (0x34000)
+#define HIFI_IMAGE_SIZE (0x31C000)
+#define HIFI_RUN_ITCM_BASE (0xe8080000)
+#define HIFI_RUN_ITCM_SIZE (0x9000)
+#define HIFI_RUN_DTCM_BASE (0xe8058000)
+#define HIFI_RUN_DTCM_SIZE (0x28000)
+
+
+#define HIFI_SEC_REGION_ADDR (0x89200000) /* chciago */
+#define HIFI_RUN_LOCATION (HIFI_SEC_REGION_ADDR)
+#define HIFI_IMAGE_OCRAMBAK_LOCATION (HIFI_RUN_LOCATION + HIFI_RUN_SIZE)
+#define HIFI_IMAGE_TCMBAK_LOCATION (HIFI_IMAGE_OCRAMBAK_LOCATION + HIFI_IMAGE_OCRAMBAK_SIZE)
+#define HIFI_IMAGE_LOCATION (HIFI_IMAGE_TCMBAK_LOCATION + HIFI_IMAGE_TCMBAK_SIZE)
+
+#endif
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_pcm_gain.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_pcm_gain.h
new file mode 100644
index 00000000..24f94ec1
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/dsp_pcm_gain.h
@@ -0,0 +1,37 @@
+/*******************************************************************************
+* 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 DSP_PCM_GAIN_H
+#define __DSP_PCM_GAIN_H__
+#include "dsp_memory_config.h"
+#define FRAME_SIZE 480 // 10 ms @ 48 KHz.
+#define HOLD_BUF_SIZE 228404
+#define MSG_RECV 1 // Msg received
+#define MSG_PROC 2 // Msg processed.
+#define MSG_COMP 8
+#define MSG_INCOMP 9
+#define MUSIC_DATA_MEM_READ_ADDR HIFI_MUSIC_DATA_LOCATION // Address of the Music data memory.. !!! change this if necessary..
+#define PCM_DATA_MEM_WRITE_ADDR PCM_PLAY_BUFF_LOCATION // Address of some random element in PCM data memory.. !!! change this if necessary..
+int ReadData( char *pDst, int Size );
+int WriteData( char *pSrc, int Size );
+int processAudio( int *pDst, int *pSrc, int Size );
+#endif
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/reset.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/reset.h
new file mode 100644
index 00000000..5a77a97d
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/reset.h
@@ -0,0 +1,62 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+
+#include <xtensa/coreasm.h>
+#include <xtensa/simcall.h>
+#define PIF_CACHED 1
+#define PIF_BYPASS 2
+#define PIF_CACHED_WBA 4
+#define PIF_CACHED_WBNA 5
+#define PIF_INVALID 15
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif
+
+
+
+/*set memory mapping attribute*/
+.macro set_access_mode am
+ rdtlb1 a4, a3
+ ritlb1 a5, a3
+ srli a4, a4, 4
+ slli a4, a4, 4
+ srli a5, a5, 4
+ slli a5, a5, 4
+ addi a4, a4, \am
+ addi a5, a5, \am
+ wdtlb a4, a3
+ witlb a5, a3
+.endm
+
+
+
+
+#ifdef __cplusplus
+ #if __cplusplus
+ }
+ #endif
+#endif
+
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/xf-board.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/xf-board.h
new file mode 100644
index 00000000..e42ab1b9
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/board-hikey/xf-board.h
@@ -0,0 +1,180 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * board-hikey/xf-board.h
+ *
+ * HiKey960-specific definitions
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-board.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Global constants definitions
+ ******************************************************************************/
+
+/* ...shared memory interface address */
+#define XF_CFG_SHMEM_ADDRESS(core) HIFI_HIKEY_SHARE_MEM_ADDR
+
+/* ...tracing buffer configuration (place at the end of memory) */
+#define XF_CFG_TRACE_START(core) 0x78000000
+#define XF_CFG_TRACE_END(core) 0x7FFFFFFF
+#if 1
+#define DSP_IPC_FROM_AP_INT_NO (3)
+#define DSP_SYS_IPC_BASE_ADDR_NS (0xe896b000)
+#define DSP_AP_TO_DSP_MAILBOX_NO (18)
+#define DSP_DSP_TO_AP_MAILBOX_NO (2)
+#define IPC_BUSY_RETRY_COUNT (1000)
+#define IPC_ACPU_INT_SRC_HIFI_MSG (1)
+#define BIT_MASK(n) (1 << (n))
+
+#define WORD_REF(address) (* ((unsigned int volatile *) (address)))
+
+#define SYS_IPC_LOCK(base) WORD_REF(base + 0xA00)
+#define SYS_IPC_ICLR(base, box) WORD_REF(base + ((box) << 6) + 0x18)
+#define SYS_IPC_DATA(base, box, num) WORD_REF(base + ((box) << 6) + 0x20 + ((num) << 2))
+#define SYS_IPC_CPUIRST(base, core) WORD_REF(base + 0x804 + ((core) << 3))
+#define SYS_IPC_MODE(base, box) WORD_REF(base + ((box) << 6) + 0x10)
+#define SYS_IPC_SOURCE(base, box) WORD_REF(base + ((box) << 6))
+#define SYS_IPC_DEST(base, box) WORD_REF(base + ((box) * 64) + 0x04)
+#define SYS_IPC_SEND(base, box) WORD_REF(base + ((box) << 6) + 0x1c)
+#define SYS_IPC_IMASK(base, box) WORD_REF(base + ((box) << 6) + 0x14)
+#define SYS_IPC_DCLR(base, box) WORD_REF(base + ((box) * 64) + 0x08)
+#define SYS_IPC_CPUIMST(base, core) WORD_REF(base + 0x800 + ((core) * 8))
+#define SYS_IPC_MODE_ACK (7)
+#define SYS_IPC_MODE_IDLE (4)
+#define SYS_IPC_MODE_AUTOACK (0)
+
+#define SYS_IPC_CORE_HIFI (4)
+#define SYS_IPC_CORE_A15 (0)
+#define SYS_IPC_CORE_LPM3 (3)
+#endif
+/* ...inter-processor interrupt number (SEL:10 - LEVEL:15) */
+#define XF_PROXY_IPI_NUM(core) 15
+
+/*******************************************************************************
+ * External functions
+ ******************************************************************************/
+
+/* ...gdb stub initialization */
+extern void init_gdbstub(void);
+
+/* ...emit breakpoint */
+extern void breakpoint(void);
+#if 0// def HIKEY_XAF_IPC_COMMENT_OUT
+/*******************************************************************************
+ * Public proxy API
+ ******************************************************************************/
+
+/* ...notify remote side about status change */
+#define XF_PROXY_NOTIFY_PEER(core) h2_wake_core()
+
+/* ...clear pending interrupt mask */
+#define XF_PROXY_SYNC_PEER(core) h2_local_ack()
+
+/*******************************************************************************
+ * Auxiliary helper functions
+ ******************************************************************************/
+
+/* ...generate inter-processor interrupt for remote core */
+static inline void h2_wake_core(void)
+{
+ /* ...we have single INPUT-interrupt pin */
+ *(volatile unsigned int *)0xec800044 = 1;
+}
+
+/* ...acknowledge pending IPI interrupt */
+static inline void h2_local_ack(void)
+{
+ /* ...asserted interrupt cannot be cleared */
+}
+
+/*******************************************************************************
+ * Board specific init
+ ******************************************************************************/
+
+static inline void xf_board_init(void)
+{
+ /* ...initialize GDB debugging interface */
+ init_gdbstub();
+
+ /* ...indicate the board has started */
+ *(volatile unsigned int *)0xec800100 = 1;
+}
+#else
+//#define XF_PROXY_NOTIFY_PEER(core) dsp_ipc_send_irq_to_ap()
+#define XF_PROXY_NOTIFY_PEER(core) h2_wake_core()
+/* ...clear pending interrupt mask */
+#define XF_PROXY_SYNC_PEER(core) h2_local_ack()
+
+/* ...generate inter-processor interrupt for remote core */
+static inline void h2_wake_core(void)
+{
+ unsigned int mode = 0;
+ unsigned int mode_1 = 0;
+
+ // mode = SYS_IPC_MODE(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO);
+ //mode = (* ((unsigned int volatile *) (0xe896b000 + ((2) << 6) + 0x10)));
+ mode = * (volatile unsigned int*) 0xe896b090;
+
+ //if (mode & BIT_MASK(SYS_IPC_MODE_IDLE)) {
+ //if (mode & (1 << (4))) {
+ if (mode & 0x10) {
+ mode_1=0;
+ } else {
+ return;
+ }
+
+ //SYS_IPC_SOURCE(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = BIT_MASK(SYS_IPC_CORE_HIFI);
+ //(* ((unsigned int volatile *) (0xe896b000 + ((2) << 6))))= (1 << (4));
+ * (volatile unsigned int *) 0xe896b080 = (0x10);
+
+ //SYS_IPC_IMASK(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = ~((unsigned int)(BIT_MASK(SYS_IPC_CORE_HIFI)|BIT_MASK(SYS_IPC_CORE_A15)));
+ //(* ((unsigned int volatile *) (0xe896b000 + ((2) << 6) + 0x14))) = ~ ((unsigned int)((1 << (4))|(1 << (0))));
+ * (volatile unsigned int *)0xe896b094 = ~ ((unsigned int)(0x11));
+
+ //SYS_IPC_DATA(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO, 0) = IPC_ACPU_INT_SRC_HIFI_MSG;
+ //(* ((unsigned int volatile *) (0xe896b000 + ((2) << 6) + 0x20 + ((0) << 2)))) = 1;
+ * (volatile unsigned int *) 0xe896b0A0 = 1;
+
+ //SYS_IPC_MODE(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = BIT_MASK(SYS_IPC_MODE_AUTOACK);
+ //(* ((unsigned int volatile *) (0xe896b000 + ((2) << 6) + 0x10))) = (1 << (0));
+ * (volatile unsigned int *) 0xe896b090 = 1;
+
+ //SYS_IPC_SEND(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = BIT_MASK(SYS_IPC_CORE_HIFI);
+ //(* ((unsigned int volatile *) (0xe896b000 + ((2) << 6) + 0x1c))) = (1 << (4));
+ * (volatile unsigned int *) 0xe896b09C = 0x10;
+
+ return;
+}
+
+/* ...acknowledge pending IPI interrupt */
+static inline void h2_local_ack(void)
+{
+ /* ...asserted interrupt cannot be cleared */
+}
+
+#endif
+
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-config.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-config.h
new file mode 100644
index 00000000..4775e807
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-config.h
@@ -0,0 +1,63 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-config.h
+ *
+ * Xtensa target configuration parameters
+ *
+ *******************************************************************************/
+
+/* ...number of DSP cores */
+#define XF_CFG_CORES_NUM 1
+
+/* ...size of the internal message pool (make it equal to at least ring-buffer) */
+#define XF_CFG_MESSAGE_POOL_SIZE 256
+
+/* ...local IPC is coherent (say) */
+#define XF_LOCAL_IPC_NON_COHERENT 0
+
+/* ...remote IPC is non coherent (say) */
+#define XF_REMOTE_IPC_NON_COHERENT 1
+
+/* ...size of the local memory pool (in bytes) */
+#define XF_CFG_LOCAL_POOL_SIZE (1024 << 10)
+
+/* ...size of the shared memory pool (in bytes) */
+#if 1//def XAF_ENABLE_NON_HIKEY
+#define XF_CFG_REMOTE_IPC_POOL_SIZE (256 << 10)
+#else
+#define XF_CFG_REMOTE_IPC_POOL_SIZE (HIFI_MUSIC_DATA_SIZE)
+#endif
+
+/* ...size of the local memory pool (in bytes) */
+#define XF_CFG_LOCAL_IPC_POOL_SIZE (1024 << 10)
+#ifdef XAF_ENABLE_NON_HIKEY
+/* ...maximal size of scratch memory is 80 KB */
+#define XF_CFG_CODEC_SCRATCHMEM_SIZE (80 << 10)
+#else
+/* ...maximal size of scratch memory is 56 KB */
+#define XF_CFG_CODEC_SCRATCHMEM_SIZE (56 << 10)
+#endif
+
+/* ...scratch memory is 8-bytes aligned */
+#define XF_CFG_CODEC_SCRATCHMEM_ALIGN 8
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-hal.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-hal.h
new file mode 100644
index 00000000..82cf3c11
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-hal.h
@@ -0,0 +1,151 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-hal.h
+ *
+ * Platform-specific HAL definitions
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-hal.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+/* ...primitive types */
+#include "xf-types.h"
+
+/* ...XTOS runtime */
+#include <xtensa/xtruntime.h>
+
+/*******************************************************************************
+ * Auxilliary macros definitions
+ ******************************************************************************/
+
+/* ...use system-specific cache-line size */
+#define XF_PROXY_ALIGNMENT XCHAL_DCACHE_LINESIZE
+
+/* ...properly aligned shared memory structure */
+#define __xf_shmem__ __attribute__((__aligned__(XF_PROXY_ALIGNMENT)))
+
+/*******************************************************************************
+ * Interrupt control
+ ******************************************************************************/
+
+/* ...disable interrupts on given core */
+static inline u32 xf_isr_disable(u32 core)
+{
+ /* ...no actual dependency on the core identifier */
+ return XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL);
+}
+
+/* ...enable interrupts on given core */
+static inline void xf_isr_restore(u32 core, u32 status)
+{
+ /* ...no actual dependency on the core identifier */
+ XTOS_RESTORE_INTLEVEL(status);
+}
+
+/*******************************************************************************
+ * Auxiliary system-specific functions
+ ******************************************************************************/
+
+#if XF_CFG_CORES_NUM > 1
+/* ...current core identifier (from HW) */
+static inline u32 xf_core_id(void)
+{
+ /* ...retrieve core identifier from HAL */
+ return (u32) xthal_get_prid();
+}
+#else
+#define xf_core_id() 0
+#endif
+
+/*******************************************************************************
+ * Atomic operations (atomicity is assured on local core only)
+ ******************************************************************************/
+
+static inline int xf_atomic_test_and_set(volatile u32 *bitmap, u32 mask)
+{
+ u32 status;
+ u32 v;
+
+ /* ...atomicity is assured by interrupts masking */
+ status = XTOS_DISABLE_ALL_INTERRUPTS;
+ v = *bitmap, *bitmap = v | mask;
+ XTOS_RESTORE_INTLEVEL(status);
+
+ return !(v & mask);
+}
+
+static inline int xf_atomic_test_and_clear(volatile u32 *bitmap, u32 mask)
+{
+ u32 status;
+ u32 v;
+
+ /* ...atomicity is assured by interrupts masking */
+ status = XTOS_DISABLE_ALL_INTERRUPTS;
+ v = *bitmap, *bitmap = v & ~mask;
+ XTOS_RESTORE_INTLEVEL(status);
+
+ return (v & mask);
+}
+
+static inline u32 xf_atomic_set(volatile u32 *bitmap, u32 mask)
+{
+ u32 status;
+ u32 v;
+
+ /* ...atomicity is assured by interrupts masking */
+ status = XTOS_DISABLE_ALL_INTERRUPTS;
+ v = *bitmap, *bitmap = (v |= mask);
+ XTOS_RESTORE_INTLEVEL(status);
+
+ return v;
+}
+
+static inline u32 xf_atomic_clear(volatile u32 *bitmap, u32 mask)
+{
+ u32 status;
+ u32 v;
+
+ /* ...atomicity is assured by interrupts masking */
+ status = XTOS_DISABLE_ALL_INTERRUPTS;
+ v = *bitmap, *bitmap = (v &= ~mask);
+ XTOS_RESTORE_INTLEVEL(status);
+
+ return v;
+}
+
+/*******************************************************************************
+ * Abortion macro (debugger should be configured)
+ ******************************************************************************/
+
+/* ...breakpoint function */
+extern void breakpoint(void);
+
+/* ...abort execution (enter into debugger) */
+#define __xf_abort() breakpoint()
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-ipc.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-ipc.h
new file mode 100644
index 00000000..3ce5bd66
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-ipc.h
@@ -0,0 +1,345 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-ipc.h
+ *
+ * Xtensa IPC mechanism
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-ipc.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+/* ...system-specific shared memory configuration */
+#include "xf-shmem.h"
+#ifndef XAF_ENABLE_NON_HIKEY
+#include <xtensa/xtruntime.h>
+extern volatile int waitstate;
+#endif
+
+#ifdef XAF_ENABLE_NON_HIKEY
+/*******************************************************************************
+ * Macros definitions (should better go to some other header)
+ ******************************************************************************/
+
+/*
+ * Execute WAITI 0 (enabling interrupts) only if *(ptr) is zero.
+ * The decision to execute WAITI is done atomically by disabling
+ * interrupts at level 'level' (level must be a constant)
+ * before checking the pointer. Interrupts are always re-enabled
+ * on exit from this macro.
+ */
+#define _WAITI_ON_PTR(ptr, level) \
+do { \
+ int __tmp; \
+ __asm__ (" rsil %0, " #level " \n" \
+ " l32i %0, %1, 0 \n" \
+ " bnez %0, 1f \n" \
+ " waiti 0 \n" \
+ "1:rsil %0, 0 \n" \
+ : "=a" (__tmp) : "a" (ptr) : "memory"); \
+} while(0)
+
+/* ...enable gdbstub */
+//#define XF_CFG_USE_GDBSTUB 0
+
+#ifndef XF_CFG_USE_GDBSTUB
+/* ...maybe "level" should be hidden here - we always magically set 15 */
+#define WAITI_ON_PTR(ptr, level) _WAITI_ON_PTR(ptr, level)
+#else
+/* ...if debugger is enabled, do polling instead of waiting */
+static inline void WAITI_ON_PTR(volatile u32 *ptr, u32 level)
+{
+ extern void poll_debug_ring(void);
+
+ while (*ptr == 0)
+ {
+ /* ...should be called with interrupts disabled - tbd */
+ poll_debug_ring();
+ }
+}
+#endif
+
+/*******************************************************************************
+ * Remote IPI interrupt mode
+ ******************************************************************************/
+
+/* ...enable/disable IPI interrupt */
+static inline void xf_ipi_enable(u32 core, int on)
+{
+ if (on)
+ _xtos_ints_on(1 << XF_PROXY_IPI_NUM(core));
+ else
+ _xtos_ints_off(1 << XF_PROXY_IPI_NUM(core));
+}
+
+/* ...wait in low-power mode for interrupt arrival if "ptr" is 0 */
+static inline void xf_ipi_wait(u32 core)
+{
+ xf_core_ro_data_t *ro = XF_CORE_RO_DATA(core);
+
+ /* ...enable IPI interrupt before sleeping */
+ xf_ipi_enable(core, 1);
+
+ /* ...wait in low-power mode, atomically checking *ipc != 0 */
+ WAITI_ON_PTR(&ro->ipc.wait, 15);
+
+ /* ...force disabling of IPI interrupts */
+ xf_ipi_enable(core, 0);
+
+ /* ...reset waiting object upon leaving */
+ ro->ipc.wait = 0;
+}
+#else
+#define _WAITI_ON_PTR(ptr, level) \
+ do { \
+ int __tmp; \
+ __asm__ (" rsil %0, " #level " \n" \
+ " l32i %0, %1, 0 \n" \
+ " bnez %0, 1f \n" \
+ " waiti 0 \n" \
+ "1:rsil %0, 0 \n" \
+ : "=a" (__tmp) : "a" (ptr) : "memory"); \
+ } while(0)
+
+#define WAITI_ON_PTR(ptr, level) _WAITI_ON_PTR(ptr, level)
+static inline void xf_ipi_wait(u32 core)
+{
+#if 0
+ // VOS_EnableInterrupt(DSP_IPC_FROM_AP_INT_NO);
+ _xtos_ints_on(1 << DSP_IPC_FROM_AP_INT_NO);
+ while(1)
+ {
+ if(waitstate ==1)
+ {
+ // VOS_DisableInterrupt(DSP_IPC_FROM_AP_INT_NO);
+ _xtos_ints_off(1 << DSP_IPC_FROM_AP_INT_NO);
+ waitstate = 0;
+ break;
+ }
+ }
+#else
+
+ _xtos_ints_on(1 << DSP_IPC_FROM_AP_INT_NO);
+ /* ...wait in low-power mode, atomically checking *ipc != 0 */
+ WAITI_ON_PTR(&waitstate, 15);
+
+ /* ...force disabling of IPI interrupts */
+
+ _xtos_ints_off(1 << DSP_IPC_FROM_AP_INT_NO);
+ /* ...reset waiting object upon leaving */
+ waitstate = 0;
+
+#endif
+}
+#endif
+#ifdef XAF_ENABLE_NON_HIKEY
+/* ...complete IPI waiting (may be called from any context on local core) */
+static inline void xf_ipi_resume(u32 core)
+{
+ xf_core_ro_data_t *ro = XF_CORE_RO_DATA(core);
+
+ /* ...single instruction is written atomically; no need to mask interrupts */
+ ro->ipc.wait = 1;
+}
+#else
+/* ...complete IPI waiting (may be called from any context on local core) */
+static inline void xf_ipi_resume(u32 core)
+{
+ unsigned int ipc_int_state = 0;
+ unsigned int ipc_data = 0;
+
+ _xtos_ints_off(1 << DSP_IPC_FROM_AP_INT_NO);
+
+ //process message
+ ipc_int_state = SYS_IPC_CPUIRST(DSP_SYS_IPC_BASE_ADDR_NS, SYS_IPC_CORE_HIFI);
+
+ if (ipc_int_state & BIT_MASK(DSP_AP_TO_DSP_MAILBOX_NO)) { //mailbox-18
+ SYS_IPC_ICLR(DSP_SYS_IPC_BASE_ADDR_NS, DSP_AP_TO_DSP_MAILBOX_NO) = BIT_MASK(SYS_IPC_CORE_HIFI);
+ waitstate = 1;
+ }
+
+ //_xtos_ints_on(1 << DSP_IPC_FROM_AP_INT_NO);
+
+ return;
+}
+#endif
+#if 0//ndef HIKEY_XAF_IPC_COMMENT_OUT
+/* ...notify remote side about status change */
+//#define XF_PROXY_NOTIFY_PEER(core) dsp_ipc_send_irq_to_ap()
+
+static inline void dsp_ipc_send_irq_to_ap(void)
+{
+ unsigned int mode = 0;
+ unsigned int mode_1 = 0;
+
+ mode = SYS_IPC_MODE(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO);
+
+ if (mode & BIT_MASK(SYS_IPC_MODE_IDLE)) {
+ mode_1=0;
+ } else {
+ return;
+ }
+
+
+ SYS_IPC_SOURCE(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = BIT_MASK(SYS_IPC_CORE_HIFI);
+ SYS_IPC_IMASK(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = ~((unsigned int)(BIT_MASK(SYS_IPC_CORE_HIFI)|BIT_MASK(SYS_IPC_CORE_A15)));
+ SYS_IPC_DATA(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO, 0) = IPC_ACPU_INT_SRC_HIFI_MSG;
+ SYS_IPC_MODE(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = BIT_MASK(SYS_IPC_MODE_AUTOACK);
+ SYS_IPC_SEND(DSP_SYS_IPC_BASE_ADDR_NS, DSP_DSP_TO_AP_MAILBOX_NO) = BIT_MASK(SYS_IPC_CORE_HIFI);
+
+ return;
+}
+#endif
+/* ...assert IPI interrupt on remote core - board-specific */
+static inline void xf_ipi_assert(u32 core)
+{
+ XF_PROXY_NOTIFY_PEER(core);
+}
+
+#ifdef XAF_ENABLE_NON_HIKEY
+/* ...initialize IPI subsystem */
+static inline int xf_ipi_init(u32 core)
+{
+ xf_core_ro_data_t *ro = XF_CORE_RO_DATA(core);
+ extern void (* const xf_ipi_handlers[])(void);
+
+ /* ...reset IPC data - no interrupt yet */
+ ro->ipc.wait = 0;
+
+ /* ...install interrupt handler */
+ _xtos_set_interrupt_handler(XF_PROXY_IPI_NUM(core), xf_ipi_handlers[core]);
+
+ return 0;
+}
+#else
+/* ...initialize IPI subsystem */
+static inline int xf_ipi_init(u32 core)
+{
+
+ waitstate =0;
+
+ dsp_debug_init();
+ //dsp_init_share_mem(HIKEY_AP2DSP_MSG_QUEUE_ADDR,HIKEY_DSP2AP_MSG_QUEUE_SIZE);
+ /* unlock reg */
+ SYS_IPC_LOCK(DSP_SYS_IPC_BASE_ADDR_NS) = 0x1ACCE551;
+ //VOS_ConnectInterrupt(DSP_IPC_FROM_AP_INT_NO, _ap_to_dsp_ipc_irq_proc);
+ VOS_ConnectInterrupt(DSP_IPC_FROM_AP_INT_NO, xf_ipi_resume);
+
+// VOS_EnableInterrupt(DSP_IPC_FROM_AP_INT_NO);
+
+ return;
+}
+#endif
+
+/*******************************************************************************
+ * Shared memory operations
+ ******************************************************************************/
+
+/* ...NULL-address specification */
+#define XF_PROXY_NULL (~0U)
+
+/* ...invalid proxy address */
+#define XF_PROXY_BADADDR XF_CFG_REMOTE_IPC_POOL_SIZE
+/* ...translate buffer address to shared proxy address */
+static inline u32 xf_ipc_b2a(u32 core, void *b)
+{
+ xf_shmem_data_t *shmem = XF_CORE_DATA(core)->shmem;
+ void *start = shmem->buffer;
+
+ if (b == NULL)
+ return XF_PROXY_NULL;
+ else if ((s32)(b - start) < XF_CFG_REMOTE_IPC_POOL_SIZE)
+ return (u32)(b - start);
+ else
+ return XF_PROXY_BADADDR;
+}
+/* ...translate shared proxy address to local pointer */
+static inline void * xf_ipc_a2b(u32 core, u32 address)
+{
+ xf_shmem_data_t *shmem = XF_CORE_DATA(core)->shmem;
+ void *start = shmem->buffer;
+
+ if (address < XF_CFG_REMOTE_IPC_POOL_SIZE)
+ return start + address;
+ else if (address == XF_PROXY_NULL)
+ return NULL;
+ else
+ return (void *)-1;
+}
+
+/* ...component association with remote IPC client */
+static inline void xf_ipc_component_addref(u32 session)
+{
+}
+
+/* ...delete record about component association with remote IPC client */
+static inline void xf_ipc_component_rmref(u32 id)
+{
+}
+
+/* ...system-specific IPC layer initialization */
+extern int xf_ipc_init(u32 core);
+
+/*******************************************************************************
+ * Mutex definitions
+ ******************************************************************************/
+
+/* ...export shared memory access macros */
+#define MUTEX_SHARED_READ(core) \
+ ({ xf_core_ro_data_t *__ro = XF_CORE_RO_DATA(core); __ro->lock[0]; })
+
+#define MUTEX_SHARED_WRITE(core, val) \
+ ({ xf_core_ro_data_t *__ro = XF_CORE_RO_DATA(core); __ro->lock[0] = (val); })
+
+/* ...include library header */
+#include "lib/mutex.h"
+
+#if XF_CFG_CORES_NUM > 1
+/* ...rename API functions */
+static inline void xf_mutex_lock(u32 core)
+{
+ mutex_lock(core);
+}
+
+static inline void xf_mutex_unlock(u32 core)
+{
+ mutex_unlock(core);
+}
+
+#else
+/* ...for single-core setting no locking is actually needed */
+static inline void xf_mutex_lock(u32 core)
+{
+}
+
+static inline void xf_mutex_unlock(u32 core)
+{
+}
+
+#endif /* XF_CFG_CORES_NUM > 1 */
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-mem.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-mem.h
new file mode 100644
index 00000000..dc277871
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-mem.h
@@ -0,0 +1,180 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-mem.h
+ *
+ * System-specific memory allocator
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-mem.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * System specific memory pools
+ ******************************************************************************/
+
+#if XF_CFG_CORES_NUM > 1
+/* ...shared memory pool for communication within DSP-cluster */
+extern xf_mm_pool_t xf_dsp_shmem_pool;
+#endif
+
+/*******************************************************************************
+ * Platform-specific SHMEM allocation registering functions
+ ******************************************************************************/
+
+/* ...register shmem allocation address */
+static inline void xf_shmem_alloc_addref(u32 core, xf_message_t *m)
+{
+}
+
+/* ...unregister shmem allocation address */
+static inline void xf_shmem_alloc_rmref(u32 core, xf_message_t *m)
+{
+}
+
+/*******************************************************************************
+ * API functions
+ ******************************************************************************/
+
+/* ...allocate aligned memory on particular core specifying if it is shared */
+static inline void * xf_mem_alloc(u32 size, u32 align, u32 core, u32 shared)
+{
+#if XF_CFG_CORES_NUM > 1
+ if (shared)
+ {
+ /* ...if memory is shared, core is dropped */
+ return xf_mm_alloc(&xf_dsp_shmem_pool, size);
+ }
+#endif
+
+ /* ...select local memory pool basing on core specification */
+ return xf_mm_alloc(&XF_CORE_DATA(core)->local_pool, size);
+}
+#ifdef XAF_ENABLE_NON_HIKEY
+/* ...redefine macro to add bugchecks */
+#define xf_mem_alloc(size, align, core, shared) \
+({ \
+ void *__data; \
+ /* ...size must be properly aligned */ \
+ BUG(!XF_MM_ALIGNED(size), _x("Bad size: %u"), size); \
+ __data = (xf_mem_alloc)(size, align, core, shared); \
+ TRACE(1, _b("alloc-%u: %p[%u] (shared=%u)"), core, __data, size, shared); \
+ __data; \
+})
+#endif
+/* ...release allocated memory */
+static inline void xf_mem_free(void *p, u32 size, u32 core, u32 shared)
+{
+#if XF_CFG_CORES_NUM > 1
+ if (shared)
+ {
+ /* ...if memory is shared, core is dropped */
+ xf_mm_free(&xf_dsp_shmem_pool, p, size);
+ return;
+ }
+#endif
+
+ /* ...select proper pool basing on core specification */
+ xf_mm_free(&XF_CORE_DATA(core)->local_pool, p, size);
+}
+#ifdef XAF_ENABLE_NON_HIKEY
+/* ...redefine macro to add bugchecks */
+#define xf_mem_free(p, size, core, shared) \
+({ \
+ void *__data = (p); \
+ /* ...size must be properly aligned */ \
+ BUG(!XF_MM_ALIGNED(size), _x("Bad size: %u"), size); \
+ TRACE(1, _b("free-%u: %p[%u] (shared=%u)"), core, __data, size, shared); \
+ (xf_mem_free)(__data, size, core, shared); \
+})
+#endif
+/* ...allocate AP-DSP shared memory */
+static inline int xf_shmem_alloc(u32 core, xf_message_t *m)
+{
+ xf_mm_pool_t *pool = &XF_CORE_DATA(core)->shared_pool;
+
+ /* ...length is always cache-line aligned */
+ if ((m->buffer = xf_mm_alloc(pool, XF_ALIGNED(m->length))) != NULL)
+ {
+ /* ...register allocation address */
+ xf_shmem_alloc_addref(core, m);
+
+ return 0;
+ }
+ else
+ {
+ return -ENOMEM;
+ }
+}
+
+/* ...free AP-DSP shared memory */
+static inline void xf_shmem_free(u32 core, xf_message_t *m)
+{
+ xf_mm_pool_t *pool = &XF_CORE_DATA(core)->shared_pool;
+
+ /* ...length is always cache-line aligned */
+ xf_mm_free(pool, m->buffer, XF_ALIGNED(m->length));
+
+ /* ...unregister allocation address */
+ xf_shmem_alloc_rmref(core, m);
+}
+
+/*******************************************************************************
+ * Scratch memory management
+ ******************************************************************************/
+
+static inline void * xf_scratch_mem_init(u32 core)
+{
+ /* ...allocate scratch memory from local DSP memory */
+ return xf_mem_alloc(XF_CFG_CODEC_SCRATCHMEM_SIZE, XF_CFG_CODEC_SCRATCHMEM_ALIGN, core, 0);
+}
+
+/*******************************************************************************
+ * Helpers - hmm; they are platform-independent - tbd
+ ******************************************************************************/
+
+/* ...allocate local buffer */
+static inline int xf_mm_alloc_buffer(u32 size, u32 align, u32 core, xf_mm_buffer_t *b)
+{
+ /* ...allocate memory from proper local pool */
+ if ((size = XF_MM(size)) != 0)
+ XF_CHK_ERR(b->addr = xf_mem_alloc(size, align, core, 0), -ENOMEM);
+ else
+ b->addr = NULL;
+
+ /* ...save address */
+ b->size = size;
+
+ return 0;
+}
+
+/* ...free local buffer */
+static inline void xf_mm_free_buffer(xf_mm_buffer_t *b, u32 core)
+{
+ if (b->addr)
+ {
+ xf_mem_free(b->addr, b->size, core, 0);
+ }
+}
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-runtime.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-runtime.h
new file mode 100644
index 00000000..ab328ccf
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-runtime.h
@@ -0,0 +1,81 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-runtime.h
+ *
+ * Platform-specific runtime data definitions
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-runtime.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+/* ...platform HAL layer */
+#include "xf-hal.h"
+
+/*******************************************************************************
+ * Mutex (opaque) data definition
+ ******************************************************************************/
+
+typedef volatile u32 xf_mutex_t[XF_CFG_CORES_NUM > 1 ? 1 : 0];
+
+/*******************************************************************************
+ * Local/remote/ISR IPC (opaque) data
+ ******************************************************************************/
+
+typedef struct xf_ipc_handle
+{
+ /* ...variable we are waiting on */
+ u32 wait;
+
+} xf_ipc_handle_t;
+
+/*******************************************************************************
+ * IPC events
+ ******************************************************************************/
+
+/* ...core resumption flag */
+#define XF_IPC_EVENT_CORE_ASSERT (1 << 0)
+
+/* ...core waiting flag */
+#define XF_IPC_EVENT_CORE_WAIT (1 << 1)
+
+/* ...shared memory assertion flag */
+#define XF_IPC_EVENT_SHMEM_ASSERT (1 << 2)
+
+/* ...shared memory waiting flag */
+#define XF_IPC_EVENT_SHMEM_WAIT (1 << 3)
+
+/* ...disabled interrupts status */
+#define XF_IPC_EVENT_ISR_OFF (1 << 4)
+
+/*******************************************************************************
+ * Shared memory interface (opaque) data
+ ******************************************************************************/
+
+typedef void * xf_shmem_handle_t;
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h
new file mode 100644
index 00000000..813bfb48
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-shmem.h
@@ -0,0 +1,173 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-shmem.h
+ *
+ * Definitions for Xtensa SHMEM configuration
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-shmem.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Memory structures
+ ******************************************************************************/
+
+/* ...data managed by host CPU (remote) - in case of shunt it is a IPC layer */
+struct xf_proxy_host_data
+{
+ /* ...command queue */
+ xf_proxy_message_t command[XF_PROXY_MESSAGE_QUEUE_LENGTH];
+
+ /* ...writing index into command queue */
+ u32 cmd_write_idx;
+
+ /* ...reading index for response queue */
+ u32 rsp_read_idx;
+#ifdef XAF_ENABLE_NON_HIKEY
+} __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT)));
+#else
+}/* __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT)))*/;
+#endif
+
+/* ...data managed by DSP (local) */
+struct xf_proxy_dsp_data
+{
+ /* ...response queue */
+ xf_proxy_message_t response[XF_PROXY_MESSAGE_QUEUE_LENGTH];
+
+ /* ...writing index into response queue */
+ u32 rsp_write_idx;
+
+ /* ...reading index for command queue */
+ u32 cmd_read_idx;
+#ifdef XAF_ENABLE_NON_HIKEY
+} __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT)));
+#else
+}/* __attribute__((__packed__, __aligned__(XF_PROXY_ALIGNMENT)))*/;
+#endif
+/* ...shared memory data */
+typedef struct xf_shmem_data
+{
+ /* ...outgoing data (maintained by host CPU (remote side)) */
+#ifdef XAF_ENABLE_NON_HIKEY
+ struct xf_proxy_host_data remote __xf_shmem__;
+
+ /* ...ingoing data (maintained by DSP (local side)) */
+ struct xf_proxy_dsp_data local __xf_shmem__;
+
+ /* ...shared memory pool (page-aligned; why? we map memory to user-space) */
+ u8 buffer[XF_CFG_REMOTE_IPC_POOL_SIZE] __attribute__((__aligned__(4096)));
+#else
+ /* ...outgoing data (maintained by host CPU (remote side)) */
+ struct xf_proxy_host_data remote/* __xf_shmem__*/;
+
+ /* ...ingoing data (maintained by DSP (local side)) */
+ struct xf_proxy_dsp_data local/* __xf_shmem__*/;
+
+ /* ...shared memory pool (page-aligned; why? we map memory to user-space) */
+ uint8_t* buffer;
+#endif
+
+} xf_shmem_data_t;
+
+/*******************************************************************************
+ * Shared memory accessors
+ ******************************************************************************/
+
+/* ...shared memory pointer for a core */
+#define XF_SHMEM_DATA(core) \
+ ((xf_shmem_data_t *)XF_CORE_DATA(core)->shmem)
+
+/* ...atomic reading */
+#define XF_PROXY_READ_ATOMIC(var) \
+ ({ XF_PROXY_INVALIDATE(&(var), sizeof(var)); (var); })
+
+/* ...atomic writing */
+#define XF_PROXY_WRITE_ATOMIC(var, value) \
+ ({(var) = (value); XF_PROXY_FLUSH(&(var), sizeof(var)); (value); })
+
+/* ...accessors */
+#define XF_PROXY_READ(core, field) \
+ __XF_PROXY_READ_##field(XF_SHMEM_DATA(core))
+
+#define XF_PROXY_WRITE(core, field, v) \
+ __XF_PROXY_WRITE_##field(XF_SHMEM_DATA(core), (v))
+
+/* ...individual fields accessors */
+#define __XF_PROXY_READ_cmd_write_idx(proxy) \
+ XF_PROXY_READ_ATOMIC(proxy->remote.cmd_write_idx)
+
+#define __XF_PROXY_READ_cmd_read_idx(proxy) \
+ proxy->local.cmd_read_idx
+
+#define __XF_PROXY_READ_rsp_write_idx(proxy) \
+ proxy->local.rsp_write_idx
+
+#define __XF_PROXY_READ_rsp_read_idx(proxy) \
+ XF_PROXY_READ_ATOMIC(proxy->remote.rsp_read_idx)
+
+/* ...individual fields accessors */
+#define __XF_PROXY_WRITE_cmd_write_idx(proxy, v) \
+ XF_PROXY_WRITE_ATOMIC(proxy->remote.cmd_write_idx, v)
+
+#define __XF_PROXY_WRITE_cmd_read_idx(proxy, v) \
+ XF_PROXY_WRITE_ATOMIC(proxy->local.cmd_read_idx, v)
+
+#define __XF_PROXY_WRITE_rsp_read_idx(proxy, v) \
+ XF_PROXY_WRITE_ATOMIC(proxy->remote.rsp_read_idx, v)
+
+#define __XF_PROXY_WRITE_rsp_write_idx(proxy, v) \
+ XF_PROXY_WRITE_ATOMIC(proxy->local.rsp_write_idx, v)
+
+/* ...command buffer accessor */
+#define XF_PROXY_COMMAND(core, idx) \
+ (&XF_SHMEM_DATA((core))->remote.command[(idx)])
+
+/* ...response buffer accessor */
+#define XF_PROXY_RESPONSE(core, idx) \
+ (&XF_SHMEM_DATA((core))->local.response[(idx)])
+
+/*******************************************************************************
+ * Platform-specific SHMEM enable status
+ ******************************************************************************/
+
+static inline int xf_shmem_enabled(u32 core)
+{
+ return (core == 0);
+}
+
+/*******************************************************************************
+ * API functions
+ ******************************************************************************/
+
+/* ...process shared memory interface on given DSP core */
+extern void xf_shmem_process_queues(u32 core);
+
+/* ...completion callback for message originating from remote proxy */
+extern void xf_msg_proxy_complete(xf_message_t *m);
+
+/* ...initialize shared memory interface (DSP side) */
+extern int xf_shmem_init(u32 core);
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-sys.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-sys.h
new file mode 100644
index 00000000..b82c10eb
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-sys.h
@@ -0,0 +1,75 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-sys.h
+ *
+ * Definitions for Xtensa SHMEM configuration
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-sys.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Standard system includes
+ ******************************************************************************/
+
+/* ...from directory ./board-BOARDNAME */
+#include "xf-board.h"
+
+/*******************************************************************************
+ * Global abstractions
+ ******************************************************************************/
+
+/* ...prevent instructions reordering */
+#define barrier() \
+ __asm__ __volatile__("": : : "memory")
+
+/* ...memory barrier */
+#define XF_PROXY_BARRIER() \
+ __asm__ __volatile__("memw": : : "memory")
+
+/* ...memory invalidation */
+#define XF_PROXY_INVALIDATE(buf, length) \
+ ({ if ((length)) { xthal_dcache_region_invalidate((buf), (length)); barrier(); } buf; })
+
+/* ...memory flushing */
+#define XF_PROXY_FLUSH(buf, length) \
+ ({ if ((length)) { barrier(); xthal_dcache_region_writeback((buf), (length)); XF_PROXY_BARRIER(); } buf; })
+
+/*******************************************************************************
+ * Core-specific data accessor
+ ******************************************************************************/
+
+/* ...per-core execution data */
+extern xf_core_data_t xf_core_data[XF_CFG_CORES_NUM];
+
+/* ...local memory accessor */
+#define XF_CORE_DATA(core) (&xf_core_data[core])
+
+/*******************************************************************************
+ * Inter-processor communication and shared memory interface definition
+ ******************************************************************************/
+
+#include "xf-ipc.h"
diff --git a/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-types.h b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-types.h
new file mode 100644
index 00000000..5f58825f
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/sys/xt-shmem/xf-types.h
@@ -0,0 +1,55 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-types.h
+ *
+ * Platform-specific typedefs
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-types.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <xtensa/config/core.h>
+
+/*******************************************************************************
+ * Primitive types
+ ******************************************************************************/
+
+typedef unsigned int u32;
+typedef signed int s32;
+typedef unsigned short u16;
+typedef signed short s16;
+typedef unsigned char u8;
+typedef signed char s8;
diff --git a/hifi/xaf/hifi-dpf/include/xa_profiler.h b/hifi/xaf/hifi-dpf/include/xa_profiler.h
new file mode 100644
index 00000000..675ff15c
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xa_profiler.h
@@ -0,0 +1,156 @@
+/*******************************************************************************
+* 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_PROFILER_H__
+#define __XA_PROFILER_H__
+
+#if !defined(PROFILE) && __XCC__
+#define PROFILE 1
+#endif
+
+#if !defined(PREFETCH_CTL) && __XCC__
+#define PREFETCH_CTL 1
+#endif
+
+#ifdef PROFILE
+#include <xtensa/hal.h>
+#include <sys/times.h>
+
+#include "xa_type_def.h"
+#include "xa_timer.h"
+
+TRACE_TAG(MCPS,1);
+
+typedef struct XA_PROFILER {
+#if 1
+ unsigned long cstart;
+ unsigned long cstop;
+ unsigned long cycles;
+ unsigned long g_output_bytes;
+ unsigned long Peak;
+ unsigned long Sum;
+
+ unsigned long sample_rate;
+ unsigned long channels;
+ unsigned long pcm_width;
+#else
+ struct tms start;
+ struct tms stop;
+ double Peak;
+ double Sum;
+ long long cycles;
+#endif
+ int Peak_frame;
+ int frame_count;
+ long long output_bytes;
+ long long total_cycles;
+ long long total_samples;
+ char *id;
+} xa_profiler;
+
+extern xa_profiler prof;
+
+static inline void xa_compute_mcps(xa_profiler *p_prof, WORD32 samples_decoded, UWORD32 samp_freq, long long gen_strm_pos)
+{
+ double Ave=0.0, Curr;
+
+ if (samples_decoded <= 0)
+ return;
+
+ p_prof->total_samples += samples_decoded;
+ p_prof->frame_count++;
+
+ clock_t cycles = p_prof->cycles;
+ p_prof->total_cycles = 0;
+ Curr = ((double) cycles / samples_decoded * samp_freq / 1000000);
+
+ if (p_prof->frame_count > 1) {
+ p_prof->Sum += Curr;
+ Ave = p_prof->Sum / (p_prof->frame_count-1);
+
+ if (p_prof->Peak < Curr) {
+ p_prof->Peak = Curr;
+ p_prof->Peak_frame = (p_prof->frame_count);
+ }
+ }
+
+ unsigned long long total_msec =
+ (unsigned long long)((double)p_prof->total_samples / samp_freq * 1000.0);
+ int msec = (int)(total_msec % 1000);
+ unsigned long long total_seconds = total_msec / 1000;
+ int seconds = (int)(total_seconds % 60);
+ int minutes = (int)(total_seconds / 60);
+
+#if 1
+ TRACE(MCPS, _b("[%d] %d:%d.%d MCPS: %d Average: %d samples: %d\n"),
+ p_prof->frame_count, (uint32_t)minutes, (uint32_t)seconds, (uint32_t)msec,
+ (uint32_t)Curr, (uint32_t)Ave, samples_decoded);
+#else
+ TRACE(MCPS, _b("[%d|%lld] %d:%02d.%03d MCPS: %.2f Average: %.2f Peak: %.2f @ [%d] %s\n"),
+ p_prof->frame_count, gen_strm_pos, minutes, seconds, msec,
+ Curr, Ave, p_prof->Peak, p_prof->Peak_frame, p_prof->id);
+#endif
+
+ /* reset counters */
+ p_prof->g_output_bytes = 0;
+ p_prof->cycles = 0;
+}
+
+#define INIT_XA_PROFILER(x, a) do { memset(&x, 0, sizeof(xa_profiler)); \
+ x.sample_rate = 48000;\
+ x.channels = 2;\
+ x.pcm_width = 16;\
+ x.id = a; } while(0)
+
+#define START_TIME_XA_PROFILER(x) do { set_ccount(0); \
+ x.cstart=read_ccount(); } while(0)
+#define STOP_TIME_XA_PROFILER(x) do { x.cstop =read_ccount(); \
+ x.cycles += (x.cstop - x.cstart); } while(0)
+#define COMPUTE_MHZ_XA_PROFILER(x, a, b, c) do { xa_compute_mcps(&x, a, b, c); } while(0)
+#define SUMMARY_XA_PROFILER(x) do { fprintf(stdout,"\n%5s Peak MCPS = %f\n", x.id, x.Peak); \
+ fprintf(stdout,"%5s Peak frame = %d\n", x.id, x.Peak_frame); \
+ fprintf(stdout,"%5s Average MCPS = %f\n", x.id, (x.frame_count < 2) ? 0 : (x.Sum/(x.frame_count-1))); } while(0)
+
+#else
+
+typedef struct XA_PROFILER {
+ int place_holder;
+} xa_profiler;
+
+#define INIT_XA_PROFILER(x, a) do {} while(0)
+#define START_TIME_XA_PROFILER(x) do {} while(0)
+#define STOP_TIME_XA_PROFILER(x) do {} while(0)
+#define COMPUTE_MHZ_XA_PROFILER(x, a, b) do {} while(0)
+#define SUMMARY_XA_PROFILER(x) do {} while(0)
+#endif
+
+#ifdef PREFETCH_CTL
+#define PREFETCH_AGGRESSIVE(x) do { x = xthal_set_cache_prefetch ((XTHAL_DCACHE_PREFETCH_HIGH | XTHAL_ICACHE_PREFETCH_HIGH)); \
+ } while(0)
+#define PREFETCH_RESTORE(x) do { xthal_set_cache_prefetch (x); } while(0)
+#else
+#define PREFETCH_AGGRESSIVE(x) do {} while(0)
+#define PREFETCH_RESTORE(x) do {} while(0)
+#endif
+
+#endif /* __XA_PROFILER_H__ */
+
diff --git a/hifi/xaf/hifi-dpf/include/xa_timer.h b/hifi/xaf/hifi-dpf/include/xa_timer.h
new file mode 100644
index 00000000..d45cb4b8
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xa_timer.h
@@ -0,0 +1,111 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+#include <xtensa/xtruntime.h>
+#include <xtensa/config/specreg.h>
+
+extern const unsigned char Xthal_have_ccount;
+extern const unsigned char Xthal_num_ccompare;
+extern void xthal_set_ccompare(int n, unsigned value);
+extern unsigned xthal_get_ccompare(int n);
+
+/*--------------------------------------------*/
+#include <xtensa/config/core.h>
+#define TIMER_INTERVAL 0x1000
+
+#define TIMER_INT_MASK (1 << XCHAL_TIMER0_INTERRUPT)
+#define TIMER2_INT_MASK (1 << XCHAL_TIMER1_INTERRUPT)
+#define TWO_TIMERS_INT_MASK ( TIMER_INT_MASK + TIMER2_INT_MASK )
+#define _XTSTR(x) # x
+#define XTSTR(x) _XTSTR(x)
+
+static __inline__ int read_ccount()
+{
+ unsigned int ccount;
+ __asm__ __volatile__ (
+ "rsr %0, "XTSTR(CCOUNT)
+ : "=a" (ccount)
+ );
+ return ccount;
+}
+
+static __inline__ int read_ccompare0()
+{
+ unsigned int ccompare0;
+ __asm__ __volatile__ (
+ "rsr %0, "XTSTR(CCOMPARE_0)
+ : "=a" (ccompare0)
+ );
+ return ccompare0;
+}
+
+static __inline__ int read_ccompare1()
+{
+ unsigned int ccompare1;
+ __asm__ __volatile__ (
+ "rsr %0, "XTSTR(CCOMPARE_1)
+ : "=a" (ccompare1)
+ );
+ return ccompare1;
+}
+
+static __inline__ unsigned int read_intenable()
+{
+ unsigned int intenable;
+ __asm__ __volatile__ (
+ "rsr %0, "XTSTR(INTENABLE)
+ : "=a" (intenable)
+ );
+ return intenable;
+}
+
+static __inline__ void set_ccompare1(int val)
+{
+ __asm__ __volatile__ (
+ "wsr %0, "XTSTR(CCOMPARE_1)"\n\t"
+ "isync\n\t"
+ :
+ : "a" (val)
+ );
+}
+
+static __inline__ void set_ccompare0(int val)
+{
+ __asm__ __volatile__ (
+ "wsr %0, "XTSTR(CCOMPARE_0)"\n\t"
+ "isync\n\t"
+ :
+ : "a" (val)
+ );
+}
+
+/*---------------------------------------------------*/
+
+static __inline__ void set_ccount(int val)
+{
+ __asm__ __volatile__ (
+ "wsr %0, ccount\n"
+ "isync\n"
+ :
+ : "a" (val)
+ );
+}
+
diff --git a/hifi/xaf/hifi-dpf/include/xf-component.h b/hifi/xaf/hifi-dpf/include/xf-component.h
new file mode 100644
index 00000000..f97f2e48
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-component.h
@@ -0,0 +1,91 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-component.h
+ *
+ * Xtensa processing framework component definition
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-component.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Types definitions
+ ******************************************************************************/
+
+/* ...component literal identifier */
+typedef const char * const xf_id_t;
+
+/* ...component descriptor (base structure) */
+typedef struct xf_component
+{
+ /* ...scheduler node */
+ xf_task_t task;
+
+ /* ...component id */
+ u32 id;
+
+ /* ...message-processing function */
+ int (*entry)(struct xf_component *, xf_message_t *);
+
+ /* ...component destructor function */
+ int (*exit)(struct xf_component *, xf_message_t *);
+#ifndef XAF_ENABLE_NON_HIKEY
+ /* ...output port accessor */
+ xf_output_port_t * (*port)(struct xf_component *, u32);
+#endif
+
+} xf_component_t;
+
+/*******************************************************************************
+ * Helpers
+ ******************************************************************************/
+
+/* ...return core-id of the component */
+static inline u32 xf_component_core(xf_component_t *component)
+{
+ return XF_PORT_CORE(component->id);
+}
+
+/* ...schedule component execution */
+#define xf_component_schedule(c, dts) \
+({ \
+ xf_sched_t *__sched = &XF_CORE_DATA(xf_component_core((c)))->sched; \
+ xf_sched_put(__sched, &(c)->task, xf_sched_timestamp(__sched) + (dts)); \
+})
+
+/* ...cancel component execution */
+#define xf_component_cancel(c) \
+({ \
+ xf_sched_t *__sched = &XF_CORE_DATA(xf_component_core((c)))->sched; \
+ xf_sched_cancel(__sched, &(c)->task); \
+})
+
+/*******************************************************************************
+ * API functions
+ ******************************************************************************/
+
+/* ...component factory */
+extern xf_component_t * xf_component_factory(u32 core, xf_id_t id, u32 length);
diff --git a/hifi/xaf/hifi-dpf/include/xf-core.h b/hifi/xaf/hifi-dpf/include/xf-core.h
new file mode 100644
index 00000000..4daea6f2
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-core.h
@@ -0,0 +1,150 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-core.h
+ *
+ * DSP processing framework core definitions
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-core.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Shared core data
+ ******************************************************************************/
+
+/* ...core data with read-only access from remote cores */
+typedef struct xf_core_ro_data
+{
+ /* ...platform-specific multi-core mutex data (want to have an array? - tbd) */
+ xf_mutex_t lock;
+
+ /* ...opaque platform-specific IPC-data handle */
+ xf_ipc_handle_t ipc;
+
+ /* ...shared memory message pool data - here? - tbd */
+ xf_msg_pool_t pool;
+
+ /* ...anything else? - tbd */
+
+} xf_core_ro_data_t;
+
+/* ...core data with read-write access from remote cores */
+typedef struct xf_core_rw_data
+{
+ /* ...message queue containing local commands/responses */
+ xf_msg_queue_t local;
+
+ /* ...message queue containing responses to remote proxy (if enabled) */
+ xf_msg_queue_t remote;
+
+ /* ...pointer to shared memory data? anything else? - tbd */
+
+} xf_core_rw_data_t;
+
+/* ...proper cache-line aligned core data */
+XF_ALIGNED_TYPEDEF(xf_core_ro_data_t, __xf_core_ro_data_t);
+XF_ALIGNED_TYPEDEF(xf_core_rw_data_t, __xf_core_rw_data_t);
+
+/*******************************************************************************
+ * Global data definition - hmm... - tbd
+ ******************************************************************************/
+
+/* ...per-core shared memory with read-only remote access */
+extern __xf_core_ro_data_t xf_core_ro_data[XF_CFG_CORES_NUM];
+
+/* ...per-core shared memory with read-write remote access */
+extern __xf_core_rw_data_t xf_core_rw_data[XF_CFG_CORES_NUM];
+
+/* ...shared read-only memory access */
+#define XF_CORE_RO_DATA(core) ((xf_core_ro_data_t *)(&xf_core_ro_data[(core)]))
+
+/* ...shared read-write memory access */
+#define XF_CORE_RW_DATA(core) ((xf_core_rw_data_t *)(&xf_core_rw_data[(core)]))
+
+/*******************************************************************************
+ * Local core data (not accessible from remote cores)
+ ******************************************************************************/
+
+/* ...component map entry */
+typedef union xf_cmap_link
+{
+ /* ...poiner to active client */
+ xf_component_t *c;
+
+ /* ...index to a client in the list (values 0..XF_CFG_MAX_CLIENTS) */
+ u32 next;
+
+} xf_cmap_link_t;
+
+/* ...per-core local data */
+typedef struct xf_core_data
+{
+ /* ...scheduler queue (sorted by execution timestamp) */
+ xf_sched_t sched;
+
+ /* ...command/response queue for communication within local core (including ISRs) */
+ xf_msg_queue_t queue;
+
+ /* ...pending response queue (submitted from ISR context) */
+ xf_msg_queue_t response;
+
+ /* ...per-core component mapping */
+ xf_cmap_link_t cmap[XF_CFG_MAX_CLIENTS];
+
+ /* ...index of first free client */
+ u32 free;
+
+ /* ...local DSP memory pool */
+ xf_mm_pool_t local_pool;
+
+ /* ...shared AP-DSP memory pool (if enabled) */
+ xf_mm_pool_t shared_pool;
+
+ /* ...opaque system-specific shared memory data handle */
+ xf_shmem_handle_t shmem;
+
+ /* ...scratch memory pointer */
+ void *scratch;
+
+ /* ...tracer data */
+ xf_trace_data_t trace;
+
+ /* ...any debugging information? for memory allocation etc... ? */
+
+} xf_core_data_t;
+
+/*******************************************************************************
+ * API functions
+ ******************************************************************************/
+
+/* ...initialize per-core framework data */
+extern int xf_core_init(u32 core);
+
+/* ...global data initialization function */
+extern int xf_global_init(void);
+
+/* ...process core events */
+extern void xf_core_service(u32 core);
diff --git a/hifi/xaf/hifi-dpf/include/xf-debug.h b/hifi/xaf/hifi-dpf/include/xf-debug.h
new file mode 100644
index 00000000..c416cc01
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-debug.h
@@ -0,0 +1,216 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-debug.h
+ *
+ * Debugging interface for Xtensa Audio DSP codec server
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-debug.h mustn't be included directly"
+#endif
+
+#include "dsp_debug.h"
+
+/*******************************************************************************
+ * Auxiliary macros (put into "xf-types.h"?)
+ ******************************************************************************/
+
+#ifndef offset_of
+#define offset_of(type, member) \
+ ((int)&(((const type *)(0))->member))
+#endif
+
+#ifndef container_of
+#define container_of(ptr, type, member) \
+ ((type *)((void *)(ptr) - offset_of(type, member)))
+#endif
+
+/* ...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)
+
+/*******************************************************************************
+ * 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, ...) __attribute__((format (printf, 1, 2)));
+
+/* ...tracing facility initialization */
+extern void xf_trace_init(const char *banner);
+
+/* ...initialize tracing facility */
+//#define TRACE_INIT(banner) (xf_trace_init(banner))
+#define TRACE_INIT(banner) ({ dsp_debug_init(); DSP_TRACE("\n"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; DSP_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_CFG(tag) 0
+#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 (tbd) */ \
+ __xf_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) \
+({ \
+ int __ret; \
+ \
+ if (!(__ret = (int)(cond))) \
+ { \
+ TRACE(ERROR, _x("check failed: %d"), __ret); \
+ return (error); \
+ } \
+ __ret; \
+})
diff --git a/hifi/xaf/hifi-dpf/include/xf-io.h b/hifi/xaf/hifi-dpf/include/xf-io.h
new file mode 100644
index 00000000..17019a73
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-io.h
@@ -0,0 +1,298 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-io.h
+ *
+ * Input/output data ports
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-io.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Types definitions
+ ******************************************************************************/
+
+/* ...input port with interim buffer */
+typedef struct xf_input_port
+{
+ /* ...message queue */
+ xf_msg_queue_t queue;
+
+ /* ...internal contiguous buffer to store incoming data */
+ void *buffer;
+
+ /* ...size of internal buffer */
+ u32 length;
+
+ /* ...current writing position in the buffer */
+ u32 filled;
+
+ /* ...interim pointer to input message buffer */
+ void *access;
+
+ /* ...remaining length of current input message */
+ u32 remaining;
+
+ /* ...execution flags */
+ u32 flags;
+
+} xf_input_port_t;
+
+/*******************************************************************************
+ * Input port flags
+ ******************************************************************************/
+
+/* ...data enabled */
+#define XF_INPUT_FLAG_CREATED (1 << 0)
+
+/* ...data enabled */
+#define XF_INPUT_FLAG_ENABLED (1 << 1)
+
+/* ...end-of-stream condition */
+#define XF_INPUT_FLAG_EOS (1 << 2)
+
+/* ...stream completed */
+#define XF_INPUT_FLAG_DONE (1 << 3)
+
+/* ...stream purging sequence */
+#define XF_INPUT_FLAG_PURGING (1 << 4)
+
+/* ...base input port flags mask */
+#define __XF_INPUT_FLAGS(flags) ((flags) & ((1 << 5) - 1))
+
+/* ...custom input port flag */
+#define __XF_INPUT_FLAG(f) ((f) << 5)
+
+/*******************************************************************************
+ * Helpers
+ ******************************************************************************/
+
+/* ...test if input port is created */
+static inline int xf_input_port_created(xf_input_port_t *port)
+{
+ return (port->flags & XF_INPUT_FLAG_CREATED);
+}
+
+/* ...check if input port is ready (has pending message) */
+static inline int xf_input_port_ready(xf_input_port_t *port)
+{
+ return (xf_msg_queue_head(&port->queue) != NULL);
+}
+
+/* ...test if input port entered end-of-stream condition */
+static inline int xf_input_port_done(xf_input_port_t *port)
+{
+ return (port->flags & XF_INPUT_FLAG_DONE);
+}
+
+/* ...check if port is in bypass mode */
+static inline int xf_input_port_bypass(xf_input_port_t *port)
+{
+ return port->buffer == NULL;
+}
+
+/* ...bypass port only: check if there is a data available */
+static inline void * xf_input_port_data(xf_input_port_t *port)
+{
+ return port->access;
+}
+
+/* ...bypass port only: get remaining length of current message */
+static inline u32 xf_input_port_length(xf_input_port_t *port)
+{
+ return port->remaining;
+}
+
+/* ...non-bypass port only: get current fill level */
+static inline u32 xf_input_port_level(xf_input_port_t *port)
+{
+ return port->filled;
+}
+
+/*******************************************************************************
+ * Output port data
+ ******************************************************************************/
+
+typedef struct xf_output_port
+{
+ /* ...pending message queue */
+ xf_msg_queue_t queue;
+
+ /* ...message pool */
+ xf_msg_pool_t pool;
+
+ /* ...saved port unrouting message */
+ xf_message_t *unroute;
+
+ /* ...length of output buffer */
+ u32 length;
+
+ /* ...output port flags */
+ u32 flags;
+
+} xf_output_port_t;
+
+/*******************************************************************************
+ * Output port flags
+ ******************************************************************************/
+
+/* ...port is created */
+#define XF_OUTPUT_FLAG_CREATED (1 << 0)
+
+/* ...port is routed */
+#define XF_OUTPUT_FLAG_ROUTED (1 << 1)
+
+/* ...data enabled */
+#define XF_OUTPUT_FLAG_ENABLED (1 << 2)
+
+/* ...stream completed */
+#define XF_OUTPUT_FLAG_DONE (1 << 3)
+
+/* ...flushing sequence is on-going */
+#define XF_OUTPUT_FLAG_FLUSHING (1 << 4)
+
+/* ...port is idle - no outstanding messages */
+#define XF_OUTPUT_FLAG_IDLE (1 << 5)
+
+/* ...port is being unrouted */
+#define XF_OUTPUT_FLAG_UNROUTING (1 << 6)
+
+/* ...base output port flags accessor */
+#define __XF_OUTPUT_FLAGS(flags) ((flags) & ((1 << 7) - 1))
+
+/* ...custom output port flag */
+#define __XF_OUTPUT_FLAG(f) ((f) << 7)
+
+/*******************************************************************************
+ * Helpers
+ ******************************************************************************/
+
+/* ...test if input port is created */
+static inline int xf_output_port_created(xf_output_port_t *port)
+{
+ return (port->flags & XF_OUTPUT_FLAG_CREATED);
+}
+
+/* ...check if port is routed */
+static inline int xf_output_port_routed(xf_output_port_t *port)
+{
+ return ((port->flags & XF_OUTPUT_FLAG_ROUTED) != 0);
+}
+
+/* ...check if port unrouting sequence is ongoing */
+static inline int xf_output_port_unrouting(xf_output_port_t *port)
+{
+ return ((port->flags & XF_OUTPUT_FLAG_UNROUTING) != 0);
+}
+
+/* ...check if port is idle (owns all data buffers) */
+static inline int xf_output_port_idle(xf_output_port_t *port)
+{
+ return ((port->flags & XF_OUTPUT_FLAG_IDLE) != 0);
+}
+
+/* ...check if port is ready (has output buffers - better use flags - tbd) */
+static inline int xf_output_port_ready(xf_output_port_t *port)
+{
+ return (xf_msg_queue_head(&port->queue) != NULL && !xf_output_port_unrouting(port));
+}
+
+/* ...output port flow-control message accessor */
+static inline xf_message_t * xf_output_port_control_msg(xf_output_port_t *port)
+{
+ return xf_msg_pool_item(&port->pool, 0);
+}
+
+/*******************************************************************************
+ * Input port API
+ ******************************************************************************/
+
+/* ...initialize input port structure */
+extern int xf_input_port_init(xf_input_port_t *port, u32 size, u32 align, u32 core);
+
+/* ...put message into input port queue */
+extern int xf_input_port_put(xf_input_port_t *port, xf_message_t *m);
+
+/* ...fill-in required amount of data into input port buffer */
+extern int xf_input_port_fill(xf_input_port_t *port);
+
+/* ...pad input buffer with given value */
+extern void xf_input_port_pad(xf_input_port_t *port, u8 pad);
+
+/* ...consume bytes from input buffer */
+extern void xf_input_port_consume(xf_input_port_t *port, u32 n);
+
+/* ...purge input port queue */
+extern void xf_input_port_purge(xf_input_port_t *port);
+
+/* ...save flow-control message for propagated input port purging sequence */
+extern void xf_input_port_control_save(xf_input_port_t *port, xf_message_t *m);
+
+/* ...complete input port purging sequence */
+extern void xf_input_port_purge_done(xf_input_port_t *port);
+
+/* ...destroy input port data */
+extern void xf_input_port_destroy(xf_input_port_t *port, u32 core);
+
+/*******************************************************************************
+ * Output port API
+ ******************************************************************************/
+
+/* ...initialize output port structure */
+extern int xf_output_port_init(xf_output_port_t *port, u32 size);
+
+/* ...put next message to the output port */
+extern int xf_output_port_put(xf_output_port_t *port, xf_message_t *m);
+
+/* ...get data buffer of output message */
+extern void * xf_output_port_data(xf_output_port_t *port);
+
+/* ...route output port */
+extern int xf_output_port_route(xf_output_port_t *port, u32 id, u32 n, u32 length, u32 align);
+
+/* ...unroute output port */
+extern void xf_output_port_unroute(xf_output_port_t *port);
+
+/* ...start output port unrouting sequence */
+extern void xf_output_port_unroute_start(xf_output_port_t *port, xf_message_t *m);
+
+/* ...complete port unrouting sequence */
+extern void xf_output_port_unroute_done(xf_output_port_t *port);
+
+/* ...produce output message marking amount of bytes produced */
+extern int xf_output_port_produce(xf_output_port_t *port, u32 n);
+
+/* ...purge output port */
+extern void xf_output_port_purge(xf_output_port_t *port);
+
+/* ...flush output port and return non-zero result if sequence is over */
+extern int xf_output_port_flush(xf_output_port_t *port, u32 opcode);
+
+/* ...complete flushing sequence */
+extern void xf_output_port_flush_done(xf_output_port_t *port);
+
+/* ...destroy output port data */
+extern void xf_output_port_destroy(xf_output_port_t *port, u32 core);
diff --git a/hifi/xaf/hifi-dpf/include/xf-mm.h b/hifi/xaf/hifi-dpf/include/xf-mm.h
new file mode 100644
index 00000000..712ea14a
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-mm.h
@@ -0,0 +1,142 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-mm.h
+ *
+ * Generic dynamic memory manager (based on rb-tree index)
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-mem.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+/* ...red-black trees library */
+#include "lib/rbtree.h"
+
+/*******************************************************************************
+ * Cache-line aligned types
+ ******************************************************************************/
+
+/* ...proper cache-line alignment */
+#define XF_ALIGNED(size) \
+ (((size) + XF_PROXY_ALIGNMENT - 1) & ~(XF_PROXY_ALIGNMENT - 1))
+
+/* ...cache-line aligned type identifier */
+#define XF_ALIGNED_TYPE(type) \
+ __xf_aligned_##type
+
+/* ...definition of cache-line aligned type */
+#define XF_ALIGNED_TYPEDEF(type, name) \
+typedef union \
+{ \
+ /* ...item of original type */ \
+ type __obj; \
+ \
+ /* ...padding to cache-line */ \
+ u8 __pad[XF_ALIGNED(sizeof(type))]; \
+ \
+} XF_ALIGNED_TYPE(type), name __xf_shmem__
+
+/* ...accessor to original type */
+#define XF_ALIGNED_OBJ(p) \
+ (&(p)->__obj)
+
+#define XF_IS_ALIGNED(p) \
+ (((u32)(p) & (XF_PROXY_ALIGNMENT - 1)) == 0)
+
+/*******************************************************************************
+ * Memory pool description
+ ******************************************************************************/
+
+/* ...memory allocator data */
+typedef struct xf_mm_pool
+{
+ /* ...free blocks map sorted by block length */
+ rb_tree_t l_map;
+
+ /* ...free blocks map sorted by address of the block */
+ rb_tree_t a_map;
+
+ /* ...address of memory pool (32-bytes aligned at least); need that? - tbd */
+ void *addr;
+
+ /* ...length of the pool (multiple of descriptor size); need that? - tbd */
+ u32 size;
+
+} xf_mm_pool_t;
+
+/* ...descriptor of free memory block */
+typedef struct xf_mm_block
+{
+ /* ...rb-tree node in a block-length map */
+ rb_node_t l_node;
+
+ /* ...rb-tree node in a block-address map */
+ rb_node_t a_node;
+
+} xf_mm_block_t;
+
+/* ...properly aligned allocation unit */
+typedef u8 xf_mm_item[xf_next_power_of_two(sizeof(xf_mm_block_t))];
+
+/* ...macro to assure proper alignment of dynamically allocated data */
+#define XF_MM(size) (((size) + sizeof(xf_mm_item) - 1) & ~(sizeof(xf_mm_item) - 1))
+
+/* ...check if memory is properly aligned */
+#define XF_MM_ALIGNED(size) (!((size) & (sizeof(xf_mm_item) - 1)))
+
+/* ...alignement definition */
+#define __xf_mm__ __attribute__((__aligned__(sizeof(xf_mm_item))))
+
+/*******************************************************************************
+ * Dynamically allocated buffer
+ ******************************************************************************/
+
+/* ...memory allocation metadata */
+typedef struct xf_mm_buffer
+{
+ /* ...allocation address */
+ void *addr;
+
+ /* ...length */
+ u32 size;
+
+} __xf_mm__ xf_mm_buffer_t;
+
+/*******************************************************************************
+ * API functions
+ ******************************************************************************/
+
+/* ...pool initialization */
+extern int xf_mm_init(xf_mm_pool_t *pool, void *addr, u32 size);
+
+/* ...block allocation */
+extern void * xf_mm_alloc(xf_mm_pool_t *pool, u32 size);
+
+/* ...block deallocation */
+extern void xf_mm_free(xf_mm_pool_t *pool, void *addr, u32 size);
diff --git a/hifi/xaf/hifi-dpf/include/xf-msg.h b/hifi/xaf/hifi-dpf/include/xf-msg.h
new file mode 100644
index 00000000..3448425b
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-msg.h
@@ -0,0 +1,252 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-msg.h
+ *
+ * Internal messages, and message queues.
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-msg.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Types definitions
+ ******************************************************************************/
+
+/* ...forward declaration */
+typedef struct xf_message xf_message_t;
+
+/* ...audio command/response message (internal to DSP processing framework) */
+struct xf_message
+{
+ /* ...pointer to next item in the list */
+ xf_message_t *next;
+
+ /* ...shmem session_id */
+ u32 id;
+
+ /* ...operation code */
+ u32 opcode;
+
+ /* ...length of attached message buffer */
+ u32 length;
+
+ /* ...message buffer (translated virtual address) */
+ void *buffer;
+#ifndef XAF_ENABLE_NON_HIKEY
+ uint64_t v_buffer;
+#endif
+};
+
+/* ...cache-line aligned message buffer */
+XF_ALIGNED_TYPEDEF(xf_message_t, __xf_message_t);
+
+/* ...message pool definition */
+typedef struct xf_msg_pool
+{
+ /* ...array of aligned messages */
+ __xf_message_t *p;
+
+ /* ...pointer to first free item in the pool */
+ __xf_message_t *head;
+
+ /* ...total size of the pool */
+ u32 n;
+
+} xf_msg_pool_t;
+
+/* ...message accessor */
+static inline xf_message_t * xf_msg_pool_item(xf_msg_pool_t *pool, u32 i)
+{
+ return (xf_message_t *) &pool->p[i];
+}
+
+/*******************************************************************************
+ * Message queue data
+ ******************************************************************************/
+
+/* ...message queue (single-linked FIFO list) */
+typedef struct xf_msg_queue
+{
+ /* ...head of the queue */
+ xf_message_t *head;
+
+ /* ...tail pointer */
+ xf_message_t *tail;
+
+} xf_msg_queue_t;
+
+/*******************************************************************************
+ * Message queue API
+ ******************************************************************************/
+
+/* ...initialize message queue */
+static inline void xf_msg_queue_init(xf_msg_queue_t *queue)
+{
+ queue->head = queue->tail = NULL;
+}
+
+/* ...push message in FIFO queue */
+static inline int xf_msg_enqueue(xf_msg_queue_t *queue, xf_message_t *m)
+{
+ int empty = (queue->head == NULL);
+
+ /* ...set list terminating pointer */
+ m->next = NULL;
+
+ if (empty)
+ queue->head = m;
+ else
+ queue->tail->next = m;
+
+ /* ...advance tail pointer */
+ queue->tail = m;
+
+ /* ...return emptiness status */
+ return empty;
+}
+
+#define xf_msg_enqueue(queue, m) \
+({ \
+ BUG((m)->next != NULL, _x("message is active: %p"), (m)); \
+ (xf_msg_enqueue)((queue), (m)); \
+})
+
+/* ...retrieve (pop) next message from FIFO queue */
+static inline xf_message_t * xf_msg_dequeue(xf_msg_queue_t *queue)
+{
+ xf_message_t *m = queue->head;
+
+ /* ...check if there is anything in the queue and dequeue it */
+ if (m != NULL)
+ {
+ /* ...advance head to the next entry in the queue */
+ if ((queue->head = m->next) == NULL)
+ queue->tail = NULL;
+
+ /* ...debug - wipe out next pointer */
+ m->next = NULL;
+ }
+
+ return m;
+}
+
+/* ...test if message queue is empty */
+static inline int xf_msg_queue_empty(xf_msg_queue_t *queue)
+{
+ return (queue->head == NULL);
+}
+
+/* ...get message queue head pointer */
+static inline xf_message_t * xf_msg_queue_head(xf_msg_queue_t *queue)
+{
+ return queue->head;
+}
+
+/* ...check if message belongs to a pool */
+static inline int xf_msg_from_pool(xf_msg_pool_t *pool, xf_message_t *m)
+{
+ return (u32)((__xf_message_t*)m - pool->p) < pool->n;
+}
+
+/*******************************************************************************
+ * Global message pool API
+ ******************************************************************************/
+
+/* ...submit message execution on local DSP core */
+extern void xf_msg_schedule(xf_message_t *m, u32 ts);
+
+/* ...schedule message execution from ISR context */
+extern void xf_msg_schedule_isr(xf_message_t *m);
+
+/* ...submit message for execution on some DSP */
+extern void xf_msg_submit(xf_message_t *m);
+
+/* ...cancel local (scheduled on current core) message execution */
+extern void xf_msg_cancel(xf_message_t *m);
+
+/* ...complete message processing */
+extern void xf_msg_complete(xf_message_t *m);
+
+/* ...complete message from ISR context */
+extern void xf_msg_complete_isr(xf_message_t *m);
+
+/* ...allocate message pool on specific core */
+extern int xf_msg_pool_init(xf_msg_pool_t *pool, u32 n, u32 core);
+
+/* ...allocate message from a pool (no concurrent access from other cores) */
+extern xf_message_t * xf_msg_pool_get(xf_msg_pool_t *pool);
+
+/* ...return message back to the pool (no concurrent access from other cores) */
+extern void xf_msg_pool_put(xf_msg_pool_t *pool, xf_message_t *m);
+
+/* ...destroy message pool */
+extern void xf_msg_pool_destroy(xf_msg_pool_t *pool, u32 core);
+
+/* ...indicate whether pool of free messages is empty */
+extern int xf_message_pool_empty(void);
+
+/* ...initialize global pool of messages */
+extern void xf_message_pool_init(void);
+
+/*******************************************************************************
+ * Auxiliary helpers
+ ******************************************************************************/
+
+/* ...send response message to caller */
+static inline void xf_response(xf_message_t *m)
+{
+ xf_msg_complete(m);
+}
+
+/* ...send response message with output buffer */
+static inline void xf_response_data(xf_message_t *m, u32 length)
+{
+ /* ...adjust message output buffer */
+ m->length = length;
+
+ /* ...return message to originator */
+ xf_msg_complete(m);
+}
+
+/* ...send generic "ok" message (no data buffer) */
+static inline void xf_response_ok(xf_message_t *m)
+{
+ /* ...adjust message output buffer */
+ m->length = 0;
+
+ /* ...return message to originator */
+ xf_msg_complete(m);
+}
+
+/* ...send error-response message */
+static inline void xf_response_err(xf_message_t *m)
+{
+ /* ...set generic error message */
+ m->opcode = XF_UNREGISTER, m->length = 0;
+
+ /* ...return message to originator */
+ xf_msg_complete(m);
+}
diff --git a/hifi/xaf/hifi-dpf/include/xf-opcode.h b/hifi/xaf/hifi-dpf/include/xf-opcode.h
new file mode 100644
index 00000000..6fa08465
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-opcode.h
@@ -0,0 +1,290 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-opcode.h
+ *
+ * Xtensa audio processing framework. Message API
+ *
+ ******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-opcode.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Message routing composition - move somewhere else - tbd
+ ******************************************************************************/
+
+/* ...adjust IPC client of message going from user-space */
+#define XF_MSG_AP_FROM_USER(id, client) \
+ (((id) & ~(0xF << 2)) | (client))
+
+/* ...wipe out IPC client from message going to user-space */
+#define XF_MSG_AP_TO_USER(id) \
+ ((id) & ~(0xF << 18))
+
+/* ...port specification (12 bits) */
+#define __XF_PORT_SPEC(core, id, port) ((core) | ((id) << 2) | ((port) << 8))
+#define __XF_PORT_SPEC2(id, port) ((id) | ((port) << 8))
+#define XF_PORT_CORE(spec) ((spec) & 0x3)
+#define XF_PORT_CLIENT(spec) (((spec) >> 2) & 0x3F)
+#define XF_PORT_ID(spec) (((spec) >> 8) & 0xF)
+
+/* ...message id contains source and destination ports specification */
+#define __XF_MSG_ID(src, dst) (((src) & 0xFFFF) | (((dst) & 0xFFFF) << 16))
+#define XF_MSG_SRC(id) (((id) >> 0) & 0xFFFF)
+#define XF_MSG_SRC_CORE(id) (((id) >> 0) & 0x3)
+#define XF_MSG_SRC_CLIENT(id) (((id) >> 2) & 0x3F)
+#define XF_MSG_SRC_ID(id) (((id) >> 0) & 0xFF)
+#define XF_MSG_SRC_PORT(id) (((id) >> 8) & 0xF)
+#define XF_MSG_SRC_PROXY(id) (((id) >> 15) & 0x1)
+#define XF_MSG_DST(id) (((id) >> 16) & 0xFFFF)
+#define XF_MSG_DST_CORE(id) (((id) >> 16) & 0x3)
+#define XF_MSG_DST_CLIENT(id) (((id) >> 18) & 0x3F)
+#define XF_MSG_DST_ID(id) (((id) >> 16) & 0xFF)
+#define XF_MSG_DST_PORT(id) (((id) >> 24) & 0xF)
+#define XF_MSG_DST_PROXY(id) (((id) >> 31) & 0x1)
+
+/* ...special treatment of AP-proxy destination field */
+#define XF_AP_IPC_CLIENT(id) (((id) >> 18) & 0xF)
+#define XF_AP_CLIENT(id) (((id) >> 22) & 0x1FF)
+#define __XF_AP_PROXY(core) ((core) | 0x8000)
+#define __XF_DSP_PROXY(core) ((core) | 0x8000)
+#define __XF_AP_CLIENT(core, client) ((core) | ((client) << 6) | 0x8000)
+
+/* ...check if DSP message is shared between cores */
+#define XF_MSG_SHARED(id) \
+ ({ u32 __id = (id); (XF_CFG_CORES_NUM > 1 ? (__id ^ (__id >> 16)) & 0x3 : 0); })
+
+/*******************************************************************************
+ * Opcode composition
+ ******************************************************************************/
+
+/* ...opcode composition with command/response data tags */
+#define __XF_OPCODE(c, r, op) (((c) << 31) | ((r) << 30) | ((op) & 0x3F))
+
+/* ...accessors */
+#define XF_OPCODE_CDATA(opcode) ((opcode) & (1 << 31))
+#define XF_OPCODE_RDATA(opcode) ((opcode) & (1 << 30))
+#define XF_OPCODE_TYPE(opcode) ((opcode) & (0x3F))
+
+/*******************************************************************************
+ * Opcode types
+ ******************************************************************************/
+
+/* ...unregister client */
+#define XF_UNREGISTER __XF_OPCODE(0, 0, 0)
+
+/* ...register client at proxy */
+#define XF_REGISTER __XF_OPCODE(1, 0, 1)
+
+/* ...port routing command */
+#define XF_ROUTE __XF_OPCODE(1, 0, 2)
+
+/* ...port unrouting command */
+#define XF_UNROUTE __XF_OPCODE(1, 0, 3)
+
+/* ...shared buffer allocation */
+#define XF_ALLOC __XF_OPCODE(0, 0, 4)
+
+/* ...shared buffer freeing */
+#define XF_FREE __XF_OPCODE(0, 0, 5)
+
+/* ...set component parameters */
+#define XF_SET_PARAM __XF_OPCODE(1, 0, 6)
+
+/* ...get component parameters */
+#define XF_GET_PARAM __XF_OPCODE(1, 1, 7)
+
+/* ...input buffer reception */
+#define XF_EMPTY_THIS_BUFFER __XF_OPCODE(1, 0, 8)
+
+/* ...output buffer reception */
+#define XF_FILL_THIS_BUFFER __XF_OPCODE(0, 1, 9)
+
+/* ...flush specific port */
+#define XF_FLUSH __XF_OPCODE(0, 0, 10)
+
+/* ...start component operation */
+#define XF_START __XF_OPCODE(0, 0, 11)
+
+/* ...stop component operation */
+#define XF_STOP __XF_OPCODE(0, 0, 12)
+
+/* ...pause component operation */
+#define XF_PAUSE __XF_OPCODE(0, 0, 13)
+
+/* ...resume component operation */
+#define XF_RESUME __XF_OPCODE(0, 0, 14)
+
+/* ...extended parameter setting function */
+#define XF_SET_PARAM_EXT __XF_OPCODE(1, 1, 15)
+
+/* ...extended parameter retrieval function */
+#define XF_GET_PARAM_EXT __XF_OPCODE(1, 1, 16)
+
+/* ...total amount of supported decoder commands */
+#define __XF_OP_NUM 17
+
+/*******************************************************************************
+ * XF_START message definition
+ ******************************************************************************/
+
+typedef struct xf_start_msg
+{
+ /* ...effective sample rate */
+ u32 sample_rate;
+
+ /* ...number of channels */
+ u32 channels;
+
+ /* ...sample width */
+ u32 pcm_width;
+
+ /* ...minimal size of intput buffer */
+ u32 input_length;
+
+ /* ...size of output buffer */
+ u32 output_length;
+
+} __attribute__((__packed__)) xf_start_msg_t;
+
+/*******************************************************************************
+ * XF_GET_PARAM message
+ ******************************************************************************/
+
+/* ...message body (command/response) */
+typedef union xf_get_param_msg
+{
+ /* ...command structure */
+ struct
+ {
+ /* ...array of parameters requested */
+ u32 id[0];
+
+ } __attribute__((__packed__)) c;
+
+ /* ...response structure */
+ struct
+ {
+ /* ...array of parameters values */
+ u32 value[0];
+
+ } __attribute__((__packed__)) r;
+
+} xf_get_param_msg_t;
+
+/* ...length of the XF_GET_PARAM command/response */
+#define XF_GET_PARAM_CMD_LEN(params) (sizeof(u32) * (params))
+#define XF_GET_PARAM_RSP_LEN(params) (sizeof(u32) * (params))
+
+/*******************************************************************************
+ * XF_SET_PARAM message
+ ******************************************************************************/
+
+/* ...component initialization parameter */
+typedef struct xf_set_param_item
+{
+ /* ...index of parameter passed to SET_CONFIG_PARAM call */
+ u32 id;
+
+ /* ...value of parameter */
+ u32 value;
+
+} __attribute__ ((__packed__)) xf_set_param_item_t;
+
+/* ...message body (no response message? - tbd) */
+typedef struct xf_set_param_msg
+{
+ /* ...command message */
+ xf_set_param_item_t item[0];
+
+} __attribute__ ((__packed__)) xf_set_param_msg_t;
+
+/* ...length of the command message */
+#define XF_SET_PARAM_CMD_LEN(params) (sizeof(xf_set_param_item_t) * (params))
+
+/*******************************************************************************
+ * XF_SET_PARAM_EXT/XF_GET_PARAM_EXT message
+ ******************************************************************************/
+
+/* ...extended parameter descriptor */
+typedef struct xf_ext_param_desc
+{
+ /* ...index of parameter passed to SET/GET_CONFIG_PARAM call (16-bits only) */
+ u16 id;
+
+ /* ...length of embedded input/output parameter data (in bytes) */
+ u16 length;
+
+} __attribute__ ((__packed__, __aligned__(4))) xf_ext_param_desc_t;
+
+/* ...message body (no response message? - tbd) */
+typedef struct xf_ext_param_msg
+{
+ /* ...extended parameter descriptor */
+ xf_ext_param_desc_t desc;
+
+ /* ...parameter data (in the format expected by codec; 4 bytes aligned) */
+ u8 data[0];
+
+} __attribute__ ((__packed__, __aligned__(4))) xf_ext_param_msg_t;
+
+/*******************************************************************************
+ * XF_ROUTE definition
+ ******************************************************************************/
+
+/* ...port routing command */
+typedef struct xf_route_port_msg
+{
+ /* ...source port specification */
+ u32 src;
+
+ /* ...destination port specification */
+ u32 dst;
+
+ /* ...number of buffers to allocate */
+ u32 alloc_number;
+
+ /* ...length of buffer to allocate */
+ u32 alloc_size;
+
+ /* ...alignment restriction for a buffer */
+ u32 alloc_align;
+
+} __attribute__((__packed__)) xf_route_port_msg_t;
+
+/*******************************************************************************
+ * XF_UNROUTE definition
+ ******************************************************************************/
+
+/* ...port unrouting command */
+typedef struct xf_unroute_port_msg
+{
+ /* ...source port specification */
+ u32 src;
+
+ /* ...destination port specification */
+ u32 dst;
+
+} __attribute__((__packed__)) xf_unroute_port_msg_t;
diff --git a/hifi/xaf/hifi-dpf/include/xf-plugin.h b/hifi/xaf/hifi-dpf/include/xf-plugin.h
new file mode 100644
index 00000000..5805e9ff
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-plugin.h
@@ -0,0 +1,48 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-plugin.h
+ *
+ * Xtensa audio processing framework - plugin infrastructure.
+ *
+ ******************************************************************************/
+
+#ifdef __XF_H
+#error "xf-plugin.h cannot be used together with xf.h"
+#endif
+
+#define __XF_H
+
+/*******************************************************************************
+ * Plugin debugging interface
+ ******************************************************************************/
+
+/* ...platform-specific HAL */
+#include "xf-hal.h"
+#ifdef XAF_ENABLE_NON_HIKEY
+//#define XF_TRACE 1
+#define XF_DEBUG 1
+#endif
+
+/* ...debugging facilities */
+#include "xf-debug.h"
diff --git a/hifi/xaf/hifi-dpf/include/xf-proxy.h b/hifi/xaf/hifi-dpf/include/xf-proxy.h
new file mode 100644
index 00000000..298b782f
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-proxy.h
@@ -0,0 +1,101 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-proxy.h
+ *
+ * Proxy commmand/response messages
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-proxy.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Types definitions
+ ******************************************************************************/
+#ifdef XAF_ENABLE_NON_HIKEY
+/* ...command/response message */
+typedef struct xf_proxy_message
+{
+ /* ...session ID */
+ u32 session_id;
+
+ /* ...proxy API command/reponse code */
+ u32 opcode;
+
+ /* ...length of attached buffer */
+ u32 length;
+
+ /* ...physical address of message buffer */
+ u32 address;
+
+} __attribute__((__packed__)) xf_proxy_message_t;
+#else
+/* ...command/response message */
+typedef struct xf_proxy_message
+{
+ /* ...session ID */
+ uint32_t session_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_t;
+#endif
+/*******************************************************************************
+ * Ring buffer support
+ ******************************************************************************/
+
+/* ...total length of shared memory queue (for commands and responses) */
+#define XF_PROXY_MESSAGE_QUEUE_LENGTH (1 << 8)
+
+/* ...index mask */
+#define XF_PROXY_MESSAGE_QUEUE_MASK 0xFF
+
+/* ...ring-buffer index */
+#define __XF_QUEUE_IDX(idx, counter) \
+ (((idx) & XF_PROXY_MESSAGE_QUEUE_MASK) | ((counter) << 16))
+
+/* ...retrieve ring-buffer index */
+#define XF_QUEUE_IDX(idx) \
+ ((idx) & XF_PROXY_MESSAGE_QUEUE_MASK)
+
+/* ...increment ring-buffer index */
+#define XF_QUEUE_ADVANCE_IDX(idx) \
+ (((idx) + 0x10001) & (0xFFFF0000 | XF_PROXY_MESSAGE_QUEUE_MASK))
+
+/* ...test if ring buffer is empty */
+#define XF_QUEUE_EMPTY(read, write) \
+ ((read) == (write))
+
+/* ...test if ring buffer is full */
+#define XF_QUEUE_FULL(read, write) \
+ ((write) == (read) + (XF_PROXY_MESSAGE_QUEUE_LENGTH << 16))
diff --git a/hifi/xaf/hifi-dpf/include/xf-sched.h b/hifi/xaf/hifi-dpf/include/xf-sched.h
new file mode 100644
index 00000000..3c04436c
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-sched.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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-sched.h
+ *
+ * Non-preemptive earliest-deadline-first scheduler
+ *
+ ******************************************************************************/
+
+#ifndef __XF_SCHED_H
+#define __XF_SCHED_H
+
+/*******************************************************************************
+ * Types definitions
+ ******************************************************************************/
+
+/* ...scheduler data */
+typedef rb_tree_t xf_sched_t;
+
+/* ...scheduling item */
+typedef rb_node_t xf_task_t;
+
+/*******************************************************************************
+ * Helpers
+ ******************************************************************************/
+
+/* ...retrieve timestamp from task handle */
+static inline u32 xf_task_timestamp(xf_task_t *t)
+{
+ /* ...wipe out last bit of "color" */
+ return (((rb_node_t *)t)->color & ~1);
+}
+
+/* ...set task decoding timestamp */
+static inline u32 xf_task_timestamp_set(xf_task_t *t, u32 ts)
+{
+ /* ...technically, wiping out last bit of timestamp is not needed */
+ return (((rb_node_t *)t)->color = ts);
+}
+
+/* ...compare two timestamps with respect to wrap-around */
+static inline int xf_timestamp_before(u32 t0, u32 t1)
+{
+ /* ...distance between active items is never high */
+ return ((s32)(t0 - t1) < 0);
+}
+
+/* ...current scheduler timestamp */
+static inline u32 xf_sched_timestamp(xf_sched_t *sched)
+{
+ /* ...don't quite care about last bit */
+ return ((rb_tree_t *)sched)->root.color;
+}
+
+/* ...set scheduler timestamp */
+static inline u32 xf_sched_timestamp_set(xf_sched_t *sched, u32 ts)
+{
+ /* ...wipe out last bit (black color is 0) */
+ return (((rb_tree_t *)sched)->root.color = ts & ~0x1);
+}
+
+/*******************************************************************************
+ * Entry points
+ ******************************************************************************/
+
+/* ...place message into scheduler queue */
+extern void xf_sched_put(xf_sched_t *sched, xf_task_t *t, u32 ts);
+
+/* ...get first item from the scheduler */
+extern xf_task_t * xf_sched_get(xf_sched_t *sched);
+
+/* ...cancel task execution */
+extern void xf_sched_cancel(xf_sched_t *sched, xf_task_t *t);
+
+/* ...initialize scheduler */
+extern void xf_sched_init(xf_sched_t *sched);
+
+#endif /* __XF_SCHED_H */
diff --git a/hifi/xaf/hifi-dpf/include/xf-timebase.h b/hifi/xaf/hifi-dpf/include/xf-timebase.h
new file mode 100644
index 00000000..7b27d580
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-timebase.h
@@ -0,0 +1,132 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-timebase.h
+ *
+ * Common timebase for deadline-driven scheduler
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-timebase.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Timebase for deadline-driven scheduler
+ ******************************************************************************/
+#ifdef XAF_ENABLE_NON_HIKEY
+/* ...set internal scheduler frequency as a LCM of all supported sample rates;
+ * it is in general not a problem to have large number here, however it should
+ * be noted that maximal-size audio-buffer that we handle, when expressed in
+ * ticks of this virtual frequency, must not exceed 2**31 (for otherwise
+ * scheduler timestamp comparison function will misbehave).
+ */
+#define XF_TIMEBASE_FREQ (4 * 3 * 56448000U)
+/* ...add paranoic check considering maximal audio-buffer duration as 0.1 sec */
+C_BUG((u32)(XF_TIMEBASE_FREQ / 10) >= (1 << 31));
+#else
+/* ...set internal scheduler frequency as a LCM of all supported sample rates */
+#define XF_TIMEBASE_FREQ 56448000U
+#endif
+/* ...supported sampling rates */
+C_BUG(XF_TIMEBASE_FREQ % 4000);
+C_BUG(XF_TIMEBASE_FREQ % 8000);
+C_BUG(XF_TIMEBASE_FREQ % 11025);
+C_BUG(XF_TIMEBASE_FREQ % 12000);
+C_BUG(XF_TIMEBASE_FREQ % 16000);
+C_BUG(XF_TIMEBASE_FREQ % 22050);
+C_BUG(XF_TIMEBASE_FREQ % 24000);
+C_BUG(XF_TIMEBASE_FREQ % 32000);
+C_BUG(XF_TIMEBASE_FREQ % 44100);
+C_BUG(XF_TIMEBASE_FREQ % 48000);
+C_BUG(XF_TIMEBASE_FREQ % 64000);
+C_BUG(XF_TIMEBASE_FREQ % 88200);
+C_BUG(XF_TIMEBASE_FREQ % 96000);
+C_BUG(XF_TIMEBASE_FREQ % 128000);
+C_BUG(XF_TIMEBASE_FREQ % 176400);
+C_BUG(XF_TIMEBASE_FREQ % 192000);
+
+/* ...calculate upsampling factor for given sample rate */
+static inline u32 xf_timebase_factor(u32 sample_rate)
+{
+ /* ...probably we can tolerate single division */
+ switch(sample_rate)
+ {
+ case 4000:
+ return XF_TIMEBASE_FREQ / 4000;
+ case 8000:
+ return XF_TIMEBASE_FREQ / 8000;
+ case 11025:
+ return XF_TIMEBASE_FREQ / 11025;
+ case 12000:
+ return XF_TIMEBASE_FREQ / 11025;
+ case 16000:
+ return XF_TIMEBASE_FREQ / 16000;
+ case 22050:
+ return XF_TIMEBASE_FREQ / 22050;
+ case 24000:
+ return XF_TIMEBASE_FREQ / 24000;
+ case 32000:
+ return XF_TIMEBASE_FREQ / 32000;
+ case 44100:
+ return XF_TIMEBASE_FREQ / 44100;
+ case 48000:
+ return XF_TIMEBASE_FREQ / 48000;
+ case 64000:
+ return XF_TIMEBASE_FREQ / 64000;
+ case 88200:
+ return XF_TIMEBASE_FREQ / 88200;
+ case 96000:
+ return XF_TIMEBASE_FREQ / 96000;
+ case 128000:
+ return XF_TIMEBASE_FREQ / 128000;
+ case 176400:
+ return XF_TIMEBASE_FREQ / 176400;
+ case 192000:
+ return XF_TIMEBASE_FREQ / 192000;
+ default:
+ return 0;
+ }
+}
+
+/* ...core timebase */
+static inline u32 xf_core_timebase(u32 core)
+{
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+
+ /* ...get local scheduler timebase */
+ return xf_sched_timestamp(&cd->sched);
+}
+
+/* ...compare timestamps */
+static inline int xf_time_after(u32 a, u32 b)
+{
+ return ((s32)(a - b) > 0);
+}
+
+/* ...compare timstamps */
+static inline int xf_time_before(u32 a, u32 b)
+{
+ return ((s32)(a - b) < 0);
+}
+
diff --git a/hifi/xaf/hifi-dpf/include/xf-trace.h b/hifi/xaf/hifi-dpf/include/xf-trace.h
new file mode 100644
index 00000000..97bb2905
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf-trace.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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-debug.h
+ *
+ * Debugging interface for Xtensa Audio DSP codec server
+ *
+ *******************************************************************************/
+
+#ifndef __XF_H
+#error "xf-debug.h mustn't be included directly"
+#endif
+
+/*******************************************************************************
+ * Types definitions
+ ******************************************************************************/
+
+#if XF_TRACE
+
+/* ...trace data definition */
+typedef struct xf_trace_data
+{
+ /* ...current write position in tracing buffer */
+ char *p;
+
+ /* ...threshold position for buffer submission */
+ char *end;
+
+#if XF_TRACE_REMOTE
+ /* ...beginning of non-commited internal tracing buffer */
+ char *start;
+
+ /* ...message queue */
+ xf_msg_queue_t queue;
+#endif
+
+} xf_trace_data_t;
+
+#else
+
+/* ...stub for disabled tracing */
+typedef u32 xf_trace_data_t[0];
+
+#endif /* XF_TRACE */
+
+/*******************************************************************************
+ * Internal API functions
+ ******************************************************************************/
+
+#if XF_TRACE_REMOTE
+/* ...submit buffer for tracing */
+extern void xf_trace_submit(u32 core, xf_message_t *m);
+
+/* ...flush current buffer */
+extern void xf_trace_flush(u32 core, xf_message_t *m);
+
+#else
+
+#define xf_trace_submit(core, m) (void)0
+#define xf_trace_flush(core, m) (void)0
+
+#endif /* XF_TRACE_REMOTE */
diff --git a/hifi/xaf/hifi-dpf/include/xf.h b/hifi/xaf/hifi-dpf/include/xf.h
new file mode 100644
index 00000000..f124d8ca
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/include/xf.h
@@ -0,0 +1,112 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf.h
+ *
+ * Xtensa audio processing framework. Main header
+ *
+ ******************************************************************************/
+
+#ifdef __XF_H
+#error "xf.h included more than once"
+#endif
+
+#define __XF_H
+
+/*******************************************************************************
+ * Global configuration parameters (changing is to be done carefully)
+ ******************************************************************************/
+
+/* ...allocate 6 bits for client number per core */
+#define XF_CFG_MAX_CLIENTS (1 << 6)
+
+/* ...allocate 2 bits for core id */
+#define XF_CFG_MAX_CORES (1 << 2)
+
+/* ...allocate 4 bits for maximal number of input/output ports per component */
+#define XF_CFG_MAX_PORTS (1 << 4)
+
+/* ...allocate 6 bits for opcode type */
+#define XF_CFG_MAX_CODES (1 << 6)
+
+/*******************************************************************************
+ * Common runtime framework
+ ******************************************************************************/
+#ifndef XAF_ENABLE_NON_HIKEY
+#include "cpu_c.h"
+
+#include "dsp_driver_ipc.h"
+
+#include "dsp_debug.h"
+
+#include "dsp_memory_config.h"
+
+#include "dsp_driver_mailbox.h"
+
+#include "dsp_pcm_gain.h"
+
+#endif
+/* ...target configuration */
+#include "xf-config.h"
+
+/* ...platform run-time */
+#include "xf-runtime.h"
+
+/* ...debugging facility */
+#include "xf-debug.h"
+
+/* ...generic memory allocator */
+#include "xf-mm.h"
+
+/* ...standard opcodes */
+#include "xf-opcode.h"
+
+/* ...proxy definitions (shared messages - tbd) */
+#include "xf-proxy.h"
+
+/* ...message API */
+#include "xf-msg.h"
+
+/* ...tracer data */
+#include "xf-trace.h"
+
+/* ...I/O ports */
+#include "xf-io.h"
+
+/* ...scheduler definition */
+#include "xf-sched.h"
+
+/* ...component definition */
+#include "xf-component.h"
+
+/* ...core data */
+#include "xf-core.h"
+
+/* ...system abstractions */
+#include "xf-sys.h"
+
+/* ...memory management */
+#include "xf-mem.h"
+
+/* ...common timebase */
+#include "xf-timebase.h"
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/arch_hifi330.S b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/arch_hifi330.S
new file mode 100644
index 00000000..6d1eb7e7
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/arch_hifi330.S
@@ -0,0 +1,468 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+/******************************************************************************
+ arch_hifi330.S
+******************************************************************************/
+
+#include <xtensa/coreasm.h>
+#include <xtensa/simcall.h>
+#include <xtensa/corebits.h>
+#include <xtensa/config/system.h>
+#include <xtensa/config/core.h>
+#include "arch_hifi330.h"
+
+ .global OSStartHighRdy
+ .global OSTaskSwHook
+ .global g_pstVosTCBHighRdy
+ .global g_bVosRunning
+
+// .data
+ .section .dram0.data, "aw"
+ .type OSIntCtxSw_Occur,@object
+OSIntCtxSw_Occur:
+ .byte 0
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .align 4
+ .globl VOSStartHighRdy
+ .type VOSStartHighRdy,@function
+ .align 4
+/*****************************************************************************
+ VOSStartHighRdy
+*****************************************************************************/
+VOSStartHighRdy:
+ ENTRY(16)
+
+ /*OSIntCtxSw_Occur*/
+ movi a2, OSIntCtxSw_Occur
+ movi a3, 0
+ s8i a3, a2, 0
+
+ movi a2, g_bVosRunning
+ movi a3, 1
+ s8i a3, a2, 0
+
+#if 0
+ /*OS_TaskSwHook */
+ movi a2, OS_TaskSwHook
+ callx4 a2
+#endif
+ call0 OS_TaskSwitch
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .globl VOSCtxSw
+ .type VOSCtxSw,@function
+ .align 4
+/*****************************************************************************
+ OSCtxSw
+*****************************************************************************/
+VOSCtxSw:
+ entry sp, XT_SOL_FRMSZ
+ rsr a2, PS
+ s32i a0, sp, XT_SOL_PC
+ s32i a2, sp, XT_SOL_PS
+ movi a2, g_pstVosTCBCur
+ movi a3, 0
+ l32i a2, a2, 0
+ s32i a3, sp, XT_SOL_EXIT
+ s32i sp, a2, OSTCBStkPtr /* g_pstVosTCBCur->OSTCBStkPtr = SP; */
+
+ call4 xthal_window_spill
+#if 0
+ /*OS_TaskSwHook */
+ movi a2, OS_TaskSwHook
+ callx4 a2
+#endif
+
+ /* CPENABLE, co-processor state. */
+ movi a3, g_pstVosTCBCur
+ l32i a3, a3, 0
+ l32i a2, a3, OSTCBStkBottom
+ movi a3, 0
+
+ wsr a3, CPENABLE /* disable all co-processors */
+ s8i a3, a2, XT_CPENABLE /* cp_state->cpenable = 0; */
+
+
+ call0 OS_TaskSwitch
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .globl VOSIntCtxSw
+ .type VOSIntCtxSw,@function
+ .align 4
+/*****************************************************************************
+ OSIntCtxSw
+*****************************************************************************/
+VOSIntCtxSw:
+ ENTRY(16)
+#if 0
+ /*OS_TaskSwHook */
+ movi a2, OS_TaskSwHook
+ callx4 a2
+#endif
+
+ /*CPENABLE task co-processor, CPENABLE. */
+ movi a3, g_pstVosTCBCur
+ l32i a3, a3, 0
+ l32i a2, a3, OSTCBStkBottom
+ rsr a3, CPENABLE
+ s8i a3, a2, XT_CPENABLE
+ movi a3, 0
+ wsr a3, CPENABLE
+
+ movi a2, OSIntCtxSw_Occur
+ movi a3, 1
+ s8i a3, a2, 0
+
+
+ RET(16)
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OSCPUSaveSR
+ .type OSCPUSaveSR,@function
+ .align 4
+/*****************************************************************************
+ OSCPUSaveSR
+*****************************************************************************/
+OSCPUSaveSR:
+ entry a1,32
+ rsil a2,15
+ esync
+ retw
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OSCPURestoreSR
+ .type OSCPURestoreSR,@function
+ .align 4
+/*****************************************************************************
+ OSCPURestoreSR
+*****************************************************************************/
+OSCPURestoreSR:
+ entry a1,32
+ wsr.ps a2
+ esync
+ retw
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OS_TaskSwitch
+ .type OS_TaskSwitch,@function
+ .align 4
+/*****************************************************************************
+ OS_TaskSwitch
+*****************************************************************************/
+OS_TaskSwitch:
+
+ /*1)
+ g_ucVosPrioCur = g_ucVosPrioHighRdy;
+ g_pstVosTCBCur = g_pstVosTCBHighRdy;
+ SP = g_pstVosTCBHighRdy->OSTCBStkPtr;
+ */
+ movi a2, g_ucVosPrioHighRdy
+ movi a3, g_ucVosPrioCur
+ l8ui a2, a2, 0
+ movi a4, g_pstVosTCBHighRdy
+ s8i a2, a3, 0
+ movi a2, g_pstVosTCBCur
+ l32i a3, a4, 0
+ l32i sp, a3, OSTCBStkPtr
+ s32i a3, a2, 0
+
+
+ l32i a2, sp, XT_STK_EXIT
+ bnez a2, .L_in_int
+
+
+ l32i a3, sp, XT_SOL_PS
+ l32i a0, sp, XT_SOL_PC
+
+ rsync
+
+ wsr a3, PS
+ retw
+
+.L_in_int:
+ /* co-processor CPENABLE*/
+ movi a3, g_pstVosTCBCur
+ l32i a3, a3, 0
+ l32i a2, a3, OSTCBStkBottom
+ l8ui a3, a2, XT_CPENABLE
+ wsr a3, CPENABLE
+
+
+ call0 OS_ContextRestore
+ rsync
+
+ l32i a0, sp, XT_STK_EXIT
+ ret
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .globl OS_ContextSave
+ .type OS_ContextSave,@function
+ .align 4
+/*****************************************************************************
+ OS_ContextSave
+*****************************************************************************/
+OS_ContextSave:
+
+ /*1):
+ A2
+ A3
+ A4
+ A5
+ A6
+ A7
+ A8
+ A9
+ A10
+ A11
+ SAR,LBENG,LEND,LCOUNT*/
+ s32i a2, sp, XT_STK_A2
+ s32i a3, sp, XT_STK_A3
+ s32i a4, sp, XT_STK_A4
+ s32i a5, sp, XT_STK_A5
+ s32i a6, sp, XT_STK_A6
+ s32i a7, sp, XT_STK_A7
+ s32i a8, sp, XT_STK_A8
+ s32i a9, sp, XT_STK_A9
+ s32i a10, sp, XT_STK_A10
+ s32i a11, sp, XT_STK_A11
+ s32i a14, sp, XT_STK_A14
+ s32i a15, sp, XT_STK_A15
+
+
+ rsr a3, SAR
+ s32i a3, sp, XT_STK_SAR
+
+ rsr a3, LBEG
+ s32i a3, sp, XT_STK_LBEG
+ rsr a3, LEND
+ s32i a3, sp, XT_STK_LEND
+ rsr a3, LCOUNT
+ s32i a3, sp, XT_STK_LCOUNT
+
+ /*2)*/
+ mov a9, a0
+ s32i a12, sp, XT_STK_TMP+0
+ s32i a13, sp, XT_STK_TMP+4
+ s32i a9, sp, XT_STK_TMP+8
+ l32i a12, sp, XT_STK_A12
+ l32i a13, sp, XT_STK_A13
+ l32i a9, sp, XT_STK_A9
+ addi sp, sp, XT_STK_FRMSZ
+ call0 xthal_window_spill_nw
+ addi sp, sp, -XT_STK_FRMSZ
+ l32i a12, sp, XT_STK_TMP+0
+ l32i a13, sp, XT_STK_TMP+4
+ l32i a9, sp, XT_STK_TMP+8
+
+ addi a2, sp, XT_STK_EXTRA
+ call0 xthal_save_extra_nw
+
+ mov a0, a9
+ ret
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OS_ContextRestore
+ .type OS_ContextRestore,@function
+ .align 4
+/*****************************************************************************
+ OS_ContextRestore
+*****************************************************************************/
+OS_ContextRestore:
+ /*
+ 1) xthal_restore_extra_nw*/
+ mov a13, a0
+ addi a2, sp, XT_STK_EXTRA
+ call0 xthal_restore_extra_nw
+ mov a0, a13
+
+ /*2):
+ LBEG
+ LEND
+ LCOUNT
+ A2
+ SAR
+ A3
+ A4
+ A5
+ A6
+ A7
+ A8
+ A9
+ A10
+ A11
+ A12
+ A13
+ A14
+ A15*/
+ l32i a2, sp, XT_STK_LBEG
+ l32i a3, sp, XT_STK_LEND
+ wsr a2, LBEG
+ l32i a2, sp, XT_STK_LCOUNT
+ wsr a3, LEND
+ wsr a2, LCOUNT
+
+ l32i a3, sp, XT_STK_SAR
+ l32i a2, sp, XT_STK_A2
+ wsr a3, SAR
+ l32i a3, sp, XT_STK_A3
+ l32i a4, sp, XT_STK_A4
+ l32i a5, sp, XT_STK_A5
+ l32i a6, sp, XT_STK_A6
+ l32i a7, sp, XT_STK_A7
+ l32i a8, sp, XT_STK_A8
+ l32i a9, sp, XT_STK_A9
+ l32i a10, sp, XT_STK_A10
+ l32i a11, sp, XT_STK_A11
+
+ l32i a12, sp, XT_STK_A12
+ l32i a13, sp, XT_STK_A13
+ l32i a14, sp, XT_STK_A14
+ l32i a15, sp, XT_STK_A15
+
+ ret
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .globl OS_IntEnter
+ .type OS_IntEnter,@function
+ .align 4
+OS_IntEnter:
+
+ /* Save a12-13 in the stack frame as required by _xt_context_save. */
+ s32i a12, sp, XT_STK_A12
+ s32i a13, sp, XT_STK_A13
+
+ /* Save return address in a safe place (free a0). */
+ mov a12, a0
+
+ /* Save the rest of the interrupted context (preserves A12-13). */
+ call0 OS_ContextSave
+
+ /*
+ Save interrupted task's SP in TCB only if not nesting.
+ Manage nesting directly rather than call the generic OSIntEnter()
+ (in windowed ABI we can't call a C function here anyway because PS.EXCM is still set).
+ */
+ movi a2, g_bVosRunning
+ movi a3, g_ucVosIntNesting
+ l8ui a2, a2, 0 /* if (g_bVosRunning == OS_TRUE) { */
+ beqz a2, 2f
+ l8ui a2, a3, 0 /* if (g_ucVosIntNesting == 0) { */
+ bnez a2, 1f
+ movi a4, g_pstVosTCBCur
+ l32i a4, a4, 0
+ s32i sp, a4, OSTCBStkPtr /* g_pstVosTCBCur->OSTCBStkPtr = SP; */
+1: /* } */
+ addi a2, a2, 1 /* if (g_ucVosIntNesting < 255u) { */
+ bgeui a2, 256, 2f /* g_ucVosIntNesting++; */
+ s8i a2, a3, 0 /* } */
+2: /* } */
+
+ /* Retrieve the return address and return to interrupt handler. */
+ mov a0, a12
+ ret
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .globl OS_IntExit
+ .type OS_IntExit,@function
+ .align 4
+OS_IntExit:
+#if 0
+ /* Call VOSIntExit() to deal with nesting and call the scheduler. */
+ movi a2, VOSIntExit
+
+ rsil a0, XCHAL_EXCM_LEVEL /* enter critical section */
+ callx4 a2 /* VOSIntExit() */
+#endif
+ /* Context-switch deferred from OSIntCtxSw(). Still in critical section. */
+ movi a2, OSIntCtxSw_Occur
+ l8ui a3, a2, 0
+ beqz a3, 1f /* if (OSIntCtxSw_Occur) { */
+ movi a3, 0 /* OSIntCtxSw_Occur = false; */
+ s8i a3, a2, 0
+ call0 OS_TaskSwitch /* tail-call dispatcher; */
+ /* Never returns here. */ /* } */
+1:
+
+ /*
+ We come here only if there was no context switch, that is if this
+ is a nested interrupt or the interrupted task was not preempted.
+ We are still on the same stack so there's no need to load the SP.
+ */
+
+ /* Restore full context from interrupt stack frame and return to exit dispatcher. */
+ call0 OS_ContextRestore
+
+ /*
+ Must return via the exit dispatcher corresponding to the entrypoint from which
+ this was called. Interruptee's A0, A1, PS, PC are restored and the interrupt
+ stack frame is deallocated in the exit dispatcher.
+ */
+ l32i a0, sp, XT_STK_EXIT
+ ret
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .globl OS_GetTaskCoprocState
+ .type OS_GetTaskCoprocState,@function
+ .align 4
+OS_GetTaskCoprocState:
+
+ movi a2, g_bVosRunning
+ movi a3, g_ucVosIntNesting
+ l8ui a2, a2, 0
+ l8ui a3, a3, 0
+ beqz a2, 1f
+ bnez a3, 1f
+ movi a15, g_pstVosTCBCur
+ l32i a15, a15, 0
+ beqz a15, 2f
+ l32i a15, a15, OSTCBStkBottom
+ ret
+
+1: movi a15, 0
+2: ret
+ .end literal_prefix
+
+
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/cpu_c.c b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/cpu_c.c
new file mode 100644
index 00000000..12ce8b71
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/cpu_c.c
@@ -0,0 +1,152 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+
+#include "cpu_c.h"
+#include <xtensa/config/specreg.h>
+#include <xtensa/config/core.h>
+#include <xtensa/simcall.h>
+#include "arch_hifi330.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif
+
+/*lint -e838 -e835 -e750 -e529 -e533 -e40*/
+
+//#define DSP_TRACES_TO_MEM_SIZE (0x800)
+
+void *g_pfVosHookFuncTable[OS_HOOK_TYPE_BUTT];
+
+void *g_pfVosIntrFuncTable[OS_INTR_CONNECT_BUTT];
+
+//unsigned int g_uwSoftIntInfo = 0;
+
+/* Interrupt nesting level */
+unsigned char g_ucVosIntNesting;
+
+/* Priority of current task */
+unsigned char g_ucVosPrioCur;
+
+/* Priority of highest priority task */
+unsigned char g_ucVosPrioHighRdy;
+
+/* Flag indicating that kernel is running */
+unsigned short g_bVosRunning;
+
+/* Pointer to highest priority TCB R-to-R */
+unsigned int *g_pstVosTCBHighRdy;
+
+/* Pointer to currently running TCB*/
+unsigned int *g_pstVosTCBCur;
+
+#define _XTSTR(x) #x
+#define XTSTR(x) _XTSTR(x)
+
+void OS_EnterIntHook(unsigned int uhwIntrNo)
+{
+ INTR_HOOK_FUN_TYPE pfIntrHook = (INTR_HOOK_FUN_TYPE)g_pfVosHookFuncTable[OS_HOOK_TYPE_ENTER_INTR];/*lint !e611*/
+
+ if (0 != pfIntrHook)
+ {
+ pfIntrHook(uhwIntrNo);
+ }
+}
+
+void OS_ExitIntHook(unsigned int uhwIntrNo)
+{
+ INTR_HOOK_FUN_TYPE pfIntrHook = (INTR_HOOK_FUN_TYPE)g_pfVosHookFuncTable[OS_HOOK_TYPE_EXIT_INTR];/*lint !e611*/
+
+ if (0 != pfIntrHook)
+ {
+ pfIntrHook(uhwIntrNo);
+ }
+}
+
+void OS_UserexecHandler(unsigned int uwExecCauseNo, unsigned int psAddr)
+{
+ VOS_EXCEPTION_HOOK_FUNC pfIntrHook = (VOS_EXCEPTION_HOOK_FUNC)g_pfVosHookFuncTable[OS_HOOK_TYPE_EXCEPTION];/*lint !e611*/
+
+ if (0 != pfIntrHook)
+ {
+ pfIntrHook(uwExecCauseNo);
+ }
+ else
+ {
+ extern void OS_Panic(void);
+ OS_Panic();
+ }
+}
+
+void OS_InterruptHandler(unsigned int uhwIntrNo)
+{
+ HOOK_FUN_TYPE pfIntrHook = (HOOK_FUN_TYPE)g_pfVosIntrFuncTable[uhwIntrNo];
+
+ if (0 != pfIntrHook)
+ //pfIntrHook();
+ pfIntrHook(0);
+}
+
+void OS_NmiHook(unsigned int uwExecCauseNo, unsigned int psAddr)
+{
+ HOOK_FUN_TYPE pfNmiHook = (HOOK_FUN_TYPE)g_pfVosHookFuncTable[OS_HOOK_TYPE_NMI];/*lint !e611*/
+
+ if (0 != pfNmiHook)
+ {
+ //pfNmiHook();
+ pfNmiHook(0);
+ }
+
+ //wait for hifi reset
+ UCOM_SET_WFI_NMI(5);
+}
+
+void VOS_ConnectInterrupt(unsigned int uwIntrNo, HOOK_FUN_TYPE pfnInterruptHook)
+{
+ g_pfVosIntrFuncTable[uwIntrNo] = (void *)pfnInterruptHook;/*lint !e611*/
+}
+
+void VOS_EnableInterrupt(unsigned int uwIntNo)
+{
+ unsigned int uwBitEnable;
+
+ uwBitEnable = xthal_get_intenable();
+ xthal_set_intenable(uwBitEnable | (((unsigned int)1) << uwIntNo ));
+
+}
+void VOS_DisableInterrupt(unsigned int uwIntNo)
+{
+ unsigned int uwBitEnable;
+
+ uwBitEnable = xthal_get_intenable();
+ xthal_set_intenable(uwBitEnable | (((unsigned int)0) << uwIntNo ));
+
+}
+
+#ifdef __cplusplus
+ #if __cplusplus
+ }
+ #endif
+#endif
+
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_comm.c b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_comm.c
new file mode 100644
index 00000000..290ca9dd
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_comm.c
@@ -0,0 +1,75 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+#include "dsp_comm.h"
+
+void dsp_memcpy(void *d, void *s, unsigned int size)
+{
+ unsigned char *dest = (unsigned char*)d;
+ unsigned char *src = (unsigned char*)s;
+
+ if (s == d) {
+ return;
+ } else if (src > dest) {
+ for (; dest < ((unsigned char*)d + size); dest++) {
+ *dest = *src;
+ src++;
+ }
+ } else {
+ src = src + (size - 1);
+ for (dest = dest + (size - 1); dest >= (unsigned char*)d; dest--) {
+ *dest = *src;
+ src--;
+ }
+ }
+}
+
+
+void dsp_memset(void *d, unsigned char ucData, unsigned int size)
+{
+ unsigned int i;
+ unsigned char *dest = (unsigned char*)d;
+
+ for(i = 0; i < size; i++)
+ *dest++ = ucData;
+}
+int division(int a, int b)
+{
+ const int bits_in_word_m1 = (int)(sizeof(int) * 8) - 1;
+ int s_a = a >> bits_in_word_m1; /* s_a = a < 0 ? -1 : 0 */
+ int s_b = b >> bits_in_word_m1; /* s_b = b < 0 ? -1 : 0 */
+ a = (a ^ s_a) - s_a; /* negate if s_a == -1 */
+ b = (b ^ s_b) - s_b; /* negate if s_b == -1 */
+ s_a ^= s_b; /* sign of quotient */
+ /*
+ * On CPUs without unsigned hardware division support,
+ * this calls __udivsi3 (notice the cast to su_int).
+ * On CPUs with unsigned hardware division support,
+ * this uses the unsigned division instruction.
+ */
+ return ((int)a/(int)b ^ s_a) - s_a; /* negate if s_a == -1 */
+
+}
+
+
+
+
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_debug.c b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_debug.c
new file mode 100644
index 00000000..a74308e4
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/dsp_debug.c
@@ -0,0 +1,468 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include "dsp_debug.h"
+#include "dsp_memory_config.h"
+#include "dsp_driver_mailbox.h"
+#include "dsp_comm.h"
+#include "dsp_pcm_gain.h"
+extern int g_pcm_gain;
+extern int MsgFlag;
+extern int InpBuf[HOLD_BUF_SIZE]; // assumes 32 bit samples.
+extern int OutBuf[HOLD_BUF_SIZE]; // assumes 32 bit samples.
+
+static int hex2asc(int n)
+{
+ n &= 15;
+ if(n > 9){
+ return ('a' - 10) + n;
+ } else {
+ return '0' + n;
+ }
+}
+
+static void xputs(const char *s, void (*xputc)(unsigned n, void *cookie), void *cookie)
+{
+ while (*s) {
+ xputc(*s++, cookie);
+ }
+}
+
+void __xprintf(const char *fmt, va_list ap,void (*xputc)(unsigned n, void *cookie), void *cookie)
+{
+ char scratch[32];
+ for(;;){
+ switch(*fmt){
+ case 0:
+ va_end(ap);
+ return;
+ case '%':
+ switch(fmt[1]) {
+ case 'c': {
+ unsigned n = va_arg(ap, unsigned);
+ xputc(n, cookie);
+ fmt += 2;
+ continue;
+ }
+ case 'h': {
+ unsigned n = va_arg(ap, unsigned);
+ xputc(hex2asc(n >> 12), cookie);
+ xputc(hex2asc(n >> 8), cookie);
+ xputc(hex2asc(n >> 4), cookie);
+ xputc(hex2asc(n >> 0), cookie);
+ fmt += 2;
+ continue;
+ }
+ case 'b': {
+ unsigned n = va_arg(ap, unsigned);
+ xputc(hex2asc(n >> 4), cookie);
+ xputc(hex2asc(n >> 0), cookie);
+ fmt += 2;
+ continue;
+ }
+ case 'p':
+ case 'X':
+ case 'x': {
+ unsigned n = va_arg(ap, unsigned);
+ char *p = scratch + 15;
+ *p = 0;
+ do {
+ *--p = hex2asc(n);
+ n = n >> 4;
+ } while(n != 0);
+ while(p > (scratch + 7)) *--p = '0';
+ xputs(p, xputc, cookie);
+ fmt += 2;
+ continue;
+ }
+ case 'd': {
+ int n = va_arg(ap, int);
+ char *p = scratch + 15;
+ *p = 0;
+ if(n < 0) {
+ xputc('-', cookie);
+ n = -n;
+ }
+ do {
+ *--p = (n % 10) + '0';
+ n /= 10;
+ } while(n != 0);
+ xputs(p, xputc, cookie);
+ fmt += 2;
+ continue;
+ }
+
+ case 'f': {
+ double fnum = va_arg(ap, double);
+ unsigned long long ipart, fpart;
+ int i=4;
+ char *p = scratch + 31;
+ *p = '\0';
+
+ if(fnum < 0.0)
+ {
+ xputc('-', cookie);
+ fnum = -fnum;
+ }
+ ipart = (unsigned long long)fnum;
+ fpart = ((fnum-ipart)*10000); //10^i = 10000
+
+ while(i>0)
+ {
+ *--p = (fpart % 10) + '0';
+ fpart /= 10;
+ i--;
+ }
+ *--p = '.';
+ while(ipart > 0)
+ {
+ *--p = (ipart % 10) + '0';
+ ipart /= 10;
+ }
+
+ xputs(p, xputc, cookie);
+ fmt += 2;
+ continue;
+ }
+
+ case 'u': {
+ unsigned n = va_arg(ap, unsigned);
+ char *p = scratch + 15;
+ *p = 0;
+ do {
+ *--p = (n % 10) + '0';
+ n /= 10;
+ } while(n != 0);
+ xputs(p, xputc, cookie);
+ fmt += 2;
+ continue;
+ }
+ case 's': {
+ char *s = (char *)va_arg(ap, char*);
+ if(s == 0) s = "(null)";
+ xputs(s, xputc, cookie);
+ fmt += 2;
+ continue;
+ }
+ case 'l': {
+ if (fmt[2] == 'x') {
+ unsigned long long n = va_arg(ap, unsigned long long);
+ char *p = scratch + 23;
+ *p = 0;
+ do {
+ *--p = hex2asc((int)n);
+ n = n >> 4;
+ } while(n != 0);
+ while(p > (scratch + 7)) *--p = '0';
+ xputs(p, xputc, cookie);
+ fmt += 3;
+ continue;
+ }
+ }
+ }
+ xputc(*fmt++, cookie);
+ break;
+ case '\n':
+ xputc('\r', cookie);
+ default:
+ xputc(*fmt++, cookie);
+ }
+ }
+}
+
+static char* log_to_mem_head = 0;
+void dsp_debug_init()
+{
+ log_to_mem_head = (char *)(*((unsigned int *)DRV_DSP_UART_TO_MEM_CUR_ADDR) + DRV_DSP_UART_TO_MEM);
+
+}
+
+static void log_write_to_mem(const char c_data)
+{
+ *log_to_mem_head = c_data;
+
+ log_to_mem_head++;
+ if ((unsigned int)log_to_mem_head >= (DRV_DSP_UART_TO_MEM + DRV_DSP_UART_TO_MEM_SIZE - 1))
+ log_to_mem_head = (char *)DRV_DSP_UART_TO_MEM + DRV_DSP_UART_TO_MEM_RESERVE_SIZE;
+
+ *((unsigned int *)DRV_DSP_UART_TO_MEM_CUR_ADDR) = (unsigned int)log_to_mem_head - DRV_DSP_UART_TO_MEM;
+}
+
+
+static void print_char(const char c_data)
+{
+ if (c_data == '\n')
+ log_write_to_mem('\r');
+ log_write_to_mem(c_data);
+}
+
+typedef void (*xputc_type)(unsigned n, void *cookie);
+
+void print_log(const char *fmt, ...)
+{
+ va_list args;
+va_start(args, fmt);
+ __xprintf(fmt, args, (xputc_type)print_char, 0);
+ va_end(args);
+}
+#ifdef HIKEY_XAF_IPC_COMMENT_OUT
+#define ISSPACE(c) (c == ' ' || c == 0x09 || c == 0x0A || c == 0x0D || c == 0)
+
+char* dsp_om_trim_zero(char* str)
+{
+ char *str_begin = 0;
+ char *str_end = 0;
+
+ if (!str)
+ return 0;
+
+ str_begin = str;
+ str_end = str + strlen(str);
+
+ while (str_begin < str_end) {
+ if (ISSPACE(*str_begin)) {
+ *str_begin = 0;
+ str_begin++;
+ } else {
+ break;
+ }
+ }
+ while (str_begin < str_end) {
+ if (ISSPACE(*str_end)) {
+ *str_end = 0;
+ str_end--;
+ } else {
+ break;
+ }
+ }
+
+ return str_begin;
+}
+
+char * dsp_om_split_str(char* str, char** split_str)
+{
+ char *str_begin = 0;
+ char *str_end = 0;
+
+ if ((!str) || (!split_str)) {
+ DSP_LOGE("input param is null\n");
+ return str;
+ }
+
+ str_end = str + strlen(str);
+ str_begin = dsp_om_trim_zero(str);
+
+ if (str_begin == str_end) {
+ DSP_LOGE("input str all space\n");
+ return 0;
+ }
+
+ *split_str = dsp_om_trim_zero(strchr(str_begin, ' '));
+
+ return str_begin;
+}
+
+#ifdef GJB_CHANGE
+void send_msg_data_to_ap()
+{
+
+ struct hikey_msg_with_content hikey_msg;
+ DSP_LOGE("%s\n", __func__);
+ hikey_msg.msg_info.msg_id=HIKEY_AUDIO_DSP_AP_OM_CMD;
+ hikey_msg.msg_info.msg_len=HIKEY_AP_DSP_MSG_MAX_LEN;
+ strncpy(hikey_msg.msg_info.msg_content,"pcm_gain",HIKEY_AP_DSP_MSG_MAX_LEN);
+ dsp_mailbox_write(&hikey_msg);
+ DSP_LOGE("Exit %s\n", __func__);
+}
+
+void send_pcm_data_to_ap()
+{
+ struct hikey_ap_dsp_msg_body msg_info;
+ DSP_LOGE("Enter %s\n", __func__);
+ msg_info.msg_id = ID_XAF_DSP_TO_AP;
+ msg_info.msg_len = sizeof(msg_info);
+ msg_info.xf_dsp_msg.id= 0;
+ msg_info.xf_dsp_msg.opcode = 0xc;
+ msg_info.xf_dsp_msg.length = 0x400;
+ msg_info.xf_dsp_msg.address = 0x8B432000;
+ dsp_mailbox_write(&msg_info);
+ DSP_LOGE("Exit %s\n", __func__);
+}
+#else
+void send_msg_data_to_ap()
+{
+ xf_proxy_message_t hikey_msg;
+ DSP_LOGE("%s\n", __func__);
+ hikey_msg.id=HIKEY_AUDIO_DSP_AP_OM_CMD;
+ hikey_msg.length=HIKEY_AP_DSP_MSG_MAX_LEN;
+ strncpy(hikey_msg.address,"pcm_gain",HIKEY_AP_DSP_MSG_MAX_LEN);
+ dsp_mailbox_write(&hikey_msg);
+ DSP_LOGE("Exit %s\n", __func__);
+}
+
+void send_pcm_data_to_ap()
+{
+ xf_proxy_message_t msg_info;
+ DSP_LOGE("Enter %s\n", __func__);
+ msg_info.id = ID_XAF_DSP_TO_AP;
+ msg_info.opcode = 0xc;
+ msg_info.length = 0x400;
+ msg_info.address = 0x8B432000;
+ dsp_mailbox_write(&msg_info);
+ DSP_LOGE("Exit %s\n", __func__);
+}
+#endif
+static void dsp_om_read_mem(char *str)
+{
+ unsigned int addr = 0;
+ unsigned int val = 0;
+ if (!str) {
+ DSP_LOGE("str is null\n");
+ return;
+ }
+
+ addr = strtoul(str, 0, 16);
+ DSP_LOGD("str:%s addr:0x%x\n", str, addr);
+
+ val = *(unsigned int*)addr;
+ send_pcm_data_to_ap();
+//send_msg_data_to_ap();
+ dsp_ipc_send_irq_to_ap();
+ DSP_LOGI("read addr:0x%x value:0x%x\n", addr, val);
+ return;
+}
+
+static void dsp_om_write_mem(char *str)
+{
+ char* str_addr = 0;
+ char* str_val = 0;
+ unsigned int addr = 0;
+ unsigned int val = 0;
+ if (!str) {
+ DSP_LOGE("str is null\n");
+ return;
+ }
+
+ str_addr = dsp_om_split_str(str, &str_val);
+
+ if(!str_addr || !str_val) {
+ DSP_LOGE("str:%s str_addr:%s strValue:%s\n", str, str_addr ? str_addr : "null", str_val ? str_val : "null");
+ return;
+ }
+ addr = strtoul(str_addr, 0, 16);
+ val= strtoul(str_val, 0, 16);
+ DSP_LOGI("str_addr:%s addr:%x str_val:%s val:%x\n", str_addr ? str_addr : "null", addr, str_val ? str_val : "null", val);
+
+ *(unsigned int *)addr = val;
+
+ return;
+
+}
+
+static void dsp_om_pcm_gain(char *str)
+{
+ char* str_addr = 0;
+ char* str_val = 0;
+ unsigned int addr = 0;
+ unsigned int val = 0;
+ if (!str) {
+ DSP_LOGE("str is null\n");
+ return;
+ }
+ str_addr = dsp_om_split_str(str, &str_val);
+ if(!str_addr || !str_val) {
+ DSP_LOGE("str:%s str_addr:%s strValue:%s\n", str, str_addr ? str_addr : "null", str_val ? str_val : "null");
+ return;
+ }
+ addr = strtoul(str_addr, 0, 16);
+ val= strtoul(str_val, 0, 16);
+ DSP_LOGI("str_addr:%s addr:%x str_val:%s val:%x\n", str_addr ? str_addr : "null", addr, str_val ? str_val : "null", val);
+ if(ReadData((char*)InpBuf, val) ){
+ processAudio(OutBuf, InpBuf, (val/4));
+ if(WriteData((char*)OutBuf, val)) {
+ MsgFlag = MSG_PROC; // indicate that the msg is processed.
+ DSP_LOGI("PCM gain processed\n");
+ send_msg_data_to_ap();
+ dsp_ipc_send_irq_to_ap(); // Indicate data is ready to pickup... Maybe you need to send a msg to AP.
+ }
+ else {
+ DSP_LOGI("PCM gain Write error\n");
+ MsgFlag = MSG_INCOMP;
+ dsp_ipc_send_irq_to_ap();// Report error..
+ }
+ }
+ else {
+ DSP_LOGI("PCM gain Read error\n");
+ MsgFlag = MSG_INCOMP;
+ dsp_ipc_send_irq_to_ap();
+ }
+ return;
+}
+typedef void (*om_proc_func)(char *str);
+
+struct om_proc_info {
+ char *om_proc_name;
+ om_proc_func func;
+};
+
+struct om_proc_info om_proc_table[] = {
+ {"read_mem", dsp_om_read_mem},
+ {"write_mem", dsp_om_write_mem},
+ {"pcm_gain", dsp_om_pcm_gain},
+};
+
+om_proc_func dsp_om_get_func_by_name(char *name)
+{
+ unsigned int i = 0;
+ unsigned int func_num = sizeof(om_proc_table) / sizeof(om_proc_table[0]);
+
+ if (!name) {
+ DSP_LOGE("name is null\n");
+ return 0;
+ }
+
+ for (i = 0; i < func_num; i++)
+ if (!strncmp((char *)om_proc_table[i].om_proc_name, name, strlen((char *)om_proc_table[i].om_proc_name)))
+ return om_proc_table[i].func;
+
+ return 0;
+}
+
+void dsp_om_func_proc(char *om_str, unsigned int str_len)
+{
+ char * cmd_name = 0;
+ char * str_param = 0;
+ om_proc_func proc_func = 0;
+
+ cmd_name = dsp_om_split_str((char *)om_str, &str_param);
+
+ DSP_LOGI("cmd_name:%s\n", cmd_name);
+ proc_func = dsp_om_get_func_by_name(cmd_name);
+ if (proc_func)
+ proc_func(str_param);
+ else
+ DSP_LOGE("do not find func\n");
+}
+#endif
+
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/int_vector.S b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/int_vector.S
new file mode 100644
index 00000000..d579a55e
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/int_vector.S
@@ -0,0 +1,830 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+/******************************************************************************
+ int_vector.S
+******************************************************************************/
+#include <xtensa/coreasm.h>
+#include <xtensa/corebits.h>
+#include <xtensa/config/system.h>
+#include <xtensa/simcall.h>
+#include "arch_hifi330.h"
+
+// .data
+ .section .dram0.data, "aw"
+/* CP */
+ .type g_awVosCoprocSaOffset,@object
+ .align 16 /* minimize crossing cache boundaries */
+g_awVosCoprocSaOffset:
+ .word XT_CP0_SA, XT_CP1_SA, XT_CP2_SA, XT_CP3_SA
+ .word XT_CP4_SA, XT_CP5_SA, XT_CP6_SA, XT_CP7_SA
+
+/* CP n's CPENABLE bit. */
+ .type g_bVosCoprocMask,@object
+ .align 16,,8 /* try to keep it all in one cache line */
+g_bVosCoprocMask:
+ .byte 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
+
+/* Owner of CP (0 = unowned). */
+ .global g_awVosCoprocOwnerSa
+ .type g_awVosCoprocOwnerSa,@object
+ .align 16,,XCHAL_CP_MAX<<2 /* minimize crossing cache boundaries */
+g_awVosCoprocOwnerSa:
+ .space XCHAL_CP_MAX << 2,0
+
+ .global g_strVosPanicMessage
+ .align 4
+g_strVosPanicMessage:
+ .string "\npanic at addr 0x%08x.\n"
+
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OS_Panic
+ .type OS_Panic,@function
+ .align 4
+/*****************************************************************************
+ OS_Panic
+*****************************************************************************/
+OS_Panic:
+
+#ifdef ZOS_SIM
+ /*panic at addr*/
+ addi a4, a0, -3 /* point to call0 */
+ movi a3, g_strVosPanicMessage
+ movi a2, SYS_log_msg
+ simcall
+ movi a2, SYS_gdb_abort
+ simcall
+#else
+ /*low & med*/
+ rsil a2, XCHAL_EXCM_LEVEL /* disable all low & med ints */
+1: j 1b /* loop infinitely */
+#endif
+
+ .end literal_prefix
+
+ .begin literal_prefix .DebugExceptionVector
+ .section .DebugExceptionVector.text, "ax"
+ .global OS_DebugExceptionVector
+ .align 4
+/*****************************************************************************
+_DebugExceptionVector
+*****************************************************************************/
+OS_DebugExceptionVector:
+#ifdef ZOS_SIM
+ wsr a2, EXCSAVE+XCHAL_DEBUGLEVEL
+ movi a2, SYS_gdb_enter_sktloop
+ simcall
+#else
+ wsr a0, EXCSAVE+XCHAL_DEBUGLEVEL
+ call0 OS_Panic
+ rfi XCHAL_DEBUGLEVEL
+#endif
+
+ .end literal_prefix
+
+
+ .begin literal_prefix .DoubleExceptionVector
+ .section .DoubleExceptionVector.text, "ax"
+ .global OS_DoubleExceptionVector
+ .align 4
+/*****************************************************************************
+ OS_DoubleExceptionVector
+*****************************************************************************/
+OS_DoubleExceptionVector:
+ call0 OS_Panic /* does not return */
+ rfde /* make a0 point here not later */
+
+ .end literal_prefix
+
+
+ .begin literal_prefix .KernelExceptionVector
+ .section .KernelExceptionVector.text, "ax"
+ .global OS_KernelExceptionVector
+ .align 4
+/*****************************************************************************
+ _KernelExceptionVector
+*****************************************************************************/
+OS_KernelExceptionVector:
+ call0 OS_Panic /* does not return */
+ rfe /* make a0 point here not later */
+
+ .end literal_prefix
+
+
+ .begin literal_prefix .UserExceptionVector
+ .section .UserExceptionVector.text, "ax"
+ .global OS_UserExceptionVector
+ .type OS_UserExceptionVector,@function
+ .align 4
+/*****************************************************************************
+ _UserExceptionVector
+*****************************************************************************/
+OS_UserExceptionVector:
+ wsr a0, EXCSAVE_1 /* preserve a0 */
+ call0 OS_UserExc /* user exception handler */
+ /* never returns here - call0 is used as a jump (see note at top) */
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+
+ .align 4
+OS_CoProcessorExc:
+ s32i a5, sp, XT_STK_A5 /* save a5 */
+ addi a5, a0, -EXCCAUSE_CP0_DISABLED /* a0 = CP index */
+ bgei a5, XCHAL_CP_MAX, .L_xt_user_exc_not_coproc
+ call0 OS_CoProcessorException /* in window vectors section */
+ /* never returns here - call0 is used as a jump (see note at top) */
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .align 4
+OS_AllocExc:
+ call0 OS_AllocaException /* in window vectors section */
+ /* never returns here - call0 is used as a jump (see note at top) */
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .align 4
+OS_SyscallExc:
+ call0 OS_SyscallException
+ /* never returns here - call0 is used as a jump (see note at top) */
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OS_UserExc
+ .type OS_UserExc,@function
+ .align 4
+OS_UserExc:
+ rsr a0, EXCCAUSE
+ beqi a0, EXCCAUSE_ALLOCA, OS_AllocExc
+ beqi a0, EXCCAUSE_SYSCALL, OS_SyscallExc
+
+ mov a0, sp /* sp == a1 */
+ addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
+ s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
+ rsr a0, PS /* save interruptee's PS */
+ s32i a0, sp, XT_STK_PS
+ rsr a0, EPC_1 /* save interruptee's PC */
+ s32i a0, sp, XT_STK_PC
+ rsr a0, EXCSAVE_1 /* save interruptee's a0 */
+ s32i a0, sp, XT_STK_A0
+ movi a0, OS_UserExit /* save exit point for dispatch */
+ s32i a0, sp, XT_STK_EXIT
+
+ rsr a0, EXCCAUSE
+ bgeui a0, EXCCAUSE_CP0_DISABLED, OS_CoProcessorExc
+
+.L_xt_user_exc_not_coproc:
+
+
+ call0 XT_RTOS_INT_ENTER
+
+
+ movi a0, PS_INTLEVEL(XCHAL_EXCM_LEVEL) | PS_UM | PS_WOE
+ wsr a0, PS
+ rsync
+
+ rsr a2, EXCCAUSE
+ beqi a2, EXCCAUSE_LEVEL1INTERRUPT, .L_xt_user_int
+ mov a6,a2
+ mov a7,a1
+ /*User exception*/
+ call4 OS_UserexecHandler
+ j .L_xt_user_done
+
+.L_xt_user_int:
+ /* level 1 int */
+ rsr a2, INTENABLE
+ rsr a3, INTERRUPT
+ movi a4, XCHAL_INTLEVEL1_MASK
+ and a2, a2, a3
+ and a2, a2, a4
+ beqz a2, .L_int_done1
+
+ neg a3,a2
+ and a3,a3,a2
+ wsr a3,INTCLEAR
+
+ find_ls_one a2, a3
+ mov a6,a2
+ call4 OS_EnterIntHook
+
+ mov a6,a2
+ call4 OS_InterruptHandler
+
+ mov a6,a2
+ call4 OS_ExitIntHook
+ j .L_xt_user_int
+
+.L_int_done1:
+
+
+.L_xt_user_done:
+ call0 XT_RTOS_INT_EXIT
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OS_UserExit
+ .type OS_UserExit,@function
+ .align 4
+OS_UserExit:
+ l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
+ wsr a0, PS
+ l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
+ wsr a0, EPC_1
+ l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
+ l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
+ rsync /* ensure PS and EPC written */
+ rfe /* PS.EXCM is cleared */
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .type OS_SyscallException,@function
+ .align 4
+/*****************************************************************************
+ OS_SyscallException
+*****************************************************************************/
+OS_SyscallException:
+ addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
+ s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */
+ s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */
+ call0 OS_ContextSave
+
+
+ /*
+ 2)update PC*/
+ rsr a2, EPC_1
+ addi a3, a2, 3
+
+ rsr a0, LEND
+ bne a3, a0, 1f
+ rsr a0, LCOUNT
+ beqz a0, 1f
+ addi a0, a0, -1
+ rsr a3, LBEG
+ wsr a0, LCOUNT
+
+1: wsr a3, EPC_1
+
+ /* Restore context,exception */
+ call0 OS_ContextRestore
+ addi sp, sp, XT_STK_FRMSZ
+
+ movi a0, -1
+ movnez a2, a0, a2 /* return -1 if not syscall 0 */
+ rsr a0, EXCSAVE_1
+ rfe
+
+
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .type OS_CoProcessorException,@function
+ .align 4
+/*****************************************************************************
+ OS_CoProcessorException
+*****************************************************************************/
+OS_CoProcessorException: /* a5 = CP index */
+
+ s32i a2, sp, XT_STK_A2
+ s32i a3, sp, XT_STK_A3
+ s32i a4, sp, XT_STK_A4
+ s32i a15, sp, XT_STK_A15
+
+
+ /* co-processor old owner new owner. */
+ call0 XT_RTOS_CP_STATE /* a15 = new owner's save area */
+ beqz a15, .L_xt_coproc_invalid /* not in a thread (invalid) */
+
+ mov a0, a5 /* a0 = CP index */
+ movi a3, g_awVosCoprocOwnerSa
+ addx4 a3, a0, a3 /* a3 = &g_awVosCoprocOwnerSa[CP] */
+ l32i a2, a3, 0 /* a2 = old owner's save area */
+
+ /* Enable the co-processor's bit in CPENABLE. */
+ movi a4, g_bVosCoprocMask
+ rsr a5, CPENABLE /* a5 = CPENABLE */
+ add a4, a4, a0
+ l8ui a4, a4, 0 /* a4 = bitmask from CP index */
+ or a5, a5, a4 /* a5 = CPENABLE + CP */
+ wsr a5, CPENABLE
+
+
+ beq a15, a2, .L_xt_coproc_done /* new owner == old, we're done */
+
+ s32i a15, a3, 0 /* g_awVosCoprocOwnerSa[CP] = new */
+
+ l8ui a5, a15, XT_CPSTORED /* a5 = new owner's old CPSTORED */
+ neg a3, a4
+ addi a3, a3, -1 /* a3 = ~a4 (bitmask for CP) */
+ and a3, a5, a3 /* clr CP in new owner's CPSTORED */
+ s8i a3, a15, XT_CPSTORED /* update new owner's CPSTORED */
+
+ /* Adjust new owner's save area pointers to area for CP n. */
+ movi a3, g_awVosCoprocSaOffset
+ and a5, a5, a4 /* a5 = new owner's CP is stored */
+ addx4 a3, a0, a3 /* a3 = &OS_CoprocSaOffset[CP] */
+ l32i a3, a3, 0 /* a3 = XT_CP[CP]_SA */
+ add a15, a15, a3 /* a15 = new owner's area for CP */
+ moveqz a15, a5, a5 /* a15 = 0 if state not stored */
+
+ rsync /* ensure wsr.CPENABLE is complete */
+ beqz a2, .L_xt_coproc_new /* no old owner to save */
+
+ /* If old owner still needs CP, clear CP in CPENABLE and set in CPSTORED. */
+ l8ui a5, a2, XT_CPENABLE /* a5 = old owner's CPENABLE */
+ and a4, a5, a4 /* a4 = CP in old owner CPENABLE */
+ beqz a4, .L_xt_coproc_new /* discard old owner's CP state */
+
+ sub a5, a5, a4 /* clr CP in old owner's CPENABLE */
+ s8i a5, a2, XT_CPENABLE /* update old owner's CPENABLE */
+ l8ui a5, a2, XT_CPSTORED /* a5 = old owner's CPSTORED */
+ or a5, a5, a4 /* set CP in old owner's CPSTORED */
+ s8i a5, a2, XT_CPSTORED /* update old owner's CPSTORED */
+
+ /* Save co-processor state of old owner. */
+.Ln_xt_coproc_old:
+ add a2, a2, a3 /* a2 = old owner's area for CP */
+ mov a3, a0 /* a3 = CP index */
+ /*
+ The config-specific HAL macro invoked below destroys a2-5, preserves a0-1.
+ It is theoretically possible for Xtensa processor designers to write TIE
+ that causes more address registers to be affected, but it is generally
+ unlikely. If that ever happens, more registers needs to be saved/restored
+ around this macro invocation, and the value in a15 needs to be recomputed.
+ */
+ xchal_cpi_store_funcbody
+
+ /* Restore co-processor state of new owner. */
+.L_xt_coproc_new:
+ beqz a15, .L_xt_coproc_done /* no valid state to restore */
+ mov a2, a15 /* a2 = new owner's area for CP */
+ mov a3, a0 /* a3 = CP index */
+
+ xchal_cpi_load_funcbody
+
+
+.L_xt_coproc_done:
+ l32i a15, sp, XT_STK_A15
+ l32i a5, sp, XT_STK_A5
+ l32i a4, sp, XT_STK_A4
+ l32i a3, sp, XT_STK_A3
+ l32i a2, sp, XT_STK_A2
+ call0 OS_UserExit
+
+.L_xt_coproc_invalid:
+ call0 OS_Panic /* not in a thread (invalid) */
+ .end literal_prefix
+
+ .begin literal_prefix .Level2InterruptVector
+ .section .Level2InterruptVector.text, "ax"
+ .global OS_Level2Vector
+ .type OS_Level2Vector,@function
+ .align 4
+/*****************************************************************************
+ _Level2Vector
+*****************************************************************************/
+OS_Level2Vector:
+ wsr a0, EXCSAVE_2 /* preserve a0 */
+ call0 OS_Medint2 /* load interrupt handler */
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .extern OS_InterruptHandler
+ .type OS_Medint2,@function
+ .align 4
+OS_Medint2:
+
+#movi a1, 0xdeadbeef
+ movi a1, 0xe8075000
+ movi a2, 0xe8075e30 /*HIFI_RESERVE1_LOCATION*/
+ s32i a1, a2, 0
+
+ mov a0, sp /* sp == a1 */
+ addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
+ s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
+ rsr a0, EPS_2 /* save interruptee's PS */
+ s32i a0, sp, XT_STK_PS
+ rsr a0, EPC_2 /* save interruptee's PC */
+ s32i a0, sp, XT_STK_PC
+ rsr a0, EXCSAVE_2 /* save interruptee's a0 */
+ s32i a0, sp, XT_STK_A0
+ movi a0, OS_Medint2Exit /* save exit point for dispatch */
+ s32i a0, sp, XT_STK_EXIT
+
+ call0 XT_RTOS_INT_ENTER
+
+ movi a0, PS_INTLEVEL(2) | PS_UM | PS_WOE
+ wsr a0, PS
+ rsync
+
+
+.L_ProcAllInt2:
+ rsr a2, INTENABLE
+ rsr a3, INTERRUPT
+ movi a4, XCHAL_INTLEVEL2_MASK
+ and a2, a2, a3
+ and a2, a2, a4
+ beqz a2, .L_int_done2
+
+ neg a3,a2
+ and a3,a3,a2
+ wsr a3,INTCLEAR
+
+ find_ls_one a2, a3
+ mov a6,a2
+ call4 OS_EnterIntHook
+
+ mov a6,a2
+ call4 OS_InterruptHandler
+
+ mov a6,a2
+ call4 OS_ExitIntHook
+ j .L_ProcAllInt2
+
+.L_int_done2:
+ call0 XT_RTOS_INT_EXIT
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OS_Medint2Exit
+ .type OS_Medint2Exit,@function
+ .align 4
+OS_Medint2Exit:
+ /* Restore only level-specific regs (the rest were already restored) */
+ l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
+ wsr a0, EPS_2
+ l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
+ wsr a0, EPC_2
+ l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
+ l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
+ rsync /* ensure EPS and EPC written */
+ rfi 2
+ .end literal_prefix
+
+
+ .begin literal_prefix .Level3InterruptVector
+ .section .Level3InterruptVector.text, "ax"
+ .global OS_Level3Vector
+ .type OS_Level3Vector,@function
+ .align 4
+/*****************************************************************************
+ _Level3Vector
+*****************************************************************************/
+OS_Level3Vector:
+ wsr a0, EXCSAVE_3 /* preserve a0 */
+ call0 OS_MedInt3 /* load interrupt handler */
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .extern OS_InterruptHandler
+ .type OS_MedInt3,@function
+ .align 4
+OS_MedInt3:
+
+ mov a0, sp /* sp == a1 */
+ addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
+ s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
+ rsr a0, EPS_3 /* save interruptee's PS */
+ s32i a0, sp, XT_STK_PS
+ rsr a0, EPC_3 /* save interruptee's PC */
+ s32i a0, sp, XT_STK_PC
+ rsr a0, EXCSAVE_3 /* save interruptee's a0 */
+ s32i a0, sp, XT_STK_A0
+ movi a0, OS_Medint3Exit /* save exit point for dispatch */
+ s32i a0, sp, XT_STK_EXIT
+
+ call0 XT_RTOS_INT_ENTER
+
+ movi a0, PS_INTLEVEL(3) | PS_UM | PS_WOE
+ wsr a0, PS
+ rsync
+
+
+.L_ProcAllInt3:
+ rsr a2, INTENABLE
+ rsr a3, INTERRUPT
+ movi a4, XCHAL_INTLEVEL3_MASK
+ and a2, a2, a3
+ and a2, a2, a4
+ beqz a2, .L_int_done3
+
+ neg a3,a2
+ and a3,a3,a2
+ wsr a3,INTCLEAR
+
+ find_ls_one a2, a3
+ mov a6,a2
+ call4 OS_EnterIntHook
+
+ mov a6,a2
+ call4 OS_InterruptHandler
+
+ mov a6,a2
+ call4 OS_ExitIntHook
+ j .L_ProcAllInt3
+
+.L_int_done3:
+
+ call0 XT_RTOS_INT_EXIT
+
+ .end literal_prefix
+
+ .begin literal_prefix .iram0
+ .section .iram0.text, "ax"
+ .global OS_Medint3Exit
+ .type OS_Medint3Exit,@function
+ .align 4
+OS_Medint3Exit:
+ /* Restore only level-specific regs (the rest were already restored) */
+ l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
+ wsr a0, EPS_3
+ l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
+ wsr a0, EPC_3
+ l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
+ l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
+ rsync /* ensure EPS and EPC written */
+ rfi 3
+ .end literal_prefix
+
+
+ .begin literal_prefix .NMIExceptionVector
+ .section .NMIExceptionVector.text, "ax"
+ .global OS_NMIExceptionVector
+ .align 8
+/*****************************************************************************
+ OS_NMIExceptionVector
+*****************************************************************************/
+OS_NMIExceptionVector:
+ /*wsr a3, 213
+ wsr a4, 214*/
+
+ /*movi a3, 0x0
+ movi a4, 0xf711a510
+ s32i a3, a4, 0*/
+
+ /*rsr a3, 213
+ rsr a4, 214*/
+
+ movi a0, PS_INTLEVEL(3) | PS_UM | PS_WOE
+ wsr a0, PS
+ rsync
+ rsr a2, EXCCAUSE
+ mov a6,a2
+ mov a7,a1
+ call4 OS_NmiHook
+
+ rfi XCHAL_NMILEVEL
+
+ .end literal_prefix
+
+ .section .WindowVectors.text, "ax"
+
+/*
+--------------------------------------------------------------------------------
+Window Overflow Exception for Call4.
+
+Invoked if a call[i] referenced a register (a4-a15)
+that contains data from ancestor call[j];
+call[j] had done a call4 to call[j+1].
+On entry here:
+ window rotated to call[j] start point;
+ a0-a3 are registers to be saved;
+ a4-a15 must be preserved;
+ a5 is call[j+1]'s stack pointer.
+--------------------------------------------------------------------------------
+*/
+
+ .org 0x0
+ .global _WindowOverflow4
+_WindowOverflow4:
+
+ s32e a0, a5, -16 /* save a0 to call[j+1]'s stack frame */
+ s32e a1, a5, -12 /* save a1 to call[j+1]'s stack frame */
+ s32e a2, a5, -8 /* save a2 to call[j+1]'s stack frame */
+ s32e a3, a5, -4 /* save a3 to call[j+1]'s stack frame */
+ rfwo /* rotates back to call[i] position */
+
+/*
+--------------------------------------------------------------------------------
+Window Underflow Exception for Call4
+
+Invoked by RETW returning from call[i+1] to call[i]
+where call[i]'s registers must be reloaded (not live in ARs);
+where call[i] had done a call4 to call[i+1].
+On entry here:
+ window rotated to call[i] start point;
+ a0-a3 are undefined, must be reloaded with call[i].reg[0..3];
+ a4-a15 must be preserved (they are call[i+1].reg[0..11]);
+ a5 is call[i+1]'s stack pointer.
+--------------------------------------------------------------------------------
+*/
+
+ .org 0x40
+ .global _WindowUnderflow4
+_WindowUnderflow4:
+
+ l32e a0, a5, -16 /* restore a0 from call[i+1]'s stack frame */
+ l32e a1, a5, -12 /* restore a1 from call[i+1]'s stack frame */
+ l32e a2, a5, -8 /* restore a2 from call[i+1]'s stack frame */
+ l32e a3, a5, -4 /* restore a3 from call[i+1]'s stack frame */
+ rfwu
+
+ .global OS_AllocaException
+ .align 4
+/*****************************************************************************
+ OS_AllocaException
+*****************************************************************************/
+OS_AllocaException:
+
+ rsr a0, WINDOWBASE /* grab WINDOWBASE before rotw changes it */
+ rotw -1 /* WINDOWBASE goes to a4, new a0-a3 are scratch */
+ rsr a2, PS
+ extui a3, a2, XCHAL_PS_OWB_SHIFT, XCHAL_PS_OWB_BITS
+ xor a3, a3, a4 /* bits changed from old to current windowbase */
+ rsr a4, EXCSAVE_1 /* restore original a0 (now in a4) */
+ slli a3, a3, XCHAL_PS_OWB_SHIFT
+ xor a2, a2, a3 /* flip changed bits in old window base */
+ wsr a2, PS /* update PS.OWB to new window base */
+ rsync
+
+ _bbci.l a4, 31, _WindowUnderflow4
+ rotw -1 /* original a0 goes to a8 */
+ _bbci.l a8, 30, _WindowUnderflow8
+ rotw -1
+ j _WindowUnderflow12
+
+
+
+/*
+--------------------------------------------------------------------------------
+Window Overflow Exception for Call8
+
+Invoked if a call[i] referenced a register (a4-a15)
+that contains data from ancestor call[j];
+call[j] had done a call8 to call[j+1].
+On entry here:
+ window rotated to call[j] start point;
+ a0-a7 are registers to be saved;
+ a8-a15 must be preserved;
+ a9 is call[j+1]'s stack pointer.
+--------------------------------------------------------------------------------
+*/
+
+ .org 0x80
+ .global _WindowOverflow8
+_WindowOverflow8:
+
+ s32e a0, a9, -16 /* save a0 to call[j+1]'s stack frame */
+ l32e a0, a1, -12 /* a0 <- call[j-1]'s sp
+ (used to find end of call[j]'s frame) */
+ s32e a1, a9, -12 /* save a1 to call[j+1]'s stack frame */
+ s32e a2, a9, -8 /* save a2 to call[j+1]'s stack frame */
+ s32e a3, a9, -4 /* save a3 to call[j+1]'s stack frame */
+ s32e a4, a0, -32 /* save a4 to call[j]'s stack frame */
+ s32e a5, a0, -28 /* save a5 to call[j]'s stack frame */
+ s32e a6, a0, -24 /* save a6 to call[j]'s stack frame */
+ s32e a7, a0, -20 /* save a7 to call[j]'s stack frame */
+ rfwo /* rotates back to call[i] position */
+
+/*
+--------------------------------------------------------------------------------
+Window Underflow Exception for Call8
+
+Invoked by RETW returning from call[i+1] to call[i]
+where call[i]'s registers must be reloaded (not live in ARs);
+where call[i] had done a call8 to call[i+1].
+On entry here:
+ window rotated to call[i] start point;
+ a0-a7 are undefined, must be reloaded with call[i].reg[0..7];
+ a8-a15 must be preserved (they are call[i+1].reg[0..7]);
+ a9 is call[i+1]'s stack pointer.
+--------------------------------------------------------------------------------
+*/
+
+ .org 0xC0
+ .global _WindowUnderflow8
+_WindowUnderflow8:
+
+ l32e a0, a9, -16 /* restore a0 from call[i+1]'s stack frame */
+ l32e a1, a9, -12 /* restore a1 from call[i+1]'s stack frame */
+ l32e a2, a9, -8 /* restore a2 from call[i+1]'s stack frame */
+ l32e a7, a1, -12 /* a7 <- call[i-1]'s sp
+ (used to find end of call[i]'s frame) */
+ l32e a3, a9, -4 /* restore a3 from call[i+1]'s stack frame */
+ l32e a4, a7, -32 /* restore a4 from call[i]'s stack frame */
+ l32e a5, a7, -28 /* restore a5 from call[i]'s stack frame */
+ l32e a6, a7, -24 /* restore a6 from call[i]'s stack frame */
+ l32e a7, a7, -20 /* restore a7 from call[i]'s stack frame */
+ rfwu
+
+/*
+--------------------------------------------------------------------------------
+Window Overflow Exception for Call12
+
+Invoked if a call[i] referenced a register (a4-a15)
+that contains data from ancestor call[j];
+call[j] had done a call12 to call[j+1].
+On entry here:
+ window rotated to call[j] start point;
+ a0-a11 are registers to be saved;
+ a12-a15 must be preserved;
+ a13 is call[j+1]'s stack pointer.
+--------------------------------------------------------------------------------
+*/
+
+ .org 0x100
+ .global _WindowOverflow12
+_WindowOverflow12:
+
+ s32e a0, a13, -16 /* save a0 to call[j+1]'s stack frame */
+ l32e a0, a1, -12 /* a0 <- call[j-1]'s sp
+ (used to find end of call[j]'s frame) */
+ s32e a1, a13, -12 /* save a1 to call[j+1]'s stack frame */
+ s32e a2, a13, -8 /* save a2 to call[j+1]'s stack frame */
+ s32e a3, a13, -4 /* save a3 to call[j+1]'s stack frame */
+ s32e a4, a0, -48 /* save a4 to end of call[j]'s stack frame */
+ s32e a5, a0, -44 /* save a5 to end of call[j]'s stack frame */
+ s32e a6, a0, -40 /* save a6 to end of call[j]'s stack frame */
+ s32e a7, a0, -36 /* save a7 to end of call[j]'s stack frame */
+ s32e a8, a0, -32 /* save a8 to end of call[j]'s stack frame */
+ s32e a9, a0, -28 /* save a9 to end of call[j]'s stack frame */
+ s32e a10, a0, -24 /* save a10 to end of call[j]'s stack frame */
+ s32e a11, a0, -20 /* save a11 to end of call[j]'s stack frame */
+ rfwo /* rotates back to call[i] position */
+
+/*
+--------------------------------------------------------------------------------
+Window Underflow Exception for Call12
+
+Invoked by RETW returning from call[i+1] to call[i]
+where call[i]'s registers must be reloaded (not live in ARs);
+where call[i] had done a call12 to call[i+1].
+On entry here:
+ window rotated to call[i] start point;
+ a0-a11 are undefined, must be reloaded with call[i].reg[0..11];
+ a12-a15 must be preserved (they are call[i+1].reg[0..3]);
+ a13 is call[i+1]'s stack pointer.
+--------------------------------------------------------------------------------
+*/
+
+ .org 0x140
+ .global _WindowUnderflow12
+_WindowUnderflow12:
+
+ l32e a0, a13, -16 /* restore a0 from call[i+1]'s stack frame */
+ l32e a1, a13, -12 /* restore a1 from call[i+1]'s stack frame */
+ l32e a2, a13, -8 /* restore a2 from call[i+1]'s stack frame */
+ l32e a11, a1, -12 /* a11 <- call[i-1]'s sp
+ (used to find end of call[i]'s frame) */
+ l32e a3, a13, -4 /* restore a3 from call[i+1]'s stack frame */
+ l32e a4, a11, -48 /* restore a4 from end of call[i]'s stack frame */
+ l32e a5, a11, -44 /* restore a5 from end of call[i]'s stack frame */
+ l32e a6, a11, -40 /* restore a6 from end of call[i]'s stack frame */
+ l32e a7, a11, -36 /* restore a7 from end of call[i]'s stack frame */
+ l32e a8, a11, -32 /* restore a8 from end of call[i]'s stack frame */
+ l32e a9, a11, -28 /* restore a9 from end of call[i]'s stack frame */
+ l32e a10, a11, -24 /* restore a10 from end of call[i]'s stack frame */
+ l32e a11, a11, -20 /* restore a11 from end of call[i]'s stack frame */
+ rfwu
+
+
+
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S
new file mode 100644
index 00000000..b2cb2688
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S
@@ -0,0 +1,460 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+/******************************************************************************
+ reset.S
+ reset vector for BALONGV7R1 architechure,Any problem pls refer
+ to the Xtensa Microprocessor Programmer's Guide.
+******************************************************************************/
+
+#include <xtensa/coreasm.h>
+#include <xtensa/simcall.h>
+#include "reset.h"
+
+ .begin literal_prefix .ResetVector
+ .section .ResetVector.text, "ax"
+ .global _ResetVector
+ .align 4
+
+_ResetVector:
+ j _Reset
+
+ .end literal_prefix
+
+ /*****************************************************************************
+ Reset
+ *****************************************************************************/
+ .begin literal_prefix .Reset
+ .section .Reset.text, "ax"
+ .global _Reset
+ .align 4
+
+_Reset:
+ /* clear all of interrupts*/
+ movi a0, 0
+ wsr a0, INTENABLE
+
+ wsr a0, IBREAKA_0
+ wsr a0, IBREAKA_1
+ wsr a0, DBREAKA_0
+ wsr a0, DBREAKA_1
+ wsr a0, DBREAKC_0
+ wsr a0, DBREAKC_1
+ wsr a0, IBREAKENABLE
+
+ /* ICOUNT,ICOUNTLEVEL,ICOUNTexception clear ICOUNT and ICOUNTLEVEL*/
+ wsr a0, ICOUNT
+ wsr a0, ICOUNTLEVEL
+ isync
+
+ /*debug disable XCHAL_DEBUGLEVEL*/
+ rsil a1, XCHAL_DEBUGLEVEL - 1
+
+// write windowbase and windowstart, then do rsync.
+// reload a0 with 0, because registers may have moved after
+// writing windowbase/windowstart.
+ wsr a0, CCOUNT
+ /* init register windows*/
+ wsr a0, WINDOWBASE
+ rsync
+ movi a1, 1
+ wsr a1, WINDOWSTART
+
+ ssai 0
+
+ /*Level-1 init EXCSAVE_1 level-1 interrupt*/
+ wsr a0, EXCSAVE_1
+ wsr a0, EPC_1
+ wsr a0, EXCCAUSE
+
+ /*Level-2 init EXCSAVE_1 level-2 interrupt*/
+ wsr a0, EPC_2
+ wsr a0, EPS_2
+ wsr a0, EXCSAVE_2
+
+ /*Level-3 init EXCSAVE_1 level-3 interrupt*/
+ wsr a0, EPC_3
+ wsr a0, EPS_3
+ wsr a0, EXCSAVE_3
+
+ /*Level-4 init EXCSAVE_1 level-4 interrupt*/
+ wsr a0, EPC_4
+ wsr a0, EPS_4
+ wsr a0, EXCSAVE_4
+
+ /*Level-5(DEBUG) init EXCSAVE_1 level-5 interrupt*/
+ wsr a0, EPC_5
+ wsr a0, EPS_5
+ wsr a0, EXCSAVE_5
+
+ /*NMI init EXCSAVE_1 level-6(NMI) interrupt */
+ wsr a0, EPC_6
+ wsr a0, EPS_6
+ wsr a0, EXCSAVE_6
+
+
+ /*0/1/2 init timer 0&1 */
+ wsr a0, CCOMPARE_0
+ wsr a0, CCOMPARE_1
+ //wsr a0, CCOMPARE_2 //hifi3 CCOMPARE_0 CCOMPARE_1
+
+ /* clear all of */
+ movi a2, XCHAL_INTTYPE_MASK_EXTERN_EDGE | XCHAL_INTTYPE_MASK_SOFTWARE
+ wsr a2, INTCLEAR
+
+ wsr a0, BR
+
+ /* disable coprocessor */
+ /*wsr a0, CPENABLE*/
+
+ movi a2, XCHAL_DEBUGLEVEL - 1
+ wsr a2, PS
+ rsync
+
+
+ /*icache init icache */
+#if (XCHAL_ICACHE_SIZE != 0)
+ #if (XCHAL_ICACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_ICACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_ICACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_ICACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+ /*icache unlock icache */
+ #if (XCHAL_ICACHE_LINESIZE == 128)
+ movi a3, 0
+ loop a2, .L0
+ iiu a3, 0
+ iiu a3, XCHAL_ICACHE_LINESIZE
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*2
+
+ iiu a3, 0
+ iiu a3, XCHAL_ICACHE_LINESIZE
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*2
+.L0:
+
+ #else
+ movi a3, 0
+ loop a2, .L0
+ iiu a3, 0
+ iiu a3, XCHAL_ICACHE_LINESIZE
+ iiu a3, XCHAL_ICACHE_LINESIZE*2
+ iiu a3, XCHAL_ICACHE_LINESIZE*3
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*4
+.L0:
+ #endif
+
+
+ #if (XCHAL_ICACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_ICACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_ICACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_ICACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+ /*icache disable icache */
+ movi a3, 0
+ loop a2, .L1
+ iii a3, 0
+ iii a3, XCHAL_ICACHE_LINESIZE
+ iii a3, XCHAL_ICACHE_LINESIZE*2
+ iii a3, XCHAL_ICACHE_LINESIZE*3
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*4
+.L1:
+ isync
+#endif
+
+
+
+
+ /*dcache init dcache */
+#if (XCHAL_DCACHE_SIZE != 0)
+ #if (XCHAL_DCACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_DCACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_DCACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_DCACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+ /*dcache unlock dcache */
+ #if (XCHAL_DCACHE_LINESIZE == 128)
+ movi a3, 0
+ loop a2, .L2
+ diu a3, 0
+ diu a3, XCHAL_DCACHE_LINESIZE
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*2
+
+ diu a3, 0
+ diu a3, XCHAL_DCACHE_LINESIZE
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*2
+.L2:
+
+ #else
+ movi a3, 0
+ loop a2, .L2
+ diu a3, 0
+ diu a3, XCHAL_DCACHE_LINESIZE
+ diu a3, XCHAL_DCACHE_LINESIZE*2
+ diu a3, XCHAL_DCACHE_LINESIZE*3
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*4
+.L2:
+ #endif
+ #if (XCHAL_DCACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_DCACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_DCACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_DCACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+
+ /*dcache disable dcache */
+ movi a3, 0
+ loop a2, .L3
+ dii a3, 0
+ dii a3, XCHAL_DCACHE_LINESIZE
+ dii a3, XCHAL_DCACHE_LINESIZE*2
+ dii a3, XCHAL_DCACHE_LINESIZE*3
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*4
+.L3:
+ dsync
+#endif
+
+ /*
+ 0x00000000-0x1fffffff : caches off(bypass)
+ 0x20000000-0x3fffffff : caches off(bypass)
+ 0x40000000-0x5fffffff : caches off(bypass)
+ 0x60000000-0x7fffffff : caches off(bypass)
+ 0x80000000-0x9fffffff : caches off(bypass)
+ 0xa0000000-0xbfffffff : caches off(bypass)
+ 0xc0000000-0xdfffffff : caches on,0x00000000-0x1fffffff
+ 0xe0000000-0xffffffff : caches off(bypass),:0xe0000000~0xefffffff 0x20000000~0x2fffffff
+ */
+ /* config the memory access right */
+ movi a3, 0x00000000 /*0x00000000-0x1fffffff*/
+ set_access_mode PIF_BYPASS /*can not access*/
+
+ movi a3, 0x20000000 /*0x20000000-0x3fffffff*/
+ set_access_mode PIF_BYPASS
+
+ movi a3, 0x40000000 /*0x40000000-0x5fffffff*/
+#if (XCHAL_DCACHE_LINESIZE == 128)
+ set_access_mode PIF_BYPASS
+#else
+ set_access_mode PIF_BYPASS
+#endif
+
+ movi a3, 0x60000000 /*0x60000000-0x7fffffff*/
+ set_access_mode PIF_BYPASS
+
+ movi a3, 0x80000000 /*0x80000000-0x9fffffff*/
+ #if (XCHAL_DCACHE_LINESIZE == 128)
+ set_access_mode PIF_BYPASS
+ #else
+ set_access_mode PIF_BYPASS
+ #endif
+
+ movi a3, 0xa0000000 /*0xa0000000-0xbfffffff*/
+ set_access_mode PIF_BYPASS
+
+ movi a3, 0xc0000000 /*0xc0000000-0xdfffffff*/
+ set_access_mode PIF_CACHED_WBA /*PIF_CACHED*/
+
+ movi a3, 0xe0000000 /*0xe0000000-0xffffffff*/
+ set_access_mode PIF_BYPASS
+
+ /* 0x40000000 0xe0000000, 0x50000000 0xf0000000,*/
+ /*movi a2, 0x40000000 //vpn
+ movi a3, 0xe0000000 //ppn
+ movi a5, 0xE0000000 // tlb mask, upper 3 bits
+ and a4, a3, a5 // upper 3 bits of PPN area
+ and a7, a2, a5 // upper 3 bits of VPN area
+
+ ritlb1 a5, a7 // get current PPN+AM of segment for I
+ rdtlb1 a6, a7 // get current PPN+AM of segment for D
+ extui a5, a5, 0, 4 // keep only AM for I
+ extui a6, a6, 0, 4 // keep only AM for D
+ add a2, a4, a5 // combine new PPN with orig AM for I
+ add a3, a4, a6 // combine new PPN with orig AM for D
+ witlb a2, a7 // write new tlb mapping for I
+ wdtlb a3, a7 // write new tlb mapping for D
+ */
+ isync
+ dsync
+
+ /*
+ prepare the environment of run C code
+ */
+ movi sp, __stack
+
+ movi a2, PS_WOE_MASK | PS_PROGSTACK_MASK
+ wsr a2, PS
+ rsync
+
+ movi a8, _bss_start
+ movi a10, _bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone:
+
+ movi a8, _ulpp_bss_start
+ movi a10, _ulpp_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone1
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone1:
+
+#ifdef HIFI_DTS_V3
+ movi a8, _dtsv3_bss_start
+ movi a10, _dtsv3_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone2
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone2:
+#endif
+
+#ifdef HIFI_DTS_V4
+ movi a8, _dtsv4_bss_start
+ movi a10, _dtsv4_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone3
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone3:
+#endif
+
+#ifdef HIFI_VLP
+ movi a8, _efr_fr_hr_vlpd_bss_start
+ movi a10, _efr_fr_hr_vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone4
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone4:
+
+ movi a8, _amr_vlpd_bss_start
+ movi a10, _amr_vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone5
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone5:
+
+ movi a8, _vlpd_bss_start
+ movi a10, _vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone6
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone6:
+
+ movi a8, _amrwb_vlpd_bss_start
+ movi a10, _amrwb_vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone7
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone7:
+#endif
+
+callmain:
+
+// Do NOT modify a1 here, it is the stack pointer.
+// Use another register instead (a3?)
+// Not sure why the NOPs are present.
+#movi a1, 0xdeadbeef
+ movi a1, 0xe8073000
+ movi a2, 0xe8075e10 /*HIFI_RESERVE1_LOCATION*/
+ s32i a1, a2, 0
+
+ movi a0, 0
+ movi a6, 0 /* clear argc*/
+ movi a7, 0 /* clear argv*/
+ movi a8, 0 /* clear envp*/
+ movi a4, main
+ nop
+ nop
+ callx4 a4
+
+reset_exit:
+ movi a2, SYS_exit
+// Where does it go from here ? execution will fall through into
+// whatever happens to follow. Either halt here or jump to some
+// specific code.
+
+ .end literal_prefix
+
+#ifdef VOS_VENUS_TEST_STUB
+ .text
+ .global sim_call
+ .type sim_call,@function
+ .align 4
+sim_call:
+ entry sp, 64
+ addi a4, a3,-3
+ movi a3, g_auwVosTestMessageBuf
+ movi a2, SYS_log_msg
+ simcall
+ retw
+
+#endif
+
+
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c b/hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c
new file mode 100644
index 00000000..f9178004
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c
@@ -0,0 +1,189 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xf-main.c
+ *
+ * DSP processing framework main file
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG MAIN
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf.h"
+#ifndef XAF_ENABLE_NON_HIKEY
+volatile int waitstate;
+#endif
+
+#ifdef XAF_PROFILE_DSP
+/* ... MCPS/profile info */
+#include "xa_profiler.h"
+#endif
+
+/*******************************************************************************
+ * Global data definition
+ ******************************************************************************/
+/* ...per-core execution data */
+xf_core_data_t xf_core_data[XF_CFG_CORES_NUM];
+
+/* ...AP-DSP shared memory pool */
+xf_mm_pool_t xf_ap_shmem_pool;
+
+/* ...per-core local memory pool */
+xf_mm_pool_t xf_dsp_local_pool[XF_CFG_CORES_NUM];
+
+#if XF_CFG_CORES_NUM > 1
+/* ...DSP cluster shared memory pool */
+xf_mm_pool_t xf_dsp_shmem_pool;
+#endif
+
+/* ...per-core shared memory with read-only access */
+__xf_core_ro_data_t xf_core_ro_data[XF_CFG_CORES_NUM];
+
+/* ...per-core shared memory with read-write access */
+__xf_core_rw_data_t xf_core_rw_data[XF_CFG_CORES_NUM];
+
+/*******************************************************************************
+ * Memory buffers - take them from linker file somehow - tbd
+ ******************************************************************************/
+
+/* ...unallocated memory region - AP-DSP shared memory buffer - export from linker somehow */
+//u8 xf_ap_shmem_buffer[XF_CFG_REMOTE_IPC_POOL_SIZE] __xf_shmem__;
+
+#if XF_CFG_CORES_NUM > 1
+/* ...unallocated DSP shared memory buffer */
+u8 xf_dsp_shmem_buffer[XF_CFG_LOCAL_IPC_POOL_SIZE] __xf_shmem__;
+#endif
+
+/* ...unallocated per-core local memory (in 32-byte chunks) */
+#ifdef XAF_ENABLE_NON_HIKEY
+u8 xf_dsp_local_buffer[XF_CFG_CORES_NUM][XF_CFG_LOCAL_POOL_SIZE] __xf_mm__;
+#else
+u8 xf_dsp_local_buffer[XF_CFG_CORES_NUM][XF_CFG_LOCAL_POOL_SIZE];
+//u8 g_tmp[2];
+#endif
+
+#ifdef XAF_PROFILE_DSP
+xa_profiler prof;
+#endif
+
+/*******************************************************************************
+ * Timer interrupt - tbd
+ ******************************************************************************/
+
+/*******************************************************************************
+ * IPC layer initialization
+ ******************************************************************************/
+
+/* ...system-specific IPC layer initialization */
+int xf_ipc_init(u32 core)
+{
+ xf_core_data_t *cd = XF_CORE_DATA(core);
+ xf_shmem_data_t *shmem = (xf_shmem_data_t *)XF_CFG_SHMEM_ADDRESS(core);
+
+ /* ...initialize pointer to shared memory */
+ cd->shmem = (xf_shmem_handle_t *)shmem;
+ shmem->buffer = (uint8_t *) HIFI_MUSIC_DATA_LOCATION;
+ /* ...global memory pool initialization */
+#ifdef XAF_ENABLE_NON_HIKEY
+ XF_CHK_API(xf_mm_init(&cd->shared_pool, shmem->buffer, XF_CFG_REMOTE_IPC_POOL_SIZE));
+#else
+ XF_CHK_API(xf_mm_init(&cd->shared_pool, (void *) HIFI_MUSIC_DATA_LOCATION, XF_CFG_REMOTE_IPC_POOL_SIZE));
+#endif
+ return 0;
+}
+
+/*******************************************************************************
+ * Core executive loop
+ ******************************************************************************/
+
+static void xf_core_loop(u32 core)
+{
+ /* ...initialize internal core structures */
+ xf_core_init(core);
+
+#ifdef XAF_PROFILE_DSP
+/* Profiler initialization */
+ INIT_XA_PROFILER(prof,"DSP core");
+#endif
+
+ for(;;)
+ {
+ /* ...wait in a low-power mode until event is triggered */
+ xf_ipi_wait(core);
+
+ /* ...service core event */
+ xf_core_service(core);
+ }
+}
+
+/*******************************************************************************
+ * Global entry point
+ ******************************************************************************/
+
+int main(void)
+{
+#if XF_CFG_CORES_NUM > 1
+ u32 i;
+#endif
+
+ /* ...reset ro/rw core data - tbd */
+ memset(xf_core_rw_data, 0, sizeof(xf_core_rw_data));
+ memset(xf_core_ro_data, 0, sizeof(xf_core_ro_data));
+
+ TRACE_INIT("Xtensa Audio DSP Codec Server");
+#ifdef XAF_ENABLE_NON_HIKEY
+ /* ...initialize board */
+ xf_board_init();
+
+ /* ...global framework data initialization */
+ xf_global_init();
+#endif
+
+#if XF_CFG_CORES_NUM > 1
+ /* ...DSP shared memory pool initialization */
+ XF_CHK_API(xf_mm_init(&xf_dsp_shmem_pool, xf_dsp_shmem_buffer, XF_CFG_LOCAL_IPC_POOL_SIZE));
+#endif
+
+ /* ...initialize per-core memory loop */
+ XF_CHK_API(xf_mm_init(&xf_core_data[0].local_pool, xf_dsp_local_buffer[0], XF_CFG_LOCAL_POOL_SIZE));
+
+#if XF_CFG_CORES_NUM > 1
+ /* ...bring up all cores */
+ for (i = 1; i < XF_CFG_CORES_NUM; i++)
+ {
+ /* ...wake-up secondary core somehow and make it execute xf_core_loop */
+ xf_core_secondary_startup(i, xf_core_loop, i);
+
+ }
+#endif
+
+ /* ...enter execution loop on master core #0 */
+ xf_core_loop(0);
+
+ /* ...not reachable */
+ return 0;
+}
diff --git a/hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c b/hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c
new file mode 100644
index 00000000..0909d446
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/mixer/xa-mixer.c
@@ -0,0 +1,669 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-mixer.c
+ *
+ * Sample mixer plugin
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG MIXER
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf-plugin.h"
+#include "audio/xa-mixer-api.h"
+
+/*******************************************************************************
+ * Tracing configuration
+ ******************************************************************************/
+
+TRACE_TAG(INIT, 1);
+TRACE_TAG(PROCESS, 1);
+
+/*******************************************************************************
+ * Internal functions definitions
+ ******************************************************************************/
+
+/* ...API structure */
+typedef struct XAPcmMixer
+{
+ /* ...mixer state */
+ u32 state;
+
+ /* ...number of samples in a frame */
+ u32 frame_size;
+
+ /* ...number of channels (channel mask?) */
+ u32 channels;
+
+ /* ...PCM sample width */
+ u32 pcm_width;
+
+ /* ...sampling rate */
+ u32 sample_rate;
+
+ /* ...number of bytes in input/output buffer */
+ u32 buffer_size;
+
+ /* ...master volume and individual track volumes*/
+ u32 volume[XA_MIXER_MAX_TRACK_NUMBER + 1];
+
+ /* ...input buffers */
+ void *input[XA_MIXER_MAX_TRACK_NUMBER];
+
+ /* ...number of samples in individual buffers */
+ u32 input_length[XA_MIXER_MAX_TRACK_NUMBER];
+
+ /* ...output buffer */
+ void *output;
+
+ /* ...number of produced bytes - do I need that? have buffer-size already - tbd */
+ u32 produced;
+
+ /* ...scratch buffer pointer */
+ void *scratch;
+
+} XAPcmMixer;
+
+/*******************************************************************************
+ * Mixer state flags
+ ******************************************************************************/
+
+#define XA_MIXER_FLAG_PREINIT_DONE (1 << 0)
+#define XA_MIXER_FLAG_POSTINIT_DONE (1 << 1)
+#define XA_MIXER_FLAG_RUNNING (1 << 2)
+#define XA_MIXER_FLAG_OUTPUT (1 << 3)
+#define XA_MIXER_FLAG_COMPLETE (1 << 4)
+
+/*******************************************************************************
+ * DSP functions
+ ******************************************************************************/
+
+#define DSP_SATURATE_S16(s32) \
+ (s16)((s32) > 0x7fff ? 0x7fff : ((s32) < -0x8000 ? -0x8000 : (s32)))
+
+/* ...mixer preinitialization (default parameters) */
+static inline void xa_mixer_preinit(XAPcmMixer *d)
+{
+ u32 i;
+
+ /* ...pre-configuration initialization; reset internal data */
+ memset(d, 0, sizeof(*d));
+
+ /* ...set default parameters */
+ d->pcm_width = 16, d->channels = 2, d->frame_size = 512;
+
+ /* ...set default volumes (last index is a master volume)*/
+ for (i = 0; i <= XA_MIXER_MAX_TRACK_NUMBER; i++)
+ {
+ d->volume[i] = ((1 << 12) << 16) | (1 << 12);
+ }
+}
+
+/* ...do mixing of stereo PCM-16 streams */
+static XA_ERRORCODE xa_mixer_do_execute_stereo_16bit(XAPcmMixer *d)
+{
+ s16 *output = d->output;
+ s16 *b[XA_MIXER_MAX_TRACK_NUMBER];
+ u16 v_l[XA_MIXER_MAX_TRACK_NUMBER];
+ u16 v_r[XA_MIXER_MAX_TRACK_NUMBER];
+ u16 w_l, w_r;
+ u32 t32;
+ u32 i, j;
+
+ /* ...retrieve master volume - assume up to 24dB amplifying (4 bits) */
+ t32 = d->volume[XA_MIXER_MAX_TRACK_NUMBER];
+ w_l = (u16)(t32 & 0xFFFF), w_r = (u16)(t32 >> 16);
+
+ /* ...prepare individual tracks */
+ for (j = 0; j < XA_MIXER_MAX_TRACK_NUMBER; j++)
+ {
+ u32 n = d->input_length[j];
+
+ /* ...check if we have input buffer available */
+ if (n == 0)
+ {
+ /* ...output silence (multiply garbage in the scratch buffer by 0) */
+ b[j] = d->scratch;
+ v_l[j] = v_r[j] = 0;
+ }
+ else
+ {
+ s32 k = (s32)(d->buffer_size - n);
+
+ /* ...put input buffer */
+ XF_CHK_ERR(b[j] = d->input[j], XA_MIXER_EXEC_FATAL_INPUT);
+
+ /* ...if length is not sufficient, pad buffer remainder */
+ (k > 0 ? memset((void *)b[j] + n, 0x00, k) : 0);
+
+ /* ...set individual track volume/balance */
+ t32 = d->volume[j];
+ v_l[j] = (u16)(t32 & 0xFFFF), v_r[j] = (u16)(t32 >> 16);
+ }
+
+ TRACE(PROCESS, _b("b[%u] = %p%s"), j, b[j], (n == 0 ? " - scratch" : ""));
+ }
+
+ /* ...process all tracks */
+ for (i = 0; i < d->frame_size; i++)
+ {
+ s32 l32 = 0, r32 = 0;
+
+ /* ...fill-in every channel in our map (unrolls loop here) */
+ for (j = 0; j < XA_MIXER_MAX_TRACK_NUMBER; j++)
+ {
+ /* ...left channel processing (no saturation here yet) */
+ l32 += *b[j]++ * v_l[j];
+
+ /* ...right channel processing */
+ r32 += *b[j]++ * v_r[j];
+ }
+
+ /* ...normalize (truncate towards -inf) and multiply by master volume */
+ l32 = ((l32 >> 12) * w_l) >> 12;
+ r32 = ((r32 >> 12) * w_r) >> 12;
+
+ /* ...saturate and store in buffer */
+ *output++ = DSP_SATURATE_S16(l32);
+ *output++ = DSP_SATURATE_S16(r32);
+ }
+
+ /* ...save total number of produced bytes */
+ d->produced = (u32)((void *)output - d->output);
+
+ /* ...put flag saying we have output buffer */
+ d->state |= XA_MIXER_FLAG_OUTPUT;
+
+ TRACE(PROCESS, _b("produced: %u bytes (%u samples)"), d->produced, d->frame_size);
+
+ /* ...reset input buffer length? */
+ //memset(d->input_length, 0, sizeof(d->input_length));
+
+ /* ...return success result code */
+ return XA_NO_ERROR;
+}
+
+/* ...runtime reset */
+static XA_ERRORCODE xa_mixer_do_runtime_init(XAPcmMixer *d)
+{
+ /* ...no special processing is needed here */
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Commands processing
+ ******************************************************************************/
+
+/* ...codec API size query */
+static XA_ERRORCODE xa_mixer_get_api_size(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...check parameters are sane */
+ XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...retrieve API structure size */
+ *(WORD32 *)pv_value = sizeof(*d);
+
+ return XA_NO_ERROR;
+}
+
+/* ...standard codec initialization routine */
+static XA_ERRORCODE xa_mixer_init(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check - mixer must be valid */
+ XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...process particular initialization type */
+ switch (i_idx)
+ {
+ case XA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS:
+ {
+ /* ...pre-configuration initialization; reset internal data */
+ xa_mixer_preinit(d);
+
+ /* ...and mark mixer has been created */
+ d->state = XA_MIXER_FLAG_PREINIT_DONE;
+
+ return XA_NO_ERROR;
+ }
+
+ case XA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS:
+ {
+ /* ...post-configuration initialization (all parameters are set) */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_PREINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...calculate input/output buffer size in bytes */
+ d->buffer_size = d->channels * d->frame_size * (d->pcm_width == 16 ? sizeof(s16) : sizeof(s32));
+
+ /* ...mark post-initialization is complete */
+ d->state |= XA_MIXER_FLAG_POSTINIT_DONE;
+
+ return XA_NO_ERROR;
+ }
+
+ case XA_CMD_TYPE_INIT_PROCESS:
+ {
+ /* ...kick run-time initialization process; make sure mixer is setup */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...enter into execution stage */
+ d->state |= XA_MIXER_FLAG_RUNNING;
+
+ return XA_NO_ERROR;
+ }
+
+ case XA_CMD_TYPE_INIT_DONE_QUERY:
+ {
+ /* ...check if initialization is done; make sure pointer is sane */
+ XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...put current status */
+ *(WORD32 *)pv_value = (d->state & XA_MIXER_FLAG_RUNNING ? 1 : 0);
+
+ return XA_NO_ERROR;
+ }
+
+ default:
+ /* ...unrecognized command type */
+ TRACE(ERROR, _x("Unrecognized command type: %X"), i_idx);
+ return XA_API_FATAL_INVALID_CMD_TYPE;
+ }
+}
+
+/* ...set mixer configuration parameter */
+static XA_ERRORCODE xa_mixer_set_config_param(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ u32 i_value;
+
+ /* ...sanity check - mixer pointer must be sane */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...pre-initialization must be completed, mixer must be idle */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_PREINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...get parameter value */
+ i_value = (u32) *(WORD32 *)pv_value;
+
+ /* ...process individual configuration parameter */
+ switch (i_idx)
+ {
+ case XA_MIXER_CONFIG_PARAM_PCM_WIDTH:
+ /* ...check value is permitted (16 bits only) */
+ XF_CHK_ERR(i_value == 16, XA_MIXER_CONFIG_NONFATAL_RANGE);
+ d->pcm_width = (u32)i_value;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_CONFIG_PARAM_CHANNELS:
+ /* ...allow stereo only */
+ XF_CHK_ERR(i_value == 2, XA_MIXER_CONFIG_NONFATAL_RANGE);
+ d->channels = (u32)i_value;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_CONFIG_PARAM_SAMPLE_RATE:
+ /* ...set mixer sample rate */
+ d->sample_rate = (u32)i_value;
+ return XA_NO_ERROR;
+
+ default:
+ TRACE(ERROR, _x("Invalid parameter: %X"), i_idx);
+ return XA_API_FATAL_INVALID_CMD_TYPE;
+ }
+}
+
+/* ...retrieve configuration parameter */
+static XA_ERRORCODE xa_mixer_get_config_param(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check - mixer must be initialized */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...make sure pre-initialization is completed */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_PREINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...process individual configuration parameter */
+ switch (i_idx)
+ {
+ case XA_MIXER_CONFIG_PARAM_INPUT_TRACKS:
+ /* ...return maximal number of input tracks supported */
+ *(WORD32 *)pv_value = XA_MIXER_MAX_TRACK_NUMBER;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_CONFIG_PARAM_SAMPLE_RATE:
+ /* ...return mixer sample rate */
+ *(WORD32 *)pv_value = d->sample_rate;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_CONFIG_PARAM_PCM_WIDTH:
+ /* ...return current PCM width */
+ *(WORD32 *)pv_value = d->pcm_width;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_CONFIG_PARAM_CHANNELS:
+ /* ...return current channel number */
+ *(WORD32 *)pv_value = d->channels;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_CONFIG_PARAM_FRAME_SIZE:
+ /* ...return current in/out frame length (in samples) */
+ *(WORD32 *)pv_value = d->frame_size;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_CONFIG_PARAM_BUFFER_SIZE:
+ /* ...return current in/out frame length (in bytes) */
+ *(WORD32 *)pv_value = d->buffer_size;
+ return XA_NO_ERROR;
+
+ default:
+ TRACE(ERROR, _x("Invalid parameter: %X"), i_idx);
+ return XA_API_FATAL_INVALID_CMD_TYPE;
+ }
+}
+
+/* ...execution command */
+static XA_ERRORCODE xa_mixer_execute(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check - mixer must be valid */
+ XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...mixer must be in running state */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_RUNNING, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...process individual command type */
+ switch (i_idx)
+ {
+ case XA_CMD_TYPE_DO_EXECUTE:
+ /* ...perform mixing of the channels */
+ return xa_mixer_do_execute_stereo_16bit(d);
+
+ case XA_CMD_TYPE_DONE_QUERY:
+ /* ...check if processing is complete */
+ XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+ *(WORD32 *)pv_value = (d->state & XA_MIXER_FLAG_COMPLETE ? 1 : 0);
+ return XA_NO_ERROR;
+
+ case XA_CMD_TYPE_DO_RUNTIME_INIT:
+ /* ...reset mixer operation */
+ return xa_mixer_do_runtime_init(d);
+
+ default:
+ /* ...unrecognized command */
+ TRACE(ERROR, _x("Invalid index: %X"), i_idx);
+ return XA_API_FATAL_INVALID_CMD_TYPE;
+ }
+}
+
+/* ...set number of input bytes */
+static XA_ERRORCODE xa_mixer_set_input_bytes(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ u32 size;
+
+ /* ...sanity check - check parameters */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...track index must be valid */
+ XF_CHK_ERR(i_idx >= 0 && i_idx < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...mixer must be initialized */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...input buffer must exist */
+ XF_CHK_ERR(d->input[i_idx], XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...input frame length should not be zero (in bytes) */
+ XF_CHK_ERR((size = (u32)*(WORD32 *)pv_value) > 0, XA_MIXER_EXEC_NONFATAL_INPUT);
+
+ /* ...all is correct; set input buffer length in bytes */
+ d->input_length[i_idx] = size;
+
+ return XA_NO_ERROR;
+}
+
+/* ...get number of output bytes */
+static XA_ERRORCODE xa_mixer_get_output_bytes(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check - check parameters */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...track index must be zero */
+ XF_CHK_ERR(i_idx == XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...mixer must be running */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_RUNNING, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...output buffer must exist */
+ XF_CHK_ERR(d->output, XA_MIXER_EXEC_NONFATAL_OUTPUT);
+
+ /* ...return number of produced bytes */
+ *(WORD32 *)pv_value = (d->state & XA_MIXER_FLAG_OUTPUT ? d->buffer_size : 0);
+
+ return XA_NO_ERROR;
+}
+
+/* ...get number of consumed bytes */
+static XA_ERRORCODE xa_mixer_get_curidx_input_buf(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check - check parameters */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...track index must be valid */
+ XF_CHK_ERR(i_idx >= 0 && i_idx < XA_MIXER_MAX_TRACK_NUMBER, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...mixer must be running */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_RUNNING, XA_MIXER_EXEC_FATAL_STATE);
+
+ /* ...input buffer must exist */
+ XF_CHK_ERR(d->input[i_idx], XA_MIXER_EXEC_FATAL_INPUT);
+
+ /* ...return number of bytes consumed (always consume fixed-length chunk) */
+ *(WORD32 *)pv_value = d->input_length[i_idx], d->input_length[i_idx] = 0;
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Memory information API
+ ******************************************************************************/
+
+/* ..get total amount of data for memory tables */
+static XA_ERRORCODE xa_mixer_get_memtabs_size(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity checks */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check mixer is pre-initialized */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_PREINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...we have all our tables inside API structure - good? tbd */
+ *(WORD32 *)pv_value = 0;
+
+ return XA_NO_ERROR;
+}
+
+/* ..set memory tables pointer */
+static XA_ERRORCODE xa_mixer_set_memtabs_ptr(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity checks */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check mixer is pre-initialized */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_PREINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...do not do anything; just return success - tbd */
+ return XA_NO_ERROR;
+}
+
+/* ...return total amount of memory buffers */
+static XA_ERRORCODE xa_mixer_get_n_memtabs(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity checks */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...we have N input buffers, 1 output buffer and 1 scratch buffer */
+ *(WORD32 *)pv_value = XA_MIXER_MAX_TRACK_NUMBER + 1 + 1;
+
+ return XA_NO_ERROR;
+}
+
+/* ...return memory buffer data */
+static XA_ERRORCODE xa_mixer_get_mem_info_size(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...return frame buffer minimal size only after post-initialization is done */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...all buffers are of the same length */
+ *(WORD32 *)pv_value = (WORD32) d->buffer_size;
+
+ return XA_NO_ERROR;
+}
+
+/* ...return memory alignment data */
+static XA_ERRORCODE xa_mixer_get_mem_info_alignment(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...return frame buffer minimal size only after post-initialization is done */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...all buffers are 4-bytes aligned */
+ *(WORD32 *)pv_value = 4;
+
+ return XA_NO_ERROR;
+}
+
+/* ...return memory type data */
+static XA_ERRORCODE xa_mixer_get_mem_info_type(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...return frame buffer minimal size only after post-initialization is done */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ switch (i_idx)
+ {
+ case 0 ... XA_MIXER_MAX_TRACK_NUMBER - 1:
+ /* ...input buffers */
+ *(WORD32 *)pv_value = XA_MEMTYPE_INPUT;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_MAX_TRACK_NUMBER:
+ /* ...output buffer */
+ *(WORD32 *)pv_value = XA_MEMTYPE_OUTPUT;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_MAX_TRACK_NUMBER + 1:
+ /* ...scratch buffer */
+ *(WORD32 *)pv_value = XA_MEMTYPE_SCRATCH;
+ return XA_NO_ERROR;
+
+ default:
+ /* ...invalid index */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/* ...set memory pointer */
+static XA_ERRORCODE xa_mixer_set_mem_ptr(XAPcmMixer *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...codec must be initialized */
+ XF_CHK_ERR(d->state & XA_MIXER_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...select memory buffer */
+ switch (i_idx)
+ {
+ case 0 ... XA_MIXER_MAX_TRACK_NUMBER - 1:
+ /* ...input buffers */
+ d->input[i_idx] = pv_value;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_MAX_TRACK_NUMBER:
+ /* ...output buffer */
+ d->output = pv_value;
+ return XA_NO_ERROR;
+
+ case XA_MIXER_MAX_TRACK_NUMBER + 1:
+ /* ...scratch buffer */
+ d->scratch = pv_value;
+ return XA_NO_ERROR;
+
+ default:
+ /* ...invalid index */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/*******************************************************************************
+ * API command hooks
+ ******************************************************************************/
+
+static XA_ERRORCODE (* const xa_mixer_api[])(XAPcmMixer *, WORD32, pVOID) =
+{
+ [XA_API_CMD_GET_API_SIZE] = xa_mixer_get_api_size,
+
+ [XA_API_CMD_INIT] = xa_mixer_init,
+ [XA_API_CMD_SET_CONFIG_PARAM] = xa_mixer_set_config_param,
+ [XA_API_CMD_GET_CONFIG_PARAM] = xa_mixer_get_config_param,
+
+ [XA_API_CMD_EXECUTE] = xa_mixer_execute,
+ [XA_API_CMD_SET_INPUT_BYTES] = xa_mixer_set_input_bytes,
+ [XA_API_CMD_GET_OUTPUT_BYTES] = xa_mixer_get_output_bytes,
+ [XA_API_CMD_GET_CURIDX_INPUT_BUF] = xa_mixer_get_curidx_input_buf,
+
+ [XA_API_CMD_GET_MEMTABS_SIZE] = xa_mixer_get_memtabs_size,
+ [XA_API_CMD_SET_MEMTABS_PTR] = xa_mixer_set_memtabs_ptr,
+ [XA_API_CMD_GET_N_MEMTABS] = xa_mixer_get_n_memtabs,
+ [XA_API_CMD_GET_MEM_INFO_SIZE] = xa_mixer_get_mem_info_size,
+ [XA_API_CMD_GET_MEM_INFO_ALIGNMENT] = xa_mixer_get_mem_info_alignment,
+ [XA_API_CMD_GET_MEM_INFO_TYPE] = xa_mixer_get_mem_info_type,
+ [XA_API_CMD_SET_MEM_PTR] = xa_mixer_set_mem_ptr,
+};
+
+/* ...total numer of commands supported */
+#define XA_MIXER_API_COMMANDS_NUM (sizeof(xa_mixer_api) / sizeof(xa_mixer_api[0]))
+
+/*******************************************************************************
+ * API entry point
+ ******************************************************************************/
+
+XA_ERRORCODE xa_mixer(xa_codec_handle_t p_xa_module_obj, WORD32 i_cmd, WORD32 i_idx, pVOID pv_value)
+{
+ XAPcmMixer *d = (XAPcmMixer *) p_xa_module_obj;
+
+ /* ...check if command index is sane */
+ XF_CHK_ERR(i_cmd < XA_MIXER_API_COMMANDS_NUM, XA_API_FATAL_INVALID_CMD);
+
+ /* ...see if command is defined */
+ XF_CHK_ERR(xa_mixer_api[i_cmd], XA_API_FATAL_INVALID_CMD);
+
+ /* ...execute requested command */
+ return xa_mixer_api[i_cmd](d, i_idx, pv_value);
+}
diff --git a/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm-api.h b/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm-api.h
new file mode 100644
index 00000000..cb14dad0
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm-api.h
@@ -0,0 +1,145 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-pcm-api.h
+ *
+ * Generic PCM format converter API
+ *
+ ******************************************************************************/
+
+#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/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c b/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c
new file mode 100644
index 00000000..43067144
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/pcm_proc/xa-pcm.c
@@ -0,0 +1,841 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-pcm.c
+ *
+ * PCM format converter plugin
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG PCM
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf-plugin.h"
+#include "xa-audio-decoder-api.h"
+#include "xa-pcm-api.h"
+
+#include <fcntl.h>
+
+/*******************************************************************************
+ * Tracing configuration
+ ******************************************************************************/
+
+TRACE_TAG(INIT, 1);
+TRACE_TAG(PROCESS, 0);
+
+/*******************************************************************************
+ * Local typedefs
+ ******************************************************************************/
+
+/* ...API structure */
+typedef struct XAPcmCodec
+{
+ /* ...codec state */
+ u32 state;
+
+ /* ...sampling rate of input/output signal (informative only) */
+ u32 sample_rate;
+
+ /* ...number of input/output channels */
+ u8 in_channels, out_channels;
+
+ /* ...PCM sample width of input/output streams */
+ u8 in_pcm_width, out_pcm_width;
+
+ /* ...input/output stride size */
+ u8 in_stride, out_stride;
+
+ /* ...channel routing map between input and output */
+ u32 chan_routing;
+
+ /* ...data processing hook */
+ XA_ERRORCODE (*process)(struct XAPcmCodec *);
+
+ /* ...number of samples in input/output buffers */
+ u32 insize, outsize;
+
+ /* ...input/output memory indices */
+ u32 input_idx, output_idx;
+
+ /* ...input/output buffers passed from/to caller */
+ void *input, *output;
+
+ /* ...number of input bytes consumed/produced */
+ u32 consumed, produced;
+
+ /* ...debug - file handles */
+ int f_input, f_output;
+
+} XAPcmCodec;
+
+/*******************************************************************************
+ * Local execution flags
+ ******************************************************************************/
+
+#define XA_PCM_FLAG_PREINIT_DONE (1 << 0)
+#define XA_PCM_FLAG_POSTINIT_DONE (1 << 1)
+#define XA_PCM_FLAG_RUNNING (1 << 2)
+#define XA_PCM_FLAG_EOS (1 << 3)
+#define XA_PCM_FLAG_COMPLETE (1 << 4)
+
+/*******************************************************************************
+ * Local constants definitions
+ ******************************************************************************/
+
+/* ...process at most 1024 samples per call */
+#define XA_PCM_MAX_SAMPLES 1024
+
+/*******************************************************************************
+ * Internal processing functions
+ ******************************************************************************/
+
+/* ...identity translation of PCM16/24 */
+static XA_ERRORCODE xa_pcm_do_execute_copy(XAPcmCodec *d)
+{
+ u32 n = d->insize;
+ u8 k = d->in_channels;
+ u32 length = n * k * (d->in_pcm_width == 16 ? 2 : 4);
+ s16 *input = d->input, *output = d->output;
+
+ TRACE(PROCESS, _b("Copy PCM%d %p to %p (%u samples)"), d->in_pcm_width, input, output, n);
+
+ /* ...check if we have all data setup */
+ XF_CHK_ERR(input && n && output, XA_PCM_EXEC_FATAL_STATE);
+
+ /* ...copy the samples without any processing */
+ memcpy(output, input, length);
+
+ /* ...set number of consumed/produced bytes */
+ d->consumed = length;
+ d->produced = length;
+
+ /* ...reset input buffer length */
+ d->insize = 0;
+
+ /* ...copy input to output */
+ return XA_NO_ERROR;
+}
+
+/* ...data processing for PCM16, channel mapping case */
+static XA_ERRORCODE xa_pcm_do_execute_pcm16_chmap(XAPcmCodec *d)
+{
+ u32 n = d->insize, i;
+ u8 k = d->in_channels, j;
+ u32 chmap = d->chan_routing, map;
+ s16 *input = d->input, *output = d->output;
+ u32 length = n * k * (d->in_pcm_width == 16 ? 2 : 4);
+
+ TRACE(PROCESS, _b("Map PCM16 %p to %p (%u samples, map: %X)"), input, output, n, chmap);
+
+ /* ...check if we have all data setup */
+ XF_CHK_ERR(input && n && output, XA_PCM_EXEC_FATAL_STATE);
+
+#if 0
+ /* ...convert individual samples (that function could be CPU-optimized - tbd) */
+ for (i = 0; i < n; i++, input += k)
+ {
+ /* ...process individual channels in a sample */
+ for (j = 0, map = chmap; j < k; j++, map >>= 4)
+ {
+ u8 m = map & 0xF;
+
+ /* ...fill output channel (zero unused channel) */
+ *output++ = (m < 8 ? input[m] : 0);
+ }
+ }
+
+ /* ...set number of consumed/produced bytes */
+ d->consumed = (u32)((u8 *)input - (u8 *)d->input);
+ d->produced = (u32)((u8 *)output - (u8 *)d->output);
+#else
+ memcpy(output, input, length);
+ /* ...set number of consumed/produced bytes */
+ d->consumed = length;
+ d->produced = length;
+#endif
+ /* ...reset input buffer length */
+ d->insize = 0;
+
+ /* ...copy input to output */
+ return XA_NO_ERROR;
+}
+
+/* ...data processing for PCM24/PCM32, channel mapping case */
+static XA_ERRORCODE xa_pcm_do_execute_pcm24_chmap(XAPcmCodec *d)
+{
+ u32 n = d->insize, i;
+ u8 k = d->in_channels, j;
+ u32 chmap = d->chan_routing, map;
+ s32 *input = d->input, *output = d->output;
+
+ TRACE(PROCESS, _b("Map PCM24 %p to %p (%u samples, map: %X)"), input, output, n, chmap);
+
+ /* ...check if we have all data setup */
+ XF_CHK_ERR(input && n && output, XA_PCM_EXEC_FATAL_STATE);
+
+ /* ...convert individual samples (that function could be CPU-optimized - tbd) */
+ for (i = 0; i < n; i++, input += k)
+ {
+ /* ...process individual channels in a sample */
+ for (j = 0, map = chmap; j < k; j++, map >>= 4)
+ {
+ u8 m = map & 0xF;
+
+ /* ...fill output channel (zero unused channel) */
+ *output++ = (m < 8 ? input[m] : 0);
+ }
+ }
+
+ /* ...set number of consumed/produced bytes */
+ d->consumed = (u32)((u8 *)input - (u8 *)d->input);
+ d->produced = (u32)((u8 *)output - (u8 *)d->output);
+
+ /* ...reset input buffer length */
+ d->insize = 0;
+
+ /* ...copy input to output */
+ return XA_NO_ERROR;
+}
+
+/* ...convert multichannel 24-bit PCM to 16-bit PCM with channel mapping */
+static XA_ERRORCODE xa_pcm_do_execute_pcm24_to_pcm16(XAPcmCodec *d)
+{
+ u32 n = d->insize, i;
+ u8 k = d->in_channels, j;
+ u32 chmap = d->chan_routing, map;
+ s32 *input = d->input;
+ s16 *output = d->output;
+
+ TRACE(PROCESS, _b("Convert PCM24 %p to PCM16 %p (%u samples, map: %X)"), input, output, n, chmap);
+
+ /* ...check if we have all data setup */
+ XF_CHK_ERR(input && n && output, XA_PCM_EXEC_FATAL_STATE);
+
+ /* ...convert individual samples (that function could be CPU-optimized - tbd) */
+ for (i = 0; i < n; i++, input += k)
+ {
+ /* ...process individual channels in a sample */
+ for (j = 0, map = chmap; j < k; j++, map >>= 4)
+ {
+ u8 m = map & 0xF;
+
+ /* ...convert and zero out unused channels */
+ *output++ = (m < 8 ? input[m] >> 16 : 0);
+ }
+ }
+
+ /* ...set number of consumed/produced bytes */
+ d->consumed = (u32)((u8 *)input - (u8 *)d->input);
+ d->produced = (u32)((u8 *)output - (u8 *)d->output);
+
+ /* ...dump output data */
+ //BUG(write(d->f_input, d->input, d->consumed) != d->consumed, _x("%m"));
+ //BUG(write(d->f_output, d->output, d->produced) != d->produced, _x("%m"));
+
+ /* ...reset input buffer length (tbd - need that?) */
+ d->insize = 0;
+
+ /* ...copy input to output */
+ return XA_NO_ERROR;
+}
+
+/* ...convert multichannel 16-bit PCM to 24-bit PCM with channel mapping */
+static XA_ERRORCODE xa_pcm_do_execute_pcm16_to_pcm24(XAPcmCodec *d)
+{
+ u32 n = d->insize, i;
+ u8 k = d->in_channels, j;
+ u32 chmap = d->chan_routing, map;
+ s16 *input = d->input;
+ s32 *output = d->output;
+
+ TRACE(PROCESS, _b("Convert PCM16 %p to PCM24 %p (%u samples, map: %X)"), input, output, n, chmap);
+
+ /* ...check if we have all data setup */
+ XF_CHK_ERR(input && n && output, XA_PCM_EXEC_FATAL_STATE);
+
+ /* ...convert individual samples (that function could be CPU-optimized - tbd) */
+ for (i = 0; i < n; i++, input += k)
+ {
+ /* ...process individual channels in a sample */
+ for (j = 0, map = chmap; j < k; j++, map >>= 4)
+ {
+ u8 m = map & 0xF;
+
+ /* ...convert and zero out unused channels */
+ *output++ = (m < 8 ? input[m] << 16 : 0);
+ }
+ }
+
+ /* ...set number of consumed/produced bytes */
+ d->consumed = (u32)((u8 *)input - (u8 *)d->input);
+ d->produced = (u32)((u8 *)output - (u8 *)d->output);
+
+ /* ...reset input buffer length (tbd - need that?) */
+ d->insize = 0;
+
+ /* ...copy input to output */
+ return XA_NO_ERROR;
+}
+
+/* ...determine if we need to do a channel routing */
+static inline int xa_pcm_is_identity_mapping(u32 chmap, u8 k)
+{
+ u8 j;
+
+ for (j = 0; j < k; j++, chmap >>= 4)
+ if ((chmap & 0xF) != j)
+ return 0;
+
+ return 1;
+}
+
+/* ...runtime initialization */
+static inline XA_ERRORCODE xa_pcm_do_runtime_init(XAPcmCodec *d)
+{
+ u8 in_width = d->in_pcm_width, out_width = d->out_pcm_width;
+ u8 in_ch = d->in_channels, out_ch = d->out_channels;
+ u32 chmap = d->chan_routing;
+
+ /* ...check for supported processing schemes */
+ if (in_width == out_width)
+ {
+ /* ...check if we need to do a channel mapping */
+ if (in_ch != out_ch || !xa_pcm_is_identity_mapping(chmap, in_ch))
+ {
+ /* ...mapping is needed */
+ d->process = (in_width == 16 ? xa_pcm_do_execute_pcm16_chmap : xa_pcm_do_execute_pcm24_chmap);
+ }
+ else
+ {
+ /* ...setup identity translation */
+ d->process = xa_pcm_do_execute_copy;
+ }
+ }
+ else
+ {
+ /* ...samples converion is required */
+ d->process = (in_width == 16 ? xa_pcm_do_execute_pcm16_to_pcm24 : xa_pcm_do_execute_pcm24_to_pcm16);
+ }
+
+ /* ...mark the runtime initialization is completed */
+ d->state = XA_PCM_FLAG_PREINIT_DONE | XA_PCM_FLAG_POSTINIT_DONE | XA_PCM_FLAG_RUNNING;
+
+ TRACE(INIT, _b("PCM format converter initialized: PCM%u -> PCM%u, ich=%u, och=%u, map=%X"), in_width, out_width, in_ch, out_ch, chmap);
+
+ return XA_NO_ERROR;
+}
+
+/*******************************************************************************
+ * Commands processing
+ ******************************************************************************/
+
+/* ...standard codec initialization routine */
+static XA_ERRORCODE xa_pcm_get_api_size(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...return API structure size */
+ *(WORD32 *)pv_value = sizeof(*d);
+
+ return XA_NO_ERROR;
+}
+
+/* ...standard codec initialization routine */
+static XA_ERRORCODE xa_pcm_init(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check */
+ XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...process particular initialization type */
+ switch (i_idx)
+ {
+ case XA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS:
+ {
+ /* ...pre-configuration initialization; reset internal data */
+ memset(d, 0, sizeof(*d));
+
+ /* ...set default parameters */
+ d->in_pcm_width = d->out_pcm_width = 16;
+ d->in_channels = d->out_channels = 2;
+ d->chan_routing = (0 << 0) | (1 << 1);
+ d->sample_rate = 48000;
+
+ /* ...open debug files */
+ //BUG((d->f_input = open("pcm-in.dat", O_WRONLY | O_CREAT, 0664)) < 0, _x("%m"));
+ //BUG((d->f_output = open("pcm-out.dat", O_WRONLY | O_CREAT, 0664)) < 0, _x("%m"));
+
+ /* ...mark pre-initialization is done */
+ d->state = XA_PCM_FLAG_PREINIT_DONE;
+
+ return XA_NO_ERROR;
+ }
+
+ case XA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS:
+ {
+ /* ...post-configuration initialization (all parameters are set) */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_PREINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...calculate input sample stride size */
+ d->in_stride = d->in_channels * (d->in_pcm_width == 16 ? 2 : 4);
+ d->out_stride = d->out_channels * (d->out_pcm_width == 16 ? 2 : 4);
+
+ /* ...mark post-initialization is complete */
+ d->state |= XA_PCM_FLAG_POSTINIT_DONE;
+
+ return XA_NO_ERROR;
+ }
+
+ case XA_CMD_TYPE_INIT_PROCESS:
+ {
+ /* ...run-time initialization process; make sure post-init is complete */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...initialize runtime for specified transformation function */
+ return xa_pcm_do_runtime_init(d);
+ }
+
+ case XA_CMD_TYPE_INIT_DONE_QUERY:
+ {
+ /* ...check for runtime initialization completion; maske usre post-init is complete */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...put current status */
+ *(WORD32 *)pv_value = (d->state & XA_PCM_FLAG_RUNNING ? 1 : 0);
+
+ return XA_NO_ERROR;
+ }
+
+ default:
+ /* ...unrecognized command */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/* ...set configuration parameter */
+static XA_ERRORCODE xa_pcm_set_config_param(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ WORD32 i_value;
+
+ /* ...sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...configuration is allowed only in PRE-CONFIG state */
+ XF_CHK_ERR(d->state == XA_PCM_FLAG_PREINIT_DONE, XA_PCM_CONFIG_NONFATAL_STATE);
+
+ /* ...get integer parameter value */
+ i_value = *(WORD32 *)pv_value;
+
+ /* ...process individual configuration parameter */
+ switch (i_idx)
+ {
+ case XA_CODEC_CONFIG_PARAM_SAMPLE_RATE:
+ case XA_PCM_CONFIG_PARAM_SAMPLE_RATE:
+ /* ...accept any sampling rate */
+ d->sample_rate = (u32)i_value;
+ return XA_NO_ERROR;
+
+ case XA_PCM_CONFIG_PARAM_IN_PCM_WIDTH:
+ /* ...return input sample bit-width */
+ XF_CHK_ERR(i_value == 16 || i_value == 24, XA_PCM_CONFIG_NONFATAL_RANGE);
+ d->in_pcm_width = (u8)i_value;
+ return XA_NO_ERROR;
+
+ case XA_PCM_CONFIG_PARAM_IN_CHANNELS:
+ /* ...support at most 8-channels stream */
+ XF_CHK_ERR(i_value > 0 && i_value <= 8, XA_PCM_CONFIG_NONFATAL_RANGE);
+ d->in_channels = (u8)i_value;
+ return XA_NO_ERROR;
+
+ case XA_CODEC_CONFIG_PARAM_PCM_WIDTH:
+ case XA_PCM_CONFIG_PARAM_OUT_PCM_WIDTH:
+ /* ...we only support PCM16 and PCM24 */
+ XF_CHK_ERR(i_value == 16 || i_value == 24, XA_PCM_CONFIG_NONFATAL_RANGE);
+ d->out_pcm_width = (u8)i_value;
+ return XA_NO_ERROR;
+
+ case XA_CODEC_CONFIG_PARAM_CHANNELS:
+ case XA_PCM_CONFIG_PARAM_OUT_CHANNELS:
+ /* ...support at most 8-channels stream */
+ XF_CHK_ERR(i_value > 0 && i_value <= 8, XA_API_FATAL_INVALID_CMD_TYPE);
+ d->out_channels = (u8)i_value;
+ return XA_NO_ERROR;
+
+ case XA_PCM_CONFIG_PARAM_CHANROUTING:
+ /* ...accept any channel routing mask */
+ d->chan_routing = (u32)i_value;
+ return XA_NO_ERROR;
+
+ default:
+ /* ...unrecognized parameter */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/* ...retrieve configuration parameter */
+static XA_ERRORCODE xa_pcm_get_config_param(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...make sure pre-configuration is completed */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_PREINIT_DONE, XA_PCM_CONFIG_NONFATAL_STATE);
+
+ /* ...process individual parameter */
+ switch (i_idx)
+ {
+ case XA_CODEC_CONFIG_PARAM_SAMPLE_RATE:
+ case XA_PCM_CONFIG_PARAM_SAMPLE_RATE:
+ /* ...return output sampling frequency */
+ *(WORD32 *)pv_value = d->sample_rate;
+ return XA_NO_ERROR;
+
+ case XA_PCM_CONFIG_PARAM_IN_PCM_WIDTH:
+ /* ...return input sample bit-width */
+ *(WORD32 *)pv_value = d->in_pcm_width;
+ return XA_NO_ERROR;
+
+ case XA_PCM_CONFIG_PARAM_IN_CHANNELS:
+ /* ...return number of input channels */
+ *(WORD32 *)pv_value = d->in_channels;
+ return XA_NO_ERROR;
+
+ case XA_CODEC_CONFIG_PARAM_PCM_WIDTH:
+ case XA_PCM_CONFIG_PARAM_OUT_PCM_WIDTH:
+ /* ...return output sample bit-width */
+ *(WORD32 *)pv_value = d->out_pcm_width;
+ return XA_NO_ERROR;
+
+ case XA_CODEC_CONFIG_PARAM_CHANNELS:
+ case XA_PCM_CONFIG_PARAM_OUT_CHANNELS:
+ /* ...return number of output channels */
+ *(WORD32 *)pv_value = d->out_channels;
+ return XA_NO_ERROR;
+
+ case XA_PCM_CONFIG_PARAM_CHANROUTING:
+ /* ...return current channel routing mask */
+ *(WORD32 *)pv_value = d->chan_routing;
+ return XA_NO_ERROR;
+
+ default:
+ /* ...unrecognized parameter */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/* ...execution command */
+static XA_ERRORCODE xa_pcm_execute(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...codec must be in running state */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_RUNNING, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...process individual command type */
+ switch (i_idx)
+ {
+ case XA_CMD_TYPE_DO_EXECUTE:
+ /* ...do data processing (tbd - result code is bad) */
+ if (d->insize != 0)
+ {
+ XF_CHK_ERR(!XA_ERROR_SEVERITY(d->process(d)), XA_PCM_EXEC_FATAL_STATE);
+ }
+
+ /* ...process end-of-stream condition */
+ (d->state & XA_PCM_FLAG_EOS ? d->state ^= XA_PCM_FLAG_EOS | XA_PCM_FLAG_COMPLETE : 0);
+
+ return XA_NO_ERROR;
+
+ case XA_CMD_TYPE_DONE_QUERY:
+ /* ...check if processing is complete */
+ XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...return completion status */
+ *(WORD32 *)pv_value = (d->state & XA_PCM_FLAG_COMPLETE ? 1 : 0);
+
+ return XA_NO_ERROR;
+
+ case XA_CMD_TYPE_DO_RUNTIME_INIT:
+ /* ...reset codec operation */
+ return xa_pcm_do_runtime_init(d);
+
+ default:
+ /* ...unrecognized command */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/* ...set number of input bytes */
+static XA_ERRORCODE xa_pcm_set_input_bytes(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ u32 in_stride = d->in_stride;
+ u32 insize;
+
+ /* ...sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...track index must be valid */
+ XF_CHK_ERR(i_idx == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...component must be initialized */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...input buffer must exist */
+ XF_CHK_ERR(d->input, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...convert bytes into samples (don't like division, but still...) */
+ insize = *(WORD32 *)pv_value / in_stride;
+
+ /* ...make sure we have integral amount of samples */
+ XF_CHK_ERR(*(WORD32 *)pv_value == insize * in_stride, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...limit input buffer size to maximal value*/
+ d->insize = (insize > XA_PCM_MAX_SAMPLES ? XA_PCM_MAX_SAMPLES : insize);
+
+ return XA_NO_ERROR;
+}
+
+/* ...get number of output bytes produced */
+static XA_ERRORCODE xa_pcm_get_output_bytes(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...buffer index must be sane */
+ XF_CHK_ERR(i_idx == 1, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...component must be initialized */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...output buffer must exist */
+ XF_CHK_ERR(d->output, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...return number of produced bytes (and reset instantly? - tbd) */
+ *(WORD32 *)pv_value = d->produced;
+
+ return XA_NO_ERROR;
+}
+
+/* ...get number of consumed bytes */
+static XA_ERRORCODE xa_pcm_get_curidx_input_buf(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...index must be valid */
+ XF_CHK_ERR(i_idx == 0, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...input buffer must exist */
+ XF_CHK_ERR(d->input, XA_PCM_EXEC_NONFATAL_INPUT);
+
+ /* ...return number of bytes consumed */
+ *(WORD32 *)pv_value = d->consumed;
+
+ return XA_NO_ERROR;
+}
+
+/* ...end-of-stream processing */
+static XA_ERRORCODE xa_pcm_input_over(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...sanity check */
+ XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...put end-of-stream flag */
+ d->state |= XA_PCM_FLAG_EOS;
+
+ TRACE(PROCESS, _b("Input-over-condition signalled"));
+
+ return XA_NO_ERROR;
+}
+
+/* ..get total amount of data for memory tables */
+static XA_ERRORCODE xa_pcm_get_memtabs_size(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity checks */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check mixer is pre-initialized */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_PREINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...we have all our tables inside API structure */
+ *(WORD32 *)pv_value = 0;
+
+ return XA_NO_ERROR;
+}
+
+/* ...return total amount of memory buffers */
+static XA_ERRORCODE xa_pcm_get_n_memtabs(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity checks */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...we have 1 input buffer and 1 output buffer */
+ *(WORD32 *)pv_value = 1 + 1;
+
+ return XA_NO_ERROR;
+}
+
+/* ...return memory type data */
+static XA_ERRORCODE xa_pcm_get_mem_info_type(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...codec must be in post-init state */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...check buffer type */
+ switch (i_idx)
+ {
+ case 0:
+ *(WORD32 *)pv_value = XA_MEMTYPE_INPUT;
+ return XA_NO_ERROR;
+
+ case 1:
+ *(WORD32 *)pv_value = XA_MEMTYPE_OUTPUT;
+ return XA_NO_ERROR;
+
+ default:
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/* ...return memory buffer size */
+static XA_ERRORCODE xa_pcm_get_mem_info_size(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...codec must be in post-init state */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...determine particular buffer */
+ switch (i_idx)
+ {
+ case 0:
+ /* ...input buffer size can be any */
+ *(WORD32 *)pv_value = 0;
+ return XA_NO_ERROR;
+
+ case 1:
+ /* ...output buffer size is dependent on stride */
+ *(WORD32 *)pv_value = XA_PCM_MAX_SAMPLES * d->out_stride;
+ return XA_NO_ERROR;
+
+ default:
+ /* ...invalid buffer index */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/* ...return memory alignment data */
+static XA_ERRORCODE xa_pcm_get_mem_info_alignment(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d && pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...codec must be in post-initialization state */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...all buffers are 4-bytes aligned */
+ *(WORD32 *)pv_value = 4;
+
+ return XA_NO_ERROR;
+}
+
+/* ...set memory pointer */
+static XA_ERRORCODE xa_pcm_set_mem_ptr(XAPcmCodec *d, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...basic sanity check */
+ XF_CHK_ERR(d, XA_API_FATAL_INVALID_CMD_TYPE);
+ XF_CHK_ERR(pv_value, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...codec must be in post-initialized state */
+ XF_CHK_ERR(d->state & XA_PCM_FLAG_POSTINIT_DONE, XA_API_FATAL_INVALID_CMD_TYPE);
+
+ /* ...select memory buffer */
+ switch (i_idx)
+ {
+ case 0:
+ /* ...input buffer */
+ d->input = pv_value;
+ return XA_NO_ERROR;
+
+ case 1:
+ /* ...output buffer */
+ d->output = pv_value;
+ return XA_NO_ERROR;
+
+ default:
+ /* ...invalid index */
+ return XF_CHK_ERR(0, XA_API_FATAL_INVALID_CMD_TYPE);
+ }
+}
+
+/*******************************************************************************
+ * API command hooks
+ ******************************************************************************/
+
+static XA_ERRORCODE (* const xa_pcm_api[])(XAPcmCodec *, WORD32, pVOID) =
+{
+ [XA_API_CMD_GET_API_SIZE] = xa_pcm_get_api_size,
+
+ [XA_API_CMD_INIT] = xa_pcm_init,
+ [XA_API_CMD_SET_CONFIG_PARAM] = xa_pcm_set_config_param,
+ [XA_API_CMD_GET_CONFIG_PARAM] = xa_pcm_get_config_param,
+
+ [XA_API_CMD_EXECUTE] = xa_pcm_execute,
+ [XA_API_CMD_SET_INPUT_BYTES] = xa_pcm_set_input_bytes,
+ [XA_API_CMD_GET_OUTPUT_BYTES] = xa_pcm_get_output_bytes,
+ [XA_API_CMD_GET_CURIDX_INPUT_BUF] = xa_pcm_get_curidx_input_buf,
+ [XA_API_CMD_INPUT_OVER] = xa_pcm_input_over,
+
+ [XA_API_CMD_GET_MEMTABS_SIZE] = xa_pcm_get_memtabs_size,
+ [XA_API_CMD_GET_N_MEMTABS] = xa_pcm_get_n_memtabs,
+ [XA_API_CMD_GET_MEM_INFO_TYPE] = xa_pcm_get_mem_info_type,
+ [XA_API_CMD_GET_MEM_INFO_SIZE] = xa_pcm_get_mem_info_size,
+ [XA_API_CMD_GET_MEM_INFO_ALIGNMENT] = xa_pcm_get_mem_info_alignment,
+ [XA_API_CMD_SET_MEM_PTR] = xa_pcm_set_mem_ptr,
+};
+
+/* ...total numer of commands supported */
+#define XA_PCM_API_COMMANDS_NUM (sizeof(xa_pcm_api) / sizeof(xa_pcm_api[0]))
+
+/*******************************************************************************
+ * API entry point
+ ******************************************************************************/
+
+XA_ERRORCODE xa_pcm_codec(xa_codec_handle_t p_xa_module_obj, WORD32 i_cmd, WORD32 i_idx, pVOID pv_value)
+{
+ XAPcmCodec *d = (XAPcmCodec *) p_xa_module_obj;
+
+ /* ...check if command index is sane */
+ XF_CHK_ERR(i_cmd < XA_PCM_API_COMMANDS_NUM, XA_API_FATAL_INVALID_CMD);
+
+ /* ...see if command is defined */
+ XF_CHK_ERR(xa_pcm_api[i_cmd], XA_API_FATAL_INVALID_CMD);
+
+ /* ...execute requested command */
+ return xa_pcm_api[i_cmd](d, i_idx, pv_value);
+}
diff --git a/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a b/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a
new file mode 100644
index 00000000..cb284459
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/lib/hifi3/xa_vorbis_dec.a
Binary files differ
diff --git a/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/xa-vorbis-decoder.c b/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/xa-vorbis-decoder.c
new file mode 100644
index 00000000..43220ef3
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/xa-vorbis-decoder.c
@@ -0,0 +1,84 @@
+/*******************************************************************************
+* 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.
+
+******************************************************************************/
+
+/*******************************************************************************
+ * xa-vorbis-decoder.c
+ *
+ * VORBIS decoder plugin - thin wrapper around VORBISDEC library
+ *
+ ******************************************************************************/
+
+#define MODULE_TAG VORBISDEC
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include "xf-plugin.h"
+#include "audio/xa-audio-decoder-api.h"
+#include "xa_vorbis_dec_api.h"
+
+/*******************************************************************************
+ * Override GET-CONFIG-PARAM function
+ ******************************************************************************/
+
+static inline XA_ERRORCODE xa_vorbis_get_config_param(xa_codec_handle_t handle, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...translate "standard" parameter index into internal value */
+ switch (i_idx)
+ {
+ case XA_CODEC_CONFIG_PARAM_CHANNELS:
+ /* ...return number of output channels */
+ i_idx = XA_VORBISDEC_CONFIG_PARAM_NUM_CHANNELS;
+ break;
+
+ case XA_CODEC_CONFIG_PARAM_SAMPLE_RATE:
+ /* ...return output sampling frequency */
+ i_idx = XA_VORBISDEC_CONFIG_PARAM_SAMP_FREQ;
+ break;
+
+ case XA_CODEC_CONFIG_PARAM_PCM_WIDTH:
+ /* ...return sample bit-width */
+ i_idx = XA_VORBISDEC_CONFIG_PARAM_PCM_WDSZ;
+ break;
+ }
+
+ /* ...pass to library */
+ return xa_vorbis_dec(handle, XA_API_CMD_GET_CONFIG_PARAM, i_idx, pv_value);
+}
+
+/*******************************************************************************
+ * API entry point
+ ******************************************************************************/
+
+XA_ERRORCODE xa_vorbis_decoder(xa_codec_handle_t p_xa_module_obj, WORD32 i_cmd, WORD32 i_idx, pVOID pv_value)
+{
+ /* ...process common audio-decoder commands */
+ if (i_cmd == XA_API_CMD_GET_CONFIG_PARAM)
+ {
+ return xa_vorbis_get_config_param(p_xa_module_obj, i_idx, pv_value);
+ }
+ else
+ {
+ return xa_vorbis_dec(p_xa_module_obj, i_cmd, i_idx, pv_value);
+ }
+}
diff --git a/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/xa_vorbis_dec_api.h b/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/xa_vorbis_dec_api.h
new file mode 100644
index 00000000..f99660f8
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/plugins/cadence/vorbis_dec/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/release.txt b/hifi/xaf/release.txt
new file mode 100755
index 00000000..cebd1e24
--- /dev/null
+++ b/hifi/xaf/release.txt
@@ -0,0 +1,24 @@
+======================================================================
+Xtensa Audio Framework (XAF) - Hosted solution
+======================================================================
+
+======================================================================
+Revision History
+======================================================================
+
+Version 0.7_Alpha API 1.1 : April 17, 2018
+
++ Alpha Release
++ Built with RG.5 tools
+
++ Added copyrights for makefiles and assembly files.
++ Added float-print (%f) support in DSP trace logs.
+
+----------------------------------------------------------------------
+
+Version 0.6_Alpha API 1.1 : February 15, 2018
+
++ Alpha Release
++ Built with RG.5 tools
+
+----------------------------------------------------------------------