1 /******************************************************************************* 2 * Copyright (C) 2018 Cadence Design Systems, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 * "Software"), to use this Software with Cadence processor cores only and 7 * not with any other processors and platforms, subject to 8 * the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included 11 * in all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 15 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 16 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 17 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 19 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21 ******************************************************************************/ 22 23 /******************************************************************************* 24 * xf-main.c 25 * 26 * DSP processing framework main file 27 * 28 ******************************************************************************/ 29 30 #define MODULE_TAG MAIN 31 32 /******************************************************************************* 33 * Includes 34 ******************************************************************************/ 35 36 #include "xf.h" 37 #ifndef XAF_ENABLE_NON_HIKEY 38 volatile int waitstate; 39 #endif 40 41 #ifdef XAF_PROFILE_DSP 42 /* ... MCPS/profile info */ 43 #include "xa_profiler.h" 44 #endif 45 46 /******************************************************************************* 47 * Global data definition 48 ******************************************************************************/ 49 /* ...per-core execution data */ 50 xf_core_data_t xf_core_data[XF_CFG_CORES_NUM]; 51 52 /* ...AP-DSP shared memory pool */ 53 xf_mm_pool_t xf_ap_shmem_pool; 54 55 /* ...per-core local memory pool */ 56 xf_mm_pool_t xf_dsp_local_pool[XF_CFG_CORES_NUM]; 57 58 #if XF_CFG_CORES_NUM > 1 59 /* ...DSP cluster shared memory pool */ 60 xf_mm_pool_t xf_dsp_shmem_pool; 61 #endif 62 63 /* ...per-core shared memory with read-only access */ 64 __xf_core_ro_data_t xf_core_ro_data[XF_CFG_CORES_NUM]; 65 66 /* ...per-core shared memory with read-write access */ 67 __xf_core_rw_data_t xf_core_rw_data[XF_CFG_CORES_NUM]; 68 69 /******************************************************************************* 70 * Memory buffers - take them from linker file somehow - tbd 71 ******************************************************************************/ 72 73 /* ...unallocated memory region - AP-DSP shared memory buffer - export from linker somehow */ 74 //u8 xf_ap_shmem_buffer[XF_CFG_REMOTE_IPC_POOL_SIZE] __xf_shmem__; 75 76 #if XF_CFG_CORES_NUM > 1 77 /* ...unallocated DSP shared memory buffer */ 78 u8 xf_dsp_shmem_buffer[XF_CFG_LOCAL_IPC_POOL_SIZE] __xf_shmem__; 79 #endif 80 81 /* ...unallocated per-core local memory (in 32-byte chunks) */ 82 #ifdef XAF_ENABLE_NON_HIKEY 83 u8 xf_dsp_local_buffer[XF_CFG_CORES_NUM][XF_CFG_LOCAL_POOL_SIZE] __xf_mm__; 84 #else 85 u8 xf_dsp_local_buffer[XF_CFG_CORES_NUM][XF_CFG_LOCAL_POOL_SIZE]; 86 //u8 g_tmp[2]; 87 #endif 88 89 #ifdef XAF_PROFILE_DSP 90 xa_profiler prof; 91 #endif 92 93 /******************************************************************************* 94 * Timer interrupt - tbd 95 ******************************************************************************/ 96 97 /******************************************************************************* 98 * IPC layer initialization 99 ******************************************************************************/ 100 101 /* ...system-specific IPC layer initialization */ 102 int xf_ipc_init(u32 core) 103 { 104 xf_core_data_t *cd = XF_CORE_DATA(core); 105 xf_shmem_data_t *shmem = (xf_shmem_data_t *)XF_CFG_SHMEM_ADDRESS(core); 106 107 /* ...initialize pointer to shared memory */ 108 cd->shmem = (xf_shmem_handle_t *)shmem; 109 shmem->buffer = (uint8_t *) HIFI_MUSIC_DATA_LOCATION; 110 /* ...global memory pool initialization */ 111 #ifdef XAF_ENABLE_NON_HIKEY 112 XF_CHK_API(xf_mm_init(&cd->shared_pool, shmem->buffer, XF_CFG_REMOTE_IPC_POOL_SIZE)); 113 #else 114 XF_CHK_API(xf_mm_init(&cd->shared_pool, (void *) HIFI_MUSIC_DATA_LOCATION, XF_CFG_REMOTE_IPC_POOL_SIZE)); 115 #endif 116 return 0; 117 } 118 119 /******************************************************************************* 120 * Core executive loop 121 ******************************************************************************/ 122 123 static void xf_core_loop(u32 core) 124 { 125 /* ...initialize internal core structures */ 126 xf_core_init(core); 127 128 #ifdef XAF_PROFILE_DSP 129 /* Profiler initialization */ 130 INIT_XA_PROFILER(prof,"DSP core"); 131 #endif 132 133 for(;;) 134 { 135 /* ...wait in a low-power mode until event is triggered */ 136 xf_ipi_wait(core); 137 138 /* ...service core event */ 139 xf_core_service(core); 140 } 141 } 142 143 /******************************************************************************* 144 * Global entry point 145 ******************************************************************************/ 146 147 int main(void) 148 { 149 #if XF_CFG_CORES_NUM > 1 150 u32 i; 151 #endif 152 153 /* ...reset ro/rw core data - tbd */ 154 memset(xf_core_rw_data, 0, sizeof(xf_core_rw_data)); 155 memset(xf_core_ro_data, 0, sizeof(xf_core_ro_data)); 156 157 TRACE_INIT("Xtensa Audio DSP Codec Server"); 158 #ifdef XAF_ENABLE_NON_HIKEY 159 /* ...initialize board */ 160 xf_board_init(); 161 162 /* ...global framework data initialization */ 163 xf_global_init(); 164 #endif 165 166 #if XF_CFG_CORES_NUM > 1 167 /* ...DSP shared memory pool initialization */ 168 XF_CHK_API(xf_mm_init(&xf_dsp_shmem_pool, xf_dsp_shmem_buffer, XF_CFG_LOCAL_IPC_POOL_SIZE)); 169 #endif 170 171 /* ...initialize per-core memory loop */ 172 XF_CHK_API(xf_mm_init(&xf_core_data[0].local_pool, xf_dsp_local_buffer[0], XF_CFG_LOCAL_POOL_SIZE)); 173 174 #if XF_CFG_CORES_NUM > 1 175 /* ...bring up all cores */ 176 for (i = 1; i < XF_CFG_CORES_NUM; i++) 177 { 178 /* ...wake-up secondary core somehow and make it execute xf_core_loop */ 179 xf_core_secondary_startup(i, xf_core_loop, i); 180 181 } 182 #endif 183 184 /* ...enter execution loop on main core #0 */ 185 xf_core_loop(0); 186 187 /* ...not reachable */ 188 return 0; 189 } 190