PUCCH CHANGES AT SCH AND LOWER MAC
[o-du/l2.git] / src / cm / mac_sch_interface.h
index decd330..650dca2 100644 (file)
 *******************************************************************************/
 
 /* events */
-#define EVENT_SCH_CELL_CFG 1
-#define EVENT_SCH_CELL_CFG_CFM 2
+#define EVENT_SCH_CELL_CFG      1
+#define EVENT_SCH_CELL_CFG_CFM  2
+#define EVENT_DL_ALLOC          3 
+#define EVENT_UL_SCH_INFO       4 
+#define EVENT_RACH_IND_TO_SCH        5
+#define EVENT_CRC_IND_TO_SCH         6
+#define EVENT_DL_RLC_BO_INFO_TO_SCH  7
 
 /* selector */
 #define MAC_SCH_LC_SELECTOR 0
 #define MAX_NUM_PRG     1 /* max value should be later 275 */
 #define MAX_DIG_BF_INTERFACES 0 /* max value should be later 255 */
 #define MAX_CODEWORDS  1  /* max should be 2 */
+#define SCH_HARQ_PROC_ID 1 /* harq proc id */
+#define SCH_ALLOC_TYPE_1 1 /*sch res alloc type */
+
+/* Datatype in UL SCH Info */
+#define SCH_DATATYPE_PUSCH 1
+#define SCH_DATATYPE_PUSCH_UCI 2
+#define SCH_DATATYPE_UCI 4
+#define SCH_DATATYPE_SRS 8
+#define SCH_DATATYPE_PRACH 16
+
+#define MAX_NUMBER_OF_CRC_IND_BITS 1
+#define MAX_NUM_LOGICAL_CHANNELS   11
+/* can we have a common numslot numscs between mac sch */
+#define MAX_SLOTS 10
+#define MAX_SFN   1024
+#define CCCH_LCID  0
+#define ADD_DELTA_TO_TIME(crntTime, toFill, incr)          \
+   if ((crntTime.slot + incr) > (MAX_SLOTS - 1))   \
+      toFill.sfn = (crntTime.sfn + 1);      \
+   else                                                  \
+      toFill.sfn = crntTime.sfn;                              \
+   toFill.slot = (crntTime.slot + incr) % MAX_SLOTS; \
+   if (toFill.sfn >= MAX_SFN) \
+   { \
+      toFill.sfn%=MAX_SFN; \
+   } \
 
 /*structures*/
 
@@ -48,6 +79,19 @@ typedef enum
        RSP_NOK
 }schMacRsp;
 
+typedef struct timeDomainAlloc
+{
+   uint16_t startSymb;
+       uint16_t numSymb;
+}TimeDomainAlloc;
+
+typedef struct freqDomainAlloc
+{
+   uint16_t startPrb;
+   uint16_t numPrb;
+}FreqDomainAlloc;
+
+
 typedef struct
 {
    uint32_t    ssbPbchPwr;       /* SSB block power */
@@ -56,32 +100,15 @@ typedef struct
    SSBPeriod   ssbPeriod;        /* SSB Periodicity in msec */
    uint8_t     ssbSubcOffset;    /* Subcarrier Offset(Kssb) */
    uint32_t    nSSBMask[SSB_MASK_SIZE];      /* Bitmap for actually transmitted SSB. */
-} SsbSchCfg;
+}SchSsbCfg;
 
-/* SIB1 interface structure */
 typedef struct bwpCfg
 {
-   uint8_t subcarrierSpacing;
-   uint8_t cyclicPrefix;
-   uint16_t BWPSize;
-   uint16_t BWPStart;
+   uint8_t         subcarrierSpacing;
+   uint8_t         cyclicPrefix;
+   FreqDomainAlloc freqAlloc;  
 }BwpCfg;
 
-typedef struct coresetCfg
-{
-   uint8_t startSymbolIndex;
-   uint8_t durationSymbols;
-   uint8_t freqDomainResource[6];
-   uint8_t cceRegMappingType;
-   uint8_t regBundleSize;
-   uint8_t interleaverSize;
-   uint8_t coreSetType;
-   uint16_t shiftIndex;
-   uint8_t precoderGranularity;
-   uint8_t cceIndex;
-   uint8_t aggregationLevel;
-} CoresetCfg;
-
 typedef struct prg
 {
    uint16_t pmIdx;
@@ -96,34 +123,6 @@ typedef struct beamformingInfo
    Prg  prg[MAX_NUM_PRG];
 } BeamformingInfo;
 
-typedef struct txPowerPdcchInfo
-{
-   uint8_t powerValue;
-   uint8_t powerControlOffsetSS;
-} TxPowerPdcchInfo;
-
-typedef struct dlDCI
-{
-   uint16_t rnti;
-   uint16_t scramblingId;
-   uint16_t scramblingRnti;
-   uint8_t cceIndex;
-   uint8_t aggregLevel;
-   BeamformingInfo beamPdcchInfo;
-   TxPowerPdcchInfo txPdcchPower;
-} DlDCI;
-
-typedef struct sib1PdcchCfg
-{
-   BwpCfg sib1PdcchBwpCfg;
-   /* coreset-0 configuration */
-   CoresetCfg sib1Coreset0Cfg;
-
-   uint16_t numDlDci;
-   DlDCI    sib1DlDci; /* as of now its only one DCI, later it will be numDlCi */
-} Sib1PdcchCfg;
-/* end of SIB1 PDCCH structures */
-
 /* SIB1 PDSCH structures */
 
 typedef struct codewordinfo
@@ -148,17 +147,16 @@ typedef struct dmrsInfo
 
 typedef struct pdschFreqAlloc
 {
-   uint8_t  resourceAlloc;
+   uint8_t  resourceAllocType;
    /* since we are using type-1, hence rbBitmap excluded */
-   uint16_t rbStart;
-   uint16_t rbSize;
+       FreqDomainAlloc freqAlloc;
    uint8_t  vrbPrbMapping;
 } PdschFreqAlloc;
 
 typedef struct pdschTimeAlloc
 {
-   uint8_t startSymbolIndex;
-   uint8_t numSymbols;
+   uint8_t         rowIndex;
+       TimeDomainAlloc timeAlloc;
 } PdschTimeAlloc;
 
 typedef struct txPowerPdschInfo
@@ -167,26 +165,71 @@ typedef struct txPowerPdschInfo
    uint8_t powerControlOffsetSS;
 } TxPowerPdschInfo;
 
-typedef struct sib1PdschCfg
+typedef struct pdschCfg
 {
-   uint16_t pduBitmap;
-   uint16_t rnti;
-   uint16_t pduIndex;
-   BwpCfg sib1PdschBwpCfg;
-   uint8_t numCodewords;
-   CodewordInfo codeword[MAX_CODEWORDS];
-   uint16_t dataScramblingId;
-   uint8_t  numLayers;
-   uint8_t  transmissionScheme;
-   uint8_t  refPoint;
-   DmrsInfo dmrs;
-   PdschFreqAlloc sib1FreqAlloc;
-   PdschTimeAlloc sib1TimeAlloc;
-   BeamformingInfo beamPdschInfo;
+   uint16_t         pduBitmap;
+   uint16_t         rnti;
+   uint16_t         pduIndex;
+   uint8_t          numCodewords;
+   CodewordInfo     codeword[MAX_CODEWORDS];
+   uint16_t         dataScramblingId;
+   uint8_t          numLayers;
+   uint8_t          transmissionScheme;
+   uint8_t          refPoint;
+   DmrsInfo         dmrs;
+   PdschFreqAlloc   pdschFreqAlloc;
+   PdschTimeAlloc   pdschTimeAlloc;
+   BeamformingInfo  beamPdschInfo;
    TxPowerPdschInfo txPdschPower;
-} Sib1PdschCfg;
+} PdschCfg;
 /* SIB1 PDSCH structures end */
 
