diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index d5b2b79036..2c52d3f52d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -539,7 +539,9 @@ void pf_dl(module_id_t module_id, NR_UE_info_t **UE_list, int max_num_ue, int n_rb_sched, - uint16_t *rballoc_mask) { + uint16_t *rballoc_mask) +{ + gNB_MAC_INST *mac = RC.nrmac[module_id]; NR_ServingCellConfigCommon_t *scc=mac->common_channels[0].ServingCellConfigCommon; // UEs that could be scheduled @@ -748,7 +750,8 @@ void pf_dl(module_id_t module_id, } } -void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) { +void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) +{ NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info; if (UE_info->list[0] == NULL) @@ -791,12 +794,17 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t /* Retrieve amount of data to send for this UE */ nr_store_dlsch_buffer(module_id, frame, slot); + + int bw = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + int average_agg_level = 4; // TODO find a better estimation + int max_sched_ues = bw / (average_agg_level * NR_NB_REG_PER_CCE); + /* proportional fair scheduling algorithm */ pf_dl(module_id, frame, slot, UE_info->list, - MAX_MOBILES_PER_GNB, + max_sched_ues, n_rb_sched, rballoc_mask); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index e39b0384f2..e35b1cda71 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -680,224 +680,6 @@ int get_mcs_from_bler(const NR_bler_options_t *bler_options, return new_mcs; } -void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu, - nr_scs_e scs_common, - nr_scs_e pdcch_scs, - frequency_range_t freq_range, - uint8_t rmsi_pdcch_config, - uint8_t ssb_idx, - uint8_t k_ssb, - uint16_t sfn_ssb, - uint8_t n_ssb, /*slot index overlapping the corresponding SSB index*/ - uint16_t nb_slots_per_frame, - uint16_t N_RB) -{ - // uint8_t O, M; - // uint8_t ss_idx = rmsi_pdcch_config&0xf; - // uint8_t cset_idx = (rmsi_pdcch_config>>4)&0xf; - // uint8_t mu = scs_common; - // uint8_t O_scale=0, M_scale=0; // used to decide if the values of O and M need to be divided by 2 - - AssertFatal(1==0,"todo\n"); - /* - /// Coreset params - switch(scs_common) { - - case kHz15: - - switch(pdcch_scs) { - case kHz15: - AssertFatal(cset_idx<15,"Coreset index %d reserved for scs kHz15/kHz15\n", cset_idx); - pdcch_pdu->mux_pattern = NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1; - pdcch_pdu->n_rb = (cset_idx < 6)? 24 : (cset_idx < 12)? 48 : 96; - pdcch_pdu->n_symb = nr_coreset_nsymb_pdcch_type_0_scs_15_15[cset_idx]; - pdcch_pdu->rb_offset = nr_coreset_rb_offset_pdcch_type_0_scs_15_15[cset_idx]; - break; - - case kHz30: - AssertFatal(cset_idx<14,"Coreset index %d reserved for scs kHz15/kHz30\n", cset_idx); - pdcch_pdu->mux_pattern = NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1; - pdcch_pdu->n_rb = (cset_idx < 8)? 24 : 48; - pdcch_pdu->n_symb = nr_coreset_nsymb_pdcch_type_0_scs_15_30[cset_idx]; - pdcch_pdu->rb_offset = nr_coreset_rb_offset_pdcch_type_0_scs_15_15[cset_idx]; - break; - - default: - AssertFatal(1==0,"Invalid scs_common/pdcch_scs combination %d/%d \n", scs_common, pdcch_scs); - - } - break; - - case kHz30: - - if (N_RB < 106) { // Minimum 40Mhz bandwidth not satisfied - switch(pdcch_scs) { - case kHz15: - AssertFatal(cset_idx<9,"Coreset index %d reserved for scs kHz30/kHz15\n", cset_idx); - pdcch_pdu->mux_pattern = NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1; - pdcch_pdu->n_rb = (cset_idx < 10)? 48 : 96; - pdcch_pdu->n_symb = nr_coreset_nsymb_pdcch_type_0_scs_30_15_b40Mhz[cset_idx]; - pdcch_pdu->rb_offset = nr_coreset_rb_offset_pdcch_type_0_scs_30_15_b40Mhz[cset_idx]; - break; - - case kHz30: - pdcch_pdu->mux_pattern = NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1; - pdcch_pdu->n_rb = (cset_idx < 6)? 24 : 48; - pdcch_pdu->n_symb = nr_coreset_nsymb_pdcch_type_0_scs_30_30_b40Mhz[cset_idx]; - pdcch_pdu->rb_offset = nr_coreset_rb_offset_pdcch_type_0_scs_30_30_b40Mhz[cset_idx]; - break; - - default: - AssertFatal(1==0,"Invalid scs_common/pdcch_scs combination %d/%d \n", scs_common, pdcch_scs); - } - } - - else { // above 40Mhz - switch(pdcch_scs) { - case kHz15: - AssertFatal(cset_idx<9,"Coreset index %d reserved for scs kHz30/kHz15\n", cset_idx); - pdcch_pdu->mux_pattern = NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1; - pdcch_pdu->n_rb = (cset_idx < 3)? 48 : 96; - pdcch_pdu->n_symb = nr_coreset_nsymb_pdcch_type_0_scs_30_15_a40Mhz[cset_idx]; - pdcch_pdu->rb_offset = nr_coreset_rb_offset_pdcch_type_0_scs_30_15_a40Mhz[cset_idx]; - break; - - case kHz30: - AssertFatal(cset_idx<10,"Coreset index %d reserved for scs kHz30/kHz30\n", cset_idx); - pdcch_pdu->mux_pattern = NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1; - pdcch_pdu->n_rb = (cset_idx < 4)? 24 : 48; - pdcch_pdu->n_symb = nr_coreset_nsymb_pdcch_type_0_scs_30_30_a40Mhz[cset_idx]; - pdcch_pdu->rb_offset = nr_coreset_rb_offset_pdcch_type_0_scs_30_30_a40Mhz[cset_idx]; - break; - - default: - AssertFatal(1==0,"Invalid scs_common/pdcch_scs combination %d/%d \n", scs_common, pdcch_scs); - } - } - break; - - case kHz120: - switch(pdcch_scs) { - case kHz60: - AssertFatal(cset_idx<12,"Coreset index %d reserved for scs kHz120/kHz60\n", cset_idx); - pdcch_pdu->mux_pattern = (cset_idx < 8)?NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1 : NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2; - pdcch_pdu->n_rb = (cset_idx < 6)? 48 : (cset_idx < 8)? 96 : (cset_idx < 10)? 48 : 96; - pdcch_pdu->n_symb = nr_coreset_nsymb_pdcch_type_0_scs_120_60[cset_idx]; - pdcch_pdu->rb_offset = (nr_coreset_rb_offset_pdcch_type_0_scs_120_60[cset_idx]>0)?nr_coreset_rb_offset_pdcch_type_0_scs_120_60[cset_idx] : - (k_ssb == 0)? -41 : -42; - break; - - case kHz120: - AssertFatal(cset_idx<8,"Coreset index %d reserved for scs kHz120/kHz120\n", cset_idx); - pdcch_pdu->mux_pattern = (cset_idx < 4)?NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1 : NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE3; - pdcch_pdu->n_rb = (cset_idx < 2)? 24 : (cset_idx < 4)? 48 : (cset_idx < 6)? 24 : 48; - pdcch_pdu->n_symb = (cset_idx == 2)? 1 : 2; - pdcch_pdu->rb_offset = (nr_coreset_rb_offset_pdcch_type_0_scs_120_120[cset_idx]>0)? nr_coreset_rb_offset_pdcch_type_0_scs_120_120[cset_idx] : - (k_ssb == 0)? -20 : -21; - break; - - default: - AssertFatal(1==0,"Invalid scs_common/pdcch_scs combination %d/%d \n", scs_common, pdcch_scs); - } - break; - - case kHz240: - switch(pdcch_scs) { - case kHz60: - AssertFatal(cset_idx<4,"Coreset index %d reserved for scs kHz240/kHz60\n", cset_idx); - pdcch_pdu->mux_pattern = NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1; - pdcch_pdu->n_rb = 96; - pdcch_pdu->n_symb = (cset_idx < 2)? 1 : 2; - pdcch_pdu->rb_offset = (cset_idx&1)? 16 : 0; - break; - - case kHz120: - AssertFatal(cset_idx<8,"Coreset index %d reserved for scs kHz240/kHz120\n", cset_idx); - pdcch_pdu->mux_pattern = (cset_idx < 4)? NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1 : NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2; - pdcch_pdu->n_rb = (cset_idx < 4)? 48 : (cset_idx < 6)? 24 : 48; - pdcch_pdu->n_symb = ((cset_idx==2)||(cset_idx==3))? 2 : 1; - pdcch_pdu->rb_offset = (nr_coreset_rb_offset_pdcch_type_0_scs_240_120[cset_idx]>0)? nr_coreset_rb_offset_pdcch_type_0_scs_240_120[cset_idx] : - (k_ssb == 0)? -41 : -42; - break; - - default: - AssertFatal(1==0,"Invalid scs_common/pdcch_scs combination %d/%d \n", scs_common, pdcch_scs); - } - break; - - default: - AssertFatal(1==0,"Invalid common subcarrier spacing %d\n", scs_common); - - } - - /// Search space params - switch(pdcch_pdu->mux_pattern) { - - case NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1: - if (freq_range == nr_FR1) { - O = nr_ss_param_O_type_0_mux1_FR1[ss_idx]; - pdcch_pdu->nb_ss_sets_per_slot = nr_ss_sets_per_slot_type_0_FR1[ss_idx]; - M = nr_ss_param_M_type_0_mux1_FR1[ss_idx]; - M_scale = nr_ss_scale_M_mux1_FR1[ss_idx]; - pdcch_pdu->first_symbol = (ss_idx < 8)? ( (ssb_idx&1)? pdcch_pdu->n_symb : 0 ) : nr_ss_first_symb_idx_type_0_mux1_FR1[ss_idx - 8]; - } - - else { - AssertFatal(ss_idx<14 ,"Invalid search space index for multiplexing type 1 and FR2 %d\n", ss_idx); - O = nr_ss_param_O_type_0_mux1_FR2[ss_idx]; - O_scale = nr_ss_scale_O_mux1_FR2[ss_idx]; - pdcch_pdu->nb_ss_sets_per_slot = nr_ss_sets_per_slot_type_0_FR2[ss_idx]; - M = nr_ss_param_M_type_0_mux1_FR2[ss_idx]; - M_scale = nr_ss_scale_M_mux1_FR2[ss_idx]; - pdcch_pdu->first_symbol = (ss_idx < 12)? ( (ss_idx&1)? 7 : 0 ) : 0; - } - pdcch_pdu->nb_slots = 2; - pdcch_pdu->sfn_mod2 = (CEILIDIV( (((O<>O_scale) + ((ssb_idx*M)>>M_scale)), nb_slots_per_frame ) & 1)? 1 : 0; - pdcch_pdu->first_slot = (((O<>O_scale) + ((ssb_idx*M)>>M_scale)) % nb_slots_per_frame; - - break; - - case NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2: - AssertFatal( ((scs_common==kHz120)&&(pdcch_scs==kHz60)) || ((scs_common==kHz240)&&(pdcch_scs==kHz120)), - "Invalid scs_common/pdcch_scs combination %d/%d for Mux type 2\n", scs_common, pdcch_scs ); - AssertFatal(ss_idx==0, "Search space index %d reserved for scs_common/pdcch_scs combination %d/%d", ss_idx, scs_common, pdcch_scs); - - pdcch_pdu->nb_slots = 1; - - if ((scs_common==kHz120)&&(pdcch_scs==kHz60)) { - pdcch_pdu->first_symbol = nr_ss_first_symb_idx_scs_120_60_mux2[ssb_idx&3]; - // Missing in pdcch_pdu sfn_C and n_C here and in else case - } - else { - pdcch_pdu->first_symbol = ((ssb_idx&7)==4)?12 : ((ssb_idx&7)==4)?13 : nr_ss_first_symb_idx_scs_240_120_set1_mux2[ssb_idx&7]; //??? - } - - break; - - case NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE3: - AssertFatal( (scs_common==kHz120)&&(pdcch_scs==kHz120), - "Invalid scs_common/pdcch_scs combination %d/%d for Mux type 3\n", scs_common, pdcch_scs ); - AssertFatal(ss_idx==0, "Search space index %d reserved for scs_common/pdcch_scs combination %d/%d", ss_idx, scs_common, pdcch_scs); - - pdcch_pdu->first_symbol = nr_ss_first_symb_idx_scs_120_120_mux3[ssb_idx&3]; - - break; - - default: - AssertFatal(1==0, "Invalid SSB and coreset multiplexing pattern %d\n", pdcch_pdu->mux_pattern); - } - pdcch_pdu->config_type = NFAPI_NR_CSET_CONFIG_MIB_SIB1; - pdcch_pdu->cr_mapping_type = NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED; - pdcch_pdu->precoder_granularity = NFAPI_NR_CSET_SAME_AS_REG_BUNDLE; - pdcch_pdu->reg_bundle_size = 6; - pdcch_pdu->interleaver_size = 2; - // set initial banwidth part to full bandwidth - pdcch_pdu->n_RB_BWP = N_RB; - - */ - -} - void config_uldci(const NR_SIB1_t *sib1, const NR_ServingCellConfigCommon_t *scc, const nfapi_nr_pusch_pdu_t *pusch_pdu, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 1f5a6ce6f5..4321d4f949 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1549,7 +1549,8 @@ void pf_ul(module_id_t module_id, NR_UE_info_t *UE_list[], int max_num_ue, int n_rb_sched, - uint16_t *rballoc_mask) { + uint16_t *rballoc_mask) +{ const int CC_id = 0; gNB_MAC_INST *nrmac = RC.nrmac[module_id]; @@ -1887,12 +1888,16 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t for (int i = 0; i < bwpSize; i++) rballoc_mask[i] = (i >= st && i <= e)*SL_to_bitmap(startSymbolIndex, nrOfSymbols); + int bw = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + int average_agg_level = 4; // TODO find a better estimation + int max_sched_ues = bw / (average_agg_level * NR_NB_REG_PER_CCE); + /* proportional fair scheduling algorithm */ pf_ul(module_id, frame, slot, nr_mac->UE_info.list, - 2, + max_sched_ues, len, rballoc_mask); return true; diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index cae73f091a..7e9a66ca7f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -221,25 +221,6 @@ int get_pdsch_to_harq_feedback(NR_PUCCH_Config_t *pucch_Config, nr_dci_format_t dci_format, uint8_t *pdsch_to_harq_feedback); -void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu, - nr_scs_e scs_common, - nr_scs_e pdcch_scs, - frequency_range_t freq_range, - uint8_t rmsi_pdcch_config, - uint8_t ssb_idx, - uint8_t k_ssb, - uint16_t sfn_ssb, - uint8_t n_ssb, - uint16_t nb_slots_per_frame, - uint16_t N_RB); -/* -int nr_is_dci_opportunity(nfapi_nr_search_space_t search_space, - nfapi_nr_coreset_t coreset, - uint16_t frame, - uint16_t slot, - nfapi_nr_config_request_scf_t cfg); -*/ - int nr_get_pucch_resource(NR_ControlResourceSet_t *coreset, NR_PUCCH_Config_t *pucch_Config, int CCEIndex);