hikey960: HiFi3 DSP firmware and documentation

HiFi3 DSP firmware source code, documentation to build and understand DSP

Change-Id: I752416536cc2165868c56d2a2ba2d60b71c2b9a4
Signed-off-by: Niranjan Yadla <nyadla@cadence.com>
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 0000000..252044d
--- /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 */