[FHI72] Handle long PRACH format
Only static long PRACH configuration verified, i.e. PRACH C-plane is ignored by the RU. Note: Introducing `N_ZC` and `num_prbu` parameters is needed for testing with xran F release. However, in the K release, this information is stored in xran_rx_packet_ctl struct.
This commit is contained in:
+18
-9
@@ -178,6 +178,16 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot)
|
||||
struct xran_fh_config *fh_cfg = get_xran_fh_config(0);
|
||||
nr_prach_info_t prach_info = get_prach_info(0);
|
||||
|
||||
uint16_t N_ZC, num_prbu;
|
||||
if ((prach_info.format & 0xff) < 4) {
|
||||
N_ZC = 839;
|
||||
num_prbu = 70;
|
||||
prach_info.N_dur = 1;
|
||||
} else {
|
||||
N_ZC = 139;
|
||||
num_prbu = 12;
|
||||
}
|
||||
|
||||
int prach_start_sym = prach_info.start_symbol;
|
||||
int prach_end_sym = prach_info.N_dur + prach_start_sym;
|
||||
struct xran_ru_config *ru_conf = &fh_cfg->ru_conf;
|
||||
@@ -198,25 +208,25 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot)
|
||||
/* convert Network order to host order */
|
||||
if (ru_conf->compMeth_PRACH == XRAN_COMPMETHOD_NONE) {
|
||||
if (sym_idx == prach_start_sym) {
|
||||
for (idx = 0; idx < 139 * 2; idx++) {
|
||||
for (idx = 0; idx < N_ZC * 2; idx++) {
|
||||
dst[idx] = ((int16_t)ntohs(src[idx + g_kbar]));
|
||||
}
|
||||
} else {
|
||||
for (idx = 0; idx < 139 * 2; idx++) {
|
||||
for (idx = 0; idx < N_ZC * 2; idx++) {
|
||||
dst[idx] += ((int16_t)ntohs(src[idx + g_kbar]));
|
||||
}
|
||||
}
|
||||
} else if (ru_conf->compMeth_PRACH == XRAN_COMPMETHOD_BLKFLOAT) {
|
||||
|
||||
int16_t local_dst[12 * 2 * N_SC_PER_PRB] __attribute__((aligned(64)));
|
||||
int16_t local_dst[num_prbu * 2 * N_SC_PER_PRB] __attribute__((aligned(64)));
|
||||
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
struct xranlib_decompress_request bfp_decom_req = {};
|
||||
struct xranlib_decompress_response bfp_decom_rsp = {};
|
||||
int payload_len = (3 * ru_conf->iqWidth_PRACH + 1) * 12; // 12 = closest number of PRBs to 139 REs
|
||||
int payload_len = (3 * ru_conf->iqWidth_PRACH + 1) * num_prbu;
|
||||
|
||||
bfp_decom_req.data_in = (int8_t *)src;
|
||||
bfp_decom_req.numRBs = 12; // closest number of PRBs to 139 REs
|
||||
bfp_decom_req.numRBs = num_prbu;
|
||||
bfp_decom_req.len = payload_len;
|
||||
bfp_decom_req.compMethod = XRAN_COMPMETHOD_BLKFLOAT;
|
||||
bfp_decom_req.iqWidth = ru_conf->iqWidth_PRACH;
|
||||
@@ -225,16 +235,15 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot)
|
||||
bfp_decom_rsp.len = 0;
|
||||
xranlib_decompress_avx512(&bfp_decom_req, &bfp_decom_rsp);
|
||||
#elif defined(__arm__) || defined(__aarch64__)
|
||||
armral_bfp_decompression(ru_conf->iqWidth_PRACH, 12, (int8_t *)src, (int16_t *)local_dst);
|
||||
armral_bfp_decompression(ru_conf->iqWidth_PRACH, num_prbu, (int8_t *)src, (int16_t *)local_dst);
|
||||
#else
|
||||
AssertFatal(1 == 0, "BFP decompression not supported on this architecture");
|
||||
#endif
|
||||
// note: this is hardwired for 139 point PRACH sequence, kbar=2
|
||||
if (sym_idx == prach_start_sym)
|
||||
for (idx = 0; idx < (139 * 2); idx++)
|
||||
for (idx = 0; idx < (N_ZC * 2); idx++)
|
||||
dst[idx] = local_dst[idx + g_kbar];
|
||||
else
|
||||
for (idx = 0; idx < (139 * 2); idx++)
|
||||
for (idx = 0; idx < (N_ZC * 2); idx++)
|
||||
dst[idx] += (local_dst[idx + g_kbar]);
|
||||
} // COMPMETHOD_BLKFLOAT
|
||||
} // aa
|
||||
|
||||
Reference in New Issue
Block a user