1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
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. #
16 ################################################################################
17 *******************************************************************************/
19 /************************************************************************
25 Desc: C source code for scheduler utilities
29 **********************************************************************/
32 @brief This file implements the schedulers util functions.
36 #include "common_def.h"
37 #include "du_app_mac_inf.h"
40 #include "tfu.x" /* TFU types */
41 #include "lrg.x" /* layer management typedefs for MAC */
42 #include "mac_sch_interface.h"
45 #include "sch_utils.h"
49 /* spec-38.213 Table 13-4 for SCS=30KHz */
50 /* Note: Picking Table 13-4 and not 13-6 since band supported is n78 and
51 * corresponding minimum B/W is 10 MHz */
52 int8_t coresetIdxTable[MAX_CORESET_INDEX][4] = {
53 { 1, 24, 2, 0}, /* index 0 */
54 { 1, 24, 2, 1}, /* index 1 */
55 { 1, 24, 2, 2}, /* index 2 */
56 { 1, 24, 2, 3}, /* index 3 */
57 { 1, 24, 2, 4}, /* index 4 */
58 { 1, 24, 3, 0}, /* index 5 */
59 { 1, 24, 3, 1}, /* index 6 */
60 { 1, 24, 3, 2}, /* index 7 */
61 { 1, 24, 3, 3}, /* index 8 */
62 { 1, 24, 3, 4}, /* index 9 */
63 { 1, 48, 1, 12}, /* index 10 */
64 { 1, 48, 1, 14}, /* index 11 */
65 { 1, 48, 1, 16}, /* index 12 */
66 { 1, 48, 2, 12}, /* index 13 */
67 { 1, 48, 2, 14}, /* index 14 */
68 { 1, 48, 2, 16}, /* index 15 */
71 /* spec-38.213 Table 13-1 for SCS=15KHz */
72 int8_t coresetIdxTable[MAX_CORESET_INDEX][4] = {
73 { 1, 24, 2, 0}, /* index 0 */
74 { 1, 24, 2, 2}, /* index 1 */
75 { 1, 24, 2, 4}, /* index 2 */
76 { 1, 24, 3, 0}, /* index 3 */
77 { 1, 24, 3, 2}, /* index 4 */
78 { 1, 24, 3, 4}, /* index 5 */
79 { 1, 48, 1, 12}, /* index 6 */
80 { 1, 48, 1, 16}, /* index 7 */
81 { 1, 48, 2, 12}, /* index 8 */
82 { 1, 48, 2, 16}, /* index 9 */
83 { 1, 48, 3, 12}, /* index 10 */
84 { 1, 48, 3, 16}, /* index 11 */
85 { 1, 96, 1, 38}, /* index 12 */
86 { 1, 96, 2, 38}, /* index 13 */
87 { 1, 96, 3, 38}, /* index 14 */
88 { 0, 0, 0, 0}, /* index 15 */
92 /* spec-38.213 Table 13-11 */
93 /* m value is scaled to 2, when using it in formula, divide by 2 */
94 /* firstSymbol will vary depends on i, hence not filled */
95 int8_t searchSpaceIdxTable[MAX_SEARCH_SPACE_INDEX][4] = {
96 { 0, 1, 2, 0}, /* index 0 */
97 { 0, 2, 1, 0}, /* index 1 */
98 { 2, 1, 2, 0}, /* index 2 */
99 { 2, 2, 1, 0}, /* index 3 */
100 { 5, 1, 2, 0}, /* index 4 */
101 { 5, 2, 1, 0}, /* index 5 */
102 { 7, 1, 2, 0}, /* index 6 */
103 { 7, 2, 1, 0}, /* index 7 */
104 { 0, 1, 4, 0}, /* index 8 */
105 { 5, 1, 4, 0}, /* index 9 */
106 { 0, 1, 2, 0}, /* index 10 */
107 { 0, 1, 2, 0}, /* index 11 */
108 { 2, 1, 2, 0}, /* index 12 */
109 { 2, 1, 2, 0}, /* index 13 */
110 { 5, 1, 2, 0}, /* index 14 */
111 { 5, 1, 2, 0}, /* index 15 */
116 /* spec-38.211 Table 6.3.3.2-1 */
117 /* Lra, delFRa, delF, numRb, k' */
118 uint16_t numRbForPrachTable[MAX_RACH_NUM_RB_IDX][5] = {
119 { 839, 1.25, 15, 6, 7 }, /* index 0 */
120 { 839, 1.25, 30, 3, 1 }, /* index 1 */
121 { 839, 1.25, 60, 2, 133 }, /* index 2 */
122 { 839, 5, 15, 24, 12 }, /* index 3 */
123 { 839, 5, 30, 12, 10 }, /* index 4 */
124 { 839, 5, 60, 6, 7 }, /* index 5 */
125 { 139, 15, 15, 12, 2 }, /* index 6 */
126 { 139, 15, 30, 6, 2 }, /* index 7 */
127 { 139, 15, 60, 3, 2 }, /* index 8 */
128 { 139, 30, 15, 24, 2 }, /* index 9 */
129 { 139, 30, 30, 12, 2 }, /* index 10 */
130 { 139, 30, 60, 6, 2 }, /* index 11 */
131 { 139, 60, 60, 12, 2 }, /* index 12 */
132 { 139, 60, 120, 6, 2 }, /* index 13 */
133 { 139, 120, 60, 24, 2 }, /* index 14 */
134 { 139, 120, 120, 12, 2 }, /* index 15 */
139 /* prach config index Table 6.3.3.2-3 spec 38.211
140 * PRACH format given as follows:
155 * Subframe num is represented considering 0-9 bits and
156 * value 1 corresponds to the subframe that is valid
159 uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8] = {
160 { 0, 16, 1, 512, 0, 0, 0, 0 }, /* index 0 */
161 { 0, 8, 1, 512, 0, 0, 0, 0 }, /* index 1 */
162 { 0, 4, 1, 512, 0, 0, 0, 0 }, /* index 2 */
163 { 0, 2, 0, 512, 0, 0, 0, 0 }, /* index 3 */
164 { 0, 2, 1, 512, 0, 0, 0, 0 }, /* index 4 */
165 { 0, 2, 0, 16, 0, 0, 0, 0 }, /* index 5 */
166 { 0, 2, 1, 16, 0, 0, 0, 0 }, /* index 6 */
167 { 0, 1, 0, 512, 0, 0, 0, 0 }, /* index 7 */
168 { 0, 1, 0, 256, 0, 0, 0, 0 }, /* index 8 */
169 { 0, 1, 0, 128, 0, 0, 0, 0 }, /* index 9 */
170 { 0, 1, 0, 64, 0, 0, 0, 0 }, /* index 10 */
171 { 0, 1, 0, 32, 0, 0, 0, 0 }, /* index 11 */
172 { 0, 1, 0, 16, 0, 0, 0, 0 }, /* index 12 */
173 { 0, 1, 0, 8, 0, 0, 0, 0 }, /* index 13 */
174 { 0, 1, 0, 4, 0, 0, 0, 0 }, /* index 14 */
175 { 0, 1, 0, 66, 0, 0, 0, 0 }, /* index 15 */
176 { 0, 1, 0, 66, 7, 0, 0, 0 }, /* index 16 */
177 { 0, 1, 0, 528, 0, 0, 0, 0 }, /* index 17 */
178 { 0, 1, 0, 264, 0, 0, 0, 0 }, /* index 18 */
179 { 0, 1, 0, 132, 0, 0, 0, 0 }, /* index 19 */
180 { 0, 1, 0, 768, 0, 0, 0, 0 }, /* index 20 */
181 { 0, 1, 0, 784, 0, 0, 0, 0 }, /* index 21 */
182 { 0, 1, 0, 536, 0, 0, 0, 0 }, /* index 22 */
183 { 0, 1, 0, 896, 0, 0, 0, 0 }, /* index 23 */
184 { 0, 1, 0, 792, 0, 0, 0, 0 }, /* index 24 */
185 { 0, 1, 0, 960, 0, 0, 0, 0 }, /* index 25 */
186 { 0, 1, 0, 594, 0, 0, 0, 0 }, /* index 26 */
187 { 0, 1, 0, 682, 0, 0, 0, 0 }, /* index 27 */
188 { 1, 16, 1, 128, 0, 0, 0, 0 }, /* index 28 */
189 { 1, 8, 1, 128, 0, 0, 0, 0 }, /* index 29 */
190 { 1, 4, 1, 128, 0, 0, 0, 0 }, /* index 30 */
191 { 1, 2, 0, 128, 0, 0, 0, 0 }, /* index 31 */
192 { 1, 2, 1, 128, 0, 0, 0, 0 }, /* index 32 */
193 { 1, 1, 0, 128, 0, 0, 0, 0 }, /* index 33 */
194 { 2, 16, 1, 64, 0, 0, 0, 0 }, /* index 34 */
195 { 2, 8, 1, 64, 0, 0, 0, 0 }, /* index 35 */
196 { 2, 4, 1, 64, 0, 0, 0, 0 }, /* index 36 */
197 { 2, 2, 0, 64, 7, 0, 0, 0 }, /* index 37 */
198 { 2, 2, 1, 64, 7, 0, 0, 0 }, /* index 38 */
199 { 2, 1, 0, 64, 7, 0, 0, 0 }, /* index 39 */
200 { 3, 16, 1, 512, 0, 0, 0, 0 }, /* index 40 */
201 { 3, 8, 1, 512, 0, 0, 0, 0 }, /* index 41 */
202 { 3, 4, 1, 512, 0, 0, 0, 0 }, /* index 42 */
203 { 3, 2, 0, 512, 0, 0, 0, 0 }, /* index 43 */
204 { 3, 2, 1, 512, 0, 0, 0, 0 }, /* index 44 */
205 { 3, 2, 0, 16, 0, 0, 0, 0 }, /* index 45 */
206 { 3, 2, 1, 16, 0, 0, 0, 0 }, /* index 46 */
207 { 3, 1, 0, 512, 0, 0, 0, 0 }, /* index 47 */
208 { 3, 1, 0, 256, 0, 0, 0, 0 }, /* index 48 */
209 { 3, 1, 0, 128, 0, 0, 0, 0 }, /* index 49 */
210 { 3, 1, 0, 64, 0, 0, 0, 0 }, /* index 50 */
211 { 3, 1, 0, 32, 0, 0, 0, 0 }, /* index 51 */
212 { 3, 1, 0, 16, 0, 0, 0, 0 }, /* index 52 */
213 { 3, 1, 0, 8, 0, 0, 0, 0 }, /* index 53 */
214 { 3, 1, 0, 4, 0, 0, 0, 0 }, /* index 54 */
215 { 3, 1, 0, 66, 0, 0, 0, 0 }, /* index 55 */
216 { 3, 1, 0, 66, 7, 0, 0, 0 }, /* index 56 */
217 { 3, 1, 0, 528, 0, 0, 0, 0 }, /* index 57 */
218 { 3, 1, 0, 264, 0, 0, 0, 0 }, /* index 58 */
219 { 3, 1, 0, 132, 0, 0, 0, 0 }, /* index 59 */
220 { 3, 1, 0, 768, 0, 0, 0, 0 }, /* index 60 */
221 { 3, 1, 0, 784, 0, 0, 0, 0 }, /* index 61 */
222 { 3, 1, 0, 536, 0, 0, 0, 0 }, /* index 62 */
223 { 3, 1, 0, 896, 0, 0, 0, 0 }, /* index 63 */
224 { 3, 1, 0, 792, 0, 0, 0, 0 }, /* index 64 */
225 { 3, 1, 0, 594, 0, 0, 0, 0 }, /* index 65 */
226 { 3, 1, 0, 682, 0, 0, 0, 0 }, /* index 66 */
227 { 4, 16, 1, 512, 0, 2, 6, 2 }, /* index 67 */
228 { 4, 8, 1, 512, 0, 2, 6, 2 }, /* index 68 */
229 { 4, 4, 1, 512, 0, 1, 6, 2 }, /* index 69 */
230 { 4, 2, 1, 512, 0, 1, 6, 2 }, /* index 70 */
231 { 4, 2, 1, 528, 7, 1, 3, 2 }, /* index 71 */
232 { 4, 2, 1, 640, 7, 1, 3, 2 }, /* index 72 */
233 { 4, 2, 1, 640, 0, 1, 6, 2 }, /* index 73 */
234 { 4, 2, 1, 768, 0, 2, 6, 2 }, /* index 74 */
235 { 4, 2, 1, 528, 0, 2, 6, 2 }, /* index 75 */
236 { 4, 2, 1, 924, 0, 1, 6, 2 }, /* index 76 */
237 { 4, 1, 0, 512, 0, 2, 6, 2 }, /* index 77 */
238 { 4, 1, 0, 512, 7, 1, 3, 2 }, /* index 78 */
239 { 4, 1, 0, 512, 0, 1, 6, 2 }, /* index 79 */
240 { 4, 1, 0, 768, 0, 2, 6, 2 }, /* index 80 */
241 { 4, 1, 0, 528, 0, 1, 6, 2 }, /* index 81 */
242 { 4, 1, 0, 640, 7, 1, 3, 2 }, /* index 82 */
243 { 4, 1, 0, 792, 0, 1, 6, 2 }, /* index 83 */
244 { 4, 1, 0, 792, 0, 2, 6, 2 }, /* index 84 */
245 { 4, 1, 0, 682, 0, 1, 6, 2 }, /* index 85 */
246 { 4, 1, 0, 1023, 7, 1, 3, 2 }, /* index 86 */
247 { 5, 16, 1, 512, 0, 2, 3, 4 }, /* index 87 */
248 { 5, 8, 1, 512, 0, 2, 3, 4 }, /* index 88 */
249 { 5, 4, 1, 512, 0, 1, 3, 4 }, /* index 89 */
250 { 5, 2, 1, 640, 0, 1, 3, 4 }, /* index 90 */
251 { 5, 2, 1, 768, 0, 2, 3, 4 }, /* index 91 */
252 { 5, 2, 1, 640, 9, 1, 1, 4 }, /* index 92 */
253 { 5, 2, 1, 528, 9, 1, 1, 4 }, /* index 93 */
254 { 5, 2, 1, 528, 0, 2, 3, 4 }, /* index 94 */
255 { 5, 2, 1, 924, 0, 1, 3, 4 }, /* index 95 */
256 { 5, 1, 0, 4, 0, 1, 3, 4 }, /* index 96 */
257 { 5, 1, 0, 128, 0, 1, 3, 4 }, /* index 97 */
258 { 5, 2, 1, 512, 0, 1, 3, 4 }, /* index 98 */
259 { 5, 1, 0, 512, 0, 2, 3, 4 }, /* index 99 */
260 { 5, 1, 0, 512, 9, 1, 1, 4 }, /* index 100 */
261 { 5, 1, 0, 512, 0, 1, 3, 4 }, /* index 101 */
262 { 5, 1, 0, 132, 0, 1, 3, 4 }, /* index 102 */
263 { 5, 1, 0, 768, 0, 2, 3, 4 }, /* index 103 */
264 { 5, 1, 0, 528, 0, 1, 3, 4 }, /* index 104 */
265 { 5, 1, 0, 640, 9, 1, 1, 4 }, /* index 105 */
266 { 5, 1, 0, 792, 0, 1, 3, 4 }, /* index 106 */
267 { 5, 1, 0, 792, 0, 2, 3, 4 }, /* index 107 */
268 { 5, 1, 0, 682, 0, 1, 3, 4 }, /* index 108 */
269 { 5, 1, 0, 1023, 9, 1, 1, 4 }, /* index 109 */
270 { 6, 16, 1, 512, 0, 2, 2, 6 }, /* index 110 */
271 { 6, 8, 1, 512, 0, 2, 2, 6 }, /* index 111 */
272 { 6, 4, 1, 512, 0, 1, 2, 6 }, /* index 112 */
273 { 6, 2, 1, 528, 7, 1, 1, 6 }, /* index 113 */
274 { 6, 2, 1, 640, 7, 1, 1, 6 }, /* index 114 */
275 { 6, 2, 1, 640, 0, 1, 2, 6 }, /* index 115 */
276 { 6, 2, 1, 528, 0, 2, 2, 6 }, /* index 116 */
277 { 6, 2, 1, 768, 0, 2, 2, 6 }, /* index 117 */
278 { 6, 2, 1, 924, 0, 1, 2, 6 }, /* index 118 */
279 { 6, 1, 0, 4, 0, 1, 2, 6 }, /* index 119 */
280 { 6, 1, 0, 128, 0, 1, 2, 6 }, /* index 120 */
281 { 6, 2, 1, 512, 0, 1, 2, 6 }, /* index 121 */
282 { 6, 1, 0, 512, 0, 2, 2, 6 }, /* index 122 */
283 { 6, 1, 0, 512, 7, 1, 1, 6 }, /* index 123 */
284 { 6, 1, 0, 512, 0, 1, 2, 6 }, /* index 124 */
285 { 6, 1, 0, 132, 0, 1, 2, 6 }, /* index 125 */
286 { 6, 1, 0, 768, 0, 2, 2, 6 }, /* index 126 */
287 { 6, 1, 0, 528, 0, 1, 2, 6 }, /* index 127 */
288 { 6, 1, 0, 640, 7, 1, 1, 6 }, /* index 128 */
289 { 6, 1, 0, 792, 0, 1, 2, 6 }, /* index 129 */
290 { 6, 1, 0, 792, 0, 2, 2, 6 }, /* index 130 */
291 { 6, 1, 0, 682, 0, 1, 2, 6 }, /* index 131 */
292 { 6, 1, 0, 1023, 7, 1, 1, 6 }, /* index 132 */
293 { 7, 4, 1, 512, 2, 1, 6, 2 }, /* index 133 */
294 { 7, 2, 1, 512, 2, 1, 6, 2 }, /* index 134 */
295 { 7, 2, 1, 640, 2, 1, 6, 2 }, /* index 135 */
296 { 7, 2, 1, 528, 8, 1, 3, 2 }, /* index 136 */
297 { 7, 2, 1, 528, 2, 2, 6, 2 }, /* index 137 */
298 { 7, 1, 0, 512, 2, 2, 6, 2 }, /* index 138 */
299 { 7, 1, 0, 512, 8, 1, 3, 2 }, /* index 139 */
300 { 7, 1, 0, 512, 2, 1, 6, 2 }, /* index 140 */
301 { 7, 1, 0, 768, 2, 2, 6, 2 }, /* index 141 */
302 { 7, 1, 0, 528, 2, 1, 6, 2 }, /* index 142 */
303 { 7, 1, 0, 640, 8, 1, 3, 2 }, /* index 143 */
304 { 7, 1, 0, 682, 2, 1, 6, 2 }, /* index 144 */
305 { 8, 16, 1, 512, 0, 2, 1, 12 }, /* index 145 */
306 { 8, 8, 1, 512, 0, 2, 1, 12 }, /* index 146 */
307 { 8, 4, 1, 512, 2, 1, 1, 12 }, /* index 147 */
308 { 8, 2, 1, 512, 0, 1, 1, 12 }, /* index 148 */
309 { 8, 2, 1, 512, 2, 1, 1, 12 }, /* index 149 */
310 { 8, 2, 1, 640, 2, 1, 1, 12 }, /* index 150 */
311 { 8, 2, 1, 528, 2, 1, 1, 12 }, /* index 151 */
312 { 8, 2, 1, 528, 0, 2, 1, 12 }, /* index 152 */
313 { 8, 2, 1, 768, 0, 2, 1, 12 }, /* index 153 */
314 { 8, 2, 1, 924, 0, 1, 1, 12 }, /* index 154 */
315 { 8, 1, 0, 2, 0, 1, 1, 12 }, /* index 155 */
316 { 8, 1, 0, 4, 0, 1, 1, 12 }, /* index 156 */
317 { 8, 1, 0, 16, 0, 1, 1, 12 }, /* index 157 */
318 { 8, 1, 0, 128, 0, 1, 1, 12 }, /* index 158 */
319 { 8, 1, 0, 512, 0, 1, 1, 12 }, /* index 159 */
320 { 8, 1, 0, 512, 2, 1, 1, 12 }, /* index 160 */
321 { 8, 1, 0, 512, 0, 2, 1, 12 }, /* index 161 */
322 { 8, 1, 0, 528, 2, 1, 1, 12 }, /* index 162 */
323 { 8, 1, 0, 640, 2, 1, 1, 12 }, /* index 163 */
324 { 8, 1, 0, 768, 0, 2, 1, 12 }, /* index 164 */
325 { 8, 1, 0, 792, 2, 1, 1, 12 }, /* index 165 */
326 { 8, 1, 0, 682, 2, 1, 1, 12 }, /* index 166 */
327 { 8, 1, 0, 1023, 0, 2, 1, 12 }, /* index 167 */
328 { 8, 1, 0, 1023, 2, 1, 1, 12 }, /* index 168 */
329 { 9, 16, 1, 512, 2, 2, 6, 2 }, /* index 169 */
330 { 9, 8, 1, 512, 2, 2, 6, 2 }, /* index 170 */
331 { 9, 4, 1, 512, 2, 1, 6, 2 }, /* index 171 */
332 { 9, 2, 1, 512, 2, 1, 6, 2 }, /* index 172 */
333 { 9, 2, 1, 768, 2, 2, 6, 2 }, /* index 173 */
334 { 9, 2, 1, 640, 2, 1, 6, 2 }, /* index 174 */
335 { 9, 2, 1, 640, 8, 1, 3, 2 }, /* index 175 */
336 { 9, 2, 1, 528, 8, 1, 3, 2 }, /* index 176 */
337 { 9, 2, 1, 528, 2, 2, 6, 2 }, /* index 177 */
338 { 9, 2, 1, 924, 2, 1, 6, 2 }, /* index 178 */
339 { 9, 1, 0, 512, 2, 2, 6, 2 }, /* index 179 */
340 { 9, 1, 0, 512, 8, 1, 3, 2 }, /* index 180 */
341 { 9, 1, 0, 512, 2, 1, 6, 2 }, /* index 181 */
342 { 9, 1, 0, 768, 2, 2, 6, 2 }, /* index 182 */
343 { 9, 1, 0, 528, 2, 1, 6, 2 }, /* index 183 */
344 { 9, 1, 0, 640, 8, 1, 3, 2 }, /* index 184 */
345 { 9, 1, 0, 792, 2, 1, 6, 2 }, /* index 185 */
346 { 9, 1, 0, 792, 2, 2, 6, 2 }, /* index 186 */
347 { 9, 1, 0, 682, 2, 1, 6, 2 }, /* index 187 */
348 { 9, 1, 0, 1023, 8, 1, 3, 2 }, /* index 188 */
349 {10, 16, 1, 512, 2, 2, 2, 6 }, /* index 189 */
350 {10, 8, 1, 512, 2, 2, 2, 6 }, /* index 190 */
351 {10, 4, 1, 512, 2, 1, 2, 6 }, /* index 191 */
352 {10, 2, 1, 512, 2, 1, 2, 6 }, /* index 192 */
353 {10, 2, 1, 768, 2, 2, 2, 6 }, /* index 193 */
354 {10, 2, 1, 640, 2, 1, 2, 6 }, /* index 194 */
355 {10, 2, 1, 640, 8, 1, 1, 6 }, /* index 195 */
356 {10, 2, 1, 528, 8, 1, 1, 6 }, /* index 196 */
357 {10, 2, 1, 528, 2, 2, 2, 6 }, /* index 197 */
358 {10, 2, 1, 924, 2, 1, 2, 6 }, /* index 198 */
359 {10, 8, 1, 512, 8, 2, 1, 6 }, /* index 199 */
360 {10, 4, 1, 512, 8, 1, 1, 6 }, /* index 200 */
361 {10, 1, 0, 512, 2, 2, 2, 6 }, /* index 201 */
362 {10, 1, 0, 512, 8, 1, 1, 6 }, /* index 202 */
363 {10, 1, 0, 512, 2, 1, 2, 6 }, /* index 203 */
364 {10, 1, 0, 768, 2, 2, 2, 6 }, /* index 204 */
365 {10, 1, 0, 528, 2, 1, 2, 6 }, /* index 205 */
366 {10, 1, 0, 640, 8, 1, 1, 6 }, /* index 206 */
367 {10, 1, 0, 792, 2, 1, 2, 6 }, /* index 207 */
368 {10, 1, 0, 792, 2, 2, 2, 6 }, /* index 208 */
369 {10, 1, 0, 682, 2, 1, 2, 6 }, /* index 209 */
370 {10, 1, 0, 1023, 8, 1, 1, 6 }, /* index 210 */
371 {11, 2, 1, 512, 2, 1, 6, 2 }, /* index 211 */
372 {11, 2, 1, 528, 8, 1, 3, 2 }, /* index 212 */
373 {11, 2, 1, 640, 8, 1, 3, 2 }, /* index 213 */
374 {11, 2, 1, 640, 2, 1, 6, 2 }, /* index 214 */
375 {11, 2, 1, 528, 2, 2, 6, 2 }, /* index 215 */
376 {11, 2, 1, 768, 2, 2, 6, 2 }, /* index 216 */
377 {11, 1, 0, 512, 2, 2, 6, 2 }, /* index 217 */
378 {11, 1, 0, 512, 8, 1, 3, 2 }, /* index 218 */
379 {11, 1, 0, 512, 2, 1, 6, 2 }, /* index 219 */
380 {11, 1, 0, 768, 2, 2, 6, 2 }, /* index 220 */
381 {11, 1, 0, 528, 2, 1, 6, 2 }, /* index 221 */
382 {11, 1, 0, 640, 8, 1, 3, 2 }, /* index 222 */
383 {11, 1, 0, 792, 2, 2, 6, 2 }, /* index 223 */
384 {11, 1, 0, 682, 2, 1, 6, 2 }, /* index 224 */
385 {11, 1, 0, 1023, 8, 1, 3, 2 }, /* index 225 */
386 {12, 2, 1, 512, 0, 1, 3, 4 }, /* index 226 */
387 {12, 2, 1, 528, 6, 1, 2, 4 }, /* index 227 */
388 {12, 2, 1, 640, 6, 1, 2, 4 }, /* index 228 */
389 {12, 2, 1, 528, 0, 2, 3, 4 }, /* index 229 */
390 {12, 2, 1, 768, 0, 2, 3, 4 }, /* index 230 */
391 {12, 1, 0, 512, 0, 2, 3, 4 }, /* index 231 */
392 {12, 1, 0, 512, 6, 1, 2, 4 }, /* index 232 */
393 {12, 1, 0, 512, 0, 1, 3, 4 }, /* index 233 */
394 {12, 1, 0, 768, 0, 2, 3, 4 }, /* index 234 */
395 {12, 1, 0, 528, 0, 1, 3, 4 }, /* index 235 */
396 {12, 1, 0, 640, 6, 1, 2, 4 }, /* index 236 */
397 {12, 1, 0, 792, 0, 1, 3, 4 }, /* index 237 */
398 {12, 1, 0, 792, 0, 2, 3, 4 }, /* index 238 */
399 {12, 1, 0, 682, 0, 1, 3, 4 }, /* index 239 */
400 {12, 1, 0, 1023, 6, 1, 2, 4 }, /* index 240 */
401 {13, 2, 1, 512, 0, 1, 2, 6 }, /* index 241 */
402 {13, 2, 1, 528, 2, 1, 2, 6 }, /* index 242 */
403 {13, 2, 1, 640, 0, 1, 2, 6 }, /* index 243 */
404 {13, 2, 1, 640, 2, 1, 2, 6 }, /* index 244 */
405 {13, 2, 1, 528, 0, 2, 2, 6 }, /* index 245 */
406 {13, 2, 1, 768, 0, 2, 2, 6 }, /* index 246 */
407 {13, 1, 0, 512, 0, 2, 2, 6 }, /* index 247 */
408 {13, 1, 0, 512, 2, 1, 2, 6 }, /* index 248 */
409 {13, 1, 0, 512, 0, 1, 2, 6 }, /* index 249 */
410 {13, 1, 0, 768, 0, 2, 2, 6 }, /* index 250 */
411 {13, 1, 0, 528, 0, 1, 2, 6 }, /* index 251 */
412 {13, 1, 0, 640, 2, 1, 2, 6 }, /* index 252 */
413 {13, 1, 0, 792, 0, 2, 2, 6 }, /* index 253 */
414 {13, 1, 0, 682, 0, 1, 2, 6 }, /* index 254 */
415 {13, 1, 0, 1023, 2, 1, 2, 6 } /* index 255 */
419 /* prach config index Table 6.3.3.2-2 spec 38.211
420 * PRACH format given as follows:
435 * Subframe num is represented considering 0-9 bits and
436 * value 1 corresponds to the subframe that is valid
439 uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8] = {
440 { 0, 16, 1, 2, 0, 0, 0, 0 }, /* index 0 */
441 { 0, 16, 1, 16, 0, 0, 0, 0 }, /* index 1 */
442 { 0, 16, 1, 128, 0, 0, 0, 0 }, /* index 2 */
443 { 0, 16, 1, 512, 0, 0, 0, 0 }, /* index 3 */
444 { 0, 8, 1, 2, 0, 0, 0, 0 }, /* index 4 */
445 { 0, 8, 1, 16, 0, 0, 0, 0 }, /* index 5 */
446 { 0, 8, 1, 128, 0, 0, 0, 0 }, /* index 6 */
447 { 0, 8, 1, 512, 0, 0, 0, 0 }, /* index 7 */
448 { 0, 4, 1, 2, 0, 0, 0, 0 }, /* index 8 */
449 { 0, 4, 1, 16, 0, 0, 0, 0 }, /* index 9 */
450 { 0, 4, 1, 128, 0, 0, 0, 0 }, /* index 10 */
451 { 0, 4, 1, 512, 0, 0, 0, 0 }, /* index 11 */
452 { 0, 2, 1, 2, 0, 0, 0, 0 }, /* index 12 */
453 { 0, 2, 1, 16, 0, 0, 0, 0 }, /* index 13 */
454 { 0, 2, 1, 128, 0, 0, 0, 0 }, /* index 14 */
455 { 0, 2, 1, 512, 0, 0, 0, 0 }, /* index 15 */
456 { 0, 1, 0, 2, 0, 0, 0, 0 }, /* index 16 */
457 { 0, 1, 0, 16, 0, 0, 0, 0 }, /* index 17 */
458 { 0, 1, 0, 128, 0, 0, 0, 0 }, /* index 18 */
459 { 0, 1, 0, 66, 0, 0, 0, 0 }, /* index 19 */
460 { 0, 1, 0, 132, 0, 0, 0, 0 }, /* index 20 */
461 { 0, 1, 0, 264, 0, 0, 0, 0 }, /* index 21 */
462 { 0, 1, 0, 146, 0, 0, 0, 0 }, /* index 22 */
463 { 0, 1, 0, 292, 0, 0, 0, 0 }, /* index 23 */
464 { 0, 1, 0, 584, 0, 0, 0, 0 }, /* index 24 */
465 { 0, 1, 0, 341, 0, 0, 0, 0 }, /* index 25 */
466 { 0, 1, 0, 682, 0, 0, 0, 0 }, /* index 26 */
467 { 0, 1, 0, 1023, 0, 0, 0, 0 }, /* index 27 */
468 { 1, 16, 1, 2, 0, 0, 0, 0 }, /* index 28 */
469 { 1, 16, 1, 16, 0, 0, 0, 0 }, /* index 29 */
470 { 1, 16, 1, 128, 0, 0, 0, 0 }, /* index 30 */
471 { 1, 16, 1, 512, 0, 0, 0, 0 }, /* index 31 */
472 { 1, 8, 1, 2, 0, 0, 0, 0 }, /* index 32 */
473 { 1, 8, 1, 16, 0, 0, 0, 0 }, /* index 33 */
474 { 1, 8, 1, 128, 0, 0, 0, 0 }, /* index 34 */
475 { 1, 8, 1, 512, 0, 0, 0, 0 }, /* index 35 */
476 { 1, 4, 1, 2, 0, 0, 0, 0 }, /* index 36 */
477 { 1, 4, 1, 16, 0, 0, 0, 0 }, /* index 37 */
478 { 1, 4, 1, 128, 0, 0, 0, 0 }, /* index 38 */
479 { 1, 4, 1, 512, 0, 0, 0, 0 }, /* index 39 */
480 { 1, 2, 1, 2, 0, 0, 0, 0 }, /* index 40 */
481 { 1, 2, 1, 16, 0, 0, 0, 0 }, /* index 41 */
482 { 1, 2, 1, 128, 0, 0, 0, 0 }, /* index 42 */
483 { 1, 2, 1, 512, 0, 0, 0, 0 }, /* index 43 */
484 { 1, 1, 0, 2, 0, 0, 0, 0 }, /* index 44 */
485 { 1, 1, 0, 16, 0, 0, 0, 0 }, /* index 45 */
486 { 1, 1, 0, 128, 0, 0, 0, 0 }, /* index 46 */
487 { 1, 1, 0, 64, 0, 0, 0, 0 }, /* index 47 */
488 { 1, 1, 0, 132, 0, 0, 0, 0 }, /* index 48 */
489 { 1, 1, 0, 264, 0, 0, 0, 0 }, /* index 49 */
490 { 1, 1, 0, 146, 0, 0, 0, 0 }, /* index 50 */
491 { 1, 1, 0, 292, 0, 0, 0, 0 }, /* index 51 */
492 { 1, 1, 0, 584, 0, 0, 0, 0 }, /* index 52 */
493 { 2, 16, 1, 2, 0, 0, 0, 0 }, /* index 53 */
494 { 2, 8, 1, 2, 0, 0, 0, 0 }, /* index 54 */
495 { 2, 4, 0, 2, 0, 0, 0, 0 }, /* index 55 */
496 { 2, 2, 0, 2, 0, 0, 0, 0 }, /* index 56 */
497 { 2, 2, 0, 32, 0, 0, 0, 0 }, /* index 57 */
498 { 2, 1, 0, 2, 0, 0, 0, 0 }, /* index 58 */
499 { 2, 1, 0, 32, 0, 0, 0, 0 }, /* index 59 */
500 { 3, 16, 1, 2, 0, 0, 0, 0 }, /* index 60 */
501 { 3, 16, 1, 16, 0, 0, 0, 0 }, /* index 61 */
502 { 3, 16, 1, 128, 0, 0, 0, 0 }, /* index 62 */
503 { 3, 16, 1, 512, 0, 0, 0, 0 }, /* index 63 */
504 { 3, 8, 1, 2, 0, 0, 0, 0 }, /* index 64 */
505 { 3, 8, 1, 16, 0, 0, 0, 0 }, /* index 65 */
506 { 3, 8, 1, 128, 0, 0, 0, 0 }, /* index 66 */
507 { 3, 4, 1, 2, 0, 0, 0, 0 }, /* index 67 */
508 { 3, 4, 1, 16, 0, 0, 0, 0 }, /* index 68 */
509 { 3, 4, 1, 128, 0, 0, 0, 0 }, /* index 69 */
510 { 3, 4, 1, 512, 0, 0, 0, 0 }, /* index 70 */
511 { 3, 2, 1, 2, 0, 0, 0, 0 }, /* index 71 */
512 { 3, 2, 1, 16, 0, 0, 0, 0 }, /* index 72 */
513 { 3, 2, 1, 128, 0, 0, 0, 0 }, /* index 73 */
514 { 3, 2, 1, 512, 0, 0, 0, 0 }, /* index 74 */
515 { 3, 1, 0, 2, 0, 0, 0, 0 }, /* index 75 */
516 { 3, 1, 0, 16, 0, 0, 0, 0 }, /* index 76 */
517 { 3, 1, 0, 128, 0, 0, 0, 0 }, /* index 77 */
518 { 3, 1, 0, 66, 0, 0, 0, 0 }, /* index 78 */
519 { 3, 1, 0, 132, 0, 0, 0, 0 }, /* index 79 */
520 { 3, 1, 0, 264, 0, 0, 0, 0 }, /* index 80 */
521 { 3, 1, 0, 146, 0, 0, 0, 0 }, /* index 81 */
522 { 3, 1, 0, 292, 0, 0, 0, 0 }, /* index 82 */
523 { 3, 1, 0, 584, 0, 0, 0, 0 }, /* index 83 */
524 { 3, 1, 0, 341, 0, 0, 0, 0 }, /* index 84 */
525 { 3, 1, 0, 682, 0, 0, 0, 0 }, /* index 85 */
526 { 3, 1, 0, 1023, 0, 0, 0, 0 }, /* index 86 */
527 { 4, 16, 0, 528, 0, 1, 6, 2 }, /* index 87 */
528 { 4, 16, 1, 16, 0, 2, 6, 2 }, /* index 88 */
529 { 4, 8, 0, 528, 0, 1, 6, 2 }, /* index 89 */
530 { 4, 8, 1, 16, 0, 2, 6, 2 }, /* index 90 */
531 { 4, 4, 0, 528, 0, 1, 6, 2 }, /* index 91 */
532 { 4, 4, 1, 528, 0, 1, 6, 2 }, /* index 92 */
533 { 4, 4, 0, 16, 0, 2, 6, 2 }, /* index 93 */
534 { 4, 2, 0, 528, 0, 1, 6, 2 }, /* index 94 */
535 { 4, 2, 0, 2, 0, 2, 6, 2 }, /* index 95 */
536 { 4, 2, 0, 16, 0, 2, 6, 2 }, /* index 96 */
537 { 4, 2, 0, 128, 0, 2, 6, 2 }, /* index 97 */
538 { 4, 1, 0, 16, 0, 1, 6, 2 }, /* index 98 */
539 { 4, 1, 0, 66, 0, 1, 6, 2 }, /* index 99 */
540 { 4, 1, 0, 528, 0, 1, 6, 2 }, /* index 100 */
541 { 4, 1, 0, 2, 0, 2, 6, 2 }, /* index 101 */
542 { 4, 1, 0, 128, 0, 2, 6, 2 }, /* index 102 */
543 { 4, 1, 0, 132, 0, 2, 6, 2 }, /* index 103 */
544 { 4, 1, 0, 146, 0, 2, 6, 2 }, /* index 104 */
545 { 4, 1, 0, 341, 0, 2, 6, 2 }, /* index 105 */
546 { 4, 1, 0, 1023, 0, 2, 6, 2 }, /* index 106 */
547 { 4, 1, 0, 682, 0, 2, 6, 2 }, /* index 107 */
548 {11, 2, 0, 528, 0, 1, 7, 2 }, /* index 108 */
549 {11, 2, 0, 16, 0, 2, 7, 2 }, /* index 109 */
550 {11, 1, 0, 16, 0, 1, 7, 2 }, /* index 110 */
551 {11, 1, 0, 66, 0, 1, 7, 2 }, /* index 111 */
552 {11, 1, 0, 528, 0, 1, 7, 2 }, /* index 112 */
553 {11, 1, 0, 2, 0, 2, 7, 2 }, /* index 113 */
554 {11, 1, 0, 128, 0, 2, 7, 2 }, /* index 114 */
555 {11, 1, 0, 146, 0, 2, 7, 2 }, /* index 115 */
556 {11, 1, 0, 341, 0, 2, 7, 2 }, /* index 116 */
557 { 5, 16, 1, 580, 0, 1, 3, 4 }, /* index 117 */
558 { 5, 16, 1, 16, 0, 2, 3, 4 }, /* index 118 */
559 { 5, 8, 1, 580, 0, 1, 3, 4 }, /* index 119 */
560 { 5, 8, 1, 16, 0, 2, 3, 4 }, /* index 120 */
561 { 5, 4, 0, 580, 0, 1, 3, 4 }, /* index 121 */
562 { 5, 4, 0, 16, 0, 2, 3, 4 }, /* index 122 */
563 { 5, 2, 1, 580, 0, 1, 3, 4 }, /* index 123 */
564 { 5, 2, 0, 2, 0, 2, 3, 4 }, /* index 124 */
565 { 5, 2, 0, 16, 0, 2, 3, 4 }, /* index 125 */
566 { 5, 2, 0, 128, 0, 2, 3, 4 }, /* index 126 */
567 { 5, 1, 0, 16, 0, 1, 3, 4 }, /* index 127 */
568 { 5, 1, 0, 66, 0, 1, 3, 4 }, /* index 128 */
569 { 5, 1, 0, 528, 0, 1, 3, 4 }, /* index 129 */
570 { 5, 1, 0, 2, 0, 2, 3, 4 }, /* index 130 */
571 { 5, 1, 0, 128, 0, 2, 3, 4 }, /* index 131 */
572 { 5, 1, 0, 132, 0, 2, 3, 4 }, /* index 132 */
573 { 5, 1, 0, 146, 0, 2, 3, 4 }, /* index 133 */
574 { 5, 1, 0, 341, 0, 2, 3, 4 }, /* index 134 */
575 { 5, 1, 0, 1023, 0, 2, 3, 4 }, /* index 135 */
576 { 5, 1, 0, 682, 0, 2, 3, 4 }, /* index 136 */
577 {12, 2, 1, 580, 0, 1, 3, 4 }, /* index 137 */
578 {12, 2, 0, 16, 0, 2, 3, 4 }, /* index 138 */
579 {12, 1, 0, 16, 0, 1, 3, 4 }, /* index 139 */
580 {12, 1, 0, 66, 0, 1, 3, 4 }, /* index 140 */
581 {12, 1, 0, 528, 0, 1, 3, 4 }, /* index 141 */
582 {12, 1, 0, 2, 0, 2, 3, 4 }, /* index 142 */
583 {12, 1, 0, 128, 0, 2, 3, 4 }, /* index 143 */
584 {12, 1, 0, 146, 0, 2, 3, 4 }, /* index 144 */
585 {12, 1, 0, 341, 0, 2, 3, 4 }, /* index 145 */
586 {12, 1, 0, 1023, 0, 2, 3, 4 }, /* index 146 */
587 { 6, 16, 1, 528, 0, 1, 2, 6 }, /* index 147 */
588 { 6, 16, 1, 16, 0, 2, 2, 6 }, /* index 148 */
589 { 6, 8, 1, 528, 0, 1, 2, 6 }, /* index 149 */
590 { 6, 8, 1, 16, 0, 2, 2, 6 }, /* index 150 */
591 { 6, 4, 0, 528, 0, 1, 2, 6 }, /* index 151 */
592 { 6, 4, 0, 16, 0, 2, 2, 6 }, /* index 152 */
593 { 6, 2, 1, 580, 0, 2, 2, 6 }, /* index 153 */
594 { 6, 2, 0, 2, 0, 2, 2, 6 }, /* index 154 */
595 { 6, 2, 0, 16, 0, 2, 2, 6 }, /* index 155 */
596 { 6, 2, 0, 128, 0, 2, 2, 6 }, /* index 156 */
597 { 6, 1, 0, 16, 0, 1, 2, 6 }, /* index 157 */
598 { 6, 1, 0, 66, 0, 1, 2, 6 }, /* index 158 */
599 { 6, 1, 0, 528, 0, 1, 2, 6 }, /* index 159 */
600 { 6, 1, 0, 2, 0, 2, 2, 6 }, /* index 160 */
601 { 6, 1, 0, 128, 0, 2, 2, 6 }, /* index 161 */
602 { 6, 1, 0, 132, 0, 2, 2, 6 }, /* index 162 */
603 { 6, 1, 0, 146, 0, 2, 2, 6 }, /* index 163 */
604 { 6, 1, 0, 341, 0, 2, 2, 6 }, /* index 164 */
605 { 6, 1, 0, 1023, 0, 2, 2, 6 }, /* index 165 */
606 { 6, 1, 0, 682, 0, 2, 2, 6 }, /* index 166 */
607 {13, 2, 1, 580, 0, 2, 2, 6 }, /* index 167 */
608 {13, 2, 0, 16, 0, 2, 2, 6 }, /* index 168 */
609 {13, 1, 0, 16, 0, 1, 2, 6 }, /* index 169 */
610 {13, 1, 0, 66, 0, 1, 2, 6 }, /* index 170 */
611 {13, 1, 0, 528, 0, 1, 2, 6 }, /* index 171 */
612 {13, 1, 0, 2, 0, 2, 2, 6 }, /* index 172 */
613 {13, 1, 0, 128, 0, 2, 2, 6 }, /* index 173 */
614 {13, 1, 0, 146, 0, 2, 2, 6 }, /* index 174 */
615 {13, 1, 0, 341, 0, 2, 2, 6 }, /* index 175 */
616 {13, 1, 0, 1023, 0, 2, 2, 6 }, /* index 176 */
617 { 7, 16, 0, 528, 0, 1, 7, 2 }, /* index 177 */
618 { 7, 16, 1, 16, 0, 2, 7, 2 }, /* index 178 */
619 { 7, 8, 0, 528, 0, 1, 7, 2 }, /* index 179 */
620 { 7, 8, 1, 16, 0, 2, 7, 2 }, /* index 180 */
621 { 7, 4, 0, 528, 0, 1, 7, 2 }, /* index 181 */
622 { 7, 4, 1, 528, 0, 1, 7, 2 }, /* index 182 */
623 { 7, 4, 0, 16, 0, 2, 7, 2 }, /* index 183 */
624 { 7, 2, 0, 528, 0, 1, 7, 2 }, /* index 184 */
625 { 7, 2, 0, 2, 0, 2, 7, 2 }, /* index 185 */
626 { 7, 2, 0, 16, 0, 2, 7, 2 }, /* index 186 */
627 { 7, 2, 0, 128, 0, 2, 7, 2 }, /* index 187 */
628 { 7, 1, 0, 16, 0, 1, 7, 2 }, /* index 188 */
629 { 7, 1, 0, 66, 0, 1, 7, 2 }, /* index 189 */
630 { 7, 1, 0, 528, 0, 1, 7, 2 }, /* index 190 */
631 { 7, 1, 0, 2, 0, 2, 7, 2 }, /* index 191 */
632 { 7, 1, 0, 128, 0, 2, 7, 2 }, /* index 192 */
633 { 7, 1, 0, 132, 0, 2, 7, 2 }, /* index 193 */
634 { 7, 1, 0, 146, 0, 2, 7, 2 }, /* index 194 */
635 { 7, 1, 0, 341, 0, 2, 7, 2 }, /* index 195 */
636 { 7, 1, 0, 1023, 0, 2, 7, 2 }, /* index 196 */
637 { 7, 1, 0, 682, 0, 2, 7, 2 }, /* index 197 */
638 { 8, 16, 0, 528, 0, 2, 1, 12 }, /* index 198 */
639 { 8, 16, 1, 16, 0, 2, 1, 12 }, /* index 199 */
640 { 8, 8, 0, 528, 0, 2, 1, 12 }, /* index 200 */
641 { 8, 8, 1, 16, 0, 2, 1, 12 }, /* index 201 */
642 { 8, 4, 0, 528, 0, 2, 1, 12 }, /* index 202 */
643 { 8, 4, 0, 16, 0, 2, 1, 12 }, /* index 203 */
644 { 8, 4, 1, 528, 0, 2, 1, 12 }, /* index 204 */
645 { 8, 2, 0, 528, 0, 2, 1, 12 }, /* index 205 */
646 { 8, 2, 0, 2, 0, 2, 1, 12 }, /* index 206 */
647 { 8, 2, 0, 16, 0, 2, 1, 12 }, /* index 207 */
648 { 8, 2, 0, 128, 0, 2, 1, 12 }, /* index 208 */
649 { 8, 1, 0, 2, 0, 2, 1, 12 }, /* index 209 */
650 { 8, 1, 0, 16, 0, 2, 1, 12 }, /* index 210 */
651 { 8, 1, 0, 128, 0, 2, 1, 12 }, /* index 211 */
652 { 8, 1, 0, 66, 0, 2, 1, 12 }, /* index 212 */
653 { 8, 1, 0, 132, 0, 2, 1, 12 }, /* index 213 */
654 { 8, 1, 0, 528, 0, 2, 1, 12 }, /* index 214 */
655 { 8, 1, 0, 146, 0, 2, 1, 12 }, /* index 215 */
656 { 8, 1, 0, 341, 0, 2, 1, 12 }, /* index 216 */
657 { 8, 1, 0, 1023, 0, 2, 1, 12 }, /* index 217 */
658 { 8, 1, 0, 682, 0, 2, 1, 12 }, /* index 218 */
659 { 9, 8, 1, 16, 0, 2, 7, 2 }, /* index 219 */
660 { 9, 4, 1, 528, 0, 1, 7, 2 }, /* index 220 */
661 { 9, 4, 0, 16, 0, 2, 7, 2 }, /* index 221 */
662 { 9, 2, 0, 528, 0, 1, 7, 2 }, /* index 222 */
663 { 9, 2, 0, 2, 0, 2, 7, 2 }, /* index 223 */
664 { 9, 2, 0, 16, 0, 2, 7, 2 }, /* index 224 */
665 { 9, 2, 0, 128, 0, 2, 7, 2 }, /* index 225 */
666 { 9, 1, 0, 16, 0, 1, 7, 2 }, /* index 226 */
667 { 9, 1, 0, 66, 0, 1, 7, 2 }, /* index 227 */
668 { 9, 1, 0, 528, 0, 1, 7, 2 }, /* index 228 */
669 { 9, 1, 0, 2, 0, 2, 7, 2 }, /* index 229 */
670 { 9, 1, 0, 128, 0, 2, 7, 2 }, /* index 230 */
671 { 9, 1, 0, 132, 0, 2, 7, 2 }, /* index 231 */
672 { 9, 1, 0, 146, 0, 2, 7, 2 }, /* index 232 */
673 { 9, 1, 0, 341, 0, 2, 7, 2 }, /* index 233 */
674 { 9, 1, 0, 1023, 0, 2, 7, 2 }, /* index 234 */
675 { 9, 1, 0, 682, 0, 2, 7, 2 }, /* index 235 */
676 {10, 16, 1, 528, 0, 1, 2, 6 }, /* index 236 */
677 {10, 16, 1, 16, 0, 2, 2, 6 }, /* index 237 */
678 {10, 8, 1, 528, 0, 1, 2, 6 }, /* index 238 */
679 {10, 8, 1, 16, 0, 2, 2, 6 }, /* index 239 */
680 {10, 4, 0, 528, 0, 1, 2, 6 }, /* index 240 */
681 {10, 4, 0, 16, 0, 2, 2, 6 }, /* index 241 */
682 {10, 2, 1, 580, 0, 2, 2, 6 }, /* index 242 */
683 {10, 2, 0, 2, 0, 2, 2, 6 }, /* index 243 */
684 {10, 2, 0, 16, 0, 2, 2, 6 }, /* index 244 */
685 {10, 2, 0, 128, 0, 2, 2, 6 }, /* index 245 */
686 {10, 1, 0, 16, 0, 1, 2, 6 }, /* index 246 */
687 {10, 1, 0, 66, 0, 1, 2, 6 }, /* index 247 */
688 {10, 1, 0, 528, 0, 1, 2, 6 }, /* index 248 */
689 {10, 1, 0, 2, 0, 2, 2, 6 }, /* index 249 */
690 {10, 1, 0, 128, 0, 2, 2, 6 }, /* index 250 */
691 {10, 1, 0, 132, 0, 2, 2, 6 }, /* index 251 */
692 {10, 1, 0, 146, 0, 2, 2, 6 }, /* index 252 */
693 {10, 1, 0, 341, 0, 2, 2, 6 }, /* index 253 */
694 {10, 1, 0, 1023, 0, 2, 2, 6 }, /* index 254 */
695 {10, 1, 0, 682, 0, 2, 2, 6 } /* index 255 */
699 /* Defintion of delta value Table 6.1.2.1.1-5 spec 38.214 */
700 uint8_t puschDeltaTable[MAX_MU_PUSCH] = { 2, 3, 4, 6 };
702 uint16_t tbSizeTable[TOTAL_TBSIZE_VALUES] = {
703 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, \
704 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, \
705 184, 192, 208, 224, 240, 256, 272, 288, 304, 320, \
706 336, 352, 368, 384, 408, 432, 456, 480, 504, 528, \
707 552, 576, 608, 640, 672, 704, 736, 768, 808, 848, \
708 888, 928, 984, 1032, 1064, 1128, 1160, 1192, 1224, 1256, \
709 1288, 1320, 1352, 1416, 1480, 1544, 1608, 1672, 1736, 1800, \
710 1864, 1928, 2024, 2088, 2152, 2216, 2280, 2408, 2472, 2536, \
711 2600, 2664, 2728, 2792, 2856, 2976, 3104, 3240, 3368, 3496, \
714 uint16_t mcsTable[32][3] = {
715 { 0, 2, 120}, /* mcs index 0 */
716 { 1, 2, 157}, /* mcs index 1 */
717 { 2, 2, 193}, /* mcs index 2 */
718 { 3, 2, 251}, /* mcs index 3 */
719 { 4, 2, 308}, /* mcs index 4 */
720 { 5, 2, 379}, /* mcs index 5 */
721 { 6, 2, 449}, /* mcs index 6 */
722 { 7, 2, 526}, /* mcs index 7 */
723 { 8, 2, 602}, /* mcs index 8 */
724 { 9, 2, 679}, /* mcs index 9 */
725 { 10, 4, 340}, /* mcs index 10 */
726 { 11, 4, 378}, /* mcs index 11 */
727 { 12, 4, 434}, /* mcs index 12 */
728 { 13, 4, 490}, /* mcs index 13 */
729 { 14, 4, 553}, /* mcs index 14 */
730 { 15, 4, 616}, /* mcs index 15 */
731 { 16, 4, 658}, /* mcs index 16 */
732 { 17, 6, 438}, /* mcs index 17 */
733 { 18, 6, 466}, /* mcs index 18 */
734 { 19, 6, 517}, /* mcs index 19 */
735 { 20, 6, 567}, /* mcs index 20 */
736 { 21, 6, 616}, /* mcs index 21 */
737 { 22, 6, 666}, /* mcs index 22 */
738 { 23, 6, 719}, /* mcs index 23 */
739 { 24, 6, 772}, /* mcs index 24 */
740 { 25, 6, 822}, /* mcs index 25 */
741 { 26, 6, 873}, /* mcs index 26 */
742 { 27, 6, 910}, /* mcs index 27 */
743 { 28, 6, 948}, /* mcs index 28 */
744 { 29, 2, 0}, /* mcs index 29 */
745 { 30, 4, 0}, /* mcs index 30 */
746 { 31, 6, 0}}; /* mcs index 31 */
748 /* PUCCH resource sets before dedicated PUCCH resource configuration */
749 /* Table 9.2.1-1 spec 38.213 */
750 uint8_t pucchResourceSet[MAX_PUCCH_RES_SET_IDX][4] = {
751 { 0, 12, 2, 0 }, /* index 0 */
752 { 0, 12, 2, 0 }, /* index 1 */
753 { 0, 12, 2, 3 }, /* index 2 */
754 { 1, 10, 4, 0 }, /* index 3 */
755 { 1, 10, 4, 0 }, /* index 4 */
756 { 1, 10, 4, 2 }, /* index 5 */
757 { 1, 10, 4, 4 }, /* index 6 */
758 { 1, 4, 10, 0 }, /* index 7 */
759 { 1, 4, 10, 0 }, /* index 8 */
760 { 1, 4, 10, 2 }, /* index 9 */
761 { 1, 4, 10, 4 }, /* index 10 */
762 { 1, 0, 14, 0 }, /* index 11 */
763 { 1, 0, 14, 0 }, /* index 12 */
764 { 1, 0, 14, 2 }, /* index 13 */
765 { 1, 0, 14, 4 }, /* index 14 */
766 { 1, 0, 14, 0 }, /* index 15 */
769 /* Minimum Msg3 scheduling time should be calculated based on N1+N2+NTAmax+0.5
771 * Refer spec 38.213 section 8.3.
772 * Harcoding the minimum msg3 scheduling for now */
773 uint8_t minMsg3SchTime[MAX_NUM_MU] = {6, 6, 6, 6};
775 uint8_t defaultUlAckTbl[DEFAULT_UL_ACK_LIST_COUNT]= {1, 2, 3 , 4, 5, 6, 7, 8};
777 uint8_t schCmnDlRvTbl[4] = {0, 2, 3, 1};
779 * @brief Function to find first DMRS symbol in PDSCH
783 * Function: findDmrsStartSymbol
785 * This function finds first DMRS symbol using DMRS symbol
788 * @param[in] DMRS symbol position bitmap
789 * @return Success : First DRMS symbol
790 * Failure : MAX_SYMB_PER_SLOT
792 uint8_t findDmrsStartSymbol(uint16_t dlDmrsSymbBitMap)
794 uint8_t position = 0;
797 while(position < MAX_SYMB_PER_SLOT)
799 if(dlDmrsSymbBitMap & mask)
808 * @brief Function to add a node to a linked list
812 * Function: addNodeToLList
814 * This function adds a new node to the linked list
816 * @param[in] Pointer to the list
817 * Pointer to node to be added
818 * Pointer to current node
822 uint8_t addNodeToLList(CmLListCp *llist, void *blockToAdd, CmLList *currNode)
826 SCH_ALLOC(newNode, sizeof(CmLList));
829 newNode->node = (PTR)blockToAdd;
831 if(currNode == NULLP)
832 cmLListAdd2Tail(llist, newNode);
835 llist->crnt = currNode;
836 cmLListInsAfterCrnt(llist, newNode);
844 * @brief Function to delete a node from linked list
848 * Function: deleteNodeFromLList
850 * This function deletes a node from the linked list
852 * @param[in] Pointer to the list
853 * Pointer to node to be deleted
854 * @return Pointer to the deleted node
856 uint8_t deleteNodeFromLList(CmLListCp *llist, CmLList *node)
858 node = cmLListDelFrm(llist, node);
859 SCH_FREE(node, sizeof(CmLList));
865 * @brief Checks if requested PRBs are free
869 * Function: isPrbAvailable
871 * This functions loops through all free PRB blocks and
872 * checks if request PRB block is available for allocation
874 * @param[in] List of free PRB blocks
875 * First PRB requested
876 * Total number of PRB requested
878 * @return Returns Pointer to free block
881 CmLList* isPrbAvailable(CmLListCp *freePrbBlockList, uint16_t startPrb, uint16_t numPrb)
884 CmLList *node = NULLP;
885 FreePrbBlock *freeBlock = NULLP;
887 endPrb = startPrb + numPrb - 1;
889 /* Iterate through all blocks of free PRB to check if requested PRBs can be assigned */
890 node = freePrbBlockList->first;
893 freeBlock = (FreePrbBlock *)node->node;
895 /* Check if requested number of blocks can be allocated from the current block */
896 if(freeBlock->numFreePrb < numPrb)
898 DU_LOG("\nINFO --> SCH: In isPrbAvailable, numFreePrb:%d is less than reqPrb:%d", freeBlock->numFreePrb, numPrb);
903 /* Check if requested PRBs belong within the range of current free block */
904 if(((startPrb >= freeBlock->startPrb) && (startPrb <= freeBlock->endPrb)) && \
905 ((endPrb >= freeBlock->startPrb) && (endPrb <= freeBlock->endPrb)))
910 /* If current block is unable to provide resources, check the next block */
917 * @brief Function to update free PRB list
921 * Function: removeAllocatedPrbFromFreePrbList
923 * This function removes the allocated PRBs from the
926 * @param[in] Pointer to the list
927 * Pointer to node from which PRB was allocated
928 * Start PRB allocated
929 * Number of PRBs allocated
932 void removeAllocatedPrbFromFreePrbList(CmLListCp *freePrbBlockList, CmLList *node, uint16_t startPrb, uint16_t numPrb)
935 FreePrbBlock *newBlock = NULLP;
936 FreePrbBlock *freeBlock = (FreePrbBlock *)node->node;
941 endPrb = startPrb + numPrb -1;
943 /* If the whole block is allocated, remove it from linked list */
944 if(freeBlock->numFreePrb == numPrb)
946 if(deleteNodeFromLList(freePrbBlockList, node) == ROK)
947 SCH_FREE(freeBlock, sizeof(FreePrbBlock));
950 /* If PRB is allocated from start of free block, move the start of free block
951 * after last alloctaed PRB */
952 else if(freeBlock->startPrb == startPrb)
954 freeBlock->startPrb = endPrb+1;
955 freeBlock->numFreePrb = freeBlock->endPrb - freeBlock->startPrb +1;
958 /* If PRB is allocated from end of free block, move the end of free block
959 * before the first allocated PRB */
960 else if(freeBlock->endPrb == endPrb)
962 freeBlock->endPrb = startPrb-1;
963 freeBlock->numFreePrb = freeBlock->endPrb - freeBlock->startPrb +1;
966 /* If PRBs are allocated somewhere in between the free block, split it into 2
967 * nodes. Fist node contains free PRBs after the allocated PRBs. Second node
968 * contains free PRBs present before the allocated PRBs */
972 SCH_ALLOC(newBlock, sizeof(FreePrbBlock));
975 newBlock->startPrb = freeBlock->startPrb;
976 newBlock->endPrb = startPrb-1;
977 newBlock->numFreePrb = newBlock->endPrb - newBlock->startPrb +1;
978 addNodeToLList(freePrbBlockList, newBlock, node);
982 freeBlock->startPrb = endPrb+1;
983 freeBlock->numFreePrb = freeBlock->endPrb - freeBlock->startPrb +1;
988 * @brief frequency domain allocation function.
992 * Function: schCalcTbSize
994 * This function finds the TBSize from table Table 5.1.3.2-1 spec 38.214
996 * @param[in] payLoadSize - size of payload in bytes
997 * @return TBsize from the Table in bytes
999 uint16_t schCalcTbSize(uint32_t payLoadSize)
1001 uint8_t tbsIndex = 0;
1004 maxTbSize = tbSizeTable[TOTAL_TBSIZE_VALUES -1]/8;
1005 if(payLoadSize >= maxTbSize)
1008 payLoadSize = payLoadSize*8;
1009 while(payLoadSize > tbSizeTable[tbsIndex])
1014 /* return the TBsize in bytes */
1015 return (tbSizeTable[tbsIndex]/8);
1019 * @brief frequency domain allocation function.
1023 * Function: schCalcNumPrb
1025 * This function calculates the number of PRbs
1027 * @param[in] tbSize in bytes
1029 * @param[in] number of symbols
1030 * @return number PRBs
1032 uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols)
1034 uint16_t numPrb = 0;
1036 uint16_t nreDash = 0;
1037 uint8_t qm = mcsTable[mcs][1];
1038 uint16_t rValue = mcsTable[mcs][2];
1039 uint8_t numLayer = 1; /* v value */
1040 uint8_t numDmrsRePerPrb = 12;
1042 tbSize = tbSize * 8; //Calculate tbSize in bits
1044 /* formula used for calculation of rbSize, 38.214 section 5.1.3.2 *
1045 * Ninfo = S . Nre . R . Qm . v *
1046 * Nre' = Nsc . NsymPdsch - NdmrsSymb - Noh *
1047 * Nre = min(156,Nre') . nPrb */
1049 nre = ceil( (float)tbSize * 1024 / (qm * rValue * numLayer));
1051 nreDash = ceil( (12 * numSymbols) - numDmrsRePerPrb - 0);
1056 numPrb = ceil((float)nre / nreDash);
1061 * @brief calculation of transport block size.
1065 * Function: schCalcTbSizeFromNPrb
1067 * This function calculates the transport block size
1069 * @param[in] nPrb is num PRB
1071 * @param[in] number of symbols
1074 uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols)
1076 uint8_t qm = mcsTable[mcs][1];
1077 uint16_t rValue = mcsTable[mcs][2];
1078 uint16_t tbsIndex = 0;
1079 uint32_t tbSize = 0;
1081 uint32_t nreDash = 0;
1084 uint32_t nInfoDash = 0;
1086 const uint8_t numLayer = 1;
1087 const uint16_t numRbSc = 12;
1088 const uint16_t numDmrsRes = 12;
1089 const uint16_t sf = 1;
1090 // uint16_t numPrbOvrHead = 0;
1092 /* formula used for calculation of rbSize, 38.214 section 5.1.3.2 *
1093 * Ninfo = Nre . R . Qm . v where [ NInfo is tbSize] *
1094 * Nre' = Nsc . NsymPdsch - NdmrsSymb - Noh *
1095 * Nre = min(156,Nre') . nPrb */
1097 nreDash = MIN(156, ceil( (numRbSc * numSymbols) - numDmrsRes - 0));
1098 nre = nreDash * numPrb;
1099 nInfo = ceil(nre * qm * numLayer * rValue/(1024.0 * sf));
1103 n = MAX(3, (uint32_t)cmLog2(nInfo) - 6);
1104 nInfoDash = MAX(24, (1<<n)*(nInfo/(1<<n)));
1105 while(nInfoDash > tbSizeTable[tbsIndex])
1109 tbSize = tbSizeTable[tbsIndex];
1113 n = (uint32_t)cmLog2(nInfo - 24) - 5;
1114 nInfoDash = MAX(3840, (1<<n)*ceil((nInfo - 24)/(1<<n)));
1118 c = ceil((nInfoDash + 24)/3816);
1119 tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
1123 if(nInfoDash > 8424)
1125 c = ceil((nInfoDash + 24)/8424);
1126 tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
1130 tbSize = 8 * ceil((nInfoDash + 24)/(8)) - 24;
1138 * @brief fetching ueCb from cellCb
1142 * Function: schGetUeCb
1144 * This function fetched UeCb based on crnti from cellCb
1150 SchUeCb* schGetUeCb(SchCellCb *cellCb, uint16_t crnti)
1153 GET_UE_ID(crnti, ueId);
1154 return &(cellCb->ueCb[ueId -1]);
1158 * @brief initialize UL slot info
1162 * Function: schInitUlSlot
1164 * This function intializes UL slot of the cell
1166 * @param[in] schUlSlotInfo
1169 void schInitUlSlot(SchUlSlotInfo *schUlSlotInfo)
1171 CmLList *node = NULLP, *next = NULLP;
1172 FreePrbBlock *freeBlock;
1174 /* Delete the old blocks */
1175 if(schUlSlotInfo->prbAlloc.freePrbBlockList.count)
1177 node = schUlSlotInfo->prbAlloc.freePrbBlockList.first;
1182 freeBlock = (FreePrbBlock *)node->node;
1183 if(deleteNodeFromLList(&schUlSlotInfo->prbAlloc.freePrbBlockList, node) == ROK)
1184 SCH_FREE(freeBlock, sizeof(FreePrbBlock));
1188 /* Initilize UL Slot info and mark all PRBs as free */
1189 memset(schUlSlotInfo, 0, sizeof(SchUlSlotInfo));
1190 cmLListInit(&schUlSlotInfo->prbAlloc.freePrbBlockList);
1191 SCH_ALLOC(freeBlock, sizeof(FreePrbBlock));
1194 freeBlock->numFreePrb = MAX_NUM_RB;
1195 freeBlock->startPrb = 0;
1196 freeBlock->endPrb = MAX_NUM_RB-1;
1197 addNodeToLList(&schUlSlotInfo->prbAlloc.freePrbBlockList, freeBlock, NULL);
1200 schUlSlotInfo->puschCurrentPrb = PUSCH_START_RB;
1201 schUlSlotInfo->schPuschInfo = NULLP;
1205 * @brief initialize DL slot info
1209 * Function: schInitDlSlot
1211 * This function intializes DL slot of the cell
1213 * @param[in] schDlSlotInfo
1216 void schInitDlSlot(SchDlSlotInfo *schDlSlotInfo)
1218 CmLList *node = NULLP, *next = NULLP;
1219 FreePrbBlock *freeBlock;
1221 /* Delete the old blocks */
1222 if(schDlSlotInfo->prbAlloc.freePrbBlockList.count)
1223 node = schDlSlotInfo->prbAlloc.freePrbBlockList.first;
1227 freeBlock = (FreePrbBlock *)node->node;
1228 if(deleteNodeFromLList(&schDlSlotInfo->prbAlloc.freePrbBlockList, node) == ROK)
1229 SCH_FREE(freeBlock, sizeof(FreePrbBlock));
1233 /* Initilize DL Slot info and mark all PRBs as free */
1234 memset(schDlSlotInfo, 0, sizeof(SchDlSlotInfo));
1235 cmLListInit(&schDlSlotInfo->prbAlloc.freePrbBlockList);
1236 SCH_ALLOC(freeBlock, sizeof(FreePrbBlock));
1239 freeBlock->numFreePrb = MAX_NUM_RB;
1240 freeBlock->startPrb = 0;
1241 freeBlock->endPrb = MAX_NUM_RB-1;
1242 addNodeToLList(&schDlSlotInfo->prbAlloc.freePrbBlockList, freeBlock, NULL);
1247 * @brief Fill resource bit map
1251 * Function: fillPrbBitmap
1253 * This function updates bitMap to mark the allocated PRBs
1255 * @param[in] schDlSlotInfo
1258 bool fillPrbBitmap(uint64_t *prbBitMap, uint16_t startPrb, uint16_t numPrb)
1260 uint16_t bitMapIdx = 0;
1261 uint16_t offsetInFirstIdx = 0;
1262 uint32_t numBitsToSetInFirstIdx = 0;
1263 uint64_t mask = MASK_BIT64_ON;
1264 uint64_t bitmapBackup[PRB_BITMAP_MAX_IDX];
1266 /* Store backup of the bitmap in order to roll back if PRB allocation fails */
1267 memcpy(bitmapBackup, prbBitMap, sizeof(bitmapBackup));
1269 /* Calculate the bitmap idx and offset of bit in that idx, to start
1270 * allocating PRBs from */
1271 bitMapIdx = startPrb / PRB_BITMAP_IDX_LEN;
1272 offsetInFirstIdx = startPrb % PRB_BITMAP_IDX_LEN;
1274 /* If number of PRBs allocated >= number of unset bits in first idx starting from offset bit
1275 * then set all bits in first idx starting from offset bit
1276 * else set bits equal to number of PRBs allocated
1278 numBitsToSetInFirstIdx = \
1279 (numPrb >= (PRB_BITMAP_IDX_LEN-offsetInFirstIdx)) ? (PRB_BITMAP_IDX_LEN-offsetInFirstIdx) : numPrb;
1281 mask = mask >> (PRB_BITMAP_IDX_LEN-numBitsToSetInFirstIdx);
1282 mask = mask<<offsetInFirstIdx;
1284 /* If PRBs to be allocated are not already in use, mark these PRBs as allocated */
1285 if(!(prbBitMap[bitMapIdx] & mask))
1287 prbBitMap[bitMapIdx] = prbBitMap[bitMapIdx] | mask;
1290 numPrb = numPrb - numBitsToSetInFirstIdx;
1291 /* Set all bits in a bitMapIdx until remaining numPrb is less than PRB_BITMAP_IDX_LEN */
1292 while(numPrb > PRB_BITMAP_IDX_LEN)
1294 if(prbBitMap[bitMapIdx])
1296 memcpy(prbBitMap, bitmapBackup, sizeof(bitmapBackup));
1299 prbBitMap[bitMapIdx] = MASK_BIT64_ON;
1301 numPrb = numPrb - PRB_BITMAP_IDX_LEN;
1304 /* Set bits for the remaining PRBs */
1307 mask = MASK_BIT64_ON;
1308 mask = mask >> (PRB_BITMAP_IDX_LEN-numPrb);
1309 if(!(prbBitMap[bitMapIdx] & mask))
1311 prbBitMap[bitMapIdx] = prbBitMap[bitMapIdx] | mask;
1315 memcpy(prbBitMap, bitmapBackup, sizeof(bitmapBackup));
1329 /**************************************************************************
1331 * @brief Update the LCID Node in LCLL as per ActionType
1335 * Function : handleLcLList
1338 * Search LCID in LCLL or if not found, create,Delete, or return
1339 * node for this LCID
1341 * @params[in] I/P > lcLinkList pointer (LcInfo list)
1343 * I/P > ActionType (Create,Delete or Just search)
1345 * @return lcNode > Pointer to the Node for that LcInfo
1346 * If NULLP, FATAL FAILURE
1348 * ***********************************************************************/
1349 LcInfo* handleLcLList(CmLListCp *lcLL, uint8_t lcId, ActionTypeLL action)
1351 CmLList *node = NULLP;
1352 LcInfo *lcNode = NULLP;
1357 DU_LOG("\nERROR --> SCH: LcList doesnt exist");
1362 /*Traversing the LC LinkList*/
1365 lcNode = (LcInfo *)node->node;
1366 if(lcNode->lcId == lcId)
1390 /*Need to add a new node for this LC*/
1392 /*List is empty; Initialize the LL ControlPointer*/
1393 if(lcLL->count == 0)
1399 /*Allocate the List*/
1400 SCH_ALLOC(lcNode, sizeof(LcInfo));
1403 lcNode->lcId = lcId;
1405 lcNode->allocBO = 0;
1406 lcNode->allocPRB = 0;
1410 DU_LOG("\nERROR --> SCH : Allocation of List failed,lcId:%d",lcId);
1414 if(addNodeToLList(lcLL, lcNode, NULLP) == RFAILED)
1416 DU_LOG("\nERROR --> SCH : failed to Add Node,lcId:%d",lcId);
1417 SCH_FREE(lcNode, sizeof(LcInfo));
1425 if(!found || lcNode == NULLP)
1427 DU_LOG("\nERROR --> SCH: LCID%d not found; thus Deletion unsuccessful",lcId);
1431 if(deleteNodeFromLList(lcLL, node) == ROK)
1432 SCH_FREE(lcNode, sizeof(LcInfo));
1434 DU_LOG("\nDEBUG --> SCH: LCID%d Deleted successfully",lcId);
1445 DU_LOG("\nERROR --> SCH: Action type wrong: %d",action);
1452 /**************************************************************************
1454 * @brief Update ReqPRB for a partiular LCID in LC Linklist
1458 * Function : updateLcListReqPRB
1461 * Update ReqPRB for a partiular LCID in LC Linklist
1463 * @params[in] I/P > lcLinkList pointer (LcInfo list)
1468 * @return ROK/RFAILED
1470 * ***********************************************************************/
1471 uint8_t updateLcListReqPRB(CmLListCp *lcLL, uint8_t lcId, uint32_t payloadSize)
1473 LcInfo *lcNode = NULLP;
1474 lcNode = handleLcLList(lcLL, lcId, CREATE);
1478 DU_LOG("\nERROR --> SCH : LC is neither present nor able to create in List lcId:%d",lcId);
1482 lcNode->reqBO = payloadSize;
1483 lcNode->allocBO = 0;
1484 lcNode->allocPRB = 0; /*Re-Initializing the AllocPRB*/
1488 /**************************************************************************
1490 * @brief Delete entire LC Linklist
1494 * Function : deleteLcLL
1497 * Delete entire LC Linklist
1499 * @params[in] lcLinkList pointer (LcInfo list)
1503 * ***********************************************************************/
1504 void deleteLcLL(CmLListCp *lcLL)
1506 CmLList *node = NULLP, *next = NULLP;
1507 LcInfo *lcNode = NULLP;
1511 DU_LOG("\nERROR --> SCH: LcList doesnt exist");
1519 lcNode = (LcInfo *)node->node;
1520 if(deleteNodeFromLList(lcLL, node) == ROK)
1521 SCH_FREE(lcNode, sizeof(LcInfo));
1526 /****************************************************************************
1528 * @brief Calculate the Estimated TBS Size based on Spec 38.421 , Sec 5.3.1.2
1532 * Function : calculateEstimateTBSize
1535 * TBS Size calculation requires numPRB. Since exactPRB for reqBO is unknown thus
1536 * will give the PRB value(from 0 to maxRB) one by one and
1537 * try to find the TBS size closest to reqBO
1539 * @params[in] I/P > reqBO, mcsIdx, num PDSCH symbols,
1540 * I/P > maxRB: Maximum PRB count to reach for calculating the TBS
1541 * O/P > estPrb : Suitable PRB count for reaching the correct TBS
1544 * @return TBS Size > Size which will can be allocated for this LC
1547 *************************************************************************/
1548 uint32_t calculateEstimateTBSize(uint32_t reqBO, uint16_t mcsIdx, uint8_t numSymbols,\
1549 uint16_t maxPRB, uint16_t *estPrb)
1551 uint32_t tbs = 0, effecBO = 0;
1554 /*Loop Exit: Either estPRB reaches the maxRB or TBS is found greater than equal to reqBO*/
1557 tbs = schCalcTbSizeFromNPrb(*estPrb, mcsIdx, numSymbols);
1559 /*TBS size calculated in above function is in Bits.
1560 * So to convert it into Bytes , we right shift by 3.
1561 * Eg: tbs=128 bits(1000 0000) ; Right Shift by 3: Tbs = 0001 0000(16 bytes)*/
1564 }while((tbs < reqBO) && (*estPrb < maxPRB));
1566 /*Effective BO is the Grant which can be provided for this LC.
1567 * Here,it is decided based on whether we can fully cater its requirment (reqBO)
1568 * or has to provide lesser grant due to resource limitation.
1569 * Thus effective BO/Grant for this LC will be min of TBS calculated and reqBO*/
1570 effecBO = MIN(tbs,reqBO);
1575 /*******************************************************************
1577 * @brief deleting Page Info node from PageInfo List
1581 * Function : schDeleteFromPageInfoList
1583 * Functionality: deleting page Info node from Page Info List
1585 * @params[in] CmLListCp *list, CmLList *node
1589 * ****************************************************************/
1590 void schDeleteFromPageInfoList(CmLListCp *list, CmLList *node)
1592 SchPageInfo *pageInfo;
1596 pageInfo = (SchPageInfo *)node->node;
1597 if(deleteNodeFromLList(list, node) == ROK)
1598 SCH_FREE(pageInfo, sizeof(SchPageInfo));
1602 /*******************************************************************
1604 * @brief searching for Page at a particular SFN
1608 * Function : schPageInfoSearchFromPageList
1610 * Functionality: searching for Page at a particular SFN
1612 * @params[in] SlotTimingInfo slotInfo, CmLListCp *storedPageList
1614 * @return pointer to SchPageInfo
1616 * ****************************************************************/
1617 CmLList *schPageInfoSearchFromPageList(SlotTimingInfo slotInfo, CmLListCp *storedPageList)
1619 CmLList *node = NULLP;
1620 SchPageInfo *pageInfo = NULLP;
1622 if(storedPageList->count)
1624 CM_LLIST_FIRST_NODE(storedPageList, node);
1627 pageInfo = (SchPageInfo*)node->node;
1628 if(pageInfo == NULLP)
1630 DU_LOG("\nERROR --> SCH: PageInfo empty");
1632 else if(pageInfo->pageTxTime.sfn == slotInfo.sfn &&
1633 (pageInfo->pageTxTime.slot == slotInfo.slot))
1643 /*Below function for printing will be used in future so disabling it for now*/
1645 /****************************************************************************
1647 * @brief Print the LC in list for debugging purpose
1651 * Function : printLcLL
1654 * For debugging purpose, for printing the LC in the order and
1657 * @params[in] LcList pointer
1661 *************************************************************************/
1662 void printLcLL(CmLListCp *lcLL)
1664 CmLList *node = NULLP;
1665 LcInfo *lcNode = NULLP;
1669 DU_LOG("\nINFO --> SCH: LcList doesnt exist");
1675 lcNode = (LcInfo *)node->node;
1678 DU_LOG("\nINFO --> SCH : LcID:%d, [reqBO, allocBO, allocPRB]:[%d,%d,%d]",\
1679 lcNode->lcId,lcNode->reqBO, lcNode->allocBO, lcNode->allocPRB);
1690 * @brief determines slot/symbol format
1694 * Function : schGetSlotSymbFrmt
1696 * This API is invoked to determine if current slot is DL or UL
1698 * @param[in] uint16_t slot
1699 * @param[in] uint32_t bitMap from cellCb
1700 * @return SlotConfig
1705 SlotConfig schGetSlotSymbFrmt(uint16_t slot, uint32_t bitMap)
1707 uint32_t offset = (slot)*2;
1708 return (bitMap & 0x3<<offset)>>offset;
1710 SlotConfig slotFrmt;
1711 int mask1 = 0, mask2 = 0;
1713 slot = (slot%n)*2;//n num of slots in defined periodicity or num of symbols
1715 mask2 = 1<<(slot+1);
1716 slotFrmt = ((mask1 & bitMap)>>slot) + (2*((mask2 & bitMap)>>(slot+1)));
1718 //printf("\n\n\n\n*****FormatType:%d Slot:%d****\n\n\n\n", slotFrmt, slot/2);
1725 * @brief Determine total length of configured slot pattern for specific
1726 * periodicity for TDD
1730 * Function : calculateSlotPatternLength
1732 * Determine total length of configured slot pattern for specific periodicity based
1733 * on slot duration for TDD
1735 * @param[in] uint8_t scs, uint8_t periodicity
1737 * @return uint8_t slotPatternLength
1740 uint8_t calculateSlotPatternLength(uint8_t scs, uint8_t periodicity)
1742 uint8_t slotPatternLength =0;
1743 float slotDuration = 0;
1745 /* Calculating the slot duration with the help of SCS.
1746 * This will provides the slot duration in ms like 1, 0.5, 0.25, 0.125.
1747 * If scs value is SCS_30KHZ its enum value is 1,
1748 * slotDuration = pow(0.5, 1);
1749 * slotDuration = 0.5 */
1751 slotDuration = pow(0.5,scs);
1753 /* Calculating length of pattern based on Transmission Periodicity.
1754 * If periodicity = TX_PRDCTY_MS_5,
1755 * slotPatternLength = 5/0.5
1756 * slotPatternLength = 10 i.e. {length of slot pattern DDDDDDDFUU}*/
1760 case TX_PRDCTY_MS_0P5:
1761 slotPatternLength = 0.5/slotDuration;
1763 case TX_PRDCTY_MS_0P625:
1764 slotPatternLength = 0.625/slotDuration;
1766 case TX_PRDCTY_MS_1:
1767 slotPatternLength = 1/slotDuration;
1769 case TX_PRDCTY_MS_1P25:
1770 slotPatternLength = 1.25/slotDuration;
1772 case TX_PRDCTY_MS_2:
1773 slotPatternLength = 2/slotDuration;
1775 case TX_PRDCTY_MS_2P5:
1776 slotPatternLength = 2.5/slotDuration;
1778 case TX_PRDCTY_MS_5:
1779 slotPatternLength = 5/slotDuration;
1781 case TX_PRDCTY_MS_10:
1782 slotPatternLength = 10/slotDuration;
1785 return slotPatternLength;
1791 * Frequency domain resources is a bitmap defining non-overlapping groups of 6 PRBs in ascending order.
1792 * [TS38.213 10.1]. Bitmap of uint8 array. 45 bits.
1795 * CORESET-freqdom.frequencyDomainResources : The bits of the bitmap have a one-to-one mapping with
1796 * non-overlapping groups of 6 RBs. The most significant bit of the first word corresponds to
1797 * the most significant bit defined in 38.331.
1799 * FAPI and IAPI both are 45 bits. Mapped from bit 0 LS Byte for the FAPI and
1800 * bit 0 LS U32 entry for IAPI.
1801 * FAPI is to be filled in following format such that Intel L1 is able to decode it :
1804 * FreqDomainResource[0] bits 7-0 -> nFreqDomain[0] bits 7-0
1805 * FreqDomainResource[1] bits 7-0 -> nFreqDomain[0] bits 15-8
1806 * FreqDomainResource[2] bits 7-0 -> nFreqDomain[0] bits 23-16
1807 * FreqDomainResource[3] bits 7-0 -> nFreqDomain[0] bits 31-24
1808 * FreqDomainResource[4] bits 7-0 -> nFreqDomain[1] bits 7-0
1809 * FreqDomainResource[5] bits 7-0 -> nFreqDomain[1] bits 15-8
1811 * where for the last entry bits 7,6 and 5 are don't care in the FAPI and bits
1812 * 31-13 are don't care in the IAPI.
1814 void covertFreqDomRsrcMapToIAPIFormat(uint8_t *sourceBitMap, uint8_t *destBitMap)
1817 uint8_t numBitsToShift = 0;
1818 uint64_t freqDomainResources = 0;
1820 /* Bit operation to create a 64-bit integer that has
1821 * 48 LSBs [Bit 47 to Bit 0] mapped to sourceBitMap[0] to sourceBitMap[5]
1823 for(idx = FREQ_DOM_RSRC_SIZE-1; idx >=0; idx--)
1825 freqDomainResources |= ((uint64_t)sourceBitMap[idx] << numBitsToShift);
1826 numBitsToShift += 8;
1829 /* Right shift 3 bits because bits[2-0] are unused in sourceBitMap[5] */
1830 freqDomainResources = freqDomainResources >> 3;
1832 /* Filling destBitMap such that LSB bit 0 of freqDomainResources maps to LSB
1833 * of first word of destBitMap */
1835 for(idx=0; idx<FREQ_DOM_RSRC_SIZE; idx++)
1837 destBitMap[idx] = freqDomainResources >> numBitsToShift;
1838 numBitsToShift += 8;
1841 /**********************************************************************
1843 **********************************************************************/