From 3b6b6e018dc0d20b688dca2c5f447125ee973fd2 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 4 Jun 2025 10:13:39 +0200 Subject: [PATCH] improve PDSCH DMRS structure with additional information --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 4 ++-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 4 ++-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 11 ++++------ .../NR_MAC_gNB/gNB_scheduler_primitives.c | 22 +++++++++++-------- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 3 +++ 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index e398da1eaf..fa3b1e8c8d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1416,8 +1416,8 @@ static void prepare_dl_pdus(gNB_MAC_INST *nr_mac, pdsch_pdu_rel15->transmissionScheme = 0; pdsch_pdu_rel15->refPoint = 0; pdsch_pdu_rel15->dmrsConfigType = dmrs_info.dmrsConfigType; - pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; - pdsch_pdu_rel15->SCID = 0; + pdsch_pdu_rel15->dlDmrsScramblingId = dmrs_info.scrambling_id; + pdsch_pdu_rel15->SCID = dmrs_info.n_scid; pdsch_pdu_rel15->numDmrsCdmGrpsNoData = dmrs_info.numDmrsCdmGrpsNoData; pdsch_pdu_rel15->dmrsPorts = 1; pdsch_pdu_rel15->resourceAlloc = 1; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 8f517115f5..b89def219b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -465,8 +465,8 @@ static void nr_fill_nfapi_dl_SIB_pdu(gNB_MAC_INST *gNB_mac, pdsch_pdu_rel15->transmissionScheme = 0; pdsch_pdu_rel15->refPoint = is_sib1; pdsch_pdu_rel15->dmrsConfigType = 0; - pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId; - pdsch_pdu_rel15->SCID = 0; + pdsch_pdu_rel15->dlDmrsScramblingId = pdsch->dmrs_parms.scrambling_id; + pdsch_pdu_rel15->SCID = pdsch->dmrs_parms.n_scid; pdsch_pdu_rel15->numDmrsCdmGrpsNoData = pdsch->dmrs_parms.numDmrsCdmGrpsNoData; pdsch_pdu_rel15->dmrsPorts = 1; pdsch_pdu_rel15->resourceAlloc = 1; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 2519ab59c9..c887aaae88 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -1097,8 +1097,8 @@ void nr_schedule_ue_spec(module_id_t module_id, // DMRS pdsch_pdu->dlDmrsSymbPos = dmrs_parms->dl_dmrs_symb_pos; pdsch_pdu->dmrsConfigType = dmrs_parms->dmrsConfigType; - pdsch_pdu->dlDmrsScramblingId = *scc->physCellId; - pdsch_pdu->SCID = 0; + pdsch_pdu->dlDmrsScramblingId = dmrs_parms->scrambling_id; + pdsch_pdu->SCID = dmrs_parms->n_scid; pdsch_pdu->numDmrsCdmGrpsNoData = dmrs_parms->numDmrsCdmGrpsNoData; pdsch_pdu->dmrsPorts = (1<pdsch_Config; /* Check and validate PTRS values */ - struct NR_SetupRelease_PTRS_DownlinkConfig *phaseTrackingRS = - pdsch_Config ? pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS : NULL; - - if (phaseTrackingRS) { - bool valid_ptrs_setup = set_dl_ptrs_values(phaseTrackingRS->choice.setup, + if (dmrs_parms->phaseTrackingRS) { + bool valid_ptrs_setup = set_dl_ptrs_values(dmrs_parms->phaseTrackingRS, pdsch_pdu->rbSize, pdsch_pdu->mcsIndex[0], pdsch_pdu->mcsTable[0], diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index a447d9f91c..102c06bb49 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -300,8 +300,7 @@ NR_pdsch_dmrs_t get_dl_dmrs_params(const NR_ServingCellConfigCommon_t *scc, if (dci_format == NR_DL_DCI_FORMAT_1_0) { dmrs.numDmrsCdmGrpsNoData = tda_info->nrOfSymbols <= 2 ? 1 : 2; dmrs.dmrs_ports_id = 0; - } - else { + } else { //TODO first basic implementation of dmrs port selection // only vaild for a single codeword // for now it assumes a selection of Nl consecutive dmrs ports @@ -346,16 +345,21 @@ NR_pdsch_dmrs_t get_dl_dmrs_params(const NR_ServingCellConfigCommon_t *scc, } } + dmrs.n_scid = 0; + long *scramblingID = NULL; NR_PDSCH_Config_t *pdsch_Config = dl_bwp ? dl_bwp->pdsch_Config : NULL; if (pdsch_Config) { - if (tda_info->mapping_type == typeB) - dmrs.dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type != NULL; - else - dmrs.dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type != NULL; - } - else + NR_DMRS_DownlinkConfig_t *dmrs_Config = tda_info->mapping_type == typeB ? + pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup : + pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; + dmrs.phaseTrackingRS = dmrs_Config->phaseTrackingRS ? dmrs_Config->phaseTrackingRS->choice.setup : NULL; + dmrs.dmrsConfigType = dmrs_Config->dmrs_Type != NULL; + scramblingID = dmrs.n_scid ? dmrs_Config->scramblingID1 : dmrs_Config->scramblingID0; + } else { dmrs.dmrsConfigType = NFAPI_NR_DMRS_TYPE1; - + dmrs.phaseTrackingRS = NULL; + } + dmrs.scrambling_id = scramblingID ? *scramblingID : *scc->physCellId; dmrs.N_PRB_DMRS = dmrs.numDmrsCdmGrpsNoData * (dmrs.dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4); dmrs.dl_dmrs_symb_pos = fill_dmrs_mask(pdsch_Config, dci_format, scc->dmrs_TypeA_Position, tda_info->nrOfSymbols, tda_info->startSymbolIndex, tda_info->mapping_type, frontloaded_symb); dmrs.N_DMRS_SLOT = get_num_dmrs(dmrs.dl_dmrs_symb_pos); diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 3918e0215c..239e0457f1 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -436,7 +436,10 @@ typedef struct NR_pdsch_dmrs { uint8_t N_DMRS_SLOT; uint16_t dl_dmrs_symb_pos; uint8_t numDmrsCdmGrpsNoData; + uint32_t scrambling_id; + int n_scid; nfapi_nr_dmrs_type_e dmrsConfigType; + NR_PTRS_DownlinkConfig_t *phaseTrackingRS; } NR_pdsch_dmrs_t; typedef struct NR_sched_pdsch {