Commit 2d2a92dd authored by francescomani's avatar francescomani

improvements in handling CSI report for RSRP

parent 70a64341
...@@ -564,8 +564,8 @@ typedef struct nr_csi_report { ...@@ -564,8 +564,8 @@ typedef struct nr_csi_report {
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type; NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
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_RSRP_bitlen_t CSI_report_bitlen;
......
...@@ -481,10 +481,11 @@ static bool get_measured_rsrp(uint8_t index, int *rsrp) ...@@ -481,10 +481,11 @@ static bool get_measured_rsrp(uint8_t index, int *rsrp)
} }
//returns the differential RSRP value (upper limit) //returns the differential RSRP value (upper limit)
static int get_diff_rsrp(uint8_t index, int strongest_rsrp) { static int get_diff_rsrp(uint8_t index, int strongest_rsrp)
if(strongest_rsrp != -1) { {
if(strongest_rsrp != -1)
return strongest_rsrp + diff_rsrp_ssb_csi_meas_10_1_6_1_2[index]; return strongest_rsrp + diff_rsrp_ssb_csi_meas_10_1_6_1_2[index];
} else else
return MIN_RSRP_VALUE; return MIN_RSRP_VALUE;
} }
...@@ -497,7 +498,6 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) ...@@ -497,7 +498,6 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot)
int curr_ssb_beam_index = 0; //ToDo: yet to know how to identify the serving ssb beam index int curr_ssb_beam_index = 0; //ToDo: yet to know how to identify the serving ssb beam index
uint8_t target_ssb_beam_index = curr_ssb_beam_index; uint8_t target_ssb_beam_index = curr_ssb_beam_index;
uint8_t is_triggering_ssb_beam_switch =0; uint8_t is_triggering_ssb_beam_switch =0;
uint8_t ssb_idx = 0;
int pdsch_bwp_id = 0; int pdsch_bwp_id = 0;
int ssb_index[MAX_NUM_SSB] = {0}; int ssb_index[MAX_NUM_SSB] = {0};
int ssb_rsrp[MAX_NUM_SSB] = {0}; int ssb_rsrp[MAX_NUM_SSB] = {0};
...@@ -505,10 +505,8 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) ...@@ -505,10 +505,8 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot)
NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP; NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP;
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
uint8_t nr_ssbri_cri = 0;
uint8_t nb_of_csi_ssb_report = UE->csi_report_template[cqi_idx].nb_of_csi_ssb_report; uint8_t nb_of_csi_ssb_report = UE->csi_report_template[cqi_idx].nb_of_csi_ssb_report;
int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially
uint8_t diff_rsrp_idx = 0;
uint8_t i, j; uint8_t i, j;
//bwp indicator //bwp indicator
...@@ -528,22 +526,16 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) ...@@ -528,22 +526,16 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot)
idx: resource set index idx: resource set index
*/ */
nr_ssbri_cri = sched_ctrl->CSI_report.ssb_cri_report.nr_ssbri_cri; int nr_ssbri = sched_ctrl->CSI_report.ssb_rsrp_report.nr_reports;
//extracting the ssb indexes //extracting the ssb indexes
for (ssb_idx = 0; ssb_idx < nr_ssbri_cri; ssb_idx++) { for (int ssb_idx = 0; ssb_idx < nr_ssbri; ssb_idx++) {
ssb_index[idx * nb_of_csi_ssb_report + ssb_idx] = sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[ssb_idx]; ssb_index[idx * nb_of_csi_ssb_report + ssb_idx] = sched_ctrl->CSI_report.ssb_rsrp_report.resource_id[ssb_idx];
} }
//if strongest measured RSRP is configured //if strongest measured RSRP is configured
int strongest_ssb_rsrp; int strongest_ssb_rsrp = sched_ctrl->CSI_report.ssb_rsrp_report.RSRP[0];
int rsrp_index = sched_ctrl->CSI_report.ssb_cri_report.RSRP;
bool valid = get_measured_rsrp(rsrp_index, &strongest_ssb_rsrp);
if (!valid) {
LOG_E(NR_MAC, "UE %04x: reported RSRP index %d invalid\n", UE->rnti, rsrp_index);
return;
}
ssb_rsrp[idx * nb_of_csi_ssb_report] = strongest_ssb_rsrp; ssb_rsrp[idx * nb_of_csi_ssb_report] = strongest_ssb_rsrp;
LOG_D(NR_MAC,"ssb_rsrp = %d\n",strongest_ssb_rsrp); LOG_D(NR_MAC,"ssb_rsrp = %d\n", strongest_ssb_rsrp);
//if current ssb rsrp is greater than better rsrp //if current ssb rsrp is greater than better rsrp
if(ssb_rsrp[idx * nb_of_csi_ssb_report] > better_rsrp_reported) { if(ssb_rsrp[idx * nb_of_csi_ssb_report] > better_rsrp_reported) {
...@@ -551,8 +543,8 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) ...@@ -551,8 +543,8 @@ static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot)
target_ssb_beam_index = idx * nb_of_csi_ssb_report; target_ssb_beam_index = idx * nb_of_csi_ssb_report;
} }
for(diff_rsrp_idx =1; diff_rsrp_idx < nr_ssbri_cri; diff_rsrp_idx++) { for(int diff_rsrp_idx = 1; diff_rsrp_idx < nr_ssbri; diff_rsrp_idx++) {
ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] = get_diff_rsrp(sched_ctrl->CSI_report.ssb_cri_report.diff_RSRP[diff_rsrp_idx-1], strongest_ssb_rsrp); ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] = sched_ctrl->CSI_report.ssb_rsrp_report.RSRP[diff_rsrp_idx];
//if current reported rsrp is greater than better rsrp //if current reported rsrp is greater than better rsrp
if(ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] > better_rsrp_reported) { if(ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] > better_rsrp_reported) {
...@@ -687,10 +679,6 @@ static void evaluate_rsrp_report(NR_UE_info_t *UE, ...@@ -687,10 +679,6 @@ static void evaluate_rsrp_report(NR_UE_info_t *UE,
int *cumul_bits, int *cumul_bits,
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type) NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type)
{ {
nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
uint8_t cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen;
uint16_t curr_payload;
/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report /*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
* the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE * the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
* From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set * From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
...@@ -708,46 +696,51 @@ static void evaluate_rsrp_report(NR_UE_info_t *UE, ...@@ -708,46 +696,51 @@ static void evaluate_rsrp_report(NR_UE_info_t *UE,
resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
multiple simultaneous spatial domain receive filter multiple simultaneous spatial domain receive filter
*/ */
nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
RSRP_report_t *rsrp_report;
long **index_list;
switch (reportQuantity_type) {
case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP:
rsrp_report = &sched_ctrl->CSI_report.ssb_rsrp_report;
index_list = csi_report->SSB_Index_list;
break;
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP :
rsrp_report = &sched_ctrl->CSI_report.csirs_rsrp_report;
index_list = csi_report->CSI_Index_list;
break;
default :
AssertFatal(false, "Invalid RSRP report type\n");
}
sched_ctrl->CSI_report.ssb_cri_report.nr_ssbri_cri = csi_report->CSI_report_bitlen.nb_ssbri_cri; uint16_t curr_payload;
for (int i = 0; i < rsrp_report->nr_reports; i++) {
for (int csi_ssb_idx = 0; csi_ssb_idx < sched_ctrl->CSI_report.ssb_cri_report.nr_ssbri_cri ; csi_ssb_idx++) { int bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen;
curr_payload = pickandreverse_bits(payload, cri_ssbri_bitlen, *cumul_bits); curr_payload = pickandreverse_bits(payload, bitlen, *cumul_bits);
rsrp_report->resource_id[i] = *(index_list[bitlen > 0 ? ((curr_payload) & ~(~1U << (bitlen - 1))) : bitlen]);
if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type) { LOG_D(MAC,"SSB/CSI-RS index = %d\n", rsrp_report->resource_id[i]);
sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx] = *cumul_bits += bitlen;
*(csi_report->SSB_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1U<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
LOG_D(MAC,"SSB_index = %d\n",sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx]);
}
else {
sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx] =
*(csi_report->CSI_Index_list[cri_ssbri_bitlen>0?((curr_payload)&~(~1U<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
LOG_D(MAC,"CSI-RS Resource Indicator = %d\n",sched_ctrl->CSI_report.ssb_cri_report.CRI_SSBRI[csi_ssb_idx]);
}
*cumul_bits += cri_ssbri_bitlen;
} }
curr_payload = pickandreverse_bits(payload, 7, *cumul_bits); curr_payload = pickandreverse_bits(payload, 7, *cumul_bits);
sched_ctrl->CSI_report.ssb_cri_report.RSRP = curr_payload & 0x7f; int rsrp_index = curr_payload & 0x7f;
*cumul_bits += 7; *cumul_bits += 7;
for (int diff_rsrp_idx =0; diff_rsrp_idx < sched_ctrl->CSI_report.ssb_cri_report.nr_ssbri_cri - 1; diff_rsrp_idx++ ) {
curr_payload = pickandreverse_bits(payload, 4, *cumul_bits);
sched_ctrl->CSI_report.ssb_cri_report.diff_RSRP[diff_rsrp_idx] = curr_payload & 0x0f;
*cumul_bits += 4;
}
csi_report->nb_of_csi_ssb_report++; csi_report->nb_of_csi_ssb_report++;
int strongest_ssb_rsrp; bool valid = get_measured_rsrp(rsrp_index, &rsrp_report->RSRP[0]);
int rsrp_index = sched_ctrl->CSI_report.ssb_cri_report.RSRP;
bool valid = get_measured_rsrp(rsrp_index, &strongest_ssb_rsrp);
if (!valid) { if (!valid) {
LOG_E(NR_MAC, "UE %04x: reported RSRP index %d invalid\n", UE->rnti, rsrp_index); LOG_E(NR_MAC, "UE %04x: reported RSRP index %d invalid\n", UE->rnti, rsrp_index);
return; return;
} }
for (int i = 1; i < rsrp_report->nr_reports; i++) {
curr_payload = pickandreverse_bits(payload, 4, *cumul_bits);
rsrp_report->RSRP[i] = get_diff_rsrp(curr_payload & 0x0f, rsrp_report->RSRP[0]);
*cumul_bits += 4;
}
NR_mac_stats_t *stats = &UE->mac_stats; NR_mac_stats_t *stats = &UE->mac_stats;
// including ssb rsrp in mac stats // including ssb rsrp in mac stats
stats->cumul_rsrp += strongest_ssb_rsrp; stats->cumul_rsrp += rsrp_report->RSRP[0];
stats->num_rsrp_meas++; stats->num_rsrp_meas++;
} }
......
...@@ -523,16 +523,16 @@ struct CRI_RI_LI_PMI_CQI { ...@@ -523,16 +523,16 @@ struct CRI_RI_LI_PMI_CQI {
bool print_report; bool print_report;
}; };
typedef struct CRI_SSB_RSRP { typedef struct RSRP_report {
uint8_t nr_ssbri_cri; uint8_t nr_reports;
uint8_t CRI_SSBRI[MAX_NR_OF_REPORTED_RS]; uint8_t resource_id[MAX_NR_OF_REPORTED_RS];
uint8_t RSRP; int RSRP[MAX_NR_OF_REPORTED_RS];
uint8_t diff_RSRP[MAX_NR_OF_REPORTED_RS - 1]; } RSRP_report_t;
} CRI_SSB_RSRP_t;
struct CSI_Report { struct CSI_Report {
struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report; struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report;
struct CRI_SSB_RSRP ssb_cri_report; RSRP_report_t ssb_rsrp_report;
RSRP_report_t csirs_rsrp_report;
}; };
#define MAX_SR_BITLEN 8 #define MAX_SR_BITLEN 8
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment