mac: fix fapi beam id
Set MSB of fapi beam ID based on flag for beamforming done in hiPHY or loPHY.
This commit is contained in:
@@ -33,8 +33,8 @@ extern "C" {
|
||||
__typeof__ (b) _b = (b); \
|
||||
_a < _b ? _a : _b; })
|
||||
|
||||
|
||||
|
||||
#define IS_BIT_SET(a, b) ((a >> b) & 1)
|
||||
#define SET_BIT(a, b) (a | (1 << b))
|
||||
|
||||
#ifdef __cplusplus
|
||||
#ifdef min
|
||||
|
||||
@@ -77,7 +77,7 @@ int beam_index_allocation(bool das,
|
||||
if (das)
|
||||
return fapi_beam_index;
|
||||
|
||||
int ru_beam_idx = analog_bf->analog_beam_list[fapi_beam_index].value;
|
||||
int ru_beam_idx = analog_bf->analog_beam_list[fapi_beam_index].value & 0x7fff;
|
||||
int idx = -1;
|
||||
for (int j = 0; j < common_vars->num_beams_period; j++) {
|
||||
// L2 analog beam implementation is slot based, so we need to verify occupancy for the whole slot
|
||||
|
||||
@@ -1634,6 +1634,7 @@ void RCconfig_nr_macrlc(configmodule_interface_t *cfg)
|
||||
beam_info->beam_duration = *MacRLC_ParamList.paramarray[j][MACRLC_ANALOG_BEAM_DURATION_IDX].u8ptr;
|
||||
beam_info->beams_per_period = beams_per_period;
|
||||
beam_info->beam_allocation_size = -1; // to be initialized once we have information on frame configuration
|
||||
// TODO: Indicate this to MAC via FAPI TLV 0x0164.
|
||||
beam_info->beam_mode = ab == 1 ? PRECONFIGURED_BEAM_IDX : LOPHY_BEAM_IDX;
|
||||
} else {
|
||||
RC.nrmac[j]->beam_info.beam_mode = NO_BEAM_MODE;
|
||||
|
||||
@@ -516,7 +516,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
||||
prach_pdu->beamforming.num_prgs = 1;
|
||||
prach_pdu->beamforming.prg_size = n_ra_rb;
|
||||
prach_pdu->beamforming.dig_bf_interface = num_td_occ;
|
||||
prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[num_td_occ - 1].beam_idx = beam_index;
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(beam_index, gNB->beam_info.beam_mode);
|
||||
prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[num_td_occ - 1].beam_idx = fapi_beam;
|
||||
|
||||
LOG_D(NR_MAC,
|
||||
"Frame %d, Slot %d: Prach Occasion id = %u fdm index = %u start symbol = %u slot index = %u subframe index = %u \n",
|
||||
@@ -900,7 +901,8 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
|
||||
0,
|
||||
ra->msg3_round,
|
||||
ul_bwp->pusch_Config && ul_bwp->pusch_Config->frequencyHopping,
|
||||
UE->rnti);
|
||||
UE->rnti,
|
||||
nr_mac->beam_info.beam_mode);
|
||||
future_ul_tti_req->n_pdus += 1;
|
||||
|
||||
// generation of DCI 0_0 to schedule msg3 retransmission
|
||||
@@ -933,14 +935,9 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
|
||||
}
|
||||
|
||||
// Fill PDCCH DL DCI PDU
|
||||
nfapi_nr_dl_dci_pdu_t *dci_pdu = prepare_dci_pdu(pdcch_pdu_rel15,
|
||||
scc,
|
||||
ss,
|
||||
coreset,
|
||||
aggregation_level,
|
||||
CCEIndex,
|
||||
UE->UE_beam_index,
|
||||
UE->rnti);
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(UE->UE_beam_index, nr_mac->beam_info.beam_mode);
|
||||
nfapi_nr_dl_dci_pdu_t *dci_pdu =
|
||||
prepare_dci_pdu(pdcch_pdu_rel15, scc, ss, coreset, aggregation_level, CCEIndex, fapi_beam, UE->rnti);
|
||||
pdcch_pdu_rel15->numDlDci++;
|
||||
|
||||
dci_pdu_rel15_t uldci_payload = {0};
|
||||
@@ -1204,7 +1201,8 @@ static void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, slot_
|
||||
0,
|
||||
0,
|
||||
ul_bwp->pusch_Config && ul_bwp->pusch_Config->frequencyHopping,
|
||||
UE->rnti);
|
||||
UE->rnti,
|
||||
mac->beam_info.beam_mode);
|
||||
future_ul_tti_req->n_pdus += 1;
|
||||
|
||||
// calling function to fill rar message
|
||||
@@ -1326,6 +1324,7 @@ static void prepare_dl_pdus(gNB_MAC_INST *nr_mac,
|
||||
NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
|
||||
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
||||
NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP;
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(UE->UE_beam_index, nr_mac->beam_info.beam_mode);
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = prepare_pdsch_pdu(dl_tti_pdsch_pdu,
|
||||
nr_mac,
|
||||
UE,
|
||||
@@ -1334,19 +1333,13 @@ static void prepare_dl_pdus(gNB_MAC_INST *nr_mac,
|
||||
false,
|
||||
round,
|
||||
rnti,
|
||||
UE->UE_beam_index,
|
||||
fapi_beam,
|
||||
1,
|
||||
pduindex);
|
||||
|
||||
/* Fill PDCCH DL DCI PDU */
|
||||
nfapi_nr_dl_dci_pdu_t *dci_pdu = prepare_dci_pdu(pdcch_pdu_rel15,
|
||||
scc,
|
||||
sched_ctrl->search_space,
|
||||
coreset,
|
||||
aggregation_level,
|
||||
CCEIndex,
|
||||
UE->UE_beam_index,
|
||||
rnti);
|
||||
nfapi_nr_dl_dci_pdu_t *dci_pdu =
|
||||
prepare_dci_pdu(pdcch_pdu_rel15, scc, sched_ctrl->search_space, coreset, aggregation_level, CCEIndex, fapi_beam, rnti);
|
||||
pdcch_pdu_rel15->numDlDci++;
|
||||
|
||||
dci_pdu_rel15_t dci_payload = prepare_dci_dl_payload(nr_mac,
|
||||
|
||||
@@ -139,6 +139,7 @@ static void schedule_one_ssb(gNB_MAC_INST *gNB,
|
||||
int beam_index = get_fapi_beamforming_index(gNB, i_ssb);
|
||||
NR_beam_alloc_t beam = beam_allocation_procedure(&gNB->beam_info, frameP, slotP, beam_index, slots_per_frame);
|
||||
AssertFatal(beam.idx >= 0, "Cannot allocate SSB %d in any available beam\n", i_ssb);
|
||||
beam_index = convert_to_fapi_beam(beam_index, gNB->beam_info.beam_mode);
|
||||
const int prb_offset = (FR == FR2) ? offset_pointa >> (scs - 2) : offset_pointa >> scs;
|
||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, beam_index, ssbSubcarrierOffset, offset_pointa, mib_pdu);
|
||||
fill_ssb_vrb_map(cc,
|
||||
@@ -401,17 +402,9 @@ static void nr_fill_nfapi_dl_SIB_pdu(gNB_MAC_INST *gNB_mac,
|
||||
dl_tti_pdsch_pdu->PDUSize = (uint16_t)(4+sizeof(nfapi_nr_dl_tti_pdsch_pdu));
|
||||
dl_req->nPDUs += 1;
|
||||
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = prepare_pdsch_pdu(dl_tti_pdsch_pdu,
|
||||
gNB_mac,
|
||||
NULL,
|
||||
pdsch,
|
||||
NULL,
|
||||
is_sib1,
|
||||
0,
|
||||
SI_RNTI,
|
||||
beam_index,
|
||||
1,
|
||||
pdu_index);
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(beam_index, gNB_mac->beam_info.beam_mode);
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 =
|
||||
prepare_pdsch_pdu(dl_tti_pdsch_pdu, gNB_mac, NULL, pdsch, NULL, is_sib1, 0, SI_RNTI, fapi_beam, 1, pdu_index);
|
||||
LOG_D(NR_MAC,
|
||||
"OtherSI:bwpStart %d, bwpSize %d, rbStart %d, rbSize %d, dlDmrsSymbPos = 0x%x\n",
|
||||
pdsch_pdu_rel15->BWPStart,
|
||||
@@ -421,14 +414,8 @@ static void nr_fill_nfapi_dl_SIB_pdu(gNB_MAC_INST *gNB_mac,
|
||||
pdsch_pdu_rel15->dlDmrsSymbPos);
|
||||
|
||||
/* Fill PDCCH DL DCI PDU */
|
||||
nfapi_nr_dl_dci_pdu_t *dci_pdu = prepare_dci_pdu(pdcch_pdu_rel15,
|
||||
scc,
|
||||
search_space,
|
||||
coreset,
|
||||
aggregation_level,
|
||||
cce_index,
|
||||
beam_index,
|
||||
SI_RNTI);
|
||||
nfapi_nr_dl_dci_pdu_t *dci_pdu =
|
||||
prepare_dci_pdu(pdcch_pdu_rel15, scc, search_space, coreset, aggregation_level, cce_index, fapi_beam, SI_RNTI);
|
||||
pdcch_pdu_rel15->numDlDci++;
|
||||
|
||||
/* DCI payload */
|
||||
@@ -629,6 +616,7 @@ static void other_sib_sched_control(module_id_t module_idP,
|
||||
slot);
|
||||
NR_ServingCellConfigCommon_t *scc = gNB_mac->common_channels[0].ServingCellConfigCommon;
|
||||
int n_slots_frame = gNB_mac->frame_structure.numb_slots_frame;
|
||||
beam_index = get_fapi_beamforming_index(gNB_mac, beam_index);
|
||||
NR_beam_alloc_t beam = beam_allocation_procedure(&gNB_mac->beam_info, frame, slot, beam_index, n_slots_frame);
|
||||
AssertFatal(beam.idx >= 0, "Cannot allocate otherSIB corresponding for SSB number %d in any available beam\n", beam_index);
|
||||
LOG_D(NR_MAC, "(%d.%d) otherSIB payload %d transmission for ssb number %d\n", frame, slot, payload_idx, beam_index);
|
||||
|
||||
@@ -1142,6 +1142,7 @@ void post_process_dlsch(gNB_MAC_INST *nr_mac, post_process_pdsch_t *pdsch, NR_UE
|
||||
maxMIMO_Layers = 1;
|
||||
}
|
||||
const int nl_tbslbrm = min(maxMIMO_Layers, 4);
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(UE->UE_beam_index, nr_mac->beam_info.beam_mode);
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu = prepare_pdsch_pdu(dl_tti_pdsch_pdu,
|
||||
nr_mac,
|
||||
UE,
|
||||
@@ -1150,7 +1151,7 @@ void post_process_dlsch(gNB_MAC_INST *nr_mac, post_process_pdsch_t *pdsch, NR_UE
|
||||
false,
|
||||
harq->round,
|
||||
rnti,
|
||||
UE->UE_beam_index,
|
||||
fapi_beam,
|
||||
nl_tbslbrm,
|
||||
pduindex);
|
||||
|
||||
@@ -1163,7 +1164,7 @@ void post_process_dlsch(gNB_MAC_INST *nr_mac, post_process_pdsch_t *pdsch, NR_UE
|
||||
sched_ctrl->coreset,
|
||||
sched_ctrl->aggregation_level,
|
||||
sched_ctrl->cce_index,
|
||||
UE->UE_beam_index,
|
||||
fapi_beam,
|
||||
rnti);
|
||||
pdcch_pdu->numDlDci++;
|
||||
|
||||
|
||||
@@ -1326,7 +1326,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t *pucch_pdu,
|
||||
uint16_t O_csi,
|
||||
uint16_t O_ack,
|
||||
uint8_t O_sr,
|
||||
int r_pucch)
|
||||
int r_pucch,
|
||||
nr_beam_mode_t beam_mode)
|
||||
{
|
||||
NR_PUCCH_Resource_t *pucchres;
|
||||
NR_PUCCH_FormatConfig_t *pucchfmt;
|
||||
@@ -1534,7 +1535,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t *pucch_pdu,
|
||||
pucch_pdu->beamforming.num_prgs = 1;
|
||||
pucch_pdu->beamforming.prg_size = pucch_pdu->prb_size;
|
||||
pucch_pdu->beamforming.dig_bf_interface = 1;
|
||||
pucch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = UE->UE_beam_index;
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(UE->UE_beam_index, beam_mode);
|
||||
pucch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = fapi_beam;
|
||||
}
|
||||
|
||||
void set_r_pucch_parms(int rsetindex,
|
||||
@@ -3246,7 +3248,8 @@ void nr_csirs_scheduling(int Mod_idP, frame_t frame, slot_t slot, nfapi_nr_dl_tt
|
||||
csirs_pdu_rel15->precodingAndBeamforming.prg_size = resourceMapping.freqBand.nrofRBs; //1 PRG of max size
|
||||
csirs_pdu_rel15->precodingAndBeamforming.dig_bf_interfaces = 1;
|
||||
csirs_pdu_rel15->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
|
||||
csirs_pdu_rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = UE->UE_beam_index;
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(UE->UE_beam_index, gNB_mac->beam_info.beam_mode);
|
||||
csirs_pdu_rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = fapi_beam;
|
||||
csirs_pdu_rel15->bwp_size = dl_bwp->BWPSize;
|
||||
csirs_pdu_rel15->bwp_start = dl_bwp->BWPStart;
|
||||
csirs_pdu_rel15->subcarrier_spacing = dl_bwp->scs;
|
||||
@@ -3689,6 +3692,12 @@ NR_beam_alloc_t beam_allocation_procedure(NR_beam_info_t *beam_info, int frame,
|
||||
return (NR_beam_alloc_t) {.new_beam = false, .idx = -1};
|
||||
}
|
||||
|
||||
uint16_t convert_to_fapi_beam(const uint16_t beam_idx, const nr_beam_mode_t mode)
|
||||
{
|
||||
AssertFatal(beam_idx >= 0 && beam_idx < 32768, "Beam index out of range. Valid range is [0, 32767]\n");
|
||||
return (mode == LOPHY_BEAM_IDX) ? SET_BIT(beam_idx, 15) : beam_idx;
|
||||
}
|
||||
|
||||
void reset_beam_status(NR_beam_info_t *beam_info, int frame, int slot, int16_t beam_index, int slots_per_frame, bool new_beam)
|
||||
{
|
||||
if(!new_beam) // need to reset only if the beam was allocated specifically for this instance
|
||||
|
||||
@@ -473,7 +473,8 @@ static void nr_configure_srs(gNB_MAC_INST *nrmac,
|
||||
srs_pdu->beamforming.num_prgs = m_SRS[srs_pdu->config_index];
|
||||
srs_pdu->beamforming.prg_size = srs_pdu->srs_parameters_v4.srs_bandwidth_size;
|
||||
}
|
||||
srs_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = UE->UE_beam_index;
|
||||
const uint16_t fapi_beam = convert_to_fapi_beam(UE->UE_beam_index, nrmac->beam_info.beam_mode);
|
||||
srs_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = fapi_beam;
|
||||
NR_beam_alloc_t beam = beam_allocation_procedure(&nrmac->beam_info, frame, slot, UE->UE_beam_index, slots_per_frame);
|
||||
AssertFatal(beam.idx >= 0, "Cannot allocate SRS in any available beam\n");
|
||||
uint16_t *vrb_map_UL = &nrmac->common_channels[CC_id].vrb_map_UL[beam.idx][buffer_index * MAX_BWP_SIZE];
|
||||
|
||||
@@ -94,7 +94,8 @@ static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac, frame_t frame, slot_t slot,
|
||||
pucch->csi_bits,
|
||||
pucch->dai_c,
|
||||
pucch->sr_flag,
|
||||
pucch->r_pucch);
|
||||
pucch->r_pucch,
|
||||
nrmac->beam_info.beam_mode);
|
||||
}
|
||||
|
||||
#define MIN_RSRP_VALUE -141
|
||||
|
||||
@@ -2314,7 +2314,8 @@ nfapi_nr_pusch_pdu_t *prepare_pusch_pdu(nfapi_nr_ul_tti_request_t *future_ul_tti
|
||||
int harq_id,
|
||||
int harq_round,
|
||||
int fh,
|
||||
int rnti)
|
||||
int rnti,
|
||||
nr_beam_mode_t beam_mode)
|
||||
{
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
|
||||
memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
|
||||
@@ -2364,7 +2365,8 @@ nfapi_nr_pusch_pdu_t *prepare_pusch_pdu(nfapi_nr_ul_tti_request_t *future_ul_tti
|
||||
pusch_pdu->beamforming.num_prgs = 1;
|
||||
pusch_pdu->beamforming.prg_size = pusch_pdu->bwp_size;
|
||||
pusch_pdu->beamforming.dig_bf_interface = 1;
|
||||
pusch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = UE->UE_beam_index;
|
||||
pusch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx =
|
||||
convert_to_fapi_beam(UE->UE_beam_index, beam_mode);
|
||||
/* TRANSFORM PRECODING --------------------------------------------------------*/
|
||||
if (pusch_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) {
|
||||
// U as specified in section 6.4.1.1.1.2 in 38.211, if sequence hopping and group hopping are disabled
|
||||
@@ -2522,7 +2524,8 @@ void post_process_ulsch(gNB_MAC_INST *nr_mac, post_process_pusch_t *pusch, NR_UE
|
||||
harq_id,
|
||||
cur_harq->round,
|
||||
current_BWP->pusch_Config && current_BWP->pusch_Config->frequencyHopping,
|
||||
UE->rnti);
|
||||
UE->rnti,
|
||||
nr_mac->beam_info.beam_mode);
|
||||
req->n_pdus += 1;
|
||||
|
||||
// Calculate the normalized tx_power for PHR
|
||||
@@ -2564,7 +2567,7 @@ void post_process_ulsch(gNB_MAC_INST *nr_mac, post_process_pusch_t *pusch, NR_UE
|
||||
coreset,
|
||||
sched_ctrl->aggregation_level,
|
||||
sched_ctrl->cce_index,
|
||||
UE->UE_beam_index,
|
||||
convert_to_fapi_beam(UE->UE_beam_index, nr_mac->beam_info.beam_mode),
|
||||
UE->rnti);
|
||||
pdcch_pdu->numDlDci++;
|
||||
|
||||
|
||||
@@ -213,14 +213,15 @@ int nr_get_pucch_resource(NR_ControlResourceSet_t *coreset,
|
||||
NR_PUCCH_Config_t *pucch_Config,
|
||||
int CCEIndex);
|
||||
|
||||
void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
||||
void nr_configure_pucch(nfapi_nr_pucch_pdu_t *pucch_pdu,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
NR_UE_info_t* UE,
|
||||
NR_UE_info_t *UE,
|
||||
uint8_t pucch_resource,
|
||||
uint16_t O_csi,
|
||||
uint16_t O_ack,
|
||||
uint8_t O_sr,
|
||||
int r_pucch);
|
||||
int r_pucch,
|
||||
nr_beam_mode_t mode);
|
||||
|
||||
void find_search_space(int ss_type,
|
||||
NR_BWP_Downlink_t *bwp,
|
||||
@@ -330,7 +331,8 @@ nfapi_nr_pusch_pdu_t *prepare_pusch_pdu(nfapi_nr_ul_tti_request_t *future_ul_tti
|
||||
int harq_id,
|
||||
int harq_round,
|
||||
int fh,
|
||||
int rnti);
|
||||
int rnti,
|
||||
nr_beam_mode_t beam_mode);
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *prepare_pdsch_pdu(nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu,
|
||||
const gNB_MAC_INST *mac,
|
||||
const NR_UE_info_t *UE,
|
||||
@@ -447,6 +449,7 @@ int ul_buffer_index(int frame, int slot, int slots_per_frame, int size);
|
||||
void UL_tti_req_ahead_initialization(gNB_MAC_INST *gNB, int n, int CCid, frame_t frameP, int slotP);
|
||||
void fapi_beam_index_allocation(NR_ServingCellConfigCommon_t *scc, const nr_mac_config_t *config, gNB_MAC_INST *mac);
|
||||
int get_fapi_beamforming_index(gNB_MAC_INST *mac, int ssb_idx);
|
||||
uint16_t convert_to_fapi_beam(const uint16_t beam_idx, const nr_beam_mode_t mode);
|
||||
NR_beam_alloc_t beam_allocation_procedure(NR_beam_info_t *beam_info, int frame, int slot, int16_t beam_index, int slots_per_frame);
|
||||
void reset_beam_status(NR_beam_info_t *beam_info, int frame, int slot, int16_t beam_index, int slots_per_frame, bool new_beam);
|
||||
void beam_selection_procedures(gNB_MAC_INST *mac, NR_UE_info_t *UE);
|
||||
|
||||
@@ -794,7 +794,7 @@ typedef struct NR_UE_info {
|
||||
NR_UE_NR_Capability_t *capability;
|
||||
measgap_config_t measgap_config;
|
||||
// UE selected beam index
|
||||
uint8_t UE_beam_index;
|
||||
uint16_t UE_beam_index;
|
||||
float ul_thr_ue;
|
||||
float dl_thr_ue;
|
||||
long pdsch_HARQ_ACK_Codebook;
|
||||
|
||||
Reference in New Issue
Block a user