C++程序  |  190行  |  6.29 KB

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