diff --git a/ar_osal/src/linux/ar_osal_heap.c b/ar_osal/src/linux/ar_osal_heap.c index 37d2597..a37da1e 100644 --- a/ar_osal/src/linux/ar_osal_heap.c +++ b/ar_osal/src/linux/ar_osal_heap.c @@ -73,9 +73,33 @@ void* ar_heap_malloc(_In_ size_t bytes, _In_ par_heap_info heap_info) if (alignment < sizeof(void *)) { alignment = sizeof(void *); } + +#ifdef __ZEPHYR__ + char * ptr, *ptr2, *aligned_ptr; + uint32_t align_mask = ~(alignment - 1); + + /* allocate enough for requested bytes + alignment wasteage + 1 word for storing offset + * (which will be just before the aligned ptr) */ + ptr = (char *)malloc(bytes + alignment + sizeof(int)); + + if (ptr == NULL) + { + return (NULL); + } + + /* allocate enough for requested bytes + alignment wasteage + 1 word for storing offset */ + ptr2 = ptr + sizeof(int); + aligned_ptr = (char *)((uint32_t)(ptr2 - 1) & align_mask) + alignment; + + /* save offset to raw pointer from aligned pointer */ + ptr2 = aligned_ptr - sizeof(int); + *((int *)ptr2) = (int)(aligned_ptr - ptr); + pBuff = (aligned_ptr); +#else if (posix_memalign(&pBuff, alignment, bytes) != 0) { pBuff = NULL; } +#endif /* __ZEPHYR__ */ } end: @@ -117,7 +141,23 @@ _IRQL_requires_max_(DISPATCH_LEVEL) void ar_heap_free(_In_ void* heap_ptr, _In_ par_heap_info heap_info) { if (NULL != heap_ptr && NULL != heap_info) { +#ifdef __ZEPHYR__ + if (AR_HEAP_ALIGN_DEFAULT == heap_info->align_bytes) + { + free(heap_ptr); + } + else{ + uint32_t *pTemp = (uint32_t *)heap_ptr; + uint32_t *ptr2 = pTemp - 1; + + /* Get the base pointer address */ + pTemp -= *ptr2 / sizeof(uint32_t); + + free(pTemp); + } +#else free(heap_ptr); +#endif /* __ZEPHYR__ */ } return; } diff --git a/gpr/platform/zephyr/gpr_init_zephyr_wrapper.c b/gpr/platform/zephyr/gpr_init_zephyr_wrapper.c new file mode 100644 index 0000000..24269e4 --- /dev/null +++ b/gpr/platform/zephyr/gpr_init_zephyr_wrapper.c @@ -0,0 +1,100 @@ +/* + * gpr_init_lx_wrapper.c + * + * This file has implementation platform wrapper for the GPR datalink layer + * for Zephyr. + * + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "ar_msg.h" +#include "gpr_api_i.h" +#include "gpr_lx.h" + +#define GPR_NUM_PACKETS_TYPE 3 + +#define GPR_NUM_PACKETS_1 ( 100 ) +#define GPR_DRV_BYTES_PER_PACKET_1 ( 512 ) +#define GPR_NUM_PACKETS_2 ( 4 ) +#define GPR_DRV_BYTES_PER_PACKET_2 ( 4096 ) +#define GPR_NUM_PACKETS_3 ( 0 ) +#define GPR_DRV_BYTES_PER_PACKET_3 ( 65536 ) + +/***************************************************************************** + * Global variables * + ****************************************************************************/ +/* GPR IPC table containing init,deinit functions for datalink layers depending on +domains a given src domain wishes to establish a link with and the availability +of shared memory */ +struct ipc_dl_v2_t gpr_lx_ipc_dl_table[GPR_PL_NUM_TOTAL_DOMAINS_V]; + +struct gpr_packet_pool_info_v2_t gpr_lx_packet_pool_table[GPR_NUM_PACKETS_TYPE]={ + { GPR_HEAP_INDEX_DEFAULT, 0, 0, GPR_NUM_PACKETS_1, GPR_DRV_BYTES_PER_PACKET_1}, + { GPR_HEAP_INDEX_DEFAULT, 0, 0, GPR_NUM_PACKETS_2, GPR_DRV_BYTES_PER_PACKET_2}, + { GPR_HEAP_INDEX_DEFAULT, 1, 0, GPR_NUM_PACKETS_3, GPR_DRV_BYTES_PER_PACKET_3}, +}; + +uint32_t num_domains = 0; + +/***************************************************************************** + * Local function definitions * + ****************************************************************************/ + +GPR_INTERNAL uint32_t gpr_drv_init(void) +{ + AR_MSG(DBG_HIGH_PRIO,"GPR INIT START"); + uint32_t rc, domain_id; + uint32_t num_packet_pools = + sizeof(gpr_lx_packet_pool_table)/sizeof(gpr_packet_pool_info_v2_t); + + /* Reset to 0 to avoid wrong value when gpr_drv_init called multiple times due to failure */ + num_domains = 0; + memset(&gpr_lx_ipc_dl_table[0], 0, (sizeof(struct ipc_dl_v2_t) * GPR_PL_NUM_TOTAL_DOMAINS_V)); + + gpr_lx_ipc_dl_table[num_domains].domain_id = GPR_IDS_DOMAIN_ID_APPS_V; + gpr_lx_ipc_dl_table[num_domains].init_fn = ipc_dl_lx_init; + gpr_lx_ipc_dl_table[num_domains].deinit_fn = ipc_dl_lx_deinit; + gpr_lx_ipc_dl_table[num_domains].supports_shared_mem = TRUE; + + num_domains++; + + gpr_lx_ipc_dl_table[num_domains].domain_id = GPR_IDS_DOMAIN_ID_ADSP_V; + gpr_lx_ipc_dl_table[num_domains].init_fn = ipc_dl_local_init; + gpr_lx_ipc_dl_table[num_domains].deinit_fn = ipc_dl_local_deinit; + gpr_lx_ipc_dl_table[num_domains].supports_shared_mem = TRUE; + + num_domains++; + domain_id = GPR_IDS_DOMAIN_ID_ADSP_V; + rc = gpr_drv_internal_init_v2(domain_id, + num_domains, + gpr_lx_ipc_dl_table, + num_packet_pools, + gpr_lx_packet_pool_table); + AR_MSG(DBG_HIGH_PRIO, "GPR INIT EXIT"); + return rc; +} + +GPR_INTERNAL uint32_t gpr_drv_init_domain(uint32_t domain_id) +{ + AR_MSG(DBG_HIGH_PRIO, "GPR INIT START, for domain id %d", domain_id); + uint32_t rc; + uint32_t num_packet_pools = + sizeof(gpr_lx_packet_pool_table)/sizeof(gpr_packet_pool_info_v2_t); + + memset(&gpr_lx_ipc_dl_table[0], 0, (sizeof(struct ipc_dl_v2_t) * GPR_PL_NUM_TOTAL_DOMAINS_V)); + + gpr_lx_ipc_dl_table[num_domains].domain_id = domain_id; + gpr_lx_ipc_dl_table[num_domains].init_fn = ipc_dl_local_init; + gpr_lx_ipc_dl_table[num_domains].deinit_fn = ipc_dl_local_deinit; + gpr_lx_ipc_dl_table[num_domains].supports_shared_mem = TRUE; + + num_domains++; + + rc = gpr_drv_internal_init_v2(domain_id, + num_domains, + gpr_lx_ipc_dl_table, + num_packet_pools, + gpr_lx_packet_pool_table); + AR_MSG(DBG_HIGH_PRIO, "GPR INIT EXIT"); + return rc; +} \ No newline at end of file