Merge remote-tracking branch 'origin/autumatic_sib1_tda' into integration_2025_w52 (!3641)
automatic selection of SIB1 TDA
This commit is contained in:
@@ -255,7 +255,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, slot_t slotP, nfapi
|
||||
}
|
||||
}
|
||||
|
||||
static void update_rb_mcs_tbs(NR_sched_pdsch_t *pdsch, uint32_t num_total_bytes, uint16_t *vrb_map)
|
||||
static bool update_rb_mcs_tbs(NR_sched_pdsch_t *pdsch, uint32_t num_total_bytes, uint16_t *vrb_map)
|
||||
{
|
||||
const NR_tda_info_t *tda_info = &pdsch->tda_info;
|
||||
|
||||
@@ -296,12 +296,15 @@ static void update_rb_mcs_tbs(NR_sched_pdsch_t *pdsch, uint32_t num_total_bytes,
|
||||
break;
|
||||
}
|
||||
}
|
||||
AssertFatal(pdsch->tb_size >= num_total_bytes,
|
||||
"Couldn't allocate enough resources for %d bytes in SIB PDSCH (rbStart %d, rbSize %d, bwpSize %d)\n",
|
||||
num_total_bytes,
|
||||
pdsch->rbStart,
|
||||
pdsch->rbSize,
|
||||
bwpSize);
|
||||
if (pdsch->tb_size < num_total_bytes) {
|
||||
LOG_D(NR_MAC,
|
||||
"Couldn't allocate enough resources for %d bytes in SIB PDSCH (rbStart %d, rbSize %d, bwpSize %d)\n",
|
||||
num_total_bytes,
|
||||
pdsch->rbStart,
|
||||
pdsch->rbSize,
|
||||
bwpSize);
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_D(NR_MAC,
|
||||
"mcs=%i, startSymbolIndex = %i, nrOfSymbols = %i, rbSize = %i, TBS = %i, dmrs_length %d, N_PRB_DMRS = %d, mappingtype = %d\n",
|
||||
@@ -313,6 +316,7 @@ static void update_rb_mcs_tbs(NR_sched_pdsch_t *pdsch, uint32_t num_total_bytes,
|
||||
pdsch->dmrs_parms.N_DMRS_SLOT,
|
||||
N_PRB_DMRS,
|
||||
tda_info->mapping_type);
|
||||
return true;
|
||||
}
|
||||
|
||||
static NR_sched_pdsch_t schedule_control_sib1(gNB_MAC_INST *gNB_mac,
|
||||
@@ -342,11 +346,12 @@ static NR_sched_pdsch_t schedule_control_sib1(gNB_MAC_INST *gNB_mac,
|
||||
|
||||
uint8_t nr_of_candidates = 0;
|
||||
|
||||
for (int i=0; i<3; i++) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
find_aggregation_candidates(&gNB_mac->sched_ctrlCommon->aggregation_level, &nr_of_candidates, gNB_mac->sched_ctrlCommon->search_space,4<<i);
|
||||
if (nr_of_candidates>0) break; // choosing the lower value of aggregation level available
|
||||
if (nr_of_candidates > 0)
|
||||
break; // choosing the lower value of aggregation level available
|
||||
}
|
||||
AssertFatal(nr_of_candidates>0,"nr_of_candidates is 0\n");
|
||||
AssertFatal(nr_of_candidates > 0, "nr_of_candidates is 0\n");
|
||||
gNB_mac->sched_ctrlCommon->cce_index = find_pdcch_candidate(gNB_mac,
|
||||
CC_id,
|
||||
gNB_mac->sched_ctrlCommon->aggregation_level,
|
||||
@@ -358,18 +363,23 @@ static NR_sched_pdsch_t schedule_control_sib1(gNB_MAC_INST *gNB_mac,
|
||||
|
||||
AssertFatal(gNB_mac->sched_ctrlCommon->cce_index >= 0, "Could not find CCE for coreset0\n");
|
||||
|
||||
update_rb_mcs_tbs(&pdsch, gNB_mac->sched_ctrlCommon->num_total_bytes, vrb_map);
|
||||
|
||||
// Mark the corresponding RBs as used
|
||||
fill_pdcch_vrb_map(gNB_mac,
|
||||
CC_id,
|
||||
pdcch,
|
||||
gNB_mac->sched_ctrlCommon->cce_index,
|
||||
gNB_mac->sched_ctrlCommon->aggregation_level,
|
||||
beam);
|
||||
for (int rb = 0; rb < pdsch.rbSize; rb++) {
|
||||
vrb_map[rb + type0_PDCCH_CSS_config->cset_start_rb] |= SL_to_bitmap(tda_info->startSymbolIndex, tda_info->nrOfSymbols);
|
||||
bool success = update_rb_mcs_tbs(&pdsch, gNB_mac->sched_ctrlCommon->num_total_bytes, vrb_map);
|
||||
if (success) {
|
||||
// Mark the corresponding RBs as used
|
||||
fill_pdcch_vrb_map(gNB_mac,
|
||||
CC_id,
|
||||
pdcch,
|
||||
gNB_mac->sched_ctrlCommon->cce_index,
|
||||
gNB_mac->sched_ctrlCommon->aggregation_level,
|
||||
beam);
|
||||
for (int rb = 0; rb < pdsch.rbSize; rb++) {
|
||||
vrb_map[rb + type0_PDCCH_CSS_config->cset_start_rb] |= SL_to_bitmap(tda_info->startSymbolIndex, tda_info->nrOfSymbols);
|
||||
}
|
||||
} else {
|
||||
pdsch.tb_size = 0; // to signal we couldn't allocate TBS
|
||||
pdsch.time_domain_allocation = -1;
|
||||
}
|
||||
|
||||
return pdsch;
|
||||
}
|
||||
|
||||
@@ -464,6 +474,53 @@ static void nr_fill_nfapi_dl_SIB_pdu(gNB_MAC_INST *gNB_mac,
|
||||
pdcch_pdu_rel15->numDlDci);
|
||||
}
|
||||
|
||||
static bool check_sib1_tda(gNB_MAC_INST *gNB_mac,
|
||||
NR_sched_pdcch_t *sched_pdcch,
|
||||
NR_beam_alloc_t *beam,
|
||||
int tda,
|
||||
int ssb_index,
|
||||
int CC_id,
|
||||
int candidate_idx)
|
||||
{
|
||||
NR_COMMON_channels_t *cc = &gNB_mac->common_channels[CC_id];
|
||||
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
||||
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config = &gNB_mac->type0_PDCCH_CSS_config[ssb_index];
|
||||
default_table_type_t table_type = get_default_table_type(type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern);
|
||||
// If the PDSCH was scheduled with SI-RNTI in PDCCH Type0 common search space,
|
||||
// the UE may assume that this PDSCH resource allocation is not applied (Table 5.1.2.1.1-4 and 5 in 38.214)
|
||||
int row = tda + 1;
|
||||
if (table_type == defaultB && (row == 12 || row == 13 || row == 14))
|
||||
false;
|
||||
if (table_type == defaultC && (row == 1 || row == 6 || row == 7 ||row > 12))
|
||||
false;
|
||||
// assuming normal CP
|
||||
NR_tda_info_t tda_info = get_info_from_tda_tables(table_type, tda, scc->dmrs_TypeA_Position, true);
|
||||
// SIB1 TDA going to the last symbol would cause overlap with CSI-RS
|
||||
if (!tda_info.valid_tda || tda_info.startSymbolIndex + tda_info.nrOfSymbols == 14)
|
||||
false;
|
||||
if (tda_info.startSymbolIndex < type0_PDCCH_CSS_config->first_symbol_index + type0_PDCCH_CSS_config->num_symbols)
|
||||
false;
|
||||
|
||||
NR_pdsch_dmrs_t dmrs_parms = get_dl_dmrs_params(scc, NULL, &tda_info, 1);
|
||||
// Configure sched_ctrlCommon for SIB1
|
||||
gNB_mac->sib1_pdsch[ssb_index] = schedule_control_sib1(gNB_mac,
|
||||
CC_id,
|
||||
sched_pdcch,
|
||||
type0_PDCCH_CSS_config,
|
||||
tda,
|
||||
&dmrs_parms,
|
||||
&tda_info,
|
||||
candidate_idx,
|
||||
beam->idx,
|
||||
cc->sib1_bcch_length);
|
||||
if (gNB_mac->sib1_pdsch[ssb_index].tb_size > 0) {
|
||||
LOG_D(NR_MAC, "Found TDA for SIB1: %d\n", tda);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void schedule_nr_sib1(module_id_t module_idP,
|
||||
frame_t frameP,
|
||||
slot_t slotP,
|
||||
@@ -474,12 +531,9 @@ void schedule_nr_sib1(module_id_t module_idP,
|
||||
// TODO: Get these values from RRC
|
||||
const int CC_id = 0;
|
||||
uint8_t candidate_idx = 0;
|
||||
|
||||
gNB_MAC_INST *gNB_mac = RC.nrmac[module_idP];
|
||||
NR_ServingCellConfigCommon_t *scc = gNB_mac->common_channels[CC_id].ServingCellConfigCommon;
|
||||
|
||||
int time_domain_allocation = gNB_mac->radio_config.sib1_tda;
|
||||
|
||||
NR_COMMON_channels_t *cc = &gNB_mac->common_channels[CC_id];
|
||||
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
||||
int L_max;
|
||||
switch (scc->ssb_PositionsInBurst->present) {
|
||||
case 1:
|
||||
@@ -492,8 +546,7 @@ void schedule_nr_sib1(module_id_t module_idP,
|
||||
L_max = 64;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0,"SSB bitmap size value %d undefined (allowed values 1,2,3)\n",
|
||||
scc->ssb_PositionsInBurst->present);
|
||||
AssertFatal(false, "SSB bitmap size value %d undefined (allowed values 1,2,3)\n", scc->ssb_PositionsInBurst->present);
|
||||
}
|
||||
|
||||
for (int i = 0; i < L_max; i++) {
|
||||
@@ -513,17 +566,6 @@ void schedule_nr_sib1(module_id_t module_idP,
|
||||
NR_beam_alloc_t beam = beam_allocation_procedure(&gNB_mac->beam_info, frameP, slotP, beam_index, n_slots_frame);
|
||||
AssertFatal(beam.idx >= 0, "Cannot allocate SIB1 corresponding to SSB %d in any available beam\n", i);
|
||||
LOG_D(NR_MAC,"(%d.%d) SIB1 transmission: ssb_index %d\n", frameP, slotP, type0_PDCCH_CSS_config->ssb_index);
|
||||
|
||||
default_table_type_t table_type = get_default_table_type(type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern);
|
||||
// assuming normal CP
|
||||
NR_tda_info_t tda_info = get_info_from_tda_tables(table_type, time_domain_allocation, scc->dmrs_TypeA_Position, true);
|
||||
|
||||
AssertFatal((tda_info.startSymbolIndex + tda_info.nrOfSymbols) < 14,
|
||||
"SIB1 TDA %d would cause overlap with CSI-RS. Please select a different SIB1 TDA.\n",
|
||||
time_domain_allocation);
|
||||
|
||||
NR_pdsch_dmrs_t dmrs_parms = get_dl_dmrs_params(scc, NULL, &tda_info, 1);
|
||||
|
||||
NR_sched_pdcch_t sched_pdcch = set_pdcch_structure(NULL,
|
||||
gNB_mac->sched_ctrlCommon->search_space,
|
||||
gNB_mac->sched_ctrlCommon->coreset,
|
||||
@@ -531,23 +573,24 @@ void schedule_nr_sib1(module_id_t module_idP,
|
||||
NULL,
|
||||
type0_PDCCH_CSS_config);
|
||||
|
||||
NR_COMMON_channels_t *cc = &gNB_mac->common_channels[0];
|
||||
// Configure sched_ctrlCommon for SIB1
|
||||
NR_sched_pdsch_t sched_pdsch = schedule_control_sib1(gNB_mac,
|
||||
CC_id,
|
||||
&sched_pdcch,
|
||||
type0_PDCCH_CSS_config,
|
||||
time_domain_allocation,
|
||||
&dmrs_parms,
|
||||
&tda_info,
|
||||
candidate_idx,
|
||||
beam.idx,
|
||||
cc->sib1_bcch_length);
|
||||
|
||||
bool res = false;
|
||||
if (gNB_mac->sib1_pdsch[i].time_domain_allocation < 0) {
|
||||
for (int t = 0; t < 16; t++) {
|
||||
if (check_sib1_tda(gNB_mac, &sched_pdcch, &beam, t, i, CC_id, candidate_idx)) {
|
||||
res = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
AssertFatal(gNB_mac->sib1_pdsch[i].time_domain_allocation >= 0, "Couldn't select any TDA for SIB1\n");
|
||||
if (!res)
|
||||
res = check_sib1_tda(gNB_mac, &sched_pdcch, &beam, gNB_mac->sib1_pdsch[i].time_domain_allocation, i, CC_id, candidate_idx);
|
||||
int tb_size = gNB_mac->sib1_pdsch[i].tb_size;
|
||||
AssertFatal(res && tb_size > 0, "Couldn't allocate TB for SIB1 for an already allocated TDA\n");
|
||||
nfapi_nr_dl_tti_request_body_t *dl_req = &DL_req->dl_tti_request_body;
|
||||
int pdu_index = gNB_mac->pdu_index[0]++;
|
||||
nr_fill_nfapi_dl_SIB_pdu(gNB_mac,
|
||||
&sched_pdsch,
|
||||
&gNB_mac->sib1_pdsch[i],
|
||||
&sched_pdcch,
|
||||
gNB_mac->sched_ctrlCommon->search_space,
|
||||
gNB_mac->sched_ctrlCommon->coreset,
|
||||
@@ -563,11 +606,11 @@ void schedule_nr_sib1(module_id_t module_idP,
|
||||
nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[ntx_req];
|
||||
|
||||
// Data to be transmitted
|
||||
memcpy(tx_req->TLVs[0].value.direct, cc->sib1_bcch_pdu, sched_pdsch.tb_size);
|
||||
memcpy(tx_req->TLVs[0].value.direct, cc->sib1_bcch_pdu, tb_size);
|
||||
|
||||
tx_req->PDU_index = pdu_index;
|
||||
tx_req->num_TLV = 1;
|
||||
tx_req->TLVs[0].length = sched_pdsch.tb_size;
|
||||
tx_req->TLVs[0].length = tb_size;
|
||||
tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, tx_req->TLVs[0].length);
|
||||
TX_req->Number_of_PDUs++;
|
||||
TX_req->SFN = frameP;
|
||||
@@ -673,7 +716,8 @@ static void other_sib_sched_control(module_id_t module_idP,
|
||||
uint16_t *vrb_map = cc->vrb_map[beam.idx];
|
||||
uint8_t *sib_bcch_pdu = cc->other_sib_bcch_pdu[payload_idx];
|
||||
int num_total_bytes = cc->other_sib_bcch_length[payload_idx];
|
||||
update_rb_mcs_tbs(&sched_pdsch_otherSI, num_total_bytes, vrb_map);
|
||||
bool success = update_rb_mcs_tbs(&sched_pdsch_otherSI, num_total_bytes, vrb_map);
|
||||
AssertFatal(success, "Couldn't allocate TBS for other SIB\n");
|
||||
|
||||
for (int rb = 0; rb < sched_pdsch_otherSI.rbSize; rb++) {
|
||||
vrb_map[rb + type0_PDCCH_CSS_config->cset_start_rb] |= SL_to_bitmap(tda_info.startSymbolIndex, tda_info.nrOfSymbols);
|
||||
|
||||
@@ -302,7 +302,8 @@ void mac_top_init_gNB(ngran_node_t node_type,
|
||||
|
||||
RC.nrmac[i]->tag = (NR_TAG_t*)malloc(sizeof(NR_TAG_t));
|
||||
memset((void*)RC.nrmac[i]->tag,0,sizeof(NR_TAG_t));
|
||||
|
||||
for(int n = 0; n < MAX_NUM_OF_SSB; n++)
|
||||
RC.nrmac[i]->sib1_pdsch[n].time_domain_allocation = -1;
|
||||
RC.nrmac[i]->common_channels[0].ServingCellConfigCommon = scc;
|
||||
RC.nrmac[i]->radio_config = *config;
|
||||
RC.nrmac[i]->rlc_config = *default_rlc_config;
|
||||
|
||||
@@ -186,7 +186,6 @@ typedef enum {
|
||||
} nr_config_report_type_t;
|
||||
|
||||
typedef struct nr_mac_config_t {
|
||||
int sib1_tda;
|
||||
nr_pdsch_AntennaPorts_t pdsch_AntennaPorts;
|
||||
int pusch_AntennaPorts;
|
||||
int minRXTXTIME;
|
||||
@@ -994,6 +993,7 @@ typedef struct gNB_MAC_INST_s {
|
||||
bool identity_pm;
|
||||
int precoding_matrix_size[NR_MAX_NB_LAYERS];
|
||||
int beam_index_list[MAX_NUM_OF_SSB];
|
||||
NR_sched_pdsch_t sib1_pdsch[MAX_NUM_OF_SSB];
|
||||
|
||||
/// dedicate UL TDA, common for all UEs
|
||||
seq_arr_t ul_tda;
|
||||
|
||||
Reference in New Issue
Block a user