Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions ar_osal/src/linux/ar_osal_heap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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;
}
Expand Down
100 changes: 100 additions & 0 deletions gpr/platform/zephyr/gpr_init_zephyr_wrapper.c
Original file line number Diff line number Diff line change
@@ -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;
}
Loading