diff options
Diffstat (limited to 'hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c')
-rw-r--r-- | hifi/xaf/hifi-dpf/ipc/xt-shmem/xf-main.c | 189 |
1 files changed, 189 insertions, 0 deletions
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..dd52bd27 --- /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 main core #0 */ + xf_core_loop(0); + + /* ...not reachable */ + return 0; +} |