gNB changes- Compute bitlen in case of SSB-SINR

compute SINR bitlen according to 38.212 table 6.3.1.1.2-6A
This commit is contained in:
Raghavendra Dinavahi
2025-04-15 16:02:34 +02:00
parent 2c164336bc
commit 61778f3d55
2 changed files with 73 additions and 39 deletions
+5 -2
View File
@@ -517,7 +517,9 @@ typedef struct {
uint8_t cri_ssbri_bitlen; uint8_t cri_ssbri_bitlen;
uint8_t rsrp_bitlen; uint8_t rsrp_bitlen;
uint8_t diff_rsrp_bitlen; uint8_t diff_rsrp_bitlen;
} L1_RSRP_bitlen_t; uint8_t sinr_bitlen;
uint8_t diff_sinr_bitlen;
} L1_Meas_bitlen_t;
typedef struct{ typedef struct{
uint8_t ri_restriction; uint8_t ri_restriction;
@@ -535,13 +537,14 @@ typedef struct{
typedef struct nr_csi_report { typedef struct nr_csi_report {
NR_CSI_ReportConfigId_t reportConfigId; NR_CSI_ReportConfigId_t reportConfigId;
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type; NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR reportQuantity_type_r16;
long periodicity; long periodicity;
uint16_t offset; uint16_t offset;
long **SSB_Index_list; long **SSB_Index_list;
long **CSI_Index_list; long **CSI_Index_list;
// uint8_t nb_of_nzp_csi_report; // uint8_t nb_of_nzp_csi_report;
uint8_t nb_of_csi_ssb_report; uint8_t nb_of_csi_ssb_report;
L1_RSRP_bitlen_t CSI_report_bitlen; L1_Meas_bitlen_t CSI_report_bitlen;
CSI_Meas_bitlen_t csi_meas_bitlen; CSI_Meas_bitlen_t csi_meas_bitlen;
int codebook_mode; int codebook_mode;
int N1; int N1;
+68 -37
View File
@@ -4427,7 +4427,10 @@ static uint8_t number_of_bits_set(uint8_t buf)
return nb_of_bits_set; return nb_of_bits_set;
} }
static void compute_rsrp_bitlen(const NR_CSI_ReportConfig_t *csi_reportconfig, uint8_t nb_resources, nr_csi_report_t *csi_report) static void compute_rsrp_or_sinr_bitlen(const NR_CSI_ReportConfig_t *csi_reportconfig,
uint8_t nb_resources,
nr_csi_report_t *csi_report,
bool is_RSRP_configured)
{ {
if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) { if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
if (csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS) if (csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
@@ -4445,13 +4448,20 @@ static void compute_rsrp_bitlen(const NR_CSI_ReportConfig_t *csi_reportconfig, u
csi_report->CSI_report_bitlen.nb_ssbri_cri = 2; csi_report->CSI_report_bitlen.nb_ssbri_cri = 2;
if (nb_resources) { if (nb_resources) {
csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_resources)); csi_report->CSI_report_bitlen.cri_ssbri_bitlen = ceil(log2 (nb_resources));
csi_report->CSI_report_bitlen.rsrp_bitlen = 7; // From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP if (is_RSRP_configured) {
csi_report->CSI_report_bitlen.diff_rsrp_bitlen = 4; // From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP csi_report->CSI_report_bitlen.rsrp_bitlen = 7; // From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
csi_report->CSI_report_bitlen.diff_rsrp_bitlen = 4; // From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
} else {
csi_report->CSI_report_bitlen.sinr_bitlen = 7; // From spec 38.212 Table 6.3.1.1.2-6A: CRI, SSBRI, and SINR
csi_report->CSI_report_bitlen.diff_sinr_bitlen = 4; // From spec 38.212 Table 6.3.1.1.2-6A: CRI, SSBRI, and SINR
}
} else { } else {
csi_report->CSI_report_bitlen.cri_ssbri_bitlen = 0; csi_report->CSI_report_bitlen.cri_ssbri_bitlen = 0;
csi_report->CSI_report_bitlen.rsrp_bitlen = 0; csi_report->CSI_report_bitlen.rsrp_bitlen = 0;
csi_report->CSI_report_bitlen.diff_rsrp_bitlen = 0; csi_report->CSI_report_bitlen.diff_rsrp_bitlen = 0;
csi_report->CSI_report_bitlen.sinr_bitlen = 0;
csi_report->CSI_report_bitlen.diff_sinr_bitlen = 0;
} }
} }
@@ -4878,9 +4888,13 @@ void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report
reportQuantity_type = csi_reportconfig->reportQuantity.present; reportQuantity_type = csi_reportconfig->reportQuantity.present;
csi_report->reportQuantity_type = reportQuantity_type; csi_report->reportQuantity_type = reportQuantity_type;
csi_report->reportConfigId = csi_reportconfig->reportConfigId; csi_report->reportConfigId = csi_reportconfig->reportConfigId;
csi_report->reportQuantity_type_r16 = NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_NOTHING;
if (csi_reportconfig->ext2 != NULL && csi_reportconfig->ext2->reportQuantity_r16)
csi_report->reportQuantity_type_r16 = csi_reportconfig->ext2->reportQuantity_r16->present;
// setting the CSI or SSB index list // setting the CSI or SSB index list
if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) { if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type
|| NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_ssb_Index_SINR_r16 == csi_report->reportQuantity_type_r16) {
for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) { for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) {
if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId == if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId ==
*(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){ *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
@@ -4891,8 +4905,7 @@ void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report
break; break;
} }
} }
} } else {
else {
if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) { if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) {
AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL, AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL,
"Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n"); "Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n");
@@ -4911,33 +4924,46 @@ void compute_csi_bitlen(const NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report
} }
LOG_D(NR_MAC,"nb_resources %d\n",nb_resources); LOG_D(NR_MAC,"nb_resources %d\n",nb_resources);
// computation of bit length depending on the report type // computation of bit length depending on the report type
switch(reportQuantity_type){ if (csi_report->reportQuantity_type_r16 != NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_NOTHING) {
case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP): switch (csi_report->reportQuantity_type_r16) {
compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report); case NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_ssb_Index_SINR_r16:
break; compute_rsrp_or_sinr_bitlen(csi_reportconfig, nb_resources, csi_report, false);
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP): break;
compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report); case NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_cri_SINR_r16:
break; compute_rsrp_or_sinr_bitlen(csi_reportconfig, nb_resources, csi_report, false);
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI): break;
csi_report->csi_meas_bitlen.cri_bitlen = ceil(log2(nb_resources)); default:
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); AssertFatal(1 == 0, "Not yet supported CSI report quantity type");
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); }
break; } else {
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI): switch (reportQuantity_type) {
csi_report->csi_meas_bitlen.cri_bitlen = ceil(log2(nb_resources)); case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP):
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); compute_rsrp_or_sinr_bitlen(csi_reportconfig, nb_resources, csi_report, true);
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); break;
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP):
break; compute_rsrp_or_sinr_bitlen(csi_reportconfig, nb_resources, csi_report, true);
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI): break;
csi_report->csi_meas_bitlen.cri_bitlen = ceil(log2(nb_resources)); case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI):
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); csi_report->csi_meas_bitlen.cri_bitlen = ceil(log2(nb_resources));
compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); break;
break; case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI):
default: csi_report->csi_meas_bitlen.cri_bitlen = ceil(log2(nb_resources));
AssertFatal(1==0,"Not yet supported CSI report quantity type"); csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
break;
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI):
csi_report->csi_meas_bitlen.cri_bitlen = ceil(log2(nb_resources));
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
break;
default:
AssertFatal(1 == 0, "Not yet supported CSI report quantity type");
}
} }
} }
} }
@@ -4946,11 +4972,16 @@ uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report)
{ {
uint16_t csi_bitlen = 0; uint16_t csi_bitlen = 0;
uint16_t max_bitlen = 0; uint16_t max_bitlen = 0;
L1_RSRP_bitlen_t *CSI_report_bitlen = NULL; L1_Meas_bitlen_t *CSI_report_bitlen = NULL;
CSI_Meas_bitlen_t *csi_meas_bitlen = NULL; CSI_Meas_bitlen_t *csi_meas_bitlen = NULL;
if (csi_report->reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP || if (csi_report->reportQuantity_type_r16 == NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_ssb_Index_SINR_r16
csi_report->reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP) { || csi_report->reportQuantity_type_r16 == NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_cri_SINR_r16) {
CSI_report_bitlen = &(csi_report->CSI_report_bitlen); // This might need to be moodif for Aperiodic CSI-RS measurements
csi_bitlen += ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) + CSI_report_bitlen->sinr_bitlen
+ (CSI_report_bitlen->diff_sinr_bitlen * (CSI_report_bitlen->nb_ssbri_cri - 1)));
} else if (csi_report->reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP
|| csi_report->reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP) {
CSI_report_bitlen = &(csi_report->CSI_report_bitlen); // This might need to be moodif for Aperiodic CSI-RS measurements CSI_report_bitlen = &(csi_report->CSI_report_bitlen); // This might need to be moodif for Aperiodic CSI-RS measurements
csi_bitlen += ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) + csi_bitlen += ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen * CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *