nr_init.c 18.9 KB
Newer Older
Guy De Souza's avatar
Guy De Souza committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

22
23
#include "PHY/defs_gNB.h"
#include "PHY/phy_extern.h"
Guy De Souza's avatar
Guy De Souza committed
24
#include "PHY/NR_REFSIG/nr_refsig.h"
25
#include "PHY/INIT/phy_init.h"
Guy De Souza's avatar
Guy De Souza committed
26
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
27
28
29
#include "RadioResourceConfigCommonSIB.h"
#include "RadioResourceConfigDedicated.h"
#include "TDD-Config.h"
30
#include "LAYER2/MAC/mac_extern.h"
31
32
33
#include "MBSFN-SubframeConfigList.h"
#include "assertions.h"
#include <math.h>
34

Guy De Souza's avatar
Guy De Souza committed
35
#include "PHY/NR_REFSIG/nr_refsig.h" 
ChenWeiTai's avatar
ChenWeiTai committed
36
#include "PHY/LTE_REFSIG/lte_refsig.h"
ChenWeiTai's avatar
ChenWeiTai committed
37
#include "SCHED_NR/fapi_nr_l1.h"
ChenWeiTai's avatar
ChenWeiTai committed
38

knopp's avatar
knopp committed
39
40
extern uint32_t from_nrarfcn(int nr_bandP,uint32_t dl_nrarfcn);
extern int32_t get_uldl_offset(int nr_bandP);
41
42
43
44
45

int l1_north_init_gNB() {

  int i,j;

ChenWeiTai's avatar
ChenWeiTai committed
46
  if (RC.nb_nr_L1_inst > 0 && RC.nb_nr_L1_CC != NULL && RC.gNB != NULL)
47
  {
ChenWeiTai's avatar
ChenWeiTai committed
48
49
    AssertFatal(RC.nb_nr_L1_inst>0,"nb_nr_L1_inst=%d\n",RC.nb_nr_L1_inst);
    AssertFatal(RC.nb_nr_L1_CC!=NULL,"nb_nr_L1_CC is null\n");
50
51
    AssertFatal(RC.gNB!=NULL,"RC.gNB is null\n");

ChenWeiTai's avatar
ChenWeiTai committed
52
    LOG_I(PHY,"%s() RC.nb_nr_L1_inst:%d\n", __FUNCTION__, RC.nb_nr_L1_inst);
53

ChenWeiTai's avatar
ChenWeiTai committed
54
    for (i=0;i<RC.nb_nr_L1_inst;i++) {
55
      AssertFatal(RC.gNB[i]!=NULL,"RC.gNB[%d] is null\n",i);
ChenWeiTai's avatar
ChenWeiTai committed
56
      AssertFatal(RC.nb_nr_L1_CC[i]>0,"RC.nb_nr_L1_CC[%d]=%d\n",i,RC.nb_nr_L1_CC[i]);
57

ChenWeiTai's avatar
ChenWeiTai committed
58
      LOG_I(PHY,"%s() RC.nb_nr_L1_CC[%d]:%d\n", __FUNCTION__, i,  RC.nb_nr_L1_CC[i]);
59

ChenWeiTai's avatar
ChenWeiTai committed
60
      for (j=0;j<RC.nb_nr_L1_CC[i];j++) {
61
62
        AssertFatal(RC.gNB[i][j]!=NULL,"RC.gNB[%d][%d] is null\n",i,j);

63
        if ((RC.gNB[i][j]->if_inst =  NR_IF_Module_init(i))<0) return(-1); 
64
65
66

        LOG_I(PHY,"%s() RC.gNB[%d][%d] installing callbacks\n", __FUNCTION__, i,  j);

ChenWeiTai's avatar
ChenWeiTai committed
67
68
        RC.gNB[i][j]->if_inst->NR_PHY_config_req = nr_phy_config_request;
        RC.gNB[i][j]->if_inst->NR_Schedule_response = nr_schedule_response;
69
70
71
72
73
      }
    }
  }
  else
  {
ChenWeiTai's avatar
ChenWeiTai committed
74
    LOG_I(PHY,"%s() Not installing PHY callbacks - RC.nb_nr_L1_inst:%d RC.nb_nr_L1_CC:%p RC.gNB:%p\n", __FUNCTION__, RC.nb_nr_L1_inst, RC.nb_nr_L1_CC, RC.gNB);
75
76
77
78
79
80
81
82
  }
  return(0);
}


int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
                     unsigned char is_secondary_gNB,
                     unsigned char abstraction_flag)
