1 /******************************************************************************
3 * Copyright (c) 2019 Intel.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 *******************************************************************************/
20 * @brief This file provides the definitions for Control Plane Messages APIs.
23 * @ingroup group_lte_source_xran
24 * @author Intel Corporation
28 #ifndef _XRAN_CP_API_H_
29 #define _XRAN_CP_API_H_
36 #include "xran_fh_o_du.h"
37 #include "xran_pkt_cp.h"
38 #include "xran_transport.h"
40 #define XRAN_MAX_SECTIONDB_CTX 2
42 #define XRAN_MAX_NUM_EXTENSIONS XRAN_MAX_PRBS /* Maximum number of extensions in a section [up to 1 ext section per RB]*/
43 #define XRAN_MAX_NUM_UE 16 /* Maximum number of UEs/Lyaers */
44 #define XRAN_MAX_NUM_ANT_BF 64 /* Maximum number of beamforming antenna,
45 * could be defined as XRAN_MAX_ANTENNA_NR */
46 /* Maximum total number of beamforming weights (5.4.7.1.2) */
47 #define XRAN_MAX_BFW_N (XRAN_MAX_NUM_ANT_BF*XRAN_MAX_NUM_UE)
48 #define XRAN_MAX_MODCOMP_ADDPARMS 6 /* max should be even number */
50 #define XRAN_SECTIONEXT_ALIGN 4 /* alignment size in byte for section extension */
53 /** Control Plane section types, defined in 5.4 Table 5.1 */
54 enum xran_cp_sectiontype {
55 XRAN_CP_SECTIONTYPE_0 = 0, /**< Unused RB or Symbols in DL or UL, not supported */
56 XRAN_CP_SECTIONTYPE_1 = 1, /**< Most DL/UL Radio Channels */
57 XRAN_CP_SECTIONTYPE_3 = 3, /**< PRACH and Mixed-numerology Channels */
58 XRAN_CP_SECTIONTYPE_5 = 5, /**< UE scheduling information, not supported */
59 XRAN_CP_SECTIONTYPE_6 = 6, /**< Channel Information, not supported */
60 XRAN_CP_SECTIONTYPE_7 = 7, /**< LAA, not supported */
61 XRAN_CP_SECTIONTYPE_MAX
64 /** Filter index, defined in 5.4.4.3 */
65 enum xran_cp_filterindex {
66 XRAN_FILTERINDEX_STANDARD = 0, /**< UL filter for standard channel */
67 XRAN_FILTERINDEX_PRACH_012 = 1, /**< UL filter for PRACH preamble format 0, 1, 2 */
68 XRAN_FILTERINDEX_PRACH_3 = 2, /**< UL filter for PRACH preamble format 3 */
69 XRAN_FILTERINDEX_PRACH_ABC = 3, /**< UL filter for PRACH preamble format A1~3, B1~4, C0, C2 */
70 XRAN_FILTERINDEX_NPRACH = 4, /**< UL filter for NPRACH */
74 /** Maximum Slot Index, defined in 5.4.4.6 */
75 #define XRAN_SLOTID_MAX 16
77 /** FFT size in frame structure, defined in 5.4.4.13 Table 5.9 */
78 enum xran_cp_fftsize {
79 XRAN_FFTSIZE_128 = 7, /* 128 */
80 XRAN_FFTSIZE_256 = 8, /* 256 */
81 XRAN_FFTSIZE_512 = 9, /* 512 */
82 XRAN_FFTSIZE_1024 = 10, /* 1024 */
83 XRAN_FFTSIZE_2048 = 11, /* 2048 */
84 XRAN_FFTSIZE_4096 = 12, /* 4096 */
85 XRAN_FFTSIZE_1536 = 13, /* 1536 */
89 /** Sub-carrier spacing, defined in 5.4.4.13 Table 5.10 */
90 enum xran_cp_subcarrierspacing { /*3GPP u, SCS, Nslot, Slot len */
91 XRAN_SCS_15KHZ = 0, /* 0, 15kHz, 1, 1ms */
92 XRAN_SCS_30KHZ = 1, /* 1, 30kHz, 2, 500us */
93 XRAN_SCS_60KHZ = 2, /* 2, 60kHz, 4, 250us */
94 XRAN_SCS_120KHZ = 3, /* 3, 120kHz, 8, 125us */
95 XRAN_SCS_240KHZ = 4, /* 4, 240kHz, 16, 62.5us */
96 XRAN_SCS_1P25KHZ = 12, /* NA, 1.25kHz, 1, 1ms */
97 XRAN_SCS_3P75KHZ = 13, /* NA, 3.75kHz, 1, 1ms */
98 XRAN_SCS_5KHZ = 14, /* NA, 5kHz, 1, 1ms */
99 XRAN_SCS_7P5KHZ = 15, /* NA, 7.5kHz, 1, 1ms */
103 /** Resource block indicator, defined in 5.4.5.2 */
104 enum xran_cp_rbindicator {
105 XRAN_RBIND_EVERY = 0, /**< every RB used */
106 XRAN_RBIND_EVERYOTHER = 1, /**< every other RB used */
110 /** Symbol number increment command, defined in 5.4.5.3 */
111 enum xran_cp_symbolnuminc {
112 XRAN_SYMBOLNUMBER_NOTINC = 0, /**< do not increment the current symbol number */
113 XRAN_SYMBOLNUMBER_INC = 1, /**< increment the current symbol number and use that */
114 XRAN_SYMBOLNUMBER_INC_MAX
117 /** Macro to convert the number of PRBs as defined in 5.4.5.6 */
118 #define XRAN_CONVERT_NUMPRBC(x) ((x) > 255 ? 0 : (x))
120 #define XRAN_CONVERT_IQWIDTH(x) ((x) > 15 ? 0 : (x))
122 /** Minimum number of symbols, defined in 5.4.5.7 */
123 #define XRAN_SYMBOLNUMBER_MIN 1
124 /** Maximum number of symbols, defined in 5.4.5.7 */
125 #define XRAN_SYMBOLNUMBER_MAX 14
127 /* LAA message type 5.4.5.14 Table 5.11, not supported */
128 #define XRAN_LAAMSGTYPE_LBT_PDSCH_REQ 0
129 #define XRAN_LAAMSGTYPE_LBT_DRS_REQ 1
130 #define XRAN_LAAMSGTYPE_LBT_PDSCH_RSP 2
131 #define XRAN_LAAMSGTYPE_LBT_DRS_RSP 3
132 #define XRAN_LAAMSGTYPE_LBT_BUFFER_ERROR 4
133 #define XRAN_LAAMSGTYPE_LBT_CWCONFIG_REQ 5
134 #define XRAN_LAAMSGTYPE_LBT_CWCONFIG_RSP 6
136 #define XRAN_LBTMODE_FULL 0
137 #define XRAN_LBTMODE_PARTIAL25 1
138 #define XRAN_LBTMODE_PARTIAL34 2
139 #define XRAN_LBTMODE_FULLSTOP 3
142 #define XRAN_EF_F_LAST 0
143 #define XRAN_EF_F_ANOTHER_ONE 1
145 /** Control Plane section extension commands, defined in 5.4.6 Table 5.13 */
146 enum xran_cp_sectionextcmd {
147 XRAN_CP_SECTIONEXTCMD_0 = 0, /**< Reserved, for future use */
148 XRAN_CP_SECTIONEXTCMD_1 = 1, /**< Beamforming weights */
149 XRAN_CP_SECTIONEXTCMD_2 = 2, /**< Beamforming attributes */
150 XRAN_CP_SECTIONEXTCMD_3 = 3, /**< DL Precoding configuration parameters and indications, not supported */
151 XRAN_CP_SECTIONEXTCMD_4 = 4, /**< Modulation compression parameter */
152 XRAN_CP_SECTIONEXTCMD_5 = 5, /**< Modulation compression additional scaling parameters */
153 XRAN_CP_SECTIONEXTCMD_MAX /* 6~127 reserved for future use */
156 /** Macro to convert bfwIqWidth defined in 5.4.7.1.1, Table 5-15 */
157 #define XRAN_CONVERT_BFWIQWIDTH(x) ((x) > 15 ? 0 : (x))
159 /** Beamforming Weights Compression Method 5.4.7.1.1, Table 5-16 */
160 enum xran_cp_bfw_compression_method {
161 XRAN_BFWCOMPMETHOD_NONE = 0, /**< Uncopressed I/Q value */
162 XRAN_BFWCOMPMETHOD_BLKFLOAT = 1, /**< I/Q mantissa value */
163 XRAN_BFWCOMPMETHOD_BLKSCALE = 2, /**< I/Q scaled value */
164 XRAN_BFWCOMPMETHOD_ULAW = 3, /**< compressed I/Q value */
165 XRAN_BFWCOMPMETHOD_BEAMSPACE = 4, /**< beamspace I/Q coefficient */
166 XRAN_BFWCOMPMETHOD_MAX /* reserved for future methods */
169 /** Beamforming Attributes Bitwidth 5.4.7.2.1 */
170 enum xran_cp_bfa_bitwidth {
171 XRAN_BFABITWIDTH_NO = 0, /**< the filed is no applicable or the default value shall be used */
172 XRAN_BFABITWIDTH_2BIT = 1, /**< the filed is 2-bit bitwidth */
173 XRAN_BFABITWIDTH_3BIT = 2, /**< the filed is 3-bit bitwidth */
174 XRAN_BFABITWIDTH_4BIT = 3, /**< the filed is 4-bit bitwidth */
175 XRAN_BFABITWIDTH_5BIT = 4, /**< the filed is 5-bit bitwidth */
176 XRAN_BFABITWIDTH_6BIT = 5, /**< the filed is 6-bit bitwidth */
177 XRAN_BFABITWIDTH_7BIT = 6, /**< the filed is 7-bit bitwidth */
178 XRAN_BFABITWIDTH_8BIT = 7, /**< the filed is 8-bit bitwidth */
181 /** Layer ID for DL transmission in TM1-TM4 5.4.7.3.2 */
182 #define XRAN_LAYERID_0 0 /**< Layer 0 */
183 #define XRAN_LAYERID_1 1 /**< Layer 1 */
184 #define XRAN_LAYERID_2 2 /**< Layer 2 */
185 #define XRAN_LAYERID_3 3 /**< Layer 3 */
186 #define XRAN_LAYERID_TXD 0xf /**< TxD */
188 /** LTE Transmission Scheme for section extension type 3 5.4.7.3.3 */
189 #define XRAN_TXS_SMUXCDD 0 /**< Spatial Multiplexing (CDD) */
190 #define XRAN_TXS_SMUXNOCDD 1 /**< Spatial Multiplexing (no CDD) */
191 #define XRAN_TXS_TXDIV 2 /**< Transmit diversity */
195 * This structure contains the information to generate the section body of C-Plane message */
196 struct xran_section_info {
197 uint8_t type; /* type of this section */
198 /* section type bit- */
199 /* 0 1 3 5 6 7 length */
200 uint8_t startSymId; /* X X X X X X 4bits */
201 uint8_t numSymbol; /* X X X X 4bits */
202 uint8_t symInc; /* X X X X X 1bit */
203 uint16_t id; /* X X X X X 12bits */
204 uint16_t reMask; /* X X X X 12bits */
205 uint16_t startPrbc; /* X X X X X 10bits */
206 uint16_t numPrbc; /* X X X X X 8bits */ /* will be converted to zero if >255 */
207 uint8_t rb; /* X X X X X 1bit */
208 uint8_t compMeth; /* X X X 4bits */
209 uint8_t iqWidth; /* X X X 4bits */
210 uint8_t ef; /* X X X X 1bit */
211 int32_t freqOffset; /* X 24bits */
212 uint16_t beamId; /* X X 15bits */
213 uint16_t ueId; /* X X 15bits */
214 uint16_t regFactor; /* X 16bits */
217 struct xran_section_desc sec_desc[XRAN_NUM_OF_SYMBOL_PER_SLOT];
221 struct xran_sectionext1_info {
222 uint16_t rbNumber; /**< number RBs to ext1 chain */
223 uint16_t bfwNumber; /**< number of bf weights in this section */
226 int16_t *p_bfwIQ; /**< pointer to formed section extention */
227 int16_t bfwIQ_sz; /**< size of buffer with section extention information */
231 uint8_t compBitWidthShift;
232 uint8_t activeBeamspaceCoeffMask[XRAN_MAX_BFW_N]; /* ceil(N/8)*8, should be multiple of 8 */
236 struct xran_sectionext2_info {
237 uint8_t bfAzPtWidth; /* beamforming zenith beamwidth parameter */
239 uint8_t bfZePtWidth; /* beamforming azimuth beamwidth parameter */
241 uint8_t bfAz3ddWidth; /* beamforming zenith pointing parameter */
243 uint8_t bfZe3ddWidth; /* beamforming azimuth pointing parameter */
250 struct xran_sectionext3_info {
258 uint16_t numAntPort; /* number of antenna port - 2 or 4 */
264 struct xran_sectionext4_info {
267 uint16_t modCompScaler;
270 struct xran_sectionext5_info {
274 uint16_t mcScaleReMask;
275 uint16_t mcScaleOffset;
276 } mc[XRAN_MAX_MODCOMP_ADDPARMS];
279 struct xran_sectionext_info {
287 * This structure contains the information to generate the section header of C-Plane message */
288 struct xran_cp_header_params {
295 /* section type bit- */
296 /* 0 1 3 5 6 7 length */
297 uint8_t fftSize; /* X X 4bits */
298 uint8_t scs; /* X X 4bits */
299 uint8_t iqWidth; /* X X X 4bits */
300 uint8_t compMeth; /* X X X 4bits */
301 uint8_t numUEs; /* X 8bits */
302 uint16_t timeOffset; /* X X 16bits */
303 uint16_t cpLength; /* X X 16bits */
306 /** The structure for the generation of section extension */
307 struct xran_section_ext_gen_info {
308 uint16_t type; /**< the type of section extension */
309 uint16_t len; /**< length of extension data */
310 void *data; /**< pointer to extension data */
314 * This structure to hold the information to generate the sections of C-Plane message */
315 struct xran_section_gen_info {
316 struct xran_section_info info; /**< The information for section */
318 uint32_t exDataSize; /**< The number of Extensions or type 6/7 data */
319 /** the array to store section extension */
320 struct xran_section_ext_gen_info exData[XRAN_MAX_NUM_EXTENSIONS];
322 struct xran_sectionext1_info m_ext1[XRAN_MAX_NUM_EXTENSIONS];
323 struct xran_sectionext2_info m_ext2[XRAN_MAX_NUM_EXTENSIONS];
324 struct xran_sectionext3_info m_ext3[XRAN_MAX_NUM_EXTENSIONS];
325 struct xran_sectionext4_info m_ext4[XRAN_MAX_NUM_EXTENSIONS];
326 struct xran_sectionext5_info m_ext5[XRAN_MAX_NUM_EXTENSIONS];
331 * This structure to hold the information to generate a C-Plane message */
332 struct xran_cp_gen_params {
333 uint8_t dir; /**< UL or DL */
334 uint8_t sectionType; /**< each section must have same type with this */
335 uint16_t numSections; /**< the number of sections to generate */
337 struct xran_cp_header_params hdr;
338 /**< The information for C-Plane message header */
339 struct xran_section_gen_info *sections;
340 /**< Array of the section information */
344 * This structure to hold the information of RB allocation from PHY
345 * to send data for allocated RBs only. */
346 struct xran_cp_rbmap_list {
347 uint16_t grp_id; /**< group id for this entry, reserved for future use */
349 uint8_t sym_start; /**< Start symbol ID */
350 uint8_t sym_num; /**< Number of symbols */
352 uint16_t rb_start; /**< Start RB position */
353 uint16_t rb_num; /**< Number of RBs */
355 int16_t iq_buff_offset; /**< Offset within Sym for start of IQs */
356 int16_t iq_buff_len; /**< length IQs */
358 uint16_t beam_id; /**< Bean Index */
359 uint8_t iqWidth; /**< I and Q width in bits */
360 uint8_t comp_meth; /**< Compression method */
365 uint16_t xran_get_cplength(int cpLength);
366 int32_t xran_get_freqoffset(int freqOffset, int scs);
368 int32_t xran_prepare_ctrl_pkt(struct rte_mbuf *mbuf,
369 struct xran_cp_gen_params *params,
370 uint8_t CC_ID, uint8_t Ant_ID,
373 int32_t xran_parse_cp_pkt(struct rte_mbuf *mbuf,
374 struct xran_cp_gen_params *result,
375 struct xran_recv_packet_info *pkt_info);
377 int32_t xran_cp_init_sectiondb(void *pHandle);
378 int32_t xran_cp_free_sectiondb(void *pHandle);
379 int32_t xran_cp_add_section_info(void *pHandle,
380 uint8_t dir, uint8_t cc_id, uint8_t ruport_id,
381 uint8_t ctx_id, struct xran_section_info *info);
382 int32_t xran_cp_add_multisection_info(void *pHandle,
383 uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id,
384 struct xran_cp_gen_params *gen_info);
385 struct xran_section_info *xran_cp_find_section_info(void *pHandle,
386 uint8_t dir, uint8_t cc_id, uint8_t ruport_id,
387 uint8_t ctx_id, uint16_t section_id);
388 struct xran_section_info *xran_cp_iterate_section_info(void *pHandle,
389 uint8_t dir, uint8_t cc_id, uint8_t ruport_id,
390 uint8_t ctx_id, uint32_t *next);
392 int xran_cp_getsize_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id);
393 int xran_cp_reset_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id);
394 int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination buffer */
395 uint16_t ext1_dst_len, /**< dest buffer size */
396 int16_t *p_bfw_iq_src, /**< source buffer of IQs */
397 uint16_t rbNumber, /**< number RBs to ext1 chain */
398 uint16_t bfwNumber, /**< number of bf weights in this set of sections */
399 uint8_t bfwiqWidth, /**< bit size of IQs */
400 uint8_t bfwCompMeth); /**< compression method */
401 struct rte_mbuf *xran_attach_cp_ext_buf(int8_t* p_ext_buff_start, int8_t* p_ext_buff, uint16_t ext_buff_len,
402 struct rte_mbuf_ext_shared_info * p_share_data);
408 #endif /* _XRAN_CP_API_H_ */