|
|
|
@@ -407,6 +407,236 @@ void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int nr_fill_nfapi_dl_pdu(int Mod_idP,
|
|
|
|
|
nfapi_nr_dl_tti_request_body_t *dl_req,
|
|
|
|
|
NR_sched_pucch *pucch_sched,
|
|
|
|
|
uint8_t *mcsIndex,
|
|
|
|
|
uint16_t *rbSize,
|
|
|
|
|
uint16_t *rbStart) {
|
|
|
|
|
gNB_MAC_INST *nr_mac = RC.nrmac[Mod_idP];
|
|
|
|
|
NR_COMMON_channels_t *cc = nr_mac->common_channels;
|
|
|
|
|
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
|
|
|
|
|
|
|
|
|
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu;
|
|
|
|
|
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu;
|
|
|
|
|
|
|
|
|
|
int TBS;
|
|
|
|
|
int bwp_id=1;
|
|
|
|
|
int UE_id = 0;
|
|
|
|
|
|
|
|
|
|
NR_UE_list_t *UE_list = &RC.nrmac[Mod_idP]->UE_list;
|
|
|
|
|
|
|
|
|
|
NR_CellGroupConfig_t *secondaryCellGroup = UE_list->secondaryCellGroup[UE_id];
|
|
|
|
|
AssertFatal(secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
|
|
|
|
|
"downlinkBWP_ToAddModList has %d BWP!\n",
|
|
|
|
|
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
|
|
|
|
|
NR_BWP_Downlink_t *bwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
|
|
|
|
|
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList!=NULL,"searchPsacesToAddModList is null\n");
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count>0,
|
|
|
|
|
"searchPsacesToAddModList is empty\n");
|
|
|
|
|
|
|
|
|
|
dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
|
|
|
|
memset((void*)dl_tti_pdcch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
|
|
|
|
dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE;
|
|
|
|
|
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
|
|
|
|
|
|
|
|
|
dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs+1];
|
|
|
|
|
memset((void*)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
|
|
|
|
dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE;
|
|
|
|
|
dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdsch_pdu));
|
|
|
|
|
|
|
|
|
|
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
|
|
|
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pdsch_pdu_rel15->pduBitmap = 0;
|
|
|
|
|
pdsch_pdu_rel15->rnti = UE_list->rnti[UE_id];
|
|
|
|
|
pdsch_pdu_rel15->pduIndex = 0;
|
|
|
|
|
|
|
|
|
|
// BWP
|
|
|
|
|
pdsch_pdu_rel15->BWPSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
|
|
|
|
|
pdsch_pdu_rel15->BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
|
|
|
|
|
pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing;
|
|
|
|
|
if (bwp->bwp_Common->genericParameters.cyclicPrefix)
|
|
|
|
|
pdsch_pdu_rel15->CyclicPrefix = *bwp->bwp_Common->genericParameters.cyclicPrefix;
|
|
|
|
|
else
|
|
|
|
|
pdsch_pdu_rel15->CyclicPrefix = 0;
|
|
|
|
|
|
|
|
|
|
pdsch_pdu_rel15->NrOfCodewords = 1;
|
|
|
|
|
int mcs = (mcsIndex!=NULL) ? *mcsIndex : 9;
|
|
|
|
|
int current_harq_pid = UE_list->UE_sched_ctrl[UE_id].current_harq_pid;
|
|
|
|
|
pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcs,0);
|
|
|
|
|
pdsch_pdu_rel15->qamModOrder[0] = 2;
|
|
|
|
|
pdsch_pdu_rel15->mcsIndex[0] = mcs;
|
|
|
|
|
pdsch_pdu_rel15->mcsTable[0] = 0;
|
|
|
|
|
pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].round];
|
|
|
|
|
pdsch_pdu_rel15->dataScramblingId = *scc->physCellId;
|
|
|
|
|
pdsch_pdu_rel15->nrOfLayers = 1;
|
|
|
|
|
pdsch_pdu_rel15->transmissionScheme = 0;
|
|
|
|
|
pdsch_pdu_rel15->refPoint = 0; // Point A
|
|
|
|
|
UE_list->mac_stats[UE_id].dlsch_rounds[UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].round]++;
|
|
|
|
|
pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1;
|
|
|
|
|
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
|
|
|
|
|
pdsch_pdu_rel15->SCID = 0;
|
|
|
|
|
pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 1;
|
|
|
|
|
pdsch_pdu_rel15->dmrsPorts = 1;
|
|
|
|
|
pdsch_pdu_rel15->resourceAlloc = 1;
|
|
|
|
|
pdsch_pdu_rel15->rbStart = (rbStart!=NULL) ? *rbStart : 0;
|
|
|
|
|
pdsch_pdu_rel15->rbSize = (rbSize!=NULL) ? *rbSize : pdsch_pdu_rel15->BWPSize;
|
|
|
|
|
pdsch_pdu_rel15->VRBtoPRBMapping = 1; // non-interleaved, check if this is ok for initialBWP
|
|
|
|
|
|
|
|
|
|
int startSymbolAndLength=0;
|
|
|
|
|
int time_domain_assignment=2;
|
|
|
|
|
int StartSymbolIndex,NrOfSymbols;
|
|
|
|
|
|
|
|
|
|
AssertFatal(time_domain_assignment<bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count,"time_domain_assignment %d>=%d\n",time_domain_assignment,bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count);
|
|
|
|
|
startSymbolAndLength = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength;
|
|
|
|
|
SLIV2SL(startSymbolAndLength,&StartSymbolIndex,&NrOfSymbols);
|
|
|
|
|
pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex;
|
|
|
|
|
pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols;
|
|
|
|
|
|
|
|
|
|
// k0 = *bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0;
|
|
|
|
|
pdsch_pdu_rel15->dlDmrsSymbPos =
|
|
|
|
|
fill_dmrs_mask(bwp->bwp_Dedicated->pdsch_Config->choice.setup,
|
|
|
|
|
scc->dmrs_TypeA_Position,
|
|
|
|
|
pdsch_pdu_rel15->NrOfSymbols);
|
|
|
|
|
|
|
|
|
|
dci_pdu_rel15_t dci_pdu_rel15[MAX_DCI_CORESET];
|
|
|
|
|
memset(dci_pdu_rel15, 0, sizeof(dci_pdu_rel15_t) * MAX_DCI_CORESET);
|
|
|
|
|
|
|
|
|
|
// bwp indicator
|
|
|
|
|
int n_dl_bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
|
|
|
|
|
if (n_dl_bwp < 4)
|
|
|
|
|
dci_pdu_rel15[0].bwp_indicator.val = bwp_id;
|
|
|
|
|
else
|
|
|
|
|
dci_pdu_rel15[0].bwp_indicator.val = bwp_id - 1; // as per table 7.3.1.1.2-1 in 38.212
|
|
|
|
|
// frequency domain assignment
|
|
|
|
|
if (bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation==NR_PDSCH_Config__resourceAllocation_resourceAllocationType1)
|
|
|
|
|
dci_pdu_rel15[0].frequency_domain_assignment.val =
|
|
|
|
|
PRBalloc_to_locationandbandwidth0(
|
|
|
|
|
pdsch_pdu_rel15->rbSize,
|
|
|
|
|
pdsch_pdu_rel15->rbStart,
|
|
|
|
|
NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,
|
|
|
|
|
275));
|
|
|
|
|
else
|
|
|
|
|
AssertFatal(1==0,"Only frequency resource allocation type 1 is currently supported\n");
|
|
|
|
|
// time domain assignment
|
|
|
|
|
dci_pdu_rel15[0].time_domain_assignment.val = time_domain_assignment; // row index used here instead of SLIV;
|
|
|
|
|
// mcs and rv
|
|
|
|
|
dci_pdu_rel15[0].mcs = pdsch_pdu_rel15->mcsIndex[0];
|
|
|
|
|
dci_pdu_rel15[0].rv = pdsch_pdu_rel15->rvIndex[0];
|
|
|
|
|
// harq pid and ndi
|
|
|
|
|
dci_pdu_rel15[0].harq_pid = current_harq_pid;
|
|
|
|
|
dci_pdu_rel15[0].ndi = UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].ndi;
|
|
|
|
|
// DAI
|
|
|
|
|
dci_pdu_rel15[0].dai[0].val = (pucch_sched->dai_c-1)&3;
|
|
|
|
|
|
|
|
|
|
// TPC for PUCCH
|
|
|
|
|
dci_pdu_rel15[0].tpc = UE_list->UE_sched_ctrl[UE_id].tpc1; // table 7.2.1-1 in 38.213
|
|
|
|
|
// PUCCH resource indicator
|
|
|
|
|
dci_pdu_rel15[0].pucch_resource_indicator = pucch_sched->resource_indicator;
|
|
|
|
|
// PDSCH to HARQ TI
|
|
|
|
|
dci_pdu_rel15[0].pdsch_to_harq_feedback_timing_indicator.val = pucch_sched->timing_indicator;
|
|
|
|
|
UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].feedback_slot = pucch_sched->ul_slot;
|
|
|
|
|
UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].is_waiting = 1;
|
|
|
|
|
// antenna ports
|
|
|
|
|
dci_pdu_rel15[0].antenna_ports.val = 0; // nb of cdm groups w/o data 1 and dmrs port 0
|
|
|
|
|
// dmrs sequence initialization
|
|
|
|
|
dci_pdu_rel15[0].dmrs_sequence_initialization.val = pdsch_pdu_rel15->SCID;
|
|
|
|
|
LOG_D(MAC,
|
|
|
|
|
"[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d (%d,%d,%d), "
|
|
|
|
|
"time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d\n",
|
|
|
|
|
dci_pdu_rel15[0].frequency_domain_assignment.val,
|
|
|
|
|
pdsch_pdu_rel15->rbStart,
|
|
|
|
|
pdsch_pdu_rel15->rbSize,
|
|
|
|
|
NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, 275),
|
|
|
|
|
dci_pdu_rel15[0].time_domain_assignment.val,
|
|
|
|
|
dci_pdu_rel15[0].vrb_to_prb_mapping.val,
|
|
|
|
|
dci_pdu_rel15[0].mcs,
|
|
|
|
|
dci_pdu_rel15[0].tb_scaling,
|
|
|
|
|
dci_pdu_rel15[0].ndi,
|
|
|
|
|
dci_pdu_rel15[0].rv);
|
|
|
|
|
|
|
|
|
|
NR_SearchSpace_t *ss;
|
|
|
|
|
int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
|
|
|
|
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList!=NULL,"searchPsacesToAddModList is null\n");
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count>0,
|
|
|
|
|
"searchPsacesToAddModList is empty\n");
|
|
|
|
|
|
|
|
|
|
int found=0;
|
|
|
|
|
|
|
|
|
|
for (int i=0;i<bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;i++) {
|
|
|
|
|
ss=bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
|
|
|
|
|
AssertFatal(ss->controlResourceSetId != NULL,"ss->controlResourceSetId is null\n");
|
|
|
|
|
AssertFatal(ss->searchSpaceType != NULL,"ss->searchSpaceType is null\n");
|
|
|
|
|
if (ss->searchSpaceType->present == target_ss) {
|
|
|
|
|
found=1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
AssertFatal(found==1,"Couldn't find an adequate searchspace\n");
|
|
|
|
|
|
|
|
|
|
int ret = nr_configure_pdcch(nr_mac,
|
|
|
|
|
pdcch_pdu_rel15,
|
|
|
|
|
UE_list->rnti[UE_id],
|
|
|
|
|
1, // ue-specific
|
|
|
|
|
ss,
|
|
|
|
|
scc,
|
|
|
|
|
bwp);
|
|
|
|
|
if (ret < 0) {
|
|
|
|
|
LOG_I(MAC,"CCE list not empty, couldn't schedule PDSCH\n");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int dci_formats[2];
|
|
|
|
|
int rnti_types[2];
|
|
|
|
|
|
|
|
|
|
if (ss->searchSpaceType->choice.ue_Specific->dci_Formats)
|
|
|
|
|
dci_formats[0] = NR_DL_DCI_FORMAT_1_1;
|
|
|
|
|
else
|
|
|
|
|
dci_formats[0] = NR_DL_DCI_FORMAT_1_0;
|
|
|
|
|
|
|
|
|
|
rnti_types[0] = NR_RNTI_C;
|
|
|
|
|
|
|
|
|
|
fill_dci_pdu_rel15(scc,secondaryCellGroup,pdcch_pdu_rel15,dci_pdu_rel15,dci_formats,rnti_types,pdsch_pdu_rel15->BWPSize,bwp_id);
|
|
|
|
|
|
|
|
|
|
LOG_D(MAC,
|
|
|
|
|
"DCI params: rnti %x, rnti_type %d, dci_format %d\n",
|
|
|
|
|
pdcch_pdu_rel15->dci_pdu.RNTI[0],
|
|
|
|
|
rnti_types[0],
|
|
|
|
|
dci_formats[0]);
|
|
|
|
|
LOG_D(MAC,
|
|
|
|
|
"coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n",
|
|
|
|
|
(unsigned long long)pdcch_pdu_rel15->FreqDomainResource,
|
|
|
|
|
pdcch_pdu_rel15->StartSymbolIndex,
|
|
|
|
|
pdcch_pdu_rel15->DurationSymbols);
|
|
|
|
|
|
|
|
|
|
int x_Overhead = 0; // should be 0 for initialBWP
|
|
|
|
|
nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu,x_Overhead,pdsch_pdu_rel15->numDmrsCdmGrpsNoData,0);
|
|
|
|
|
|
|
|
|
|
// Hardcode it for now
|
|
|
|
|
TBS = dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15.TBSize[0];
|
|
|
|
|
if (UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].round==0)
|
|
|
|
|
UE_list->mac_stats[UE_id].dlsch_total_bytes += TBS;
|
|
|
|
|
|
|
|
|
|
LOG_D(MAC,
|
|
|
|
|
"DLSCH PDU: start PRB %d n_PRB %d startSymbolAndLength %d start symbol "
|
|
|
|
|
"%d nb_symbols %d nb_layers %d nb_codewords %d mcs %d TBS: %d\n",
|
|
|
|
|
pdsch_pdu_rel15->rbStart,
|
|
|
|
|
pdsch_pdu_rel15->rbSize,
|
|
|
|
|
startSymbolAndLength,
|
|
|
|
|
pdsch_pdu_rel15->StartSymbolIndex,
|
|
|
|
|
pdsch_pdu_rel15->NrOfSymbols,
|
|
|
|
|
pdsch_pdu_rel15->nrOfLayers,
|
|
|
|
|
pdsch_pdu_rel15->NrOfCodewords,
|
|
|
|
|
pdsch_pdu_rel15->mcsIndex[0],
|
|
|
|
|
TBS);
|
|
|
|
|
|
|
|
|
|
return TBS; //Return TBS in bytes
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int nr_configure_pdcch(gNB_MAC_INST *nr_mac,
|
|
|
|
|
nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
|
|
|
|
|
uint16_t rnti,
|
|
|
|
|