WLS code changes at Lower Mac - PHY inteface
[o-du/l2.git] / src / phy_stub / l1_bdy1.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
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 /*This file contains stub for PHY to handle messages to/from MAC CL */
20
21 #include <stdint.h>
22
23 #include "envdep.h"
24 #include "gen.h"
25 #include "ssi.h"
26
27 #include "gen.x"
28 #include "ssi.x"
29
30 #include "lwr_mac.h"
31 #include "lwr_mac_phy.h"
32 #ifdef FAPI
33 #include "fapi.h"
34 #endif
35 #include "lphy_stub.h"
36 #include "du_log.h"
37
38 #define MAX_SLOT_VALUE   9
39 #define MAX_SFN_VALUE    1023
40
41 uint16_t sfnValue = 0;
42 uint16_t slotValue = 0;
43 EXTERN void phyToMac ARGS((uint16_t msgType, uint32_t msgLen,void *msg));
44 #ifdef FAPI
45 EXTERN void fillTlvs ARGS((fapi_uint16_tlv_t *tlv, uint16_t tag, uint16_t
46 length, uint16_t value, uint32_t *msgLen));
47 EXTERN void fillMsgHeader ARGS((fapi_msg_t *hdr, uint16_t msgType, uint16_t msgLen));
48 #endif
49 EXTERN void handlePhyMessages(uint16_t msgType, uint32_t msgSize, void *msg);
50
51 /*******************************************************************
52  *
53  * @brief Builds and sends param response to MAC CL
54  *
55  * @details
56  *
57  *    Function : l1BldAndSndParamRsp
58  *
59  *    Functionality:
60  *          - Builds and sends param response to MAC
61  *
62  * @params[in] Config request message pointer
63  * @return ROK     - success
64  *         RFAILED - failure
65  *
66  * ****************************************************************/
67 S16 l1BldAndSndParamRsp(void *msg)
68 {
69 #ifdef FAPI
70    uint8_t index = 0;
71    uint32_t msgLen = 0;
72         fapi_param_resp_t *fapiParamRsp = (fapi_param_resp_t *)msg;
73
74   /* Cell Params */
75   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_RELEASE_CAPABILITY_TAG,                          sizeof(uint16_t), 1, &msgLen);
76   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PHY_STATE_TAG,                                   sizeof(uint16_t), 0, &msgLen);
77   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SKIP_BLANK_DL_CONFIG_TAG,                        sizeof(uint8_t),  0, &msgLen);
78   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SKIP_BLANK_UL_CONFIG_TAG,                        sizeof(uint8_t),  0, &msgLen);
79   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_NUM_CONFIG_TLVS_TO_REPORT_TYPE_TAG,              sizeof(uint8_t),  0, &msgLen);
80
81   /* Carrier Params */
82   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_CYCLIC_PREFIX_TAG,                               sizeof(uint8_t),  1, &msgLen);
83   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_SUBCARRIER_SPACING_DL_TAG,             sizeof(uint8_t),  1, &msgLen);
84   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_BANDWIDTH_DL_TAG,                      sizeof(uint16_t), 1, &msgLen);
85   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_SUBCARRIER_SPACING_UL_TAG,             sizeof(uint8_t),  0, &msgLen);
86   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_BANDWIDTH_UL_TAG,                      sizeof(uint16_t), 0, &msgLen);
87
88   /* PDCCH Param*/
89   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_CCE_MAPPING_TYPE_TAG,                            sizeof(uint8_t), 0, &msgLen);
90   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG,   sizeof(uint8_t), 0, &msgLen);
91   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRECODER_GRANULARITY_CORESET_TAG,                sizeof(uint8_t), 0, &msgLen);
92   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDCCH_MU_MIMO_TAG,                               sizeof(uint8_t), 0, &msgLen);
93   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDCCH_PRECODER_CYCLING_TAG,                      sizeof(uint8_t), 0, &msgLen);
94   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PDCCHS_PER_SLOT_TAG,                         sizeof(uint8_t), 0, &msgLen);
95
96   /* PUCCH Param */
97   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUCCH_FORMATS_TAG,                               sizeof(uint8_t), 0, &msgLen);
98   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PUCCHS_PER_SLOT_TAG,                         sizeof(uint8_t), 0, &msgLen);
99
100   /* PDSCH Param */
101   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_MAPPING_TYPE_TAG,                          sizeof(uint8_t), 0, &msgLen);
102   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_ALLOCATION_TYPES_TAG,                      sizeof(uint8_t), 0, &msgLen);
103   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_VRB_TO_PRB_MAPPING_TAG,                    sizeof(uint8_t), 0, &msgLen);
104   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_CBG_TAG,                                   sizeof(uint8_t), 0, &msgLen);
105   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DMRS_CONFIG_TYPES_TAG,                     sizeof(uint8_t), 0, &msgLen);
106   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DMRS_MAX_LENGTH_TAG,                       sizeof(uint8_t), 0, &msgLen);
107   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DMRS_ADDITIONAL_POS_TAG,                   sizeof(uint8_t), 0, &msgLen);
108   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PDSCHS_TBS_PER_SLOT_TAG,                     sizeof(uint8_t), 0, &msgLen);
109   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG,                sizeof(uint8_t), 0, &msgLen);
110   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_MAX_MODULATION_ORDER_DL_TAG,           sizeof(uint8_t), 0, &msgLen);
111   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_MU_MIMO_USERS_DL_TAG,                        sizeof(uint8_t), 0, &msgLen);
112   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG,                  sizeof(uint8_t), 0, &msgLen);
113   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PREMPTIONSUPPORT_TAG,                            sizeof(uint8_t), 0, &msgLen);
114   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PDSCH_NON_SLOT_SUPPORT_TAG,                      sizeof(uint8_t), 0, &msgLen);
115
116   /* PUSCH Param */
117   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_UCI_MUX_ULSCH_IN_PUSCH_TAG,                      sizeof(uint8_t), 0, &msgLen);
118   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_UCI_ONLY_PUSCH_TAG,                              sizeof(uint8_t), 0, &msgLen);
119   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_FREQUENCY_HOPPING_TAG,                     sizeof(uint8_t), 0, &msgLen);
120   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_DMRS_CONFIG_TYPES_TAG,                     sizeof(uint8_t), 0, &msgLen);
121   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_DMRS_MAX_LEN_TAG,                          sizeof(uint8_t), 0, &msgLen);
122   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_DMRS_ADDITIONAL_POS_TAG,                   sizeof(uint8_t), 0, &msgLen);
123   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_CBG_TAG,                                   sizeof(uint8_t), 0, &msgLen);
124   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_MAPPING_TYPE_TAG,                          sizeof(uint8_t), 0, &msgLen);
125   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_ALLOCATION_TYPES_TAG,                      sizeof(uint8_t), 0, &msgLen);
126   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_VRB_TO_PRB_MAPPING_TAG,                    sizeof(uint8_t), 0, &msgLen);
127   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_MAX_PTRS_PORTS_TAG,                        sizeof(uint8_t), 0, &msgLen);
128   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PDUSCHS_TBS_PER_SLOT_TAG,                    sizeof(uint8_t), 0, &msgLen);
129   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,         sizeof(uint8_t), 0, &msgLen);
130   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_SUPPORTED_MODULATION_ORDER_UL_TAG,               sizeof(uint8_t), 0, &msgLen);
131   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_MU_MIMO_USERS_UL_TAG,                        sizeof(uint8_t), 0, &msgLen);
132   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_DFTS_OFDM_SUPPORT_TAG,                           sizeof(uint8_t), 0, &msgLen);
133   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PUSCH_AGGREGATION_FACTOR_TAG,                    sizeof(uint8_t), 0, &msgLen);
134
135   /* PRACH Params */
136   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRACH_LONG_FORMATS_TAG,                          sizeof(uint8_t), 0, &msgLen);
137   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRACH_SHORT_FORMATS_TAG,                         sizeof(uint8_t), 0, &msgLen);
138   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_PRACH_RESTRICTED_SETS_TAG,                       sizeof(uint8_t), 0, &msgLen);
139   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,            sizeof(uint8_t), 0, &msgLen);
140
141   /* MEASUREMENT TAG */
142   fillTlvs(&fapiParamRsp->tlvs[index++],  FAPI_RSSI_MEASUREMENT_SUPPORT_TAG,                    sizeof(uint8_t), 0, &msgLen);
143
144   fapiParamRsp->number_of_tlvs = index;
145   msgLen = msgLen + sizeof(fapi_param_resp_t);
146
147   fillMsgHeader(&fapiParamRsp->header, FAPI_PARAM_RESPONSE, msgLen);
148   fapiParamRsp->error_code = MSG_OK;
149   DU_LOG("\nPHY_STUB: Sending Param Request to Lower Mac");
150   handlePhyMessages(fapiParamRsp->header.message_type_id, sizeof(fapi_param_resp_t), (void *)fapiParamRsp);
151 #endif
152   return ROK;
153 }
154
155 /*******************************************************************
156  *
157  * @brief Builds and sends config response to lower mac
158  *
159  * @details
160  *
161  *    Function : l1BldAndSndConfigRsp
162  *
163  *    Functionality:
164  *          - Builds and sends config response to MAC
165  *
166  * @params[in] Config request message pointer
167  * @return ROK     - success
168  *         RFAILED - failure
169  *
170  * ****************************************************************/
171
172 S16 l1BldAndSndConfigRsp(void *msg)
173 {
174 #ifdef FAPI
175    uint32_t msgLen = 0;
176    fapi_config_resp_t *fapiConfigRsp = (fapi_config_resp_t *)msg;
177
178    if(fapiConfigRsp != NULL)
179    {
180       fapiConfigRsp->number_of_invalid_tlvs = NULLP;
181       fapiConfigRsp->number_of_inv_tlvs_idle_only = NULLP;
182       fapiConfigRsp->number_of_missing_tlvs = NULLP;
183       fapiConfigRsp->error_code = MSG_OK;
184       msgLen += sizeof(fapi_config_resp_t);
185       fillMsgHeader(&fapiConfigRsp->header, FAPI_CONFIG_RESPONSE, msgLen);
186       DU_LOG("\nPHY_STUB: Sending Config Response to Lower Mac");
187       handlePhyMessages(fapiConfigRsp->header.message_type_id, sizeof(fapi_config_resp_t), (void *)fapiConfigRsp);
188       return ROK;
189    }
190 #else
191    return ROK;
192 #endif
193 }
194 /*******************************************************************
195  *
196  * @brief Handles param request received from MAC
197  *
198  * @details
199  *
200  *    Function : l1HdlParamReq
201  *
202  *    Functionality:
203  *          -Handles param request received from MAC
204  *
205  * @params[in]   Message length
206  *               Param request message pointer
207  *
208  * @return void
209  *
210  * ****************************************************************/
211
212 PUBLIC void l1HdlParamReq(uint32_t msgLen, void *msg)
213 {
214    DU_LOG("\nPHY_STUB: Received Param Request in PHY");
215    /* Handling PARAM RESPONSE */
216    if(l1BldAndSndParamRsp(msg)!= ROK)
217    {
218       DU_LOG("\nPHY_STUB: Failed Sending Param Response");
219    }
220
221
222 /*******************************************************************
223  *
224  * @brief Handles config request received from MAC
225  *
226  * @details
227  *
228  *    Function : l1HdlConfigReq
229  *
230  *    Functionality:
231  *          -Handles config request received from MAC
232  *
233  * @params[in]   Message length
234  *               config request message pointer
235  *
236  * @return void
237  *
238  * ****************************************************************/
239
240 PUBLIC void l1HdlConfigReq(uint32_t msgLen, void *msg)
241 {
242    DU_LOG("\nPHY_STUB: Received Config Request in PHY");
243
244    /* Handling CONFIG RESPONSE */
245    if(l1BldAndSndConfigRsp(msg)!= ROK)
246    {
247       printf("\nPHY_STUB: Failed Sending config Response");
248    }
249 }
250
251 /*******************************************************************
252  *
253  * @brief Builds and Send the Slot Indication message to MAC
254  *
255  * @details
256  *
257  *    Function : buildAndSendSlotIndication
258  *
259  *    Functionality:
260  *          -Send the Slot indication Message to MAC
261  *
262  * @params[in]   Message length
263  *               config request message pointer
264  *
265  * @return void
266  *
267  * ****************************************************************/
268 PUBLIC S16 buildAndSendSlotIndication()
269 {
270 #ifdef FAPI
271    fapi_slot_ind_t *slotIndMsg;
272    if(SGetSBuf(0, 0, (Data **)&slotIndMsg, sizeof(slotIndMsg)) != ROK)
273    {
274        DU_LOG("\nPHY_STUB: Memory allocation failed for slot Indication Message");
275        return RFAILED;
276    }
277    else
278    {
279       slotValue++;
280       if(sfnValue > MAX_SFN_VALUE && slotValue > MAX_SLOT_VALUE)
281       {
282          sfnValue = 0;
283          slotValue = 0;
284       }
285       else if(slotValue > MAX_SLOT_VALUE)
286       {
287          sfnValue++;
288          slotValue = 0;
289       }
290       slotIndMsg->sfn = sfnValue;
291       slotIndMsg->slot = slotValue;
292       fillMsgHeader(&slotIndMsg->header, FAPI_SLOT_INDICATION, sizeof(fapi_slot_ind_t));
293       DU_LOG("\nPHY_STUB [%d:%d] ",sfnValue,slotValue);
294       handlePhyMessages(slotIndMsg->header.message_type_id, sizeof(fapi_slot_ind_t), (void*)slotIndMsg);
295       SPutSBuf(0, 0, (Data *)slotIndMsg, sizeof(slotIndMsg));
296    }
297 #endif
298    return ROK;
299 }
300
301 /*******************************************************************
302  *
303  * @brief Handles start request received from MAC
304  *
305  * @details
306  *
307  *    Function : l1HdlStartReq
308  *
309  *    Functionality:
310  *          -Handles start request received from MAC
311  *
312  * @params[in]   Message length
313  *               config request message pointer
314  *
315  * @return void
316  *
317  * ****************************************************************/
318
319 PUBLIC S16 l1HdlStartReq(uint32_t msgLen, void *msg)
320 {
321    if(clGlobalCp.phyState == PHY_STATE_CONFIGURED)
322    {
323       duStartSlotIndicaion();
324 #ifdef FAPI
325       SPutSBuf(0, 0, (Data *)msg, sizeof(fapi_start_req_t));
326 #endif
327       return ROK;
328    }
329    else
330    {
331       DU_LOG("\n PHY_STUB: Received Start Req in PHY State %d", clGlobalCp.phyState);
332       return RFAILED;
333    }
334 }
335
336 /*******************************************************************
337 *
338 * @brief Handles Dl Tti request received from MAC
339 *
340 * @details
341 *
342 *    Function : l1HdlDlTtiReq
343 *
344 *    Functionality:
345 *          -Handles Dl Tti request received from MAC
346 *
347 * @params[in]   Message length
348 *               Dl Tti request message pointer
349 *
350 * @return void
351 *
352 * ****************************************************************/
353
354 PUBLIC S16 l1HdlDlTtiReq(uint16_t msgLen, void *msg)
355 {
356 #ifdef FAPI
357    fapi_dl_tti_req_t *dlTtiReq;
358    dlTtiReq = (fapi_dl_tti_req_t *)msg;
359 #if 0
360    printf("\nPHY_STUB:  Received DL TTI Request in PHY");
361    printf("\nPHY_STUB:  SFN     %d", dlTtiReq->sfn);
362    printf("\nPHY_STUB:  SLOT    %d", dlTtiReq->slot);
363    printf("\nPHY_STUB:  nPdus   %d", dlTtiReq->nPdus);
364    printf("\nPHY_STUB:  nGroup  %d", dlTtiReq->nGroup);
365    /* Printing SSB CONFIGURED VALUES */
366    printf("\nPHY_STUB: physCellId   %d", dlTtiReq->pdus->u.ssb_pdu.physCellId);
367    printf("\nPHY_STUB: betaPss      %d", dlTtiReq->pdus->u.ssb_pdu.betaPss);
368    printf("\nPHY_STUB: ssbBlockIndex %d",       dlTtiReq->pdus->u.ssb_pdu.ssbBlockIndex);
369    printf("\nPHY_STUB: ssbSubCarrierOffset %d", dlTtiReq->pdus->u.ssb_pdu.ssbSubCarrierOffset);
370    printf("\nPHY_STUB: ssbOffsetPointA     %d", dlTtiReq->pdus->u.ssb_pdu.ssbOffsetPointA);
371    printf("\nPHY_STUB: bchPayloadFlag      %d", dlTtiReq->pdus->u.ssb_pdu.bchPayloadFlag);
372    printf("\nPHY_STUB: bchPayload          %x", dlTtiReq->pdus->u.ssb_pdu.bchPayload);
373 #endif
374    uint8_t numPdus = dlTtiReq->nPdus;
375         if(numPdus == 0)
376         {
377                 DU_LOG("\nNo PDU \n");
378    }
379         while(numPdus)
380         {
381                 if(dlTtiReq->pdus->pduType == 3) //SSB_PDU_TYPE
382                         DU_LOG("\nSSB PDU\n");
383                 else if(dlTtiReq->pdus->pduType == 0)
384                         DU_LOG("\nSIB1 PDCCH PDU\n");
385                 else if(dlTtiReq->pdus->pduType == 1)
386                    DU_LOG("\nSIB1 PDSCH PDU\n");
387
388                 numPdus--;
389         }
390
391    SPutSBuf(0, 0, (Data *)dlTtiReq, sizeof(fapi_dl_tti_req_t));
392 #endif
393    return ROK;
394 }
395 /*******************************************************************
396  *
397  * @brief Receives message from MAC
398  *
399  * @details
400  *
401  *    Function : processFapiRequest
402  *
403  *    Functionality:
404  *       - Receives message from MAC and calls handler
405  *
406  * @params[in] Message type
407  *             Message length
408  *             Message pointer
409  *
410  * @return void
411  *
412  * ****************************************************************/
413
414 void processFapiRequest(uint8_t msgType, uint32_t msgLen, void *msg)
415 {
416    switch(msgType)
417    {
418 #ifdef FAPI
419       case FAPI_PARAM_REQUEST:
420          l1HdlParamReq(msgLen, msg);
421          break;
422       case FAPI_CONFIG_REQUEST:
423          l1HdlConfigReq(msgLen, msg);
424          break;
425       case FAPI_START_REQUEST:
426          l1HdlStartReq(msgLen, msg);
427          break;
428       case FAPI_DL_TTI_REQUEST:
429          l1HdlDlTtiReq(msgLen, msg);
430          break;
431       default:
432          DU_LOG("\nPHY_STUB: Invalid message type[%x] received at PHY", msgType);
433          break;
434 #endif
435    }
436 }
437 /**********************************************************************
438          End of file
439 **********************************************************************/