83
84
{

85
86
  // shortcuts
  NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
87
  nfapi_nr_config_request_t* cfg       = &gNB->gNB_config;
88
89
90
91
92
93
94
  NR_gNB_COMMON* const common_vars  = &gNB->common_vars;
  LTE_eNB_PUSCH** const pusch_vars   = gNB->pusch_vars;
  LTE_eNB_SRS* const srs_vars        = gNB->srs_vars;
  LTE_eNB_PRACH* const prach_vars    = &gNB->prach_vars;

  int i, UE_id; 

Florian Kaltenberger's avatar
Florian Kaltenberger committed
95
  LOG_I(PHY,"[gNB %d] %s() About to wait for gNB to be configured\n", gNB->Mod_id, __FUNCTION__);
96
97
98
99
100
101
102

  gNB->total_dlsch_bitrate = 0;
  gNB->total_transmitted_bits = 0;
  gNB->total_system_throughput = 0;
  gNB->check_for_MUMIMO_transmissions=0;
 
  while(gNB->configured == 0) usleep(10000);
103
104

  init_dfts();
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
  LOG_I(PHY,"[gNB %"PRIu8"] Initializing DL_FRAME_PARMS : N_RB_DL %"PRIu8", PHICH Resource %d, PHICH Duration %d nb_antennas_tx:%u nb_antennas_rx:%u PRACH[rootSequenceIndex:%u prach_Config_enabled:%u configIndex:%u highSpeed:%u zeroCorrelationZoneConfig:%u freqOffset:%u]\n",
        gNB->Mod_id,
        fp->N_RB_DL,fp->phich_config_common.phich_resource,
        fp->phich_config_common.phich_duration,
        fp->nb_antennas_tx, fp->nb_antennas_rx,
        fp->prach_config_common.rootSequenceIndex,
        fp->prach_config_common.prach_Config_enabled,
        fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
        fp->prach_config_common.prach_ConfigInfo.highSpeedFlag,
        fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
        fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset
        );*/
  LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_gNB][MOD %02"PRIu8"][]\n", gNB->Mod_id);

120
121
122
123
  crcTableInit();

  init_dfts();
  
Guy De Souza's avatar
Guy De Souza committed
124
  // PBCH DMRS gold sequences generation
Guy De Souza's avatar
Guy De Souza committed
125
  nr_init_pbch_dmrs(gNB);
Guy De Souza's avatar
Guy De Souza committed
126
  // Polar encoder init for PBCH
knopp's avatar
knopp committed
127
  
Guy De Souza's avatar
Guy De Souza committed
128
  nr_polar_init(&gNB->nrPolar_params,
knopp's avatar
knopp committed
129
130
131
		NR_POLAR_PBCH_MESSAGE_TYPE,
		NR_POLAR_PBCH_PAYLOAD_BITS,
		NR_POLAR_PBCH_AGGREGATION_LEVEL);
132

133
  //PDCCH DMRS init
Guy De Souza's avatar
Guy De Souza committed
134
135
  gNB->nr_gold_pdcch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t**));
  uint32_t ***pdcch_dmrs             = gNB->nr_gold_pdcch_dmrs;
Guy De Souza's avatar
Guy De Souza committed
136
  AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
Guy De Souza's avatar
Guy De Souza committed
137
  for (int slot=0; slot<fp->slots_per_frame; slot++) {
Guy De Souza's avatar
Guy De Souza committed
138
139
140
    pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t*));
    AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
    for (int symb=0; symb<fp->symbols_per_slot; symb++){
Guy De Souza's avatar
Guy De Souza committed
141
      pdcch_dmrs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t));
Guy De Souza's avatar
Guy De Souza committed
142
143
      AssertFatal(pdcch_dmrs[slot][symb]!=NULL, "NR init: pdcch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb);
    }
Guy De Souza's avatar
Guy De Souza committed
144
  }
145
146

  nr_init_pdcch_dmrs(gNB, cfg->sch_config.physical_cell_id.value);
Guy De Souza's avatar
Guy De Souza committed
147

148
149
150
151
152
153
154
155
/*
  lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell);
  generate_pcfich_reg_mapping(fp);
  generate_phich_reg_mapping(fp);*/

  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
    gNB->first_run_timing_advance[UE_id] =
      1; ///This flag used to be static. With multiple gNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.
Guy De Souza's avatar
Guy De Souza committed
156

157
158
159
160
161
162
163
164
    // clear whole structure
    bzero( &gNB->UE_stats[UE_id], sizeof(LTE_eNB_UE_stats) );
    
    gNB->physicalConfigDedicated[UE_id] = NULL;
  }
  
  gNB->first_run_I0_measurements = 1; ///This flag used to be static. With multiple gNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.

Guy De Souza's avatar
Guy De Souza committed
165

166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
  common_vars->rxdata  = (int32_t **)NULL;
  common_vars->txdataF = (int32_t **)malloc16(NB_ANTENNA_PORTS_ENB*sizeof(int32_t*));
  common_vars->rxdataF = (int32_t **)malloc16(64*sizeof(int32_t*));
  
  LOG_D(PHY,"[INIT] NB_ANTENNA_PORTS_ENB:%d fp->nb_antenna_ports_gNB:%d\n", NB_ANTENNA_PORTS_ENB, cfg->rf_config.tx_antenna_ports.value);

  for (i=0; i<NB_ANTENNA_PORTS_ENB; i++) {
    if (i<cfg->rf_config.tx_antenna_ports.value || i==5) {
      common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t) );
      
      LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n",
	    i,common_vars->txdataF[i],
	    fp->samples_per_frame_wCP*sizeof(int32_t));
    }
  }  
  
  
  // Channel estimates for SRS
  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
    
    srs_vars[UE_id].srs_ch_estimates      = (int32_t**)malloc16( 64*sizeof(int32_t*) );
    srs_vars[UE_id].srs_ch_estimates_time = (int32_t**)malloc16( 64*sizeof(int32_t*) );
    
    for (i=0; i<64; i++) {
      srs_vars[UE_id].srs_ch_estimates[i]      = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size );
      srs_vars[UE_id].srs_ch_estimates_time[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
    }
  } //UE_id


  /*generate_ul_ref_sigs_rx();
  
  init_ulsch_power_LUT();*/

  // SRS
  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
    srs_vars[UE_id].srs = (int32_t*)malloc16_clear(2*fp->ofdm_symbol_size*sizeof(int32_t));
  }

  // PRACH
  prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) );

  // assume maximum of 64 RX antennas for PRACH receiver
  prach_vars->prach_ifft[0]    = (int32_t**)malloc16_clear(64*sizeof(int32_t*)); 
  for (i=0;i<64;i++) prach_vars->prach_ifft[0][i]    = (int32_t*)malloc16_clear(1024*2*sizeof(int32_t)); 

  prach_vars->rxsigF[0]        = (int16_t**)malloc16_clear(64*sizeof(int16_t*));

  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
    
    //FIXME
    pusch_vars[UE_id] = (LTE_eNB_PUSCH*)malloc16_clear( NUMBER_OF_UE_MAX*sizeof(LTE_eNB_PUSCH) );
    
    pusch_vars[UE_id]->rxdataF_ext      = (int32_t**)malloc16( 2*sizeof(int32_t*) );
    pusch_vars[UE_id]->rxdataF_ext2     = (int32_t**)malloc16( 2*sizeof(int32_t*) );
    pusch_vars[UE_id]->drs_ch_estimates = (int32_t**)malloc16( 2*sizeof(int32_t*) );
    pusch_vars[UE_id]->drs_ch_estimates_time = (int32_t**)malloc16( 2*sizeof(int32_t*) );
    pusch_vars[UE_id]->rxdataF_comp     = (int32_t**)malloc16( 2*sizeof(int32_t*) );
    pusch_vars[UE_id]->ul_ch_mag  = (int32_t**)malloc16( 2*sizeof(int32_t*) );
    pusch_vars[UE_id]->ul_ch_magb = (int32_t**)malloc16( 2*sizeof(int32_t*) );
    
    for (i=0; i<2; i++) {
      // RK 2 times because of output format of FFT!
      // FIXME We should get rid of this
230
231
232
      pusch_vars[UE_id]->rxdataF_ext[i]      = (int32_t*)malloc16_clear( sizeof(int32_t)*cfg->rf_config.ul_carrier_bandwidth.value*12*fp->symbols_per_slot );
      pusch_vars[UE_id]->rxdataF_ext2[i]     = (int32_t*)malloc16_clear( sizeof(int32_t)*cfg->rf_config.ul_carrier_bandwidth.value*12*fp->symbols_per_slot );
      pusch_vars[UE_id]->drs_ch_estimates[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*cfg->rf_config.ul_carrier_bandwidth.value*12*fp->symbols_per_slot );
233
      pusch_vars[UE_id]->drs_ch_estimates_time[i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
234
235
236
      pusch_vars[UE_id]->rxdataF_comp[i]     = (int32_t*)malloc16_clear( sizeof(int32_t)*cfg->rf_config.ul_carrier_bandwidth.value*12*fp->symbols_per_slot );
      pusch_vars[UE_id]->ul_ch_mag[i]  = (int32_t*)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*cfg->rf_config.ul_carrier_bandwidth.value*12 );
      pusch_vars[UE_id]->ul_ch_magb[i] = (int32_t*)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*cfg->rf_config.ul_carrier_bandwidth.value*12 );
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
      }
    
    pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
  } //UE_id

    
  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++)
    gNB->UE_stats_ptr[UE_id] = &gNB->UE_stats[UE_id];
  
  gNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration
  

  return (0);

}
/*
void phy_config_request(PHY_Config_t *phy_config) {

  uint8_t Mod_id              = phy_config->Mod_id;
  int CC_id                   = phy_config->CC_id;
Guy De Souza's avatar
Guy De Souza committed
257
  nfapi_nr_config_request_t *cfg = phy_config->cfg;
258

Guy De Souza's avatar
Guy De Souza committed
259
  NR_DL_FRAME_PARMS *fp;
260
261
  PHICH_RESOURCE_t phich_resource_table[4]={oneSixth,half,one,two};
  int                 eutra_band     = cfg->nfapi_config.rf_bands.rf_band[0];  
262
263
  int                 dl_Bandwidth   = cfg->rf_config.dl_carrier_bandwidth.value;
  int                 ul_Bandwidth   = cfg->rf_config.ul_carrier_bandwidth.value;
264
265
266
267
268
  int                 Nid_cell       = cfg->sch_config.physical_cell_id.value;
  int                 Ncp            = cfg->subframe_config.dl_cyclic_prefix_type.value;
  int                 p_eNB          = cfg->rf_config.tx_antenna_ports.value;
  uint32_t            dl_CarrierFreq = cfg->nfapi_config.earfcn.value;

Guy De Souza's avatar
Guy De Souza committed
269
270
  LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,gNB_tx_antenna_ports %d,Ncp %d,DL freq %u)\n",
	Mod_id, CC_id, eutra_band, dl_Bandwidth, ul_Bandwidth, Nid_cell, p_eNB,Ncp,dl_CarrierFreq	);
271

Guy De Souza's avatar
Guy De Souza committed
272
273
274
  AssertFatal(RC.gNB != NULL, "PHY instance pointer doesn't exist\n");
  AssertFatal(RC.gNB[Mod_id] != NULL, "PHY instance %d doesn't exist\n",Mod_id);
  AssertFatal(RC.gNB[Mod_id][CC_id] != NULL, "PHY instance %d, CCid %d doesn't exist\n",Mod_id,CC_id);
275
276


Guy De Souza's avatar
Guy De Souza committed
277
  if (RC.gNB[Mod_id][CC_id]->configured == 1)
278
279
280
281
282
  {
    LOG_E(PHY,"Already eNB already configured, do nothing\n");
    return;
  }

Guy De Souza's avatar
Guy De Souza committed
283
  RC.gNB[Mod_id][CC_id]->mac_enabled     = 1;
284

Guy De Souza's avatar
Guy De Souza committed
285
  fp = &RC.gNB[Mod_id][CC_id]->frame_parms;
286
287
288

  fp->threequarter_fs                    = 0;

Guy De Souza's avatar
Guy De Souza committed
289
  nr_init_frame_parms(fp,1);
290

Guy De Souza's avatar
Guy De Souza committed
291
292
293
  RC.gNB[Mod_id][CC_id]->configured                                   = 1;
  LOG_I(PHY,"gNB %d/%d configured\n",Mod_id,CC_id);
}*/
294
295
296
297
298


void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
{
//  NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
299
  nfapi_nr_config_request_t *cfg       = &gNB->gNB_config;
300
301
302
303
  NR_gNB_COMMON* const common_vars  = &gNB->common_vars;
  LTE_eNB_PUSCH** const pusch_vars   = gNB->pusch_vars;
  LTE_eNB_SRS* const srs_vars        = gNB->srs_vars;
  LTE_eNB_PRACH* const prach_vars    = &gNB->prach_vars;
304
  uint32_t ***pdcch_dmrs             = gNB->nr_gold_pdcch_dmrs;
305
306
307
308
309
310
311
312
313
314
315
316

  int i, UE_id;

  for (i = 0; i < NB_ANTENNA_PORTS_ENB; i++) {
    if (i < cfg->rf_config.tx_antenna_ports.value || i == 5) {
      free_and_zero(common_vars->txdataF[i]);
      /* rxdataF[i] is not allocated -> don't free */
    }
  }
  free_and_zero(common_vars->txdataF);
  free_and_zero(common_vars->rxdataF);

317
318
319
  // PDCCH DMRS sequences
  free_and_zero(pdcch_dmrs);

320
321
322
323
324
325
326
327
328
329
  // Channel estimates for SRS
  for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) {
    for (i=0; i<64; i++) {
      free_and_zero(srs_vars[UE_id].srs_ch_estimates[i]);
      free_and_zero(srs_vars[UE_id].srs_ch_estimates_time[i]);
    }
    free_and_zero(srs_vars[UE_id].srs_ch_estimates);
    free_and_zero(srs_vars[UE_id].srs_ch_estimates_time);
  } //UE_id

