d5d58bf68a61c2d1052a09c97752b245e047f63c
[o-du/phy.git] / fhi_lib / lib / src / xran_common.h
1 /******************************************************************************
2 *
3 *   Copyright (c) 2019 Intel.
4 *
5 *   Licensed under the Apache License, Version 2.0 (the "License");
6 *   you may not use this file except in compliance with the License.
7 *   You may obtain a copy of the License at
8 *
9 *       http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *   Unless required by applicable law or agreed to in writing, software
12 *   distributed under the License is distributed on an "AS IS" BASIS,
13 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *   See the License for the specific language governing permissions and
15 *   limitations under the License.
16 *
17 *******************************************************************************/
18
19 /**
20  * @brief XRAN layer common functionality for both lls-CU and RU as well as C-plane and
21  *    U-plane
22  * @file xran_common.h
23  * @ingroup group_source_xran
24  * @author Intel Corporation
25  **/
26
27 #ifndef _XRAN_COMMON_H_
28 #define _XRAN_COMMON_H_
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #include <stdio.h>
35 #include <unistd.h>
36 #include <sys/param.h>
37 #include <sys/queue.h>
38
39 #include <rte_common.h>
40 #include <rte_mbuf.h>
41 #include <rte_timer.h>
42
43 #include "xran_fh_o_du.h"
44 #include "xran_pkt_up.h"
45 #include "xran_cp_api.h"
46
47 #define O_DU 0
48 #define O_RU 1
49
50 #define N_SC_PER_PRB 12
51 #define MAX_N_FULLBAND_SC 273
52 #define N_SYM_PER_SLOT 14
53 #define SUBFRAME_DURATION_US 1000
54 #define SLOTNUM_PER_SUBFRAME       (SUBFRAME_DURATION_US/interval_us)
55 #define SUBFRAMES_PER_SYSTEMFRAME  10
56 #define SLOTS_PER_SYSTEMFRAME (SLOTNUM_PER_SUBFRAME*SUBFRAMES_PER_SYSTEMFRAME)
57
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.*/
59 #define PRACH_PLAYBACK_BUFFER_BYTES (144*14*4L)
60
61 #define PRACH_SRS_BUFFER_BYTES (144*14*4L)
62
63 /**<  this is the configuration of M-plane */
64 #define XRAN_MAX_NUM_SECTIONS       (N_SYM_PER_SLOT* (XRAN_MAX_ANTENNA_NR*2) + XRAN_MAX_ANT_ARRAY_ELM_NR)
65
66 #define XRAN_MAX_MBUF_LEN 9600 /**< jumbo frame */
67 #define NSEC_PER_SEC 1000000000L
68 #define TIMER_RESOLUTION_CYCLES 1596*1 /* 1us */
69 #define XRAN_RING_SIZE  512 /*4*14*8 pow of 2 */
70 #define XRAN_NAME_MAX_LEN       (64)
71 #define XRAN_RING_NUM       (3)
72
73 #define XranDiffSymIdx(prevSymIdx, currSymIdx, numTotalSymIdx)  ((prevSymIdx > currSymIdx) ? ((currSymIdx + numTotalSymIdx) - prevSymIdx) : (currSymIdx - prevSymIdx))
74
75 #define XRAN_MLOG_VAR 0 /**< enable debug variables to mlog */
76
77 /* PRACH configuration table defines */
78 #define XRAN_PRACH_CANDIDATE_PREAMBLE    (2)
79 #define XRAN_PRACH_CANDIDATE_Y           (2)
80 #define XRAN_PRACH_CANDIDATE_SLOT        (40)
81 #define XRAN_PRACH_CONFIG_TABLE_SIZE     (256)
82 #define XRAN_PRACH_PREAMBLE_FORMAT_OF_ABC (9)
83 typedef enum
84 {
85     FORMAT_0 = 0,
86     FORMAT_1,
87     FORMAT_2,
88     FORMAT_3,
89     FORMAT_A1,
90     FORMAT_A2,
91     FORMAT_A3,
92     FORMAT_B1,
93     FORMAT_B2,
94     FORMAT_B3,
95     FORMAT_B4,
96     FORMAT_C0,
97     FORMAT_C2,
98     FORMAT_LAST
99 }PreambleFormatEnum;
100
101 /* add PRACH used config table, same structure as used in refPHY */
102 typedef struct
103 {
104     uint8_t     prachConfigIdx;
105     uint8_t     preambleFmrt[XRAN_PRACH_CANDIDATE_PREAMBLE];
106     uint8_t     x;
107     uint8_t     y[XRAN_PRACH_CANDIDATE_Y];
108     uint8_t     slotNr[XRAN_PRACH_CANDIDATE_SLOT];
109     uint8_t     slotNrNum;
110     uint8_t     startingSym;
111     uint8_t     nrofPrachInSlot;
112     uint8_t     occassionsInPrachSlot;
113     uint8_t     duration;
114 } xRANPrachConfigTableStruct;
115
116 typedef struct
117 {
118     uint8_t    preambleFmrt;
119     uint16_t   lRALen;
120     uint8_t    fRA;
121     uint32_t    nu;
122     uint16_t   nRaCp;
123 }xRANPrachPreambleLRAStruct;
124
125 struct xran_prach_cp_config
126 {
127     uint8_t    filterIdx;
128     uint8_t    startSymId;
129     uint16_t   startPrbc;
130     uint8_t    numPrbc;
131     uint8_t    numSymbol;
132     uint16_t   timeOffset;
133     int32_t    freqOffset;
134     uint8_t    nrofPrachInSlot;
135     uint8_t    occassionsInPrachSlot;
136     uint8_t    x;
137     uint8_t    y[XRAN_PRACH_CANDIDATE_Y];
138     uint8_t    isPRACHslot[XRAN_PRACH_CANDIDATE_SLOT];
139     uint8_t    eAxC_offset;  /**< starting eAxC for PRACH stream */
140 };
141
142 #define XRAN_MAX_POOLS_PER_SECTOR_NR 8 /**< 2x(TX_OUT, RX_IN, PRACH_IN, SRS_IN) with C-plane */
143
144 typedef struct sectorHandleInfo
145 {
146     /**< Structure that contains the information to describe the
147      * instance i.e service type, virtual function, package Id etc..*/
148     uint16_t nIndex;
149     uint16_t nXranPort;
150     /* Unique ID of an handle shared between phy layer and library */
151     /**< number of antennas supported per link*/
152     uint32_t nBufferPoolIndex;
153     /**< Buffer poolIndex*/
154     struct rte_mempool * p_bufferPool[XRAN_MAX_POOLS_PER_SECTOR_NR];
155     uint32_t bufferPoolElmSz[XRAN_MAX_POOLS_PER_SECTOR_NR];
156     uint32_t bufferPoolNumElm[XRAN_MAX_POOLS_PER_SECTOR_NR];
157
158 }XranSectorHandleInfo, *PXranSectorHandleInfo;
159
160 typedef void (*XranSymCallbackFn)(struct rte_timer *tim, void* arg);
161
162 struct cb_elem_entry{
163     XranSymCallbackFn pSymCallback;
164     void *pSymCallbackTag;
165     LIST_ENTRY(cb_elem_entry) pointers;
166 };
167
168 /* Callback function to send mbuf to the ring */
169 typedef int (*xran_ethdi_mbuf_send_fn)(struct rte_mbuf *mb, uint16_t ethertype);
170
171 /*
172  * manage one cell's all Ethernet frames for one DL or UL LTE subframe
173  */
174 typedef struct {
175     /* -1-this subframe is not used in current frame format
176          0-this subframe can be transmitted, i.e., data is ready
177           1-this subframe is waiting transmission, i.e., data is not ready
178          10 - DL transmission missing deadline. When FE needs this subframe data but bValid is still 1,
179         set bValid to 10.
180     */
181     int32_t bValid ; // when UL rx, it is subframe index.
182     int32_t nSegToBeGen;
183     int32_t nSegGenerated; // how many date segment are generated by DL LTE processing or received from FE
184                        // -1 means that DL packet to be transmitted is not ready in BS
185     int32_t nSegTransferred; // number of data segments has been transmitted or received
186     struct rte_mbuf *pData[XRAN_N_MAX_BUFFER_SEGMENT]; // point to DPDK allocated memory pool
187     struct xran_buffer_list sBufferList;
188 } BbuIoBufCtrlStruct;
189
190
191 #define XranIncrementJob(i)                  ((i >= (XRAN_SYM_JOB_SIZE-1)) ? 0 : (i+1))
192
193 #define XRAN_MAX_PKT_BURST_PER_SYM 32
194 #define XRAN_MAX_PACKET_FRAG 9
195
196 #define MBUF_TABLE_SIZE  (2 * MAX(XRAN_MAX_PKT_BURST_PER_SYM, XRAN_MAX_PACKET_FRAG))
197
198 struct mbuf_table {
199         uint16_t len;
200         struct rte_mbuf *m_table[MBUF_TABLE_SIZE];
201 };
202
203 struct xran_device_ctx
204 {
205     uint8_t sector_id;
206     uint8_t xran_port_id;
207     struct xran_eaxcid_config    eAxc_id_cfg;
208     struct xran_fh_init          fh_init;
209     struct xran_fh_config        fh_cfg;
210     struct xran_prach_cp_config  PrachCPConfig;
211
212     uint32_t enablePrach;
213     uint32_t enableCP;
214
215     int32_t DynamicSectionEna;
216     int64_t offset_sec;
217     int64_t offset_nsec;    //offset to GPS time calcuated based on alpha and beta
218
219     uint32_t enableSrs;
220     struct xran_srs_config srs_cfg; /** configuration of SRS */
221
222     BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
223     BbuIoBufCtrlStruct sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
224     BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
225     BbuIoBufCtrlStruct sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
226     BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
227     BbuIoBufCtrlStruct sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR];
228
229     /* buffers lists */
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];
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];
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];
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];
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];
235
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];
237
238     xran_transport_callback_fn pCallback[XRAN_MAX_SECTOR_NR];
239     void *pCallbackTag[XRAN_MAX_SECTOR_NR];
240
241     xran_transport_callback_fn pPrachCallback[XRAN_MAX_SECTOR_NR];
242     void *pPrachCallbackTag[XRAN_MAX_SECTOR_NR];
243
244     xran_transport_callback_fn pSrsCallback[XRAN_MAX_SECTOR_NR];
245     void *pSrsCallbackTag[XRAN_MAX_SECTOR_NR];
246
247     LIST_HEAD(sym_cb_elem_list, cb_elem_entry) sym_cb_list_head[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
248
249     int32_t sym_up; /**< when we start sym 0 of up with respect to OTA time as measured in symbols */
250     int32_t sym_up_ul;
251
252     xran_fh_tti_callback_fn ttiCb[XRAN_CB_MAX];
253     void *TtiCbParam[XRAN_CB_MAX];
254     uint32_t SkipTti[XRAN_CB_MAX];
255
256     int xran2phy_mem_ready;
257
258     int rx_packet_symb_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
259     int rx_packet_prach_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
260     int rx_packet_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR];
261     int rx_packet_prach_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR];
262     int prach_start_symbol[XRAN_MAX_SECTOR_NR];
263     int prach_last_symbol[XRAN_MAX_SECTOR_NR];
264
265     int phy_tti_cb_done;
266
267     struct rte_mempool *direct_pool;
268     struct rte_mempool *indirect_pool;
269     struct mbuf_table  tx_mbufs[RTE_MAX_ETHPORTS];
270
271     struct xran_common_counters fh_counters;
272
273     phy_encoder_poll_fn bbdev_enc; /**< call back to poll BBDev encoder */
274     phy_decoder_poll_fn bbdev_dec; /**< call back to poll BBDev decoder */
275
276     xran_ethdi_mbuf_send_fn send_cpmbuf2ring;   /**< callback to send mbufs of C-Plane packets to the ring */
277     xran_ethdi_mbuf_send_fn send_upmbuf2ring;   /**< callback to send mbufs of U-Plane packets to the ring */
278 };
279
280 extern long rx_counter;
281 extern long tx_counter;
282 extern long tx_bytes_counter;
283 extern long rx_bytes_counter;
284 extern long tx_bytes_per_sec;
285 extern long rx_bytes_per_sec;
286
287
288 extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_fdd[XRAN_PRACH_CONFIG_TABLE_SIZE];
289 extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_tdd[XRAN_PRACH_CONFIG_TABLE_SIZE];
290 extern const xRANPrachConfigTableStruct gxranPrachDataTable_mmw[XRAN_PRACH_CONFIG_TABLE_SIZE];
291 extern const xRANPrachPreambleLRAStruct gxranPreambleforLRA[13];
292
293 int process_mbuf(struct rte_mbuf *pkt);
294 int process_ring(struct rte_ring *r);
295 int ring_processing_thread(void *args);
296 int packets_dump_thread(void *args);
297
298 int send_symbol_ex(enum xran_pkt_dir direction,
299                 uint16_t section_id,
300                 struct rte_mbuf *mb,
301                 struct rb_map *data,
302                 const enum xran_input_byte_order iq_buf_byte_order,
303                 uint8_t frame_id,
304                 uint8_t subframe_id,
305                 uint8_t slot_id,
306                 uint8_t symbol_no,
307                 int prb_start,
308                 int prb_num,
309                 uint8_t CC_ID,
310                 uint8_t RU_Port_ID,
311                 uint8_t seq_id);
312
313 int32_t prepare_symbol_ex(enum xran_pkt_dir direction,
314                 uint16_t section_id,
315                 struct rte_mbuf *mb,
316                 struct rb_map *data,
317                 uint8_t     compMeth,
318                 uint8_t     iqWidth,
319                 const enum xran_input_byte_order iq_buf_byte_order,
320                 uint8_t frame_id,
321                 uint8_t subframe_id,
322                 uint8_t slot_id,
323                 uint8_t symbol_no,
324                 int prb_start,
325                 int prb_num,
326                 uint8_t CC_ID,
327                 uint8_t RU_Port_ID,
328                 uint8_t seq_id,
329                 uint32_t do_copy);
330
331 int send_cpmsg(void *pHandle, struct rte_mbuf *mbuf,struct xran_cp_gen_params *params,
332                 struct xran_section_gen_info *sect_geninfo, uint8_t cc_id, uint8_t ru_port_id, uint8_t seq_id);
333
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,
335     enum xran_pkt_dir dir, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id,
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,
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);
338
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,
340                 uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id,
341                 uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, uint8_t seq_id);
342
343 struct xran_eaxcid_config *xran_get_conf_eAxC(void *pHandle);
344 uint8_t xran_get_conf_prach_scs(void *pHandle);
345 uint8_t xran_get_conf_fftsize(void *pHandle);
346 uint8_t xran_get_conf_numerology(void *pHandle);
347 uint8_t xran_get_conf_iqwidth(void *pHandle);
348 uint8_t xran_get_conf_compmethod(void *pHandle);
349 uint8_t xran_get_conf_num_bfweights(void *pHandle);
350
351 uint8_t xran_get_num_cc(void *pHandle);
352 uint8_t xran_get_num_eAxc(void *pHandle);
353 uint8_t xran_get_num_eAxcUl(void *pHandle);
354 uint8_t xran_get_num_ant_elm(void *pHandle);
355 enum xran_category xran_get_ru_category(void *pHandle);
356
357 struct xran_device_ctx *xran_dev_get_ctx(void);
358
359 int xran_register_cb_mbuf2ring(xran_ethdi_mbuf_send_fn mbuf_send_cp, xran_ethdi_mbuf_send_fn mbuf_send_up);
360
361 uint16_t xran_alloc_sectionid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id);
362 uint8_t xran_get_seqid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id);
363 int32_t ring_processing_func(void);
364 int xran_init_prach(struct xran_fh_config* pConf, struct xran_device_ctx * p_xran_dev_ctx);
365 void xran_updateSfnSecStart(void);
366
367 struct cb_elem_entry *xran_create_cb(XranSymCallbackFn cb_fn, void *cb_data);
368 int xran_destroy_cb(struct cb_elem_entry * cb_elm);
369
370 #ifdef __cplusplus
371 }
372 #endif
373
374 #endif
375