Merge remote-tracking branch 'origin/NR_UE_DLSCH_MCS_table_improvements' into integration_2024_w25
This commit is contained in:
@@ -1306,6 +1306,7 @@ static void configure_dedicated_BWP_dl(NR_UE_MAC_INST_t *mac, int bwp_id, NR_BWP
|
|||||||
if (dl_dedicated->pdcch_Config->present == NR_SetupRelease_PDCCH_Config_PR_setup)
|
if (dl_dedicated->pdcch_Config->present == NR_SetupRelease_PDCCH_Config_PR_setup)
|
||||||
configure_ss_coreset(pdcch, dl_dedicated->pdcch_Config->choice.setup);
|
configure_ss_coreset(pdcch, dl_dedicated->pdcch_Config->choice.setup);
|
||||||
}
|
}
|
||||||
|
AssertFatal(!dl_dedicated->sps_Config, "SPS handling not implemented\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1548,17 +1549,13 @@ static void configure_physicalcellgroup(NR_UE_MAC_INST_t *mac,
|
|||||||
mac->pdsch_HARQ_ACK_Codebook = phyConfig->pdsch_HARQ_ACK_Codebook;
|
mac->pdsch_HARQ_ACK_Codebook = phyConfig->pdsch_HARQ_ACK_Codebook;
|
||||||
mac->harq_ACK_SpatialBundlingPUCCH = phyConfig->harq_ACK_SpatialBundlingPUCCH ? true : false;
|
mac->harq_ACK_SpatialBundlingPUCCH = phyConfig->harq_ACK_SpatialBundlingPUCCH ? true : false;
|
||||||
mac->harq_ACK_SpatialBundlingPUSCH = phyConfig->harq_ACK_SpatialBundlingPUSCH ? true : false;
|
mac->harq_ACK_SpatialBundlingPUSCH = phyConfig->harq_ACK_SpatialBundlingPUSCH ? true : false;
|
||||||
|
AssertFatal(!phyConfig->ext1 || !phyConfig->ext1->mcs_C_RNTI, "Handling of mcs-C-RNTI not implemented\n");
|
||||||
NR_P_Max_t *p_NR_FR1 = phyConfig->p_NR_FR1;
|
NR_P_Max_t *p_NR_FR1 = phyConfig->p_NR_FR1;
|
||||||
NR_P_Max_t *p_UE_FR1 = phyConfig->ext1 ?
|
NR_P_Max_t *p_UE_FR1 = phyConfig->ext1 ? phyConfig->ext1->p_UE_FR1 : NULL;
|
||||||
phyConfig->ext1->p_UE_FR1 :
|
|
||||||
NULL;
|
|
||||||
if (p_NR_FR1 == NULL)
|
if (p_NR_FR1 == NULL)
|
||||||
mac->p_Max_alt = p_UE_FR1 == NULL ? INT_MIN : *p_UE_FR1;
|
mac->p_Max_alt = p_UE_FR1 == NULL ? INT_MIN : *p_UE_FR1;
|
||||||
else
|
else
|
||||||
mac->p_Max_alt = p_UE_FR1 == NULL ? *p_NR_FR1 :
|
mac->p_Max_alt = p_UE_FR1 == NULL ? *p_NR_FR1 : (*p_UE_FR1 < *p_NR_FR1 ? *p_UE_FR1 : *p_NR_FR1);
|
||||||
(*p_UE_FR1 < *p_NR_FR1 ?
|
|
||||||
*p_UE_FR1 : *p_NR_FR1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t get_sr_DelayTimer(long logicalChannelSR_DelayTimer)
|
static uint32_t get_sr_DelayTimer(long logicalChannelSR_DelayTimer)
|
||||||
|
|||||||
@@ -260,6 +260,38 @@ static inline int writeBit(uint8_t *bitmap, int offset, int value, int size)
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 38.214 Section 5.1.3.1
|
||||||
|
static uint8_t get_dlsch_mcs_table(nr_dci_format_t format,
|
||||||
|
nr_rnti_type_t rnti_type,
|
||||||
|
int ss_type,
|
||||||
|
long *mcs_Table,
|
||||||
|
long *sps_mcs_Table,
|
||||||
|
bool sps_transmission,
|
||||||
|
long *mcs_C_RNTI)
|
||||||
|
{
|
||||||
|
// TODO procedures for SPS-Config (semi-persistent scheduling) not implemented
|
||||||
|
if (mcs_Table && *mcs_Table == NR_PDSCH_Config__mcs_Table_qam256 && format == NR_DL_DCI_FORMAT_1_1 && rnti_type == TYPE_C_RNTI_)
|
||||||
|
return 1; // Table 5.1.3.1-2: MCS index table 2 for PDSCH
|
||||||
|
else if (!mcs_C_RNTI
|
||||||
|
&& mcs_Table
|
||||||
|
&& *mcs_Table == NR_PDSCH_Config__mcs_Table_qam64LowSE
|
||||||
|
&& ss_type == NR_SearchSpace__searchSpaceType_PR_ue_Specific
|
||||||
|
&& rnti_type == TYPE_C_RNTI_)
|
||||||
|
return 2; // Table 5.1.3.1-3: MCS index table 3 for PDSCH
|
||||||
|
else if (mcs_C_RNTI && rnti_type == TYPE_MCS_C_RNTI_)
|
||||||
|
return 2; // Table 5.1.3.1-3: MCS index table 3 for PDSCH
|
||||||
|
else if (!sps_mcs_Table && mcs_Table && *mcs_Table == NR_PDSCH_Config__mcs_Table_qam256) {
|
||||||
|
if ((format == NR_DL_DCI_FORMAT_1_1 && rnti_type == TYPE_CS_RNTI_) || sps_transmission)
|
||||||
|
return 1; // Table 5.1.3.1-2: MCS index table 2 for PDSCH
|
||||||
|
}
|
||||||
|
else if (sps_mcs_Table) {
|
||||||
|
if (rnti_type == TYPE_CS_RNTI_ || sps_transmission)
|
||||||
|
return 2; // Table 5.1.3.1-3: MCS index table 3 for PDSCH
|
||||||
|
}
|
||||||
|
// otherwise
|
||||||
|
return 0; // Table 5.1.3.1-1: MCS index table 1 for PDSCH
|
||||||
|
}
|
||||||
|
|
||||||
int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
|
int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
|
||||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
|
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
|
||||||
NR_PDSCH_Config_t *pdsch_Config,
|
NR_PDSCH_Config_t *pdsch_Config,
|
||||||
@@ -638,12 +670,13 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
|
|||||||
int dmrs_typeA_pos = mac->dmrs_TypeA_Position;
|
int dmrs_typeA_pos = mac->dmrs_TypeA_Position;
|
||||||
const int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise;
|
const int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise;
|
||||||
|
|
||||||
|
nr_rnti_type_t rnti_type = get_rnti_type(mac, dci_ind->rnti);
|
||||||
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
||||||
dci_ind->ss_type,
|
dci_ind->ss_type,
|
||||||
dci->time_domain_assignment.val,
|
dci->time_domain_assignment.val,
|
||||||
dmrs_typeA_pos,
|
dmrs_typeA_pos,
|
||||||
mux_pattern,
|
mux_pattern,
|
||||||
get_rnti_type(mac, dci_ind->rnti),
|
rnti_type,
|
||||||
coreset_type,
|
coreset_type,
|
||||||
mac->get_sib1);
|
mac->get_sib1);
|
||||||
|
|
||||||
@@ -661,7 +694,7 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
|
|||||||
else
|
else
|
||||||
dlsch_pdu->dlDmrsScramblingId = mac->physCellId;
|
dlsch_pdu->dlDmrsScramblingId = mac->physCellId;
|
||||||
|
|
||||||
if (get_rnti_type(mac, dci_ind->rnti) == TYPE_C_RNTI_
|
if (rnti_type == TYPE_C_RNTI_
|
||||||
&& dci_ind->ss_type != NR_SearchSpace__searchSpaceType_PR_common
|
&& dci_ind->ss_type != NR_SearchSpace__searchSpaceType_PR_common
|
||||||
&& pdsch_config->dataScramblingIdentityPDSCH)
|
&& pdsch_config->dataScramblingIdentityPDSCH)
|
||||||
dlsch_pdu->dlDataScramblingId = *pdsch_config->dataScramblingIdentityPDSCH;
|
dlsch_pdu->dlDataScramblingId = *pdsch_config->dataScramblingIdentityPDSCH;
|
||||||
@@ -689,7 +722,13 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
|
|||||||
dlsch_pdu->vrb_to_prb_mapping =
|
dlsch_pdu->vrb_to_prb_mapping =
|
||||||
(dci->vrb_to_prb_mapping.val == 0) ? vrb_to_prb_mapping_non_interleaved : vrb_to_prb_mapping_interleaved;
|
(dci->vrb_to_prb_mapping.val == 0) ? vrb_to_prb_mapping_non_interleaved : vrb_to_prb_mapping_interleaved;
|
||||||
/* MCS TABLE INDEX */
|
/* MCS TABLE INDEX */
|
||||||
dlsch_pdu->mcs_table = (pdsch_config) ? ((pdsch_config->mcs_Table) ? (*pdsch_config->mcs_Table + 1) : 0) : 0;
|
dlsch_pdu->mcs_table = get_dlsch_mcs_table(NR_DL_DCI_FORMAT_1_0,
|
||||||
|
rnti_type,
|
||||||
|
dci_ind->ss_type,
|
||||||
|
pdsch_config ? pdsch_config->mcs_Table : NULL,
|
||||||
|
NULL, // SPS not implemented,
|
||||||
|
false, // as above
|
||||||
|
NULL); // MCS-C-RNTI not implemented
|
||||||
/* MCS */
|
/* MCS */
|
||||||
dlsch_pdu->mcs = dci->mcs;
|
dlsch_pdu->mcs = dci->mcs;
|
||||||
|
|
||||||
@@ -942,12 +981,13 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
|
|||||||
int dmrs_typeA_pos = mac->dmrs_TypeA_Position;
|
int dmrs_typeA_pos = mac->dmrs_TypeA_Position;
|
||||||
int mux_pattern = 1;
|
int mux_pattern = 1;
|
||||||
const int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise;
|
const int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise;
|
||||||
|
nr_rnti_type_t rnti_type = get_rnti_type(mac, dci_ind->rnti);
|
||||||
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP,
|
||||||
dci_ind->ss_type,
|
dci_ind->ss_type,
|
||||||
dci->time_domain_assignment.val,
|
dci->time_domain_assignment.val,
|
||||||
dmrs_typeA_pos,
|
dmrs_typeA_pos,
|
||||||
mux_pattern,
|
mux_pattern,
|
||||||
get_rnti_type(mac, dci_ind->rnti),
|
rnti_type,
|
||||||
coreset_type,
|
coreset_type,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
@@ -1152,8 +1192,13 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
|
|||||||
// send the ack/nack slot number to phy to indicate tx thread to wait for DLSCH decoding
|
// send the ack/nack slot number to phy to indicate tx thread to wait for DLSCH decoding
|
||||||
dlsch_pdu->k1_feedback = feedback_ti;
|
dlsch_pdu->k1_feedback = feedback_ti;
|
||||||
|
|
||||||
/* TODO same calculation for MCS table as done in UL */
|
dlsch_pdu->mcs_table = get_dlsch_mcs_table(NR_DL_DCI_FORMAT_1_1,
|
||||||
dlsch_pdu->mcs_table = (pdsch_Config->mcs_Table) ? (*pdsch_Config->mcs_Table + 1) : 0;
|
rnti_type,
|
||||||
|
dci_ind->ss_type,
|
||||||
|
pdsch_Config ? pdsch_Config->mcs_Table : NULL,
|
||||||
|
NULL, // SPS not implemented,
|
||||||
|
false, // as above
|
||||||
|
NULL); // MCS-C-RNTI not implemented
|
||||||
dlsch_pdu->qamModOrder = nr_get_Qm_dl(dlsch_pdu->mcs, dlsch_pdu->mcs_table);
|
dlsch_pdu->qamModOrder = nr_get_Qm_dl(dlsch_pdu->mcs, dlsch_pdu->mcs_table);
|
||||||
if (dlsch_pdu->qamModOrder == 0) {
|
if (dlsch_pdu->qamModOrder == 0) {
|
||||||
LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
|
LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user