nr_init.c 26.6 KB
Newer Older
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
#include "executables/nr-softmodem-common.h"
23
#include "common/utils/nr/nr_common.h"
24 25
#include "PHY/defs_gNB.h"
#include "PHY/phy_extern.h"
26
#include "PHY/NR_REFSIG/nr_refsig.h"
27
#include "PHY/INIT/phy_init.h"
Guy De Souza's avatar
Guy De Souza committed
28
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
Francesco Mani's avatar
Francesco Mani committed
29
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
30
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
31
#include "openair1/PHY/MODULATION/nr_modulation.h"
32
/*#include "RadioResourceConfigCommonSIB.h"
33 34
#include "RadioResourceConfigDedicated.h"
#include "TDD-Config.h"
35 36
#include "MBSFN-SubframeConfigList.h"*/
#include "openair1/PHY/defs_RU.h"
37
#include "openair1/PHY/CODING/nrLDPC_extern.h"
38
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
39 40
#include "assertions.h"
#include <math.h>
41

42
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
43
#include "PHY/NR_REFSIG/nr_refsig.h"
44
#include "SCHED_NR/fapi_nr_l1.h"
45
#include "nfapi_nr_interface.h"
WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
46

dir's avatar
dir committed
47 48
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
static
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex)
{
  const uint64_t dl_freq_khz = downlink_frequency / 1000;
  const int32_t  delta_duplex_khz = delta_duplex / 1000;

  uint64_t center_freq_diff_khz = 999999999999999999; // 2^64
  uint16_t current_band = 0;

  for (int ind = 0; ind < nr_bandtable_size; ind++) {

    LOG_D(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", nr_bandtable[ind].band, nr_bandtable[ind].dl_min, nr_bandtable[ind].ul_min);

    if (dl_freq_khz < nr_bandtable[ind].dl_min || dl_freq_khz > nr_bandtable[ind].dl_max)
      continue;

    int32_t current_offset_khz = nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min;

    if (current_offset_khz != delta_duplex_khz)
      continue;

    uint64_t center_frequency_khz = (nr_bandtable[ind].dl_max + nr_bandtable[ind].dl_min) / 2;

    if (abs(dl_freq_khz - center_frequency_khz) < center_freq_diff_khz){
      current_band = nr_bandtable[ind].band;
      center_freq_diff_khz = abs(dl_freq_khz - center_frequency_khz);
    }
  }

  LOG_I(PHY, "DL frequency %"PRIu64": band %d, UL frequency %"PRIu64"\n",
        downlink_frequency, current_band, downlink_frequency+delta_duplex);

  AssertFatal(current_band != 0, "Can't find EUTRA band for frequency %"PRIu64" and duplex_spacing %u\n", downlink_frequency, delta_duplex);

  return current_band;
}
85 86 87

int l1_north_init_gNB() {

88
  if (RC.nb_nr_L1_inst > 0 &&  RC.gNB != NULL) {
89

WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
90
    AssertFatal(RC.nb_nr_L1_inst>0,"nb_nr_L1_inst=%d\n",RC.nb_nr_L1_inst);
91
    AssertFatal(RC.gNB!=NULL,"RC.gNB is null\n");
WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
92
    LOG_I(PHY,"%s() RC.nb_nr_L1_inst:%d\n", __FUNCTION__, RC.nb_nr_L1_inst);
93

94
    for (int i=0; i<RC.nb_nr_L1_inst; i++) {
95 96
      AssertFatal(RC.gNB[i]!=NULL,"RC.gNB[%d] is null\n",i);

97 98
      if ((RC.gNB[i]->if_inst =  NR_IF_Module_init(i))<0) return(-1);
      
99
      LOG_I(PHY,"%s() RC.gNB[%d] installing callbacks\n", __FUNCTION__, i);
100 101
      RC.gNB[i]->if_inst->NR_PHY_config_req = nr_phy_config_request;
      RC.gNB[i]->if_inst->NR_Schedule_response = nr_schedule_response;
102
    }
103
  } else {
104
    LOG_I(PHY,"%s() Not installing PHY callbacks - RC.nb_nr_L1_inst:%d RC.gNB:%p\n", __FUNCTION__, RC.nb_nr_L1_inst, RC.gNB);
105
  }
106

107 108 109 110 111
  return(0);
}


int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
112 113
                    unsigned char is_secondary_gNB,
                    unsigned char abstraction_flag) {
114
  // shortcuts
115
  NR_DL_FRAME_PARMS *const fp       = &gNB->frame_parms;
116
  nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
117
  NR_gNB_COMMON *const common_vars  = &gNB->common_vars;
118
  NR_gNB_PRACH *const prach_vars   = &gNB->prach_vars;
119
  NR_gNB_PUSCH **const pusch_vars   = gNB->pusch_vars;
120

121
  int i;
122 123
  int Ptx=cfg->carrier_config.num_tx_ant.value;
  int Prx=cfg->carrier_config.num_rx_ant.value;
124

125 126
  AssertFatal(Ptx>0 && Ptx<9,"Ptx %d is not supported\n",Ptx);
  AssertFatal(Prx>0 && Prx<9,"Prx %d is not supported\n",Prx);
127
  LOG_I(PHY,"[gNB %d] %s() About to wait for gNB to be configured\n", gNB->Mod_id, __FUNCTION__);
128

129
  while(gNB->configured == 0) usleep(10000);
130

frtabu's avatar
frtabu committed
131
  load_dftslib();
cig's avatar
cig committed
132

133
  LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_gNB][MOD %02"PRIu8"][]\n", gNB->Mod_id);
134
  crcTableInit();
135 136
  init_scrambling_luts();
  init_pucch2_luts();
137
  load_nrLDPClib();
Guy De Souza's avatar
Guy De Souza committed
138
  // PBCH DMRS gold sequences generation
Guy De Souza's avatar
Guy De Souza committed
139
  nr_init_pbch_dmrs(gNB);
140
  //PDCCH DMRS init
141
  gNB->nr_gold_pdcch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
Guy De Souza's avatar
Guy De Souza committed
142
  uint32_t ***pdcch_dmrs             = gNB->nr_gold_pdcch_dmrs;
Guy De Souza's avatar
Guy De Souza committed
143
  AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
144

Guy De Souza's avatar
Guy De Souza committed
145
  for (int slot=0; slot<fp->slots_per_frame; slot++) {
146
    pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
Guy De Souza's avatar
Guy De Souza committed
147
    AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
148 149

    for (int symb=0; symb<fp->symbols_per_slot; symb++) {
Guy De Souza's avatar
Guy De Souza committed
150
      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
151 152
      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
153
  }
154

155
  nr_generate_modulation_table();
156
  nr_init_pdcch_dmrs(gNB, cfg->cell_config.phy_cell_id.value);
Guy De Souza's avatar
Guy De Souza committed
157
  nr_init_pbch_interleaver(gNB->nr_pbch_interleaver);
158

159 160 161
  //PDSCH DMRS init
  gNB->nr_gold_pdsch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***));
  uint32_t ****pdsch_dmrs             = gNB->nr_gold_pdsch_dmrs;
Guy De Souza's avatar
Guy De Souza committed
162

163 164
  for (int slot=0; slot<fp->slots_per_frame; slot++) {
    pdsch_dmrs[slot] = (uint32_t ***)malloc16(fp->symbols_per_slot*sizeof(uint32_t **));
ISIP CS/NCTU's avatar
ISIP CS/NCTU committed
165
    AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot);
166 167 168

    for (int symb=0; symb<fp->symbols_per_slot; symb++) {
      pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(NR_MAX_NB_CODEWORDS*sizeof(uint32_t *));
ISIP CS/NCTU's avatar
ISIP CS/NCTU committed
169
      AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb);
170

Guy De Souza's avatar
Guy De Souza committed
171
      for (int q=0; q<NR_MAX_NB_CODEWORDS; q++) {
172
        pdsch_dmrs[slot][symb][q] = (uint32_t *)malloc16(NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t));
Guy De Souza's avatar
Guy De Souza committed
173 174
        AssertFatal(pdsch_dmrs[slot][symb][q]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d codeword %d - malloc failed\n", slot, symb, q);
      }
ISIP CS/NCTU's avatar
ISIP CS/NCTU committed
175 176
    }
  }
177

178
  nr_init_pdsch_dmrs(gNB, cfg->cell_config.phy_cell_id.value);
179

180 181
  //PUSCH DMRS init
  gNB->nr_gold_pusch_dmrs = (uint32_t ****)malloc16(2*sizeof(uint32_t ***));
182

183
  uint32_t ****pusch_dmrs = gNB->nr_gold_pusch_dmrs;
184 185 186 187 188 189 190 191

  for(int nscid=0; nscid<2; nscid++) {
    pusch_dmrs[nscid] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
    AssertFatal(pusch_dmrs[nscid]!=NULL, "NR init: pusch_dmrs for nscid %d - malloc failed\n", nscid);

    for (int slot=0; slot<fp->slots_per_frame; slot++) {
      pusch_dmrs[nscid][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
      AssertFatal(pusch_dmrs[nscid][slot]!=NULL, "NR init: pusch_dmrs for slot %d - malloc failed\n", slot);
192

193 194 195 196 197
      for (int symb=0; symb<fp->symbols_per_slot; symb++) {
        pusch_dmrs[nscid][slot][symb] = (uint32_t *)malloc16(NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t));
        AssertFatal(pusch_dmrs[nscid][slot][symb]!=NULL, "NR init: pusch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb);
      }
    }
198 199
  }

200
  uint32_t Nid_pusch[2] = {cfg->cell_config.phy_cell_id.value,cfg->cell_config.phy_cell_id.value};
201
  LOG_D(PHY,"Initializing PUSCH DMRS Gold sequence with (%x,%x)\n",Nid_pusch[0],Nid_pusch[1]);
202 203
  nr_gold_pusch(gNB, &Nid_pusch[0]);

204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
  //CSI RS init
  gNB->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
  uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
  AssertFatal(csi_rs!=NULL, "NR init: csi reference signal malloc failed\n");

  for (int slot=0; slot<fp->slots_per_frame; slot++) {
    csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
    AssertFatal(csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);

    for (int symb=0; symb<fp->symbols_per_slot; symb++) {
      csi_rs[slot][symb] = (uint32_t *)malloc16(NR_MAX_CSI_RS_INIT_LENGTH_DWORD*sizeof(uint32_t));
      AssertFatal(csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
    }
  }

dir's avatar
dir committed
219 220 221 222
  /* Generate low PAPR type 1 sequences for PUSCH DMRS, these are used if transform precoding is enabled.  */
  generate_lowpapr_typ1_refsig_sequences(SHRT_MAX);
  

223 224
  nr_init_csi_rs(gNB, 0); // TODO scramblingID currently hardcoded to 0, to be taken from higher layer parameter scramblingID when implemented

Guy De Souza's avatar
Guy De Souza committed
225 226
  /// Transport init necessary for NR synchro
  init_nr_transport(gNB);
227

228

229
  gNB->first_run_I0_measurements = 1;
230

231 232 233
  common_vars->rxdata  = (int32_t **)malloc16(Prx*sizeof(int32_t*));
  common_vars->txdataF = (int32_t **)malloc16(Ptx*sizeof(int32_t*));
  common_vars->rxdataF = (int32_t **)malloc16(Prx*sizeof(int32_t*));
234

235 236
  for (i=0;i<Ptx;i++){
      common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t)); // [hna] samples_per_frame without CP
237
      LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n",
238 239 240
	    i,common_vars->txdataF[i],
	    fp->samples_per_frame_wCP*sizeof(int32_t));
      
241
  }
242 243 244 245
  for (i=0;i<Prx;i++){
    common_vars->rxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t));
    common_vars->rxdata[i] = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t));
  }
246 247
  common_vars->debugBuff = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t)*100);	
  common_vars->debugBuff_sample_offset = 0; 
248

249

250
  // Channel estimates for SRS
251
/*
252
  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
253 254 255
    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 *) );

256
    for (i=0; i<64; i++) {
257 258
      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 );
259 260
    }
  } //UE_id
261
*/
262
  /*generate_ul_ref_sigs_rx();
263

264 265
  init_ulsch_power_LUT();*/

266
/*
267 268
  // SRS
  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
269
    srs_vars[UE_id].srs = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*sizeof(int32_t));
270
  }
271
*/
272
  // PRACH
273
  prach_vars->prachF = (int16_t *)malloc16_clear( 1024*2*sizeof(int16_t) );
274 275 276 277 278 279
  prach_vars->rxsigF = (int16_t **)malloc16_clear(Prx*sizeof(int16_t*));
  /* 
  for (i=0;i<Prx;i++){
    prach_vars->rxsigF[i] = (int16_t *)malloc16_clear( 1024*2*sizeof(int16_t) );
  }
  */
280
  prach_vars->prach_ifft       = (int32_t *)malloc16_clear(1024*2*sizeof(int32_t));
281

282 283
  init_prach_list(gNB);

284
  int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
285

Raymond Knopp's avatar
Raymond Knopp committed
286 287
  for (int ULSCH_id=0; ULSCH_id<NUMBER_OF_NR_ULSCH_MAX; ULSCH_id++) {
    pusch_vars[ULSCH_id] = (NR_gNB_PUSCH *)malloc16_clear( sizeof(NR_gNB_PUSCH) );
288 289 290 291
    pusch_vars[ULSCH_id]->rxdataF_ext           = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->rxdataF_ext2          = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->ul_ch_estimates       = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->ul_ch_estimates_ext   = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
Raymond Knopp's avatar
Raymond Knopp committed
292 293
    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates     = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
294
    pusch_vars[ULSCH_id]->ptrs_phase_per_slot   = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
295 296
    pusch_vars[ULSCH_id]->ul_ch_estimates_time  = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->rxdataF_comp          = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
297 298
    pusch_vars[ULSCH_id]->ul_ch_mag0            = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->ul_ch_magb0           = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
299 300 301 302 303
    pusch_vars[ULSCH_id]->ul_ch_mag             = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->ul_ch_magb            = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
    pusch_vars[ULSCH_id]->rho                   = (int32_t **)malloc16_clear(Prx*sizeof(int32_t*) );

    for (i=0; i<Prx; i++) {
304 305
      pusch_vars[ULSCH_id]->rxdataF_ext[i]           = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
      pusch_vars[ULSCH_id]->rxdataF_ext2[i]          = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
306
      pusch_vars[ULSCH_id]->ul_ch_estimates[i]       = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
307
      pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
Raymond Knopp's avatar
Raymond Knopp committed
308
      pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]  = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
Raymond Knopp's avatar
Raymond Knopp committed
309
      pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]       = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot ); // max intensity in freq is 1 sc every 2 RBs
310
      pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
311
      pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot); // symbols per slot
312
      pusch_vars[ULSCH_id]->rxdataF_comp[i]          = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
313 314
      pusch_vars[ULSCH_id]->ul_ch_mag0[i]            = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
      pusch_vars[ULSCH_id]->ul_ch_magb0[i]           = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
315 316
      pusch_vars[ULSCH_id]->ul_ch_mag[i]             = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
      pusch_vars[ULSCH_id]->ul_ch_magb[i]            = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
Raymond Knopp's avatar
Raymond Knopp committed
317
      pusch_vars[ULSCH_id]->rho[i]                   = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_UL*12*7*2) );
318
    }
319
    pusch_vars[ULSCH_id]->llr = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear
320
    pusch_vars[ULSCH_id]->ul_valid_re_per_slot  = (int16_t *)malloc16_clear( sizeof(int16_t)*fp->symbols_per_slot);
321
  } //ulsch_id
322
/*
323 324
  for (ulsch_id=0; ulsch_id<NUMBER_OF_UE_MAX; ulsch_id++)
    gNB->UE_stats_ptr[ulsch_id] = &gNB->UE_stats[ulsch_id];
325
*/
326 327 328
  return (0);
}

329 330
void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
{
331
  //NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
332
  NR_gNB_COMMON *const common_vars  = &gNB->common_vars;
333
  NR_gNB_PUSCH **const pusch_vars   = gNB->pusch_vars;
334
  /*LTE_eNB_SRS *const srs_vars        = gNB->srs_vars;
335
  LTE_eNB_PRACH *const prach_vars    = &gNB->prach_vars;*/
336
  uint32_t ***pdcch_dmrs             = gNB->nr_gold_pdcch_dmrs;
337
  int Ptx=gNB->gNB_config.carrier_config.num_tx_ant.value;
338

339
  for (int i = 0; i < Ptx; i++) {
340
    free_and_zero(common_vars->txdataF[i]);
341
    /* rxdataF[i] is not allocated -> don't free */
342
  }
343

344 345
  free_and_zero(common_vars->txdataF);
  free_and_zero(common_vars->rxdataF);
346 347
  // PDCCH DMRS sequences
  free_and_zero(pdcch_dmrs);
348
/*
349 350 351 352 353 354
  // 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]);
    }
355

356 357 358 359
    free_and_zero(srs_vars[UE_id].srs_ch_estimates);
    free_and_zero(srs_vars[UE_id].srs_ch_estimates_time);
  } //UE_id

360
  //free_ul_ref_sigs();
361 362 363 364 365 366 367

  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]);

368
  free_and_zero(prach_vars->prach_ifft[0]);
369
  free_and_zero(prach_vars->rxsigF[0]);
370
*/
Raymond Knopp's avatar
Raymond Knopp committed
371
  for (int ULSCH_id=0; ULSCH_id<NUMBER_OF_NR_ULSCH_MAX; ULSCH_id++) {
372
    for (int i = 0; i < 2; i++) {
Raymond Knopp's avatar
Raymond Knopp committed
373 374 375 376 377
      free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]);
      free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
Raymond Knopp's avatar
Raymond Knopp committed
378 379
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]);
380
      free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i]);
Raymond Knopp's avatar
Raymond Knopp committed
381 382 383 384 385 386
      free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag[i]);
      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb[i]);
      free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
387
    }
388

Raymond Knopp's avatar
Raymond Knopp committed
389 390 391 392
    free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext);
    free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2);
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates);
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext);
Raymond Knopp's avatar
Raymond Knopp committed
393 394
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates);
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext);
Raymond Knopp's avatar
Raymond Knopp committed
395
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time);
396
    free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot);
397
    free_and_zero(pusch_vars[ULSCH_id]->ul_valid_re_per_slot);
Raymond Knopp's avatar
Raymond Knopp committed
398 399 400 401 402 403 404 405 406 407
    free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp);
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0);
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0);
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag);
    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb);
    free_and_zero(pusch_vars[ULSCH_id]->rho);

    free_and_zero(pusch_vars[ULSCH_id]->llr);
    free_and_zero(pusch_vars[ULSCH_id]);
  } //ULSCH_id
408
/*
409
  for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) gNB->UE_stats_ptr[UE_id] = NULL;
410
*/
dir's avatar
dir committed
411 412 413 414 415


  free_gnb_lowpapr_sequences();


416
}
MaheshK1995's avatar
MaheshK1995 committed
417 418 419 420 421 422 423

//Adding nr_schedule_handler
void install_nr_schedule_handlers(NR_IF_Module_t *if_inst)
{
  if_inst->NR_PHY_config_req = nr_phy_config_request;
  if_inst->NR_Schedule_response = nr_schedule_response;
}
Guy De Souza's avatar
Guy De Souza committed
424
/*
425 426 427 428
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
429
}*/
Guy De Souza's avatar
Guy De Souza committed
430 431

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

433

434 435 436 437 438 439 440 441
void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
                               int N_RB_DL,
                               int N_RB_UL,
                               int mu,
                               int Nid_cell,
                               uint64_t position_in_burst)
{
  NR_DL_FRAME_PARMS *fp                                   = &gNB->frame_parms;
442
  nfapi_nr_config_request_scf_t *gNB_config               = &gNB->gNB_config;
Guy De Souza's avatar
Guy De Souza committed
443
  //overwrite for new NR parameters
444

445 446 447 448
  uint64_t rev_burst=0;
  for (int i=0; i<64; i++)
    rev_burst |= (((position_in_burst>>(63-i))&0x01)<<i);

449 450 451
  gNB_config->cell_config.phy_cell_id.value             = Nid_cell;
  gNB_config->ssb_config.scs_common.value               = mu;
  gNB_config->ssb_table.ssb_subcarrier_offset.value     = 0;
Francesco Mani's avatar
Francesco Mani committed
452
  gNB_config->ssb_table.ssb_offset_point_a.value        = (N_RB_DL-20)>>1;
453 454
  gNB_config->ssb_table.ssb_mask_list[1].ssb_mask.value = (rev_burst)&(0xFFFFFFFF);
  gNB_config->ssb_table.ssb_mask_list[0].ssb_mask.value = (rev_burst>>32)&(0xFFFFFFFF);
455 456 457 458
  gNB_config->cell_config.frame_duplex_type.value       = TDD;
  gNB_config->ssb_table.ssb_period.value		= 1; //10ms
  gNB_config->carrier_config.dl_grid_size[mu].value     = N_RB_DL;
  gNB_config->carrier_config.ul_grid_size[mu].value     = N_RB_UL;
459 460
  gNB_config->carrier_config.num_tx_ant.value           = fp->nb_antennas_tx;
  gNB_config->carrier_config.num_rx_ant.value           = fp->nb_antennas_rx;
461

462
  gNB_config->tdd_table.tdd_period.value = 0;
463
  //gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED;
464

465
  gNB->mac_enabled   = 1;
466
  if (mu==1) {
467 468
    fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
    fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
469 470 471 472 473 474 475 476 477
    fp->nr_band = 78;
    //  fp->threequarter_fs= 0;
  } else if (mu==3) {
    fp->dl_CarrierFreq = 27524520000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
    fp->ul_CarrierFreq = 27524520000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
    fp->nr_band = 261;
    //  fp->threequarter_fs= 0;
  }
    
478 479
  gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);

Guy De Souza's avatar
Guy De Souza committed
480
  nr_init_frame_parms(gNB_config, fp);
481
  gNB->configured    = 1;
Guy De Souza's avatar
Guy De Souza committed
482
  LOG_I(PHY,"gNB configured\n");
483
}
484 485


486
void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
487
  uint8_t Mod_id = phy_config->Mod_id;
488
  uint8_t short_sequence, num_sequences, rootSequenceIndex, fd_occasion;
489 490 491
  NR_DL_FRAME_PARMS *fp = &RC.gNB[Mod_id]->frame_parms;
  nfapi_nr_config_request_scf_t *gNB_config = &RC.gNB[Mod_id]->gNB_config;

Raymond Knopp's avatar
Raymond Knopp committed
492
  memcpy((void*)gNB_config,phy_config->cfg,sizeof(*phy_config->cfg));
493
  RC.gNB[Mod_id]->mac_enabled     = 1;
494 495 496

  uint64_t dl_bw_khz = (12*gNB_config->carrier_config.dl_grid_size[gNB_config->ssb_config.scs_common.value].value)*(15<<gNB_config->ssb_config.scs_common.value);
  fp->dl_CarrierFreq = ((dl_bw_khz>>1) + gNB_config->carrier_config.dl_frequency.value)*1000 ;
497
  
498 499
  uint64_t ul_bw_khz = (12*gNB_config->carrier_config.ul_grid_size[gNB_config->ssb_config.scs_common.value].value)*(15<<gNB_config->ssb_config.scs_common.value);
  fp->ul_CarrierFreq = ((ul_bw_khz>>1) + gNB_config->carrier_config.uplink_frequency.value)*1000 ;
Raymond Knopp's avatar
Raymond Knopp committed
500

501 502
  int32_t dlul_offset = fp->ul_CarrierFreq - fp->dl_CarrierFreq;
  fp->nr_band = get_band(fp->dl_CarrierFreq, dlul_offset);
503 504 505

  LOG_I(PHY, "DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, dlul_offset);

506 507
  fp->threequarter_fs = openair0_cfg[0].threequarter_fs;
  LOG_I(PHY,"Configuring MIB for instance %d, : (Nid_cell %d,DL freq %llu, UL freq %llu)\n",
508
        Mod_id,
509
        gNB_config->cell_config.phy_cell_id.value,
Raymond Knopp's avatar
Raymond Knopp committed
510 511
        (unsigned long long)fp->dl_CarrierFreq,
        (unsigned long long)fp->ul_CarrierFreq);
512

513
  nr_init_frame_parms(gNB_config, fp);
Rakesh's avatar
Rakesh committed
514
  
515

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

521 522 523
  fd_occasion = 0;
  nfapi_nr_prach_config_t *prach_config = &gNB_config->prach_config;
  short_sequence = prach_config->prach_sequence_length.value;
524
//  for(fd_occasion = 0; fd_occasion <= prach_config->num_prach_fd_occasions.value ; fd_occasion) { // TODO Need to handle for msg1-fdm > 1
525 526 527 528
  num_sequences = prach_config->num_prach_fd_occasions_list[fd_occasion].num_root_sequences.value;
  rootSequenceIndex = prach_config->num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index.value;

  compute_nr_prach_seq(short_sequence, num_sequences, rootSequenceIndex, RC.gNB[Mod_id]->X_u);
529
//  }
530
  RC.gNB[Mod_id]->configured     = 1;
531

532
  init_symbol_rotation(fp);
533

534
  LOG_I(PHY,"gNB %d configured\n",Mod_id);
Guy De Souza's avatar
Guy De Souza committed
535
}
536

Mahesh's avatar
Mahesh committed
537

538 539 540 541
void init_nr_transport(PHY_VARS_gNB *gNB) {
  int i;
  int j;
  NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
542
  nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
543
  LOG_I(PHY, "Initialise nr transport\n");
544
  uint16_t grid_size = cfg->carrier_config.dl_grid_size[fp->numerology_index].value;
545

546 547
  memset(gNB->num_pdsch_rnti, 0, sizeof(uint16_t)*80);

548 549 550 551 552 553 554
  for (i=0; i <NUMBER_OF_NR_PDCCH_MAX; i++) {
    LOG_I(PHY,"Initializing PDCCH list for PDCCH %d/%d\n",i,NUMBER_OF_NR_PDCCH_MAX);
    gNB->pdcch_pdu[i].frame=-1;
    LOG_I(PHY,"Initializing UL PDCCH list for UL PDCCH %d/%d\n",i,NUMBER_OF_NR_PDCCH_MAX);
    gNB->ul_pdcch_pdu[i].frame=-1;
  }
    
Francesco Mani's avatar
Francesco Mani committed
555 556 557 558 559 560
  for (i=0; i<NUMBER_OF_NR_PUCCH_MAX; i++) {
    LOG_I(PHY,"Allocating Transport Channel Buffers for PUCCH %d/%d\n",i,NUMBER_OF_NR_PUCCH_MAX);
    gNB->pucch[i] = new_gNB_pucch();
    AssertFatal(gNB->pucch[i]!=NULL,"Can't initialize pucch %d \n", i);
  }

Raymond Knopp's avatar
Raymond Knopp committed
561
  for (i=0; i<NUMBER_OF_NR_DLSCH_MAX; i++) {
562

Raymond Knopp's avatar
Raymond Knopp committed
563
    LOG_I(PHY,"Allocating Transport Channel Buffers for DLSCH %d/%d\n",i,NUMBER_OF_NR_DLSCH_MAX);
564

565
    for (j=0; j<2; j++) {
566
      gNB->dlsch[i][j] = new_gNB_dlsch(fp,1,16,NSOFT,0,grid_size);
567
      AssertFatal(gNB->dlsch[i][j]!=NULL,"Can't initialize dlsch %d \n", i);
568 569
    }
  }
570

Raymond Knopp's avatar
Raymond Knopp committed
571
  for (i=0; i<NUMBER_OF_NR_ULSCH_MAX; i++) {
572

573
    LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i);
574

575
    for (j=0; j<2; j++) {
576
      // ULSCH for data
577
      gNB->ulsch[i][j] = new_gNB_ulsch(MAX_LDPC_ITERATIONS, fp->N_RB_UL, 0);
578

579
      if (!gNB->ulsch[i][j]) {
580 581 582
        LOG_E(PHY,"Can't get gNB ulsch structures\n");
        exit(-1);
      }
583

584
      /*
585 586 587 588 589 590 591
      LOG_I(PHY,"Initializing nFAPI for ULSCH, UE %d\n",i);
      // [hna] added here for RT implementation
      uint8_t harq_pid = 0;
      nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &gNB->ulsch[i+1][j]->harq_processes[harq_pid]->ulsch_pdu;
  
      // --------- setting rel15_ul parameters ----------
      rel15_ul->rnti                           = 0x1234;
592
      rel15_ul->ulsch_pdu_rel15.start_rb       = 0;
593 594 595
      rel15_ul->ulsch_pdu_rel15.number_rbs     = 50;
      rel15_ul->ulsch_pdu_rel15.start_symbol   = 2;
      rel15_ul->ulsch_pdu_rel15.number_symbols = 12;
596
      rel15_ul->ulsch_pdu_rel15.length_dmrs    = gNB->dmrs_UplinkConfig.pusch_maxLength;
597
      rel15_ul->ulsch_pdu_rel15.Qm             = 2;
Francesco Mani's avatar
Francesco Mani committed
598
      rel15_ul->ulsch_pdu_rel15.R              = 679;
599 600 601 602
      rel15_ul->ulsch_pdu_rel15.mcs            = 9;
      rel15_ul->ulsch_pdu_rel15.rv             = 0;
      rel15_ul->ulsch_pdu_rel15.n_layers       = 1;
      ///////////////////////////////////////////////////
603
      */
604

605
    }
606

607
  }
608

609
  gNB->rx_total_gain_dB=130;
610 611


612 613
  //fp->pucch_config_common.deltaPUCCH_Shift = 1;
}