fixes at UE to make number of RBs independent from PDSCH type
This commit is contained in:
@@ -1378,6 +1378,7 @@ void nr_pdsch_ptrs_processing(int nbRx,
|
|||||||
NR_DL_UE_HARQ_t *dlsch1_harq,
|
NR_DL_UE_HARQ_t *dlsch1_harq,
|
||||||
uint8_t nr_slot_rx,
|
uint8_t nr_slot_rx,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
|
int nb_rb,
|
||||||
uint16_t rnti,
|
uint16_t rnti,
|
||||||
NR_UE_DLSCH_t dlsch[2])
|
NR_UE_DLSCH_t dlsch[2])
|
||||||
{
|
{
|
||||||
@@ -1394,7 +1395,6 @@ void nr_pdsch_ptrs_processing(int nbRx,
|
|||||||
uint16_t *ptrsSymbPos = NULL;
|
uint16_t *ptrsSymbPos = NULL;
|
||||||
uint8_t *ptrsSymbIdx = NULL;
|
uint8_t *ptrsSymbIdx = NULL;
|
||||||
uint8_t *ptrsReOffset = NULL;
|
uint8_t *ptrsReOffset = NULL;
|
||||||
uint16_t *nb_rb = NULL;
|
|
||||||
int nscid = 0;
|
int nscid = 0;
|
||||||
|
|
||||||
if(dlsch0_harq->status == NR_ACTIVE) {
|
if(dlsch0_harq->status == NR_ACTIVE) {
|
||||||
@@ -1405,7 +1405,6 @@ void nr_pdsch_ptrs_processing(int nbRx,
|
|||||||
K_ptrs = &dlsch[0].dlsch_config.PTRSFreqDensity;
|
K_ptrs = &dlsch[0].dlsch_config.PTRSFreqDensity;
|
||||||
dmrsSymbPos = &dlsch[0].dlsch_config.dlDmrsSymbPos;
|
dmrsSymbPos = &dlsch[0].dlsch_config.dlDmrsSymbPos;
|
||||||
ptrsReOffset = &dlsch[0].dlsch_config.PTRSReOffset;
|
ptrsReOffset = &dlsch[0].dlsch_config.PTRSReOffset;
|
||||||
nb_rb = &dlsch[0].dlsch_config.number_rbs;
|
|
||||||
ptrsSymbPos = &dlsch[0].ptrs_symbols;
|
ptrsSymbPos = &dlsch[0].ptrs_symbols;
|
||||||
ptrsSymbIdx = &dlsch[0].ptrs_symbol_index;
|
ptrsSymbIdx = &dlsch[0].ptrs_symbol_index;
|
||||||
nscid = dlsch[0].dlsch_config.nscid;
|
nscid = dlsch[0].dlsch_config.nscid;
|
||||||
@@ -1418,7 +1417,6 @@ void nr_pdsch_ptrs_processing(int nbRx,
|
|||||||
K_ptrs = &dlsch[1].dlsch_config.PTRSFreqDensity;
|
K_ptrs = &dlsch[1].dlsch_config.PTRSFreqDensity;
|
||||||
dmrsSymbPos = &dlsch[1].dlsch_config.dlDmrsSymbPos;
|
dmrsSymbPos = &dlsch[1].dlsch_config.dlDmrsSymbPos;
|
||||||
ptrsReOffset = &dlsch[1].dlsch_config.PTRSReOffset;
|
ptrsReOffset = &dlsch[1].dlsch_config.PTRSReOffset;
|
||||||
nb_rb = &dlsch[1].dlsch_config.number_rbs;
|
|
||||||
ptrsSymbPos = &dlsch[1].ptrs_symbols;
|
ptrsSymbPos = &dlsch[1].ptrs_symbols;
|
||||||
ptrsSymbIdx = &dlsch[1].ptrs_symbol_index;
|
ptrsSymbIdx = &dlsch[1].ptrs_symbol_index;
|
||||||
nscid = dlsch[1].dlsch_config.nscid;
|
nscid = dlsch[1].dlsch_config.nscid;
|
||||||
@@ -1462,7 +1460,7 @@ void nr_pdsch_ptrs_processing(int nbRx,
|
|||||||
nr_gold_pdsch(frame_parms->N_RB_DL, frame_parms->symbols_per_slot, frame_parms->Nid_cell, nscid, nr_slot_rx, symbol);
|
nr_gold_pdsch(frame_parms->N_RB_DL, frame_parms->symbols_per_slot, frame_parms->Nid_cell, nscid, nr_slot_rx, symbol);
|
||||||
nr_ptrs_cpe_estimation(*K_ptrs,
|
nr_ptrs_cpe_estimation(*K_ptrs,
|
||||||
*ptrsReOffset,
|
*ptrsReOffset,
|
||||||
*nb_rb,
|
nb_rb,
|
||||||
rnti,
|
rnti,
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
rxdataF_comp[symbol][0][aarx],
|
rxdataF_comp[symbol][0][aarx],
|
||||||
@@ -1498,11 +1496,7 @@ void nr_pdsch_ptrs_processing(int nbRx,
|
|||||||
#ifdef DEBUG_DL_PTRS
|
#ifdef DEBUG_DL_PTRS
|
||||||
printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
|
printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
|
||||||
#endif
|
#endif
|
||||||
rotate_cpx_vector(rxdataF_comp[i][0][aarx],
|
rotate_cpx_vector(rxdataF_comp[i][0][aarx], &phase_per_symbol[i], rxdataF_comp[i][0][aarx], nb_rb * NR_NB_SC_PER_RB, 15);
|
||||||
&phase_per_symbol[i],
|
|
||||||
rxdataF_comp[i][0][aarx],
|
|
||||||
((*nb_rb) * NR_NB_SC_PER_RB),
|
|
||||||
15);
|
|
||||||
}// if not DMRS Symbol
|
}// if not DMRS Symbol
|
||||||
}// symbol loop
|
}// symbol loop
|
||||||
}// last symbol check
|
}// last symbol check
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ void nr_pdsch_ptrs_processing(int nbRx,
|
|||||||
NR_DL_UE_HARQ_t *dlsch1_harq,
|
NR_DL_UE_HARQ_t *dlsch1_harq,
|
||||||
uint8_t nr_slot_rx,
|
uint8_t nr_slot_rx,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
|
int nb_rb,
|
||||||
uint16_t rnti,
|
uint16_t rnti,
|
||||||
NR_UE_DLSCH_t dlsch[2]);
|
NR_UE_DLSCH_t dlsch[2]);
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ void nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
uint8_t **b,
|
uint8_t **b,
|
||||||
int *G,
|
int *G,
|
||||||
int nb_dlsch,
|
int nb_dlsch,
|
||||||
|
int number_rbs,
|
||||||
uint8_t *DLSCH_ids)
|
uint8_t *DLSCH_ids)
|
||||||
{
|
{
|
||||||
nrLDPC_TB_decoding_parameters_t TBs[nb_dlsch];
|
nrLDPC_TB_decoding_parameters_t TBs[nb_dlsch];
|
||||||
@@ -95,7 +96,7 @@ void nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
TB_parameters->G = G[DLSCH_id];
|
TB_parameters->G = G[DLSCH_id];
|
||||||
TB_parameters->nb_rb = dlsch_config->number_rbs;
|
TB_parameters->nb_rb = number_rbs;
|
||||||
TB_parameters->Qm = dlsch_config->qamModOrder;
|
TB_parameters->Qm = dlsch_config->qamModOrder;
|
||||||
TB_parameters->mcs = dlsch_config->mcs;
|
TB_parameters->mcs = dlsch_config->mcs;
|
||||||
TB_parameters->nb_layers = dlsch[DLSCH_id].Nl;
|
TB_parameters->nb_layers = dlsch[DLSCH_id].Nl;
|
||||||
@@ -256,7 +257,7 @@ void nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
kpiStructure.nb_total++;
|
kpiStructure.nb_total++;
|
||||||
kpiStructure.blockSize = dlsch_config->TBS;
|
kpiStructure.blockSize = dlsch_config->TBS;
|
||||||
kpiStructure.dl_mcs = dlsch_config->mcs;
|
kpiStructure.dl_mcs = dlsch_config->mcs;
|
||||||
kpiStructure.nofRBs = dlsch_config->number_rbs;
|
kpiStructure.nofRBs = number_rbs;
|
||||||
|
|
||||||
harq_process->decodeResult = harq_process->processedSegments == harq_process->C;
|
harq_process->decodeResult = harq_process->processedSegments == harq_process->C;
|
||||||
|
|
||||||
@@ -327,7 +328,7 @@ void nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
dlsch->dlsch_config.mcs,
|
dlsch->dlsch_config.mcs,
|
||||||
dlsch->Nl,
|
dlsch->Nl,
|
||||||
dlsch_config->number_symbols,
|
dlsch_config->number_symbols,
|
||||||
dlsch_config->number_rbs,
|
number_rbs,
|
||||||
dlsch_config->qamModOrder,
|
dlsch_config->qamModOrder,
|
||||||
Coderate);
|
Coderate);
|
||||||
|
|
||||||
|
|||||||
@@ -1331,6 +1331,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
dlsch1_harq,
|
dlsch1_harq,
|
||||||
nr_slot_rx,
|
nr_slot_rx,
|
||||||
symbol,
|
symbol,
|
||||||
|
freq_alloc->num_rbs,
|
||||||
dlsch[0].rnti,
|
dlsch[0].rnti,
|
||||||
dlsch);
|
dlsch);
|
||||||
dl_valid_re[symbol] -= ptrs_re_per_slot[0][symbol];
|
dl_valid_re[symbol] -= ptrs_re_per_slot[0][symbol];
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ void nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
uint8_t **b,
|
uint8_t **b,
|
||||||
int *G,
|
int *G,
|
||||||
int nb_dlsch,
|
int nb_dlsch,
|
||||||
|
int number_rbs,
|
||||||
uint8_t *DLSCH_ids);
|
uint8_t *DLSCH_ids);
|
||||||
|
|
||||||
int nr_ulsch_pre_encoding(PHY_VARS_NR_UE *ue,
|
int nr_ulsch_pre_encoding(PHY_VARS_NR_UE *ue,
|
||||||
|
|||||||
@@ -491,7 +491,8 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
NR_UE_DLSCH_t dlsch[2],
|
NR_UE_DLSCH_t dlsch[2],
|
||||||
int16_t *llr[2],
|
int16_t *llr[2],
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP],
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP],
|
||||||
int G)
|
int G,
|
||||||
|
freq_alloc_bitmap_t *freq_alloc)
|
||||||
{
|
{
|
||||||
int frame_rx = proc->frame_rx;
|
int frame_rx = proc->frame_rx;
|
||||||
int nr_slot_rx = proc->nr_slot_rx;
|
int nr_slot_rx = proc->nr_slot_rx;
|
||||||
@@ -507,13 +508,6 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
// dlsch0_harq contains the previous transmissions data for this harq pid
|
// dlsch0_harq contains the previous transmissions data for this harq pid
|
||||||
NR_DL_UE_HARQ_t *dlsch0_harq = &ue->dl_harq_processes[0][harq_pid];
|
NR_DL_UE_HARQ_t *dlsch0_harq = &ue->dl_harq_processes[0][harq_pid];
|
||||||
|
|
||||||
freq_alloc_bitmap_t freq_alloc = {0};
|
|
||||||
if (dlschCfg->resource_alloc == 0) {
|
|
||||||
int alloc_size = (dlschCfg->BWPSize / 8) + (dlschCfg->BWPSize % 8 > 0);
|
|
||||||
freq_alloc = set_start_end_from_bitmap(dlschCfg->BWPSize, alloc_size, dlschCfg->rb_bitmap);
|
|
||||||
} else
|
|
||||||
freq_alloc = set_bitmap_from_start_size(dlschCfg->start_rb, dlschCfg->number_rbs);
|
|
||||||
|
|
||||||
LOG_D(PHY,
|
LOG_D(PHY,
|
||||||
"[UE %d] frame_rx %d, nr_slot_rx %d, harq_pid %d (%d), BWP start %d, start RB %d, end RB %d, symbol_start %d, nb_symbols "
|
"[UE %d] frame_rx %d, nr_slot_rx %d, harq_pid %d (%d), BWP start %d, start RB %d, end RB %d, symbol_start %d, nb_symbols "
|
||||||
"%d, DMRS mask "
|
"%d, DMRS mask "
|
||||||
@@ -524,8 +518,8 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
harq_pid,
|
harq_pid,
|
||||||
dlsch0_harq->status,
|
dlsch0_harq->status,
|
||||||
dlschCfg->BWPStart,
|
dlschCfg->BWPStart,
|
||||||
freq_alloc.first_rb,
|
freq_alloc->first_rb,
|
||||||
freq_alloc.last_rb,
|
freq_alloc->last_rb,
|
||||||
dlschCfg->start_symbol,
|
dlschCfg->start_symbol,
|
||||||
dlschCfg->number_symbols,
|
dlschCfg->number_symbols,
|
||||||
dlschCfg->dlDmrsSymbPos,
|
dlschCfg->dlDmrsSymbPos,
|
||||||
@@ -541,7 +535,7 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
int32_t ptrs_re_per_slot[ue->frame_parms.nb_antennas_rx][NR_SYMBOLS_PER_SLOT];
|
int32_t ptrs_re_per_slot[ue->frame_parms.nb_antennas_rx][NR_SYMBOLS_PER_SLOT];
|
||||||
memset(ptrs_re_per_slot, 0, sizeof(ptrs_re_per_slot));
|
memset(ptrs_re_per_slot, 0, sizeof(ptrs_re_per_slot));
|
||||||
|
|
||||||
const uint32_t rx_size_symbol = (freq_alloc.num_rbs * NR_NB_SC_PER_RB + 15) & ~15;
|
const uint32_t rx_size_symbol = (freq_alloc->num_rbs * NR_NB_SC_PER_RB + 15) & ~15;
|
||||||
fourDimArray_t *toFree2 = NULL;
|
fourDimArray_t *toFree2 = NULL;
|
||||||
allocCast4D(rxdataF_comp,
|
allocCast4D(rxdataF_comp,
|
||||||
c16_t,
|
c16_t,
|
||||||
@@ -563,7 +557,7 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
nr_pdsch_channel_estimation(ue,
|
nr_pdsch_channel_estimation(ue,
|
||||||
proc,
|
proc,
|
||||||
dlschCfg,
|
dlschCfg,
|
||||||
&freq_alloc,
|
freq_alloc,
|
||||||
nl,
|
nl,
|
||||||
get_dmrs_port(nl, dlschCfg->dmrs_ports),
|
get_dmrs_port(nl, dlschCfg->dmrs_ports),
|
||||||
m,
|
m,
|
||||||
@@ -587,7 +581,7 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
stop_meas_nr_ue_phy(ue, DLSCH_CHANNEL_ESTIMATION_STATS);
|
stop_meas_nr_ue_phy(ue, DLSCH_CHANNEL_ESTIMATION_STATS);
|
||||||
nvar /= (dlschCfg->number_symbols * dlsch0->Nl * ue->frame_parms.nb_antennas_rx);
|
nvar /= (dlschCfg->number_symbols * dlsch0->Nl * ue->frame_parms.nb_antennas_rx);
|
||||||
nr_ue_measurement_procedures(2, ue, proc, freq_alloc.num_rbs, pdsch_est_size, pdsch_dl_ch_estimates);
|
nr_ue_measurement_procedures(2, ue, proc, freq_alloc->num_rbs, pdsch_est_size, pdsch_dl_ch_estimates);
|
||||||
|
|
||||||
if (ue->chest_time == 1) { // averaging time domain channel estimates
|
if (ue->chest_time == 1) { // averaging time domain channel estimates
|
||||||
nr_chest_time_domain_avg(&ue->frame_parms,
|
nr_chest_time_domain_avg(&ue->frame_parms,
|
||||||
@@ -595,7 +589,7 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
dlschCfg->number_symbols,
|
dlschCfg->number_symbols,
|
||||||
dlschCfg->start_symbol,
|
dlschCfg->start_symbol,
|
||||||
dlschCfg->dlDmrsSymbPos,
|
dlschCfg->dlDmrsSymbPos,
|
||||||
freq_alloc.num_rbs);
|
freq_alloc->num_rbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t first_symbol_with_data = dlschCfg->start_symbol;
|
uint16_t first_symbol_with_data = dlschCfg->start_symbol;
|
||||||
@@ -622,13 +616,13 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
pdschChanEstimates,
|
pdschChanEstimates,
|
||||||
sizeof(c16_t),
|
sizeof(c16_t),
|
||||||
1,
|
1,
|
||||||
freq_alloc.num_rbs * NR_NB_SC_PER_RB * dlschCfg->number_symbols,
|
freq_alloc->num_rbs * NR_NB_SC_PER_RB * dlschCfg->number_symbols,
|
||||||
&mt);
|
&mt);
|
||||||
scope_req.copy_rxdataF_to_scope = UETryLockScopeData(ue,
|
scope_req.copy_rxdataF_to_scope = UETryLockScopeData(ue,
|
||||||
pdschRxdataF,
|
pdschRxdataF,
|
||||||
sizeof(c16_t),
|
sizeof(c16_t),
|
||||||
1,
|
1,
|
||||||
freq_alloc.num_rbs * NR_NB_SC_PER_RB * dlschCfg->number_symbols,
|
freq_alloc->num_rbs * NR_NB_SC_PER_RB * dlschCfg->number_symbols,
|
||||||
&mt);
|
&mt);
|
||||||
}
|
}
|
||||||
fourDimArray_t *toFree3 = NULL;
|
fourDimArray_t *toFree3 = NULL;
|
||||||
@@ -668,7 +662,7 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
if (nr_rx_pdsch(ue,
|
if (nr_rx_pdsch(ue,
|
||||||
proc,
|
proc,
|
||||||
dlsch,
|
dlsch,
|
||||||
&freq_alloc,
|
freq_alloc,
|
||||||
m,
|
m,
|
||||||
first_symbol_flag,
|
first_symbol_flag,
|
||||||
harq_pid,
|
harq_pid,
|
||||||
@@ -767,7 +761,10 @@ static uint32_t compute_csi_rm_unav_res(fapi_nr_dl_config_dlsch_pdu_rel15_t *dls
|
|||||||
static void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
static void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
const UE_nr_rxtx_proc_t *proc,
|
||||||
NR_UE_DLSCH_t dlsch[2],
|
NR_UE_DLSCH_t dlsch[2],
|
||||||
int16_t *llr[2]) {
|
int16_t *llr[2],
|
||||||
|
int G[2],
|
||||||
|
freq_alloc_bitmap_t *freq_alloc)
|
||||||
|
{
|
||||||
if (dlsch[0].active == false) {
|
if (dlsch[0].active == false) {
|
||||||
LOG_E(PHY, "DLSCH should be active when calling this function\n");
|
LOG_E(PHY, "DLSCH should be active when calling this function\n");
|
||||||
return;
|
return;
|
||||||
@@ -778,7 +775,6 @@ static void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
int nr_slot_rx = proc->nr_slot_rx;
|
int nr_slot_rx = proc->nr_slot_rx;
|
||||||
NR_DL_UE_HARQ_t *dl_harq0 = &ue->dl_harq_processes[0][harq_pid];
|
NR_DL_UE_HARQ_t *dl_harq0 = &ue->dl_harq_processes[0][harq_pid];
|
||||||
NR_DL_UE_HARQ_t *dl_harq1 = &ue->dl_harq_processes[1][harq_pid];
|
NR_DL_UE_HARQ_t *dl_harq1 = &ue->dl_harq_processes[1][harq_pid];
|
||||||
uint16_t dmrs_len = get_num_dmrs(dlsch[0].dlsch_config.dlDmrsSymbPos);
|
|
||||||
nr_downlink_indication_t dl_indication;
|
nr_downlink_indication_t dl_indication;
|
||||||
fapi_nr_rx_indication_t rx_ind = {0};
|
fapi_nr_rx_indication_t rx_ind = {0};
|
||||||
uint16_t number_pdus = 1;
|
uint16_t number_pdus = 1;
|
||||||
@@ -788,15 +784,6 @@ static void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
int nb_dlsch = 0;
|
int nb_dlsch = 0;
|
||||||
nb_dlsch += (is_cw0_active == NR_ACTIVE) ? 1 : 0;
|
nb_dlsch += (is_cw0_active == NR_ACTIVE) ? 1 : 0;
|
||||||
nb_dlsch += (is_cw1_active == NR_ACTIVE) ? 1 : 0;
|
nb_dlsch += (is_cw1_active == NR_ACTIVE) ? 1 : 0;
|
||||||
uint16_t nb_symb_sch = dlsch[0].dlsch_config.number_symbols;
|
|
||||||
uint8_t dmrs_type = dlsch[0].dlsch_config.dmrsConfigType;
|
|
||||||
|
|
||||||
uint8_t nb_re_dmrs;
|
|
||||||
if (dmrs_type == NFAPI_NR_DMRS_TYPE1) {
|
|
||||||
nb_re_dmrs = 6 * dlsch[0].dlsch_config.n_dmrs_cdm_groups;
|
|
||||||
} else {
|
|
||||||
nb_re_dmrs = 4 * dlsch[0].dlsch_config.n_dmrs_cdm_groups;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_D(PHY, "AbsSubframe %d.%d Start LDPC Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx % 1024, nr_slot_rx, harq_pid, is_cw0_active);
|
LOG_D(PHY, "AbsSubframe %d.%d Start LDPC Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx % 1024, nr_slot_rx, harq_pid, is_cw0_active);
|
||||||
LOG_D(PHY, "AbsSubframe %d.%d Start LDPC Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx % 1024, nr_slot_rx, harq_pid, is_cw1_active);
|
LOG_D(PHY, "AbsSubframe %d.%d Start LDPC Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx % 1024, nr_slot_rx, harq_pid, is_cw1_active);
|
||||||
@@ -813,27 +800,15 @@ static void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int G[2];
|
|
||||||
uint8_t DLSCH_ids[nb_dlsch];
|
uint8_t DLSCH_ids[nb_dlsch];
|
||||||
int pdsch_id = 0;
|
int pdsch_id = 0;
|
||||||
uint8_t *p_b[2] = {NULL};
|
uint8_t *p_b[2] = {NULL};
|
||||||
for (uint8_t DLSCH_id = 0; DLSCH_id < 2; DLSCH_id++) {
|
for (uint8_t DLSCH_id = 0; DLSCH_id < 2; DLSCH_id++) {
|
||||||
NR_DL_UE_HARQ_t *dl_harq = &ue->dl_harq_processes[DLSCH_id][harq_pid];
|
NR_DL_UE_HARQ_t *dl_harq = &ue->dl_harq_processes[DLSCH_id][harq_pid];
|
||||||
if (dl_harq->status != NR_ACTIVE) continue;
|
if (dl_harq->status != NR_ACTIVE)
|
||||||
|
continue;
|
||||||
|
|
||||||
DLSCH_ids[pdsch_id++] = DLSCH_id;
|
DLSCH_ids[pdsch_id++] = DLSCH_id;
|
||||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config = &dlsch[DLSCH_id].dlsch_config;
|
|
||||||
uint32_t unav_res = 0;
|
|
||||||
if (dlsch_config->pduBitmap & 0x1) {
|
|
||||||
uint16_t ptrsSymbPos = 0;
|
|
||||||
set_ptrs_symb_idx(&ptrsSymbPos, dlsch_config->number_symbols, dlsch_config->start_symbol, 1 << dlsch_config->PTRSTimeDensity,
|
|
||||||
dlsch_config->dlDmrsSymbPos);
|
|
||||||
int n_ptrs = (dlsch_config->number_rbs + dlsch_config->PTRSFreqDensity - 1) / dlsch_config->PTRSFreqDensity;
|
|
||||||
int ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymbPos, dlsch_config->start_symbol, dlsch_config->number_symbols);
|
|
||||||
unav_res = n_ptrs * ptrsSymbPerSlot;
|
|
||||||
}
|
|
||||||
unav_res += compute_csi_rm_unav_res(dlsch_config);
|
|
||||||
G[DLSCH_id] = nr_get_G(dlsch_config->number_rbs, nb_symb_sch, nb_re_dmrs, dmrs_len, unav_res, dlsch_config->qamModOrder, dlsch[DLSCH_id].Nl);
|
|
||||||
|
|
||||||
start_meas_nr_ue_phy(ue, DLSCH_UNSCRAMBLING_STATS);
|
start_meas_nr_ue_phy(ue, DLSCH_UNSCRAMBLING_STATS);
|
||||||
nr_dlsch_unscrambling(llr[DLSCH_id], G[DLSCH_id], 0, dlsch[DLSCH_id].dlsch_config.dlDataScramblingId, dlsch[DLSCH_id].rnti);
|
nr_dlsch_unscrambling(llr[DLSCH_id], G[DLSCH_id], 0, dlsch[DLSCH_id].dlsch_config.dlDataScramblingId, dlsch[DLSCH_id].rnti);
|
||||||
@@ -843,7 +818,7 @@ static void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
start_meas_nr_ue_phy(ue, DLSCH_DECODING_STATS);
|
start_meas_nr_ue_phy(ue, DLSCH_DECODING_STATS);
|
||||||
nr_dlsch_decoding(ue, proc, dlsch, llr, p_b, G, nb_dlsch, DLSCH_ids);
|
nr_dlsch_decoding(ue, proc, dlsch, llr, p_b, G, nb_dlsch, freq_alloc->num_rbs, DLSCH_ids);
|
||||||
stop_meas_nr_ue_phy(ue, DLSCH_DECODING_STATS);
|
stop_meas_nr_ue_phy(ue, DLSCH_DECODING_STATS);
|
||||||
|
|
||||||
int ind_type = -1;
|
int ind_type = -1;
|
||||||
@@ -893,9 +868,8 @@ static void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER * NR_MAX_NB_LAYERS; // number of segments to be allocated
|
int a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER * NR_MAX_NB_LAYERS; // number of segments to be allocated
|
||||||
int num_rb = dlsch[0].dlsch_config.number_rbs;
|
if (freq_alloc->num_rbs != 273) {
|
||||||
if (num_rb != 273) {
|
a_segments = a_segments * freq_alloc->num_rbs;
|
||||||
a_segments = a_segments * num_rb;
|
|
||||||
a_segments = (a_segments / 273) + 1;
|
a_segments = (a_segments / 273) + 1;
|
||||||
}
|
}
|
||||||
uint32_t dlsch_bytes = a_segments * 1056; // allocated bytes per segment
|
uint32_t dlsch_bytes = a_segments * 1056; // allocated bytes per segment
|
||||||
@@ -1207,6 +1181,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
|||||||
nr_ue_csi_rs_procedures(ue, proc, rxdataF, &phy_data->csirs_vars.csirs_config_pdu);
|
nr_ue_csi_rs_procedures(ue, proc, rxdataF, &phy_data->csirs_vars.csirs_config_pdu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int G[2] = {0};
|
||||||
if (dlsch[0].active) {
|
if (dlsch[0].active) {
|
||||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config = &dlsch[0].dlsch_config;
|
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config = &dlsch[0].dlsch_config;
|
||||||
uint16_t nb_symb_sch = dlsch_config->number_symbols;
|
uint16_t nb_symb_sch = dlsch_config->number_symbols;
|
||||||
@@ -1221,6 +1196,13 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freq_alloc_bitmap_t freq_alloc = {0};
|
||||||
|
if (dlsch_config->resource_alloc == 0) {
|
||||||
|
int alloc_size = (dlsch_config->BWPSize / 8) + (dlsch_config->BWPSize % 8 > 0);
|
||||||
|
freq_alloc = set_start_end_from_bitmap(dlsch_config->BWPSize, alloc_size, dlsch_config->rb_bitmap);
|
||||||
|
} else
|
||||||
|
freq_alloc = set_bitmap_from_start_size(dlsch_config->start_rb, dlsch_config->number_rbs);
|
||||||
|
|
||||||
const uint8_t nb_re_dmrs = get_num_dmrs_re_per_rb(dlsch_config->dmrsConfigType, dlsch_config->n_dmrs_cdm_groups);
|
const uint8_t nb_re_dmrs = get_num_dmrs_re_per_rb(dlsch_config->dmrsConfigType, dlsch_config->n_dmrs_cdm_groups);
|
||||||
uint16_t dmrs_len = get_num_dmrs(dlsch_config->dlDmrsSymbPos);
|
uint16_t dmrs_len = get_num_dmrs(dlsch_config->dlDmrsSymbPos);
|
||||||
uint32_t unav_res = 0;
|
uint32_t unav_res = 0;
|
||||||
@@ -1231,35 +1213,35 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
|||||||
dlsch_config->start_symbol,
|
dlsch_config->start_symbol,
|
||||||
1 << dlsch_config->PTRSTimeDensity,
|
1 << dlsch_config->PTRSTimeDensity,
|
||||||
dlsch_config->dlDmrsSymbPos);
|
dlsch_config->dlDmrsSymbPos);
|
||||||
int n_ptrs = (dlsch_config->number_rbs + dlsch_config->PTRSFreqDensity - 1) / dlsch_config->PTRSFreqDensity;
|
int n_ptrs = (freq_alloc.num_rbs + dlsch_config->PTRSFreqDensity - 1) / dlsch_config->PTRSFreqDensity;
|
||||||
int ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymbPos, dlsch_config->start_symbol, dlsch_config->number_symbols);
|
int ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymbPos, dlsch_config->start_symbol, dlsch_config->number_symbols);
|
||||||
unav_res = n_ptrs * ptrsSymbPerSlot;
|
unav_res = n_ptrs * ptrsSymbPerSlot;
|
||||||
}
|
}
|
||||||
unav_res += compute_csi_rm_unav_res(dlsch_config);
|
unav_res += compute_csi_rm_unav_res(dlsch_config);
|
||||||
int G = nr_get_G(dlsch_config->number_rbs,
|
G[0] = nr_get_G(freq_alloc.num_rbs,
|
||||||
dlsch_config->number_symbols,
|
dlsch_config->number_symbols,
|
||||||
nb_re_dmrs,
|
nb_re_dmrs,
|
||||||
dmrs_len,
|
dmrs_len,
|
||||||
unav_res,
|
unav_res,
|
||||||
dlsch_config->qamModOrder,
|
dlsch_config->qamModOrder,
|
||||||
dlsch[0].Nl);
|
dlsch[0].Nl);
|
||||||
const uint32_t rx_llr_buf_sz = ALIGNARRAYSIZE(G, 32); // each LLR is 2 bytes hence 64 byte aligned
|
const uint32_t rx_llr_buf_sz = ALIGNARRAYSIZE(G[0], 32); // each LLR is 2 bytes hence 64 byte aligned
|
||||||
const uint32_t nb_codewords = NR_MAX_NB_LAYERS > 4 ? 2 : 1;
|
const uint32_t nb_codewords = NR_MAX_NB_LAYERS > 4 ? 2 : 1;
|
||||||
int16_t* llr[2];
|
int16_t* llr[2];
|
||||||
for (int i = 0; i < nb_codewords; i++)
|
for (int i = 0; i < nb_codewords; i++)
|
||||||
llr[i] = (int16_t *)malloc16_clear(rx_llr_buf_sz * sizeof(int16_t));
|
llr[i] = (int16_t *)malloc16_clear(rx_llr_buf_sz * sizeof(int16_t));
|
||||||
|
|
||||||
// it returns -1 in case of internal failure, or 0 in case of normal result
|
// it returns -1 in case of internal failure, or 0 in case of normal result
|
||||||
int ret_pdsch = nr_ue_pdsch_procedures(ue, proc, dlsch, llr, rxdataF, G);
|
int ret_pdsch = nr_ue_pdsch_procedures(ue, proc, dlsch, llr, rxdataF, G[0], &freq_alloc);
|
||||||
TracyCPlot("pdsch mcs", dlsch->dlsch_config.mcs);
|
TracyCPlot("pdsch mcs", dlsch->dlsch_config.mcs);
|
||||||
|
|
||||||
UEscopeCopy(ue, pdschLlr, llr[0], sizeof(int16_t), 1, G, 0);
|
UEscopeCopy(ue, pdschLlr, llr[0], sizeof(int16_t), 1, G[0], 0);
|
||||||
|
|
||||||
LOG_D(PHY, "DLSCH data reception at nr_slot_rx: %d\n", nr_slot_rx);
|
LOG_D(PHY, "DLSCH data reception at nr_slot_rx: %d\n", nr_slot_rx);
|
||||||
start_meas_nr_ue_phy(ue, DLSCH_PROCEDURES_STATS);
|
start_meas_nr_ue_phy(ue, DLSCH_PROCEDURES_STATS);
|
||||||
|
|
||||||
if (ret_pdsch >= 0) {
|
if (ret_pdsch >= 0) {
|
||||||
nr_ue_dlsch_procedures(ue, proc, dlsch, llr);
|
nr_ue_dlsch_procedures(ue, proc, dlsch, llr, G, &freq_alloc);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_E(NR_PHY, "Demodulation impossible, internal error\n");
|
LOG_E(NR_PHY, "Demodulation impossible, internal error\n");
|
||||||
|
|||||||
@@ -555,6 +555,7 @@ int main(int argc, char **argv)
|
|||||||
&p_b,
|
&p_b,
|
||||||
available_bits_array,
|
available_bits_array,
|
||||||
1,
|
1,
|
||||||
|
num_rb,
|
||||||
DLSCH_ids);
|
DLSCH_ids);
|
||||||
|
|
||||||
if (dlsch0_ue->last_iteration_cnt > dlsch0_ue->max_ldpc_iterations)
|
if (dlsch0_ue->last_iteration_cnt > dlsch0_ue->max_ldpc_iterations)
|
||||||
|
|||||||
Reference in New Issue
Block a user