for(uint8_t idx=0; idx<cnt; idx++)
{
/* start symbol determined using {2, 8} + 14n */
- ssbStartSymbArr[symbIdx++] = 2 + SCH_SYMBOL_PER_SLOT*idx;
- ssbStartSymbArr[symbIdx++] = 8 + SCH_SYMBOL_PER_SLOT*idx;
+ ssbStartSymbArr[symbIdx++] = 2 + MAX_SYMB_PER_SLOT*idx;
+ ssbStartSymbArr[symbIdx++] = 8 + MAX_SYMB_PER_SLOT*idx;
}
}
break;
for(uint8_t idx=0; idx<cnt; idx++)
{
/* start symbol determined using {4, 8, 16, 20} + 28n */
- ssbStartSymbArr[symbIdx++] = 4 + SCH_SYMBOL_PER_SLOT*idx;
- ssbStartSymbArr[symbIdx++] = 8 + SCH_SYMBOL_PER_SLOT*idx;
- ssbStartSymbArr[symbIdx++] = 16 + SCH_SYMBOL_PER_SLOT*idx;
- ssbStartSymbArr[symbIdx++] = 20 + SCH_SYMBOL_PER_SLOT*idx;
+ ssbStartSymbArr[symbIdx++] = 4 + MAX_SYMB_PER_SLOT*idx;
+ ssbStartSymbArr[symbIdx++] = 8 + MAX_SYMB_PER_SLOT*idx;
+ ssbStartSymbArr[symbIdx++] = 16 + MAX_SYMB_PER_SLOT*idx;
+ ssbStartSymbArr[symbIdx++] = 20 + MAX_SYMB_PER_SLOT*idx;
}
}
break;
uint8_t mValue = 0;
uint8_t firstSymbol = 0; /* need to calculate using formula mentioned in 38.213 */
uint8_t slotIndex = 0;
- /* TODO : This should be filled through freqDomRscAllocType0() */
- uint8_t FreqDomainResource[6] = {15, 0, 0, 0, 0, 0};
+ uint8_t FreqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
uint16_t tbSize = 0;
uint8_t ssbIdx = 0;
slotIndex = (int)((oValue*pow(2, mu)) + floor(ssbIdx*mValue))%numSlots;
sib1SchCfg->n0 = slotIndex;
- /* calculate the PRBs */
- //freqDomRscAllocType0(((offsetPointA-offset)/6), (numRbs/6), FreqDomainResource);
-
/* fill BWP */
switch(bandwidth)
{
pdcch->coresetCfg.coreSetSize = numRbs;
pdcch->coresetCfg.startSymbolIndex = firstSymbol;
pdcch->coresetCfg.durationSymbols = numSymbols;
- memcpy(pdcch->coresetCfg.freqDomainResource,FreqDomainResource,6);
+
+ /* Fill Bitmap for PRBs in coreset */
+ fillCoresetFeqDomAllocMap(((offsetPointA-offset)/6), (numRbs/6), FreqDomainResource);
+ covertFreqDomRsrcMapToIAPIFormat(FreqDomainResource, pdcch->coresetCfg.freqDomainResource);
+
pdcch->coresetCfg.cceRegMappingType = 1; /* coreset0 is always interleaved */
pdcch->coresetCfg.regBundleSize = 6; /* spec-38.211 sec 7.3.2.2 */
pdcch->coresetCfg.interleaverSize = 2; /* spec-38.211 sec 7.3.2.2 */
SchCellCfgCfm schCellCfgCfm;
Pst rspPst;
Inst inst = pst->dstInst-1;
+ uint8_t coreset0Idx = 0;
+ uint8_t numRbs = 0;
+ uint8_t offset = 0;
+ uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
SchPdschConfig pdschCfg;
#ifdef CALL_FLOW_DEBUG_LOG
schCellCfg->ssbSchCfg.ssbOffsetPointA);
memcpy(&cellCb->cellCfg, schCellCfg, sizeof(SchCellCfg));
+ /* Fill coreset frequencyDomainResource bitmap */
+ coreset0Idx = cellCb->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.coresetId;
+ numRbs = coresetIdxTable[coreset0Idx][1];
+ offset = coresetIdxTable[coreset0Idx][3];
+ fillCoresetFeqDomAllocMap(((cellCb->cellCfg.ssbSchCfg.ssbOffsetPointA - offset)/6), (numRbs/6), freqDomainResource);
+ covertFreqDomRsrcMapToIAPIFormat(freqDomainResource, \
+ cellCb->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc);
+
/* Fill K0 - K1 table for common cfg*/
BuildK0K1Table(cellCb, &cellCb->cellCfg.schInitialDlBwp.k0K1InfoTbl, true, cellCb->cellCfg.schInitialDlBwp.pdschCommon,
pdschCfg, DEFAULT_UL_ACK_LIST_COUNT, defaultUlAckTbl);
#define SCH_SIB1_TRANS 16 /* SIB1 transmission as per 38.331 is every 160 ms */
#define SCH_NUM_SC_PRB 12 /* number of SCs in a PRB */
#define SCH_MAX_SSB_BEAM 8 /* since we are supporting only SCS=15KHz and 30KHz */
-#define SCH_SYMBOL_PER_SLOT 14
#define SCH_SSB_NUM_SYMB 4
#define SCH_SSB_NUM_PRB 21 /* One extra PRB as buffer */
#define SCHED_DELTA 1
typedef struct schPrbAlloc
{
CmLListCp freePrbBlockList; /*!< List of continuous blocks for available PRB */
- uint64_t prbBitMap[SCH_SYMBOL_PER_SLOT][PRB_BITMAP_MAX_IDX]; /*!< BitMap to store the allocated PRBs */
+ uint64_t prbBitMap[ MAX_SYMB_PER_SLOT][PRB_BITMAP_MAX_IDX]; /*!< BitMap to store the allocated PRBs */
}SchPrbAlloc;
/**
SchDlSlotInfo *schDlSlotInfo;
SsbInfo ssbInfo;
+ if(cell == NULL)
+ {
+ DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : Cell is NULL");
+ return RFAILED;
+ }
+
+ if(dlBrdcstAlloc == NULL)
+ {
+ DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : dlBrdcstAlloc is NULL");
+ return RFAILED;
+ }
+
schDlSlotInfo = cell->schDlSlotInfo[slotTime.slot];
ssbStartPrb = cell->cellCfg.ssbSchCfg.ssbOffsetPointA; //+Kssb
- ssbStartSymb = cell->ssbStartSymbArr[dlBrdcstAlloc->ssbIdxSupported-1]; /*since we are
- supporting only 1 ssb beam */
+ ssbStartSymb = cell->ssbStartSymbArr[dlBrdcstAlloc->ssbIdxSupported-1]; /*since we are supporting only 1 ssb beam */
/* Assign interface structure */
for(idx=0; idx<dlBrdcstAlloc->ssbIdxSupported; idx++)
**/
uint8_t schBroadcastSib1Alloc(SchCellCb *cell, SlotTimingInfo slotTime, DlBrdcstAlloc *dlBrdcstAlloc)
{
- FreqDomainAlloc freqAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschFreqAlloc.freqAlloc;
- TimeDomainAlloc timeAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschTimeAlloc.timeAlloc;
- SchDlSlotInfo *schDlSlotInfo = cell->schDlSlotInfo[slotTime.slot];
+ uint8_t dmrsStartSymbol, startSymbol, numSymbol ;
+ DmrsInfo dmrs;
+ FreqDomainAlloc freqAlloc;
+ TimeDomainAlloc timeAlloc;
+ SchDlSlotInfo *schDlSlotInfo = NULLP;
+
+ if(cell == NULL)
+ {
+ DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : Cell is NULL");
+ return RFAILED;
+ }
- if((allocatePrbDl(cell, slotTime, timeAlloc.startSymb, timeAlloc.numSymb, &freqAlloc.startPrb, freqAlloc.numPrb)) != ROK)
+ if(dlBrdcstAlloc == NULL)
+ {
+ DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : dlBrdcstAlloc is NULL");
+ return RFAILED;
+ }
+
+ dmrs = cell->cellCfg.sib1SchCfg.sib1PdschCfg.dmrs;
+ freqAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschFreqAlloc.freqAlloc;
+ timeAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschTimeAlloc.timeAlloc;
+ schDlSlotInfo = cell->schDlSlotInfo[slotTime.slot];
+
+ /* Find total symbols used including DMRS */
+ /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT,
+ * in that case only PDSCH symbols are marked as occupied */
+ dmrsStartSymbol = findDmrsStartSymbol(dmrs.dlDmrsSymbPos);
+ if(dmrsStartSymbol == MAX_SYMB_PER_SLOT)
+ {
+ startSymbol = timeAlloc.startSymb;
+ numSymbol = timeAlloc.numSymb;
+ }
+ /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */
+ else
+ {
+ startSymbol = dmrsStartSymbol;
+ numSymbol = dmrs.nrOfDmrsSymbols + timeAlloc.numSymb;
+ }
+
+ /* Allocate PRB */
+ if((allocatePrbDl(cell, slotTime, startSymbol, numSymbol, &freqAlloc.startPrb, freqAlloc.numPrb)) != ROK)
{
DU_LOG("\nERROR --> SCH: PRB allocation failed for SIB1 in SFN:Slot [%d : %d]", slotTime.sfn, slotTime.slot);
return RFAILED;
uint8_t schDlRsrcAllocMsg4(SchCellCb *cell, SlotTimingInfo slotTime, DlMsgAlloc *msg4Alloc)
{
uint8_t coreset0Idx = 0;
- uint8_t numRbs = 0;
uint8_t firstSymbol = 0;
uint8_t numSymbols = 0;
- uint8_t offset = 0;
- uint8_t offsetPointA;
- uint8_t FreqDomainResource[6] = {0};
- uint16_t tbSize = 0;
uint8_t mcs = 4; /* MCS fixed to 4 */
- SchBwpDlCfg *initialBwp;
+ uint8_t dmrsStartSymbol = 0, startSymbol = 0, numSymbol = 0;
+ uint16_t tbSize = 0;
+ uint16_t numRbs;
+ SchBwpDlCfg *initialBwp = NULLP;
+ PdcchCfg *pdcch = NULLP;
+ PdschCfg *pdsch = NULLP;
+ BwpCfg *bwp = NULLP;
- PdcchCfg *pdcch = &msg4Alloc->dlMsgPdcchCfg;
- PdschCfg *pdsch = &msg4Alloc->dlMsgPdschCfg;
- BwpCfg *bwp = &msg4Alloc->bwp;
+ if(cell == NULL)
+ {
+ DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : Cell is NULL");
+ return RFAILED;
+ }
+ if(msg4Alloc == NULL)
+ {
+ DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : msg4Alloc is NULL");
+ return RFAILED;
+ }
+
+ pdcch = &msg4Alloc->dlMsgPdcchCfg;
+ pdsch = &msg4Alloc->dlMsgPdschCfg;
+ bwp = &msg4Alloc->bwp;
initialBwp = &cell->cellCfg.schInitialDlBwp;
- offsetPointA = cell->cellCfg.ssbSchCfg.ssbOffsetPointA;
coreset0Idx = initialBwp->pdcchCommon.commonSearchSpace.coresetId;
/* derive the sib1 coreset0 params from table 13-1 spec 38.213 */
- numRbs = coresetIdxTable[coreset0Idx][1];
- numSymbols = coresetIdxTable[coreset0Idx][2];
- offset = coresetIdxTable[coreset0Idx][3];
+ numRbs = coresetIdxTable[coreset0Idx][1];
+ numSymbols = coresetIdxTable[coreset0Idx][2];
/* calculate time domain parameters */
uint16_t mask = 0x2000;
- for(firstSymbol=0; firstSymbol<14;firstSymbol++)
+ for(firstSymbol=0; firstSymbol<MAX_SYMB_PER_SLOT; firstSymbol++)
{
if(initialBwp->pdcchCommon.commonSearchSpace.monitoringSymbol & mask)
break;
mask = mask>>1;
}
- /* calculate the PRBs */
- freqDomRscAllocType0(((offsetPointA-offset)/6), (numRbs/6), FreqDomainResource);
-
/* fill BWP */
bwp->freqAlloc.numPrb = initialBwp->bwp.freqAlloc.numPrb;
bwp->freqAlloc.startPrb = initialBwp->bwp.freqAlloc.startPrb;
/* fill the PDCCH PDU */
pdcch->coresetCfg.startSymbolIndex = firstSymbol;
pdcch->coresetCfg.durationSymbols = numSymbols;
- memcpy(pdcch->coresetCfg.freqDomainResource,FreqDomainResource,6);
+ memcpy(pdcch->coresetCfg.freqDomainResource, \
+ cell->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc, FREQ_DOM_RSRC_SIZE);
+
pdcch->coresetCfg.cceRegMappingType = 1; /* coreset0 is always interleaved */
pdcch->coresetCfg.regBundleSize = 6; /* spec-38.211 sec 7.3.2.2 */
pdcch->coresetCfg.interleaverSize = 2; /* spec-38.211 sec 7.3.2.2 */
pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize, mcs, NUM_PDSCH_SYMBOL);
pdsch->pdschFreqAlloc.vrbPrbMapping = 0; /* non-interleaved */
+ /* Find total symbols occupied including DMRS */
+ dmrsStartSymbol = findDmrsStartSymbol(pdsch->dmrs.dlDmrsSymbPos);
+ /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT,
+ * in that case only PDSCH symbols are marked as occupied */
+ if(dmrsStartSymbol == MAX_SYMB_PER_SLOT)
+ {
+ startSymbol = pdsch->pdschTimeAlloc.timeAlloc.startSymb;
+ numSymbol = pdsch->pdschTimeAlloc.timeAlloc.numSymb;
+ }
+ /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */
+ else
+ {
+ startSymbol = dmrsStartSymbol;
+ numSymbol = pdsch->dmrs.nrOfDmrsSymbols + pdsch->pdschTimeAlloc.timeAlloc.numSymb;
+ }
+
/* Allocate the number of PRBs required for RAR PDSCH */
- if((allocatePrbDl(cell, slotTime, pdsch->pdschTimeAlloc.timeAlloc.startSymb, pdsch->pdschTimeAlloc.timeAlloc.numSymb,\
+ if((allocatePrbDl(cell, slotTime, startSymbol, numSymbol,\
&pdsch->pdschFreqAlloc.freqAlloc.startPrb, pdsch->pdschFreqAlloc.freqAlloc.numPrb)) != ROK)
{
DU_LOG("\nERROR --> SCH : Resource allocation failed for MSG4");
SchUeCb ueCb;
SchControlRsrcSet coreset1;
SchPdschConfig pdschCfg;
+ uint8_t dmrsStartSymbol, startSymbol, numSymbol;
pdcch = &dlMsgAlloc->dlMsgPdcchCfg;
pdsch = &dlMsgAlloc->dlMsgPdschCfg;
pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize, ueCb.ueCfg.dlModInfo.mcsIndex, \
pdschCfg.timeDomRsrcAllociList[0].symbolLength);
+ /* Find total symbols occupied including DMRS */
+ dmrsStartSymbol = findDmrsStartSymbol(pdsch->dmrs.dlDmrsSymbPos);
+ /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT,
+ * in that case only PDSCH symbols are marked as occupied */
+ if(dmrsStartSymbol == MAX_SYMB_PER_SLOT)
+ {
+ startSymbol = pdsch->pdschTimeAlloc.timeAlloc.startSymb;
+ numSymbol = pdsch->pdschTimeAlloc.timeAlloc.numSymb;
+ }
+ /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */
+ else
+ {
+ startSymbol = dmrsStartSymbol;
+ numSymbol = pdsch->dmrs.nrOfDmrsSymbols + pdsch->pdschTimeAlloc.timeAlloc.numSymb;
+ }
+
/* Allocate the number of PRBs required for DL PDSCH */
- if((allocatePrbDl(cell, slotTime, pdsch->pdschTimeAlloc.timeAlloc.startSymb, pdsch->pdschTimeAlloc.timeAlloc.numSymb,\
+ if((allocatePrbDl(cell, slotTime, startSymbol, numSymbol,\
&pdsch->pdschFreqAlloc.freqAlloc.startPrb, pdsch->pdschFreqAlloc.freqAlloc.numPrb)) != ROK)
{
DU_LOG("\nERROR --> SCH : allocatePrbDl() failed for DL MSG");
}
if(slotCfg == FLEXI_SLOT)
{
- for(checkSymbol = 0; checkSymbol<SCH_SYMBOL_PER_SLOT;checkSymbol++)
+ for(checkSymbol = 0; checkSymbol< MAX_SYMB_PER_SLOT;checkSymbol++)
{
if(cell->cellCfg.tddCfg.slotCfg[tmpSlot][checkSymbol] == UL_SLOT)
{
**/
uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueIdx, RarAlloc *rarAlloc, uint8_t k0Index)
{
- uint8_t coreset0Idx = 0;
- uint8_t numRbs = 0;
- uint8_t firstSymbol = 0;
- uint8_t numSymbols = 0;
- uint8_t offset = 0;
- uint8_t FreqDomainResource[6] = {0};
+ uint8_t coreset0Idx = 0;
+ uint8_t firstSymbol = 0, numSymbols = 0;
+ uint8_t mcs = 4; /* MCS fixed to 4 */
+ uint8_t dmrsStartSymbol, startSymbol, numSymbol ;
+ uint16_t numRbs = 0;
uint16_t tbSize = 0;
- uint8_t mcs = 4; /* MCS fixed to 4 */
SchBwpDlCfg *initialBwp = &cell->cellCfg.schInitialDlBwp;
PdcchCfg *pdcch = &rarAlloc->rarPdcchCfg;
PdschCfg *pdsch = &rarAlloc->rarPdschCfg;
BwpCfg *bwp = &rarAlloc->bwp;
- coreset0Idx = initialBwp->pdcchCommon.commonSearchSpace.coresetId;
-
/* derive the sib1 coreset0 params from table 13-1 spec 38.213 */
- numRbs = coresetIdxTable[coreset0Idx][1];
- numSymbols = coresetIdxTable[coreset0Idx][2];
- offset = coresetIdxTable[coreset0Idx][3];
+ coreset0Idx = initialBwp->pdcchCommon.commonSearchSpace.coresetId;
+ numRbs = coresetIdxTable[coreset0Idx][1];
+ numSymbols = coresetIdxTable[coreset0Idx][2];
/* calculate time domain parameters */
// note: since slot value is made sl1, RAR can be sent at all slots
uint16_t mask = 0x2000;
- for(firstSymbol=0; firstSymbol<14;firstSymbol++)
+ for(firstSymbol=0; firstSymbol<MAX_SYMB_PER_SLOT; firstSymbol++)
{
if(initialBwp->pdcchCommon.commonSearchSpace.monitoringSymbol & mask)
break;
mask = mask>>1;
}
- /* calculate the PRBs */
- freqDomRscAllocType0(((cell->cellCfg.ssbSchCfg.ssbOffsetPointA - offset)/6), (numRbs/6), FreqDomainResource);
-
/* fill BWP */
bwp->freqAlloc.numPrb = initialBwp->bwp.freqAlloc.numPrb;
bwp->freqAlloc.startPrb = initialBwp->bwp.freqAlloc.startPrb;
/* fill the PDCCH PDU */
pdcch->coresetCfg.startSymbolIndex = firstSymbol;
pdcch->coresetCfg.durationSymbols = numSymbols;
- memcpy(pdcch->coresetCfg.freqDomainResource, FreqDomainResource, FREQ_DOM_RSRC_SIZE);
+ memcpy(pdcch->coresetCfg.freqDomainResource, \
+ cell->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc, FREQ_DOM_RSRC_SIZE);
+
pdcch->coresetCfg.cceRegMappingType = 1; /* coreset0 is always interleaved */
pdcch->coresetCfg.regBundleSize = 6; /* spec-38.211 sec 7.3.2.2 */
pdcch->coresetCfg.interleaverSize = 2; /* spec-38.211 sec 7.3.2.2 */
pdcch->coresetCfg.coreSetType = 0;
+ pdcch->coresetCfg.coreSetSize = numRbs;
pdcch->coresetCfg.shiftIndex = cell->cellCfg.phyCellId;
pdcch->coresetCfg.precoderGranularity = 0; /* sameAsRegBundle */
pdcch->numDlDci = 1;
pdsch->pdschFreqAlloc.freqAlloc.numPrb = \
schCalcNumPrb(tbSize, mcs, initialBwp->pdschCommon.timeDomRsrcAllocList[k0Index].lengthSymbol);
+ /* Find total symbols occupied including DMRS */
+ dmrsStartSymbol = findDmrsStartSymbol(pdsch->dmrs.dlDmrsSymbPos);
+ /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT,
+ * in that case only PDSCH symbols are marked as occupied */
+ if(dmrsStartSymbol == MAX_SYMB_PER_SLOT)
+ {
+ startSymbol = pdsch->pdschTimeAlloc.timeAlloc.startSymb;
+ numSymbol = pdsch->pdschTimeAlloc.timeAlloc.numSymb;
+ }
+ /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */
+ else
+ {
+ startSymbol = dmrsStartSymbol;
+ numSymbol = pdsch->dmrs.nrOfDmrsSymbols + pdsch->pdschTimeAlloc.timeAlloc.numSymb;
+ }
+
/* Allocate the number of PRBs required for RAR PDSCH */
- if((allocatePrbDl(cell, rarTime, pdsch->pdschTimeAlloc.timeAlloc.startSymb, pdsch->pdschTimeAlloc.timeAlloc.numSymb,\
+ if((allocatePrbDl(cell, rarTime, startSymbol, numSymbol,\
&pdsch->pdschFreqAlloc.freqAlloc.startPrb, pdsch->pdschFreqAlloc.freqAlloc.numPrb)) != ROK)
{
DU_LOG("\nERROR --> SCH : allocatePrbDl() failed for RAR");
uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg)
{
uint8_t lcIdx, ueLcIdx;
+ uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
SchPdschCfgCmn pdschCfg;
SchPucchDlDataToUlAck *dlDataToUlAck;
if(ueCfg->spCellCfgPres == true)
{
memcpy(&ueCb->ueCfg.spCellCfg , &ueCfg->spCellCfg, sizeof(SchSpCellCfg));
+
+ covertFreqDomRsrcMapToIAPIFormat(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc,\
+ freqDomainResource);
+ memset(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE);
+ memcpy(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE);
+
ueCb->ueCfg.spCellCfgPres = true;
dlDataToUlAck = ueCfg->spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck;
if(ueCb->cellCb)
uint8_t defaultUlAckTbl[DEFAULT_UL_ACK_LIST_COUNT]= {1, 2, 3 , 4, 5, 6, 7, 8};
+/**
+ * @brief Function to find first DMRS symbol in PDSCH
+ *
+ * @details
+ *
+ * Function: findDmrsStartSymbol
+ *
+ * This function finds first DMRS symbol using DMRS symbol
+ * position bitmap.
+ *
+ * @param[in] DMRS symbol position bitmap
+ * @return Success : First DRMS symbol
+ * Failure : MAX_SYMB_PER_SLOT
+ **/
+uint8_t findDmrsStartSymbol(uint16_t dlDmrsSymbBitMap)
+{
+ uint8_t position = 0;
+ uint16_t mask = 1;
+
+ while(position < MAX_SYMB_PER_SLOT)
+ {
+ if(dlDmrsSymbBitMap & mask)
+ break;
+ mask = mask << 1;
+ position++;
+ }
+ return position;
+}
/**
* @brief Function to add a node to a linked list
}
return slotPatternLength;
}
-
#endif
+
+/*
+ * As per FAPI spec,
+ * Frequency domain resources is a bitmap defining non-overlapping groups of 6 PRBs in ascending order.
+ * [TS38.213 10.1]. Bitmap of uint8 array. 45 bits.
+ *
+ * As per IAPI,
+ * CORESET-freqdom.frequencyDomainResources : The bits of the bitmap have a one-to-one mapping with
+ * non-overlapping groups of 6 RBs. The most significant bit of the first word corresponds to
+ * the most significant bit defined in 38.331.
+ *
+ * FAPI and IAPI both are 45 bits. Mapped from bit 0 LS Byte for the FAPI and
+ * bit 0 LS U32 entry for IAPI.
+ * FAPI is to be filled in following format such that Intel L1 is able to decode it :
+ *
+ * FAPI IAPI
+ * FreqDomainResource[0] bits 7-0 -> nFreqDomain[0] bits 7-0
+ * FreqDomainResource[1] bits 7-0 -> nFreqDomain[0] bits 15-8
+ * FreqDomainResource[2] bits 7-0 -> nFreqDomain[0] bits 23-16
+ * FreqDomainResource[3] bits 7-0 -> nFreqDomain[0] bits 31-24
+ * FreqDomainResource[4] bits 7-0 -> nFreqDomain[1] bits 7-0
+ * FreqDomainResource[5] bits 7-0 -> nFreqDomain[1] bits 15-8
+ *
+ * where for the last entry bits 7,6 and 5 are don't care in the FAPI and bits
+ * 31-13 are don't care in the IAPI.
+ */
+void covertFreqDomRsrcMapToIAPIFormat(uint8_t *sourceBitMap, uint8_t *destBitMap)
+{
+ int8_t idx;
+ uint8_t numBitsToShift = 0;
+ uint64_t freqDomainResources = 0;
+
+ /* Bit operation to create a 64-bit integer that has
+ * 48 LSBs [Bit 47 to Bit 0] mapped to sourceBitMap[0] to sourceBitMap[5]
+ */
+ for(idx = FREQ_DOM_RSRC_SIZE-1; idx >=0; idx--)
+ {
+ freqDomainResources |= ((uint64_t)sourceBitMap[idx] << numBitsToShift);
+ numBitsToShift += 8;
+ }
+
+ /* Right shift 3 bits because bits[2-0] are unused in sourceBitMap[5] */
+ freqDomainResources = freqDomainResources >> 3;
+
+ /* Filling destBitMap such that LSB bit 0 of freqDomainResources maps to LSB
+ * of first word of destBitMap */
+ numBitsToShift = 0;
+ for(idx=0; idx<FREQ_DOM_RSRC_SIZE; idx++)
+ {
+ destBitMap[idx] = freqDomainResources >> numBitsToShift;
+ numBitsToShift += 8;
+ }
+}
+
/**********************************************************************
End of file
**********************************************************************/
#endif
/* Functions declarations : Resource allocation handler */
-void freqDomRscAllocType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain);
uint16_t schCalcTbSize(uint32_t payLoadSize);
uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols);
uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols);
CmLList* isPrbAvailable(CmLListCp *freePrbBlockList, uint16_t startPrb, uint16_t numPrb);
void removeAllocatedPrbFromFreePrbList(CmLListCp *freePrbBlockList, CmLList *node, \
uint16_t startPrb, uint16_t numPrb);
+uint8_t findDmrsStartSymbol(uint16_t dlDmrsSymbBitMap);
+void covertFreqDomRsrcMapToIAPIFormat(uint8_t *sourceBitMap, uint8_t *destBitMap);
/**********************************************************************
End of file
*
* @details
*
- * Function: freqDomRscAllocType0
+ * Function: fillCoresetFeqDomAllocMap
*
* This function does allocation in frequency domain resource.
* This is a bitmap defining non-overlapping groups of 6 PRBs in ascending order.
* @param[in] freqDomain - 6 bytes of info, each bit represents a group of 6 PRB.
* @return void
**/
-void freqDomRscAllocType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain)
+void fillCoresetFeqDomAllocMap(uint16_t startPrbGrp, uint16_t numPrbGrp, uint8_t *freqDomain)
{
- uint8_t remBits = prbSize; /* each bit represents 6 PRBs */
- uint8_t firstByte = 1;
- uint8_t numBits,startBit,byteCount = 5;
+ uint8_t idx;
+ uint8_t prbGrpStartBit = 0;
+ uint8_t numBitsToRightShift = 0;
+ uint64_t mask = 0;
+ uint64_t freqAllocBitMap = 0;
- while(remBits)
+ /*
+ * Frequency allocation bit string is 45 bits long. Hence using 6 bytes (i.e. 48 bits) to represent it.
+ * Each bit corresponds to a group of 6 RBs.
+ *
+ * For example if a coreset includes PRB 24 to 47, then on dividing the PRBs into group of 6,
+ * startPrbGrp = 24/6 = 4
+ * numPrbGrp = 24/6 = 4
+ *
+ * Frequency allocation bit string is 48 bits long i.e. Bit 47...0
+ * Here, Bit 47 represents RB group 0, Bit 46 represent RB group 45 and so on.
+ * Since startPrbGrp = 4 and numPrbGrp = 4, it means RB group 4,5,6 and 7 are used in coreset.
+ * i.e. Bits 43, 42, 42 and 40 are masked to 1 and rest all bits are 0 in bitstring
+ */
+ prbGrpStartBit = 47;
+ while(numPrbGrp)
{
- /* when the startPrb is not in this byteCount */
- if(startPrb/8)
- {
- startPrb -= 8;
- byteCount--;
- continue;
- }
-
- /* max bytecount is 6 nearly equal to 45 bits*/
- if(byteCount >= 6)
- break;
-
- /* when we are filling the second byte, then the start should be equal to 0 */
- if(firstByte)
- startBit = startPrb;
- else
- startBit = 0;
-
- /* calculate the number of bits to be set in this byte */
- if((remBits+startPrb) <= 8)
- numBits = remBits;
- else
- numBits = 8 - startBit;
-
- /* bit operation to set the bits */
- SET_BITS_MSB((startBit % 8),numBits,freqDomain[byteCount])
- firstByte = 0;
+ mask = 1;
+ printf("startPrbGrp [%d] numPrbGrp [%d] diff [%d]\n",startPrbGrp, numPrbGrp, (prbGrpStartBit - startPrbGrp));
+ mask = mask << (prbGrpStartBit - startPrbGrp);
+ freqAllocBitMap = freqAllocBitMap | mask;
+ startPrbGrp++;
+ numPrbGrp--;
+ }
- /* the ramaining bits should be subtracted with the numBits set in this byte */
- remBits -= numBits;
- byteCount--;
+ /* Copying 48 LSBs from 64-bit integer to the 45 MSBS in 6-byte array
+ * The first (left-most / most significant) bit corresponds to the first RB
+ * group in the BWP, and so on
+ */
+ /* On right shifting freqAllocBitMap by 40 bits, the bits 47 to 40 of freqAllocBitMap
+ * will now become 8-LSB. Copying these 8-bits into freqDomain[].
+ * Now shifting freqAllocBitMap by 32 bits, the bit 39 to 32 of freqAllocBitMap will
+ * now become 8-LSB. Copying these 8-bits into next index of freqDomain.
+ * and so on.
+ */
+ numBitsToRightShift = 40;
+ mask = 0x0000FF0000000000;
+ for(idx=0; idx<FREQ_DOM_RSRC_SIZE; idx++)
+ {
+ freqDomain[idx] = (freqAllocBitMap & mask) >> numBitsToRightShift;
+ numBitsToRightShift -= 8;
+ mask = mask >> 8;
}
}
#define ODU_SET_THREAD_AFFINITY SSetAffinity
#define ODU_CREATE_TASK SCreateSTsk
+#define MAX_SYMB_PER_SLOT 14
+
/* Slice */
#define SD_SIZE 3
/* Maximum slots for max periodicity and highest numerology is 320.
* However, aligning to fapi_interface.h, setting this macro to 160 */
#define MAX_TDD_PERIODICITY_SLOTS 160
-#define MAX_SYMB_PER_SLOT 14
#endif
#define GET_UE_IDX( _crnti,_ueIdx) \
uint64_t gSlotCount;
uint64_t gDlDataRcvdCnt; /* Number of DL data received at EGTP */
-void freqDomRscAllocType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain);
+void fillCoresetFeqDomAllocMap(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain);
void oduCpyFixBufToMsg(uint8_t *fixBuf, Buffer *mBuf, uint16_t len);
uint8_t buildPlmnId(Plmn plmn, uint8_t *buf);
typedef struct schSearchSpaceCfg
{
- uint8_t searchSpaceId;
- uint8_t coresetId;
+ uint8_t searchSpaceId;
+ uint8_t coresetId;
+ uint8_t freqDomainRsrc[FREQ_DOM_RSRC_SIZE]; /* Frequency domain resource */
uint16_t monitoringSlot;
uint16_t duration;
uint16_t monitoringSymbol;
{
*val |= bitString->buf[idx];
*val <<= 8;
- }
+ }
*val |= bitString->buf[idx];
*val >>= bitString->bits_unused;
coreset1StartPrb = coreset0EndPrb + 6;
coreset1NumPrb = CORESET1_NUM_PRB;
/* calculate the PRBs */
- freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
+ fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
coreset1StartPrb = coreset0EndPrb + 6;
coreset1NumPrb = CORESET1_NUM_PRB;
/* calculate the PRBs */
- freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
+ fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
if(cRsetToAddModList->list.count)
{
macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
- for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
- {
- macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
- cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
- bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
- macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
+ for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
+ {
+ macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
+ cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
+ //freqDomRsrcBitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
+ macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
+ memcpy(macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc, \
+ cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.buf,
+ cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.size);
+
macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
- cRsetToAddModList->list.array[cRsetIdx]->duration;
+ cRsetToAddModList->list.array[cRsetIdx]->duration;
- macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
- cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;
+ macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
+ cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;
if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
- {
- //TODO: handle the case for Interleaved
+ {
+ //TODO: handle the case for Interleaved
}
macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
- cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
- if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
- {
- macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
- *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
- }
+ cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
+ if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
+ {
+ macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
+ *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
+ }
}
}
-
}
/* Control Resource Set To Release List */
if(cuPdcchCfg->controlResourceSetToReleaseList)
if(cRsetToRelList->list.count)
{
macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
- for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
- {
+ for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
+ {
macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
- }
+ }
}
}
if(srchSpcToAddModList->list.count)
{
macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
- for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
- {
+ for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
+ {
macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
- srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
+ srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
- *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
- if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
- {
+ *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
+ if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
+ {
macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
- srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
+ srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
}
if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
{
- bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
+ bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
}
- if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
+ if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
{
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
- srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
- srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
- srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
-
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
- srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
-
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
- srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
- }
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
+ srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
+ srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
+ srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
+
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
+ srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
+
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
+ srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
+ }
if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
- {
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
- srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
- if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
- {
- macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
- srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
- }
-
- }
- }
+ {
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
+ srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
+ if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
+ {
+ macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
+ srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
+ }
+
+ }
+ }
}
}
/* Search space To Rel List */
if(srchSpcToRelList->list.count)
{
macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
- for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
- {
+ for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
+ {
macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
- *(srchSpcToRelList->list.array[srchSpcIdx]);
- }
+ *(srchSpcToRelList->list.array[srchSpcIdx]);
+ }
}
}
}
if(dlBwp->pdcch_Config->choice.setup)
{
macSrvCellCfg->initDlBwp.pdcchPresent = true;
- extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
+ if(storedSrvCellCfg)
+ {
+ if(!storedSrvCellCfg->initDlBwp.pdcchPresent)
+ {
+ extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
+ }
+ else
+ {
+ extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
+ }
+ }
+ else
+ {
+ extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
+ }
}
}
if(dlBwp->pdsch_Config)
coreset1StartPrb = coreset0EndPrb +6;
coreset1NumPrb = CORESET1_NUM_PRB;
/* calculate the PRBs */
- freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
+ fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
memcpy(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, freqDomainResource,
FREQ_DOM_RSRC_SIZE);