Merge remote-tracking branch 'origin/NR_RRC_CSI_RS_improv_2' into integration_2023_w25
This commit is contained in:
@@ -60,7 +60,7 @@ const int get_dl_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon
|
|||||||
AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n");
|
AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n");
|
||||||
|
|
||||||
// Use special TDA in case of CSI-RS
|
// Use special TDA in case of CSI-RS
|
||||||
if(nrmac->UE_info.sched_csirs)
|
if(nrmac->UE_info.sched_csirs > 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (tdd && tdd->nrofDownlinkSymbols > 1) { // if there is a mixed slot where we can transmit DL
|
if (tdd && tdd->nrofDownlinkSymbols > 1) { // if there is a mixed slot where we can transmit DL
|
||||||
|
|||||||
@@ -2552,18 +2552,23 @@ void nr_csirs_scheduling(int Mod_idP, frame_t frame, sub_frame_t slot, int n_slo
|
|||||||
|
|
||||||
uint16_t *vrb_map = gNB_mac->common_channels[CC_id].vrb_map;
|
uint16_t *vrb_map = gNB_mac->common_channels[CC_id].vrb_map;
|
||||||
|
|
||||||
UE_info->sched_csirs = false;
|
UE_info->sched_csirs = 0;
|
||||||
|
|
||||||
UE_iterator(UE_info->list, UE) {
|
UE_iterator(UE_info->list, UE) {
|
||||||
|
NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP;
|
||||||
|
NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
|
||||||
|
|
||||||
|
// CSI-RS is common to all UEs in a given BWP
|
||||||
|
// therefore we need to schedule only once per BWP
|
||||||
|
// the following condition verifies if CSI-RS
|
||||||
|
// has been already scheduled in this BWP
|
||||||
|
if (UE_info->sched_csirs & (1 << dl_bwp->bwp_id))
|
||||||
|
continue;
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||||
if (sched_ctrl->rrc_processing_timer > 0) {
|
if (sched_ctrl->rrc_processing_timer > 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP;
|
|
||||||
NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
|
|
||||||
|
|
||||||
if (!ul_bwp->csi_MeasConfig) continue;
|
if (!ul_bwp->csi_MeasConfig) continue;
|
||||||
|
|
||||||
NR_CSI_MeasConfig_t *csi_measconfig = ul_bwp->csi_MeasConfig;
|
NR_CSI_MeasConfig_t *csi_measconfig = ul_bwp->csi_MeasConfig;
|
||||||
@@ -2598,8 +2603,9 @@ void nr_csirs_scheduling(int Mod_idP, frame_t frame, sub_frame_t slot, int n_slo
|
|||||||
|
|
||||||
if((frame*n_slots_frame+slot-offset)%period == 0) {
|
if((frame*n_slots_frame+slot-offset)%period == 0) {
|
||||||
|
|
||||||
LOG_D(NR_MAC,"Scheduling CSI-RS in frame %d slot %d Resource ID %ld\n",frame,slot,nzpcsi->nzp_CSI_RS_ResourceId);
|
LOG_D(NR_MAC,"Scheduling CSI-RS in frame %d slot %d Resource ID %ld\n",
|
||||||
UE_info->sched_csirs = true;
|
frame, slot, nzpcsi->nzp_CSI_RS_ResourceId);
|
||||||
|
UE_info->sched_csirs |= (1 << dl_bwp->bwp_id);
|
||||||
|
|
||||||
nfapi_nr_dl_tti_request_pdu_t *dl_tti_csirs_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
nfapi_nr_dl_tti_request_pdu_t *dl_tti_csirs_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
||||||
memset((void*)dl_tti_csirs_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
memset((void*)dl_tti_csirs_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
||||||
|
|||||||
@@ -691,7 +691,8 @@ typedef struct {
|
|||||||
// last element always NULL
|
// last element always NULL
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1];
|
NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1];
|
||||||
bool sched_csirs;
|
// bitmap of CSI-RS already scheduled in current slot
|
||||||
|
int sched_csirs;
|
||||||
uid_allocator_t uid_allocator;
|
uid_allocator_t uid_allocator;
|
||||||
} NR_UEs_t;
|
} NR_UEs_t;
|
||||||
|
|
||||||
|
|||||||
@@ -140,11 +140,12 @@ static uint64_t get_ssb_bitmap(const NR_ServingCellConfigCommon_t *scc)
|
|||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_slots_per_period, int nb_dl_slots_period)
|
static void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int id, int nb_slots_per_period, int nb_dl_slots_period)
|
||||||
{
|
{
|
||||||
nzpcsi0->periodicityAndOffset = calloc(1,sizeof(*nzpcsi0->periodicityAndOffset));
|
nzpcsi0->periodicityAndOffset = calloc(1,sizeof(*nzpcsi0->periodicityAndOffset));
|
||||||
const int ideal_period = nb_slots_per_period * MAX_MOBILES_PER_GNB;
|
// TODO ideal period to be set according to estimation by the gNB on how fast the channel changes
|
||||||
const int offset = nb_slots_per_period * uid;
|
const int ideal_period = 320;
|
||||||
|
const int offset = nb_slots_per_period * id;
|
||||||
|
|
||||||
if (ideal_period < 5) {
|
if (ideal_period < 5) {
|
||||||
nzpcsi0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots4;
|
nzpcsi0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots4;
|
||||||
@@ -184,14 +185,13 @@ static void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, in
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
nzpcsi0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
|
nzpcsi0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
|
||||||
AssertFatal(offset / 320 < nb_dl_slots_period, "Cannot allocate %dth UE. Not enough resources for CSI-RS\n", uid);
|
AssertFatal(offset / 320 < nb_dl_slots_period, "Cannot allocate CSI-RS for BWP %d. Not enough resources for CSI-RS\n", id);
|
||||||
nzpcsi0->periodicityAndOffset->choice.slots320 = (offset % 320) + (offset / 320);
|
nzpcsi0->periodicityAndOffset->choice.slots320 = (offset % 320) + (offset / 320);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
static void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||||
NR_CSI_MeasConfig_t *csi_MeasConfig,
|
NR_CSI_MeasConfig_t *csi_MeasConfig,
|
||||||
int uid,
|
|
||||||
int num_dl_antenna_ports,
|
int num_dl_antenna_ports,
|
||||||
int curr_bwp,
|
int curr_bwp,
|
||||||
int do_csirs,
|
int do_csirs,
|
||||||
@@ -266,7 +266,7 @@ static void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigco
|
|||||||
nzpcsi0->powerControlOffsetSS = calloc(1,sizeof(*nzpcsi0->powerControlOffsetSS));
|
nzpcsi0->powerControlOffsetSS = calloc(1,sizeof(*nzpcsi0->powerControlOffsetSS));
|
||||||
*nzpcsi0->powerControlOffsetSS = NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
|
*nzpcsi0->powerControlOffsetSS = NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
|
||||||
nzpcsi0->scramblingID = *servingcellconfigcommon->physCellId;
|
nzpcsi0->scramblingID = *servingcellconfigcommon->physCellId;
|
||||||
set_csirs_periodicity(nzpcsi0, uid, nb_slots_per_period, nb_dl_slots_period);
|
set_csirs_periodicity(nzpcsi0, id, nb_slots_per_period, nb_dl_slots_period);
|
||||||
nzpcsi0->qcl_InfoPeriodicCSI_RS = calloc(1,sizeof(*nzpcsi0->qcl_InfoPeriodicCSI_RS));
|
nzpcsi0->qcl_InfoPeriodicCSI_RS = calloc(1,sizeof(*nzpcsi0->qcl_InfoPeriodicCSI_RS));
|
||||||
*nzpcsi0->qcl_InfoPeriodicCSI_RS = 0;
|
*nzpcsi0->qcl_InfoPeriodicCSI_RS = 0;
|
||||||
asn1cSeqAdd(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpcsi0);
|
asn1cSeqAdd(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpcsi0);
|
||||||
@@ -2243,7 +2243,7 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
|
|||||||
bwp_id = bwp->bwp_Id;
|
bwp_id = bwp->bwp_Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
config_csirs(scc, csi_MeasConfig, uid, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, bwp_loop);
|
config_csirs(scc, csi_MeasConfig, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, bwp_loop);
|
||||||
config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, bwp_loop);
|
config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, bwp_loop);
|
||||||
|
|
||||||
NR_CSI_ResourceConfig_t *csires1 = calloc(1, sizeof(*csires1));
|
NR_CSI_ResourceConfig_t *csires1 = calloc(1, sizeof(*csires1));
|
||||||
@@ -2797,7 +2797,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
|
|||||||
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop];
|
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop];
|
||||||
int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
|
|
||||||
config_csirs(servingcellconfigcommon, csi_MeasConfig, uid, dl_antenna_ports, curr_bwp, do_csirs, bwp_loop);
|
config_csirs(servingcellconfigcommon, csi_MeasConfig, dl_antenna_ports, curr_bwp, do_csirs, bwp_loop);
|
||||||
config_csiim(do_csirs, dl_antenna_ports, curr_bwp, csi_MeasConfig, bwp_loop);
|
config_csiim(do_csirs, dl_antenna_ports, curr_bwp, csi_MeasConfig, bwp_loop);
|
||||||
|
|
||||||
if (do_csirs) {
|
if (do_csirs) {
|
||||||
|
|||||||
Reference in New Issue
Block a user