330
  //free_ul_ref_sigs();
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363

  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) free_and_zero(srs_vars[UE_id].srs);

  free_and_zero(prach_vars->prachF);

  for (i = 0; i < 64; i++) free_and_zero(prach_vars->prach_ifft[0][i]);
  free_and_zero(prach_vars->prach_ifft[0]);

  free_and_zero(prach_vars->rxsigF[0]);

  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
    for (i = 0; i < 2; i++) {
      free_and_zero(pusch_vars[UE_id]->rxdataF_ext[i]);
      free_and_zero(pusch_vars[UE_id]->rxdataF_ext2[i]);
      free_and_zero(pusch_vars[UE_id]->drs_ch_estimates[i]);
      free_and_zero(pusch_vars[UE_id]->drs_ch_estimates_time[i]);
      free_and_zero(pusch_vars[UE_id]->rxdataF_comp[i]);
      free_and_zero(pusch_vars[UE_id]->ul_ch_mag[i]);
      free_and_zero(pusch_vars[UE_id]->ul_ch_magb[i]);
    }
    free_and_zero(pusch_vars[UE_id]->rxdataF_ext);
    free_and_zero(pusch_vars[UE_id]->rxdataF_ext2);
    free_and_zero(pusch_vars[UE_id]->drs_ch_estimates);
    free_and_zero(pusch_vars[UE_id]->drs_ch_estimates_time);
    free_and_zero(pusch_vars[UE_id]->rxdataF_comp);
    free_and_zero(pusch_vars[UE_id]->ul_ch_mag);
    free_and_zero(pusch_vars[UE_id]->ul_ch_magb);
    free_and_zero(pusch_vars[UE_id]->llr);
    free_and_zero(pusch_vars[UE_id]);
  } //UE_id

  for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) gNB->UE_stats_ptr[UE_id] = NULL;
}
Guy De Souza's avatar
Guy De Souza committed
364
/*
365
366
367
368
void install_schedule_handlers(IF_Module_t *if_inst)
{
  if_inst->PHY_config_req = phy_config_request;
  if_inst->schedule_response = schedule_response;
Guy De Souza's avatar
Guy De Souza committed
369
}*/
Guy De Souza's avatar
Guy De Souza committed
370
371

/// this function is a temporary addition for NR configuration
372

knopp's avatar
knopp committed
373
void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu)
Guy De Souza's avatar
Guy De Souza committed
374
375
{
  NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
Guy De Souza's avatar
Guy De Souza committed
376
  nfapi_nr_config_request_t *gNB_config = &gNB->gNB_config;
Guy De Souza's avatar
Guy De Souza committed
377
378

  //overwrite for new NR parameters
knopp's avatar
knopp committed
379
380
  gNB_config->nfapi_config.rf_bands.rf_band[0] = 78;
  gNB_config->nfapi_config.nrarfcn.value = 620000;
knopp's avatar
knopp committed
381
382
  gNB_config->subframe_config.numerology_index_mu.value = mu;
  gNB_config->subframe_config.duplex_mode.value = TDD;
Guy De Souza's avatar
Guy De Souza committed
383
  gNB_config->rf_config.tx_antenna_ports.value = 1;
knopp's avatar
knopp committed
384
385
  gNB_config->rf_config.dl_carrier_bandwidth.value = N_RB_DL;
  gNB_config->rf_config.ul_carrier_bandwidth.value = N_RB_UL;
Guy De Souza's avatar
Guy De Souza committed
386
  gNB_config->sch_config.half_frame_index.value = 0;
Guy De Souza's avatar
Guy De Souza committed
387
  gNB_config->sch_config.ssb_subcarrier_offset.value = 0;
388
  gNB_config->sch_config.n_ssb_crb.value = (N_RB_DL-20);
Guy De Souza's avatar
Guy De Souza committed
389
  gNB_config->sch_config.ssb_subcarrier_offset.value = 0;
Guy De Souza's avatar
Guy De Souza committed
390
391
392
393


  gNB->mac_enabled     = 1;

knopp's avatar
knopp committed
394
  fp->dl_CarrierFreq = from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
Guy De Souza's avatar
Guy De Souza committed
395
  fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
Guy De Souza's avatar
Guy De Souza committed
396
397
  fp->threequarter_fs                    = 0;

Guy De Souza's avatar
Guy De Souza committed
398
  nr_init_frame_parms(gNB_config, fp);
Guy De Souza's avatar
Guy De Souza committed
399
400
401

  gNB->configured                                   = 1;
  LOG_I(PHY,"gNB configured\n");
402
}
403
404
405
406
407
408
409
410
411
412
413
414
415


