Introduce group-based processing using FAPI groups

Refactor ULSCH_id based processing of the PUSCH PDUs to group based
processing using FAPI groups. This is required to process multiple
PUSCH PDUs jointly for MU-MIMO. This is an initial commit that
supports group size = 1 and will be extended to > 1 in the following
commits.

The flow of group information from MAC to PHY using FAPI is as follows:

- In MAC, nr_fill_pusch_fapi_groups() is introduced to fill UEs in
  groups. The FAPI groups consist of UE lists filled with a PDU index.
  Based on the parameter UL_tti_req->n_group, the number of unique groups are
  identified. In each group, the parameter group->n_ue defines the
  number of UEs present in the group along with their PDU indices.

- After receiving the FAPI message in the PHY from MAC, in
  nr_save_ul_tti_req(), a group number and group size for each
  PUSCH PDU is allocated in nr_fill_ulsch(), and a PUSCH job is created.

- Further, after a job is created, in phy_procedures_gNB_uespec_RX(),
  the PUSCH PDUs of the ULSCH_ids for each group are segregated based
  on the group index. They are processed jointly using
  handle_pusch_rx_group_trigger(), and the PUSCH DTX per UE in the
  group is calculated using handle_pusch_DTX().
Signed-off-by: default avatarRakesh Mundlamuri <rakesh.mundlamuri@openairinterface.org>
parent f61d1834
...@@ -112,7 +112,9 @@ void reset_active_ulsch(PHY_VARS_gNB *gNB, int frame); ...@@ -112,7 +112,9 @@ void reset_active_ulsch(PHY_VARS_gNB *gNB, int frame);
void nr_fill_ulsch(PHY_VARS_gNB *gNB, void nr_fill_ulsch(PHY_VARS_gNB *gNB,
int frame, int frame,
int slot, int slot,
nfapi_nr_pusch_pdu_t *ulsch_pdu); nfapi_nr_pusch_pdu_t *ulsch_pdu,
int16_t mu_group_idx,
uint8_t mu_group_size);
void nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu); void nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu);
......
...@@ -89,8 +89,12 @@ static void dump_pusch_pdu(int instance, int frame, int slot, nfapi_nr_pusch_pdu ...@@ -89,8 +89,12 @@ static void dump_pusch_pdu(int instance, int frame, int slot, nfapi_nr_pusch_pdu
pusch_pdu->pusch_data.num_cb); pusch_pdu->pusch_data.num_cb);
} }
void nr_fill_ulsch(PHY_VARS_gNB *gNB,
void nr_fill_ulsch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pusch_pdu_t *ulsch_pdu) int frame,
int slot,
nfapi_nr_pusch_pdu_t *ulsch_pdu,
int16_t mu_group_idx,
uint8_t mu_group_size)
{ {
dump_pusch_pdu(gNB->Mod_id, frame, slot, ulsch_pdu); dump_pusch_pdu(gNB->Mod_id, frame, slot, ulsch_pdu);
LOG_D(NR_PHY, LOG_D(NR_PHY,
...@@ -101,7 +105,11 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pusch_pdu_t ...@@ -101,7 +105,11 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pusch_pdu_t
ulsch_pdu->pusch_data.harq_process_id, ulsch_pdu->pusch_data.harq_process_id,
ulsch_pdu->pusch_data.new_data_indicator); ulsch_pdu->pusch_data.new_data_indicator);
NR_gNB_PUSCH_job_t pusch = {.frame = frame, .slot = slot, .pusch_pdu = *ulsch_pdu}; NR_gNB_PUSCH_job_t pusch = {.frame = frame,
.slot = slot,
.pusch_pdu = *ulsch_pdu,
.mu_group_idx = mu_group_idx,
.mu_group_size = mu_group_size};
if (gNB->common_vars.beam_id) { if (gNB->common_vars.beam_id) {
int fapi_beam_idx = ulsch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx; int fapi_beam_idx = ulsch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
int bitmap = SL_to_bitmap(ulsch_pdu->start_symbol_index, ulsch_pdu->nr_of_symbols); int bitmap = SL_to_bitmap(ulsch_pdu->start_symbol_index, ulsch_pdu->nr_of_symbols);
......
...@@ -181,6 +181,11 @@ typedef struct { ...@@ -181,6 +181,11 @@ typedef struct {
uint32_t slot; uint32_t slot;
/// ULSCH PDU /// ULSCH PDU
nfapi_nr_pusch_pdu_t pusch_pdu; nfapi_nr_pusch_pdu_t pusch_pdu;
// Multi-User (MU) group index
// -1 : unallocated
int16_t mu_group_idx;
// 1 for Single-User (SU) and > 1 is MU
uint8_t mu_group_size;
} NR_gNB_PUSCH_job_t; } NR_gNB_PUSCH_job_t;
typedef struct { typedef struct {
......
This diff is collapsed.
...@@ -1326,6 +1326,12 @@ int main(int argc, char *argv[]) ...@@ -1326,6 +1326,12 @@ int main(int argc, char *argv[])
srs_pdu->beamforming.prg_size = 1; srs_pdu->beamforming.prg_size = 1;
} }
// Fill FAPI PUSCH groups for 1 UE
UL_tti_req->n_group = 1;
nfapi_nr_ul_tti_request_number_of_groups_t *group = &UL_tti_req->groups_list[0];
group->n_ue = 1;
group->ue_list[0].pdu_idx = 0;
/* load FAPI into RX of L1 */ /* load FAPI into RX of L1 */
nr_save_ul_tti_req(gNB, &Sched_INFO->UL_tti_req); nr_save_ul_tti_req(gNB, &Sched_INFO->UL_tti_req);
......
...@@ -115,6 +115,20 @@ static void copy_ul_tti_req(nfapi_nr_ul_tti_request_t *to, nfapi_nr_ul_tti_reque ...@@ -115,6 +115,20 @@ static void copy_ul_tti_req(nfapi_nr_ul_tti_request_t *to, nfapi_nr_ul_tti_reque
to->groups_list[i] = from->groups_list[i]; to->groups_list[i] = from->groups_list[i];
} }
static void nr_fill_pusch_fapi_groups(nfapi_nr_ul_tti_request_t *UL_tti_req)
{
// Single User MIMO
UL_tti_req->n_group = 0;
for (int i = 0; i < UL_tti_req->n_pdus; i++) {
if (UL_tti_req->pdus_list[i].pdu_type != NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE)
continue;
nfapi_nr_ul_tti_request_number_of_groups_t *group = &UL_tti_req->groups_list[UL_tti_req->n_group];
group->n_ue = 0;
group->ue_list[group->n_ue++].pdu_idx = i;
UL_tti_req->n_group++;
}
}
void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, slot_t slot, NR_Sched_Rsp_t *sched_info) void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, slot_t slot, NR_Sched_Rsp_t *sched_info)
{ {
protocol_ctxt_t ctxt = {0}; protocol_ctxt_t ctxt = {0};
...@@ -233,6 +247,8 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, slot_t slo ...@@ -233,6 +247,8 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, slot_t slo
const int current_index = ul_buffer_index(frame, slot, slots_frame, gNB->UL_tti_req_ahead_size); const int current_index = ul_buffer_index(frame, slot, slots_frame, gNB->UL_tti_req_ahead_size);
copy_ul_tti_req(&sched_info->UL_tti_req, &gNB->UL_tti_req_ahead[0][current_index]); copy_ul_tti_req(&sched_info->UL_tti_req, &gNB->UL_tti_req_ahead[0][current_index]);
nr_fill_pusch_fapi_groups(&sched_info->UL_tti_req);
stop_meas(&gNB->gNB_scheduler); stop_meas(&gNB->gNB_scheduler);
NR_SCHED_UNLOCK(&gNB->sched_lock); NR_SCHED_UNLOCK(&gNB->sched_lock);
} }
...@@ -486,6 +486,7 @@ void reset_sched_response(NR_Sched_Rsp_t *sched_response, int frame, int slot, i ...@@ -486,6 +486,7 @@ void reset_sched_response(NR_Sched_Rsp_t *sched_response, int frame, int slot, i
UL_tti_req->SFN = frame; UL_tti_req->SFN = frame;
UL_tti_req->Slot = slot; UL_tti_req->Slot = slot;
UL_tti_req->n_pdus = 0; UL_tti_req->n_pdus = 0;
UL_tti_req->n_group = 0;
nfapi_nr_tx_data_request_t *TX_req = &sched_response->TX_req; nfapi_nr_tx_data_request_t *TX_req = &sched_response->TX_req;
TX_req->SFN = frame; TX_req->SFN = frame;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment