/*******************************************************************************
* 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;
}
