1 /******************************************************************************
\r
3 * Copyright (c) 2019 Intel.
\r
5 * Licensed under the Apache License, Version 2.0 (the "License");
\r
6 * you may not use this file except in compliance with the License.
\r
7 * You may obtain a copy of the License at
\r
9 * http://www.apache.org/licenses/LICENSE-2.0
\r
11 * Unless required by applicable law or agreed to in writing, software
\r
12 * distributed under the License is distributed on an "AS IS" BASIS,
\r
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
14 * See the License for the specific language governing permissions and
\r
15 * limitations under the License.
\r
17 *******************************************************************************/
\r
20 * @brief XRAN layer common functionality for both lls-CU and RU as well as C-plane and
\r
22 * @file xran_common.h
\r
23 * @ingroup group_source_xran
\r
24 * @author Intel Corporation
\r
27 #ifndef _XRAN_COMMON_H_
\r
28 #define _XRAN_COMMON_H_
\r
36 #include <sys/param.h>
\r
37 #include <sys/queue.h>
\r
39 #include <rte_common.h>
\r
40 #include <rte_mbuf.h>
\r
41 #include <rte_timer.h>
\r
43 #include "xran_fh_o_du.h"
\r
44 #include "xran_pkt_up.h"
\r
45 #include "xran_cp_api.h"
\r
50 #define N_SC_PER_PRB 12
\r
51 #define MAX_N_FULLBAND_SC 273
\r
52 #define N_SYM_PER_SLOT 14
\r
53 #define SUBFRAME_DURATION_US 1000
\r
54 #define SLOTNUM_PER_SUBFRAME (SUBFRAME_DURATION_US/interval_us)
\r
55 #define SUBFRAMES_PER_SYSTEMFRAME 10
\r
56 #define SLOTS_PER_SYSTEMFRAME (SLOTNUM_PER_SUBFRAME*SUBFRAMES_PER_SYSTEMFRAME)
\r
58 /* 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.*/
\r
59 #define PRACH_PLAYBACK_BUFFER_BYTES (144*14*4L)
\r
61 #define PRACH_SRS_BUFFER_BYTES (144*14*4L)
\r
63 /**< this is the configuration of M-plane */
\r
64 #define XRAN_MAX_NUM_SECTIONS (N_SYM_PER_SLOT* (XRAN_MAX_ANTENNA_NR*2) + XRAN_MAX_ANT_ARRAY_ELM_NR)
\r
66 #define XRAN_MAX_MBUF_LEN 9600 /**< jumbo frame */
\r
67 #define NSEC_PER_SEC 1000000000L
\r
68 #define TIMER_RESOLUTION_CYCLES 1596*1 /* 1us */
\r
69 #define XRAN_RING_SIZE 512 /*4*14*8 pow of 2 */
\r
70 #define XRAN_NAME_MAX_LEN (64)
\r
71 #define XRAN_RING_NUM (3)
\r
73 #define XranDiffSymIdx(prevSymIdx, currSymIdx, numTotalSymIdx) ((prevSymIdx > currSymIdx) ? ((currSymIdx + numTotalSymIdx) - prevSymIdx) : (currSymIdx - prevSymIdx))
\r
75 #define XRAN_MLOG_VAR 0 /**< enable debug variables to mlog */
\r
77 /* PRACH configuration table defines */
\r
78 #define XRAN_PRACH_CANDIDATE_PREAMBLE (2)
\r
79 #define XRAN_PRACH_CANDIDATE_Y (2)
\r
80 #define XRAN_PRACH_CANDIDATE_SLOT (40)
\r
81 #define XRAN_PRACH_CONFIG_TABLE_SIZE (256)
\r
82 #define XRAN_PRACH_PREAMBLE_FORMAT_OF_ABC (9)
\r
99 }PreambleFormatEnum;
\r
101 /* add PRACH used config table, same structure as used in refPHY */
\r
104 uint8_t prachConfigIdx;
\r
105 uint8_t preambleFmrt[XRAN_PRACH_CANDIDATE_PREAMBLE];
\r
107 uint8_t y[XRAN_PRACH_CANDIDATE_Y];
\r
108 uint8_t slotNr[XRAN_PRACH_CANDIDATE_SLOT];
\r
110 uint8_t startingSym;
\r
111 uint8_t nrofPrachInSlot;
\r
112 uint8_t occassionsInPrachSlot;
\r
114 } xRANPrachConfigTableStruct;
\r
118 uint8_t preambleFmrt;
\r
123 }xRANPrachPreambleLRAStruct;
\r
125 struct xran_prach_cp_config
\r
128 uint8_t startSymId;
\r
129 uint16_t startPrbc;
\r
132 uint16_t timeOffset;
\r
133 int32_t freqOffset;
\r
134 uint8_t nrofPrachInSlot;
\r
135 uint8_t occassionsInPrachSlot;
\r
137 uint8_t y[XRAN_PRACH_CANDIDATE_Y];
\r
138 uint8_t isPRACHslot[XRAN_PRACH_CANDIDATE_SLOT];
\r
139 uint8_t eAxC_offset; /**< starting eAxC for PRACH stream */
\r
142 #define XRAN_MAX_POOLS_PER_SECTOR_NR 8 /**< 2x(TX_OUT, RX_IN, PRACH_IN, SRS_IN) with C-plane */
\r
144 typedef struct sectorHandleInfo
\r
146 /**< Structure that contains the information to describe the
\r
147 * instance i.e service type, virtual function, package Id etc..*/
\r
149 uint16_t nXranPort;
\r
150 /* Unique ID of an handle shared between phy layer and library */
\r
151 /**< number of antennas supported per link*/
\r
152 uint32_t nBufferPoolIndex;
\r
153 /**< Buffer poolIndex*/
\r
154 struct rte_mempool * p_bufferPool[XRAN_MAX_POOLS_PER_SECTOR_NR];
\r
155 uint32_t bufferPoolElmSz[XRAN_MAX_POOLS_PER_SECTOR_NR];
\r
156 uint32_t bufferPoolNumElm[XRAN_MAX_POOLS_PER_SECTOR_NR];
\r
158 }XranSectorHandleInfo, *PXranSectorHandleInfo;
\r
160 typedef void (*XranSymCallbackFn)(struct rte_timer *tim, void* arg);
\r
162 struct cb_elem_entry{
\r
163 XranSymCallbackFn pSymCallback;
\r
164 void *pSymCallbackTag;
\r
165 LIST_ENTRY(cb_elem_entry) pointers;
\r
168 /* Callback function to send mbuf to the ring */
\r
169 typedef int (*xran_ethdi_mbuf_send_fn)(struct rte_mbuf *mb, uint16_t ethertype);
\r
172 * manage one cell's all Ethernet frames for one DL or UL LTE subframe
\r
175 /* -1-this subframe is not used in current frame format
\r
176 0-this subframe can be transmitted, i.e., data is ready
\r
177 1-this subframe is waiting transmission, i.e., data is not ready
\r
178 10 - DL transmission missing deadline. When FE needs this subframe data but bValid is still 1,
\r
181 int32_t bValid ; // when UL rx, it is subframe index.
\r
182 int32_t nSegToBeGen;
\r
183 int32_t nSegGenerated; // how many date segment are generated by DL LTE processing or received from FE
\r
184 // -1 means that DL packet to be transmitted is not ready in BS
\r
185 int32_t nSegTransferred; // number of data segments has been transmitted or received
\r
186 struct rte_mbuf *pData[XRAN_N_MAX_BUFFER_SEGMENT]; // point to DPDK allocated memory pool
\r
187 struct xran_buffer_list sBufferList;
\r
188 } BbuIoBufCtrlStruct;
\r
191 #define XranIncrementJob(i) ((i >= (XRAN_SYM_JOB_SIZE-1)) ? 0 : (i+1))
\r
193 #define XRAN_MAX_PKT_BURST_PER_SYM 32
\r
194 #define XRAN_MAX_PACKET_FRAG 9
\r
196 #define MBUF_TABLE_SIZE (2 * MAX(XRAN_MAX_PKT_BURST_PER_SYM, XRAN_MAX_PACKET_FRAG))
\r
198 struct mbuf_table {
\r
200 struct rte_mbuf *m_table[MBUF_TABLE_SIZE];
\r
203 struct xran_device_ctx
\r
206 uint8_t xran_port_id;
\r
207 struct xran_eaxcid_config eAxc_id_cfg;
\r
208 struct xran_fh_init fh_init;
\r
209 struct xran_fh_config fh_cfg;
\r
210 struct xran_prach_cp_config PrachCPConfig;
\r
212 uint32_t enablePrach;
\r
215 int32_t DynamicSectionEna;
\r
216 int64_t offset_sec;
\r
217 int64_t offset_nsec; //offset to GPS time calcuated based on alpha and beta
\r
219 uint32_t enableSrs;
\r
220 struct xran_srs_config srs_cfg; /** configuration of SRS */
\r
222 BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
\r
223 BbuIoBufCtrlStruct sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
\r
224 BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
\r
225 BbuIoBufCtrlStruct sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
\r
226 BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
\r
227 BbuIoBufCtrlStruct sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR];
\r
229 /* buffers lists */
\r
230 struct xran_flat_buffer sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
231 struct xran_flat_buffer sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
232 struct xran_flat_buffer sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
233 struct xran_flat_buffer sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
234 struct xran_flat_buffer sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
236 struct xran_flat_buffer sFHSrsRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR][XRAN_MAX_NUM_OF_SRS_SYMBOL_PER_SLOT];
\r
238 xran_transport_callback_fn pCallback[XRAN_MAX_SECTOR_NR];
\r
239 void *pCallbackTag[XRAN_MAX_SECTOR_NR];
\r
241 xran_transport_callback_fn pPrachCallback[XRAN_MAX_SECTOR_NR];
\r
242 void *pPrachCallbackTag[XRAN_MAX_SECTOR_NR];
\r
244 xran_transport_callback_fn pSrsCallback[XRAN_MAX_SECTOR_NR];
\r
245 void *pSrsCallbackTag[XRAN_MAX_SECTOR_NR];
\r
247 LIST_HEAD(sym_cb_elem_list, cb_elem_entry) sym_cb_list_head[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
249 int32_t sym_up; /**< when we start sym 0 of up with respect to OTA time as measured in symbols */
\r
252 xran_fh_tti_callback_fn ttiCb[XRAN_CB_MAX];
\r
253 void *TtiCbParam[XRAN_CB_MAX];
\r
254 uint32_t SkipTti[XRAN_CB_MAX];
\r
256 int xran2phy_mem_ready;
\r
258 int rx_packet_symb_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
259 int rx_packet_prach_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
\r
260 int rx_packet_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR];
\r
261 int rx_packet_prach_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR];
\r
262 int prach_start_symbol[XRAN_MAX_SECTOR_NR];
\r
263 int prach_last_symbol[XRAN_MAX_SECTOR_NR];
\r
265 int phy_tti_cb_done;
\r
267 struct rte_mempool *direct_pool;
\r
268 struct rte_mempool *indirect_pool;
\r
269 struct mbuf_table tx_mbufs[RTE_MAX_ETHPORTS];
\r
271 struct xran_common_counters fh_counters;
\r
273 phy_encoder_poll_fn bbdev_enc; /**< call back to poll BBDev encoder */
\r
274 phy_decoder_poll_fn bbdev_dec; /**< call back to poll BBDev decoder */
\r
276 xran_ethdi_mbuf_send_fn send_cpmbuf2ring; /**< callback to send mbufs of C-Plane packets to the ring */
\r
277 xran_ethdi_mbuf_send_fn send_upmbuf2ring; /**< callback to send mbufs of U-Plane packets to the ring */
\r
280 extern long rx_counter;
\r
281 extern long tx_counter;
\r
282 extern long tx_bytes_counter;
\r
283 extern long rx_bytes_counter;
\r
284 extern long tx_bytes_per_sec;
\r
285 extern long rx_bytes_per_sec;
\r
288 extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_fdd[XRAN_PRACH_CONFIG_TABLE_SIZE];
\r
289 extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_tdd[XRAN_PRACH_CONFIG_TABLE_SIZE];
\r
290 extern const xRANPrachConfigTableStruct gxranPrachDataTable_mmw[XRAN_PRACH_CONFIG_TABLE_SIZE];
\r
291 extern const xRANPrachPreambleLRAStruct gxranPreambleforLRA[13];
\r
293 int process_mbuf(struct rte_mbuf *pkt);
\r
294 int process_ring(struct rte_ring *r);
\r
295 int ring_processing_thread(void *args);
\r
296 int packets_dump_thread(void *args);
\r
298 int send_symbol_ex(enum xran_pkt_dir direction,
\r
299 uint16_t section_id,
\r
300 struct rte_mbuf *mb,
\r
301 struct rb_map *data,
\r
302 const enum xran_input_byte_order iq_buf_byte_order,
\r
304 uint8_t subframe_id,
\r
310 uint8_t RU_Port_ID,
\r
313 int32_t prepare_symbol_ex(enum xran_pkt_dir direction,
\r
314 uint16_t section_id,
\r
315 struct rte_mbuf *mb,
\r
316 struct rb_map *data,
\r
319 const enum xran_input_byte_order iq_buf_byte_order,
\r
321 uint8_t subframe_id,
\r
327 uint8_t RU_Port_ID,
\r
331 int send_cpmsg(void *pHandle, struct rte_mbuf *mbuf,struct xran_cp_gen_params *params,
\r
332 struct xran_section_gen_info *sect_geninfo, uint8_t cc_id, uint8_t ru_port_id, uint8_t seq_id);
\r
334 int32_t generate_cpmsg_dlul(void *pHandle, struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, struct rte_mbuf *mbuf,
\r
335 enum xran_pkt_dir dir, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id,
\r
336 uint8_t startsym, uint8_t numsym, uint16_t prb_start, uint16_t prb_num,int16_t iq_buffer_offset, int16_t iq_buffer_len,
\r
337 uint16_t beam_id, uint8_t cc_id, uint8_t ru_port_id, uint8_t comp_method, uint8_t iqWidth, uint8_t seq_id, uint8_t symInc);
\r
339 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,
\r
340 uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id,
\r
341 uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, uint8_t seq_id);
\r
343 struct xran_eaxcid_config *xran_get_conf_eAxC(void *pHandle);
\r
344 uint8_t xran_get_conf_prach_scs(void *pHandle);
\r
345 uint8_t xran_get_conf_fftsize(void *pHandle);
\r
346 uint8_t xran_get_conf_numerology(void *pHandle);
\r
347 uint8_t xran_get_conf_iqwidth(void *pHandle);
\r
348 uint8_t xran_get_conf_compmethod(void *pHandle);
\r
349 uint8_t xran_get_conf_num_bfweights(void *pHandle);
\r
351 uint8_t xran_get_num_cc(void *pHandle);
\r
352 uint8_t xran_get_num_eAxc(void *pHandle);
\r
353 uint8_t xran_get_num_eAxcUl(void *pHandle);
\r
354 uint8_t xran_get_num_ant_elm(void *pHandle);
\r
355 enum xran_category xran_get_ru_category(void *pHandle);
\r
357 struct xran_device_ctx *xran_dev_get_ctx(void);
\r
359 int xran_register_cb_mbuf2ring(xran_ethdi_mbuf_send_fn mbuf_send_cp, xran_ethdi_mbuf_send_fn mbuf_send_up);
\r
361 uint16_t xran_alloc_sectionid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id);
\r
362 uint8_t xran_get_seqid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id);
\r
363 int32_t ring_processing_func(void);
\r
364 int xran_init_prach(struct xran_fh_config* pConf, struct xran_device_ctx * p_xran_dev_ctx);
\r
365 void xran_updateSfnSecStart(void);
\r
367 struct cb_elem_entry *xran_create_cb(XranSymCallbackFn cb_fn, void *cb_data);
\r
368 int xran_destroy_cb(struct cb_elem_entry * cb_elm);
\r