[Epic-ID: ODUHIGH-406][Task-ID: ODUHIGH-447] PCCH Scheduling at SCH
[o-du/l2.git] / src / 5gnrsch / sch_common.c
index 9e0a4d9..23b648b 100644 (file)
@@ -408,13 +408,14 @@ uint8_t fillUlSchedPucchDedicatedCfg(SchCellCb *cell, SchPucchCfg *pucchDedCfg,\
 
 uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst, SlotTimingInfo slotInfo)
 {
-   uint8_t ret = ROK, ueIdx = 0, pucchIdx = 0;
+   uint8_t ret = ROK, ueId = 0, ueIdx = 0, pucchIdx = 0;
    SchCellCb  *cell = schCb[inst].cells[inst];
    SchPucchCfgCmn *pucchCfg = NULLP;
    SchBwpParams *ulBwp = NULLP;
    uint16_t startPrb;
 
-   GET_UE_IDX(schPucchInfo->rnti, ueIdx);
+   GET_UE_ID(schPucchInfo->rnti, ueId);
+   ueIdx = ueId -1;
    if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres)
    {
       /* fill pucch dedicated cfg */
@@ -750,7 +751,7 @@ uint16_t schAllocPucchResource(SchCellCb *cell, SlotTimingInfo pucchTime, uint16
 uint8_t schDlRsrcAllocDlMsg(SchCellCb *cell, SlotTimingInfo slotTime, uint16_t crnti,
                 uint32_t tbSize, DlMsgAlloc *dlMsgAlloc, uint16_t startPRB, uint8_t pdschStartSymbol, uint8_t pdschNumSymbols)
 {
-   uint8_t ueIdx;
+   uint8_t ueId=0;
    PdcchCfg *pdcch = NULLP;
    PdschCfg *pdsch = NULLP;
    BwpCfg *bwp = NULLP;
@@ -763,8 +764,8 @@ uint8_t schDlRsrcAllocDlMsg(SchCellCb *cell, SlotTimingInfo slotTime, uint16_t c
    pdsch = &dlMsgAlloc->dlMsgSchedInfo[dlMsgAlloc->numSchedInfo].dlMsgPdschCfg;
    bwp = &dlMsgAlloc->dlMsgSchedInfo[dlMsgAlloc->numSchedInfo].bwp;
 
-   GET_UE_IDX(crnti, ueIdx);
-   ueCb  = cell->ueCb[ueIdx-1];
+   GET_UE_ID(crnti, ueId);
+   ueCb  = cell->ueCb[ueId-1];
    coreset1 = ueCb.ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0];
    pdschCfg = ueCb.ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg;
 
@@ -2097,7 +2098,138 @@ void updateBsrAndLcList(CmLListCp *lcLL, BsrInfo *bsrInfo, uint8_t status)
       }
       node = next;
    }
-}     
+}
+
+/********************************************************************************
+ *
+ * @brief Increment the Slot by a input factor
+ *
+ * @details
+ *
+ *    Function : schIncrSlot
+ *
+ *    Functionality:
+ *       Increment the slot by a input factor till num of Slots configured in a
+ *       Radio Frame. If it exceeds, move to next sfn.
+ *
+ * @params[in/out] SlotTimingInfo timingInfo
+ *        [in]     uint8_t incr [Increment factor]
+ *        [in]     numSlotsPerRF [Number of Slots configured per RF as per
+ *                                numerology]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ *******************************************************************/
+void schIncrSlot(SlotTimingInfo *timingInfo, uint8_t incr, uint16_t numSlotsPerRF)
+{
+   timingInfo->slot += incr;
+   if(timingInfo->slot >= numSlotsPerRF)
+   {
+      timingInfo->sfn += timingInfo->slot/numSlotsPerRF;
+      timingInfo->slot %= numSlotsPerRF;
+      if(timingInfo->sfn >  MAX_SFN)
+      {
+         timingInfo->sfn %= MAX_SFN;
+      }
+   }
+}
+
+/*******************************************************************
+*
+* @brief   Fill PDSCH info in Page Alloc
+*
+* @details
+*
+*    Function : schFillPagePdschCfg 
+*
+*    Functionality: Fill PDSCH info in Page Alloc
+*
+* @params[in] SchCellCb *cell, PdschCfg *pagePdschCfg, SlotTimingInfo slotTime, 
+*             uint16_t tbsSize, uint8_t mcs, uint16_t startPrb
+*
+* @return pointer to return Value(ROK, RFAILED) 
+*
+* ****************************************************************/
+uint8_t schFillPagePdschCfg(SchCellCb *cell, PdschCfg *pagePdschCfg, SlotTimingInfo slotTime, uint16_t tbSize, uint8_t mcs, uint16_t startPrb)
+{
+   uint8_t cwCount = 0;
+   uint8_t dmrsStartSymbol, startSymbol, numSymbol;
+
+   /* fill the PDSCH PDU */
+
+   pagePdschCfg->pduBitmap = 0; /* PTRS and CBG params are excluded */
+   pagePdschCfg->rnti = P_RNTI; /* SI-RNTI */
+   pagePdschCfg->pduIndex = 0;
+   pagePdschCfg->numCodewords = 1;
+   for(cwCount = 0; cwCount < pagePdschCfg->numCodewords; cwCount++)
+   {
+      pagePdschCfg->codeword[cwCount].targetCodeRate = 308;
+      pagePdschCfg->codeword[cwCount].qamModOrder = 2;
+      pagePdschCfg->codeword[cwCount].mcsIndex = mcs;
+      pagePdschCfg->codeword[cwCount].mcsTable = 0; /* notqam256 */
+      pagePdschCfg->codeword[cwCount].rvIndex = 0;
+      tbSize = tbSize + TX_PAYLOAD_HDR_LEN;
+      pagePdschCfg->codeword[cwCount].tbSize = tbSize;
+   }
+   pagePdschCfg->dataScramblingId                   = cell->cellCfg.phyCellId;
+   pagePdschCfg->numLayers                          = 1;
+   pagePdschCfg->transmissionScheme                 = 0;
+   pagePdschCfg->refPoint                           = 0;
+   pagePdschCfg->dmrs.dlDmrsSymbPos                 = 4; /* Bitmap value 00000000000100 i.e. using 3rd symbol for PDSCH DMRS */
+   pagePdschCfg->dmrs.dmrsConfigType                = 0; /* type-1 */
+   pagePdschCfg->dmrs.dlDmrsScramblingId            = cell->cellCfg.phyCellId;
+   pagePdschCfg->dmrs.scid                          = 0;
+   pagePdschCfg->dmrs.numDmrsCdmGrpsNoData          = 1;
+   pagePdschCfg->dmrs.dmrsPorts                     = 0x0001;
+   pagePdschCfg->dmrs.mappingType                   = DMRS_MAP_TYPE_A; /* Type-A */
+   pagePdschCfg->dmrs.nrOfDmrsSymbols               = NUM_DMRS_SYMBOLS;
+   pagePdschCfg->dmrs.dmrsAddPos                    = DMRS_ADDITIONAL_POS;
+
+   pagePdschCfg->pdschFreqAlloc.resourceAllocType   = 1; /* RAT type-1 RIV format */
+   /* the RB numbering starts from coreset0, and PDSCH is always above SSB */
+   pagePdschCfg->pdschFreqAlloc.freqAlloc.startPrb  = startPrb;
+   pagePdschCfg->pdschFreqAlloc.freqAlloc.numPrb    = schCalcNumPrb(tbSize, mcs, NUM_PDSCH_SYMBOL);
+   pagePdschCfg->pdschFreqAlloc.vrbPrbMapping       = 0; /* non-interleaved */
+   pagePdschCfg->pdschTimeAlloc.rowIndex            = 1;
+   /* This is Intel's requirement. PDSCH should start after PDSCH DRMS symbol */
+   pagePdschCfg->pdschTimeAlloc.timeAlloc.startSymb = 3; /* spec-38.214, Table 5.1.2.1-1 */
+   pagePdschCfg->pdschTimeAlloc.timeAlloc.numSymb   = NUM_PDSCH_SYMBOL;
+
+   /* Find total symbols occupied including DMRS */
+   dmrsStartSymbol = findDmrsStartSymbol(pagePdschCfg->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 = pagePdschCfg->pdschTimeAlloc.timeAlloc.startSymb;
+      numSymbol = pagePdschCfg->pdschTimeAlloc.timeAlloc.numSymb;
+   }
+   /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */
+   else
+   {
+      startSymbol = dmrsStartSymbol;
+      numSymbol = pagePdschCfg->dmrs.nrOfDmrsSymbols + pagePdschCfg->pdschTimeAlloc.timeAlloc.numSymb;
+   }
+
+   /* Allocate the number of PRBs required for DL PDSCH */
+   if((allocatePrbDl(cell, slotTime, startSymbol, numSymbol,\
+               &pagePdschCfg->pdschFreqAlloc.freqAlloc.startPrb, pagePdschCfg->pdschFreqAlloc.freqAlloc.numPrb)) != ROK)
+   {
+      DU_LOG("\nERROR  --> SCH : allocatePrbDl() failed for DL MSG");
+      return RFAILED;
+   }
+
+   pagePdschCfg->beamPdschInfo.numPrgs              = 1;
+   pagePdschCfg->beamPdschInfo.prgSize              = 1;
+   pagePdschCfg->beamPdschInfo.digBfInterfaces      = 0;
+   pagePdschCfg->beamPdschInfo.prg[0].pmIdx         = 0;
+   pagePdschCfg->beamPdschInfo.prg[0].beamIdx[0]    = 0;
+   pagePdschCfg->txPdschPower.powerControlOffset    = 0;
+   pagePdschCfg->txPdschPower.powerControlOffsetSS  = 0;
+
+   return ROK;
+}
+
 /**********************************************************************
   End of file
  **********************************************************************/