Use k2 to decide which TDA to use
For scheduling multiple ULSCH ahead, we will have to use different k2. Hence, we will need to check for k2 in the TDA selection as well. The function get_ul_tda() is renamed to get_num_ul_tda() to reflect that it might return multiple TDAs (not done in this commit, but in a follow-up MR). get_num_ul_tda() also returns a pointer to the first suitable TDA. In the phy-test scheduler, simplify the selection of the TDA to use: do not hardcode a specific K2, but rather, use the first one (with any k2).
This commit is contained in:
@@ -804,9 +804,9 @@ static void config_sched_ctrlCommon(gNB_MAC_INST *nr_mac)
|
||||
/**
|
||||
* \brief Initializes the UL TDA information at the scheduler, as used for
|
||||
* every UE in UL. This just copies the information from the SCC into a smaller
|
||||
* list. Note that this list should not be modified, as get_ul_tda() and
|
||||
* nr_rrc_config_ul_tda() are designed to work in sync (get_ul_tda() assumes an
|
||||
* ordering, output by nr_rrc_config_ul_tda()).
|
||||
* list. Note that this list should not be modified, as get_num_ul_tda() and
|
||||
* nr_rrc_config_ul_tda() are designed to work in sync (get_num_ul_tda()
|
||||
* assumes an ordering, output by nr_rrc_config_ul_tda()).
|
||||
*/
|
||||
static void init_ul_tda_info(const NR_PUSCH_TimeDomainResourceAllocationList_t *l, seq_arr_t *sa_tda)
|
||||
{
|
||||
|
||||
@@ -239,26 +239,19 @@ void nr_ul_preprocessor_phytest(gNB_MAC_INST *nr_mac, post_process_pusch_t *pp_p
|
||||
uint16_t rbStart = 0;
|
||||
uint16_t rbSize = min(bw, target_ul_bw);
|
||||
|
||||
NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList = get_ul_tdalist(ul_bwp,
|
||||
sched_ctrl->coreset->controlResourceSetId,
|
||||
sched_ctrl->search_space->searchSpaceType->present,
|
||||
TYPE_C_RNTI_);
|
||||
const int temp_tda = get_ul_tda(nr_mac, frame, slot);
|
||||
if (temp_tda < 0)
|
||||
return;
|
||||
AssertFatal(temp_tda < tdaList->list.count, "time domain assignment %d >= %d\n", temp_tda, tdaList->list.count);
|
||||
const int mu = ul_bwp->scs;
|
||||
int K2 = get_K2(tdaList, temp_tda, mu, scc);
|
||||
DevAssert(seq_arr_size(&nr_mac->ul_tda) > 0);
|
||||
const int tda = 0;
|
||||
NR_tda_info_t tda_info = get_ul_tda_info(ul_bwp,
|
||||
sched_ctrl->coreset->controlResourceSetId,
|
||||
sched_ctrl->search_space->searchSpaceType->present,
|
||||
TYPE_C_RNTI_,
|
||||
tda);
|
||||
DevAssert(tda_info.valid_tda);
|
||||
|
||||
int K2 = tda_info.k2 + get_NTN_Koffset(scc);
|
||||
int slots_frame = nr_mac->frame_structure.numb_slots_frame;
|
||||
const int sched_frame = (frame + (slot + K2) / slots_frame) % MAX_FRAME_NUMBER;
|
||||
const int sched_slot = (slot + K2) % slots_frame;
|
||||
const int tda = get_ul_tda(nr_mac, sched_frame, sched_slot);
|
||||
if (tda < 0)
|
||||
return;
|
||||
AssertFatal(tda < tdaList->list.count,
|
||||
"time domain assignment %d >= %d\n",
|
||||
tda,
|
||||
tdaList->list.count);
|
||||
|
||||
/* check if slot is UL, and that slot is 8 (assuming K2=6 because of UE
|
||||
* limitations). Note that if K2 or the TDD configuration is changed, below
|
||||
@@ -267,14 +260,6 @@ void nr_ul_preprocessor_phytest(gNB_MAC_INST *nr_mac, post_process_pusch_t *pp_p
|
||||
if (!is_xlsch_in_slot(ulsch_slot_bitmap, slot_period))
|
||||
return;
|
||||
|
||||
NR_tda_info_t tda_info = get_ul_tda_info(ul_bwp,
|
||||
sched_ctrl->coreset->controlResourceSetId,
|
||||
sched_ctrl->search_space->searchSpaceType->present,
|
||||
TYPE_C_RNTI_,
|
||||
tda);
|
||||
if (!tda_info.valid_tda)
|
||||
return;
|
||||
|
||||
// TODO implement beam procedures for phy-test mode
|
||||
int beam = 0;
|
||||
|
||||
|
||||
@@ -38,9 +38,10 @@
|
||||
|
||||
//#define SRS_IND_DEBUG
|
||||
|
||||
/* \brief Get the UL TDA for given frame and slot. It identifies the index of
|
||||
* TDA in the TDA list, as hardcoded in nr_rrc_config_ul_tda(). */
|
||||
int get_ul_tda(gNB_MAC_INST *nrmac, int frame, int slot)
|
||||
/* \brief Get the number of UL TDAs that could be used in frame and 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. */
|
||||
int get_num_ul_tda(gNB_MAC_INST *nrmac, int frame, int slot, int k2, const NR_tda_info_t **first_idx)
|
||||
{
|
||||
/* we assume that this function is mutex-protected from outside */
|
||||
NR_SCHED_ENSURE_LOCKED(&nrmac->sched_lock);
|
||||
@@ -48,23 +49,34 @@ int get_ul_tda(gNB_MAC_INST *nrmac, int frame, int slot)
|
||||
/* there is a mixed slot only when in TDD */
|
||||
frame_structure_t *fs = &nrmac->frame_structure;
|
||||
|
||||
/* TODO: we assume currently that all UL TDA have same k2, check below */
|
||||
NR_tda_info_t *tda_info = seq_arr_at(&nrmac->ul_tda, 0);
|
||||
if (!tda_info->valid_tda || tda_info->k2 != k2)
|
||||
return 0;
|
||||
|
||||
if (fs->frame_type == TDD) {
|
||||
// if there is uplink symbols in mixed slot
|
||||
int s = get_slot_idx_in_period(slot, fs);
|
||||
tdd_bitmap_t *tdd_slot_bitmap = fs->period_cfg.tdd_slot_bitmap;
|
||||
if ((tdd_slot_bitmap[s].num_ul_symbols > 1) && is_mixed_slot(s, fs)) {
|
||||
return 2; // mixed slot, all symbols of mixed minus last
|
||||
*first_idx = seq_arr_at(&nrmac->ul_tda, 2); // mixed slot, all symbols of mixed minus last
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Avoid slots with the SRS
|
||||
UE_iterator(nrmac->UE_info.connected_ue_list, UE) {
|
||||
NR_sched_srs_t sched_srs = UE->UE_sched_ctrl.sched_srs;
|
||||
if(sched_srs.srs_scheduled && sched_srs.frame == frame && sched_srs.slot == slot)
|
||||
return 1; // symbols 0--12
|
||||
if(sched_srs.srs_scheduled && sched_srs.frame == frame && sched_srs.slot == slot) {
|
||||
*first_idx = seq_arr_at(&nrmac->ul_tda, 1); // symbols 0--12
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0; // symbols 0--13, // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots)
|
||||
// symbols 0--13, if FDD or not mixed slot in TDD, for now use default TDA
|
||||
// (TODO handle CSI-RS slots)
|
||||
*first_idx = seq_arr_at(&nrmac->ul_tda, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
bwp_info_t get_pusch_bwp_start_size(NR_UE_info_t *UE)
|
||||
@@ -2552,10 +2564,13 @@ static void nr_ulsch_preprocessor(gNB_MAC_INST *nr_mac, post_process_pusch_t *pp
|
||||
// FAPI cannot handle more than MAX_DCI_CORESET DCIs
|
||||
max_sched_ues = min(max_sched_ues, MAX_DCI_CORESET);
|
||||
|
||||
int tda = get_ul_tda(nr_mac, sched_frame, sched_slot);
|
||||
const NR_tda_info_t *tda_info = NULL;
|
||||
int n_tda = get_num_ul_tda(nr_mac, sched_frame, sched_slot, nr_mac->radio_config.minRXTXTIME, &tda_info);
|
||||
DevAssert(n_tda == 1);
|
||||
int tda = seq_arr_dist(&nr_mac->ul_tda, seq_arr_front(&nr_mac->ul_tda), tda_info);
|
||||
AssertFatal(tda >= 0 && tda < 16, "illegal TDA index %d\n", tda);
|
||||
/* TODO: iterate over all available UL slots if there are more than DL */
|
||||
/* the following supposes that the TDA is the same across all BWPs */
|
||||
NR_tda_info_t *tda_info = seq_arr_at(&nr_mac->ul_tda, tda);
|
||||
|
||||
int len[num_beams];
|
||||
for (int i = 0; i < num_beams; i++)
|
||||
|
||||
@@ -417,7 +417,7 @@ void free_sched_pucch_list(NR_UE_sched_ctrl_t *sched_ctrl);
|
||||
bool add_UE_to_list(int list_size, NR_UE_info_t *list[list_size], NR_UE_info_t *UE);
|
||||
NR_UE_info_t *remove_UE_from_list(int list_size, NR_UE_info_t *list[list_size], rnti_t rnti);
|
||||
int get_dl_tda(const gNB_MAC_INST *nrmac, int slot);
|
||||
int get_ul_tda(gNB_MAC_INST *nrmac, int frame, int slot);
|
||||
int get_num_ul_tda(gNB_MAC_INST *nrmac, int frame, int slot, int k2, const NR_tda_info_t **first_idx);
|
||||
|
||||
int get_cce_index(const gNB_MAC_INST *nrmac,
|
||||
const int CC_id,
|
||||
|
||||
Reference in New Issue
Block a user