Commit de2cf239 authored by Robert Schmidt's avatar Robert Schmidt

Do not allocate CCE in nr_configure_pdcch()

nr_configure_pdcch() allocates the CCE, but this is not wanted, e.g., in
multi-user scheduling, since it might not be possible to allocate the
CCEs for these UEs. This commit makes the following changes:

- remove CCE allocation in nr_configure_pdcch()
- remove coreset search in nr_configure_pdcch()
- add functions get_coreset() and get_searchspace() to retrieve coresets
  and search spaces easily
- in nr_fill_nfapi_dl_pdu(), add extra parameters for aggregation level
  and CCE indices and the searchspace and coreset of a UE, which might
  be different for each UE
- allocate CCEs manually in phytest, RA, and DLSCH schedulers
parent 43f177e7
...@@ -681,7 +681,31 @@ void nr_generate_Msg2(module_id_t module_idP, ...@@ -681,7 +681,31 @@ void nr_generate_Msg2(module_id_t module_idP,
dci_pdu_rel15[0].mcs, dci_pdu_rel15[0].mcs,
dci_pdu_rel15[0].tb_scaling); dci_pdu_rel15[0].tb_scaling);
nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, RA_rnti, 0, ss, scc, bwp); uint8_t nr_of_candidates, aggregation_level;
find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0 /* common */);
int CCEIndex = allocate_nr_CCEs(
nr_mac,
bwp,
coreset,
aggregation_level,
ss->searchSpaceType->present - 1, // 0 common, 1 ue-specific
UE_id,
0); // m
if (CCEIndex < 0) {
LOG_E(MAC, "%s(): cannot find free CCE for UE %d!\n", __func__, UE_id);
return;
}
nr_configure_pdcch(nr_mac,
pdcch_pdu_rel15,
RA_rnti,
ss,
coreset,
scc,
bwp,
aggregation_level,
CCEIndex);
LOG_I(MAC, "Frame %d: Subframe %d : Adding common DL DCI for RA_RNTI %x\n", frameP, slotP, RA_rnti); LOG_I(MAC, "Frame %d: Subframe %d : Adding common DL DCI for RA_RNTI %x\n", frameP, slotP, RA_rnti);
......
...@@ -447,18 +447,37 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -447,18 +447,37 @@ void nr_schedule_ue_spec(module_id_t module_id,
rlc_status.bytes_in_buffer); rlc_status.bytes_in_buffer);
/* PREPROCESSOR */ /* PREPROCESSOR */
/* Find PUCCH occasion */ /* BWP */
int pucch_sched;
nr_update_pucch_scheduling(module_id, UE_id, frame, slot, num_slots_per_tdd, &pucch_sched);
NR_sched_pucch *pucch = &UE_list->UE_sched_ctrl[UE_id].sched_pucch[pucch_sched];
/* BWP and following: for MCS calculation, possibly based on CQI and RLC ind */
const int bwp_id = 1; const int bwp_id = 1;
NR_CellGroupConfig_t *secondaryCellGroup = UE_list->secondaryCellGroup[UE_id]; NR_CellGroupConfig_t *secondaryCellGroup = UE_list->secondaryCellGroup[UE_id];
AssertFatal(secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, AssertFatal(secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
"downlinkBWP_ToAddModList has %d BWP!\n", "downlinkBWP_ToAddModList has %d BWP!\n",
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id - 1]; NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id - 1];
const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
NR_SearchSpace_t *ss = get_searchspace(bwp, target_ss);
/* Find a free CCE */
uint8_t nr_of_candidates, aggregation_level;
find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 1 /* dedicated */);
int CCEIndex = allocate_nr_CCEs(gNB_mac,
bwp,
coreset,
aggregation_level,
ss->searchSpaceType->present - 1,
UE_id,
0); // m
if (CCEIndex < 0) {
LOG_E(MAC, "%s(): could not find CCE for UE %d\n", __func__, UE_id);
return;
}
/* Find PUCCH occasion */
int pucch_sched;
nr_update_pucch_scheduling(module_id, UE_id, frame, slot, num_slots_per_tdd, &pucch_sched);
NR_sched_pucch *pucch = &UE_list->UE_sched_ctrl[UE_id].sched_pucch[pucch_sched];
const uint16_t bwpSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275); const uint16_t bwpSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
const uint8_t mcs = 9; const uint8_t mcs = 9;
...@@ -601,6 +620,8 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -601,6 +620,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
nr_fill_nfapi_dl_pdu(module_id, nr_fill_nfapi_dl_pdu(module_id,
UE_id, UE_id,
bwp_id, bwp_id,
ss,
coreset,
dl_req, dl_req,
pucch, pucch,
nrOfLayers, nrOfLayers,
...@@ -615,7 +636,9 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -615,7 +636,9 @@ void nr_schedule_ue_spec(module_id_t module_id,
TBS, TBS,
time_domain_assignment, time_domain_assignment,
startSymbolIndex, startSymbolIndex,
nrOfSymbols); nrOfSymbols,
aggregation_level,
CCEIndex);
nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[gNB_mac->TX_req[CC_id].Number_of_PDUs]; nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[gNB_mac->TX_req[CC_id].Number_of_PDUs];
configure_fapi_dl_Tx(module_id, configure_fapi_dl_Tx(module_id,
......
...@@ -414,18 +414,31 @@ int configure_fapi_dl_pdu_phytest(int Mod_idP, ...@@ -414,18 +414,31 @@ int configure_fapi_dl_pdu_phytest(int Mod_idP,
} }
AssertFatal(found==1,"Couldn't find an adequate searchspace\n"); AssertFatal(found==1,"Couldn't find an adequate searchspace\n");
int ret = nr_configure_pdcch(nr_mac, uint8_t nr_of_candidates, aggregation_level;
pdcch_pdu_rel15, find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
UE_list->rnti[UE_id], NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 1 /* dedicated */);
1, // ue-specific int CCEIndex = allocate_nr_CCEs(
ss, nr_mac,
scc, bwp,
bwp); coreset,
if (ret < 0) { aggregation_level,
LOG_I(MAC,"CCE list not empty, couldn't schedule PDSCH\n"); ss->searchSpaceType->present - 1, // 0 common, 1 ue-specific
free(dci_pdu_rel15); UE_id,
return (0); 0); // m
if (CCEIndex < 0) {
LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PDSCH\n", __func__);
free(dci_pdu_rel15);
return 0;
} }
nr_configure_pdcch(nr_mac,
pdcch_pdu_rel15,
UE_list->rnti[UE_id],
ss,
coreset,
scc,
bwp,
aggregation_level,
CCEIndex);
int dci_formats[2]; int dci_formats[2];
int rnti_types[2]; int rnti_types[2];
...@@ -1098,20 +1111,33 @@ void schedule_fapi_ul_pdu(int Mod_idP, ...@@ -1098,20 +1111,33 @@ void schedule_fapi_ul_pdu(int Mod_idP,
LOG_D(MAC,"Configuring ULDCI/PDCCH in %d.%d\n", frameP,slotP); LOG_D(MAC,"Configuring ULDCI/PDCCH in %d.%d\n", frameP,slotP);
int ret = nr_configure_pdcch(nr_mac, uint8_t nr_of_candidates, aggregation_level;
pdcch_pdu_rel15, find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
UE_list->rnti[UE_id], NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 1 /* dedicated */);
1, // ue-specific, int CCEIndex = allocate_nr_CCEs(
ss, nr_mac,
scc, bwp,
bwp); coreset,
aggregation_level,
if (ret < 0) { ss->searchSpaceType->present - 1, // 0 common, 1 ue-specific
LOG_I(MAC,"CCE list not empty, couldn't schedule PUSCH\n"); UE_id,
0); // m
if (CCEIndex < 0) {
LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PUSCH\n", __func__);
pusch_sched->active = false; pusch_sched->active = false;
return; return;
} }
else { else {
nr_configure_pdcch(nr_mac,
pdcch_pdu_rel15,
UE_list->rnti[UE_id],
ss,
coreset,
scc,
bwp,
aggregation_level,
CCEIndex);
dci_pdu_rel15_t *dci_pdu_rel15 = calloc(MAX_DCI_CORESET,sizeof(dci_pdu_rel15_t)); dci_pdu_rel15_t *dci_pdu_rel15 = calloc(MAX_DCI_CORESET,sizeof(dci_pdu_rel15_t));
config_uldci(ubwp,pusch_pdu,pdcch_pdu_rel15,&dci_pdu_rel15[0],dci_formats,rnti_types,time_domain_assignment,UE_list->UE_sched_ctrl[UE_id].tpc0,n_ubwp,bwp_id); config_uldci(ubwp,pusch_pdu,pdcch_pdu_rel15,&dci_pdu_rel15[0],dci_formats,rnti_types,time_domain_assignment,UE_list->UE_sched_ctrl[UE_id].tpc0,n_ubwp,bwp_id);
fill_dci_pdu_rel15(scc,secondaryCellGroup,pdcch_pdu_rel15,dci_pdu_rel15,dci_formats,rnti_types,pusch_pdu->bwp_size,bwp_id); fill_dci_pdu_rel15(scc,secondaryCellGroup,pdcch_pdu_rel15,dci_pdu_rel15,dci_formats,rnti_types,pusch_pdu->bwp_size,bwp_id);
......
...@@ -132,6 +132,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, ...@@ -132,6 +132,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
void nr_fill_nfapi_dl_pdu(int Mod_id, void nr_fill_nfapi_dl_pdu(int Mod_id,
int UE_id, int UE_id,
int bwp_id, int bwp_id,
NR_SearchSpace_t *ss,
NR_ControlResourceSet_t *coreset,
nfapi_nr_dl_tti_request_body_t *dl_req, nfapi_nr_dl_tti_request_body_t *dl_req,
NR_sched_pucch *pucch_sched, NR_sched_pucch *pucch_sched,
int nrOfLayers, int nrOfLayers,
...@@ -146,7 +148,9 @@ void nr_fill_nfapi_dl_pdu(int Mod_id, ...@@ -146,7 +148,9 @@ void nr_fill_nfapi_dl_pdu(int Mod_id,
uint32_t tbs, uint32_t tbs,
int time_domain_assignment, int time_domain_assignment,
int StartSymbolIndex, int StartSymbolIndex,
int NrOfSymbols); int NrOfSymbols,
uint8_t aggregation_level,
int CCEIndex);
int configure_fapi_dl_pdu_phytest(int Mod_id, int configure_fapi_dl_pdu_phytest(int Mod_id,
nfapi_nr_dl_tti_request_body_t *dl_req, nfapi_nr_dl_tti_request_body_t *dl_req,
...@@ -233,13 +237,15 @@ void find_search_space(int ss_type, ...@@ -233,13 +237,15 @@ void find_search_space(int ss_type,
NR_BWP_Downlink_t *bwp, NR_BWP_Downlink_t *bwp,
NR_SearchSpace_t *ss); NR_SearchSpace_t *ss);
int nr_configure_pdcch(gNB_MAC_INST *nr_mac, void nr_configure_pdcch(gNB_MAC_INST *nr_mac,
nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu, nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
uint16_t rnti, uint16_t rnti,
int ss_type, NR_SearchSpace_t *ss,
NR_SearchSpace_t *ss, NR_ControlResourceSet_t *coreset,
NR_ServingCellConfigCommon_t *scc, NR_ServingCellConfigCommon_t *scc,
NR_BWP_Downlink_t *bwp); NR_BWP_Downlink_t *bwp,
uint8_t aggregation_level,
int CCEIndex);
void fill_dci_pdu_rel15(NR_ServingCellConfigCommon_t *scc, void fill_dci_pdu_rel15(NR_ServingCellConfigCommon_t *scc,
NR_CellGroupConfig_t *secondaryCellGroup, NR_CellGroupConfig_t *secondaryCellGroup,
...@@ -255,6 +261,16 @@ void prepare_dci(NR_CellGroupConfig_t *secondaryCellGroup, ...@@ -255,6 +261,16 @@ void prepare_dci(NR_CellGroupConfig_t *secondaryCellGroup,
nr_dci_format_t format, nr_dci_format_t format,
int bwp_id); int bwp_id);
/* find coreset within the search space */
NR_ControlResourceSet_t *get_coreset(NR_BWP_Downlink_t *bwp,
NR_SearchSpace_t *ss,
int ss_type);
/* find a search space within a BWP */
NR_SearchSpace_t *get_searchspace(
NR_BWP_Downlink_t *bwp,
NR_SearchSpace__searchSpaceType_PR target_ss);
void find_aggregation_candidates(uint8_t *aggregation_level, void find_aggregation_candidates(uint8_t *aggregation_level,
uint8_t *nr_of_candidates, uint8_t *nr_of_candidates,
NR_SearchSpace_t *ss); NR_SearchSpace_t *ss);
...@@ -290,13 +306,12 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP); ...@@ -290,13 +306,12 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP);
void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti); void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti);
int allocate_nr_CCEs(gNB_MAC_INST *nr_mac, int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
int bwp_id, NR_BWP_Downlink_t *bwp,
int coreset_id, NR_ControlResourceSet_t *coreset,
int aggregation, int aggregation,
int search_space, // 0 common, 1 ue-specific int search_space, // 0 common, 1 ue-specific
int UE_id, int UE_id,
int m int m);
);
int get_dlscs(nfapi_nr_config_request_t *cfg); int get_dlscs(nfapi_nr_config_request_t *cfg);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment