Merge remote-tracking branch 'origin/phr_handling_for_develop' into integration_2024_w21c
This commit is contained in:
@@ -2667,9 +2667,12 @@ void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti)
|
||||
delete_nr_ue_data(UE, nr_mac->common_channels, &UE_info->uid_allocator);
|
||||
}
|
||||
|
||||
uint8_t nr_get_tpc(int target, int snrx10, int incr)
|
||||
// all values passed to this function are in dB x10
|
||||
uint8_t nr_get_tpc(int target, uint8_t cqi, int incr, int tx_power)
|
||||
{
|
||||
// all values passed to this function are in dB x10
|
||||
// al values passed to this function are x10
|
||||
int snrx10 = (cqi * 5) - 640 - (tx_power * 10);
|
||||
LOG_D(NR_MAC, "tpc : target %d, cqi %d, snrx10 %d, tx_power %d\n", target, ((int)cqi * 5) - 640, snrx10, tx_power);
|
||||
if (snrx10 > target + incr) return 0; // decrease 1dB
|
||||
if (snrx10 < target - (3*incr)) return 3; // increase 3dB
|
||||
if (snrx10 < target - incr) return 2; // increase 1dB
|
||||
|
||||
@@ -1044,7 +1044,7 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
|
||||
// tpc (power control) only if we received AckNack
|
||||
if (uci_01->harq.harq_confidence_level == 0 && uci_01->ul_cqi != 0xff) {
|
||||
sched_ctrl->pucch_snrx10 = uci_01->ul_cqi * 5 - 640;
|
||||
sched_ctrl->tpc1 = nr_get_tpc(nrmac->pucch_target_snrx10, sched_ctrl->pucch_snrx10, 30);
|
||||
sched_ctrl->tpc1 = nr_get_tpc(nrmac->pucch_target_snrx10, uci_01->ul_cqi, 30, 0);
|
||||
} else
|
||||
sched_ctrl->tpc1 = 1;
|
||||
}
|
||||
@@ -1087,7 +1087,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
|
||||
// TODO PUCCH2 SNR computation is not correct -> ignore the following
|
||||
if (uci_234->ul_cqi != 0xff) {
|
||||
sched_ctrl->pucch_snrx10 = uci_234->ul_cqi * 5 - 640;
|
||||
sched_ctrl->tpc1 = nr_get_tpc(nrmac->pucch_target_snrx10, sched_ctrl->pucch_snrx10, 30);
|
||||
sched_ctrl->tpc1 = nr_get_tpc(nrmac->pucch_target_snrx10, uci_234->ul_cqi, 30, 0);
|
||||
}
|
||||
|
||||
// TODO: handle SR
|
||||
|
||||
@@ -85,22 +85,30 @@ int get_ul_tda(gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int
|
||||
return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots)
|
||||
}
|
||||
|
||||
static int compute_ph_factor(int mu, int tbs_bits, int rb, int n_layers, int n_symbols, int n_dmrs, long *deltaMCS)
|
||||
static int compute_ph_factor(int mu, int tbs_bits, int rb, int n_layers, int n_symbols, int n_dmrs, long *deltaMCS, bool include_bw)
|
||||
{
|
||||
// 38.213 7.1.1
|
||||
// if the PUSCH transmission is over more than one layer delta_tf = 0
|
||||
int delta_tf = 0;
|
||||
float delta_tf = 0;
|
||||
if(deltaMCS != NULL && n_layers == 1) {
|
||||
const int n_re = (NR_NB_SC_PER_RB * n_symbols - n_dmrs) * rb;
|
||||
const float BPRE = (float) tbs_bits/n_re; //TODO change for PUSCH with CSI
|
||||
const float f = pow(2, BPRE * 1.25);
|
||||
const float beta = 1.0f; //TODO change for PUSCH with CSI
|
||||
delta_tf = (10 * log10((f - 1) * beta));
|
||||
LOG_D(NR_MAC,
|
||||
"PH factor delta_tf %f (n_re %d, n_rb %d, n_dmrs %d, n_symbols %d, tbs %d BPRE %f f %f)\n",
|
||||
delta_tf,
|
||||
n_re,
|
||||
rb,
|
||||
n_dmrs,
|
||||
n_symbols,
|
||||
tbs_bits,
|
||||
BPRE,
|
||||
f);
|
||||
}
|
||||
|
||||
const int bw_factor = 10 * log10(rb << mu);
|
||||
|
||||
return (delta_tf + bw_factor);
|
||||
const float bw_factor = (include_bw) ? 10 * log10(rb << mu) : 0;
|
||||
return ((int)roundf(delta_tf + bw_factor));
|
||||
}
|
||||
|
||||
// For both UL-SCH except:
|
||||
@@ -280,14 +288,16 @@ static int nr_process_mac_pdu(instance_t module_idP,
|
||||
PH = phr->PH - 32 + (phr->PH - 54);
|
||||
// in sched_ctrl we set normalized PH wrt MCS and PRBs
|
||||
long *deltaMCS = ul_bwp->pusch_Config ? ul_bwp->pusch_Config->pusch_PowerControl->deltaMCS : NULL;
|
||||
sched_ctrl->ph = PH +
|
||||
compute_ph_factor(ul_bwp->scs,
|
||||
sched_pusch->tb_size<<3,
|
||||
sched_pusch->rbSize,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols, //n_symbols
|
||||
sched_pusch->dmrs_info.num_dmrs_symb*sched_pusch->dmrs_info.N_PRB_DMRS, //n_dmrs
|
||||
deltaMCS);
|
||||
sched_ctrl->ph = PH
|
||||
+ compute_ph_factor(ul_bwp->scs,
|
||||
sched_pusch->tb_size << 3,
|
||||
sched_pusch->rbSize,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols, // n_symbols
|
||||
sched_pusch->dmrs_info.num_dmrs_symb * sched_pusch->dmrs_info.N_PRB_DMRS, // n_dmrs
|
||||
deltaMCS,
|
||||
true);
|
||||
sched_ctrl->ph0 = PH;
|
||||
/* 38.133 Table10.1.18.1-1 */
|
||||
sched_ctrl->pcmax = PCMAX - 29;
|
||||
LOG_D(NR_MAC, "SINGLE ENTRY PHR R1 %d PH %d (%d dB) R2 %d PCMAX %d (%d dBm)\n",
|
||||
@@ -628,15 +638,38 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
rssi);
|
||||
|
||||
// if not missed detection (10dB threshold for now)
|
||||
if (rssi>0) {
|
||||
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
|
||||
if (ul_cqi != 0xff) {
|
||||
UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10, UE_scheduling_control->pusch_snrx10, 30);
|
||||
}
|
||||
if (rssi > 0) {
|
||||
int txpower_calc = UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.phr_txpower_calc;
|
||||
UE->mac_stats.deltaMCS = txpower_calc;
|
||||
UE->mac_stats.NPRB = UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.rbSize;
|
||||
if (ul_cqi != 0xff)
|
||||
UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10, ul_cqi, 30, txpower_calc);
|
||||
if (UE_scheduling_control->ph < 0 && UE_scheduling_control->tpc0 > 1)
|
||||
UE_scheduling_control->tpc0 = 1;
|
||||
|
||||
if (timing_advance != 0xffff)
|
||||
UE_scheduling_control->ta_update = timing_advance;
|
||||
UE_scheduling_control->raw_rssi = rssi;
|
||||
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640 - (txpower_calc * 10);
|
||||
|
||||
if (UE_scheduling_control->tpc0 > 1)
|
||||
LOG_D(NR_MAC,
|
||||
"[UE %04x] %d.%d. PUSCH TPC %d and TA %d pusch_snrx10 %d rssi %d phrx_tx_power %d PHR (1PRB) %d mcs %d, nb_rb %d\n",
|
||||
UE->rnti,
|
||||
frameP,
|
||||
slotP,
|
||||
UE_scheduling_control->tpc0,
|
||||
UE_scheduling_control->ta_update,
|
||||
UE_scheduling_control->pusch_snrx10,
|
||||
UE_scheduling_control->raw_rssi,
|
||||
txpower_calc,
|
||||
UE_scheduling_control->ph,
|
||||
UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.mcs,
|
||||
UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.rbSize);
|
||||
|
||||
NR_UE_ul_harq_t *cur_harq = &UE_scheduling_control->ul_harq_processes[harq_pid];
|
||||
if (cur_harq->round == 0)
|
||||
UE->mac_stats.pusch_snrx10 = UE_scheduling_control->pusch_snrx10;
|
||||
LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
|
||||
}
|
||||
else{
|
||||
@@ -764,10 +797,9 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
ra->rnti);
|
||||
|
||||
NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
|
||||
|
||||
if (ul_cqi != 0xff) {
|
||||
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
|
||||
UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10, UE_scheduling_control->pusch_snrx10, 30);
|
||||
UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10, ul_cqi, 30, UE_scheduling_control->sched_pusch.phr_txpower_calc);
|
||||
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640 - UE_scheduling_control->sched_pusch.phr_txpower_calc * 10;
|
||||
}
|
||||
if (timing_advance != 0xffff)
|
||||
UE_scheduling_control->ta_update = timing_advance;
|
||||
@@ -780,7 +812,6 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
reset_ul_harq_list(UE_scheduling_control);
|
||||
nr_clear_ra_proc(ra);
|
||||
process_CellGroup(ra->CellGroup, UE);
|
||||
|
||||
} else {
|
||||
LOG_A(NR_MAC, "[RAPROC] RA-Msg3 received (sdu_lenP %d)\n", sdu_lenP);
|
||||
LOG_D(NR_MAC, "[RAPROC] Received Msg3:\n");
|
||||
@@ -1458,13 +1489,21 @@ static void nr_ue_max_mcs_min_rb(int mu,
|
||||
update_ul_ue_R_Qm(*mcs, ul_bwp->mcs_table, ul_bwp->pusch_Config, &R, &Qm);
|
||||
|
||||
long *deltaMCS = ul_bwp->pusch_Config ? ul_bwp->pusch_Config->pusch_PowerControl->deltaMCS : NULL;
|
||||
tbs_bits = nr_compute_tbs(Qm, R, *Rb,
|
||||
sched_pusch->tda_info.nrOfSymbols,
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
0, // nb_rb_oh
|
||||
0,
|
||||
sched_pusch->nrOfLayers);
|
||||
|
||||
int tx_power = compute_ph_factor(mu,
|
||||
tbs_bits,
|
||||
*Rb,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols,
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS*sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS);
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS,
|
||||
true);
|
||||
|
||||
while (ph_limit < tx_power && *Rb > minRb) {
|
||||
(*Rb)--;
|
||||
@@ -1479,8 +1518,10 @@ static void nr_ue_max_mcs_min_rb(int mu,
|
||||
*Rb,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols,
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS*sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS);
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS,
|
||||
true);
|
||||
LOG_D(NR_MAC, "Checking %d RBs, MCS %d, ph_limit %d, tx_power %d\n",*Rb,*mcs,ph_limit,tx_power);
|
||||
}
|
||||
|
||||
while (ph_limit < tx_power && *mcs > 0) {
|
||||
@@ -1497,8 +1538,10 @@ static void nr_ue_max_mcs_min_rb(int mu,
|
||||
*Rb,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols,
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS*sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS);
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS,
|
||||
true);
|
||||
LOG_D(NR_MAC, "Checking %d RBs, MCS %d, ph_limit %d, tx_power %d\n",*Rb,*mcs,ph_limit,tx_power);
|
||||
}
|
||||
|
||||
if (ph_limit < tx_power)
|
||||
@@ -1667,7 +1710,7 @@ static void pf_ul(module_id_t module_id,
|
||||
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
|
||||
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
|
||||
|
||||
const int min_rb = 5;
|
||||
const int min_rb = nrmac->min_grant_prb;
|
||||
// UEs that could be scheduled
|
||||
UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0};
|
||||
int remainUEs = max_num_ue;
|
||||
@@ -1743,9 +1786,10 @@ static void pf_ul(module_id_t module_id,
|
||||
const int max_mcs = min(bo->max_mcs, max_mcs_table); /* no per-user maximum MCS yet */
|
||||
if (bo->harq_round_max == 1)
|
||||
sched_pusch->mcs = max_mcs;
|
||||
else
|
||||
else {
|
||||
sched_pusch->mcs = get_mcs_from_bler(bo, stats, &sched_ctrl->ul_bler_stats, max_mcs, frame);
|
||||
|
||||
LOG_D(NR_MAC,"%d.%d starting mcs %d bleri %f\n",frame,slot,sched_pusch->mcs,sched_ctrl->ul_bler_stats.bler);
|
||||
}
|
||||
/* Schedule UE on SR or UL inactivity and no data (otherwise, will be scheduled
|
||||
* based on data to transmit) */
|
||||
if (B == 0 && do_sched) {
|
||||
@@ -1814,6 +1858,25 @@ static void pf_ul(module_id_t module_id,
|
||||
0, // nb_rb_oh
|
||||
0,
|
||||
sched_pusch->nrOfLayers) >> 3;
|
||||
long *deltaMCS = current_BWP->pusch_Config ? current_BWP->pusch_Config->pusch_PowerControl->deltaMCS : NULL;
|
||||
|
||||
sched_pusch->phr_txpower_calc = compute_ph_factor(current_BWP->scs,
|
||||
sched_pusch->tb_size << 3,
|
||||
sched_pusch->rbSize,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols,
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS,
|
||||
false);
|
||||
LOG_D(NR_MAC,
|
||||
"pf_ul %d.%d UE %x Scheduling PUSCH (no data) nrb %d mcs %d tbs %d bits phr_txpower %d\n",
|
||||
frame,
|
||||
slot,
|
||||
UE->rnti,
|
||||
sched_pusch->rbSize,
|
||||
sched_pusch->mcs,
|
||||
sched_pusch->tb_size << 3,
|
||||
sched_pusch->phr_txpower_calc);
|
||||
|
||||
/* Mark the corresponding RBs as used */
|
||||
n_rb_sched -= sched_pusch->rbSize;
|
||||
@@ -1930,6 +1993,19 @@ static void pf_ul(module_id_t module_id,
|
||||
&TBS,
|
||||
&rbSize);
|
||||
|
||||
// Calacualte the normalized tx_power for PHR
|
||||
long *deltaMCS = current_BWP->pusch_Config ? current_BWP->pusch_Config->pusch_PowerControl->deltaMCS : NULL;
|
||||
int tbs_bits = TBS << 3;
|
||||
|
||||
sched_pusch->phr_txpower_calc = compute_ph_factor(current_BWP->scs,
|
||||
tbs_bits,
|
||||
rbSize,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols,
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS,
|
||||
false);
|
||||
|
||||
sched_pusch->rbSize = rbSize;
|
||||
sched_pusch->tb_size = TBS;
|
||||
LOG_D(NR_MAC,"rbSize %d (max_rbSize %d), TBS %d, est buf %d, sched_ul %d, B %d, CCE %d, num_dmrs_symb %d, N_PRB_DMRS %d\n",
|
||||
@@ -2324,6 +2400,19 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n
|
||||
|
||||
pusch_pdu->maintenance_parms_v3.ldpcBaseGraph = get_BG(sched_pusch->tb_size<<3,sched_pusch->R);
|
||||
|
||||
// Calacualte the normalized tx_power for PHR
|
||||
long *deltaMCS = current_BWP->pusch_Config ? current_BWP->pusch_Config->pusch_PowerControl->deltaMCS : NULL;
|
||||
int tbs_bits = pusch_pdu->pusch_data.tb_size << 3;
|
||||
|
||||
sched_pusch->phr_txpower_calc = compute_ph_factor(current_BWP->scs,
|
||||
tbs_bits,
|
||||
sched_pusch->rbSize,
|
||||
sched_pusch->nrOfLayers,
|
||||
sched_pusch->tda_info.nrOfSymbols,
|
||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||
deltaMCS,
|
||||
false);
|
||||
|
||||
NR_UE_ServingCell_Info_t *sc_info = &UE->sc_info;
|
||||
if (sc_info->rateMatching_PUSCH) {
|
||||
// TBS_LBRM according to section 5.4.2.1 of 38.212
|
||||
|
||||
@@ -273,7 +273,7 @@ NR_pusch_dmrs_t get_ul_dmrs_params(const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_tda_info_t *tda_info,
|
||||
const int Layers);
|
||||
|
||||
uint8_t nr_get_tpc(int target, int snrx10, int incr);
|
||||
uint8_t nr_get_tpc(int target, uint8_t cqi, int incr, int tx_power);
|
||||
|
||||
int get_spf(nfapi_nr_config_request_scf_t *cfg);
|
||||
|
||||
|
||||
@@ -156,15 +156,24 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset
|
||||
for (int i = 1; i < gNB->ul_bler.harq_round_max; i++)
|
||||
output += snprintf(output, end - output, "/%"PRIu64, stats->ul.rounds[i]);
|
||||
|
||||
char deltaMCS_str[100]="\0";
|
||||
|
||||
if (UE->current_UL_BWP.pusch_Config && UE->current_UL_BWP.pusch_Config->pusch_PowerControl->deltaMCS) {
|
||||
sprintf(deltaMCS_str,"deltaMCS %d\n",UE->mac_stats.deltaMCS);
|
||||
}
|
||||
output += snprintf(output,
|
||||
end - output,
|
||||
", ulsch_errors %"PRIu64", ulsch_DTX %d, BLER %.5f MCS (%d) %d\n",
|
||||
", ulsch_errors %"PRIu64", ulsch_DTX %d, BLER %.5f MCS (%d) %d (Qm %d %s dB) NPRB %d SNR %d.%d dB\n",
|
||||
stats->ul.errors,
|
||||
stats->ulsch_DTX,
|
||||
sched_ctrl->ul_bler_stats.bler,
|
||||
UE->current_UL_BWP.mcs_table,
|
||||
sched_ctrl->ul_bler_stats.mcs);
|
||||
|
||||
sched_ctrl->ul_bler_stats.mcs,
|
||||
nr_get_Qm_ul(sched_ctrl->ul_bler_stats.mcs,UE->current_UL_BWP.mcs_table),
|
||||
deltaMCS_str,
|
||||
UE->mac_stats.NPRB,
|
||||
sched_ctrl->pusch_snrx10 / 10,
|
||||
sched_ctrl->pusch_snrx10 % 10);
|
||||
output += snprintf(output,
|
||||
end - output,
|
||||
"UE %04x: MAC: TX %14"PRIu64" RX %14"PRIu64" bytes\n",
|
||||
|
||||
@@ -135,6 +135,8 @@ typedef struct nr_mac_config_t {
|
||||
int do_CSIRS;
|
||||
int do_SRS;
|
||||
bool force_256qam_off;
|
||||
bool force_UL256qam_off;
|
||||
bool use_deltaMCS;
|
||||
//int pusch_TargetSNRx10;
|
||||
//int pucch_TargetSNRx10;
|
||||
} nr_mac_config_t;
|
||||
@@ -383,6 +385,7 @@ typedef struct NR_sched_pusch {
|
||||
int time_domain_allocation;
|
||||
NR_tda_info_t tda_info;
|
||||
NR_pusch_dmrs_t dmrs_info;
|
||||
int phr_txpower_calc;
|
||||
} NR_sched_pusch_t;
|
||||
|
||||
typedef struct NR_sched_srs {
|
||||
@@ -551,6 +554,9 @@ typedef struct {
|
||||
|
||||
/// PHR info: power headroom level (dB)
|
||||
int ph;
|
||||
/// PHR info: power headroom level (dB) for 1 PRB
|
||||
int ph0;
|
||||
|
||||
/// PHR info: nominal UE transmit power levels (dBm)
|
||||
int pcmax;
|
||||
|
||||
@@ -649,6 +655,9 @@ typedef struct NR_mac_stats {
|
||||
int cumul_rsrp;
|
||||
uint8_t num_rsrp_meas;
|
||||
char srs_stats[50]; // Statistics may differ depending on SRS usage
|
||||
int pusch_snrx10;
|
||||
int deltaMCS;
|
||||
int NPRB;
|
||||
} NR_mac_stats_t;
|
||||
|
||||
typedef struct NR_bler_options {
|
||||
|
||||
Reference in New Issue
Block a user