+/* SIB1 interface structure */
+
+typedef struct coresetCfg
+{
+   uint8_t coreSet0Size;
+   uint8_t startSymbolIndex;
+   uint8_t durationSymbols;
+   uint8_t freqDomainResource[6];
+   uint8_t cceRegMappingType;
+   uint8_t regBundleSize;
+   uint8_t interleaverSize;
+   uint8_t coreSetType;
+   uint16_t shiftIndex;
+   uint8_t precoderGranularity;
+   uint8_t cceIndex;
+   uint8_t aggregationLevel;
+} CoresetCfg;
+
+typedef struct txPowerPdcchInfo
+{
+   uint8_t powerValue;
+   uint8_t powerControlOffsetSS;
+} TxPowerPdcchInfo;
+
+typedef struct dlDCI
+{
+   uint16_t rnti;
+   uint16_t scramblingId;
+   uint16_t scramblingRnti;
+   uint8_t cceIndex;
+   uint8_t aggregLevel;
+   BeamformingInfo beamPdcchInfo;
+   TxPowerPdcchInfo txPdcchPower;
+   PdschCfg     *pdschCfg;
+} DlDCI;
+
+typedef struct pdcchCfg
+{
+   /* coreset-0 configuration */
+   CoresetCfg coreset0Cfg;
+
+   uint16_t numDlDci;
+   DlDCI    dci; /* as of now its only one DCI, later it will be numDlCi */
+} PdcchCfg;
+/* end of SIB1 PDCCH structures */
+
 typedef struct
 {
    /* parameters recieved from DU-APP */
@@ -199,18 +242,108 @@ typedef struct
        
        /* parameters derived in scheduler */
        uint8_t n0;
-   Sib1PdcchCfg sib1PdcchCfg;
-   Sib1PdschCfg sib1PdschCfg;
-} Sib1SchCfg;
+   BwpCfg bwp;
+   PdcchCfg sib1PdcchCfg;
+   PdschCfg sib1PdschCfg;
+}SchSib1Cfg;
+
+typedef struct schRachCfg
+{
+   uint8_t      prachCfgIdx;       /* PRACH config idx */
+   uint8_t      prachSubcSpacing;  /* Subcarrier spacing of RACH */
+       uint16_t     msg1FreqStart;     /* Msg1-FrequencyStart */
+       uint8_t      msg1Fdm;           /* PRACH FDM (1,2,4,8) */
+       uint8_t      rootSeqLen;        /* root sequence length */
+   uint16_t     rootSeqIdx;        /* Root sequence index */
+   uint8_t      numRootSeq;        /* Number of root sequences required for FD */
+   uint16_t     k1;                /* Frequency Offset for each FD */
+   uint8_t      ssbPerRach;        /* SSB per RACH occassion */
+   uint8_t      prachMultCarrBand; /* Presence of Multiple carriers in Band */
+       uint8_t      raContResTmr;      /* RA Contention Resoultion Timer */
+       uint8_t      rsrpThreshSsb;     /* RSRP Threshold SSB */
+   uint8_t      raRspWindow;       /* RA Response Window */
+}SchRachCfg;
+
+typedef struct schBwpParams
+{
+   FreqDomainAlloc freqAlloc;
+       uint8_t         scs;
+       uint8_t         cyclicPrefix;
+}SchBwpParams;
+
+typedef struct schCandidatesInfo
+{
+   uint8_t aggLevel1;
+   uint8_t aggLevel2;
+   uint8_t aggLevel4;
+   uint8_t aggLevel8;
+   uint8_t aggLevel16;
+}SchCandidatesInfo;
+
+typedef struct schSearchSpaceCfg
+{
+   uint8_t searchSpaceId;
+       uint8_t coresetId;
+       uint16_t monitoringSlot;
+       uint16_t duration;
+       uint16_t monitoringSymbol;
+       SchCandidatesInfo candidate;
+}SchSearchSpaceCfg;
+
+typedef struct schPdcchCfgCmn
+{
+   SchSearchSpaceCfg commonSearchSpace;
+   uint8_t raSearchSpaceId;
+}SchPdcchCfgCmn;
+
+typedef struct schPdschCfgCmn
+{
+   uint8_t k0;
+   uint8_t mappingType;
+   uint8_t startSymbol;
+   uint8_t lengthSymbol;
+}SchPdschCfgCmn;
+
+typedef struct schPucchCfgCmn
+{
+   uint8_t pucchResourceCommon;
+   uint8_t pucchGroupHopping;
+}SchPucchCfgCmn;
+
+typedef struct schPuschCfgCmn
+{
+   uint8_t k2;
+   uint8_t mappingType;
+   uint8_t startSymbol;
+   uint8_t lengthSymbol;
+}SchPuschCfgCmn;
+
+typedef struct schBwpDlCfg
+{
+   SchBwpParams   bwp;
+       SchPdcchCfgCmn pdcchCommon;
+       SchPdschCfgCmn pdschCommon;
+}SchBwpDlCfg;
+
+typedef struct schBwpUlCfg
+{
+   SchBwpParams   bwp;
+       SchPucchCfgCmn pucchCommon;
+       SchPuschCfgCmn puschCommon;
+}SchBwpUlCfg;
 
 typedef struct schCellCfg
 {
-   U16         cellId;     /* Cell Id */
-   U16         phyCellId;  /* Physical cell id */
-       U8          bandwidth;  /* Supported B/W */
-   DuplexMode  dupMode;    /* Duplex type: TDD/FDD */
-       SsbSchCfg   ssbSchCfg;
-       Sib1SchCfg  sib1SchCfg;
+   uint16_t    cellId;           /* Cell Id */
+   uint16_t    phyCellId;        /* Physical cell id */
+       uint8_t     bandwidth;        /* Supported B/W */
+   DuplexMode  dupMode;          /* Duplex type: TDD/FDD */
+       SchSsbCfg   ssbSchCfg;        /* SSB config */
+       SchSib1Cfg  sib1SchCfg;       /* SIB1 config */
+   SchRachCfg  schRachCfg;       /* PRACH config */
+       SchBwpDlCfg schInitialDlBwp;  /* Initial DL BWP */
+       SchBwpUlCfg schInitialUlBwp;  /* Initial UL BWP */
+       uint8_t     puschMu;          /* PUSCH MU */
 }SchCellCfg;
 
 typedef struct schCellCfgCfm
@@ -219,36 +352,31 @@ typedef struct schCellCfgCfm
    schMacRsp   rsp;   
 }SchCellCfgCfm;
 
-typedef struct timeDomainAlloc
-{
-   uint16_t ssbStartSymbIdx;
-       uint16_t ssbSymbolDuration;
-}TimeDomainAlloc;
-
-typedef struct freqDomainAlloc
-{
-   uint16_t ssbStartPrbIdx;
-   uint16_t ssbPrbDuration;
-}FreqDomainAlloc;
-
 typedef struct ssbInfo
 {
-   uint8_t ssbIdx;          /* SSB Index */
+   uint8_t         ssbIdx;          /* SSB Index */
        TimeDomainAlloc tdAlloc; /* Time domain allocation */
        FreqDomainAlloc fdAlloc; /* Freq domain allocation */
 }SsbInfo;
 
 typedef struct sib1AllocInfo
 {
-   Sib1PdcchCfg sib1PdcchCfg;
-   Sib1PdschCfg sib1PdschCfg;
+   BwpCfg bwp;
+   PdcchCfg sib1PdcchCfg;
+   PdschCfg sib1PdschCfg;
 } Sib1AllocInfo;
 
+typedef struct prachSchInfo
+{
+       uint8_t  numPrachOcas;   /* Num Prach Ocassions */
+   uint8_t  prachFormat;    /* PRACH Format */
+   uint8_t  numRa;          /* Freq domain ocassion */
+   uint8_t  prachStartSymb; /* Freq domain ocassion */
+}PrachSchInfo;
+
 /* Interface structure signifying DL broadcast allocation for SSB, SIB1 */
 typedef struct dlBrdcstAlloc
 {
-   uint16_t cellId;  /* Cell Id */
-       SlotIndInfo slotIndInfo; /* Slot Info: sfn, slot number */
        /* Ssb transmission is determined as follows:
         * 0 : No tranamission
         * 1 : SSB Transmission
@@ -264,12 +392,152 @@ typedef struct dlBrdcstAlloc
        Sib1AllocInfo sib1Alloc;
 }DlBrdcstAlloc;
 
-/* function pointers */
+typedef struct rarInfo
+{
+   uint16_t        raRnti;
+       uint8_t         RAPID;
+       uint16_t        ta;
+       FreqDomainAlloc msg3FreqAlloc;
+       uint16_t        tcrnti;
+       uint8_t         rarPdu[8];
+       uint8_t         rarPduLen;
+}RarInfo;
+
+typedef struct rarAlloc
+{
+   RarInfo rarInfo;
+   BwpCfg  bwp;
+   PdcchCfg rarPdcchCfg;
+   PdschCfg rarPdschCfg;
+}RarAlloc;
 
-typedef int (*SchMacDlBrdcstAllocFunc)     ARGS((                     
-   Pst            *pst,           /* Post Structure */                         
-   DlBrdcstAlloc  *dlBrdcstAlloc    /* slot ind Info */                      
-));
+typedef struct msg4Info
+{
+   uint16_t crnti;
+       uint8_t  ndi;
+       uint8_t  harqProcNum;
+       uint8_t  dlAssignIdx;
+       uint8_t  pucchTpc;
+       uint8_t  pucchResInd;
+       uint8_t  harqFeedbackInd;
+       uint8_t  dciFormatId;
+   uint8_t  *msg4Pdu;
+   uint16_t  msg4PduLen;
+}Msg4Info;
+
+typedef struct msg4Alloc
+{
+   Msg4Info msg4Info;
+   BwpCfg bwp;
+   PdcchCfg msg4PdcchCfg;
+   PdschCfg msg4PdschCfg;
+}Msg4Alloc;
+
+typedef struct schSlotValue
+{
+       SlotIndInfo currentTime;
+       SlotIndInfo broadcastTime;
+       SlotIndInfo rarTime;
+       SlotIndInfo msg4Time;
+       SlotIndInfo dlMsgTime;
+}SchSlotValue;
+
+typedef struct dlSchedInfo
+{
+   uint16_t cellId;  /* Cell Id */
+       SchSlotValue schSlotValue;
+
+       /* Allocation for broadcast messages */
+   bool isBroadcastPres;
+       DlBrdcstAlloc brdcstAlloc;
+
+       /* Allocation for RAR message */
+       //uint8_t isRarPres;
+       RarAlloc *rarAlloc;
+
+   /* Allocation from MSG4 */
+   Msg4Alloc *msg4Alloc;
+}DlSchedInfo;
+
+typedef struct tbInfo
+{
+   uint8_t  mcs;    /* MCS */
+   uint8_t  ndi;    /* NDI */
+   uint8_t  rv;     /* Redundancy Version */
+   uint16_t tbSize; /* TB Size */
+}TbInfo;
+
+typedef struct schPuschInfo
+{
+   uint8_t          harqProcId;   /* HARQ Process ID */
+   uint8_t          resAllocType; /* Resource allocation type */
+   FreqDomainAlloc  fdAlloc;      /* Freq domain allocation */
+   TimeDomainAlloc  tdAlloc;      /* Time domain allocation */
+   TbInfo           tbInfo;       /* TB info */
+}SchPuschInfo;
+
+typedef struct schPucchInfo
+{
+   uint16_t         rnti;
+   uint8_t          pucchFormat;
+   FreqDomainAlloc  fdAlloc;      /* Freq domain allocation */
+   TimeDomainAlloc  tdAlloc;      /* Time domain allocation */
+       uint8_t          srFlag;
+       uint8_t          harqFlag;
+       uint8_t          numHarqBits;
+       uint8_t          uciFlag;
+       uint8_t          numUciBits;
+}SchPucchInfo;
+
+typedef struct ulSchedInfo
+{
+   uint16_t      cellId;         /* Cell Id */
+       uint16_t      crnti;          /* CRNI */
+       SlotIndInfo   slotIndInfo;    /* Slot Info: sfn, slot number */
+       uint8_t       dataType;       /* Type of info being scheduled */
+       PrachSchInfo  prachSchInfo;   /* Prach scheduling info */
+       SchPuschInfo  schPuschInfo;   /* Pusch scheduling info */
+       SchPucchInfo  schPucchInfo;   /* Pusch scheduling info */
+}UlSchedInfo;
+
+typedef struct rachIndInfo
+{
+   uint16_t    cellId;
+   uint16_t    crnti;
+   SlotIndInfo timingInfo;
+   uint8_t     slotIdx;
+   uint8_t     symbolIdx;
+   uint8_t     freqIdx;
+   uint8_t     preambleIdx;
+   uint16_t    timingAdv;
+}RachIndInfo;
+
+
+typedef struct crcIndInfo
+{
+   uint16_t    cellId;
+   uint16_t    crnti;
+   SlotIndInfo timingInfo;
+   uint16_t    numCrcInd;
+   uint8_t     crcInd[MAX_NUMBER_OF_CRC_IND_BITS];
+}CrcIndInfo;
+
+typedef struct boInfo
+{
+   uint8_t   lcId;
+   uint32_t  dataVolume;
+}BOInfo;
+
+typedef struct dlRlcBOInfo
+{
+   uint16_t    cellId;
+   uint16_t    crnti;
+   uint16_t    numLc;
+   BOInfo      boInfo[MAX_NUM_LOGICAL_CHANNELS];
+}DlRlcBOInfo;
+
+
+/* function pointers */
 
 typedef int (*SchCellCfgCfmFunc)    ARGS((
    Pst            *pst,           /* Post Structure */                         
@@ -280,18 +548,41 @@ typedef int (*SchCellCfgFunc)    ARGS((
    Pst            *pst,           /* Post Structure */                         
    SchCellCfg  *schCellCfg     /* Cell Cfg  */
 ));
+
+typedef int (*SchMacDlAllocFunc)     ARGS((                     
+   Pst            *pst,       /* Post Structure */                         
+   DlSchedInfo    *dlSchedInfo    /* dl allocation Info */                      
+));
+
+typedef int (*SchMacUlSchInfoFunc)     ARGS((                     
+   Pst         *pst,           /* Post Structure */                         
+   UlSchedInfo *ulSchedInfo         /* UL Alloc Sch  Info */                      
+));
+
 /* function declarations */
 int packMacSchSlotInd(Pst *pst, SlotIndInfo *slotInd);
-int packSchMacDlBrdcstAlloc(Pst *pst, DlBrdcstAlloc  *dlBrdcstAlloc);
+int packSchMacDlAlloc(Pst *pst, DlSchedInfo  *dlSchedInfo);
+int packSchMacUlSchInfo(Pst *pst, UlSchedInfo *ulSchedInfo);
 EXTERN int packSchCellCfg(Pst *pst, SchCellCfg  *schCellCfg);
 EXTERN int packSchCellCfgCfm(Pst *pst, SchCellCfgCfm  *schCellCfgCfm);
 
-EXTERN int MacProcDlBrdcstAlloc(Pst *pst, DlBrdcstAlloc *dlBrdcstAlloc);
+EXTERN int MacProcDlAlloc(Pst *pst, DlSchedInfo *dlSchedInfo);
 EXTERN int MacProcSchCellCfg(Pst *pst, SchCellCfg  *schCellCfg);
 EXTERN int MacProcSchCellCfgCfm(Pst *pst, SchCellCfgCfm  *schCellCfgCfm);
 EXTERN int SchHdlCellCfgReq(Pst *pst, SchCellCfg *schCellCfg);
 EXTERN int schActvInit(Ent entity, Inst instId, Region region, Reason reason);
 EXTERN S16 SchSendCfgCfm(Pst *pst, RgMngmt *cfm);
+EXTERN int MacProcUlSchInfo(Pst *pst, UlSchedInfo *ulSchedInfo);
+typedef int (*MacSchRachIndFunc)(Pst *pst, RachIndInfo *rachInd);
+int packMacSchRachInd(Pst *pst, RachIndInfo *rachInd);
+int macSchRachInd(Pst *pst, RachIndInfo *rachInd);
+typedef int (*MacSchCrcIndFunc)(Pst *pst, CrcIndInfo *crcInd);
+int packMacSchCrcInd(Pst *pst, CrcIndInfo *crcInd);
+int macSchCrcInd(Pst *pst, CrcIndInfo *crcInd);
+typedef uint8_t (*MacSchDlRlcBoInfoFunc)(Pst *pst, DlRlcBOInfo *dlBoInfo);
+uint8_t packMacSchDlRlcBoInfo(Pst *pst, DlRlcBOInfo *dlBoInfo);
+uint8_t macSchDlRlcBoInfo(Pst *pst, DlRlcBOInfo *dlBoInfo);
+
 
 /**********************************************************************
   End of file