#include "du_app_mac_inf.h"
#include "mac_sch_interface.h"
#include "sch.h"
+#include "sch_utils.h"
extern SchCb schCb[SCH_MAX_INST];
+extern uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8];
+extern uint16_t numRbForPrachTable[MAX_RACH_NUM_RB_IDX][5];
+
+SchMacUlSchInfoFunc schMacUlSchInfoOpts[] =
+{
+ packSchMacUlSchInfo,
+ MacProcUlSchInfo,
+ packSchMacUlSchInfo
+};
/**
* @brief Time domain allocation for SSB
*
* This function handles common scheduling for DL
*
- * @param[in] schCellCb *cell, cell cb
- * @param[in] DlBrdcstAlloc *dlBrdcstAlloc, DL brdcst allocation
+ * @param[in] uint8_t scs, uint8_t *ssbStartSym
* @return void
**/
void ssbDlTdAlloc(uint8_t scs, uint8_t *ssbStartSymb)
DU_LOG("\nSCS %d is currently not supported", scs);
}
}
+
/**
* @brief common resource allocation for SSB
*
* @details
*
- * Function : schCmnDlAlloc
+ * Function : schBroadcastAlloc
*
* This function handles common scheduling for DL
*
* @param[in] DlBrdcstAlloc *dlBrdcstAlloc, DL brdcst allocation
* @return void
**/
-int schCmnDlAlloc(SchCellCb *cell, DlBrdcstAlloc *dlBrdcstAlloc)
+uint8_t schBroadcastAlloc(SchCellCb *cell, DlBrdcstAlloc *dlBrdcstAlloc,
+ uint16_t slot)
{
/* schedule SSB */
uint8_t scs, ssbStartPrb, ssbStartSymb, idx;
SchDlAlloc *dlAlloc;
SsbInfo ssbInfo;
- dlAlloc = cell->dlAlloc[cell->slotInfo.slot];
+ dlAlloc = cell->dlAlloc[slot];
if(dlBrdcstAlloc->ssbTrans)
{
- scs = cell->cellCfg.scsCommon;
- ssbStartPrb = \
- ((cell->cellCfg.ssbSubcOffset)-(cell->cellCfg.ssbOffsetPointA))/SCH_NUM_SC_PRB;
+ scs = cell->cellCfg.ssbSchCfg.scsCommon;
+ ssbStartPrb = cell->cellCfg.ssbSchCfg.ssbOffsetPointA;
memset(ssbStartSymbArr, 0, SCH_MAX_SSB_BEAM);
ssbDlTdAlloc(scs, ssbStartSymbArr);
dlAlloc->ssbIdxSupported = dlBrdcstAlloc->ssbIdxSupported;
for(idx=ssbStartSymb; idx<ssbStartSymb+SCH_SSB_SYMB_DURATION; idx++)
{
- dlAlloc->assignedPrb[idx] = SCH_SSB_PRB_DURATION;
+ dlAlloc->assignedPrb[idx] = ssbStartPrb + SCH_SSB_PRB_DURATION + 1; /* +1 for kSsb */
}
}
+
+ /* SIB1 allocation */
+ if(dlBrdcstAlloc->sib1Trans)
+ {
+ dlAlloc->sib1Pres = true;
+ for(idx=0; idx<SCH_SYMBOL_PER_SLOT; idx++)
+ {
+ dlAlloc->assignedPrb[idx] = ssbStartPrb + SCH_SSB_PRB_DURATION + 1 + 10; /* 10 PRBs for sib1 */
+ }
+ memcpy(&dlBrdcstAlloc->sib1Alloc.sib1PdcchCfg, &cell->cellCfg.sib1SchCfg.sib1PdcchCfg, sizeof(PdcchCfg));
+ memcpy(&dlBrdcstAlloc->sib1Alloc.sib1PdschCfg, &cell->cellCfg.sib1SchCfg.sib1PdschCfg, sizeof(PdschCfg));
+ }
return ROK;
}
+/*******************************************************************
+ *
+ * @brief Handles sending UL scheduler info to MAC
+ *
+ * @details
+ *
+ * Function : sendUlSchInfoToMac
+ *
+ * Functionality:
+ * Sends UL Sch info to MAC from SCH
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+int sendUlSchInfoToMac(UlSchInfo *ulSchInfo, Inst inst)
+{
+ Pst pst;
+
+ memset(&pst, 0, sizeof(Pst));
+ SCH_FILL_RSP_PST(pst, inst);
+ pst.event = EVENT_UL_SCH_INFO;
+ return(*schMacUlSchInfoOpts[pst.selector])(&pst, ulSchInfo);
+
+}
+/**
+ * @brief resource allocation for PRACH
+ *
+ * @details
+ *
+ * Function : schPrachResAlloc
+ *
+ * This function handles PRACH allocation
+ *
+ * @param[in] SchCellCb *cell, cell cb
+ * @param[in] UlSchInfo *ulSchInfo, UL scheduling info
+ * @return void
+ **/
+int schPrachResAlloc(SchCellCb *cell, UlSchInfo *ulSchInfo)
+{
+ uint8_t numPrachRb = 0;
+ uint8_t numRa = 0;
+ uint8_t freqStart = 0;
+ uint16_t sfn = 0;
+ uint16_t slot = 0;
+ uint8_t prachCfgIdx = 0;
+ uint8_t prachFormat = 0;
+ uint8_t x = 0;
+ uint8_t y = 0;
+ uint16_t prachSubframe = 0;
+ uint8_t prachStartSymbol = 0;
+ uint8_t prachOcas = 0;
+ uint8_t dataType = 0;
+ uint8_t idx = 0;
+ SchUlAlloc *ulAlloc = NULLP;
+
+ sfn = cell->slotInfo.sfn;
+ slot = cell->slotInfo.slot;
+ ulAlloc = cell->ulAlloc[cell->slotInfo.slot];
+ prachCfgIdx = cell->cellCfg.schRachCfg.prachCfgIdx;
+
+ /* derive the prachCfgIdx table paramters */
+ x = prachCfgIdxTable[prachCfgIdx][1];
+ y = prachCfgIdxTable[prachCfgIdx][2];
+ prachSubframe = prachCfgIdxTable[prachCfgIdx][3];
+
+ if((sfn%x) != y)
+ {
+ /* prach occasion does not lie in this SFN */
+ DU_LOG("\nPRACH ocassion doesn't lie in this SFN");
+ return RFAILED;
+ }
+ /* check for subFrame number */
+ if ((1 << slot) & prachSubframe)
+ {
+ /* prach ocassion present in this subframe */
+
+ prachFormat = prachCfgIdxTable[prachCfgIdx][0];
+ prachStartSymbol = prachCfgIdxTable[prachCfgIdx][4];
+ prachOcas = prachCfgIdxTable[prachCfgIdx][6];
+
+ /* freq domain resource determination for RACH*/
+ freqStart = cell->cellCfg.schRachCfg.msg1FreqStart;
+ /* numRa determined as 𝑛 belonging {0,1,.., M − 1},
+ * where M is given by msg1Fdm */
+ numRa = (cell->cellCfg.schRachCfg.msg1Fdm - 1);
+ for(idx=0; idx<MAX_RACH_NUM_RB_IDX; idx++)
+ {
+ if(numRbForPrachTable[idx][0] == cell->cellCfg.schRachCfg.rootSeqIdx)
+ break;
+ }
+ numPrachRb = numRbForPrachTable[idx][3];
+ dataType |= SCH_DATATYPE_PRACH;
+ /* Considering first slot in the frame for PRACH */
+ idx = 0;
+ ulAlloc->assignedPrb[idx] = freqStart+numPrachRb;
+ }
+
+ /* Fill UL SCH Info */
+ ulSchInfo->cellId = cell->cellId;
+ ulSchInfo->slotIndInfo.sfn = sfn;
+ ulSchInfo->slotIndInfo.slot = slot;
+ ulSchInfo->dataType = dataType;
+ /* prach info */
+ ulSchInfo->prachSchInfo.numPrachOcas = prachOcas;
+ ulSchInfo->prachSchInfo.prachFormat = prachFormat;
+ ulSchInfo->prachSchInfo.numRa = numRa;
+ ulSchInfo->prachSchInfo.prachStartSymb = prachStartSymbol;
+
+ return ROK;
+}
+
+/**
+ * @brief resource allocation for UL
+ *
+ * @details
+ *
+ * Function : schUlResAlloc
+ *
+ * This function handles UL Resource allocation
+ *
+ * @param[in] SchCellCb *cell, cellCb
+ * @return void
+ **/
+uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst)
+{
+ int ret = ROK;
+ UlSchInfo ulSchInfo;
+ /* Schedule resources for PRACH */
+ schPrachResAlloc(cell, &ulSchInfo);
+ //send msg to MAC
+ ret = sendUlSchInfoToMac(&ulSchInfo, schInst);
+ if(ret != ROK)
+ {
+ DU_LOG("\nSending UL Sch info from SCH to MAC failed");
+ }
+
+ return ret;
+}
/**********************************************************************
End of file
**********************************************************************/