6aa07b5f50c545bbd43ded5715181bc544451799
[o-du/phy.git] / fhi_lib / lib / src / xran_common.h
1 /******************************************************************************\r
2 *\r
3 *   Copyright (c) 2019 Intel.\r
4 *\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
8 *\r
9 *       http://www.apache.org/licenses/LICENSE-2.0\r
10 *\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
16 *\r
17 *******************************************************************************/\r
18 \r
19 /**\r
20  * @brief XRAN layer common functionality for both lls-CU and RU as well as C-plane and\r
21  *    U-plane\r
22  * @file xran_common.h\r
23  * @ingroup group_source_xran\r
24  * @author Intel Corporation\r
25  **/\r
26 \r
27 #ifndef _XRAN_COMMON_H_\r
28 #define _XRAN_COMMON_H_\r
29 \r
30 #ifdef __cplusplus\r
31 extern "C" {\r
32 #endif\r
33 \r
34 #include <stdio.h>\r
35 #include <unistd.h>\r
36 #include <sys/param.h>\r
37 #include <sys/queue.h>\r
38 \r
39 #include <rte_common.h>\r
40 #include <rte_mbuf.h>\r
41 #include <rte_timer.h>\r
42 \r
43 #include "xran_fh_o_du.h"\r
44 #include "xran_pkt_up.h"\r
45 #include "xran_cp_api.h"\r
46 \r
47 #define O_DU 0\r
48 #define O_RU 1\r
49 \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
57 \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
60 \r
61 #define PRACH_SRS_BUFFER_BYTES (144*14*4L)\r
62 \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
65 \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
72 \r
73 #define XranDiffSymIdx(prevSymIdx, currSymIdx, numTotalSymIdx)  ((prevSymIdx > currSymIdx) ? ((currSymIdx + numTotalSymIdx) - prevSymIdx) : (currSymIdx - prevSymIdx))\r
74 \r
75 #define XRAN_MLOG_VAR 0 /**< enable debug variables to mlog */\r
76 \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
83 typedef enum\r
84 {\r
85     FORMAT_0 = 0,\r
86     FORMAT_1,\r
87     FORMAT_2,\r
88     FORMAT_3,\r
89     FORMAT_A1,\r
90     FORMAT_A2,\r
91     FORMAT_A3,\r
92     FORMAT_B1,\r
93     FORMAT_B2,\r
94     FORMAT_B3,\r
95     FORMAT_B4,\r
96     FORMAT_C0,\r
97     FORMAT_C2,\r
98     FORMAT_LAST\r
99 }PreambleFormatEnum;\r
100 \r
101 /* add PRACH used config table, same structure as used in refPHY */\r
102 typedef struct\r
103 {\r
104     uint8_t     prachConfigIdx;\r
105     uint8_t     preambleFmrt[XRAN_PRACH_CANDIDATE_PREAMBLE];\r
106     uint8_t     x;\r
107     uint8_t     y[XRAN_PRACH_CANDIDATE_Y];\r
108     uint8_t     slotNr[XRAN_PRACH_CANDIDATE_SLOT];\r
109     uint8_t     slotNrNum;\r
110     uint8_t     startingSym;\r
111     uint8_t     nrofPrachInSlot;\r
112     uint8_t     occassionsInPrachSlot;\r
113     uint8_t     duration;\r
114 } xRANPrachConfigTableStruct;\r
115 \r
116 typedef struct\r
117 {\r
118     uint8_t    preambleFmrt;\r
119     uint16_t   lRALen;\r
120     uint8_t    fRA;\r
121     uint32_t    nu;\r
122     uint16_t   nRaCp;\r
123 }xRANPrachPreambleLRAStruct;\r
124 \r
125 struct xran_prach_cp_config\r
126 {\r
127     uint8_t    filterIdx;\r
128     uint8_t    startSymId;\r
129     uint16_t   startPrbc;\r
130     uint8_t    numPrbc;\r
131     uint8_t    numSymbol;\r
132     uint16_t   timeOffset;\r
133     int32_t    freqOffset;\r
134     uint8_t    nrofPrachInSlot;\r
135     uint8_t    occassionsInPrachSlot;\r
136     uint8_t    x;\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
140 };\r
141 \r
142 #define XRAN_MAX_POOLS_PER_SECTOR_NR 8 /**< 2x(TX_OUT, RX_IN, PRACH_IN, SRS_IN) with C-plane */\r
143 \r
144 typedef struct sectorHandleInfo\r
145 {\r
146     /**< Structure that contains the information to describe the\r
147      * instance i.e service type, virtual function, package Id etc..*/\r
148     uint16_t nIndex;\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
157 \r
158 }XranSectorHandleInfo, *PXranSectorHandleInfo;\r
159 \r
160 typedef void (*XranSymCallbackFn)(struct rte_timer *tim, void* arg);\r
161 \r
162 struct cb_elem_entry{\r
163     XranSymCallbackFn pSymCallback;\r
164     void *pSymCallbackTag;\r
165     LIST_ENTRY(cb_elem_entry) pointers;\r
166 };\r
167 \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
170 \r
171 /*\r
172  * manage one cell's all Ethernet frames for one DL or UL LTE subframe\r
173  */\r
174 typedef struct {\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
179         set bValid to 10.\r
180     */\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
189 \r
190 \r
191 #define XranIncrementJob(i)                  ((i >= (XRAN_SYM_JOB_SIZE-1)) ? 0 : (i+1))\r
192 \r
193 #define XRAN_MAX_PKT_BURST_PER_SYM 32\r
194 #define XRAN_MAX_PACKET_FRAG 9\r
195 \r
196 #define MBUF_TABLE_SIZE  (2 * MAX(XRAN_MAX_PKT_BURST_PER_SYM, XRAN_MAX_PACKET_FRAG))\r
197 \r
198 struct mbuf_table {\r
199         uint16_t len;\r
200         struct rte_mbuf *m_table[MBUF_TABLE_SIZE];\r
201 };\r
202 \r
203 struct xran_device_ctx\r
204 {\r
205     uint8_t sector_id;\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
211 \r
212     uint32_t enablePrach;\r
213     uint32_t enableCP;\r
214 \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
218 \r
219     uint32_t enableSrs;\r
220     struct xran_srs_config srs_cfg; /** configuration of SRS */\r
221 \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
228 \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
235 \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
237 \r
238     xran_transport_callback_fn pCallback[XRAN_MAX_SECTOR_NR];\r
239     void *pCallbackTag[XRAN_MAX_SECTOR_NR];\r
240 \r
241     xran_transport_callback_fn pPrachCallback[XRAN_MAX_SECTOR_NR];\r
242     void *pPrachCallbackTag[XRAN_MAX_SECTOR_NR];\r
243 \r
244     xran_transport_callback_fn pSrsCallback[XRAN_MAX_SECTOR_NR];\r
245     void *pSrsCallbackTag[XRAN_MAX_SECTOR_NR];\r
246 \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
248 \r
249     int32_t sym_up; /**< when we start sym 0 of up with respect to OTA time as measured in symbols */\r
250     int32_t sym_up_ul;\r
251 \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
255 \r
256     int xran2phy_mem_ready;\r
257 \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
264 \r
265     int phy_tti_cb_done;\r
266 \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
270 \r
271     struct xran_common_counters fh_counters;\r
272 \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
275 \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
278 };\r
279 \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
286 \r
287 \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
292 \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
297 \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
303                 uint8_t frame_id,\r
304                 uint8_t subframe_id,\r
305                 uint8_t slot_id,\r
306                 uint8_t symbol_no,\r
307                 int prb_start,\r
308                 int prb_num,\r
309                 uint8_t CC_ID,\r
310                 uint8_t RU_Port_ID,\r
311                 uint8_t seq_id);\r
312 \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
317                 uint8_t     compMeth,\r
318                 uint8_t     iqWidth,\r
319                 const enum xran_input_byte_order iq_buf_byte_order,\r
320                 uint8_t frame_id,\r
321                 uint8_t subframe_id,\r
322                 uint8_t slot_id,\r
323                 uint8_t symbol_no,\r
324                 int prb_start,\r
325                 int prb_num,\r
326                 uint8_t CC_ID,\r
327                 uint8_t RU_Port_ID,\r
328                 uint8_t seq_id,\r
329                 uint32_t do_copy);\r
330 \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
333 \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
338 \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
342 \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
350 \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
356 \r
357 struct xran_device_ctx *xran_dev_get_ctx(void);\r
358 \r
359 int xran_register_cb_mbuf2ring(xran_ethdi_mbuf_send_fn mbuf_send_cp, xran_ethdi_mbuf_send_fn mbuf_send_up);\r
360 \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
366 \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
369 \r
370 #ifdef __cplusplus\r
371 }\r
372 #endif\r
373 \r
374 #endif\r
375 \r