X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=o-du%2Fphy.git;a=blobdiff_plain;f=fhi_lib%2Flib%2Fsrc%2Fxran_common.h;h=07be798804edb078b166aa9abd0e7023fdf635d5;hp=ad17c1e219adb8e3352c133f0addd0414e870964;hb=cef07f74965b1749dd909fc1322e211489fea2ea;hpb=bc60e3a69129edf1c21a01683f84a77483f6e3cc diff --git a/fhi_lib/lib/src/xran_common.h b/fhi_lib/lib/src/xran_common.h index ad17c1e..07be798 100644 --- a/fhi_lib/lib/src/xran_common.h +++ b/fhi_lib/lib/src/xran_common.h @@ -16,7 +16,6 @@ * *******************************************************************************/ - /** * @brief XRAN layer common functionality for both lls-CU and RU as well as C-plane and * U-plane @@ -28,64 +27,50 @@ #ifndef _XRAN_COMMON_H_ #define _XRAN_COMMON_H_ +#ifdef __cplusplus +extern "C" { +#endif + #include #include +#include + #include #include #include -#include "xran_fh_lls_cu.h" +#include "xran_fh_o_du.h" #include "xran_pkt_up.h" +#include "xran_cp_api.h" + +#define O_DU 0 +#define O_RU 1 -#define APP_LLS_CU 0 -#define APP_RU 1 -#define NUM_OF_PRB_IN_FULL_BAND (66) #define N_SC_PER_PRB 12 +#define MAX_N_FULLBAND_SC 273 #define N_SYM_PER_SLOT 14 -#define N_FULLBAND_SC (NUM_OF_PRB_IN_FULL_BAND*N_SC_PER_PRB) -#define MAX_ANT_CARRIER_SUPPORTED 16 -/* 0.125, just for testing */ -#define SLOTNUM_PER_SUBFRAME 8 +#define SUBFRAME_DURATION_US 1000 +#define SLOTNUM_PER_SUBFRAME (SUBFRAME_DURATION_US/interval_us) #define SUBFRAMES_PER_SYSTEMFRAME 10 #define SLOTS_PER_SYSTEMFRAME (SLOTNUM_PER_SUBFRAME*SUBFRAMES_PER_SYSTEMFRAME) -#define PDSCH_PAYLOAD_SIZE (N_FULLBAND_SC*4) -#define NUM_OF_SLOT_IN_TDD_LOOP (80) -#define IQ_PLAYBACK_BUFFER_BYTES (NUM_OF_SLOT_IN_TDD_LOOP*N_SYM_PER_SLOT*N_FULLBAND_SC*4L) -/* PRACH data samples are 32 bits wide, 16bits for I and 16bits for Q. Each packet contains 839 samples. The payload length is 3356 octets.*/ -#define PRACH_PLAYBACK_BUFFER_BYTES (10*839*4L) +/* PRACH data samples are 32 bits wide, 16bits for I and 16bits for Q. Each packet contains 839 samples for long sequence or 144*14 (max) for short sequence. The payload length is 3356 octets.*/ +#define PRACH_PLAYBACK_BUFFER_BYTES (144*14*4L) -#define XRAN_MAX_NUM_SECTIONS (NUM_OF_PRB_IN_FULL_BAND) // TODO: need to decide proper value +#define XRAN_MAX_NUM_SECTIONS (N_SYM_PER_SLOT*2) /* just an example, no special meaning on this number */ + /* and this is the configuration of M-plane */ -#define XRAN_MAX_MBUF_LEN 9600 /**< jummbo frame */ -#define NSEC_PER_SEC 1000000000 +#define XRAN_MAX_MBUF_LEN 9600 /**< jumbo frame */ +#define NSEC_PER_SEC 1000000000L #define TIMER_RESOLUTION_CYCLES 1596*1 /* 1us */ #define XRAN_RING_SIZE 512 /*4*14*8 pow of 2 */ #define XRAN_NAME_MAX_LEN (64) #define XRAN_RING_NUM (3) -#define MAX_NUM_OF_XRAN_CTX (2) -#define XranIncrementCtx(ctx) ((ctx >= (MAX_NUM_OF_XRAN_CTX-1)) ? 0 : (ctx+1)) -#define XranDecrementCtx(ctx) ((ctx == 0) ? (MAX_NUM_OF_XRAN_CTX-1) : (ctx-1)) - #define XranDiffSymIdx(prevSymIdx, currSymIdx, numTotalSymIdx) ((prevSymIdx > currSymIdx) ? ((currSymIdx + numTotalSymIdx) - prevSymIdx) : (currSymIdx - prevSymIdx)) -#define XRAN_SYM_JOB_SIZE 512 - -struct send_symbol_cb_args -{ - struct rb_map *samp_buf; - uint8_t *symb_id; -}; - -struct pkt_dump -{ - int num_samp; - int num_bytes; - uint8_t symb; - struct ecpri_seq_id seq; -} __rte_packed; +#define XRAN_MLOG_VAR 0 /**< enable debug variables to mlog */ /* PRACH configuration table defines */ #define XRAN_PRACH_CANDIDATE_PREAMBLE (2) @@ -144,27 +129,30 @@ typedef struct uint8_t numSymbol; uint16_t timeOffset; int32_t freqOffset; + uint8_t nrofPrachInSlot; uint8_t occassionsInPrachSlot; uint8_t x; uint8_t y[XRAN_PRACH_CANDIDATE_Y]; uint8_t isPRACHslot[XRAN_PRACH_CANDIDATE_SLOT]; }xRANPrachCPConfigStruct; +#define XRAN_MAX_POOLS_PER_SECTOR_NR 3 /**< TX_OUT, RX_IN, PRACH_IN */ -typedef struct DeviceHandleInfo +typedef struct sectorHandleInfo { /**< Structure that contains the information to describe the * instance i.e service type, virtual function, package Id etc..*/ uint16_t nIndex; + uint16_t nXranPort; /* Unique ID of an handle shared between phy layer and library */ /**< number of antennas supported per link*/ uint32_t nBufferPoolIndex; /**< Buffer poolIndex*/ - struct rte_mempool * p_bufferPool[XRAN_MAX_SECTOR_NR]; - uint32_t bufferPoolElmSz[XRAN_MAX_SECTOR_NR]; - uint32_t bufferPoolNumElm[XRAN_MAX_SECTOR_NR]; + struct rte_mempool * p_bufferPool[XRAN_MAX_POOLS_PER_SECTOR_NR]; + uint32_t bufferPoolElmSz[XRAN_MAX_POOLS_PER_SECTOR_NR]; + uint32_t bufferPoolNumElm[XRAN_MAX_POOLS_PER_SECTOR_NR]; -}XranLibHandleInfoStruct; +}XranSectorHandleInfo, *PXranSectorHandleInfo; typedef void (*XranSymCallbackFn)(struct rte_timer *tim, void* arg); @@ -184,7 +172,7 @@ typedef struct { // -1 means that DL packet to be transmitted is not ready in BS int32_t nSegTransferred; // number of data segments has been transmitted or received struct rte_mbuf *pData[XRAN_N_MAX_BUFFER_SEGMENT]; // point to DPDK allocated memory pool - XRANBufferListStruct sBufferList; + struct xran_buffer_list sBufferList; } BbuIoBufCtrlStruct; struct xran_sym_job { @@ -194,37 +182,45 @@ struct xran_sym_job { #define XranIncrementJob(i) ((i >= (XRAN_SYM_JOB_SIZE-1)) ? 0 : (i+1)) -struct xran_lib_ctx +#define XRAN_MAX_PKT_BURST_PER_SYM 32 +#define XRAN_MAX_PACKET_FRAG 9 + +#define MBUF_TABLE_SIZE (2 * MAX(XRAN_MAX_PKT_BURST_PER_SYM, XRAN_MAX_PACKET_FRAG)) + +struct mbuf_table { + uint16_t len; + struct rte_mbuf *m_table[MBUF_TABLE_SIZE]; +}; + +struct xran_device_ctx { - uint8_t llscu_id; uint8_t sector_id; - XRANEAXCIDCONFIG eAxc_id_cfg; - XRANFHINIT xran_init_cfg; - XRANFHCONFIG xran_fh_cfg; - XranLibHandleInfoStruct* pDevHandle; + uint8_t xran_port_id; + struct xran_eaxcid_config eAxc_id_cfg; + struct xran_fh_init fh_init; + struct xran_fh_config fh_cfg; + uint32_t enablePrach; xRANPrachCPConfigStruct PrachCPConfig; uint32_t enableCP; - char ring_name[XRAN_RING_NUM][XRAN_MAX_SECTOR_NR][RTE_RING_NAMESIZE]; - struct rte_ring *dl_sym_idx_ring[XRAN_MAX_SECTOR_NR]; - struct rte_ring *xran2phy_ring[XRAN_MAX_SECTOR_NR]; - struct rte_ring *xran2prach_ring[XRAN_MAX_SECTOR_NR]; - - struct xran_sym_job sym_job[XRAN_SYM_JOB_SIZE]; - uint32_t sym_job_idx; + int32_t DynamicSectionEna; BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; + BbuIoBufCtrlStruct sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; + BbuIoBufCtrlStruct sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; /* buffers lists */ - XRANFlatBufferStruct sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - XRANFlatBufferStruct sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - XRANFlatBufferStruct sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + struct xran_flat_buffer sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + struct xran_flat_buffer sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + struct xran_flat_buffer sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + struct xran_flat_buffer sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + struct xran_flat_buffer sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - XranTransportBlockCallbackFn pCallback[XRAN_MAX_SECTOR_NR]; + xran_transport_callback_fn pCallback[XRAN_MAX_SECTOR_NR]; void *pCallbackTag[XRAN_MAX_SECTOR_NR]; - XranTransportBlockCallbackFn pPrachCallback[XRAN_MAX_SECTOR_NR]; + xran_transport_callback_fn pPrachCallback[XRAN_MAX_SECTOR_NR]; void *pPrachCallbackTag[XRAN_MAX_SECTOR_NR]; XranSymCallbackFn pSymCallback[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; @@ -233,21 +229,38 @@ struct xran_lib_ctx int32_t sym_up; /**< when we start sym 0 of up with respect to OTA time as measured in symbols */ int32_t sym_up_ul; - XRANFHTTIPROCCB ttiCb[XRAN_CB_MAX]; + xran_fh_tti_callback_fn ttiCb[XRAN_CB_MAX]; void *TtiCbParam[XRAN_CB_MAX]; uint32_t SkipTti[XRAN_CB_MAX]; int xran2phy_mem_ready; int rx_packet_symb_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + int rx_packet_prach_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; int rx_packet_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR]; + int rx_packet_prach_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR]; + int prach_start_symbol[XRAN_MAX_SECTOR_NR]; + int prach_last_symbol[XRAN_MAX_SECTOR_NR]; + int phy_tti_cb_done; + + struct rte_mempool *direct_pool; + struct rte_mempool *indirect_pool; + struct mbuf_table tx_mbufs[RTE_MAX_ETHPORTS]; + + struct xran_common_counters fh_counters; + + phy_encoder_poll_fn bbdev_enc; /**< call back to poll BBDev encoder */ + phy_decoder_poll_fn bbdev_dec; /**< call back to poll BBDev decoder */ }; +extern long rx_counter; +extern long tx_counter; + extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_fdd[XRAN_PRACH_CONFIG_TABLE_SIZE]; extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_tdd[XRAN_PRACH_CONFIG_TABLE_SIZE]; extern const xRANPrachConfigTableStruct gxranPrachDataTable_mmw[XRAN_PRACH_CONFIG_TABLE_SIZE]; -extern const xRANPrachPreambleLRAStruct gxranPreambleforLRA[XRAN_PRACH_PREAMBLE_FORMAT_OF_ABC]; +extern const xRANPrachPreambleLRAStruct gxranPreambleforLRA[13]; int process_mbuf(struct rte_mbuf *pkt); int process_ring(struct rte_ring *r); @@ -256,7 +269,9 @@ int packets_dump_thread(void *args); int send_symbol_ex(enum xran_pkt_dir direction, uint16_t section_id, + struct rte_mbuf *mb, struct rb_map *data, + const enum xran_input_byte_order iq_buf_byte_order, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, @@ -267,20 +282,35 @@ int send_symbol_ex(enum xran_pkt_dir direction, uint8_t RU_Port_ID, uint8_t seq_id); -int send_cpmsg_dlul(void *pHandle, enum xran_pkt_dir dir, - uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, - uint8_t startsym, uint8_t numsym, int prb_num, - uint16_t beam_id, uint8_t cc_id, uint8_t ru_port_id, - uint8_t seq_id); +int32_t prepare_symbol_ex(enum xran_pkt_dir direction, + uint16_t section_id, + struct rte_mbuf *mb, + struct rb_map *data, + const enum xran_input_byte_order iq_buf_byte_order, + uint8_t frame_id, + uint8_t subframe_id, + uint8_t slot_id, + uint8_t symbol_no, + int prb_start, + int prb_num, + uint8_t CC_ID, + uint8_t RU_Port_ID, + uint8_t seq_id, + uint32_t do_copy); -int send_cpmsg_prach(void *pHandle, - uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, - uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, - uint8_t seq_id); +int send_cpmsg(void *pHandle, struct rte_mbuf *mbuf,struct xran_cp_gen_params *params, + struct xran_section_gen_info *sect_geninfo, uint8_t cc_id, uint8_t ru_port_id, uint8_t seq_id); -uint8_t xran_get_max_sections(void *pHandle); +int generate_cpmsg_dlul(void *pHandle, struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, struct rte_mbuf *mbuf, + enum xran_pkt_dir dir, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, + uint8_t startsym, uint8_t numsym, uint16_t prb_start, uint16_t prb_num, + uint16_t beam_id, uint8_t cc_id, uint8_t ru_port_id, uint8_t comp_method, uint8_t seq_id, uint8_t symInc); -XRANEAXCIDCONFIG *xran_get_conf_eAxC(void *pHandle); +int generate_cpmsg_prach(void *pHandle, struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, struct rte_mbuf *mbuf, struct xran_device_ctx *pxran_lib_ctx, + uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, + uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, uint8_t seq_id); + +struct xran_eaxcid_config *xran_get_conf_eAxC(void *pHandle); uint8_t xran_get_conf_prach_scs(void *pHandle); uint8_t xran_get_conf_fftsize(void *pHandle); uint8_t xran_get_conf_numerology(void *pHandle); @@ -289,12 +319,16 @@ uint8_t xran_get_conf_compmethod(void *pHandle); uint8_t xran_get_num_cc(void *pHandle); uint8_t xran_get_num_eAxc(void *pHandle); -uint8_t xran_get_llscuid(void *pHandle); -uint8_t xran_get_sectorid(void *pHandle); -struct xran_lib_ctx *xran_lib_get_ctx(void); +struct xran_device_ctx *xran_dev_get_ctx(void); uint16_t xran_alloc_sectionid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id); uint8_t xran_get_seqid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id); +int32_t ring_processing_func(void); +int xran_init_prach(struct xran_fh_config* pConf, struct xran_device_ctx * p_xran_dev_ctx); + +#ifdef __cplusplus +} +#endif #endif