diff --git a/cmake_targets/tools/MODULES/Findxran.cmake b/cmake_targets/tools/MODULES/Findxran.cmake index 810206c32c5eaa6b8219e9fa19dae315f6e985c5..961efc4e38e9a7bab8331cc537307bdd9bc6263c 100644 --- a/cmake_targets/tools/MODULES/Findxran.cmake +++ b/cmake_targets/tools/MODULES/Findxran.cmake @@ -109,6 +109,8 @@ elseif (xran_VERSION_STRING STREQUAL "oran_e_maintenance_release_v1.1") set(xran_VERSION 5.1.1) elseif (xran_VERSION_STRING STREQUAL "oran_e_maintenance_release_v1.2") set(xran_VERSION 5.1.2) +elseif (xran_VERSION_STRING STREQUAL "oran_e_maintenance_release_v1.3") + set(xran_VERSION 5.1.3) endif() unset(xran_VERSION_LINE) unset(xran_VERSION_STRING) diff --git a/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch b/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch index 62526235420ad3c07e7d35ec3425325fc0ce1167..a40aefac2bab4074b6095bbdcbc10947b4d9a36b 100644 --- a/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch +++ b/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch @@ -7,7 +7,7 @@ index 7508117..0dbe0bd 100644 #include <rte_mbuf.h> -#define VERSIONX "oran_e_maintenance_release_v1.0" -+#define VERSIONX "oran_e_maintenance_release_v1.2" ++#define VERSIONX "oran_e_maintenance_release_v1.3" #define APP_O_DU 0 #define APP_O_RU 1 @@ -114,7 +114,7 @@ index 7419ae1..a85f973 100644 * @ingroup xran * diff --git a/fhi_lib/lib/api/xran_up_api.h b/fhi_lib/lib/api/xran_up_api.h -index 7d3afc5..3e00c5a 100644 +index 7d3afc5..e2f1f21 100644 --- a/fhi_lib/lib/api/xran_up_api.h +++ b/fhi_lib/lib/api/xran_up_api.h @@ -80,6 +80,7 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, @@ -125,6 +125,16 @@ index 7d3afc5..3e00c5a 100644 union ecpri_seq_id *seq_id, uint16_t *num_prbu, uint16_t *start_prbu, +@@ -89,7 +90,8 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, + int8_t expect_comp, + enum xran_comp_hdr_type staticComp, + uint8_t *compMeth, +- uint8_t *iqWidth); ++ uint8_t *iqWidth, ++ uint8_t *is_prach); + + inline int xran_prepare_iq_symbol_portion( + struct rte_mbuf *mbuf, diff --git a/fhi_lib/lib/ethernet/ethdi.c b/fhi_lib/lib/ethernet/ethdi.c index b6ba257..b53325f 100644 --- a/fhi_lib/lib/ethernet/ethdi.c @@ -173,9 +183,18 @@ index e6d3067..8e0abee 100644 static int16_t saturateAbs(int16_t inVal) { diff --git a/fhi_lib/lib/src/xran_bfp_uplane.cpp b/fhi_lib/lib/src/xran_bfp_uplane.cpp -index a345df4..7831fa0 100644 +index a345df4..109b05a 100644 --- a/fhi_lib/lib/src/xran_bfp_uplane.cpp +++ b/fhi_lib/lib/src/xran_bfp_uplane.cpp +@@ -90,7 +90,7 @@ namespace BFP_UPlane + { + const __m512i* rawData = reinterpret_cast<const __m512i*>(dataIn.dataExpanded); + /// Abs +- const auto rawDataAbs = _mm512_abs_epi16(rawData[0]); ++ const auto rawDataAbs = _mm512_abs_epi16(_mm512_loadu_epi16(rawData)); + /// No need to do a full horizontal max operation here, just do a max IQ step, + /// compute the exponents and then use a reduce max over all exponent values. This + /// is the fastest way to handle a single RB. @@ -116,7 +116,7 @@ namespace BFP_UPlane /// Get AVX512 pointer aligned to desired RB const __m512i* rawDataIn = reinterpret_cast<const __m512i*>(dataIn.dataExpanded + numREOffset); @@ -195,10 +214,18 @@ index a345df4..7831fa0 100644 dataOut->dataCompressed[thisRBExpAddr] = thisExp; /// Now have 1 RB worth of bytes separated into 3 chunks (1 per lane) diff --git a/fhi_lib/lib/src/xran_common.c b/fhi_lib/lib/src/xran_common.c -index baa673f..edd4ecb 100644 +index baa673f..00bfdf2 100644 --- a/fhi_lib/lib/src/xran_common.c +++ b/fhi_lib/lib/src/xran_common.c -@@ -656,6 +656,7 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid) +@@ -650,12 +650,15 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid) + uint8_t compMeth = 0; + uint8_t iqWidth = 0; + ++ uint8_t is_prach = 0; ++ + void *pHandle = NULL; + int ret = MBUF_FREE; + uint32_t mb_free = 0; int32_t valid_res = 0; int expect_comp = (p_dev_ctx->fh_cfg.ru_conf.compMeth != XRAN_COMPMETHOD_NONE); enum xran_comp_hdr_type staticComp = p_dev_ctx->fh_cfg.ru_conf.xranCompHdrType; @@ -206,7 +233,7 @@ index baa673f..edd4ecb 100644 if (staticComp == XRAN_COMP_HDR_TYPE_STATIC) { -@@ -674,6 +675,7 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid) +@@ -674,6 +677,7 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid) &subframe_id, &slot_id, &symb_id, @@ -214,7 +241,14 @@ index baa673f..edd4ecb 100644 &seq, &num_prbu, &start_prbu, -@@ -688,23 +690,9 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid) +@@ -683,28 +687,15 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid) + expect_comp, + staticComp, + &compMeth, +- &iqWidth); ++ &iqWidth, ++ &is_prach); + if (num_bytes <= 0){ print_err("num_bytes is wrong [%d]\n", num_bytes); return MBUF_FREE; } @@ -241,7 +275,16 @@ index baa673f..edd4ecb 100644 #ifndef FCN_ADAPT if(valid_res != 0) { print_dbg("valid_res is wrong [%d] ant %u (%u : %u : %u : %u) seq %u num_bytes %d\n", valid_res, Ant_ID, frame_id, subframe_id, slot_id, symb_id, seq.seq_id, num_bytes); -@@ -1189,7 +1177,7 @@ int generate_cpmsg_prach(void *pHandle, struct xran_cp_gen_params *params, struc +@@ -756,7 +747,7 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid) + print_dbg("Transport layer fragmentation (eCPRI) is not supported\n"); + } + +- } else if (Ant_ID >= p_dev_ctx->PrachCPConfig.eAxC_offset && p_dev_ctx->fh_cfg.prachEnable) { ++ } else if (/*Ant_ID >= p_dev_ctx->PrachCPConfig.eAxC_offset && */p_dev_ctx->fh_cfg.prachEnable && is_prach) { + /* PRACH packet has ruportid = num_eAxc + ant_id */ + Ant_ID -= p_dev_ctx->PrachCPConfig.eAxC_offset; + symbol_total_bytes[p_dev_ctx->xran_port_id][CC_ID][Ant_ID] += num_bytes; +@@ -1189,7 +1180,7 @@ int generate_cpmsg_prach(void *pHandle, struct xran_cp_gen_params *params, struc timeOffset += startSymId * (2048 + 144); } timeOffset = timeOffset >> nNumerology; //original number is Tc, convert to Ts based on mu @@ -250,7 +293,7 @@ index baa673f..edd4ecb 100644 timeOffset += 16; params->dir = XRAN_DIR_UL; -@@ -1295,8 +1283,7 @@ int32_t ring_processing_func(void* args) +@@ -1295,8 +1286,7 @@ int32_t ring_processing_func(void* args) for (i = 0; i < ctx->io_cfg.num_vfs && i < XRAN_VF_MAX; i++){ for(qi = 0; qi < ctx->rxq_per_port[i]; qi++) { @@ -430,7 +473,7 @@ index 36bd72c..f7f5678 100644 int idx = 0; uint16_t *psrc = (uint16_t *)iq_data_start; diff --git a/fhi_lib/lib/src/xran_up_api.c b/fhi_lib/lib/src/xran_up_api.c -index 397853a..4a714b5 100644 +index 397853a..8977e3d 100644 --- a/fhi_lib/lib/src/xran_up_api.c +++ b/fhi_lib/lib/src/xran_up_api.c @@ -329,6 +329,7 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, @@ -441,7 +484,26 @@ index 397853a..4a714b5 100644 union ecpri_seq_id *seq_id, uint16_t *num_prbu, uint16_t *start_prbu, -@@ -387,6 +388,8 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, +@@ -338,7 +339,8 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, + int8_t expect_comp, + enum xran_comp_hdr_type staticComp, + uint8_t *compMeth, +- uint8_t *iqWidth) ++ uint8_t *iqWidth, ++ uint8_t *is_prach) + { + #if XRAN_MLOG_VAR + uint32_t mlogVar[10]; +@@ -374,6 +376,8 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, + return 0; /* packet too short */ + + radio_hdr->sf_slot_sym.value = rte_be_to_cpu_16(radio_hdr->sf_slot_sym.value); ++ if (radio_hdr->data_feature.filter_id > 0) *is_prach = 1; ++ else *is_prach = 0; + + if (frame_id) + *frame_id = radio_hdr->frame_id; +@@ -387,6 +391,8 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, if (symb_id) *symb_id = radio_hdr->sf_slot_sym.symb_id; @@ -450,7 +512,7 @@ index 397853a..4a714b5 100644 /* Process data section hdr */ struct data_section_hdr *data_hdr = (void *)rte_pktmbuf_adj(mbuf, sizeof(*radio_hdr)); -@@ -401,6 +404,7 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, +@@ -401,6 +407,7 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, *sym_inc = data_hdr->fields.sym_inc; *rb = data_hdr->fields.rb; *sect_id = data_hdr->fields.sect_id; diff --git a/doc/ORAN_FHI7.2_Tutorial.md b/doc/ORAN_FHI7.2_Tutorial.md index 44b652cb7adc316af0911e77640224f4b30f387d..a000a6c3add097b2e9c4015bf8bfd3c5096629c3 100644 --- a/doc/ORAN_FHI7.2_Tutorial.md +++ b/doc/ORAN_FHI7.2_Tutorial.md @@ -391,6 +391,8 @@ Compile the fronthaul interface library by calling `make` and the option environment variables `RTE_SDK` for the path to the source tree of DPDK, and `XRAN_DIR` to set the path to the fronthaul library. +**Note**: you need at least gcc-11 and g++-11. + ```bash cd ~/phy/fhi_lib/lib make clean @@ -790,7 +792,6 @@ Edit the sample OAI gNB configuration file and check following parameters: compression * `iq_width_prach`: Width of PRACH IQ samples: if 16, no compression, if <16, applies compression - * `fft_size`: size of FFT performed by RU, set to 12 by default * `prach_config`: PRACH-specific configuration * `eAxC_offset`: PRACH antenna offset * `kbar`: the PRACH guard interval, provided in RU diff --git a/executables/nr-ru.c b/executables/nr-ru.c index a5a670916ef49d5a7c4920cdf80d19fbcca08982..991c59e110dc0468784240ab76287e9d93b074d7 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -912,7 +912,7 @@ static void fill_rf_config(RU_t *ru, char *rf_config_file) } } -static void fill_split7_2_config(split7_config_t *split7, const nfapi_nr_config_request_scf_t *config, int slots_per_frame) +static void fill_split7_2_config(split7_config_t *split7, const nfapi_nr_config_request_scf_t *config, int slots_per_frame, uint16_t ofdm_symbol_size) { const nfapi_nr_prach_config_t *prach_config = &config->prach_config; const nfapi_nr_tdd_table_t *tdd_table = &config->tdd_table; @@ -934,6 +934,8 @@ static void fill_split7_2_config(split7_config_t *split7, const nfapi_nr_config_ } } } + + split7->fftSize = log2(ofdm_symbol_size); } /* this function maps the RU tx and rx buffers to the available rf chains. @@ -1157,7 +1159,7 @@ void *ru_thread( void *param ) { nr_dump_frame_parms(fp); nr_phy_init_RU(ru); fill_rf_config(ru, ru->rf_config_file); - fill_split7_2_config(&ru->openair0_cfg.split7, &ru->config, fp->slots_per_frame); + fill_split7_2_config(&ru->openair0_cfg.split7, &ru->config, fp->slots_per_frame, fp->ofdm_symbol_size); if(!emulate_rf) { // Start IF device if any @@ -1342,6 +1344,7 @@ void *ru_thread( void *param ) { rx_tti_busy[info->slot_rx % RU_RX_SLOT_DEPTH] = false; if ((info->slot_rx % RU_RX_SLOT_DEPTH) == (proc->tti_rx % RU_RX_SLOT_DEPTH)) not_done = false; + delNotifiedFIFO_elt(res); } if (!res) break; diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index 47938f3b78a7f6f20a8e0bddb5f1e27aff9c0451..a45734e791e5893b02437b56f29c75e55e0dcd35 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -160,7 +160,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy } //rb } // symb int nb_rb=0; - int32_t n0_subband_tot=0; + int64_t n0_subband_tot=0; int32_t n0_subband_tot_perANT[frame_parms->nb_antennas_rx]; memset(n0_subband_tot_perANT, 0, sizeof(n0_subband_tot_perANT)); @@ -200,7 +200,7 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, unsigned char symbol, uint8_t nrOfLayers) { - int rx_power_tot = 0; + uint32_t rx_power_tot = 0; unsigned short rx_power_avg_dB; unsigned short rx_power_tot_dB; RU_t *ru = gNB->RU_list[0]; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 723d13f65ec438d4a31a22725709bd7432251568..96266e279abb710b90f20deab38275f1daa7ffb1 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -454,10 +454,9 @@ static void nr_ulsch_channel_level(int **ul_ch_estimates_ext, avg128U = simde_mm_add_epi32(avg128U, simde_mm_srai_epi32(simde_mm_madd_epi16(ul_ch128[i], ul_ch128[i]), x)); } - avg[aatx*frame_parms->nb_antennas_rx+aarx] = (((int32_t*)&avg128U)[0] + - ((int32_t*)&avg128U)[1] + - ((int32_t*)&avg128U)[2] + - ((int32_t*)&avg128U)[3]) / y; + int32_t *avg32i = (int32_t *)&avg128U; + int64_t avg64 = (int64_t)avg32i[0] + avg32i[1] + avg32i[2] + avg32i[3]; + avg[aatx * frame_parms->nb_antennas_rx + aarx] = avg64 / y; } } diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index d0c6146e45ddf054b8eae4441970fa0bf0db9a6a..05d7f0383226ce78decf2ed0f27abfe3790c873e 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -237,7 +237,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, uint8_t index=0; int nb_re_pucch = 12*pucch_pdu->prb_size; // prb size is 1 - int signal_energy = 0, signal_energy_ant0 = 0; + int64_t signal_energy = 0, signal_energy_ant0 = 0; for (int l=0; l<pucch_pdu->nr_of_symbols; l++) { uint8_t l2 = l + pucch_pdu->start_symbol_index; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 579cb24e60d70e4e8e739286eab0bd9eb7f967db..3cd3266a0aa5a5fcef1bb8d5c44930b0ddf6ba76 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -343,13 +343,13 @@ typedef struct { /// \f$\log_2(\max|H_i|^2)\f$ int16_t log2_maxh; /// measured RX power based on DRS - int ulsch_power[8]; + uint32_t ulsch_power[8]; /// total signal over antennas - int ulsch_power_tot; + uint32_t ulsch_power_tot; /// measured RX noise power int ulsch_noise_power[8]; /// total noise over antennas - int ulsch_noise_power_tot; + uint32_t ulsch_noise_power_tot; /// \brief llr values. /// - first index: ? [0..1179743] (hard coded) int16_t *llr; diff --git a/radio/COMMON/common_lib.h b/radio/COMMON/common_lib.h index 0ff54a79cec5e9bfc07404998b2ad692d7af806e..aa2d9e318982352d99e5fa7aff1d85655a97f973 100644 --- a/radio/COMMON/common_lib.h +++ b/radio/COMMON/common_lib.h @@ -195,6 +195,8 @@ typedef struct split7_config { struct { symbol_direction_t sym_dir[14]; } slot_dirs[160]; + /*! this is the exponent in 2^X for the FFT size */ + uint16_t fftSize; } split7_config_t; /*! \brief RF frontend parameters set by application */ diff --git a/radio/fhi_72/CMakeLists.txt b/radio/fhi_72/CMakeLists.txt index 88552eb46bd3e276c5430f3ec064f725f1f88b37..ba28d4c4487467ac7d47e411383077abe76f4917 100644 --- a/radio/fhi_72/CMakeLists.txt +++ b/radio/fhi_72/CMakeLists.txt @@ -1,8 +1,15 @@ +# we need at least gcc-11 to build xran, so let's enforce it here +# (because xran might not check it, and we have control here) +if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11.0 + OR CMAKE_C_COMPILER_VERSION VERSION_LESS 11.0) + message(FATAL_ERROR "you need to have at least gcc/g++-11 to use 7.2 FHI through xran") +endif() + # use env var PKG_CONFIG_PATH to override paths to libdpdk.pc pkg_check_modules(dpdk REQUIRED libdpdk) pkg_check_modules(numa REQUIRED numa) -find_package(xran 5.1.2 EXACT REQUIRED) # E release -> 5 +find_package(xran 5.1.3 EXACT REQUIRED) # E release -> 5 # Ignore xran-specific warning: we don't care/can't change the following warning, so suppress # alignment 1 of 'struct XYZ' is less than 2 diff --git a/radio/fhi_72/oran-config.c b/radio/fhi_72/oran-config.c index 853d2cefc4aa77dbf6c85f9e99b28fb33a262634..ddee538dfd51e5c8b4edf66cc51dd5fe075511a2 100644 --- a/radio/fhi_72/oran-config.c +++ b/radio/fhi_72/oran-config.c @@ -729,7 +729,7 @@ static bool set_fh_frame_config(const openair0_config_t *oai0, struct xran_frame return true; } -static bool set_fh_ru_config(const paramdef_t *rup, int nru, struct xran_ru_config *ru_config) +static bool set_fh_ru_config(const paramdef_t *rup, uint16_t fftSize, int nru, struct xran_ru_config *ru_config) { ru_config->xranTech = XRAN_RAN_5GNR; ru_config->xranCat = XRAN_CATEGORY_A; @@ -740,7 +740,8 @@ static bool set_fh_ru_config(const paramdef_t *rup, int nru, struct xran_ru_conf ru_config->iqWidth_PRACH = *gpd(rup, nru, ORAN_RU_CONFIG_IQWIDTH_PRACH)->uptr; AssertFatal(ru_config->iqWidth_PRACH <= 16, "IQ Width for PRACH cannot be > 16!\n"); ru_config->compMeth_PRACH = ru_config->iqWidth_PRACH < 16 ? XRAN_COMPMETHOD_BLKFLOAT : XRAN_COMPMETHOD_NONE; - ru_config->fftSize = *gpd(rup, nru, ORAN_RU_CONFIG_FFT_SIZE)->uptr; + AssertFatal(fftSize > 0, "FFT size cannot be 0\n"); + ru_config->fftSize = fftSize; ru_config->byteOrder = XRAN_NE_BE_BYTE_ORDER; ru_config->iqOrder = XRAN_I_Q_ORDER; ru_config->xran_max_frame = 0; @@ -779,6 +780,7 @@ bool set_fh_config(int ru_idx, int num_rus, const openair0_config_t *oai0, struc DevAssert(oai0->rx_freq[0] == oai0->rx_freq[i]); DevAssert(oai0->nr_band > 0); DevAssert(oai0->nr_scs_for_raster > 0); + AssertFatal(oai0->threequarter_fs == 0, "cannot use three-quarter sampling with O-RAN 7.2 split\n"); // we simply assume that the loading process provides function to_nrarfcn() // to calculate the ARFCN numbers from frequency. That is not clean, but the @@ -869,7 +871,7 @@ bool set_fh_config(int ru_idx, int num_rus, const openair0_config_t *oai0, struc return false; if (!set_fh_frame_config(oai0, &fh_config->frame_conf)) return false; - if (!set_fh_ru_config(rup, nru, &fh_config->ru_conf)) + if (!set_fh_ru_config(rup, oai0->split7.fftSize, nru, &fh_config->ru_conf)) return false; fh_config->bbdev_enc = NULL; diff --git a/radio/fhi_72/oran-init.c b/radio/fhi_72/oran-init.c index 2fbca36d5609646896963d43a3aa68b22e2b0607..8673b5d2b47d7337e2e7564059f24ffccc266e62 100644 --- a/radio/fhi_72/oran-init.c +++ b/radio/fhi_72/oran-init.c @@ -123,6 +123,14 @@ static struct xran_prb_map get_xran_prb_map_ul(const struct xran_fh_config *f) return prbmap; } +static uint32_t next_power_2(uint32_t num) +{ + uint32_t power = 2; + while (power < num) + power <<= 1; + return power; +} + static uint32_t oran_allocate_uplane_buffers( void *instHandle, struct xran_buffer_list list[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN], @@ -132,7 +140,10 @@ static uint32_t oran_allocate_uplane_buffers( { xran_status_t status; uint32_t pool; - uint32_t numBufs = XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT; + // we need at least XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT + // buffers, but xran_bm_init() uses rte_pktmbuf_pool_create() which + // recommends to use a power of two for the buffers + uint32_t numBufs = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT); status = xran_bm_init(instHandle, &pool, numBufs, bufSize); AssertFatal(XRAN_STATUS_SUCCESS == status, "Failed at xran_bm_init(), status %d\n", status); printf("xran_bm_init() hInstance %p poolIdx %u elements %u size %u\n", instHandle, pool, numBufs, bufSize); @@ -211,14 +222,14 @@ static void oran_allocate_cplane_buffers(void *instHandle, { xran_status_t status; uint32_t poolSec; - uint32_t numBufsSec = XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT * sect * XRAN_MAX_FRAGMENT; + uint32_t numBufsSec = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT * sect * XRAN_MAX_FRAGMENT); uint32_t bufSizeSec = sizeof(struct xran_section_desc); status = xran_bm_init(instHandle, &poolSec, numBufsSec, bufSizeSec); AssertFatal(XRAN_STATUS_SUCCESS == status, "Failed at xran_bm_init(), status %d\n", status); printf("xran_bm_init() hInstance %p poolIdx %u elements %u size %u\n", instHandle, poolSec, numBufsSec, bufSizeSec); uint32_t poolPrb; - uint32_t numBufsPrb = XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT; + uint32_t numBufsPrb = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT); uint32_t bufSizePrb = size_of_prb_map; status = xran_bm_init(instHandle, &poolPrb, numBufsPrb, bufSizePrb); AssertFatal(XRAN_STATUS_SUCCESS == status, "Failed at xran_bm_init(), status %d\n", status); diff --git a/radio/fhi_72/oran-params.h b/radio/fhi_72/oran-params.h index a3fb22267bceadc1c6131a1e166495acc19f6b9b..c7e17ea42a5e88ba3018653c25b992e18669c5db 100644 --- a/radio/fhi_72/oran-params.h +++ b/radio/fhi_72/oran-params.h @@ -91,13 +91,11 @@ #define ORAN_RU_CONFIG_IQWIDTH "iq_width" #define ORAN_RU_CONFIG_IQWIDTH_PRACH "iq_width_prach" -#define ORAN_RU_CONFIG_FFT_SIZE "fft_size" // clang-format off #define ORAN_RU_DESC {\ {ORAN_RU_CONFIG_IQWIDTH, "sample IQ width (16=uncompressed)\n", PARAMFLAG_MANDATORY, .u8ptr=NULL, .defuintval=16, TYPE_UINT8, 0}, \ {ORAN_RU_CONFIG_IQWIDTH_PRACH, "PRACH sample IQ width (16=uncompressed)\n", PARAMFLAG_MANDATORY, .u8ptr=NULL, .defuintval=16, TYPE_UINT8, 0}, \ - {ORAN_RU_CONFIG_FFT_SIZE, "Size of FFT at RU\n", PARAMFLAG_MANDATORY, .u8ptr=NULL, .defuintval=12, TYPE_UINT8, 0}, \ } // clang-format on diff --git a/radio/fhi_72/oran_isolate.c b/radio/fhi_72/oran_isolate.c index bdc786f482203c5b0f194e5caeec59b459f1a777..32bdb7c77198caff7cfd23faba2664cb1c2c3340 100644 --- a/radio/fhi_72/oran_isolate.c +++ b/radio/fhi_72/oran_isolate.c @@ -34,6 +34,11 @@ #include "common/utils/threadPool/thread-pool.h" #include "oaioran.h" +// include the following file for VERSIONX, version of xran lib, to print it during +// startup. Only relevant for printing, if it ever makes problem, remove this +// line and the use of VERSIONX further below. It is relative to phy/fhi_lib/lib/api +#include "../../app/src/common.h" + typedef struct { eth_state_t e; rru_config_msg_type_t last_msg; @@ -309,7 +314,7 @@ __attribute__((__visibility__("default"))) int transport_init(openair0_device *d eth->last_msg = (rru_config_msg_type_t)-1; - printf("ORAN: %s\n", __FUNCTION__); + LOG_I(HW, "Initializing O-RAN 7.2 FH interface through xran library (compiled against headers of %s)\n", VERSIONX); initNotifiedFIFO(&oran_sync_fifo); eth->oran_priv = oai_oran_initialize(openair0_cfg); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf index 5984d32b17847fae3659d2a0f393155cc24402f8..46bcb979820103a61e8093c18b4dddb38e54f755 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf @@ -295,7 +295,6 @@ fhi_72 = { ru_config = { iq_width = 9; iq_width_prach = 9; - fft_size = 12; }; prach_config = { eAxC_offset = 4; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf index d5c22b7e5e83d6560ee487662a15299c89bdbd13..8cabc3e87e6e785a0e80e346c742e49e91b81143 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf @@ -288,7 +288,6 @@ fhi_72 = { ru_config = { iq_width = 9; iq_width_prach = 9; - fft_size = 12; }; prach_config = { eAxC_offset = 4; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf index ddcb28a331f3ce9369160e5876c8d8c17dfdc9b8..65d7a0e8c8bbf39d04e8d3fe97a2c5271b5eaf7e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf @@ -288,7 +288,6 @@ fhi_72 = { ru_config = { iq_width = 9; iq_width_prach = 9; - fft_size = 12; }; prach_config = { eAxC_offset = 4; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf index 1ddba82cdf875c2f4b52e11157173a6d6e2e6d70..88fa64693622d6e80a3db4a1f5cc3a2ba41d4108 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf @@ -286,7 +286,6 @@ fhi_72 = { ru_config = { iq_width = 9; iq_width_prach = 9; - fft_size = 12; }; prach_config = { eAxC_offset = 4;