mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 04:30:28 +00:00
With SC-FDMA, scheduler in uplink needs to schedule N_PRB=2^x3^y5^z
Signed-off-by: Calvin Peyron <calvin.peyron@open-cells.com>
This commit is contained in:
@@ -1733,6 +1733,21 @@ void RCconfig_nr_macrlc(configmodule_interface_t *cfg)
|
||||
else
|
||||
ul_bler_options->harq_round_max = *gpd(params, np, MACRLC_UL_HARQ_ROUND_MAX)->u8ptr;
|
||||
RC.nrmac[j]->min_grant_prb = *gpd(params, np, MACRLC_MIN_GRANT_PRB)->u16ptr;
|
||||
long sc_fdma = NR_PUSCH_Config__transformPrecoder_enabled;
|
||||
NR_BWP_UplinkCommon_t *bwp = RC.nrmac[j]->common_channels[0].ServingCellConfigCommon->uplinkConfigCommon->initialUplinkBWP;
|
||||
if (bwp->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
|
||||
sc_fdma = *bwp->rach_ConfigCommon->choice.setup->msg3_transformPrecoder;
|
||||
int new_min = check_sc_fdma_rbsize(sc_fdma, RC.nrmac[j]->min_grant_prb);
|
||||
// NR_PUSCH_Config__transformPrecoder_enabled = 0 | NR_PUSCH_Config__transformPrecoder_disabled = 1, so !uses_sc_fdma should
|
||||
// be used
|
||||
if (sc_fdma == NR_PUSCH_Config__transformPrecoder_enabled && RC.nrmac[j]->min_grant_prb != new_min) {
|
||||
LOG_W(NR_MAC,
|
||||
"min_rb value is set as %d. In SC-FDMA, it should be under format 2^x*3^y*5^z and has been automatically decreased "
|
||||
"to %d.\n",
|
||||
RC.nrmac[j]->min_grant_prb,
|
||||
new_min);
|
||||
RC.nrmac[j]->min_grant_prb = new_min;
|
||||
}
|
||||
RC.nrmac[j]->identity_pm = *gpd(params, np, MACRLC_IDENTITY_PM)->u8ptr;
|
||||
// PRB Blacklist
|
||||
uint16_t prbbl[MAX_BWP_SIZE] = {0};
|
||||
|
||||
@@ -678,18 +678,6 @@ bool update_rb_mcs_tbs(NR_sched_pdsch_t *pdsch, uint32_t num_total_bytes, uint16
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool multiple_2_3_5(int rb)
|
||||
{
|
||||
while (rb % 2 == 0)
|
||||
rb /= 2;
|
||||
while (rb % 3 == 0)
|
||||
rb /= 3;
|
||||
while (rb % 5 == 0)
|
||||
rb /= 5;
|
||||
|
||||
return (rb == 1);
|
||||
}
|
||||
|
||||
bool nr_find_nb_rb(uint16_t Qm,
|
||||
uint16_t R,
|
||||
long transform_precoding,
|
||||
@@ -702,10 +690,6 @@ bool nr_find_nb_rb(uint16_t Qm,
|
||||
uint32_t *tbs,
|
||||
uint16_t *nb_rb)
|
||||
{
|
||||
// for transform precoding only RB = 2^a_2 * 3^a_3 * 5^a_5 is allowed with a non-negative
|
||||
while (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled && !multiple_2_3_5(nb_rb_max))
|
||||
nb_rb_max--;
|
||||
|
||||
/* is the maximum (not even) enough? */
|
||||
*nb_rb = nb_rb_max;
|
||||
*tbs = nr_compute_tbs(Qm, R, *nb_rb, nb_symb_sch, nb_dmrs_prb, 0, 0, nrOfLayers) >> 3;
|
||||
@@ -727,11 +711,6 @@ bool nr_find_nb_rb(uint16_t Qm,
|
||||
int hi = nb_rb_max;
|
||||
int lo = nb_rb_min;
|
||||
for (int p = (hi + lo) / 2; lo + 1 < hi; p = (hi + lo) / 2) {
|
||||
// for transform precoding only RB = 2^a_2 * 3^a_3 * 5^a_5 is allowed with a non-negative
|
||||
while(transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled &&
|
||||
!multiple_2_3_5(p))
|
||||
p++;
|
||||
|
||||
// If by increasing p for transform precoding we already hit the high, break to avoid infinite loop
|
||||
if (p == hi)
|
||||
break;
|
||||
|
||||
@@ -14,9 +14,33 @@
|
||||
#include <openair2/UTIL/OPT/opt.h>
|
||||
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
|
||||
static const uint16_t NR_TRANSFORM_PRECODE_RB_LUT[274] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 6, 8, 9, 10, 10, 12, 12, 12, 15, 16, 16, 18, 18, 20, 20, 20, 20, 24,
|
||||
25, 25, 27, 27, 27, 30, 30, 32, 32, 32, 32, 36, 36, 36, 36, 40, 40, 40, 40, 40, 45, 45, 45, 48, 48,
|
||||
50, 50, 50, 50, 54, 54, 54, 54, 54, 54, 60, 60, 60, 60, 64, 64, 64, 64, 64, 64, 64, 64, 72, 72, 72,
|
||||
75, 75, 75, 75, 75, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 90, 90, 90, 90, 90, 90, 96, 96, 96, 96,
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 120, 120, 120, 120, 120,
|
||||
125, 125, 125, 128, 128, 128, 128, 128, 128, 128, 135, 135, 135, 135, 135, 135, 135, 135, 135, 144, 144, 144, 144, 144, 144,
|
||||
150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 160, 160, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
|
||||
162, 162, 162, 162, 162, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 192, 192, 192, 192, 192, 192, 192, 192,
|
||||
200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 216, 216, 216, 216, 216, 216, 216, 216, 216,
|
||||
225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 240, 240, 240, 243, 243, 243, 243, 243, 243, 243,
|
||||
250, 250, 250, 250, 250, 250, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 270, 270, 270, 270};
|
||||
|
||||
//#define SRS_IND_DEBUG
|
||||
#define MAX_NUM_DATA_IND 1024
|
||||
|
||||
// With SC-FDMA the scheduler in uplink needs to schedule N_PRB=2^x3^y5^z
|
||||
// Check 6.3.1.4 of 38.211
|
||||
int check_sc_fdma_rbsize(long transform_precoding, uint16_t rb)
|
||||
{
|
||||
DevAssert(rb < 274);
|
||||
if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) {
|
||||
return NR_TRANSFORM_PRECODE_RB_LUT[rb];
|
||||
}
|
||||
return rb;
|
||||
}
|
||||
|
||||
/* \brief Get the number of UL TDAs that could be used in slot, reachable
|
||||
* via specific k2. The output parameter first_idx is a pointer to the first
|
||||
* suitable TDA, and the function returns the number of suitable TDAs, or 0. */
|
||||
@@ -1760,11 +1784,11 @@ static int apply_ul_retransmission(gNB_MAC_INST *nrmac,
|
||||
} else {
|
||||
/* TDA changed vs original retx: recompute DMRS and TB size for new TDA */
|
||||
NR_pusch_dmrs_t dmrs_info = get_ul_dmrs_params(scc, current_BWP, tda_info, nrOfLayers);
|
||||
new_sched.rbSize = cand->sched_pusch.rbSize;
|
||||
new_sched.rbSize = check_sc_fdma_rbsize(current_BWP->transform_precoding, cand->sched_pusch.rbSize);
|
||||
new_sched.rbStart = cand->sched_pusch.rbStart;
|
||||
new_sched.tb_size = nr_compute_tbs(retInfo->Qm,
|
||||
retInfo->R,
|
||||
cand->sched_pusch.rbSize,
|
||||
new_sched.rbSize,
|
||||
tda_info->nrOfSymbols,
|
||||
dmrs_info.N_PRB_DMRS * dmrs_info.num_dmrs_symb,
|
||||
0,
|
||||
@@ -1819,6 +1843,7 @@ static int apply_ul_new_transmission(gNB_MAC_INST *nrmac,
|
||||
* time_domain_allocation, tda_info already set by pipeline stages).
|
||||
* Fill remaining dispatch fields: R, Qm, tb_size, dmrs_info, bwp_info. */
|
||||
NR_sched_pusch_t sched = cand->sched_pusch;
|
||||
sched.rbSize = check_sc_fdma_rbsize(current_BWP->transform_precoding, sched.rbSize);
|
||||
sched.frame = sched_frame;
|
||||
sched.slot = sched_slot;
|
||||
sched.ul_harq_pid = -1;
|
||||
@@ -2625,6 +2650,7 @@ bool nr_ul_check_phr(const nr_ul_sched_params_t *params,
|
||||
pot.dmrs_info = dmrs_info;
|
||||
pot.nrOfLayers = cand->sched_pusch.nrOfLayers;
|
||||
pot.rbSize = rbSize;
|
||||
pot.rbSize = check_sc_fdma_rbsize(current_BWP->transform_precoding, pot.rbSize);
|
||||
pot.mcs = mcs;
|
||||
|
||||
uint16_t R;
|
||||
@@ -2646,8 +2672,9 @@ bool nr_ul_check_phr(const nr_ul_sched_params_t *params,
|
||||
NR_sched_pusch_t p1 = pot;
|
||||
int tp = tx_power;
|
||||
|
||||
while (cand->ph < tp && p1.rbSize > params->min_rb) {
|
||||
p1.rbSize--;
|
||||
while (cand->ph < tp && p1.rbSize > params->min_rb
|
||||
&& check_sc_fdma_rbsize(current_BWP->transform_precoding, p1.rbSize - 1) >= params->min_rb) {
|
||||
p1.rbSize = check_sc_fdma_rbsize(current_BWP->transform_precoding, --p1.rbSize);
|
||||
p1.tb_size = nr_compute_tbs(p1.Qm, p1.R, p1.rbSize, p1.tda_info.nrOfSymbols, n_dmrs, 0, 0, p1.nrOfLayers) >> 3;
|
||||
tp = compute_ph_rb_factor(current_BWP->scs, p1.rbSize) + (hasDeltaMCS ? compute_ph_mcs_factor(&p1) : 0);
|
||||
}
|
||||
|
||||
@@ -89,6 +89,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, slot_t slot, nfapi_
|
||||
/* \brief default UL preprocessor */
|
||||
void nr_ulsch_preprocessor(gNB_MAC_INST *nr_mac, post_process_pusch_t *pp_pusch);
|
||||
|
||||
int check_sc_fdma_rbsize(long transform_precoding, uint16_t rb);
|
||||
|
||||
void nr_mac_pcch_queue_init(NR_COMMON_channels_t *cc);
|
||||
void nr_mac_pcch_queue_free(NR_COMMON_channels_t *cc);
|
||||
void nr_mac_pcch_enqueue(module_id_t module_id, uint64_t fiveg_s_tmsi, uint16_t ue_id);
|
||||
|
||||
Reference in New Issue
Block a user