/****************************************************************************** * * Copyright (c) 2019 Intel. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *******************************************************************************/ /** * * @file This file has definitions of Shared Memory interface functions between * FAPI and PHY. * **/ #ifndef _NR5G_FAPI_WLS_H_ #define _NR5G_FAPI_WLS_H_ #include "nr5g_fapi_std.h" #include "nr5g_fapi_common_types.h" #include "wls_lib.h" #include "gnb_l1_l2_api.h" typedef void *WLS_HANDLE; #define NUM_WLS_INSTANCES 2 #define NR5G_FAPI2PHY_WLS_INST 0 #define NR5G_FAPI2MAC_WLS_INST 1 #define MAX_NUM_LOCATIONS (16) #define MIN_DL_BUF_LOCATIONS (0) /* Used for stats collection 0-10 */ #define MAX_DL_BUF_LOCATIONS (MIN_DL_BUF_LOCATIONS + MAX_NUM_LOCATIONS) /* Used for stats collection 0-10 */ #define MIN_UL_BUF_LOCATIONS (MAX_DL_BUF_LOCATIONS) /* Used for stats collection 0-10 */ #define MAX_UL_BUF_LOCATIONS (MIN_UL_BUF_LOCATIONS + MAX_NUM_LOCATIONS) #define TO_FREE_SIZE ( 10 ) #define TOTAL_FREE_BLOCKS ( 50 * FAPI_MAX_PHY_INSTANCES) /* To hold both send and recv blocks on PHY side wls */ #define ALLOC_TRACK_SIZE ( 16384 ) #define MSG_MAXSIZE (16*16384 ) #define MEMORY_CORRUPTION_DETECT #define MEMORY_CORRUPTION_DETECT_FLAG (0xAB) typedef enum wls_fapi_free_list_e { WLS_FAPI_FREE_SEND_LIST = 0, WLS_FAPI_FREE_RECV_LIST } wls_fapi_free_list_t; typedef struct wls_fapi_mem_array { void **ppFreeBlock; void *pStorage; void *pEndOfStorage; uint32_t nBlockSize; uint32_t nBlockCount; } WLS_FAPI_MEM_STRUCT, *PWLS_FAPI_MEM_STRUCT; // WLS context structure typedef struct _nr5g_fapi_wls_context { void *shmem; // shared memory region. uint64_t shmem_size; // shared memory region size. WLS_FAPI_MEM_STRUCT sWlsStruct; WLS_HANDLE h_wls[NUM_WLS_INSTANCES]; // WLS context handle void *pWlsMemBase; uint32_t nTotalMemorySize; uint32_t nTotalBlocks; uint32_t nAllocBlocks; uint32_t nTotalAllocCnt; uint32_t nTotalFreeCnt; uint32_t nTotalUlBufAllocCnt; uint32_t nTotalUlBufFreeCnt; uint32_t nTotalDlBufAllocCnt[MAX_DL_BUF_LOCATIONS]; uint32_t nTotalDlBufFreeCnt[MAX_DL_BUF_LOCATIONS]; uint32_t nPartitionMemSize; void *pPartitionMemBase; volatile pthread_mutex_t fapi2phy_lock_send; volatile pthread_mutex_t fapi2phy_lock_alloc; volatile pthread_mutex_t fapi2mac_lock_send; volatile pthread_mutex_t fapi2mac_lock_alloc; } nr5g_fapi_wls_context_t, *p_nr5g_fapi_wls_context_t; extern nr5g_fapi_wls_context_t g_wls_ctx; inline p_nr5g_fapi_wls_context_t nr5g_fapi_wls_context( ); uint8_t nr5g_fapi_wls_init( ); uint8_t nr5g_fapi2Phy_wls_init( p_nr5g_fapi_wls_context_t p_wls); uint8_t nr5g_fapi_wls_destroy( WLS_HANDLE h_wls); void *wls_fapi_alloc_buffer( uint32_t size, uint32_t loc); void wls_fapi_free_buffer( void *pMsg, uint32_t loc); uint32_t wls_fapi_create_mem_array( PWLS_FAPI_MEM_STRUCT pMemArray, void *pMemArrayMemory, uint32_t totalSize, uint32_t nBlockSize); uint32_t wls_fapi_alloc_mem_array( PWLS_FAPI_MEM_STRUCT pMemArray, void **ppBlock); uint32_t wls_fapi_free_mem_array( PWLS_FAPI_MEM_STRUCT pMemArray, void *pBlock); uint64_t nr5g_fapi_wls_va_to_pa( WLS_HANDLE h_wls, void *ptr); void *nr5g_fapi_wls_pa_to_va( WLS_HANDLE h_wls, uint64_t ptr); uint8_t wls_fapi_add_blocks_to_ul( void); void nr5g_fapi_wls_show_data( void *ptr, uint32_t size); int32_t wls_fapi_sdu_zbc_block_add_to_free( void *pMsgHeaderHead, int count, uint64_t * pToFreeList); void wls_fapi_free_list_all( void); void nr5g_fapi_wls_print_stats( void); void wls_fapi_add_send_apis_to_free( PMAC2PHY_QUEUE_EL pListElem, uint32_t idx); void wls_fapi_free_send_free_list( uint32_t idx); void wls_fapi_add_recv_apis_to_free( PMAC2PHY_QUEUE_EL pListElem, uint32_t idx); void wls_fapi_free_recv_free_list( uint32_t idx); #endif /*_NR5G_FAPI_WLS_H_*/