void nr_phy_config_request(NR_PHY_Config_t *phy_config)
{

  uint8_t Mod_id                  = phy_config->Mod_id;
  int     CC_id                   = phy_config->CC_id;

  NR_DL_FRAME_PARMS         *fp         = &RC.gNB[Mod_id][CC_id]->frame_parms;
  nfapi_nr_config_request_t *gNB_config = &RC.gNB[Mod_id][CC_id]->gNB_config;


  gNB_config->nfapi_config.rf_bands.rf_band[0]          = phy_config->cfg->nfapi_config.rf_bands.rf_band[0]; //22
knopp's avatar
knopp committed
416
  gNB_config->nfapi_config.nrarfcn.value                = phy_config->cfg->nfapi_config.nrarfcn.value; //6600
417
418
  gNB_config->subframe_config.numerology_index_mu.value = phy_config->cfg->subframe_config.numerology_index_mu.value;//1
  gNB_config->rf_config.tx_antenna_ports.value          = phy_config->cfg->rf_config.tx_antenna_ports.value; //1
419
420
  gNB_config->rf_config.dl_carrier_bandwidth.value      = phy_config->cfg->rf_config.dl_carrier_bandwidth.value;//106;
  gNB_config->rf_config.ul_carrier_bandwidth.value      = phy_config->cfg->rf_config.ul_carrier_bandwidth.value;//106;
421
422
  gNB_config->sch_config.half_frame_index.value         = 0;
  gNB_config->sch_config.ssb_subcarrier_offset.value    = phy_config->cfg->sch_config.ssb_subcarrier_offset.value;//0;
423
  gNB_config->sch_config.n_ssb_crb.value                = (phy_config->cfg->rf_config.dl_carrier_bandwidth.value-20);
424
425
426
427
428
429
430
431
432
433
434
  gNB_config->sch_config.physical_cell_id.value         = phy_config->cfg->sch_config.physical_cell_id.value;

  if (phy_config->cfg->subframe_config.duplex_mode.value == 0) {
    gNB_config->subframe_config.duplex_mode.value    = TDD;
  }
  else {
    gNB_config->subframe_config.duplex_mode.value    = FDD;
  }

  RC.gNB[Mod_id][CC_id]->mac_enabled     = 1;

knopp's avatar
knopp committed
435
  fp->dl_CarrierFreq = from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
436
437
438
439
  fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
  fp->threequarter_fs                    = 0;

  LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,gNB_tx_antenna_ports %d,DL freq %u)\n",
knopp's avatar
knopp committed
440
441
442
443
444
445
446
447
448
	Mod_id, 
	CC_id, 
	gNB_config->nfapi_config.rf_bands.rf_band[0], 
	gNB_config->rf_config.dl_carrier_bandwidth.value, 
	gNB_config->rf_config.ul_carrier_bandwidth.value, 
	gNB_config->sch_config.physical_cell_id.value, 
	gNB_config->rf_config.tx_antenna_ports.value,
	fp->dl_CarrierFreq );
  
449
450
451
452
453
454
455
456
457
458
459
460
  nr_init_frame_parms(gNB_config, fp);

  if (RC.gNB[Mod_id][CC_id]->configured == 1){
    LOG_E(PHY,"Already gNB already configured, do nothing\n");
    return;
  }

  RC.gNB[Mod_id][CC_id]->configured     = 1;
  LOG_I(PHY,"gNB %d/%d configured\n",Mod_id,CC_id);



Guy De Souza's avatar
Guy De Souza committed
461
}